brighterscript 0.57.2 → 0.59.0

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 (124) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +16 -6
  3. package/bsconfig.schema.json +11 -0
  4. package/dist/BsConfig.d.ts +11 -0
  5. package/dist/DiagnosticMessages.d.ts +7 -2
  6. package/dist/DiagnosticMessages.js +7 -2
  7. package/dist/DiagnosticMessages.js.map +1 -1
  8. package/dist/Program.d.ts +12 -2
  9. package/dist/Program.js +69 -24
  10. package/dist/Program.js.map +1 -1
  11. package/dist/ProgramBuilder.js +1 -1
  12. package/dist/ProgramBuilder.js.map +1 -1
  13. package/dist/Scope.d.ts +6 -3
  14. package/dist/Scope.js +24 -17
  15. package/dist/Scope.js.map +1 -1
  16. package/dist/astUtils/AstEditor.d.ts +2 -3
  17. package/dist/astUtils/AstEditor.js.map +1 -1
  18. package/dist/astUtils/creators.d.ts +4 -4
  19. package/dist/astUtils/creators.js +6 -6
  20. package/dist/astUtils/creators.js.map +1 -1
  21. package/dist/astUtils/reflection.d.ts +67 -64
  22. package/dist/astUtils/reflection.js +10 -2
  23. package/dist/astUtils/reflection.js.map +1 -1
  24. package/dist/astUtils/reflection.spec.js +8 -3
  25. package/dist/astUtils/reflection.spec.js.map +1 -1
  26. package/dist/astUtils/visitors.d.ts +33 -31
  27. package/dist/astUtils/visitors.js.map +1 -1
  28. package/dist/astUtils/visitors.spec.js.map +1 -1
  29. package/dist/bscPlugin/BscPlugin.js +4 -0
  30. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  31. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +6 -6
  32. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  33. package/dist/bscPlugin/hover/HoverProcessor.spec.js +40 -34
  34. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  35. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +2 -2
  36. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  37. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +2 -2
  38. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  39. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +4 -5
  40. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -1
  41. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +2 -0
  42. package/dist/bscPlugin/validation/BrsFileValidator.js +166 -12
  43. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  44. package/dist/bscPlugin/validation/ScopeValidator.d.ts +21 -19
  45. package/dist/bscPlugin/validation/ScopeValidator.js +164 -179
  46. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  47. package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
  48. package/dist/bscPlugin/validation/XmlFileValidator.js +44 -0
  49. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
  50. package/dist/files/BrsFile.Class.spec.js +33 -35
  51. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  52. package/dist/files/BrsFile.d.ts +11 -5
  53. package/dist/files/BrsFile.js +15 -47
  54. package/dist/files/BrsFile.js.map +1 -1
  55. package/dist/files/BrsFile.spec.js +107 -79
  56. package/dist/files/BrsFile.spec.js.map +1 -1
  57. package/dist/files/XmlFile.d.ts +9 -4
  58. package/dist/files/XmlFile.js +6 -30
  59. package/dist/files/XmlFile.js.map +1 -1
  60. package/dist/files/XmlFile.spec.js +57 -90
  61. package/dist/files/XmlFile.spec.js.map +1 -1
  62. package/dist/files/tests/imports.spec.js +13 -15
  63. package/dist/files/tests/imports.spec.js.map +1 -1
  64. package/dist/files/tests/optionalChaning.spec.js +10 -12
  65. package/dist/files/tests/optionalChaning.spec.js.map +1 -1
  66. package/dist/index.d.ts +1 -0
  67. package/dist/index.js +1 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/interfaces.d.ts +2 -3
  70. package/dist/lexer/Lexer.spec.js +6 -0
  71. package/dist/lexer/Lexer.spec.js.map +1 -1
  72. package/dist/lexer/TokenKind.d.ts +1 -0
  73. package/dist/lexer/TokenKind.js +6 -2
  74. package/dist/lexer/TokenKind.js.map +1 -1
  75. package/dist/parser/AstNode.d.ts +65 -0
  76. package/dist/parser/AstNode.js +93 -0
  77. package/dist/parser/AstNode.js.map +1 -0
  78. package/dist/parser/AstNode.spec.d.ts +1 -0
  79. package/dist/parser/AstNode.spec.js +42 -0
  80. package/dist/parser/AstNode.spec.js.map +1 -0
  81. package/dist/parser/Expression.d.ts +6 -43
  82. package/dist/parser/Expression.js +53 -81
  83. package/dist/parser/Expression.js.map +1 -1
  84. package/dist/parser/Parser.d.ts +15 -12
  85. package/dist/parser/Parser.js +130 -117
  86. package/dist/parser/Parser.js.map +1 -1
  87. package/dist/parser/Parser.spec.d.ts +1 -1
  88. package/dist/parser/Parser.spec.js.map +1 -1
  89. package/dist/parser/SGParser.spec.js +2 -3
  90. package/dist/parser/SGParser.spec.js.map +1 -1
  91. package/dist/parser/Statement.d.ts +28 -44
  92. package/dist/parser/Statement.js +118 -104
  93. package/dist/parser/Statement.js.map +1 -1
  94. package/dist/parser/Statement.spec.js +16 -10
  95. package/dist/parser/Statement.spec.js.map +1 -1
  96. package/dist/parser/tests/expression/ArrayLiterals.spec.js +37 -0
  97. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  98. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +41 -0
  99. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  100. package/dist/parser/tests/expression/Call.spec.js +109 -1
  101. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  102. package/dist/parser/tests/expression/Indexing.spec.js +49 -4
  103. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  104. package/dist/parser/tests/statement/ConstStatement.spec.js +7 -7
  105. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -1
  106. package/dist/parser/tests/statement/Continue.spec.d.ts +1 -0
  107. package/dist/parser/tests/statement/Continue.spec.js +92 -0
  108. package/dist/parser/tests/statement/Continue.spec.js.map +1 -0
  109. package/dist/parser/tests/statement/Enum.spec.js +36 -9
  110. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  111. package/dist/parser/tests/statement/For.spec.js +3 -4
  112. package/dist/parser/tests/statement/For.spec.js.map +1 -1
  113. package/dist/parser/tests/statement/ForEach.spec.js +4 -5
  114. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -1
  115. package/dist/parser/tests/statement/InterfaceStatement.spec.js +4 -5
  116. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  117. package/dist/parser/tests/statement/PrintStatement.spec.js +3 -4
  118. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  119. package/dist/util.d.ts +11 -5
  120. package/dist/util.js +57 -6
  121. package/dist/util.js.map +1 -1
  122. package/dist/validators/ClassValidator.js +22 -19
  123. package/dist/validators/ClassValidator.js.map +1 -1
  124. package/package.json +2 -2
@@ -24,18 +24,17 @@ const creators_1 = require("../astUtils/creators");
24
24
  const fsExtra = require("fs-extra");
25
25
  const vscode_uri_1 = require("vscode-uri");
26
26
  const undent_1 = require("undent");
27
+ const testHelpers_spec_2 = require("../testHelpers.spec");
27
28
  let sinon = sinonImport.createSandbox();
28
29
  describe('BrsFile', () => {
29
- let tempDir = (0, util_1.standardizePath) `${process.cwd()}/.tmp`;
30
- let rootDir = (0, util_1.standardizePath) `${tempDir}/rootDir`;
31
30
  let program;
32
- let srcPath = (0, util_1.standardizePath) `${rootDir}/source/main.brs`;
31
+ let srcPath = (0, util_1.standardizePath) `${testHelpers_spec_2.rootDir}/source/main.brs`;
33
32
  let destPath = 'source/main.brs';
34
33
  let file;
35
- let testTranspile = (0, testHelpers_spec_1.getTestTranspile)(() => [program, rootDir]);
34
+ let testTranspile = (0, testHelpers_spec_1.getTestTranspile)(() => [program, testHelpers_spec_2.rootDir]);
36
35
  beforeEach(() => {
37
- fsExtra.emptyDirSync(tempDir);
38
- program = new Program_1.Program({ rootDir: rootDir, sourceMap: true });
36
+ fsExtra.emptyDirSync(testHelpers_spec_2.tempDir);
37
+ program = new Program_1.Program({ rootDir: testHelpers_spec_2.rootDir, sourceMap: true });
39
38
  file = new BrsFile_1.BrsFile(srcPath, destPath, program);
40
39
  });
41
40
  afterEach(() => {
@@ -81,9 +80,9 @@ describe('BrsFile', () => {
81
80
  });
82
81
  it('sets needsTranspiled to true for .bs files', () => {
83
82
  //BrightScript
84
- (0, chai_1.expect)(new BrsFile_1.BrsFile(`${rootDir}/source/main.brs`, 'source/main.brs', program).needsTranspiled).to.be.false;
83
+ (0, chai_1.expect)(new BrsFile_1.BrsFile(`${testHelpers_spec_2.rootDir}/source/main.brs`, 'source/main.brs', program).needsTranspiled).to.be.false;
85
84
  //BrighterScript
86
- (0, chai_1.expect)(new BrsFile_1.BrsFile(`${rootDir}/source/main.bs`, 'source/main.bs', program).needsTranspiled).to.be.true;
85
+ (0, chai_1.expect)(new BrsFile_1.BrsFile(`${testHelpers_spec_2.rootDir}/source/main.bs`, 'source/main.bs', program).needsTranspiled).to.be.true;
87
86
  });
88
87
  it('computes new import statements after clearing parser references', () => {
89
88
  const file = program.setFile('source/main.bs', ``);
@@ -104,7 +103,7 @@ describe('BrsFile', () => {
104
103
  });
105
104
  describe('getPartialVariableName', () => {
106
105
  let entry = {
107
- src: `${rootDir}/source/lib.brs`,
106
+ src: `${testHelpers_spec_2.rootDir}/source/lib.brs`,
108
107
  dest: `source/lib.brs`
109
108
  };
110
109
  it('creates proper tokens', () => {
@@ -141,7 +140,7 @@ describe('BrsFile', () => {
141
140
  print "pkg:"
142
141
  end sub
143
142
  `);
144
- const result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
143
+ const result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
145
144
  const names = result.map(x => x.label);
146
145
  (0, chai_1.expect)(names.sort()).to.eql([
147
146
  'pkg:/source/main.brs'
@@ -153,7 +152,7 @@ describe('BrsFile', () => {
153
152
  print "libpkg:"
154
153
  end sub
155
154
  `);
156
- const result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
155
+ const result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
157
156
  const names = result.map(x => x.label);
158
157
  (0, chai_1.expect)(names.sort()).to.eql([
159
158
  'libpkg:/source/main.brs'
@@ -165,7 +164,7 @@ describe('BrsFile', () => {
165
164
  print \`pkg:\`
166
165
  end sub
167
166
  `);
168
- const result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
167
+ const result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 31));
169
168
  const names = result.map(x => x.label);
170
169
  (0, chai_1.expect)(names.sort()).to.eql([
171
170
  'pkg:/source/main.brs'
@@ -182,7 +181,7 @@ describe('BrsFile', () => {
182
181
  sub SayHello()
183
182
  end sub
184
183
  `);
185
- let result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 23));
184
+ let result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 23));
186
185
  let names = result.map(x => x.label);
187
186
  (0, chai_1.expect)(names).to.includes('Main');
188
187
  (0, chai_1.expect)(names).to.includes('SayHello');
@@ -231,7 +230,7 @@ describe('BrsFile', () => {
231
230
  class Person
232
231
  end class
233
232
  `);
234
- const result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 24)).map(x => x.label);
233
+ const result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(2, 24)).map(x => x.label);
235
234
  (0, chai_1.expect)(result).includes('main');
236
235
  (0, chai_1.expect)(result).includes('foo');
237
236
  (0, chai_1.expect)(result).includes('Person');
@@ -249,22 +248,22 @@ describe('BrsFile', () => {
249
248
  foo.bar.
250
249
  end sub
251
250
  `);
252
- let result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 30));
251
+ let result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(8, 30));
253
252
  let names = result.map(x => x.label);
254
253
  (0, chai_1.expect)(names).to.includes('bar');
255
- result = program.getCompletions(`${rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(9, 32));
254
+ result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.bs`, vscode_languageserver_1.Position.create(9, 32));
256
255
  names = result.map(x => x.label);
257
256
  (0, chai_1.expect)(names).to.includes('sayHello');
258
257
  });
259
258
  });
260
259
  it('always includes `m`', () => {
261
260
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
262
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
261
+ program.setFile('source/main.brs', `
263
262
  sub Main()
264
263
 
265
264
  end sub
266
265
  `);
267
- let result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
266
+ let result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
268
267
  let names = result.map(x => x.label);
269
268
  (0, chai_1.expect)(names).to.contain('m');
270
269
  });
@@ -272,25 +271,25 @@ describe('BrsFile', () => {
272
271
  //add a single character to the file, and get completions after it
273
272
  program.setFile('source/main.brs', `i`);
274
273
  (0, chai_1.expect)(() => {
275
- program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(0, 1)).map(x => x.label);
274
+ program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(0, 1)).map(x => x.label);
276
275
  }).not.to.throw;
277
276
  });
278
277
  it('includes all keywords`', () => {
279
278
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
280
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
279
+ program.setFile('source/main.brs', `
281
280
  sub Main()
282
281
 
283
282
  end sub
284
283
  `);
285
284
  let keywords = Object.keys(TokenKind_1.Keywords).filter(x => !x.includes(' '));
286
285
  //inside the function
287
- let result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
286
+ let result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
288
287
  let names = result.map(x => x.label);
289
288
  for (let keyword of keywords) {
290
289
  (0, chai_1.expect)(names).to.include(keyword);
291
290
  }
292
291
  //outside the function
293
- result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(4, 8));
292
+ result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(4, 8));
294
293
  names = result.map(x => x.label);
295
294
  for (let keyword of keywords) {
296
295
  (0, chai_1.expect)(names).to.include(keyword);
@@ -298,25 +297,25 @@ describe('BrsFile', () => {
298
297
  });
299
298
  it('does not provide completions within a comment', () => {
300
299
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
301
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
300
+ program.setFile('source/main.brs', `
302
301
  sub Main()
303
302
  'some comment
304
303
  end sub
305
304
  `);
306
305
  //inside the function
307
- let result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 33));
306
+ let result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 33));
308
307
  (0, chai_1.expect)(result).to.be.lengthOf(0);
309
308
  });
310
309
  it('does not provide duplicate entries for variables', () => {
311
310
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
312
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
311
+ program.setFile('source/main.brs', `
313
312
  sub Main()
314
313
  name = "bob"
315
314
  age = 12
316
315
  name = "john"
317
316
  end sub
318
317
  `);
319
- let result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 23));
318
+ let result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 23));
320
319
  let count = result.reduce((total, x) => {
321
320
  return x.label === 'name' ? total + 1 : total;
322
321
  }, 0);
@@ -324,34 +323,34 @@ describe('BrsFile', () => {
324
323
  });
325
324
  it('does not include `as` and `string` text options when used in function params', () => {
326
325
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
327
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
326
+ program.setFile('source/main.brs', `
328
327
  sub Main(name as string)
329
328
 
330
329
  end sub
331
330
  `);
332
- let result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
331
+ let result = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
333
332
  (0, chai_1.expect)(result.filter(x => x.kind === vscode_languageserver_1.CompletionItemKind.Text)).not.to.contain('as');
334
333
  (0, chai_1.expect)(result.filter(x => x.kind === vscode_languageserver_1.CompletionItemKind.Text)).not.to.contain('string');
335
334
  });
336
335
  it('does not provide intellisense results when inside a comment', () => {
337
336
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
338
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
337
+ program.setFile('source/main.brs', `
339
338
  sub Main(name as string)
340
339
  'this is a comment
341
340
  end sub
342
341
  `);
343
- let results = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 30));
342
+ let results = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 30));
344
343
  (0, chai_1.expect)(results).to.be.empty;
345
344
  });
346
345
  it('does provide intellisence for labels only after a goto keyword', () => {
347
346
  var _a;
348
347
  //eslint-disable-next-line @typescript-eslint/no-floating-promises
349
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
348
+ program.setFile('source/main.brs', `
350
349
  sub Main(name as string)
351
350
  something:
352
351
  goto \nend sub
353
352
  `);
354
- let results = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 25));
353
+ let results = program.getCompletions(`${testHelpers_spec_2.rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(3, 25));
355
354
  (0, chai_1.expect)(results.length).to.equal(1);
356
355
  (0, chai_1.expect)((_a = results[0]) === null || _a === void 0 ? void 0 : _a.label).to.equal('something');
357
356
  });
@@ -389,7 +388,7 @@ describe('BrsFile', () => {
389
388
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
390
389
  });
391
390
  it('works for all', () => {
392
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
391
+ let file = program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
393
392
  sub Main()
394
393
  'bs:disable-next-line
395
394
  name = "bob
@@ -406,7 +405,7 @@ describe('BrsFile', () => {
406
405
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
407
406
  });
408
407
  it('works for specific codes', () => {
409
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
408
+ let file = program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
410
409
  sub Main()
411
410
  'bs:disable-next-line: 1083, 1001
412
411
  name = "bob
@@ -422,7 +421,7 @@ describe('BrsFile', () => {
422
421
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
423
422
  });
424
423
  it('recognizes non-numeric codes', () => {
425
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
424
+ let file = program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
426
425
  sub Main()
427
426
  'bs:disable-next-line: LINT9999
428
427
  name = "bob
@@ -448,7 +447,7 @@ describe('BrsFile', () => {
448
447
  (0, testHelpers_spec_1.expectZeroDiagnostics)(scope);
449
448
  });
450
449
  it('adds diagnostics for unknown numeric diagnostic codes', () => {
451
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
450
+ program.setFile('source/main.brs', `
452
451
  sub main()
453
452
  print "hi" 'bs:disable-line: 123456 999999 aaaab
454
453
  end sub
@@ -459,7 +458,7 @@ describe('BrsFile', () => {
459
458
  });
460
459
  describe('bs:disable-line', () => {
461
460
  it('works for all', () => {
462
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
461
+ let file = program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
463
462
  sub Main()
464
463
  z::;;%%%%%% 'bs:disable-line
465
464
  end sub
@@ -475,7 +474,7 @@ describe('BrsFile', () => {
475
474
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
476
475
  });
477
476
  it('works for specific codes', () => {
478
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
477
+ program.setFile('source/main.brs', `
479
478
  sub main()
480
479
  'should not have any errors
481
480
  DoSomething(1) 'bs:disable-line:1002
@@ -494,7 +493,7 @@ describe('BrsFile', () => {
494
493
  //the current version of BRS causes parse errors after the `parse` keyword, showing error in comments
495
494
  //the program should ignore all diagnostics found in brs:* comment lines EXCEPT
496
495
  //for the diagnostics about using unknown error codes
497
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
496
+ program.setFile('source/main.brs', `
498
497
  sub main()
499
498
  stop 'bs:disable-line
500
499
  print "need a valid line to fix stop error"
@@ -567,7 +566,7 @@ describe('BrsFile', () => {
567
566
  testParseMode('source/main.spec.bs', Parser_1.ParseMode.BrighterScript);
568
567
  });
569
568
  it('supports labels and goto statements', () => {
570
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
569
+ let file = program.setFile('source/main.brs', `
571
570
  sub Main()
572
571
  'multiple goto statements on one line
573
572
  goto myLabel : goto myLabel
@@ -577,7 +576,7 @@ describe('BrsFile', () => {
577
576
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
578
577
  });
579
578
  it('supports empty print statements', () => {
580
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
579
+ let file = program.setFile('source/main.brs', `
581
580
  sub main()
582
581
  print
583
582
  end sub
@@ -586,7 +585,7 @@ describe('BrsFile', () => {
586
585
  });
587
586
  describe('conditional compile', () => {
588
587
  it('supports case-insensitive bs_const variables', () => {
589
- fsExtra.outputFileSync(`${rootDir}/manifest`, (0, undent_1.default) `
588
+ fsExtra.outputFileSync(`${testHelpers_spec_2.rootDir}/manifest`, (0, undent_1.default) `
590
589
  bs_const=SomeKey=true
591
590
  `);
592
591
  program.setFile('source/main.brs', `
@@ -606,7 +605,7 @@ describe('BrsFile', () => {
606
605
  (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
607
606
  });
608
607
  it('works for upper case keywords', () => {
609
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
608
+ let file = program.setFile('source/main.brs', `
610
609
  sub main()
611
610
  #CONST someFlag = true
612
611
  #IF someFlag
@@ -621,7 +620,7 @@ describe('BrsFile', () => {
621
620
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
622
621
  });
623
622
  it('supports single-word #elseif and #endif', () => {
624
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
623
+ let file = program.setFile('source/main.brs', `
625
624
  sub main()
626
625
  #const someFlag = true
627
626
  #if someFlag
@@ -634,7 +633,7 @@ describe('BrsFile', () => {
634
633
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
635
634
  });
636
635
  it('supports multi-word #else if and #end if', () => {
637
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
636
+ let file = program.setFile('source/main.brs', `
638
637
  sub main()
639
638
  #const someFlag = true
640
639
  #if someFlag
@@ -647,7 +646,7 @@ describe('BrsFile', () => {
647
646
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
648
647
  });
649
648
  it('does not choke on invalid code inside a false conditional compile', () => {
650
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
649
+ let file = program.setFile('source/main.brs', `
651
650
  sub main()
652
651
  #if false
653
652
  non-commented code here should not cause parse errors
@@ -657,7 +656,7 @@ describe('BrsFile', () => {
657
656
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
658
657
  });
659
658
  it('detects syntax error in #if', () => {
660
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
659
+ let file = program.setFile('source/main.brs', `
661
660
  sub main()
662
661
  #if true1
663
662
  print "true"
@@ -669,7 +668,7 @@ describe('BrsFile', () => {
669
668
  ]);
670
669
  });
671
670
  it('detects syntax error in #const', () => {
672
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
671
+ let file = program.setFile('source/main.brs', `
673
672
  sub main()
674
673
  #if %
675
674
  print "true"
@@ -682,7 +681,7 @@ describe('BrsFile', () => {
682
681
  ]);
683
682
  });
684
683
  it('detects #const name using reserved word', () => {
685
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
684
+ let file = program.setFile('source/main.brs', `
686
685
  sub main()
687
686
  #const function = true
688
687
  end sub
@@ -693,7 +692,7 @@ describe('BrsFile', () => {
693
692
  ]);
694
693
  });
695
694
  it('detects syntax error in #const', () => {
696
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
695
+ let file = program.setFile('source/main.brs', `
697
696
  sub main()
698
697
  #const someConst = 123
699
698
  end sub
@@ -704,7 +703,7 @@ describe('BrsFile', () => {
704
703
  });
705
704
  });
706
705
  it('supports stop statement', () => {
707
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
706
+ let file = program.setFile('source/main.brs', `
708
707
  sub main()
709
708
  stop
710
709
  end sub
@@ -712,7 +711,7 @@ describe('BrsFile', () => {
712
711
  (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
713
712
  });
714
713
  it('supports single-line if statements', () => {
715
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
714
+ let file = program.setFile('source/main.brs', `
716
715
  sub main()
717
716
  if 1 < 2: return true: end if
718
717
  if 1 < 2: return true
@@ -1186,6 +1185,29 @@ describe('BrsFile', () => {
1186
1185
  (0, chai_1.expect)(file.functionCalls[1].range).to.eql(vscode_languageserver_1.Range.create(5, 20, 5, 25));
1187
1186
  (0, chai_1.expect)(file.functionCalls[1].nameRange).to.eql(vscode_languageserver_1.Range.create(5, 20, 5, 23));
1188
1187
  });
1188
+ it('finds function calls that are unfinished', () => {
1189
+ let file = new BrsFile_1.BrsFile('absolute_path/file.brs', 'relative_path/file.brs', program);
1190
+ file.parse(`
1191
+ function DoA()
1192
+ DoB("a"
1193
+ end function
1194
+ function DoB(a as string)
1195
+ DoC(
1196
+ end function
1197
+ `);
1198
+ (0, testHelpers_spec_1.expectDiagnostics)(file.parser.diagnostics, [
1199
+ DiagnosticMessages_1.DiagnosticMessages.expectedRightParenAfterFunctionCallArguments(),
1200
+ DiagnosticMessages_1.DiagnosticMessages.expectedNewlineOrColon(),
1201
+ DiagnosticMessages_1.DiagnosticMessages.unexpectedToken('end function'),
1202
+ DiagnosticMessages_1.DiagnosticMessages.expectedRightParenAfterFunctionCallArguments(),
1203
+ DiagnosticMessages_1.DiagnosticMessages.expectedNewlineOrColon()
1204
+ ]);
1205
+ (0, chai_1.expect)(file.functionCalls.length).to.equal(2);
1206
+ (0, chai_1.expect)(file.functionCalls[0].range).to.eql(vscode_languageserver_1.Range.create(2, 20, 2, 27));
1207
+ (0, chai_1.expect)(file.functionCalls[0].nameRange).to.eql(vscode_languageserver_1.Range.create(2, 20, 2, 23));
1208
+ (0, chai_1.expect)(file.functionCalls[1].range).to.eql(vscode_languageserver_1.Range.create(5, 20, 5, 24));
1209
+ (0, chai_1.expect)(file.functionCalls[1].nameRange).to.eql(vscode_languageserver_1.Range.create(5, 20, 5, 23));
1210
+ });
1189
1211
  it('sanitizes brs errors', () => {
1190
1212
  let file = new BrsFile_1.BrsFile('absolute_path/file.brs', 'relative_path/file.brs', program);
1191
1213
  file.parse(`
@@ -1526,7 +1548,7 @@ describe('BrsFile', () => {
1526
1548
  });
1527
1549
  });
1528
1550
  it('handles mixed case `then` partions of conditionals', () => {
1529
- let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1551
+ let mainFile = program.setFile('source/main.brs', `
1530
1552
  sub Main()
1531
1553
  if true then
1532
1554
  print "works"
@@ -1534,7 +1556,7 @@ describe('BrsFile', () => {
1534
1556
  end sub
1535
1557
  `);
1536
1558
  (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1537
- mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1559
+ mainFile = program.setFile('source/main.brs', `
1538
1560
  sub Main()
1539
1561
  if true Then
1540
1562
  print "works"
@@ -1542,7 +1564,7 @@ describe('BrsFile', () => {
1542
1564
  end sub
1543
1565
  `);
1544
1566
  (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1545
- mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1567
+ mainFile = program.setFile('source/main.brs', `
1546
1568
  sub Main()
1547
1569
  if true THEN
1548
1570
  print "works"
@@ -1553,7 +1575,7 @@ describe('BrsFile', () => {
1553
1575
  });
1554
1576
  describe('getHover', () => {
1555
1577
  it('works for param types', () => {
1556
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1578
+ let file = program.setFile('source/main.brs', `
1557
1579
  sub DoSomething(name as string)
1558
1580
  name = 1
1559
1581
  sayMyName = function(name as string)
@@ -1571,7 +1593,7 @@ describe('BrsFile', () => {
1571
1593
  });
1572
1594
  //ignore this for now...it's not a huge deal
1573
1595
  it('does not match on keywords or data types', () => {
1574
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1596
+ let file = program.setFile('source/main.brs', `
1575
1597
  sub Main(name as string)
1576
1598
  end sub
1577
1599
  sub as()
@@ -1583,7 +1605,7 @@ describe('BrsFile', () => {
1583
1605
  (0, chai_1.expect)(program.getHover(file.srcPath, vscode_languageserver_1.Position.create(1, 36))).to.be.empty;
1584
1606
  });
1585
1607
  it('finds declared function', () => {
1586
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1608
+ let file = program.setFile('source/main.brs', `
1587
1609
  function Main(count = 1)
1588
1610
  firstName = "bob"
1589
1611
  age = 21
@@ -1600,7 +1622,7 @@ describe('BrsFile', () => {
1600
1622
  ].join('\n'));
1601
1623
  });
1602
1624
  it('finds declared namespace function', () => {
1603
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1625
+ let file = program.setFile('source/main.brs', `
1604
1626
  namespace mySpace
1605
1627
  function Main(count = 1)
1606
1628
  firstName = "bob"
@@ -1619,7 +1641,7 @@ describe('BrsFile', () => {
1619
1641
  ].join('\n'));
1620
1642
  });
1621
1643
  it('finds variable function hover in same scope', () => {
1622
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1644
+ let file = program.setFile('source/main.brs', `
1623
1645
  sub Main()
1624
1646
  sayMyName = sub(name as string)
1625
1647
  end sub
@@ -1661,7 +1683,7 @@ describe('BrsFile', () => {
1661
1683
  ].join('\n'));
1662
1684
  });
1663
1685
  it('finds function hover in file scope', () => {
1664
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1686
+ let file = program.setFile('source/main.brs', `
1665
1687
  sub Main()
1666
1688
  sayMyName()
1667
1689
  end sub
@@ -1679,7 +1701,7 @@ describe('BrsFile', () => {
1679
1701
  ].join('\n'));
1680
1702
  });
1681
1703
  it('finds namespace function hover in file scope', () => {
1682
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1704
+ let file = program.setFile('source/main.brs', `
1683
1705
  namespace mySpace
1684
1706
  sub Main()
1685
1707
  sayMyName()
@@ -1703,12 +1725,12 @@ describe('BrsFile', () => {
1703
1725
  program = new Program_1.Program({
1704
1726
  rootDir: rootDir
1705
1727
  });
1706
- let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1728
+ let mainFile = program.setFile('source/main.brs', `
1707
1729
  sub Main()
1708
1730
  sayMyName()
1709
1731
  end sub
1710
1732
  `);
1711
- program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
1733
+ program.setFile('source/lib.brs', `
1712
1734
  sub sayMyName(name as string)
1713
1735
 
1714
1736
  end sub
@@ -1727,12 +1749,12 @@ describe('BrsFile', () => {
1727
1749
  program = new Program_1.Program({
1728
1750
  rootDir: rootDir
1729
1751
  });
1730
- let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1752
+ let mainFile = program.setFile('source/main.brs', `
1731
1753
  sub Main()
1732
1754
  mySpace.sayMyName()
1733
1755
  end sub
1734
1756
  `);
1735
- program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
1757
+ program.setFile('source/lib.brs', `
1736
1758
  namespace mySpace
1737
1759
  sub sayMyName(name as string)
1738
1760
  end sub
@@ -1790,7 +1812,7 @@ describe('BrsFile', () => {
1790
1812
  `);
1791
1813
  });
1792
1814
  it('handles mixed case `then` partions of conditionals', () => {
1793
- let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1815
+ let mainFile = program.setFile('source/main.brs', `
1794
1816
  sub Main()
1795
1817
  if true then
1796
1818
  print "works"
@@ -1798,7 +1820,7 @@ describe('BrsFile', () => {
1798
1820
  end sub
1799
1821
  `);
1800
1822
  (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1801
- mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1823
+ mainFile = program.setFile('source/main.brs', `
1802
1824
  sub Main()
1803
1825
  if true Then
1804
1826
  print "works"
@@ -1806,7 +1828,7 @@ describe('BrsFile', () => {
1806
1828
  end sub
1807
1829
  `);
1808
1830
  (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1809
- mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1831
+ mainFile = program.setFile('source/main.brs', `
1810
1832
  sub Main()
1811
1833
  if true THEN
1812
1834
  print "works"
@@ -1817,7 +1839,7 @@ describe('BrsFile', () => {
1817
1839
  });
1818
1840
  });
1819
1841
  it('does not throw when encountering incomplete import statement', () => {
1820
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1842
+ program.setFile('source/main.brs', `
1821
1843
  import
1822
1844
  sub main()
1823
1845
  end sub
@@ -2241,7 +2263,7 @@ describe('BrsFile', () => {
2241
2263
  return consumer.generatedPositionFor({
2242
2264
  line: 3,
2243
2265
  column: 0,
2244
- source: (0, util_1.standardizePath) `${rootDir}/source/main.bs`,
2266
+ source: (0, util_1.standardizePath) `${testHelpers_spec_2.rootDir}/source/main.bs`,
2245
2267
  bias: source_map_1.SourceMapConsumer.LEAST_UPPER_BOUND
2246
2268
  });
2247
2269
  });
@@ -2528,12 +2550,14 @@ describe('BrsFile', () => {
2528
2550
  it('sets invalid on empty callfunc', () => {
2529
2551
  testTranspile(`
2530
2552
  sub main()
2553
+ node = invalid
2531
2554
  node@.doSomething()
2532
2555
  m.top.node@.doSomething()
2533
2556
  m.top.node@.doSomething(1)
2534
2557
  end sub
2535
2558
  `, `
2536
2559
  sub main()
2560
+ node = invalid
2537
2561
  node.callfunc("doSomething", invalid)
2538
2562
  m.top.node.callfunc("doSomething", invalid)
2539
2563
  m.top.node.callfunc("doSomething", 1)
@@ -2543,10 +2567,12 @@ describe('BrsFile', () => {
2543
2567
  it('includes original arguments', () => {
2544
2568
  testTranspile(`
2545
2569
  sub main()
2570
+ node = invalid
2546
2571
  node@.doSomething(1, true, m.top.someVal)
2547
2572
  end sub
2548
2573
  `, `
2549
2574
  sub main()
2575
+ node = invalid
2550
2576
  node.callfunc("doSomething", 1, true, m.top.someVal)
2551
2577
  end sub
2552
2578
  `);
@@ -2563,7 +2589,7 @@ describe('BrsFile', () => {
2563
2589
  name: 'transform callback',
2564
2590
  afterFileParse: onParsed
2565
2591
  });
2566
- file = program.setFile({ src: `absolute_path/file${ext}`, dest: `relative_path/file${ext}` }, `
2592
+ file = program.setFile(`source/file${ext}`, `
2567
2593
  sub Sum()
2568
2594
  print "hello world"
2569
2595
  end sub
@@ -2584,7 +2610,7 @@ describe('BrsFile', () => {
2584
2610
  });
2585
2611
  describe('typedefKey', () => {
2586
2612
  it('works for .brs files', () => {
2587
- (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`);
2613
+ (0, chai_1.expect)((0, util_1.standardizePath)((program.setFile('source/main.brs', '')).typedefKey)).to.equal((0, util_1.standardizePath) `${testHelpers_spec_2.rootDir.toLowerCase()}/source/main.d.bs`);
2588
2614
  });
2589
2615
  it('returns undefined for files that should not have a typedef', () => {
2590
2616
  (0, chai_1.expect)((program.setFile('source/main.bs', '')).typedefKey).to.be.undefined;
@@ -2635,14 +2661,14 @@ describe('BrsFile', () => {
2635
2661
  `);
2636
2662
  (0, chai_1.expect)(file.hasTypedef).to.be.true;
2637
2663
  (0, chai_1.expect)(file.typedefFile).to.exist;
2638
- program.removeFile((0, util_1.standardizePath) `${rootDir}/source/main.d.bs`);
2664
+ program.removeFile((0, util_1.standardizePath) `${testHelpers_spec_2.rootDir}/source/main.d.bs`);
2639
2665
  (0, chai_1.expect)(file.hasTypedef).to.be.false;
2640
2666
  (0, chai_1.expect)(file.typedefFile).not.to.exist;
2641
2667
  });
2642
2668
  });
2643
2669
  describe('typedef', () => {
2644
2670
  it('sets typedef path properly', () => {
2645
- (0, chai_1.expect)((program.setFile('source/main1.brs', '')).typedefKey).to.equal((0, util_1.standardizePath) `${rootDir}/source/main1.d.bs`.toLowerCase());
2671
+ (0, chai_1.expect)((program.setFile('source/main1.brs', '')).typedefKey).to.equal((0, util_1.standardizePath) `${testHelpers_spec_2.rootDir}/source/main1.d.bs`.toLowerCase());
2646
2672
  (0, chai_1.expect)((program.setFile('source/main2.d.bs', '')).typedefKey).to.equal(undefined);
2647
2673
  (0, chai_1.expect)((program.setFile('source/main3.bs', '')).typedefKey).to.equal(undefined);
2648
2674
  //works for dest with `.brs` extension
@@ -2672,6 +2698,7 @@ describe('BrsFile', () => {
2672
2698
  describe('getTypedef', () => {
2673
2699
  function testTypedef(original, expected) {
2674
2700
  let file = program.setFile('source/main.brs', original);
2701
+ program.validate();
2675
2702
  (0, chai_1.expect)(file.getTypedef().trimEnd()).to.eql(expected);
2676
2703
  }
2677
2704
  it('includes namespace on extend class names', () => {
@@ -2988,7 +3015,7 @@ describe('BrsFile', () => {
2988
3015
  let idx = 1;
2989
3016
  beforeEach(() => {
2990
3017
  pluginFileName = `plugin-${idx++}.js`;
2991
- fsExtra.outputFileSync((0, util_1.standardizePath) `${tempDir}/plugins/${pluginFileName}`, `
3018
+ fsExtra.outputFileSync((0, util_1.standardizePath) `${testHelpers_spec_2.tempDir}/plugins/${pluginFileName}`, `
2992
3019
  function plugin() {
2993
3020
  return {
2994
3021
  name: 'lower-file-name',
@@ -3001,14 +3028,14 @@ describe('BrsFile', () => {
3001
3028
  `);
3002
3029
  });
3003
3030
  it('can load an absolute plugin which receives callbacks', () => {
3004
- program.plugins = new PluginInterface_1.default(util_1.default.loadPlugins(tempDir, [
3005
- (0, util_1.standardizePath) `${tempDir}/plugins/${pluginFileName}`
3031
+ program.plugins = new PluginInterface_1.default(util_1.default.loadPlugins(testHelpers_spec_2.tempDir, [
3032
+ (0, util_1.standardizePath) `${testHelpers_spec_2.tempDir}/plugins/${pluginFileName}`
3006
3033
  ]), new Logger_1.Logger());
3007
3034
  const file = program.setFile('source/MAIN.brs', '');
3008
3035
  (0, chai_1.expect)(file._customProp).to.exist;
3009
3036
  });
3010
3037
  it('can load a relative plugin which receives callbacks', () => {
3011
- program.plugins = new PluginInterface_1.default(util_1.default.loadPlugins(tempDir, [
3038
+ program.plugins = new PluginInterface_1.default(util_1.default.loadPlugins(testHelpers_spec_2.tempDir, [
3012
3039
  `./plugins/${pluginFileName}`
3013
3040
  ]), new Logger_1.Logger());
3014
3041
  const file = program.setFile('source/MAIN.brs', '');
@@ -3025,6 +3052,7 @@ describe('BrsFile', () => {
3025
3052
  const CHARLIE = true
3026
3053
  end namespace
3027
3054
  `);
3055
+ program.validate();
3028
3056
  //print alpha.beta.char|lie
3029
3057
  (0, chai_1.expect)(program.getDefinition(file.srcPath, vscode_languageserver_1.Position.create(2, 41))).to.eql([{
3030
3058
  uri: vscode_uri_1.URI.file(file.srcPath).toString(),