Add completion provider

This commit is contained in:
Kolja Lampe
2019-01-28 22:26:46 +01:00
parent c9aeb63f81
commit 9bcf73222e
4 changed files with 54 additions and 0 deletions

View File

@@ -20,6 +20,9 @@ export class CapabilityCalculator {
// Incremental sync is disabled for now due to not being able to get the
// old text in ASTProvider
// textDocumentSync: TextDocumentSyncKind.Incremental,
completionProvider: {
triggerCharacters: ["."],
},
foldingRangeProvider: true,
textDocumentSync: TextDocumentSyncKind.Full,
};

View File

@@ -0,0 +1,48 @@
import { SyntaxNode, Tree } from "tree-sitter";
import {
CompletionItem,
CompletionParams,
CompletionRequest,
IConnection,
} from "vscode-languageserver";
import { IForest } from "../forest";
export class CompletionProvider {
private connection: IConnection;
private forest: IForest;
constructor(connection: IConnection, forest: IForest) {
this.connection = connection;
this.forest = forest;
this.connection.onRequest(CompletionRequest.type, this.handleCompletionRequest);
}
protected handleCompletionRequest = async (
param: CompletionParams,
): Promise<CompletionItem[]> => {
const completions: CompletionItem[] = [];
const tree: Tree = this.forest.getTree(param.textDocument.uri);
const traverse: (node: SyntaxNode) => void = (node: SyntaxNode): void => {
if (node.type === "func_identifier" && !completions.some((a) => a.label === node.text)) {
completions.push({
kind: 3,
label: node.text,
});
} else if (node.type === "custom_type_identifier" && !completions.some((a) => a.label === node.text)) {
completions.push({
kind: 22,
label: node.text,
});
}
for (const childNode of node.children) {
traverse(childNode);
}
};
traverse(tree.rootNode);
return completions;
}
}

View File

@@ -14,6 +14,7 @@ export class FoldingRangeProvider {
private readonly FOLD_CONSTRUCTS: Set<string> = new Set([
"if",
"case",
"func_statement",
]);
constructor(connection: IConnection, forest: IForest) {

View File

@@ -3,6 +3,7 @@ import { Connection, InitializeParams, InitializeResult } from "vscode-languages
import { CapabilityCalculator } from "./capabilityCalculator";
import { Forest } from "./forest";
import { ASTProvider } from "./providers/astProvider";
import { CompletionProvider } from "./providers/completionProvider";
import { FoldingRangeProvider } from "./providers/foldingProvider";
export interface ILanguageServer {
@@ -32,5 +33,6 @@ export class Server implements ILanguageServer {
// tslint:disable:no-unused-expression
new ASTProvider(this.connection, this.forest);
new FoldingRangeProvider(this.connection, this.forest);
new CompletionProvider(this.connection, this.forest);
}
}