mirror of
https://github.com/jlengrand/elm-language-client-vscode.git
synced 2026-03-10 08:11:17 +00:00
Add completion provider
This commit is contained in:
@@ -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,
|
||||
};
|
||||
|
||||
48
server/src/providers/completionProvider.ts
Normal file
48
server/src/providers/completionProvider.ts
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ export class FoldingRangeProvider {
|
||||
private readonly FOLD_CONSTRUCTS: Set<string> = new Set([
|
||||
"if",
|
||||
"case",
|
||||
"func_statement",
|
||||
]);
|
||||
|
||||
constructor(connection: IConnection, forest: IForest) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user