51 lines
1.9 KiB
TypeScript
51 lines
1.9 KiB
TypeScript
import { CompletionItem, CompletionItemKind, CompletionItemProvider, Position, TextDocument } from "vscode";
|
|
|
|
const XQLint = require("@quodatum/xqlint").XQLint;
|
|
|
|
export class XQueryCompletionItemProvider implements CompletionItemProvider {
|
|
|
|
provideCompletionItems(document: TextDocument, position: Position): CompletionItem[] {
|
|
const completionItems = new Array<CompletionItem>();
|
|
const linter = new XQLint(document.getText());
|
|
|
|
linter.getCompletions({ line: position.line, col: position.character }).forEach((x: any) => {
|
|
completionItems.push(this._getCompletionItem(x));
|
|
});
|
|
|
|
return completionItems;
|
|
}
|
|
|
|
private _getCompletionItem(xqLintCompletionItem: any): CompletionItem {
|
|
const completionItem = new CompletionItem(xqLintCompletionItem.name);
|
|
completionItem.insertText = xqLintCompletionItem.value;
|
|
|
|
switch (xqLintCompletionItem.meta) {
|
|
// functions (always qualified with a colon)
|
|
case "function":
|
|
completionItem.kind = CompletionItemKind.Function;
|
|
|
|
const funcStart = (xqLintCompletionItem.value.indexOf(":") + 1);
|
|
const funcEnd = xqLintCompletionItem.value.indexOf("(");
|
|
|
|
completionItem.insertText = xqLintCompletionItem.value.substring(funcStart, funcEnd);
|
|
break;
|
|
|
|
// variables and parameters (always qualified with a dollar sign)
|
|
case "Let binding":
|
|
case "Local variable":
|
|
case "Window variable":
|
|
case "Function parameter":
|
|
completionItem.kind = CompletionItemKind.Variable;
|
|
completionItem.insertText = xqLintCompletionItem.value.substring(1);
|
|
break;
|
|
|
|
// everything else
|
|
default:
|
|
completionItem.kind = CompletionItemKind.Text;
|
|
break;
|
|
}
|
|
|
|
return completionItem;
|
|
}
|
|
|
|
}
|