-
Notifications
You must be signed in to change notification settings - Fork 12
/
PeekFileDefinitionProvider.ts
62 lines (51 loc) · 1.96 KB
/
PeekFileDefinitionProvider.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
import * as vscode from 'vscode';
export default class PeekFileDefinitionProvider implements vscode.DefinitionProvider {
targetFileExtensions: string[] = [];
constructor(targetFileExtensions: string[] = []) {
this.targetFileExtensions = targetFileExtensions;
}
getComponentName(position: vscode.Position): String[] {
const doc = vscode.window.activeTextEditor.document;
const selection = doc.getWordRangeAtPosition(position);
const selectedText = doc.getText(selection);
let possibleFileNames = [],
altName = ''
selectedText.match(/\w+/g).forEach(str => {
return altName += str[0].toUpperCase() + str.substring(1);
})
this.targetFileExtensions.forEach(ext => {
possibleFileNames.push(selectedText + ext)
possibleFileNames.push(selectedText + '/index' + ext)
possibleFileNames.push(altName + ext)
possibleFileNames.push(altName + '/index' + ext)
})
return possibleFileNames;
}
searchFilePath(fileName: String): Thenable<vscode.Uri[]> {
return vscode.workspace.findFiles(`**/${fileName}`, '**/node_modules'); // Returns promise
}
provideDefinition(
document: vscode.TextDocument,
position: vscode.Position,
token: vscode.CancellationToken
): Promise<vscode.Location | vscode.Location[]> {
let filePaths = [];
const componentNames = this.getComponentName(position);
const searchPathActions = componentNames.map(this.searchFilePath);
const searchPromises = Promise.all(searchPathActions); // pass array of promises
return searchPromises.then((paths) => {
filePaths = [].concat.apply([], paths);
if (filePaths.length) {
let allPaths = [];
filePaths.forEach(filePath => {
allPaths.push(new vscode.Location(vscode.Uri.file(`${filePath.path}`),new vscode.Position(0,1) ))
});
return allPaths;
} else {
return undefined;
}
}, (reason) => {
return undefined;
});
}
}