Skip to content

Commit b74a36d

Browse files
authored
Merge pull request #49 from mhansen/master
Promise-ify nreplClient.ts.
2 parents 36cab7d + 75ac00c commit b74a36d

5 files changed

Lines changed: 64 additions & 81 deletions

File tree

src/clojureDefinition.ts

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,18 @@ export class ClojureDefinitionProvider implements vscode.DefinitionProvider {
1414
if (!wordRange)
1515
return Promise.reject('No word selected.');
1616

17-
return new Promise((resolve, reject) => {
18-
const currentWord: string = document.lineAt(position.line).text.slice(wordRange.start.character, wordRange.end.character);
19-
const ns = cljParser.getNamespace(document.getText());
20-
21-
nreplClient.info(currentWord, ns, (info) => {
22-
if (!info.file)
23-
return reject('No word definition found.');
24-
25-
let uri = vscode.Uri.parse(info.file);
26-
let pos = new vscode.Position(info.line - 1, info.column)
27-
let definition = new vscode.Location(uri, pos);
28-
resolve(definition);
29-
});
30-
})
17+
const currentWord: string = document.lineAt(position.line).text.slice(wordRange.start.character, wordRange.end.character);
18+
const ns = cljParser.getNamespace(document.getText());
19+
20+
return nreplClient.info(currentWord, ns).then(info => {
21+
if (!info.file)
22+
return Promise.reject('No word definition found.');
23+
24+
let uri = vscode.Uri.parse(info.file);
25+
let pos = new vscode.Position(info.line - 1, info.column)
26+
let definition = new vscode.Location(uri, pos);
27+
return Promise.resolve(definition);
28+
});
3129
}
3230

3331
}

src/clojureHover.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,19 @@ export class ClojureHoverProvider implements vscode.HoverProvider {
1010
if (!cljConnection.isConnected())
1111
return Promise.reject('No nREPL connected.');
1212

13-
return new Promise<vscode.Hover>((resolve, reject) => {
14-
let wordRange = document.getWordRangeAtPosition(position);
15-
if (wordRange === undefined) {
16-
resolve(new vscode.Hover('Docstring not found'));
17-
} else {
18-
let currentWord: string;
19-
currentWord = document.lineAt(position.line).text.slice(wordRange.start.character, wordRange.end.character);
20-
const ns = cljParser.getNamespace(document.getText());
13+
let wordRange = document.getWordRangeAtPosition(position);
14+
if (wordRange === undefined)
15+
return Promise.resolve(new vscode.Hover('Docstring not found'));
2116

22-
nreplClient.info(currentWord, ns, (info) => {
23-
if (info.doc) {
24-
resolve(new vscode.Hover(info.doc));
25-
}
26-
reject();
27-
});
17+
let currentWord: string;
18+
currentWord = document.lineAt(position.line).text.slice(wordRange.start.character, wordRange.end.character);
19+
const ns = cljParser.getNamespace(document.getText());
20+
21+
return nreplClient.info(currentWord, ns).then(info => {
22+
if (info.doc) {
23+
return Promise.resolve(new vscode.Hover(info.doc));
2824
}
25+
return Promise.reject(undefined);
2926
});
3027
}
3128

src/clojureSignature.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,14 @@ export class ClojureSignatureProvider implements vscode.SignatureHelpProvider {
2828
return Promise.reject('No expression found.');
2929

3030
const ns = cljParser.getNamespace(document.getText());
31-
return new Promise<vscode.SignatureHelp>((resolve, reject) => {
32-
nreplClient.info(exprInfo.functionName, ns, info => {
33-
if (!info.name) // sometimes info brings just a list of suggestions (example: .MAX_VALUE)
34-
return reject('No signature info found.');
31+
return nreplClient.info(exprInfo.functionName, ns).then(info => {
32+
if (!info.name) // sometimes info brings just a list of suggestions (example: .MAX_VALUE)
33+
return Promise.reject('No signature info found.');
3534

36-
if (!!info['special-form'])
37-
return resolve(getSpecialFormSignatureHelp(info, exprInfo.parameterPosition));
35+
if (!!info['special-form'])
36+
return Promise.resolve(getSpecialFormSignatureHelp(info, exprInfo.parameterPosition));
3837

39-
return resolve(getFunctionSignatureHelp(info, exprInfo.parameterPosition));
40-
});
38+
return Promise.resolve(getFunctionSignatureHelp(info, exprInfo.parameterPosition));
4139
});
4240
}
4341

src/clojureSuggest.ts

Lines changed: 31 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,50 +21,40 @@ export class ClojureCompletionItemProvider implements vscode.CompletionItemProvi
2121
if (!cljConnection.isConnected())
2222
return Promise.reject('No nREPL connected.');
2323

24-
return new Promise<vscode.CompletionList>((resolve, reject) => {
25-
let document = vscode.window.activeTextEditor.document;
26-
27-
// TODO: Use VSCode means for getting a current word
28-
let lineText = document.lineAt(position.line).text;
29-
let words: string[] = lineText.split(' ');
30-
let currentWord = words[words.length - 1].replace(/^[\('\[\{]+|[\)\]\}]+$/g, '');
31-
let text = document.getText()
32-
let ns = cljParser.getNamespace(text);
33-
34-
let currentWordLength: number = currentWord.length;
35-
36-
let buildInsertText = (suggestion: string) => {
37-
return suggestion[0] === '.' ? suggestion.slice(1) : suggestion;
38-
}
39-
40-
nreplClient.complete(currentWord, ns, (completions) => {
41-
let suggestions = [];
42-
if ('completions' in completions) {
43-
completions.completions.forEach(element => {
44-
suggestions.push({
45-
label: element.candidate,
46-
kind: mappings[element.type] || vscode.CompletionItemKind.Text,
47-
insertText: buildInsertText(element.candidate)
48-
})
49-
})
50-
} else {
51-
return reject();
52-
}
53-
let completionList: vscode.CompletionList = new vscode.CompletionList(suggestions, false);
54-
resolve(completionList);
55-
});
56-
})
24+
// TODO: Use VSCode means for getting a current word
25+
let lineText = document.lineAt(position.line).text;
26+
let words: string[] = lineText.split(' ');
27+
let currentWord = words[words.length - 1].replace(/^[\('\[\{]+|[\)\]\}]+$/g, '');
28+
let text = document.getText()
29+
let ns = cljParser.getNamespace(text);
30+
31+
let currentWordLength: number = currentWord.length;
32+
33+
let buildInsertText = (suggestion: string) => {
34+
return suggestion[0] === '.' ? suggestion.slice(1) : suggestion;
35+
}
36+
37+
return nreplClient.complete(currentWord, ns).then(completions => {
38+
if (!('completions' in completions))
39+
return Promise.reject(undefined);
40+
41+
let suggestions = completions.completions.map(element => ({
42+
label: element.candidate,
43+
kind: mappings[element.type] || vscode.CompletionItemKind.Text,
44+
insertText: buildInsertText(element.candidate)
45+
}));
46+
let completionList: vscode.CompletionList = new vscode.CompletionList(suggestions, false);
47+
return Promise.resolve(completionList);
48+
});
5749
}
5850

5951
public resolveCompletionItem(item: vscode.CompletionItem, token: vscode.CancellationToken): Thenable<vscode.CompletionItem> {
60-
return new Promise<vscode.CompletionItem>((resolve, reject) => {
61-
let document = vscode.window.activeTextEditor.document;
62-
let ns = cljParser.getNamespace(document.getText());
63-
nreplClient.info(item.label, ns, (info) => {
64-
item.documentation = info.doc;
65-
resolve(item);
66-
});
67-
})
52+
let document = vscode.window.activeTextEditor.document;
53+
let ns = cljParser.getNamespace(document.getText());
54+
return nreplClient.info(item.label, ns).then(info => {
55+
item.documentation = info.doc;
56+
return Promise.resolve(item);
57+
});
6858
}
6959

7060
}

src/nreplClient.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ interface nREPLCloseMessage {
4242
op: string;
4343
}
4444

45-
const complete = (symbol: string, ns: string, callback): void => {
45+
const complete = (symbol: string, ns: string): Promise<any> => {
4646
const msg: nREPLCompleteMessage = { op: 'complete', symbol, ns };
47-
send(msg).then(respObjs => callback(respObjs[0]));
47+
return send(msg).then(respObjs => respObjs[0]);
4848
};
4949

50-
const info = (symbol: string, ns: string, callback) => {
50+
const info = (symbol: string, ns: string): Promise<any> => {
5151
const msg: nREPLInfoMessage = { op: 'info', symbol, ns };
52-
send(msg).then(respObjs => callback(respObjs[0]));
52+
return send(msg).then(respObjs => respObjs[0]);
5353
};
5454

5555
const evaluate = (code: string): Promise<any[]> => clone().then((new_session) => {

0 commit comments

Comments
 (0)