brighterscript 0.65.19 → 0.65.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/Program.js +10 -11
- package/dist/Program.js.map +1 -1
- package/dist/Scope.d.ts +1 -0
- package/dist/Scope.js +1 -0
- package/dist/Scope.js.map +1 -1
- package/dist/XmlScope.d.ts +1 -0
- package/dist/XmlScope.js +8 -14
- package/dist/XmlScope.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +2 -1
- package/dist/bscPlugin/BscPlugin.js +4 -0
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/definition/DefinitionProvider.d.ts +13 -0
- package/dist/bscPlugin/definition/DefinitionProvider.js +200 -0
- package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -0
- package/dist/bscPlugin/definition/DefinitionProvider.spec.d.ts +1 -0
- package/dist/bscPlugin/definition/DefinitionProvider.spec.js +87 -0
- package/dist/bscPlugin/definition/DefinitionProvider.spec.js.map +1 -0
- package/dist/files/BrsFile.d.ts +1 -1
- package/dist/files/BrsFile.js +8 -154
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +33 -0
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/interfaces.d.ts +32 -1
- package/dist/parser/Expression.d.ts +10 -2
- package/dist/parser/Expression.js +22 -9
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.d.ts +5 -0
- package/dist/parser/Parser.js +18 -6
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/Statement.d.ts +3 -2
- package/dist/parser/Statement.js +23 -16
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/tests/expression/Indexing.spec.js +25 -0
- package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DefinitionProvider = void 0;
|
|
4
|
+
const reflection_1 = require("../../astUtils/reflection");
|
|
5
|
+
const TokenKind_1 = require("../../lexer/TokenKind");
|
|
6
|
+
const Parser_1 = require("../../parser/Parser");
|
|
7
|
+
const util_1 = require("../../util");
|
|
8
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
9
|
+
const visitors_1 = require("../../astUtils/visitors");
|
|
10
|
+
class DefinitionProvider {
|
|
11
|
+
constructor(event) {
|
|
12
|
+
this.event = event;
|
|
13
|
+
}
|
|
14
|
+
process() {
|
|
15
|
+
if ((0, reflection_1.isBrsFile)(this.event.file)) {
|
|
16
|
+
this.brsFileGetDefinition(this.event.file);
|
|
17
|
+
}
|
|
18
|
+
else if ((0, reflection_1.isXmlFile)(this.event.file)) {
|
|
19
|
+
this.xmlFileGetDefinition(this.event.file);
|
|
20
|
+
}
|
|
21
|
+
return this.event.definitions;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* For a position in a BrsFile, get the location where the token at that position was defined
|
|
25
|
+
*/
|
|
26
|
+
brsFileGetDefinition(file) {
|
|
27
|
+
var _a, _b, _c, _d, _e, _f;
|
|
28
|
+
//get the token at the position
|
|
29
|
+
const token = file.getTokenAt(this.event.position);
|
|
30
|
+
// While certain other tokens are allowed as local variables (AllowedLocalIdentifiers: https://github.com/rokucommunity/brighterscript/blob/master/src/lexer/TokenKind.ts#L418), these are converted by the parser to TokenKind.Identifier by the time we retrieve the token using getTokenAt
|
|
31
|
+
let definitionTokenTypes = [
|
|
32
|
+
TokenKind_1.TokenKind.Identifier,
|
|
33
|
+
TokenKind_1.TokenKind.StringLiteral
|
|
34
|
+
];
|
|
35
|
+
//throw out invalid tokens and the wrong kind of tokens
|
|
36
|
+
if (!token || !definitionTokenTypes.includes(token.kind)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const scopesForFile = this.event.program.getScopesForFile(file);
|
|
40
|
+
const [scope] = scopesForFile;
|
|
41
|
+
const expression = file.getClosestExpression(this.event.position);
|
|
42
|
+
if (scope && expression) {
|
|
43
|
+
scope.linkSymbolTable();
|
|
44
|
+
let containingNamespace = (_a = expression.findAncestor(reflection_1.isNamespaceStatement)) === null || _a === void 0 ? void 0 : _a.getName(Parser_1.ParseMode.BrighterScript);
|
|
45
|
+
const fullName = (_b = util_1.default.getAllDottedGetParts(expression)) === null || _b === void 0 ? void 0 : _b.map(x => x.text).join('.');
|
|
46
|
+
//find a constant with this name
|
|
47
|
+
const constant = scope === null || scope === void 0 ? void 0 : scope.getConstFileLink(fullName, containingNamespace);
|
|
48
|
+
if (constant) {
|
|
49
|
+
this.event.definitions.push(util_1.default.createLocation(vscode_uri_1.URI.file(constant.file.srcPath).toString(), constant.item.tokens.name.range));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if ((0, reflection_1.isDottedGetExpression)(expression)) {
|
|
53
|
+
const enumLink = scope.getEnumFileLink(fullName, containingNamespace);
|
|
54
|
+
if (enumLink) {
|
|
55
|
+
this.event.definitions.push(util_1.default.createLocation(vscode_uri_1.URI.file(enumLink.file.srcPath).toString(), enumLink.item.tokens.name.range));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const enumMemberLink = scope.getEnumMemberFileLink(fullName, containingNamespace);
|
|
59
|
+
if (enumMemberLink) {
|
|
60
|
+
this.event.definitions.push(util_1.default.createLocation(vscode_uri_1.URI.file(enumMemberLink.file.srcPath).toString(), enumMemberLink.item.tokens.name.range));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
let textToSearchFor = token.text.toLowerCase();
|
|
66
|
+
const previousToken = file.getTokenAt({ line: token.range.start.line, character: token.range.start.character });
|
|
67
|
+
if ((previousToken === null || previousToken === void 0 ? void 0 : previousToken.kind) === TokenKind_1.TokenKind.Callfunc) {
|
|
68
|
+
for (const scope of this.event.program.getScopes()) {
|
|
69
|
+
//does this xml file declare this function in its interface?
|
|
70
|
+
if ((0, reflection_1.isXmlScope)(scope)) {
|
|
71
|
+
const apiFunc = (_f = (_e = (_d = (_c = scope.xmlFile.ast) === null || _c === void 0 ? void 0 : _c.component) === null || _d === void 0 ? void 0 : _d.api) === null || _e === void 0 ? void 0 : _e.functions) === null || _f === void 0 ? void 0 : _f.find(x => x.name.toLowerCase() === textToSearchFor); // eslint-disable-line @typescript-eslint/no-loop-func
|
|
72
|
+
if (apiFunc) {
|
|
73
|
+
this.event.definitions.push(util_1.default.createLocation(util_1.default.pathToUri(scope.xmlFile.srcPath), apiFunc.range));
|
|
74
|
+
const callable = scope.getAllCallables().find((c) => c.callable.name.toLowerCase() === textToSearchFor); // eslint-disable-line @typescript-eslint/no-loop-func
|
|
75
|
+
if (callable) {
|
|
76
|
+
this.event.definitions.push(util_1.default.createLocation(util_1.default.pathToUri(callable.callable.file.srcPath), callable.callable.functionStatement.name.range));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/dot-notation
|
|
84
|
+
let classToken = file['getTokenBefore'](token, TokenKind_1.TokenKind.Class);
|
|
85
|
+
if (classToken) {
|
|
86
|
+
let cs = file.parser.ast.findChild((klass) => (0, reflection_1.isClassStatement)(klass) && klass.classKeyword.range === classToken.range);
|
|
87
|
+
if (cs === null || cs === void 0 ? void 0 : cs.parentClassName) {
|
|
88
|
+
const nameParts = cs.parentClassName.getNameParts();
|
|
89
|
+
let extendedClass = file.getClassFileLink(nameParts[nameParts.length - 1], nameParts.slice(0, -1).join('.'));
|
|
90
|
+
if (extendedClass) {
|
|
91
|
+
this.event.definitions.push(util_1.default.createLocation(util_1.default.pathToUri(extendedClass.file.srcPath), extendedClass.item.range));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (token.kind === TokenKind_1.TokenKind.StringLiteral) {
|
|
97
|
+
// We need to strip off the quotes but only if present
|
|
98
|
+
const startIndex = textToSearchFor.startsWith('"') ? 1 : 0;
|
|
99
|
+
let endIndex = textToSearchFor.length;
|
|
100
|
+
if (textToSearchFor.endsWith('"')) {
|
|
101
|
+
endIndex--;
|
|
102
|
+
}
|
|
103
|
+
textToSearchFor = textToSearchFor.substring(startIndex, endIndex);
|
|
104
|
+
}
|
|
105
|
+
//look through local variables first, get the function scope for this position (if it exists)
|
|
106
|
+
const functionScope = file.getFunctionScopeAtPosition(this.event.position);
|
|
107
|
+
if (functionScope) {
|
|
108
|
+
//find any variable or label with this name
|
|
109
|
+
for (const varDeclaration of functionScope.variableDeclarations) {
|
|
110
|
+
//we found a variable declaration with this token text!
|
|
111
|
+
if (varDeclaration.name.toLowerCase() === textToSearchFor) {
|
|
112
|
+
const uri = util_1.default.pathToUri(file.srcPath);
|
|
113
|
+
this.event.definitions.push(util_1.default.createLocation(uri, varDeclaration.nameRange));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/dot-notation
|
|
117
|
+
if (file['tokenFollows'](token, TokenKind_1.TokenKind.Goto)) {
|
|
118
|
+
for (const label of functionScope.labelStatements) {
|
|
119
|
+
if (label.name.toLocaleLowerCase() === textToSearchFor) {
|
|
120
|
+
const uri = util_1.default.pathToUri(file.srcPath);
|
|
121
|
+
this.event.definitions.push(util_1.default.createLocation(uri, label.nameRange));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const filesSearched = new Set();
|
|
127
|
+
//look through all files in scope for matches
|
|
128
|
+
for (const scope of scopesForFile) {
|
|
129
|
+
for (const file of scope.getAllFiles()) {
|
|
130
|
+
if ((0, reflection_1.isXmlFile)(file) || filesSearched.has(file)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
filesSearched.add(file);
|
|
134
|
+
if ((previousToken === null || previousToken === void 0 ? void 0 : previousToken.kind) === TokenKind_1.TokenKind.Dot && file.parseMode === Parser_1.ParseMode.BrighterScript) {
|
|
135
|
+
this.event.definitions.push(...file.getClassMemberDefinitions(textToSearchFor, file));
|
|
136
|
+
const namespaceDefinition = this.brsFileGetDefinitionsForNamespace(token, file);
|
|
137
|
+
if (namespaceDefinition) {
|
|
138
|
+
this.event.definitions.push(namespaceDefinition);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
file.parser.ast.walk((0, visitors_1.createVisitor)({
|
|
142
|
+
FunctionStatement: (statement) => {
|
|
143
|
+
if (statement.getName(file.parseMode).toLowerCase() === textToSearchFor) {
|
|
144
|
+
const uri = util_1.default.pathToUri(file.srcPath);
|
|
145
|
+
this.event.definitions.push(util_1.default.createLocation(uri, statement.range));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}), {
|
|
149
|
+
walkMode: visitors_1.WalkMode.visitStatements
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
brsFileGetDefinitionsForNamespace(token, file) {
|
|
155
|
+
//BrightScript does not support namespaces, so return an empty list in that case
|
|
156
|
+
if (!token) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
let location;
|
|
160
|
+
const nameParts = this.event.file.getPartialVariableName(token, [TokenKind_1.TokenKind.New]).split('.');
|
|
161
|
+
const endName = nameParts[nameParts.length - 1].toLowerCase();
|
|
162
|
+
const namespaceName = nameParts.slice(0, -1).join('.').toLowerCase();
|
|
163
|
+
const statementHandler = (statement) => {
|
|
164
|
+
if (!location && statement.getName(Parser_1.ParseMode.BrighterScript).toLowerCase() === namespaceName) {
|
|
165
|
+
const namespaceItemStatementHandler = (statement) => {
|
|
166
|
+
if (!location && statement.name.text.toLowerCase() === endName) {
|
|
167
|
+
const uri = util_1.default.pathToUri(file.srcPath);
|
|
168
|
+
location = util_1.default.createLocation(uri, statement.range);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
file.parser.ast.walk((0, visitors_1.createVisitor)({
|
|
172
|
+
ClassStatement: namespaceItemStatementHandler,
|
|
173
|
+
FunctionStatement: namespaceItemStatementHandler
|
|
174
|
+
}), {
|
|
175
|
+
walkMode: visitors_1.WalkMode.visitStatements
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
file.parser.ast.walk((0, visitors_1.createVisitor)({
|
|
180
|
+
NamespaceStatement: statementHandler
|
|
181
|
+
}), {
|
|
182
|
+
walkMode: visitors_1.WalkMode.visitStatements
|
|
183
|
+
});
|
|
184
|
+
return location;
|
|
185
|
+
}
|
|
186
|
+
xmlFileGetDefinition(file) {
|
|
187
|
+
//if the position is within the file's parent component name
|
|
188
|
+
if ((0, reflection_1.isXmlFile)(file) &&
|
|
189
|
+
file.parentComponent &&
|
|
190
|
+
file.parentComponentName &&
|
|
191
|
+
util_1.default.rangeContains(file.parentComponentName.range, this.event.position)) {
|
|
192
|
+
this.event.definitions.push({
|
|
193
|
+
range: util_1.default.createRange(0, 0, 0, 0),
|
|
194
|
+
uri: util_1.default.pathToUri(file.parentComponent.srcPath)
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.DefinitionProvider = DefinitionProvider;
|
|
200
|
+
//# sourceMappingURL=DefinitionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefinitionProvider.js","sourceRoot":"","sources":["../../../src/bscPlugin/definition/DefinitionProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_config_spec_1 = require("../../chai-config.spec");
|
|
4
|
+
const Program_1 = require("../../Program");
|
|
5
|
+
const util_1 = require("../../util");
|
|
6
|
+
let rootDir = (0, util_1.standardizePath) `${process.cwd()}/rootDir`;
|
|
7
|
+
const sinon_1 = require("sinon");
|
|
8
|
+
const DefinitionProvider_1 = require("./DefinitionProvider");
|
|
9
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
10
|
+
const sinon = (0, sinon_1.createSandbox)();
|
|
11
|
+
describe('DefinitionProvider', () => {
|
|
12
|
+
let program;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
program = new Program_1.Program({
|
|
15
|
+
rootDir: rootDir
|
|
16
|
+
});
|
|
17
|
+
sinon.restore();
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
program.dispose();
|
|
21
|
+
sinon.restore();
|
|
22
|
+
});
|
|
23
|
+
it('handles unknown file type', () => {
|
|
24
|
+
const result = new DefinitionProvider_1.DefinitionProvider({
|
|
25
|
+
program: program,
|
|
26
|
+
file: undefined,
|
|
27
|
+
position: util_1.util.createPosition(1, 2),
|
|
28
|
+
definitions: []
|
|
29
|
+
}).process();
|
|
30
|
+
(0, chai_config_spec_1.expect)(result).to.eql([]);
|
|
31
|
+
});
|
|
32
|
+
it('handles callfuncs', () => {
|
|
33
|
+
const customButtonXml = program.setFile('components/CustomButton.xml', `
|
|
34
|
+
<component name="CustomButton" extends="Group">
|
|
35
|
+
<script uri="CustomButton.brs" />
|
|
36
|
+
<interface>
|
|
37
|
+
<function name="clickCustomButton" />
|
|
38
|
+
</interface>
|
|
39
|
+
</component>
|
|
40
|
+
`);
|
|
41
|
+
const customButtonBrs = program.setFile('components/CustomButton.brs', `
|
|
42
|
+
function clickCustomButton()
|
|
43
|
+
end function
|
|
44
|
+
`);
|
|
45
|
+
const brsFile = program.setFile('source/main.brs', `
|
|
46
|
+
sub main()
|
|
47
|
+
m.customButton@.clickCustomButton()
|
|
48
|
+
end sub
|
|
49
|
+
`);
|
|
50
|
+
// m.customButton@.click|CustomButon()
|
|
51
|
+
(0, chai_config_spec_1.expect)(program.getDefinition(brsFile.srcPath, util_1.util.createPosition(2, 37))).to.eql([{
|
|
52
|
+
uri: vscode_uri_1.URI.file(customButtonXml.srcPath).toString(),
|
|
53
|
+
range: util_1.util.createRange(4, 21, 4, 57)
|
|
54
|
+
}, {
|
|
55
|
+
uri: vscode_uri_1.URI.file(customButtonBrs.srcPath).toString(),
|
|
56
|
+
range: util_1.util.createRange(1, 21, 1, 38)
|
|
57
|
+
}]);
|
|
58
|
+
});
|
|
59
|
+
it('handles callfuncs for xml file having no interface', () => {
|
|
60
|
+
program.setFile('components/CustomButton.xml', `
|
|
61
|
+
<component name="CustomButton" extends="Group">
|
|
62
|
+
</component>
|
|
63
|
+
`);
|
|
64
|
+
const main = program.setFile('source/main.brs', `
|
|
65
|
+
sub main()
|
|
66
|
+
m.customButton@.clickCustomButton()
|
|
67
|
+
end sub
|
|
68
|
+
`);
|
|
69
|
+
// m.customButton@.click|CustomButon()
|
|
70
|
+
(0, chai_config_spec_1.expect)(program.getDefinition(main.srcPath, util_1.util.createPosition(2, 37))).to.eql([]);
|
|
71
|
+
});
|
|
72
|
+
it('handles goto', () => {
|
|
73
|
+
const main = program.setFile('source/main.brs', `
|
|
74
|
+
sub main()
|
|
75
|
+
label1:
|
|
76
|
+
print "label1"
|
|
77
|
+
goto label1
|
|
78
|
+
end sub
|
|
79
|
+
`);
|
|
80
|
+
// goto lab|el1
|
|
81
|
+
(0, chai_config_spec_1.expect)(program.getDefinition(main.srcPath, util_1.util.createPosition(4, 24))).to.eql([{
|
|
82
|
+
uri: vscode_uri_1.URI.file(main.srcPath).toString(),
|
|
83
|
+
range: util_1.util.createRange(2, 16, 2, 22)
|
|
84
|
+
}]);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=DefinitionProvider.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefinitionProvider.spec.js","sourceRoot":"","sources":["../../../src/bscPlugin/definition/DefinitionProvider.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/files/BrsFile.d.ts
CHANGED
|
@@ -180,7 +180,6 @@ export declare class BrsFile {
|
|
|
180
180
|
private getNonNamespacedConstStatementCompletions;
|
|
181
181
|
private getEnumMemberStatementCompletions;
|
|
182
182
|
private getNamespaceCompletions;
|
|
183
|
-
private getNamespaceDefinitions;
|
|
184
183
|
/**
|
|
185
184
|
* Given a current token, walk
|
|
186
185
|
*/
|
|
@@ -222,6 +221,7 @@ export declare class BrsFile {
|
|
|
222
221
|
/**
|
|
223
222
|
* Given a position in a file, if the position is sitting on some type of identifier,
|
|
224
223
|
* go to the definition of that identifier (where this thing was first defined)
|
|
224
|
+
* @deprecated use `DefinitionProvider.process()` instead
|
|
225
225
|
*/
|
|
226
226
|
getDefinition(position: Position): Location[];
|
|
227
227
|
getClassMemberDefinitions(textToSearchFor: string, file: BrsFile): Location[];
|
package/dist/files/BrsFile.js
CHANGED
|
@@ -22,7 +22,7 @@ const serialize_error_1 = require("serialize-error");
|
|
|
22
22
|
const reflection_1 = require("../astUtils/reflection");
|
|
23
23
|
const visitors_1 = require("../astUtils/visitors");
|
|
24
24
|
const CommentFlagProcessor_1 = require("../CommentFlagProcessor");
|
|
25
|
-
const
|
|
25
|
+
const DefinitionProvider_1 = require("../bscPlugin/definition/DefinitionProvider");
|
|
26
26
|
/**
|
|
27
27
|
* Holds all details about this file within the scope of the whole program
|
|
28
28
|
*/
|
|
@@ -971,38 +971,6 @@ class BrsFile {
|
|
|
971
971
|
}
|
|
972
972
|
return [...result.values()];
|
|
973
973
|
}
|
|
974
|
-
getNamespaceDefinitions(token, file) {
|
|
975
|
-
//BrightScript does not support namespaces, so return an empty list in that case
|
|
976
|
-
if (!token) {
|
|
977
|
-
return undefined;
|
|
978
|
-
}
|
|
979
|
-
let location;
|
|
980
|
-
const nameParts = this.getPartialVariableName(token, [TokenKind_1.TokenKind.New]).split('.');
|
|
981
|
-
const endName = nameParts[nameParts.length - 1].toLowerCase();
|
|
982
|
-
const namespaceName = nameParts.slice(0, -1).join('.').toLowerCase();
|
|
983
|
-
const statementHandler = (statement) => {
|
|
984
|
-
if (!location && statement.getName(Parser_1.ParseMode.BrighterScript).toLowerCase() === namespaceName) {
|
|
985
|
-
const namespaceItemStatementHandler = (statement) => {
|
|
986
|
-
if (!location && statement.name.text.toLowerCase() === endName) {
|
|
987
|
-
const uri = util_1.util.pathToUri(file.srcPath);
|
|
988
|
-
location = util_1.util.createLocation(uri, statement.range);
|
|
989
|
-
}
|
|
990
|
-
};
|
|
991
|
-
file.parser.ast.walk((0, visitors_1.createVisitor)({
|
|
992
|
-
ClassStatement: namespaceItemStatementHandler,
|
|
993
|
-
FunctionStatement: namespaceItemStatementHandler
|
|
994
|
-
}), {
|
|
995
|
-
walkMode: visitors_1.WalkMode.visitStatements
|
|
996
|
-
});
|
|
997
|
-
}
|
|
998
|
-
};
|
|
999
|
-
file.parser.ast.walk((0, visitors_1.createVisitor)({
|
|
1000
|
-
NamespaceStatement: statementHandler
|
|
1001
|
-
}), {
|
|
1002
|
-
walkMode: visitors_1.WalkMode.visitStatements
|
|
1003
|
-
});
|
|
1004
|
-
return location;
|
|
1005
|
-
}
|
|
1006
974
|
/**
|
|
1007
975
|
* Given a current token, walk
|
|
1008
976
|
*/
|
|
@@ -1259,129 +1227,15 @@ class BrsFile {
|
|
|
1259
1227
|
/**
|
|
1260
1228
|
* Given a position in a file, if the position is sitting on some type of identifier,
|
|
1261
1229
|
* go to the definition of that identifier (where this thing was first defined)
|
|
1230
|
+
* @deprecated use `DefinitionProvider.process()` instead
|
|
1262
1231
|
*/
|
|
1263
1232
|
getDefinition(position) {
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
TokenKind_1.TokenKind.Identifier,
|
|
1271
|
-
TokenKind_1.TokenKind.StringLiteral
|
|
1272
|
-
];
|
|
1273
|
-
//throw out invalid tokens and the wrong kind of tokens
|
|
1274
|
-
if (!token || !definitionTokenTypes.includes(token.kind)) {
|
|
1275
|
-
return results;
|
|
1276
|
-
}
|
|
1277
|
-
const scopesForFile = this.program.getScopesForFile(this);
|
|
1278
|
-
const [scope] = scopesForFile;
|
|
1279
|
-
const expression = this.getClosestExpression(position);
|
|
1280
|
-
if (scope && expression) {
|
|
1281
|
-
scope.linkSymbolTable();
|
|
1282
|
-
let containingNamespace = (_a = expression.findAncestor(reflection_1.isNamespaceStatement)) === null || _a === void 0 ? void 0 : _a.getName(Parser_1.ParseMode.BrighterScript);
|
|
1283
|
-
const fullName = (_b = util_1.util.getAllDottedGetParts(expression)) === null || _b === void 0 ? void 0 : _b.map(x => x.text).join('.');
|
|
1284
|
-
//find a constant with this name
|
|
1285
|
-
const constant = scope === null || scope === void 0 ? void 0 : scope.getConstFileLink(fullName, containingNamespace);
|
|
1286
|
-
if (constant) {
|
|
1287
|
-
results.push(util_1.util.createLocation(vscode_uri_1.URI.file(constant.file.srcPath).toString(), constant.item.tokens.name.range));
|
|
1288
|
-
return results;
|
|
1289
|
-
}
|
|
1290
|
-
if ((0, reflection_1.isDottedGetExpression)(expression)) {
|
|
1291
|
-
const enumLink = scope.getEnumFileLink(fullName, containingNamespace);
|
|
1292
|
-
if (enumLink) {
|
|
1293
|
-
results.push(util_1.util.createLocation(vscode_uri_1.URI.file(enumLink.file.srcPath).toString(), enumLink.item.tokens.name.range));
|
|
1294
|
-
return results;
|
|
1295
|
-
}
|
|
1296
|
-
const enumMemberLink = scope.getEnumMemberFileLink(fullName, containingNamespace);
|
|
1297
|
-
if (enumMemberLink) {
|
|
1298
|
-
results.push(util_1.util.createLocation(vscode_uri_1.URI.file(enumMemberLink.file.srcPath).toString(), enumMemberLink.item.tokens.name.range));
|
|
1299
|
-
return results;
|
|
1300
|
-
}
|
|
1301
|
-
}
|
|
1302
|
-
}
|
|
1303
|
-
let textToSearchFor = token.text.toLowerCase();
|
|
1304
|
-
const previousToken = this.getTokenAt({ line: token.range.start.line, character: token.range.start.character });
|
|
1305
|
-
if ((previousToken === null || previousToken === void 0 ? void 0 : previousToken.kind) === TokenKind_1.TokenKind.Callfunc) {
|
|
1306
|
-
for (const scope of scopesForFile) {
|
|
1307
|
-
//to only get functions defined in interface methods
|
|
1308
|
-
const callable = scope.getAllCallables().find((c) => c.callable.name.toLowerCase() === textToSearchFor); // eslint-disable-line @typescript-eslint/no-loop-func
|
|
1309
|
-
if (callable) {
|
|
1310
|
-
results.push(util_1.util.createLocation(util_1.util.pathToUri(callable.callable.file.srcPath), callable.callable.functionStatement.range));
|
|
1311
|
-
}
|
|
1312
|
-
}
|
|
1313
|
-
return results;
|
|
1314
|
-
}
|
|
1315
|
-
let classToken = this.getTokenBefore(token, TokenKind_1.TokenKind.Class);
|
|
1316
|
-
if (classToken) {
|
|
1317
|
-
let cs = this.parser.references.classStatements.find((cs) => cs.classKeyword.range === classToken.range);
|
|
1318
|
-
if (cs === null || cs === void 0 ? void 0 : cs.parentClassName) {
|
|
1319
|
-
const nameParts = cs.parentClassName.getNameParts();
|
|
1320
|
-
let extendedClass = this.getClassFileLink(nameParts[nameParts.length - 1], nameParts.slice(0, -1).join('.'));
|
|
1321
|
-
if (extendedClass) {
|
|
1322
|
-
results.push(util_1.util.createLocation(util_1.util.pathToUri(extendedClass.file.srcPath), extendedClass.item.range));
|
|
1323
|
-
}
|
|
1324
|
-
}
|
|
1325
|
-
return results;
|
|
1326
|
-
}
|
|
1327
|
-
if (token.kind === TokenKind_1.TokenKind.StringLiteral) {
|
|
1328
|
-
// We need to strip off the quotes but only if present
|
|
1329
|
-
const startIndex = textToSearchFor.startsWith('"') ? 1 : 0;
|
|
1330
|
-
let endIndex = textToSearchFor.length;
|
|
1331
|
-
if (textToSearchFor.endsWith('"')) {
|
|
1332
|
-
endIndex--;
|
|
1333
|
-
}
|
|
1334
|
-
textToSearchFor = textToSearchFor.substring(startIndex, endIndex);
|
|
1335
|
-
}
|
|
1336
|
-
//look through local variables first, get the function scope for this position (if it exists)
|
|
1337
|
-
const functionScope = this.getFunctionScopeAtPosition(position);
|
|
1338
|
-
if (functionScope) {
|
|
1339
|
-
//find any variable or label with this name
|
|
1340
|
-
for (const varDeclaration of functionScope.variableDeclarations) {
|
|
1341
|
-
//we found a variable declaration with this token text!
|
|
1342
|
-
if (varDeclaration.name.toLowerCase() === textToSearchFor) {
|
|
1343
|
-
const uri = util_1.util.pathToUri(this.srcPath);
|
|
1344
|
-
results.push(util_1.util.createLocation(uri, varDeclaration.nameRange));
|
|
1345
|
-
}
|
|
1346
|
-
}
|
|
1347
|
-
if (this.tokenFollows(token, TokenKind_1.TokenKind.Goto)) {
|
|
1348
|
-
for (const label of functionScope.labelStatements) {
|
|
1349
|
-
if (label.name.toLocaleLowerCase() === textToSearchFor) {
|
|
1350
|
-
const uri = util_1.util.pathToUri(this.srcPath);
|
|
1351
|
-
results.push(util_1.util.createLocation(uri, label.nameRange));
|
|
1352
|
-
}
|
|
1353
|
-
}
|
|
1354
|
-
}
|
|
1355
|
-
}
|
|
1356
|
-
const filesSearched = new Set();
|
|
1357
|
-
//look through all files in scope for matches
|
|
1358
|
-
for (const scope of scopesForFile) {
|
|
1359
|
-
for (const file of scope.getAllFiles()) {
|
|
1360
|
-
if ((0, reflection_1.isXmlFile)(file) || filesSearched.has(file)) {
|
|
1361
|
-
continue;
|
|
1362
|
-
}
|
|
1363
|
-
filesSearched.add(file);
|
|
1364
|
-
if ((previousToken === null || previousToken === void 0 ? void 0 : previousToken.kind) === TokenKind_1.TokenKind.Dot && file.parseMode === Parser_1.ParseMode.BrighterScript) {
|
|
1365
|
-
results.push(...this.getClassMemberDefinitions(textToSearchFor, file));
|
|
1366
|
-
const namespaceDefinition = this.getNamespaceDefinitions(token, file);
|
|
1367
|
-
if (namespaceDefinition) {
|
|
1368
|
-
results.push(namespaceDefinition);
|
|
1369
|
-
}
|
|
1370
|
-
}
|
|
1371
|
-
const statementHandler = (statement) => {
|
|
1372
|
-
if (statement.getName(this.parseMode).toLowerCase() === textToSearchFor) {
|
|
1373
|
-
const uri = util_1.util.pathToUri(file.srcPath);
|
|
1374
|
-
results.push(util_1.util.createLocation(uri, statement.range));
|
|
1375
|
-
}
|
|
1376
|
-
};
|
|
1377
|
-
file.parser.ast.walk((0, visitors_1.createVisitor)({
|
|
1378
|
-
FunctionStatement: statementHandler
|
|
1379
|
-
}), {
|
|
1380
|
-
walkMode: visitors_1.WalkMode.visitStatements
|
|
1381
|
-
});
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
return results;
|
|
1233
|
+
return new DefinitionProvider_1.DefinitionProvider({
|
|
1234
|
+
program: this.program,
|
|
1235
|
+
file: this,
|
|
1236
|
+
position: position,
|
|
1237
|
+
definitions: []
|
|
1238
|
+
}).process();
|
|
1385
1239
|
}
|
|
1386
1240
|
getClassMemberDefinitions(textToSearchFor, file) {
|
|
1387
1241
|
let results = [];
|