brighterscript 0.58.0 → 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 (78) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +15 -7
  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 +5 -1
  9. package/dist/Program.js +39 -25
  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 +4 -2
  14. package/dist/Scope.js +16 -9
  15. package/dist/Scope.js.map +1 -1
  16. package/dist/astUtils/reflection.d.ts +3 -1
  17. package/dist/astUtils/reflection.js +10 -2
  18. package/dist/astUtils/reflection.js.map +1 -1
  19. package/dist/astUtils/reflection.spec.js +5 -0
  20. package/dist/astUtils/reflection.spec.js.map +1 -1
  21. package/dist/astUtils/visitors.d.ts +2 -1
  22. package/dist/astUtils/visitors.js.map +1 -1
  23. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +6 -6
  24. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  25. package/dist/bscPlugin/hover/HoverProcessor.spec.js +34 -34
  26. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  27. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +2 -2
  28. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  29. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +4 -5
  30. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -1
  31. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +1 -0
  32. package/dist/bscPlugin/validation/BrsFileValidator.js +48 -6
  33. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  34. package/dist/files/BrsFile.Class.spec.js +33 -35
  35. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  36. package/dist/files/BrsFile.spec.js +78 -79
  37. package/dist/files/BrsFile.spec.js.map +1 -1
  38. package/dist/files/XmlFile.spec.js +57 -90
  39. package/dist/files/XmlFile.spec.js.map +1 -1
  40. package/dist/files/tests/imports.spec.js +13 -15
  41. package/dist/files/tests/imports.spec.js.map +1 -1
  42. package/dist/files/tests/optionalChaning.spec.js +8 -11
  43. package/dist/files/tests/optionalChaning.spec.js.map +1 -1
  44. package/dist/lexer/Lexer.spec.js +6 -0
  45. package/dist/lexer/Lexer.spec.js.map +1 -1
  46. package/dist/lexer/TokenKind.d.ts +1 -0
  47. package/dist/lexer/TokenKind.js +6 -2
  48. package/dist/lexer/TokenKind.js.map +1 -1
  49. package/dist/parser/AstNode.spec.js +5 -7
  50. package/dist/parser/AstNode.spec.js.map +1 -1
  51. package/dist/parser/Parser.d.ts +4 -0
  52. package/dist/parser/Parser.js +12 -0
  53. package/dist/parser/Parser.js.map +1 -1
  54. package/dist/parser/SGParser.spec.js +2 -3
  55. package/dist/parser/SGParser.spec.js.map +1 -1
  56. package/dist/parser/Statement.d.ts +13 -0
  57. package/dist/parser/Statement.js +28 -3
  58. package/dist/parser/Statement.js.map +1 -1
  59. package/dist/parser/Statement.spec.js +2 -3
  60. package/dist/parser/Statement.spec.js.map +1 -1
  61. package/dist/parser/tests/statement/ConstStatement.spec.js +7 -7
  62. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -1
  63. package/dist/parser/tests/statement/Continue.spec.d.ts +1 -0
  64. package/dist/parser/tests/statement/Continue.spec.js +92 -0
  65. package/dist/parser/tests/statement/Continue.spec.js.map +1 -0
  66. package/dist/parser/tests/statement/Enum.spec.js +29 -5
  67. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  68. package/dist/parser/tests/statement/For.spec.js +3 -4
  69. package/dist/parser/tests/statement/For.spec.js.map +1 -1
  70. package/dist/parser/tests/statement/ForEach.spec.js +4 -5
  71. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -1
  72. package/dist/parser/tests/statement/InterfaceStatement.spec.js +4 -5
  73. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  74. package/dist/parser/tests/statement/PrintStatement.spec.js +3 -4
  75. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  76. package/dist/util.js +7 -6
  77. package/dist/util.js.map +1 -1
  78. package/package.json +1 -1
@@ -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
@@ -1549,7 +1548,7 @@ describe('BrsFile', () => {
1549
1548
  });
1550
1549
  });
1551
1550
  it('handles mixed case `then` partions of conditionals', () => {
1552
- let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1551
+ let mainFile = program.setFile('source/main.brs', `
1553
1552
  sub Main()
1554
1553
  if true then
1555
1554
  print "works"
@@ -1557,7 +1556,7 @@ describe('BrsFile', () => {
1557
1556
  end sub
1558
1557
  `);
1559
1558
  (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1560
- mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1559
+ mainFile = program.setFile('source/main.brs', `
1561
1560
  sub Main()
1562
1561
  if true Then
1563
1562
  print "works"
@@ -1565,7 +1564,7 @@ describe('BrsFile', () => {
1565
1564
  end sub
1566
1565
  `);
1567
1566
  (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1568
- mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1567
+ mainFile = program.setFile('source/main.brs', `
1569
1568
  sub Main()
1570
1569
  if true THEN
1571
1570
  print "works"
@@ -1576,7 +1575,7 @@ describe('BrsFile', () => {
1576
1575
  });
1577
1576
  describe('getHover', () => {
1578
1577
  it('works for param types', () => {
1579
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1578
+ let file = program.setFile('source/main.brs', `
1580
1579
  sub DoSomething(name as string)
1581
1580
  name = 1
1582
1581
  sayMyName = function(name as string)
@@ -1594,7 +1593,7 @@ describe('BrsFile', () => {
1594
1593
  });
1595
1594
  //ignore this for now...it's not a huge deal
1596
1595
  it('does not match on keywords or data types', () => {
1597
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1596
+ let file = program.setFile('source/main.brs', `
1598
1597
  sub Main(name as string)
1599
1598
  end sub
1600
1599
  sub as()
@@ -1606,7 +1605,7 @@ describe('BrsFile', () => {
1606
1605
  (0, chai_1.expect)(program.getHover(file.srcPath, vscode_languageserver_1.Position.create(1, 36))).to.be.empty;
1607
1606
  });
1608
1607
  it('finds declared function', () => {
1609
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1608
+ let file = program.setFile('source/main.brs', `
1610
1609
  function Main(count = 1)
1611
1610
  firstName = "bob"
1612
1611
  age = 21
@@ -1623,7 +1622,7 @@ describe('BrsFile', () => {
1623
1622
  ].join('\n'));
1624
1623
  });
1625
1624
  it('finds declared namespace function', () => {
1626
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1625
+ let file = program.setFile('source/main.brs', `
1627
1626
  namespace mySpace
1628
1627
  function Main(count = 1)
1629
1628
  firstName = "bob"
@@ -1642,7 +1641,7 @@ describe('BrsFile', () => {
1642
1641
  ].join('\n'));
1643
1642
  });
1644
1643
  it('finds variable function hover in same scope', () => {
1645
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1644
+ let file = program.setFile('source/main.brs', `
1646
1645
  sub Main()
1647
1646
  sayMyName = sub(name as string)
1648
1647
  end sub
@@ -1684,7 +1683,7 @@ describe('BrsFile', () => {
1684
1683
  ].join('\n'));
1685
1684
  });
1686
1685
  it('finds function hover in file scope', () => {
1687
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1686
+ let file = program.setFile('source/main.brs', `
1688
1687
  sub Main()
1689
1688
  sayMyName()
1690
1689
  end sub
@@ -1702,7 +1701,7 @@ describe('BrsFile', () => {
1702
1701
  ].join('\n'));
1703
1702
  });
1704
1703
  it('finds namespace function hover in file scope', () => {
1705
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1704
+ let file = program.setFile('source/main.brs', `
1706
1705
  namespace mySpace
1707
1706
  sub Main()
1708
1707
  sayMyName()
@@ -1726,12 +1725,12 @@ describe('BrsFile', () => {
1726
1725
  program = new Program_1.Program({
1727
1726
  rootDir: rootDir
1728
1727
  });
1729
- let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1728
+ let mainFile = program.setFile('source/main.brs', `
1730
1729
  sub Main()
1731
1730
  sayMyName()
1732
1731
  end sub
1733
1732
  `);
1734
- program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
1733
+ program.setFile('source/lib.brs', `
1735
1734
  sub sayMyName(name as string)
1736
1735
 
1737
1736
  end sub
@@ -1750,12 +1749,12 @@ describe('BrsFile', () => {
1750
1749
  program = new Program_1.Program({
1751
1750
  rootDir: rootDir
1752
1751
  });
1753
- let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1752
+ let mainFile = program.setFile('source/main.brs', `
1754
1753
  sub Main()
1755
1754
  mySpace.sayMyName()
1756
1755
  end sub
1757
1756
  `);
1758
- program.setFile({ src: `${rootDir}/source/lib.brs`, dest: 'source/lib.brs' }, `
1757
+ program.setFile('source/lib.brs', `
1759
1758
  namespace mySpace
1760
1759
  sub sayMyName(name as string)
1761
1760
  end sub
@@ -1813,7 +1812,7 @@ describe('BrsFile', () => {
1813
1812
  `);
1814
1813
  });
1815
1814
  it('handles mixed case `then` partions of conditionals', () => {
1816
- let mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1815
+ let mainFile = program.setFile('source/main.brs', `
1817
1816
  sub Main()
1818
1817
  if true then
1819
1818
  print "works"
@@ -1821,7 +1820,7 @@ describe('BrsFile', () => {
1821
1820
  end sub
1822
1821
  `);
1823
1822
  (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1824
- mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1823
+ mainFile = program.setFile('source/main.brs', `
1825
1824
  sub Main()
1826
1825
  if true Then
1827
1826
  print "works"
@@ -1829,7 +1828,7 @@ describe('BrsFile', () => {
1829
1828
  end sub
1830
1829
  `);
1831
1830
  (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1832
- mainFile = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1831
+ mainFile = program.setFile('source/main.brs', `
1833
1832
  sub Main()
1834
1833
  if true THEN
1835
1834
  print "works"
@@ -1840,7 +1839,7 @@ describe('BrsFile', () => {
1840
1839
  });
1841
1840
  });
1842
1841
  it('does not throw when encountering incomplete import statement', () => {
1843
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1842
+ program.setFile('source/main.brs', `
1844
1843
  import
1845
1844
  sub main()
1846
1845
  end sub
@@ -2264,7 +2263,7 @@ describe('BrsFile', () => {
2264
2263
  return consumer.generatedPositionFor({
2265
2264
  line: 3,
2266
2265
  column: 0,
2267
- source: (0, util_1.standardizePath) `${rootDir}/source/main.bs`,
2266
+ source: (0, util_1.standardizePath) `${testHelpers_spec_2.rootDir}/source/main.bs`,
2268
2267
  bias: source_map_1.SourceMapConsumer.LEAST_UPPER_BOUND
2269
2268
  });
2270
2269
  });
@@ -2590,7 +2589,7 @@ describe('BrsFile', () => {
2590
2589
  name: 'transform callback',
2591
2590
  afterFileParse: onParsed
2592
2591
  });
2593
- file = program.setFile({ src: `absolute_path/file${ext}`, dest: `relative_path/file${ext}` }, `
2592
+ file = program.setFile(`source/file${ext}`, `
2594
2593
  sub Sum()
2595
2594
  print "hello world"
2596
2595
  end sub
@@ -2611,7 +2610,7 @@ describe('BrsFile', () => {
2611
2610
  });
2612
2611
  describe('typedefKey', () => {
2613
2612
  it('works for .brs files', () => {
2614
- (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`);
2615
2614
  });
2616
2615
  it('returns undefined for files that should not have a typedef', () => {
2617
2616
  (0, chai_1.expect)((program.setFile('source/main.bs', '')).typedefKey).to.be.undefined;
@@ -2662,14 +2661,14 @@ describe('BrsFile', () => {
2662
2661
  `);
2663
2662
  (0, chai_1.expect)(file.hasTypedef).to.be.true;
2664
2663
  (0, chai_1.expect)(file.typedefFile).to.exist;
2665
- 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`);
2666
2665
  (0, chai_1.expect)(file.hasTypedef).to.be.false;
2667
2666
  (0, chai_1.expect)(file.typedefFile).not.to.exist;
2668
2667
  });
2669
2668
  });
2670
2669
  describe('typedef', () => {
2671
2670
  it('sets typedef path properly', () => {
2672
- (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());
2673
2672
  (0, chai_1.expect)((program.setFile('source/main2.d.bs', '')).typedefKey).to.equal(undefined);
2674
2673
  (0, chai_1.expect)((program.setFile('source/main3.bs', '')).typedefKey).to.equal(undefined);
2675
2674
  //works for dest with `.brs` extension
@@ -3016,7 +3015,7 @@ describe('BrsFile', () => {
3016
3015
  let idx = 1;
3017
3016
  beforeEach(() => {
3018
3017
  pluginFileName = `plugin-${idx++}.js`;
3019
- fsExtra.outputFileSync((0, util_1.standardizePath) `${tempDir}/plugins/${pluginFileName}`, `
3018
+ fsExtra.outputFileSync((0, util_1.standardizePath) `${testHelpers_spec_2.tempDir}/plugins/${pluginFileName}`, `
3020
3019
  function plugin() {
3021
3020
  return {
3022
3021
  name: 'lower-file-name',
@@ -3029,14 +3028,14 @@ describe('BrsFile', () => {
3029
3028
  `);
3030
3029
  });
3031
3030
  it('can load an absolute plugin which receives callbacks', () => {
3032
- program.plugins = new PluginInterface_1.default(util_1.default.loadPlugins(tempDir, [
3033
- (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}`
3034
3033
  ]), new Logger_1.Logger());
3035
3034
  const file = program.setFile('source/MAIN.brs', '');
3036
3035
  (0, chai_1.expect)(file._customProp).to.exist;
3037
3036
  });
3038
3037
  it('can load a relative plugin which receives callbacks', () => {
3039
- 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, [
3040
3039
  `./plugins/${pluginFileName}`
3041
3040
  ]), new Logger_1.Logger());
3042
3041
  const file = program.setFile('source/MAIN.brs', '');