brighterscript 0.43.0 → 0.45.1
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 +37 -0
- package/dist/Cache.d.ts +3 -8
- package/dist/Cache.js +9 -14
- package/dist/Cache.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +21 -1
- package/dist/DiagnosticMessages.js +20 -0
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.d.ts +1 -6
- package/dist/LanguageServer.js +3 -3
- package/dist/LanguageServer.js.map +1 -1
- package/dist/PluginInterface.d.ts +3 -3
- package/dist/PluginInterface.js +3 -0
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +67 -24
- package/dist/Program.js +155 -88
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.js +3 -3
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/Scope.d.ts +16 -10
- package/dist/Scope.js +28 -1
- package/dist/Scope.js.map +1 -1
- package/dist/XmlScope.d.ts +3 -3
- package/dist/astUtils/AstEditor.d.ts +6 -0
- package/dist/astUtils/AstEditor.js +10 -0
- package/dist/astUtils/AstEditor.js.map +1 -1
- package/dist/astUtils/AstEditor.spec.js +37 -0
- package/dist/astUtils/AstEditor.spec.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +3 -1
- package/dist/astUtils/reflection.js +10 -2
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +3 -1
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/astUtils/visitors.spec.js +6 -6
- package/dist/astUtils/visitors.spec.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +4 -1
- package/dist/bscPlugin/BscPlugin.js +21 -2
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +18 -16
- package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -0
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
- package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.d.ts → BrsFileSemanticTokensProcessor.spec.d.ts} +0 -0
- package/dist/bscPlugin/semanticTokens/{SemanticTokensProcessor.spec.js → BrsFileSemanticTokensProcessor.spec.js} +32 -4
- package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +36 -0
- package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
- package/dist/bscPlugin/validation/ScopeValidator.d.ts +11 -0
- package/dist/bscPlugin/validation/ScopeValidator.js +94 -0
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
- package/dist/diagnosticUtils.js +3 -3
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/files/BrsFile.Class.spec.js +47 -47
- package/dist/files/BrsFile.Class.spec.js.map +1 -1
- package/dist/files/BrsFile.d.ts +16 -3
- package/dist/files/BrsFile.js +112 -30
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/BrsFile.spec.js +194 -95
- package/dist/files/BrsFile.spec.js.map +1 -1
- package/dist/files/XmlFile.d.ts +10 -5
- package/dist/files/XmlFile.js +6 -1
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/files/XmlFile.spec.js +83 -81
- package/dist/files/XmlFile.spec.js.map +1 -1
- package/dist/files/tests/imports.spec.js +23 -23
- package/dist/files/tests/imports.spec.js.map +1 -1
- package/dist/interfaces.d.ts +29 -8
- package/dist/lexer/Lexer.spec.js +8 -0
- package/dist/lexer/Lexer.spec.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +2 -0
- package/dist/lexer/TokenKind.js +5 -0
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/parser/Parser.d.ts +10 -1
- package/dist/parser/Parser.js +90 -1
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/SGParser.spec.js +1 -1
- package/dist/parser/SGParser.spec.js.map +1 -1
- package/dist/parser/Statement.d.ts +52 -0
- package/dist/parser/Statement.js +154 -1
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/Statement.spec.js +1 -1
- package/dist/parser/Statement.spec.js.map +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +1 -1
- package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +1 -1
- package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js +1 -1
- package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js +1 -1
- package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
- package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
- package/dist/parser/tests/statement/Enum.spec.js +774 -0
- package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
- package/dist/parser/tests/statement/InterfaceStatement.spec.js +1 -1
- package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
- package/dist/types/FunctionType.d.ts +2 -2
- package/dist/types/FunctionType.js +3 -3
- package/dist/types/FunctionType.js.map +1 -1
- package/dist/types/FunctionType.spec.js +2 -2
- package/dist/types/FunctionType.spec.js.map +1 -1
- package/dist/util.d.ts +22 -0
- package/dist/util.js +60 -0
- package/dist/util.js.map +1 -1
- package/package.json +2 -3
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
- package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
|
@@ -37,7 +37,7 @@ describe('BrsFile', () => {
|
|
|
37
37
|
program.dispose();
|
|
38
38
|
});
|
|
39
39
|
it('supports the third parameter in CreateObject', () => {
|
|
40
|
-
program.
|
|
40
|
+
program.setFile('source/main.brs', `
|
|
41
41
|
sub main()
|
|
42
42
|
regexp = CreateObject("roRegex", "[a-z]+", "i")
|
|
43
43
|
end sub
|
|
@@ -46,7 +46,7 @@ describe('BrsFile', () => {
|
|
|
46
46
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
47
47
|
});
|
|
48
48
|
it('supports the 6 params in CreateObject for roRegion', () => {
|
|
49
|
-
program.
|
|
49
|
+
program.setFile('source/main.brs', `
|
|
50
50
|
sub createRegion(bitmap as object)
|
|
51
51
|
region = CreateObject("roRegion", bitmap, 20, 40, 100, 200)
|
|
52
52
|
end sub
|
|
@@ -75,7 +75,7 @@ describe('BrsFile', () => {
|
|
|
75
75
|
dest: `source/lib.brs`
|
|
76
76
|
};
|
|
77
77
|
it('creates proper tokens', () => {
|
|
78
|
-
file = program.
|
|
78
|
+
file = program.setFile(entry, `call(ModuleA.ModuleB.ModuleC.`);
|
|
79
79
|
(0, chai_1.expect)(file['getPartialVariableName'](file.parser.tokens[7])).to.equal('ModuleA.ModuleB.ModuleC.');
|
|
80
80
|
(0, chai_1.expect)(file['getPartialVariableName'](file.parser.tokens[6])).to.equal('ModuleA.ModuleB.ModuleC');
|
|
81
81
|
(0, chai_1.expect)(file['getPartialVariableName'](file.parser.tokens[5])).to.equal('ModuleA.ModuleB.');
|
|
@@ -87,13 +87,13 @@ describe('BrsFile', () => {
|
|
|
87
87
|
describe('getScopesForFile', () => {
|
|
88
88
|
it('finds the scope for the file', () => {
|
|
89
89
|
var _a;
|
|
90
|
-
let file = program.
|
|
90
|
+
let file = program.setFile('source/main.brs', ``);
|
|
91
91
|
(0, chai_1.expect)((_a = program.getScopesForFile(file)[0]) === null || _a === void 0 ? void 0 : _a.name).to.equal('source');
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
94
|
describe('getCompletions', () => {
|
|
95
95
|
it('does not crash for callfunc on a function call', () => {
|
|
96
|
-
const file = program.
|
|
96
|
+
const file = program.setFile('source/main.brs', `
|
|
97
97
|
sub main()
|
|
98
98
|
getManager()@.
|
|
99
99
|
end sub
|
|
@@ -103,7 +103,7 @@ describe('BrsFile', () => {
|
|
|
103
103
|
}).not.to.throw;
|
|
104
104
|
});
|
|
105
105
|
it('suggests pkg paths in strings that match that criteria', () => {
|
|
106
|
-
program.
|
|
106
|
+
program.setFile('source/main.brs', `
|
|
107
107
|
sub main()
|
|
108
108
|
print "pkg:"
|
|
109
109
|
end sub
|
|
@@ -115,7 +115,7 @@ describe('BrsFile', () => {
|
|
|
115
115
|
]);
|
|
116
116
|
});
|
|
117
117
|
it('suggests libpkg paths in strings that match that criteria', () => {
|
|
118
|
-
program.
|
|
118
|
+
program.setFile('source/main.brs', `
|
|
119
119
|
sub main()
|
|
120
120
|
print "libpkg:"
|
|
121
121
|
end sub
|
|
@@ -127,7 +127,7 @@ describe('BrsFile', () => {
|
|
|
127
127
|
]);
|
|
128
128
|
});
|
|
129
129
|
it('suggests pkg paths in template strings', () => {
|
|
130
|
-
program.
|
|
130
|
+
program.setFile('source/main.brs', `
|
|
131
131
|
sub main()
|
|
132
132
|
print \`pkg:\`
|
|
133
133
|
end sub
|
|
@@ -140,7 +140,7 @@ describe('BrsFile', () => {
|
|
|
140
140
|
});
|
|
141
141
|
it('waits for the file to be processed before collecting completions', () => {
|
|
142
142
|
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
143
|
-
program.
|
|
143
|
+
program.setFile('source/main.brs', `
|
|
144
144
|
sub Main()
|
|
145
145
|
print "hello"
|
|
146
146
|
Say
|
|
@@ -154,9 +154,79 @@ describe('BrsFile', () => {
|
|
|
154
154
|
(0, chai_1.expect)(names).to.includes('Main');
|
|
155
155
|
(0, chai_1.expect)(names).to.includes('SayHello');
|
|
156
156
|
});
|
|
157
|
+
it('includes every type of item at base level', () => {
|
|
158
|
+
program.setFile('source/main.bs', `
|
|
159
|
+
sub main()
|
|
160
|
+
print
|
|
161
|
+
end sub
|
|
162
|
+
sub speak()
|
|
163
|
+
end sub
|
|
164
|
+
namespace stuff
|
|
165
|
+
end namespace
|
|
166
|
+
class Person
|
|
167
|
+
end class
|
|
168
|
+
enum Direction
|
|
169
|
+
end enum
|
|
170
|
+
`);
|
|
171
|
+
(0, testHelpers_spec_1.expectCompletionsIncludes)(program.getCompletions('source/main.bs', util_1.default.createPosition(2, 26)), [{
|
|
172
|
+
label: 'main',
|
|
173
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
174
|
+
}, {
|
|
175
|
+
label: 'speak',
|
|
176
|
+
kind: vscode_languageserver_1.CompletionItemKind.Function
|
|
177
|
+
}, {
|
|
178
|
+
label: 'stuff',
|
|
179
|
+
kind: vscode_languageserver_1.CompletionItemKind.Module
|
|
180
|
+
}, {
|
|
181
|
+
label: 'Person',
|
|
182
|
+
kind: vscode_languageserver_1.CompletionItemKind.Class
|
|
183
|
+
}, {
|
|
184
|
+
label: 'Direction',
|
|
185
|
+
kind: vscode_languageserver_1.CompletionItemKind.Enum
|
|
186
|
+
}]);
|
|
187
|
+
});
|
|
188
|
+
describe('namespaces', () => {
|
|
189
|
+
it('gets full namespace completions at any point through the leading identifier', () => {
|
|
190
|
+
program.setFile('source/main.bs', `
|
|
191
|
+
sub main()
|
|
192
|
+
foo.bar
|
|
193
|
+
end sub
|
|
194
|
+
|
|
195
|
+
namespace foo.bar
|
|
196
|
+
end namespace
|
|
197
|
+
|
|
198
|
+
class Person
|
|
199
|
+
end class
|
|
200
|
+
`);
|
|
201
|
+
const result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 24)).map(x => x.label);
|
|
202
|
+
(0, chai_1.expect)(result).includes('main');
|
|
203
|
+
(0, chai_1.expect)(result).includes('foo');
|
|
204
|
+
(0, chai_1.expect)(result).includes('Person');
|
|
205
|
+
});
|
|
206
|
+
it('gets namespace completions', () => {
|
|
207
|
+
program.setFile('source/main.bs', `
|
|
208
|
+
namespace foo.bar
|
|
209
|
+
function sayHello()
|
|
210
|
+
end function
|
|
211
|
+
end namespace
|
|
212
|
+
|
|
213
|
+
sub Main()
|
|
214
|
+
print "hello"
|
|
215
|
+
foo.ba
|
|
216
|
+
foo.bar.
|
|
217
|
+
end sub
|
|
218
|
+
`);
|
|
219
|
+
let result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 30));
|
|
220
|
+
let names = result.map(x => x.label);
|
|
221
|
+
(0, chai_1.expect)(names).to.includes('bar');
|
|
222
|
+
result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(9, 32));
|
|
223
|
+
names = result.map(x => x.label);
|
|
224
|
+
(0, chai_1.expect)(names).to.includes('sayHello');
|
|
225
|
+
});
|
|
226
|
+
});
|
|
157
227
|
it('always includes `m`', () => {
|
|
158
228
|
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
159
|
-
program.
|
|
229
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
160
230
|
sub Main()
|
|
161
231
|
|
|
162
232
|
end sub
|
|
@@ -167,14 +237,14 @@ describe('BrsFile', () => {
|
|
|
167
237
|
});
|
|
168
238
|
it('does not fail for missing previousToken', () => {
|
|
169
239
|
//add a single character to the file, and get completions after it
|
|
170
|
-
program.
|
|
240
|
+
program.setFile('source/main.brs', `i`);
|
|
171
241
|
(0, chai_1.expect)(() => {
|
|
172
242
|
program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(0, 1)).map(x => x.label);
|
|
173
243
|
}).not.to.throw;
|
|
174
244
|
});
|
|
175
245
|
it('includes all keywords`', () => {
|
|
176
246
|
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
177
|
-
program.
|
|
247
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
178
248
|
sub Main()
|
|
179
249
|
|
|
180
250
|
end sub
|
|
@@ -195,7 +265,7 @@ describe('BrsFile', () => {
|
|
|
195
265
|
});
|
|
196
266
|
it('does not provide completions within a comment', () => {
|
|
197
267
|
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
198
|
-
program.
|
|
268
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
199
269
|
sub Main()
|
|
200
270
|
'some comment
|
|
201
271
|
end sub
|
|
@@ -206,7 +276,7 @@ describe('BrsFile', () => {
|
|
|
206
276
|
});
|
|
207
277
|
it('does not provide duplicate entries for variables', () => {
|
|
208
278
|
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
209
|
-
program.
|
|
279
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
210
280
|
sub Main()
|
|
211
281
|
name = "bob"
|
|
212
282
|
age = 12
|
|
@@ -221,7 +291,7 @@ describe('BrsFile', () => {
|
|
|
221
291
|
});
|
|
222
292
|
it('does not include `as` and `string` text options when used in function params', () => {
|
|
223
293
|
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
224
|
-
program.
|
|
294
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
225
295
|
sub Main(name as string)
|
|
226
296
|
|
|
227
297
|
end sub
|
|
@@ -232,7 +302,7 @@ describe('BrsFile', () => {
|
|
|
232
302
|
});
|
|
233
303
|
it('does not provide intellisense results when inside a comment', () => {
|
|
234
304
|
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
235
|
-
program.
|
|
305
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
236
306
|
sub Main(name as string)
|
|
237
307
|
'this is a comment
|
|
238
308
|
end sub
|
|
@@ -243,7 +313,7 @@ describe('BrsFile', () => {
|
|
|
243
313
|
it('does provide intellisence for labels only after a goto keyword', () => {
|
|
244
314
|
var _a;
|
|
245
315
|
//eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
246
|
-
program.
|
|
316
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
247
317
|
sub Main(name as string)
|
|
248
318
|
something:
|
|
249
319
|
goto \nend sub
|
|
@@ -256,7 +326,7 @@ describe('BrsFile', () => {
|
|
|
256
326
|
describe('comment flags', () => {
|
|
257
327
|
describe('bs:disable-next-line', () => {
|
|
258
328
|
it('disables critical diagnostic issues', () => {
|
|
259
|
-
program.
|
|
329
|
+
program.setFile('source/main.brs', `
|
|
260
330
|
sub main()
|
|
261
331
|
Dim requestData
|
|
262
332
|
end sub
|
|
@@ -264,7 +334,7 @@ describe('BrsFile', () => {
|
|
|
264
334
|
//should have an error
|
|
265
335
|
program.validate();
|
|
266
336
|
(0, testHelpers_spec_1.expectHasDiagnostics)(program);
|
|
267
|
-
program.
|
|
337
|
+
program.setFile('source/main.brs', `
|
|
268
338
|
sub main()
|
|
269
339
|
'bs:disable-next-line
|
|
270
340
|
Dim requestData
|
|
@@ -275,7 +345,7 @@ describe('BrsFile', () => {
|
|
|
275
345
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
276
346
|
});
|
|
277
347
|
it('works with leading whitespace', () => {
|
|
278
|
-
program.
|
|
348
|
+
program.setFile('source/main.brs', `
|
|
279
349
|
sub main()
|
|
280
350
|
' bs:disable-next-line
|
|
281
351
|
=asdf=sadf=
|
|
@@ -286,7 +356,7 @@ describe('BrsFile', () => {
|
|
|
286
356
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
287
357
|
});
|
|
288
358
|
it('works for all', () => {
|
|
289
|
-
let file = program.
|
|
359
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
290
360
|
sub Main()
|
|
291
361
|
'bs:disable-next-line
|
|
292
362
|
name = "bob
|
|
@@ -303,7 +373,7 @@ describe('BrsFile', () => {
|
|
|
303
373
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
304
374
|
});
|
|
305
375
|
it('works for specific codes', () => {
|
|
306
|
-
let file = program.
|
|
376
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
307
377
|
sub Main()
|
|
308
378
|
'bs:disable-next-line: 1083, 1001
|
|
309
379
|
name = "bob
|
|
@@ -319,7 +389,7 @@ describe('BrsFile', () => {
|
|
|
319
389
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
320
390
|
});
|
|
321
391
|
it('recognizes non-numeric codes', () => {
|
|
322
|
-
let file = program.
|
|
392
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
323
393
|
sub Main()
|
|
324
394
|
'bs:disable-next-line: LINT9999
|
|
325
395
|
name = "bob
|
|
@@ -330,7 +400,7 @@ describe('BrsFile', () => {
|
|
|
330
400
|
});
|
|
331
401
|
it('supports disabling non-numeric error codes', () => {
|
|
332
402
|
const program = new Program_1.Program({});
|
|
333
|
-
const file = program.
|
|
403
|
+
const file = program.setFile('source/main.brs', `
|
|
334
404
|
sub main()
|
|
335
405
|
something = true 'bs:disable-line: LINT1005
|
|
336
406
|
end sub
|
|
@@ -345,7 +415,7 @@ describe('BrsFile', () => {
|
|
|
345
415
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(scope);
|
|
346
416
|
});
|
|
347
417
|
it('adds diagnostics for unknown numeric diagnostic codes', () => {
|
|
348
|
-
program.
|
|
418
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
349
419
|
sub main()
|
|
350
420
|
print "hi" 'bs:disable-line: 123456 999999 aaaab
|
|
351
421
|
end sub
|
|
@@ -356,7 +426,7 @@ describe('BrsFile', () => {
|
|
|
356
426
|
});
|
|
357
427
|
describe('bs:disable-line', () => {
|
|
358
428
|
it('works for all', () => {
|
|
359
|
-
let file = program.
|
|
429
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
360
430
|
sub Main()
|
|
361
431
|
z::;;%%%%%% 'bs:disable-line
|
|
362
432
|
end sub
|
|
@@ -372,7 +442,7 @@ describe('BrsFile', () => {
|
|
|
372
442
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
373
443
|
});
|
|
374
444
|
it('works for specific codes', () => {
|
|
375
|
-
program.
|
|
445
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
376
446
|
sub main()
|
|
377
447
|
'should not have any errors
|
|
378
448
|
DoSomething(1) 'bs:disable-line:1002
|
|
@@ -391,7 +461,7 @@ describe('BrsFile', () => {
|
|
|
391
461
|
//the current version of BRS causes parse errors after the `parse` keyword, showing error in comments
|
|
392
462
|
//the program should ignore all diagnostics found in brs:* comment lines EXCEPT
|
|
393
463
|
//for the diagnostics about using unknown error codes
|
|
394
|
-
program.
|
|
464
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
395
465
|
sub main()
|
|
396
466
|
stop 'bs:disable-line
|
|
397
467
|
print "need a valid line to fix stop error"
|
|
@@ -404,7 +474,7 @@ describe('BrsFile', () => {
|
|
|
404
474
|
});
|
|
405
475
|
describe('parse', () => {
|
|
406
476
|
it('supports iife in assignment', () => {
|
|
407
|
-
program.
|
|
477
|
+
program.setFile('source/main.brs', `
|
|
408
478
|
sub main()
|
|
409
479
|
result = sub()
|
|
410
480
|
end sub()
|
|
@@ -416,7 +486,7 @@ describe('BrsFile', () => {
|
|
|
416
486
|
});
|
|
417
487
|
it('uses the proper parse mode based on file extension', () => {
|
|
418
488
|
function testParseMode(destPath, expectedParseMode) {
|
|
419
|
-
const file = program.
|
|
489
|
+
const file = program.setFile(destPath, '');
|
|
420
490
|
(0, chai_1.expect)(file.parseMode).to.equal(expectedParseMode);
|
|
421
491
|
}
|
|
422
492
|
testParseMode('source/main.brs', Parser_1.ParseMode.BrightScript);
|
|
@@ -427,7 +497,7 @@ describe('BrsFile', () => {
|
|
|
427
497
|
testParseMode('source/main.spec.bs', Parser_1.ParseMode.BrighterScript);
|
|
428
498
|
});
|
|
429
499
|
it('supports labels and goto statements', () => {
|
|
430
|
-
let file = program.
|
|
500
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
431
501
|
sub Main()
|
|
432
502
|
'multiple goto statements on one line
|
|
433
503
|
goto myLabel : goto myLabel
|
|
@@ -437,7 +507,7 @@ describe('BrsFile', () => {
|
|
|
437
507
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(file);
|
|
438
508
|
});
|
|
439
509
|
it('supports empty print statements', () => {
|
|
440
|
-
let file = program.
|
|
510
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
441
511
|
sub main()
|
|
442
512
|
print
|
|
443
513
|
end sub
|
|
@@ -446,7 +516,7 @@ describe('BrsFile', () => {
|
|
|
446
516
|
});
|
|
447
517
|
describe('conditional compile', () => {
|
|
448
518
|
it('works for upper case keywords', () => {
|
|
449
|
-
let file = program.
|
|
519
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
450
520
|
sub main()
|
|
451
521
|
#CONST someFlag = true
|
|
452
522
|
#IF someFlag
|
|
@@ -461,7 +531,7 @@ describe('BrsFile', () => {
|
|
|
461
531
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(file);
|
|
462
532
|
});
|
|
463
533
|
it('supports single-word #elseif and #endif', () => {
|
|
464
|
-
let file = program.
|
|
534
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
465
535
|
sub main()
|
|
466
536
|
#const someFlag = true
|
|
467
537
|
#if someFlag
|
|
@@ -474,7 +544,7 @@ describe('BrsFile', () => {
|
|
|
474
544
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(file);
|
|
475
545
|
});
|
|
476
546
|
it('supports multi-word #else if and #end if', () => {
|
|
477
|
-
let file = program.
|
|
547
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
478
548
|
sub main()
|
|
479
549
|
#const someFlag = true
|
|
480
550
|
#if someFlag
|
|
@@ -487,7 +557,7 @@ describe('BrsFile', () => {
|
|
|
487
557
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(file);
|
|
488
558
|
});
|
|
489
559
|
it('does not choke on invalid code inside a false conditional compile', () => {
|
|
490
|
-
let file = program.
|
|
560
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
491
561
|
sub main()
|
|
492
562
|
#if false
|
|
493
563
|
non-commented code here should not cause parse errors
|
|
@@ -497,7 +567,7 @@ describe('BrsFile', () => {
|
|
|
497
567
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(file);
|
|
498
568
|
});
|
|
499
569
|
it('detects syntax error in #if', () => {
|
|
500
|
-
let file = program.
|
|
570
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
501
571
|
sub main()
|
|
502
572
|
#if true1
|
|
503
573
|
print "true"
|
|
@@ -509,7 +579,7 @@ describe('BrsFile', () => {
|
|
|
509
579
|
]);
|
|
510
580
|
});
|
|
511
581
|
it('detects syntax error in #const', () => {
|
|
512
|
-
let file = program.
|
|
582
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
513
583
|
sub main()
|
|
514
584
|
#if %
|
|
515
585
|
print "true"
|
|
@@ -522,7 +592,7 @@ describe('BrsFile', () => {
|
|
|
522
592
|
]);
|
|
523
593
|
});
|
|
524
594
|
it('detects #const name using reserved word', () => {
|
|
525
|
-
let file = program.
|
|
595
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
526
596
|
sub main()
|
|
527
597
|
#const function = true
|
|
528
598
|
end sub
|
|
@@ -533,7 +603,7 @@ describe('BrsFile', () => {
|
|
|
533
603
|
]);
|
|
534
604
|
});
|
|
535
605
|
it('detects syntax error in #const', () => {
|
|
536
|
-
let file = program.
|
|
606
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
537
607
|
sub main()
|
|
538
608
|
#const someConst = 123
|
|
539
609
|
end sub
|
|
@@ -544,7 +614,7 @@ describe('BrsFile', () => {
|
|
|
544
614
|
});
|
|
545
615
|
});
|
|
546
616
|
it('supports stop statement', () => {
|
|
547
|
-
let file = program.
|
|
617
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
548
618
|
sub main()
|
|
549
619
|
stop
|
|
550
620
|
end sub
|
|
@@ -552,7 +622,7 @@ describe('BrsFile', () => {
|
|
|
552
622
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(file);
|
|
553
623
|
});
|
|
554
624
|
it('supports single-line if statements', () => {
|
|
555
|
-
let file = program.
|
|
625
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
556
626
|
sub main()
|
|
557
627
|
if 1 < 2: return true: end if
|
|
558
628
|
if 1 < 2: return true
|
|
@@ -901,38 +971,42 @@ describe('BrsFile', () => {
|
|
|
901
971
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(file);
|
|
902
972
|
});
|
|
903
973
|
it('adds error for library statements NOT at top of file', () => {
|
|
904
|
-
|
|
974
|
+
program.setFile('source/file.brs', ``);
|
|
975
|
+
program.setFile('source/main.bs', `
|
|
905
976
|
sub main()
|
|
906
977
|
end sub
|
|
907
978
|
import "file.brs"
|
|
908
979
|
`);
|
|
909
|
-
(
|
|
980
|
+
program.validate();
|
|
981
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
910
982
|
DiagnosticMessages_1.DiagnosticMessages.importStatementMustBeDeclaredAtTopOfFile()
|
|
911
983
|
]);
|
|
912
984
|
});
|
|
913
985
|
it('supports library imports', () => {
|
|
914
|
-
|
|
986
|
+
program.setFile('source/main.brs', `
|
|
915
987
|
Library "v30/bslCore.brs"
|
|
916
988
|
`);
|
|
917
|
-
(0, testHelpers_spec_1.expectZeroDiagnostics)(
|
|
989
|
+
(0, testHelpers_spec_1.expectZeroDiagnostics)(program);
|
|
918
990
|
});
|
|
919
991
|
it('adds error for library statements NOT at top of file', () => {
|
|
920
|
-
|
|
992
|
+
program.setFile('source/main.brs', `
|
|
921
993
|
sub main()
|
|
922
994
|
end sub
|
|
923
995
|
Library "v30/bslCore.brs"
|
|
924
996
|
`);
|
|
925
|
-
(
|
|
997
|
+
program.validate();
|
|
998
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
926
999
|
DiagnosticMessages_1.DiagnosticMessages.libraryStatementMustBeDeclaredAtTopOfFile()
|
|
927
1000
|
]);
|
|
928
1001
|
});
|
|
929
1002
|
it('adds error for library statements inside of function body', () => {
|
|
930
|
-
|
|
1003
|
+
program.setFile('source/main.brs', `
|
|
931
1004
|
sub main()
|
|
932
1005
|
Library "v30/bslCore.brs"
|
|
933
1006
|
end sub
|
|
934
1007
|
`);
|
|
935
|
-
(
|
|
1008
|
+
program.validate();
|
|
1009
|
+
(0, testHelpers_spec_1.expectDiagnostics)(program, [
|
|
936
1010
|
DiagnosticMessages_1.DiagnosticMessages.libraryStatementMustBeDeclaredAtTopOfFile()
|
|
937
1011
|
]);
|
|
938
1012
|
});
|
|
@@ -945,7 +1019,7 @@ describe('BrsFile', () => {
|
|
|
945
1019
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(file);
|
|
946
1020
|
});
|
|
947
1021
|
it('succeeds when finding variables with "sub" in them', () => {
|
|
948
|
-
let file = program.
|
|
1022
|
+
let file = program.setFile('source/main.brs', `
|
|
949
1023
|
function DoSomething()
|
|
950
1024
|
return value.subType()
|
|
951
1025
|
end function
|
|
@@ -1175,7 +1249,7 @@ describe('BrsFile', () => {
|
|
|
1175
1249
|
}]);
|
|
1176
1250
|
});
|
|
1177
1251
|
it('finds function calls nested inside statements', () => {
|
|
1178
|
-
program.
|
|
1252
|
+
program.setFile(`source/main.brs`, `
|
|
1179
1253
|
sub main()
|
|
1180
1254
|
if true then
|
|
1181
1255
|
DoesNotExist(1, 2)
|
|
@@ -1220,7 +1294,7 @@ describe('BrsFile', () => {
|
|
|
1220
1294
|
(0, chai_1.expect)(file.callables.length).to.equal(0);
|
|
1221
1295
|
});
|
|
1222
1296
|
it('finds return type', () => {
|
|
1223
|
-
let file = program.
|
|
1297
|
+
let file = program.setFile('source/main.brs', `
|
|
1224
1298
|
function DoSomething() as string
|
|
1225
1299
|
end function
|
|
1226
1300
|
`);
|
|
@@ -1314,7 +1388,7 @@ describe('BrsFile', () => {
|
|
|
1314
1388
|
(0, chai_1.expect)(scope.variableDeclarations[0].name).to.equal('theLength');
|
|
1315
1389
|
});
|
|
1316
1390
|
it('finds value from global return', () => {
|
|
1317
|
-
let file = program.
|
|
1391
|
+
let file = program.setFile('source/main.brs', `
|
|
1318
1392
|
sub Main()
|
|
1319
1393
|
myName = GetName()
|
|
1320
1394
|
end sub
|
|
@@ -1359,7 +1433,7 @@ describe('BrsFile', () => {
|
|
|
1359
1433
|
});
|
|
1360
1434
|
describe('getHover', () => {
|
|
1361
1435
|
it('works for param types', () => {
|
|
1362
|
-
let file = program.
|
|
1436
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1363
1437
|
sub DoSomething(name as string)
|
|
1364
1438
|
name = 1
|
|
1365
1439
|
sayMyName = function(name as string)
|
|
@@ -1377,7 +1451,7 @@ describe('BrsFile', () => {
|
|
|
1377
1451
|
});
|
|
1378
1452
|
//ignore this for now...it's not a huge deal
|
|
1379
1453
|
it('does not match on keywords or data types', () => {
|
|
1380
|
-
let file = program.
|
|
1454
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1381
1455
|
sub Main(name as string)
|
|
1382
1456
|
end sub
|
|
1383
1457
|
sub as()
|
|
@@ -1389,7 +1463,7 @@ describe('BrsFile', () => {
|
|
|
1389
1463
|
(0, chai_1.expect)(file.getHover(vscode_languageserver_1.Position.create(1, 36))).not.to.exist;
|
|
1390
1464
|
});
|
|
1391
1465
|
it('finds declared function', () => {
|
|
1392
|
-
let file = program.
|
|
1466
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1393
1467
|
function Main(count = 1)
|
|
1394
1468
|
firstName = "bob"
|
|
1395
1469
|
age = 21
|
|
@@ -1406,7 +1480,7 @@ describe('BrsFile', () => {
|
|
|
1406
1480
|
].join('\n'));
|
|
1407
1481
|
});
|
|
1408
1482
|
it('finds variable function hover in same scope', () => {
|
|
1409
|
-
let file = program.
|
|
1483
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1410
1484
|
sub Main()
|
|
1411
1485
|
sayMyName = sub(name as string)
|
|
1412
1486
|
end sub
|
|
@@ -1422,8 +1496,33 @@ describe('BrsFile', () => {
|
|
|
1422
1496
|
'```'
|
|
1423
1497
|
].join('\n'));
|
|
1424
1498
|
});
|
|
1499
|
+
it('does not crash when hovering on built-in functions', async () => {
|
|
1500
|
+
let file = program.setFile('source/main.brs', `
|
|
1501
|
+
function doUcase(text)
|
|
1502
|
+
return ucase(text)
|
|
1503
|
+
end function
|
|
1504
|
+
`);
|
|
1505
|
+
(0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(2, 30))).contents).to.equal([
|
|
1506
|
+
'```brightscript',
|
|
1507
|
+
'function UCase(s as string) as string',
|
|
1508
|
+
'```'
|
|
1509
|
+
].join('\n'));
|
|
1510
|
+
});
|
|
1511
|
+
it('does not crash when hovering on object method call', async () => {
|
|
1512
|
+
let file = program.setFile('source/main.brs', `
|
|
1513
|
+
function getInstr(url, text)
|
|
1514
|
+
return url.instr(text)
|
|
1515
|
+
end function
|
|
1516
|
+
`);
|
|
1517
|
+
(0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(2, 35))).contents).to.equal([
|
|
1518
|
+
'```brightscript',
|
|
1519
|
+
//TODO this really shouldn't be returning the global function, but it does...so make sure it doesn't crash right now.
|
|
1520
|
+
'function Instr(start as integer, text as string, substring as string) as integer',
|
|
1521
|
+
'```'
|
|
1522
|
+
].join('\n'));
|
|
1523
|
+
});
|
|
1425
1524
|
it('finds function hover in file scope', () => {
|
|
1426
|
-
let file = program.
|
|
1525
|
+
let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1427
1526
|
sub Main()
|
|
1428
1527
|
sayMyName()
|
|
1429
1528
|
end sub
|
|
@@ -1445,12 +1544,12 @@ describe('BrsFile', () => {
|
|
|
1445
1544
|
program = new Program_1.Program({
|
|
1446
1545
|
rootDir: rootDir
|
|
1447
1546
|
});
|
|
1448
|
-
let mainFile = program.
|
|
1547
|
+
let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1449
1548
|
sub Main()
|
|
1450
1549
|
sayMyName()
|
|
1451
1550
|
end sub
|
|
1452
1551
|
`);
|
|
1453
|
-
program.
|
|
1552
|
+
program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
|
|
1454
1553
|
sub sayMyName(name as string)
|
|
1455
1554
|
|
|
1456
1555
|
end sub
|
|
@@ -1469,7 +1568,7 @@ describe('BrsFile', () => {
|
|
|
1469
1568
|
program = new Program_1.Program({
|
|
1470
1569
|
rootDir: rootDir
|
|
1471
1570
|
});
|
|
1472
|
-
const file = program.
|
|
1571
|
+
const file = program.setFile('source/lib.brs', `
|
|
1473
1572
|
'
|
|
1474
1573
|
' The main function
|
|
1475
1574
|
'
|
|
@@ -1507,7 +1606,7 @@ describe('BrsFile', () => {
|
|
|
1507
1606
|
`);
|
|
1508
1607
|
});
|
|
1509
1608
|
it('handles mixed case `then` partions of conditionals', () => {
|
|
1510
|
-
let mainFile = program.
|
|
1609
|
+
let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1511
1610
|
sub Main()
|
|
1512
1611
|
if true then
|
|
1513
1612
|
print "works"
|
|
@@ -1515,7 +1614,7 @@ describe('BrsFile', () => {
|
|
|
1515
1614
|
end sub
|
|
1516
1615
|
`);
|
|
1517
1616
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
|
|
1518
|
-
mainFile = program.
|
|
1617
|
+
mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1519
1618
|
sub Main()
|
|
1520
1619
|
if true Then
|
|
1521
1620
|
print "works"
|
|
@@ -1523,7 +1622,7 @@ describe('BrsFile', () => {
|
|
|
1523
1622
|
end sub
|
|
1524
1623
|
`);
|
|
1525
1624
|
(0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
|
|
1526
|
-
mainFile = program.
|
|
1625
|
+
mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1527
1626
|
sub Main()
|
|
1528
1627
|
if true THEN
|
|
1529
1628
|
print "works"
|
|
@@ -1534,7 +1633,7 @@ describe('BrsFile', () => {
|
|
|
1534
1633
|
});
|
|
1535
1634
|
});
|
|
1536
1635
|
it('does not throw when encountering incomplete import statement', () => {
|
|
1537
|
-
program.
|
|
1636
|
+
program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
|
|
1538
1637
|
import
|
|
1539
1638
|
sub main()
|
|
1540
1639
|
end sub
|
|
@@ -2057,7 +2156,7 @@ describe('BrsFile', () => {
|
|
|
2057
2156
|
`);
|
|
2058
2157
|
});
|
|
2059
2158
|
it('simple mapped files include a reference to the source map', () => {
|
|
2060
|
-
let file = program.
|
|
2159
|
+
let file = program.setFile('source/logger.brs', (0, testHelpers_spec_1.trim) `
|
|
2061
2160
|
sub logInfo()
|
|
2062
2161
|
end sub
|
|
2063
2162
|
`);
|
|
@@ -2066,7 +2165,7 @@ describe('BrsFile', () => {
|
|
|
2066
2165
|
(0, chai_1.expect)(code.endsWith(`'//# sourceMappingURL=./logger.brs.map`)).to.be.true;
|
|
2067
2166
|
});
|
|
2068
2167
|
it('AST generated files include a reference to the source map', () => {
|
|
2069
|
-
let file = program.
|
|
2168
|
+
let file = program.setFile('source/logger.brs', (0, testHelpers_spec_1.trim) `
|
|
2070
2169
|
sub logInfo()
|
|
2071
2170
|
end sub
|
|
2072
2171
|
`);
|
|
@@ -2075,7 +2174,7 @@ describe('BrsFile', () => {
|
|
|
2075
2174
|
(0, chai_1.expect)(code.endsWith(`'//# sourceMappingURL=./logger.brs.map`)).to.be.true;
|
|
2076
2175
|
});
|
|
2077
2176
|
it('replaces custom types in parameter types and return types', () => {
|
|
2078
|
-
program.
|
|
2177
|
+
program.setFile('source/SomeKlass.bs', `
|
|
2079
2178
|
class SomeKlass
|
|
2080
2179
|
end class
|
|
2081
2180
|
`);
|
|
@@ -2099,7 +2198,7 @@ describe('BrsFile', () => {
|
|
|
2099
2198
|
describe('callfunc operator', () => {
|
|
2100
2199
|
describe('transpile', () => {
|
|
2101
2200
|
it('does not produce diagnostics', () => {
|
|
2102
|
-
program.
|
|
2201
|
+
program.setFile('source/main.bs', `
|
|
2103
2202
|
sub main()
|
|
2104
2203
|
someObject@.someFunction(paramObject.value)
|
|
2105
2204
|
end sub
|
|
@@ -2145,7 +2244,7 @@ describe('BrsFile', () => {
|
|
|
2145
2244
|
name: 'transform callback',
|
|
2146
2245
|
afterFileParse: onParsed
|
|
2147
2246
|
});
|
|
2148
|
-
file = program.
|
|
2247
|
+
file = program.setFile({ src: `absolute_path/file${ext}`, dest: `relative_path/file${ext}` }, `
|
|
2149
2248
|
sub Sum()
|
|
2150
2249
|
print "hello world"
|
|
2151
2250
|
end sub
|
|
@@ -2166,25 +2265,25 @@ describe('BrsFile', () => {
|
|
|
2166
2265
|
});
|
|
2167
2266
|
describe('typedefKey', () => {
|
|
2168
2267
|
it('works for .brs files', () => {
|
|
2169
|
-
(0, chai_1.expect)((0, util_1.standardizePath)((program.
|
|
2268
|
+
(0, chai_1.expect)((0, util_1.standardizePath)((program.setFile('source/main.brs', '')).typedefKey)).to.equal((0, util_1.standardizePath) `${rootDir.toLowerCase()}/source/main.d.bs`);
|
|
2170
2269
|
});
|
|
2171
2270
|
it('returns undefined for files that should not have a typedef', () => {
|
|
2172
|
-
(0, chai_1.expect)((program.
|
|
2173
|
-
(0, chai_1.expect)((program.
|
|
2174
|
-
const xmlFile = program.
|
|
2271
|
+
(0, chai_1.expect)((program.setFile('source/main.bs', '')).typedefKey).to.be.undefined;
|
|
2272
|
+
(0, chai_1.expect)((program.setFile('source/main.d.bs', '')).typedefKey).to.be.undefined;
|
|
2273
|
+
const xmlFile = program.setFile('components/comp.xml', '');
|
|
2175
2274
|
(0, chai_1.expect)(xmlFile.typedefKey).to.be.undefined;
|
|
2176
2275
|
});
|
|
2177
2276
|
});
|
|
2178
2277
|
describe('type definitions', () => {
|
|
2179
2278
|
it('only exposes defined functions even if source has more', () => {
|
|
2180
2279
|
//parse the .brs file first so it doesn't know about the typedef
|
|
2181
|
-
program.
|
|
2280
|
+
program.setFile('source/main.brs', `
|
|
2182
2281
|
sub main()
|
|
2183
2282
|
end sub
|
|
2184
2283
|
sub speak()
|
|
2185
2284
|
end sub
|
|
2186
2285
|
`);
|
|
2187
|
-
program.
|
|
2286
|
+
program.setFile('source/main.d.bs', `
|
|
2188
2287
|
sub main()
|
|
2189
2288
|
end sub
|
|
2190
2289
|
`);
|
|
@@ -2194,7 +2293,7 @@ describe('BrsFile', () => {
|
|
|
2194
2293
|
(0, chai_1.expect)(functionNames).not.to.include('speak');
|
|
2195
2294
|
});
|
|
2196
2295
|
it('reacts to typedef file changes', () => {
|
|
2197
|
-
let file = program.
|
|
2296
|
+
let file = program.setFile('source/main.brs', `
|
|
2198
2297
|
sub main()
|
|
2199
2298
|
end sub
|
|
2200
2299
|
sub speak()
|
|
@@ -2202,14 +2301,14 @@ describe('BrsFile', () => {
|
|
|
2202
2301
|
`);
|
|
2203
2302
|
(0, chai_1.expect)(file.hasTypedef).to.be.false;
|
|
2204
2303
|
(0, chai_1.expect)(file.typedefFile).not.to.exist;
|
|
2205
|
-
program.
|
|
2304
|
+
program.setFile('source/main.d.bs', `
|
|
2206
2305
|
sub main()
|
|
2207
2306
|
end sub
|
|
2208
2307
|
`);
|
|
2209
2308
|
(0, chai_1.expect)(file.hasTypedef).to.be.true;
|
|
2210
2309
|
(0, chai_1.expect)(file.typedefFile).to.exist;
|
|
2211
2310
|
//add replace file, does it still find the typedef
|
|
2212
|
-
file = program.
|
|
2311
|
+
file = program.setFile('source/main.brs', `
|
|
2213
2312
|
sub main()
|
|
2214
2313
|
end sub
|
|
2215
2314
|
sub speak()
|
|
@@ -2224,36 +2323,36 @@ describe('BrsFile', () => {
|
|
|
2224
2323
|
});
|
|
2225
2324
|
describe('typedef', () => {
|
|
2226
2325
|
it('sets typedef path properly', () => {
|
|
2227
|
-
(0, chai_1.expect)((program.
|
|
2228
|
-
(0, chai_1.expect)((program.
|
|
2229
|
-
(0, chai_1.expect)((program.
|
|
2326
|
+
(0, chai_1.expect)((program.setFile('source/main1.brs', '')).typedefKey).to.equal((0, util_1.standardizePath) `${rootDir}/source/main1.d.bs`.toLowerCase());
|
|
2327
|
+
(0, chai_1.expect)((program.setFile('source/main2.d.bs', '')).typedefKey).to.equal(undefined);
|
|
2328
|
+
(0, chai_1.expect)((program.setFile('source/main3.bs', '')).typedefKey).to.equal(undefined);
|
|
2230
2329
|
//works for dest with `.brs` extension
|
|
2231
|
-
(0, chai_1.expect)((program.
|
|
2330
|
+
(0, chai_1.expect)((program.setFile({ src: 'source/main4.bs', dest: 'source/main4.brs' }, '')).typedefKey).to.equal(undefined);
|
|
2232
2331
|
});
|
|
2233
2332
|
it('does not link when missing from program', () => {
|
|
2234
|
-
const file = program.
|
|
2333
|
+
const file = program.setFile('source/main.brs', ``);
|
|
2235
2334
|
(0, chai_1.expect)(file.typedefFile).not.to.exist;
|
|
2236
2335
|
});
|
|
2237
2336
|
it('links typedef when added BEFORE .brs file', () => {
|
|
2238
|
-
const typedef = program.
|
|
2239
|
-
const file = program.
|
|
2337
|
+
const typedef = program.setFile('source/main.d.bs', ``);
|
|
2338
|
+
const file = program.setFile('source/main.brs', ``);
|
|
2240
2339
|
(0, chai_1.expect)(file.typedefFile).to.equal(typedef);
|
|
2241
2340
|
});
|
|
2242
2341
|
it('links typedef when added AFTER .brs file', () => {
|
|
2243
|
-
const file = program.
|
|
2244
|
-
const typedef = program.
|
|
2342
|
+
const file = program.setFile('source/main.brs', ``);
|
|
2343
|
+
const typedef = program.setFile('source/main.d.bs', ``);
|
|
2245
2344
|
(0, chai_1.expect)(file.typedefFile).to.eql(typedef);
|
|
2246
2345
|
});
|
|
2247
2346
|
it('removes typedef link when typedef is removed', () => {
|
|
2248
|
-
const typedef = program.
|
|
2249
|
-
const file = program.
|
|
2347
|
+
const typedef = program.setFile('source/main.d.bs', ``);
|
|
2348
|
+
const file = program.setFile('source/main.brs', ``);
|
|
2250
2349
|
program.removeFile(typedef.pathAbsolute);
|
|
2251
2350
|
(0, chai_1.expect)(file.typedefFile).to.be.undefined;
|
|
2252
2351
|
});
|
|
2253
2352
|
});
|
|
2254
2353
|
describe('getTypedef', () => {
|
|
2255
2354
|
function testTypedef(original, expected) {
|
|
2256
|
-
let file = program.
|
|
2355
|
+
let file = program.setFile('source/main.brs', original);
|
|
2257
2356
|
(0, chai_1.expect)(file.getTypedef()).to.eql(expected);
|
|
2258
2357
|
}
|
|
2259
2358
|
it('includes namespace on extend class names', () => {
|
|
@@ -2504,7 +2603,7 @@ describe('BrsFile', () => {
|
|
|
2504
2603
|
});
|
|
2505
2604
|
describe('parser getter', () => {
|
|
2506
2605
|
it('recreates the parser when missing', () => {
|
|
2507
|
-
const file = program.
|
|
2606
|
+
const file = program.setFile('source/main.brs', `
|
|
2508
2607
|
sub main()
|
|
2509
2608
|
end sub
|
|
2510
2609
|
`);
|
|
@@ -2518,11 +2617,11 @@ describe('BrsFile', () => {
|
|
|
2518
2617
|
(0, chai_1.expect)(file.parser).to.equal(newParser);
|
|
2519
2618
|
});
|
|
2520
2619
|
it('call parse when previously skipped', () => {
|
|
2521
|
-
program.
|
|
2620
|
+
program.setFile('source/main.d.bs', `'typedef
|
|
2522
2621
|
sub main()
|
|
2523
2622
|
end sub
|
|
2524
2623
|
`);
|
|
2525
|
-
const file = program.
|
|
2624
|
+
const file = program.setFile('source/main.brs', `'source
|
|
2526
2625
|
sub main()
|
|
2527
2626
|
end sub
|
|
2528
2627
|
`);
|