-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathclojureSuggest.ts
65 lines (55 loc) · 2.68 KB
/
clojureSuggest.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import * as vscode from 'vscode';
import { cljConnection } from './cljConnection';
import { cljParser } from './cljParser';
import { nreplClient } from './nreplClient';
const mappings: {
[key: string]: vscode.CompletionItemKind
} = {
'nil': vscode.CompletionItemKind.Value,
'macro': vscode.CompletionItemKind.Value,
'class': vscode.CompletionItemKind.Class,
'keyword': vscode.CompletionItemKind.Keyword,
'namespace': vscode.CompletionItemKind.Module,
'function': vscode.CompletionItemKind.Function,
'special-form': vscode.CompletionItemKind.Keyword,
'var': vscode.CompletionItemKind.Variable,
'method': vscode.CompletionItemKind.Method,
}
export class ClojureCompletionItemProvider implements vscode.CompletionItemProvider {
public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.CompletionList> {
if (!cljConnection.isConnected())
return Promise.reject('No nREPL connected.');
const wordRange = document.getWordRangeAtPosition(position);
if (!wordRange)
return Promise.reject('No word selected.');
const line = document.lineAt(position.line),
currentWord = line.text.slice(wordRange.start.character, wordRange.end.character),
ns = cljParser.getNamespace(document.getText());
let buildInsertText = (suggestion: string) => {
return suggestion[0] === '.' ? suggestion.slice(1) : suggestion;
}
return nreplClient.complete(currentWord, ns).then(completions => {
if (!('completions' in completions))
return Promise.reject(undefined);
let suggestions = completions.completions.map((element: any) => ({
label: element.candidate,
kind: mappings[element.type] || vscode.CompletionItemKind.Text,
insertText: buildInsertText(element.candidate)
}));
let completionList: vscode.CompletionList = new vscode.CompletionList(suggestions, false);
return Promise.resolve(completionList);
});
}
public resolveCompletionItem(item: vscode.CompletionItem, token: vscode.CancellationToken): Thenable<vscode.CompletionItem> {
const editor = vscode.window.activeTextEditor
if (!editor) {
return Promise.reject("No active editor");
}
let document = editor.document;
let ns = cljParser.getNamespace(document.getText());
return nreplClient.info(item.label, ns).then(info => {
item.documentation = info.doc;
return Promise.resolve(item);
});
}
}