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.
Files changed (36) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/Program.js +10 -11
  3. package/dist/Program.js.map +1 -1
  4. package/dist/Scope.d.ts +1 -0
  5. package/dist/Scope.js +1 -0
  6. package/dist/Scope.js.map +1 -1
  7. package/dist/XmlScope.d.ts +1 -0
  8. package/dist/XmlScope.js +8 -14
  9. package/dist/XmlScope.js.map +1 -1
  10. package/dist/bscPlugin/BscPlugin.d.ts +2 -1
  11. package/dist/bscPlugin/BscPlugin.js +4 -0
  12. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  13. package/dist/bscPlugin/definition/DefinitionProvider.d.ts +13 -0
  14. package/dist/bscPlugin/definition/DefinitionProvider.js +200 -0
  15. package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -0
  16. package/dist/bscPlugin/definition/DefinitionProvider.spec.d.ts +1 -0
  17. package/dist/bscPlugin/definition/DefinitionProvider.spec.js +87 -0
  18. package/dist/bscPlugin/definition/DefinitionProvider.spec.js.map +1 -0
  19. package/dist/files/BrsFile.d.ts +1 -1
  20. package/dist/files/BrsFile.js +8 -154
  21. package/dist/files/BrsFile.js.map +1 -1
  22. package/dist/files/BrsFile.spec.js +33 -0
  23. package/dist/files/BrsFile.spec.js.map +1 -1
  24. package/dist/interfaces.d.ts +32 -1
  25. package/dist/parser/Expression.d.ts +10 -2
  26. package/dist/parser/Expression.js +22 -9
  27. package/dist/parser/Expression.js.map +1 -1
  28. package/dist/parser/Parser.d.ts +5 -0
  29. package/dist/parser/Parser.js +18 -6
  30. package/dist/parser/Parser.js.map +1 -1
  31. package/dist/parser/Statement.d.ts +3 -2
  32. package/dist/parser/Statement.js +23 -16
  33. package/dist/parser/Statement.js.map +1 -1
  34. package/dist/parser/tests/expression/Indexing.spec.js +25 -0
  35. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  36. 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,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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"}
@@ -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[];
@@ -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 vscode_uri_1 = require("vscode-uri");
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
- var _a, _b;
1265
- let results = [];
1266
- //get the token at the position
1267
- const token = this.getTokenAt(position);
1268
- // 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
1269
- let definitionTokenTypes = [
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 = [];