-
Notifications
You must be signed in to change notification settings - Fork 37
/
nimSuggest.ts
110 lines (105 loc) · 3.84 KB
/
nimSuggest.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*---------------------------------------------------------
* Copyright (C) Xored Software Inc. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------*/
'use strict';
import vscode = require('vscode');
import { getDirtyFile } from './nimUtils';
import { execNimSuggest, NimSuggestType, NimSuggestResult } from './nimSuggestExec';
export class NimCompletionItemProvider implements vscode.CompletionItemProvider {
public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.CompletionItem[]> {
return new Promise<vscode.CompletionItem[]>((resolve, reject) => {
var filename = document.fileName;
let range = document.getWordRangeAtPosition(position);
let txt = range ? document.getText(range).toLowerCase() : undefined;
execNimSuggest(NimSuggestType.sug, filename, (position.line + 1), position.character, getDirtyFile(document))
.then(items => {
var suggestions = [];
items.forEach(item => {
if (item.answerType === 'sug' && (!txt || item.symbolName.toLowerCase().indexOf(txt) >= 0)) {
var suggestion = new vscode.CompletionItem(item.symbolName);
suggestion.kind = vscodeKindFromNimSym(item.suggest);
suggestion.detail = nimSymDetails(item);
suggestion.sortText = ('0000' + suggestions.length).slice(-4);
// use predefined text to disable suggest sorting
suggestion.documentation = item.documentation;
suggestions.push(suggestion);
}
});
if (suggestions.length > 0) {
resolve(suggestions);
} else {
reject();
}
}).catch(reason => reject(reason));
});
}
}
function vscodeKindFromNimSym(kind: string): vscode.CompletionItemKind {
switch (kind) {
case 'skConst':
return vscode.CompletionItemKind.Value;
case 'skEnumField':
return vscode.CompletionItemKind.Enum;
case 'skForVar':
return vscode.CompletionItemKind.Variable;
case 'skIterator':
return vscode.CompletionItemKind.Keyword;
case 'skLabel':
return vscode.CompletionItemKind.Keyword;
case 'skLet':
return vscode.CompletionItemKind.Value;
case 'skMacro':
return vscode.CompletionItemKind.Snippet;
case 'skMethod':
return vscode.CompletionItemKind.Method;
case 'skParam':
return vscode.CompletionItemKind.Variable;
case 'skProc':
return vscode.CompletionItemKind.Function;
case 'skResult':
return vscode.CompletionItemKind.Value;
case 'skTemplate':
return vscode.CompletionItemKind.Snippet;
case 'skType':
return vscode.CompletionItemKind.Class;
case 'skVar':
return vscode.CompletionItemKind.Field;
case 'skFunc':
return vscode.CompletionItemKind.Function;
}
return vscode.CompletionItemKind.Property;
}
function nimSymDetails(suggest: NimSuggestResult): string {
switch (suggest.suggest) {
case 'skConst':
return 'const ' + suggest.fullName + ': ' + suggest.type;
case 'skEnumField':
return 'enum ' + suggest.type;
case 'skForVar':
return 'for var of ' + suggest.type;
case 'skIterator':
return suggest.type;
case 'skLabel':
return 'label';
case 'skLet':
return 'let of ' + suggest.type;
case 'skMacro':
return 'macro';
case 'skMethod':
return suggest.type;
case 'skParam':
return 'param';
case 'skProc':
return suggest.type;
case 'skResult':
return 'result';
case 'skTemplate':
return suggest.type;
case 'skType':
return 'type ' + suggest.fullName;
case 'skVar':
return 'var of ' + suggest.type;
}
return suggest.type;
}