-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathclojureDefinition.ts
33 lines (25 loc) · 1.36 KB
/
clojureDefinition.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
import * as vscode from 'vscode';
import { cljConnection } from './cljConnection';
import { cljParser } from './cljParser';
import { nreplClient } from './nreplClient';
export class ClojureDefinitionProvider implements vscode.DefinitionProvider {
provideDefinition(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Thenable<vscode.Definition> {
if (!cljConnection.isConnected())
return Promise.reject('No nREPL connected.');
const wordRange = document.getWordRangeAtPosition(position);
if (!wordRange)
return Promise.reject('No word selected.');
const currentWord: string = document.lineAt(position.line).text.slice(wordRange.start.character, wordRange.end.character);
const ns = cljParser.getNamespace(document.getText());
return cljConnection.sessionForFilename(document.fileName).then(session => {
return nreplClient.info(currentWord, ns, session.id).then(info => {
if (!info.file)
return Promise.reject('No word definition found.');
let uri = vscode.Uri.parse(info.file);
let pos = new vscode.Position(info.line - 1, info.column)
let definition = new vscode.Location(uri, pos);
return Promise.resolve(definition);
});
});
}
}