bmc-tpl-code-all-around/src/providers/TplHoverProvider.ts

40 lines
1.6 KiB
TypeScript
Raw Normal View History

import * as vscode from 'vscode';
import { TplLookup } from '../core/TplLookup';
import { workspaceIndex } from '../core/WorkspaceIndex';
export class TplHoverProvider implements vscode.HoverProvider {
public provideHover(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): vscode.ProviderResult<vscode.Hover> {
const range = document.getWordRangeAtPosition(position, /[a-zA-Z0-9_.]+/);
if (!range) return null;
const word = document.getText(range);
const parts = word.split('.');
if (parts.length > 1) {
// 1. Suche in Core & TKU Built-Ins (Case-Insensitive)
const funcData = TplLookup.getBuiltInFunction(parts[0], parts[1]);
if (funcData) {
const md = new vscode.MarkdownString();
md.appendCodeblock(`${parts[0]}.${parts[1]}(${funcData.snippets?.[0] || ''})`, 'tpl');
md.appendMarkdown(`---\n${funcData.description}`);
return new vscode.Hover(md);
}
}
// 2. Suche in lokalem Workspace (RAM Index)
const funcName = parts.length > 1 ? parts[1] : word;
const signatures = workspaceIndex.getFunctionSignatures(funcName);
if (signatures.length > 0) {
const sig = signatures[0];
const md = new vscode.MarkdownString();
md.appendCodeblock(`define ${sig.name}(${sig.params.join(', ')})`, 'tpl');
if (sig.docString) {
md.appendMarkdown(`---\n${sig.docString}`);
}
return new vscode.Hover(md);
}
return null;
}
}