brighterscript 0.41.4 → 0.43.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 (157) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/LanguageServer.js +0 -9
  3. package/dist/LanguageServer.js.map +1 -1
  4. package/dist/Program.d.ts +1 -1
  5. package/dist/Program.js +45 -10
  6. package/dist/Program.js.map +1 -1
  7. package/dist/ProgramBuilder.js +3 -3
  8. package/dist/ProgramBuilder.js.map +1 -1
  9. package/dist/Scope.d.ts +6 -5
  10. package/dist/Scope.js +33 -32
  11. package/dist/Scope.js.map +1 -1
  12. package/dist/astUtils/AstEditor.d.ts +27 -0
  13. package/dist/astUtils/AstEditor.js +97 -0
  14. package/dist/astUtils/AstEditor.js.map +1 -0
  15. package/dist/astUtils/AstEditor.spec.d.ts +1 -0
  16. package/dist/astUtils/AstEditor.spec.js +133 -0
  17. package/dist/astUtils/AstEditor.spec.js.map +1 -0
  18. package/dist/astUtils/reflection.d.ts +2 -1
  19. package/dist/astUtils/reflection.js +6 -2
  20. package/dist/astUtils/reflection.js.map +1 -1
  21. package/dist/astUtils/reflection.spec.js +6 -6
  22. package/dist/astUtils/reflection.spec.js.map +1 -1
  23. package/dist/astUtils/visitors.spec.js +13 -16
  24. package/dist/astUtils/visitors.spec.js.map +1 -1
  25. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +3 -3
  26. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  27. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +4 -4
  28. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +1 -1
  29. package/dist/files/BrsFile.Class.spec.js +182 -78
  30. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  31. package/dist/files/BrsFile.d.ts +11 -5
  32. package/dist/files/BrsFile.js +111 -77
  33. package/dist/files/BrsFile.js.map +1 -1
  34. package/dist/files/BrsFile.spec.js +150 -101
  35. package/dist/files/BrsFile.spec.js.map +1 -1
  36. package/dist/files/XmlFile.d.ts +1 -0
  37. package/dist/files/XmlFile.js +9 -8
  38. package/dist/files/XmlFile.js.map +1 -1
  39. package/dist/files/XmlFile.spec.js +42 -40
  40. package/dist/files/XmlFile.spec.js.map +1 -1
  41. package/dist/files/tests/imports.spec.js +6 -4
  42. package/dist/files/tests/imports.spec.js.map +1 -1
  43. package/dist/globalCallables.d.ts +3 -1
  44. package/dist/globalCallables.js +200 -100
  45. package/dist/globalCallables.js.map +1 -1
  46. package/dist/index.d.ts +12 -3
  47. package/dist/index.js +21 -4
  48. package/dist/index.js.map +1 -1
  49. package/dist/interfaces.d.ts +49 -4
  50. package/dist/lexer/Lexer.js +1 -2
  51. package/dist/lexer/Lexer.js.map +1 -1
  52. package/dist/lexer/Lexer.spec.js +462 -462
  53. package/dist/lexer/Lexer.spec.js.map +1 -1
  54. package/dist/parser/Expression.d.ts +1 -1
  55. package/dist/parser/Expression.js +10 -10
  56. package/dist/parser/Expression.js.map +1 -1
  57. package/dist/parser/Parser.Class.spec.js +32 -31
  58. package/dist/parser/Parser.Class.spec.js.map +1 -1
  59. package/dist/parser/Parser.d.ts +13 -1
  60. package/dist/parser/Parser.js +355 -253
  61. package/dist/parser/Parser.js.map +1 -1
  62. package/dist/parser/Parser.spec.js +86 -24
  63. package/dist/parser/Parser.spec.js.map +1 -1
  64. package/dist/parser/Statement.d.ts +2 -2
  65. package/dist/parser/Statement.js +8 -8
  66. package/dist/parser/Statement.js.map +1 -1
  67. package/dist/parser/Statement.spec.js +4 -4
  68. package/dist/parser/Statement.spec.js.map +1 -1
  69. package/dist/parser/tests/Parser.spec.d.ts +3 -3
  70. package/dist/parser/tests/Parser.spec.js +4 -4
  71. package/dist/parser/tests/Parser.spec.js.map +1 -1
  72. package/dist/parser/tests/controlFlow/For.spec.js +40 -40
  73. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  74. package/dist/parser/tests/controlFlow/ForEach.spec.js +22 -21
  75. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  76. package/dist/parser/tests/controlFlow/If.spec.js +100 -99
  77. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  78. package/dist/parser/tests/controlFlow/While.spec.js +25 -25
  79. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  80. package/dist/parser/tests/expression/Additive.spec.js +21 -21
  81. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  82. package/dist/parser/tests/expression/ArrayLiterals.spec.js +91 -91
  83. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  84. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +102 -102
  85. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  86. package/dist/parser/tests/expression/Boolean.spec.js +15 -15
  87. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  88. package/dist/parser/tests/expression/Call.spec.js +22 -21
  89. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  90. package/dist/parser/tests/expression/Exponential.spec.js +11 -11
  91. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  92. package/dist/parser/tests/expression/Function.spec.js +171 -171
  93. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  94. package/dist/parser/tests/expression/Indexing.spec.js +50 -50
  95. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  96. package/dist/parser/tests/expression/Multiplicative.spec.js +25 -25
  97. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  98. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +30 -18
  99. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  100. package/dist/parser/tests/expression/PrefixUnary.spec.js +26 -26
  101. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  102. package/dist/parser/tests/expression/Primary.spec.js +27 -27
  103. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  104. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +3 -2
  105. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
  106. package/dist/parser/tests/expression/Relational.spec.js +25 -25
  107. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  108. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +7 -7
  109. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  110. package/dist/parser/tests/expression/TernaryExpression.spec.js +6 -6
  111. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  112. package/dist/parser/tests/statement/AssignmentOperators.spec.js +15 -15
  113. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  114. package/dist/parser/tests/statement/Declaration.spec.js +20 -20
  115. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  116. package/dist/parser/tests/statement/Function.spec.js +121 -120
  117. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  118. package/dist/parser/tests/statement/Goto.spec.js +9 -8
  119. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  120. package/dist/parser/tests/statement/Increment.spec.js +22 -22
  121. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  122. package/dist/parser/tests/statement/InterfaceStatement.spec.js +12 -0
  123. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  124. package/dist/parser/tests/statement/LibraryStatement.spec.js +7 -7
  125. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  126. package/dist/parser/tests/statement/Misc.spec.js +71 -70
  127. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  128. package/dist/parser/tests/statement/PrintStatement.spec.js +17 -17
  129. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  130. package/dist/parser/tests/statement/ReturnStatement.spec.js +33 -33
  131. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  132. package/dist/parser/tests/statement/Set.spec.js +53 -53
  133. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  134. package/dist/parser/tests/statement/Stop.spec.js +7 -6
  135. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  136. package/dist/preprocessor/Chunk.d.ts +1 -1
  137. package/dist/preprocessor/Preprocessor.d.ts +1 -1
  138. package/dist/preprocessor/Preprocessor.js +7 -7
  139. package/dist/preprocessor/Preprocessor.js.map +1 -1
  140. package/dist/util.d.ts +5 -1
  141. package/dist/util.js +43 -33
  142. package/dist/util.js.map +1 -1
  143. package/dist/validators/ClassValidator.js +20 -27
  144. package/dist/validators/ClassValidator.js.map +1 -1
  145. package/package.json +2 -1
  146. package/dist/astUtils/index.d.ts +0 -7
  147. package/dist/astUtils/index.js +0 -26
  148. package/dist/astUtils/index.js.map +0 -1
  149. package/dist/lexer/index.d.ts +0 -3
  150. package/dist/lexer/index.js +0 -18
  151. package/dist/lexer/index.js.map +0 -1
  152. package/dist/parser/index.d.ts +0 -3
  153. package/dist/parser/index.js +0 -16
  154. package/dist/parser/index.js.map +0 -1
  155. package/dist/preprocessor/index.d.ts +0 -3
  156. package/dist/preprocessor/index.js +0 -16
  157. package/dist/preprocessor/index.js.map +0 -1
@@ -12,7 +12,8 @@ const IntegerType_1 = require("../types/IntegerType");
12
12
  const StringType_1 = require("../types/StringType");
13
13
  const BrsFile_1 = require("./BrsFile");
14
14
  const source_map_1 = require("source-map");
15
- const lexer_1 = require("../lexer");
15
+ const Lexer_1 = require("../lexer/Lexer");
16
+ const TokenKind_1 = require("../lexer/TokenKind");
16
17
  const DiagnosticMessages_1 = require("../DiagnosticMessages");
17
18
  const util_1 = require("../util");
18
19
  const PluginInterface_1 = require("../PluginInterface");
@@ -36,24 +37,22 @@ describe('BrsFile', () => {
36
37
  program.dispose();
37
38
  });
38
39
  it('supports the third parameter in CreateObject', () => {
39
- var _a;
40
40
  program.addOrReplaceFile('source/main.brs', `
41
41
  sub main()
42
42
  regexp = CreateObject("roRegex", "[a-z]+", "i")
43
43
  end sub
44
44
  `);
45
45
  program.validate();
46
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
46
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
47
47
  });
48
48
  it('supports the 6 params in CreateObject for roRegion', () => {
49
- var _a;
50
49
  program.addOrReplaceFile('source/main.brs', `
51
50
  sub createRegion(bitmap as object)
52
51
  region = CreateObject("roRegion", bitmap, 20, 40, 100, 200)
53
52
  end sub
54
53
  `);
55
54
  program.validate();
56
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
55
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
57
56
  });
58
57
  it('sets needsTranspiled to true for .bs files', () => {
59
58
  //BrightScript
@@ -68,8 +67,7 @@ describe('BrsFile', () => {
68
67
  range: undefined
69
68
  }];
70
69
  file.addDiagnostics(expected);
71
- const actual = file.getDiagnostics();
72
- (0, chai_1.expect)(actual).deep.equal(expected);
70
+ (0, testHelpers_spec_1.expectDiagnostics)(file, expected);
73
71
  });
74
72
  describe('getPartialVariableName', () => {
75
73
  let entry = {
@@ -181,7 +179,7 @@ describe('BrsFile', () => {
181
179
 
182
180
  end sub
183
181
  `);
184
- let keywords = Object.keys(lexer_1.Keywords).filter(x => !x.includes(' '));
182
+ let keywords = Object.keys(TokenKind_1.Keywords).filter(x => !x.includes(' '));
185
183
  //inside the function
186
184
  let result = program.getCompletions(`${rootDir}/source/main.brs`, vscode_languageserver_1.Position.create(2, 23));
187
185
  let names = result.map(x => x.label);
@@ -258,7 +256,6 @@ describe('BrsFile', () => {
258
256
  describe('comment flags', () => {
259
257
  describe('bs:disable-next-line', () => {
260
258
  it('disables critical diagnostic issues', () => {
261
- var _a, _b;
262
259
  program.addOrReplaceFile('source/main.brs', `
263
260
  sub main()
264
261
  Dim requestData
@@ -266,19 +263,18 @@ describe('BrsFile', () => {
266
263
  `);
267
264
  //should have an error
268
265
  program.validate();
269
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.exist;
266
+ (0, testHelpers_spec_1.expectHasDiagnostics)(program);
270
267
  program.addOrReplaceFile('source/main.brs', `
271
268
  sub main()
272
269
  'bs:disable-next-line
273
270
  Dim requestData
274
271
  end sub
275
272
  `);
276
- //should have an error
273
+ //should not have an error
277
274
  program.validate();
278
- (0, chai_1.expect)((_b = program.getDiagnostics()[0]) === null || _b === void 0 ? void 0 : _b.message).not.to.exist;
275
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
279
276
  });
280
277
  it('works with leading whitespace', () => {
281
- var _a;
282
278
  program.addOrReplaceFile('source/main.brs', `
283
279
  sub main()
284
280
  ' bs:disable-next-line
@@ -287,10 +283,9 @@ describe('BrsFile', () => {
287
283
  `);
288
284
  //should have an error
289
285
  program.validate();
290
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
286
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
291
287
  });
292
288
  it('works for all', () => {
293
- var _a;
294
289
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
295
290
  sub Main()
296
291
  'bs:disable-next-line
@@ -305,10 +300,9 @@ describe('BrsFile', () => {
305
300
  });
306
301
  program.validate();
307
302
  //the "unterminated string" error should be filtered out
308
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
303
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
309
304
  });
310
305
  it('works for specific codes', () => {
311
- var _a;
312
306
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
313
307
  sub Main()
314
308
  'bs:disable-next-line: 1083, 1001
@@ -322,10 +316,9 @@ describe('BrsFile', () => {
322
316
  affectedRange: util_1.default.createRange(3, 0, 3, Number.MAX_SAFE_INTEGER)
323
317
  });
324
318
  //the "unterminated string" error should be filtered out
325
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.not.exist;
319
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
326
320
  });
327
321
  it('recognizes non-numeric codes', () => {
328
- var _a;
329
322
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
330
323
  sub Main()
331
324
  'bs:disable-next-line: LINT9999
@@ -333,7 +326,7 @@ describe('BrsFile', () => {
333
326
  end sub
334
327
  `);
335
328
  (0, chai_1.expect)(file.commentFlags[0]).to.exist;
336
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.exist;
329
+ (0, testHelpers_spec_1.expectHasDiagnostics)(program);
337
330
  });
338
331
  it('supports disabling non-numeric error codes', () => {
339
332
  const program = new Program_1.Program({});
@@ -348,7 +341,8 @@ describe('BrsFile', () => {
348
341
  message: 'Something is not right',
349
342
  range: util_1.default.createRange(2, 16, 2, 26)
350
343
  }]);
351
- (0, chai_1.expect)(program.getScopesForFile(file)[0].getDiagnostics()).to.be.empty;
344
+ const scope = program.getScopesForFile(file)[0];
345
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(scope);
352
346
  });
353
347
  it('adds diagnostics for unknown numeric diagnostic codes', () => {
354
348
  program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -357,13 +351,7 @@ describe('BrsFile', () => {
357
351
  end sub
358
352
  `);
359
353
  program.validate();
360
- (0, chai_1.expect)(program.getDiagnostics()).to.be.lengthOf(2);
361
- (0, chai_1.expect)(program.getDiagnostics()[0]).to.deep.include({
362
- range: vscode_languageserver_1.Range.create(2, 53, 2, 59)
363
- });
364
- (0, chai_1.expect)(program.getDiagnostics()[1]).to.deep.include({
365
- range: vscode_languageserver_1.Range.create(2, 60, 2, 66)
366
- });
354
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unknownDiagnosticCode(123456)), { range: vscode_languageserver_1.Range.create(2, 53, 2, 59) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unknownDiagnosticCode(999999)), { range: vscode_languageserver_1.Range.create(2, 60, 2, 66) })]);
367
355
  });
368
356
  });
369
357
  describe('bs:disable-line', () => {
@@ -381,7 +369,7 @@ describe('BrsFile', () => {
381
369
  });
382
370
  program.validate();
383
371
  //the "unterminated string" error should be filtered out
384
- (0, chai_1.expect)(program.getDiagnostics()).to.be.lengthOf(0);
372
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
385
373
  });
386
374
  it('works for specific codes', () => {
387
375
  program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -395,10 +383,9 @@ describe('BrsFile', () => {
395
383
  end sub
396
384
  `);
397
385
  program.validate();
398
- (0, chai_1.expect)(program.getDiagnostics()).to.be.lengthOf(1);
399
- (0, chai_1.expect)(program.getDiagnostics()[0]).to.deep.include({
400
- range: vscode_languageserver_1.Range.create(5, 24, 5, 35)
401
- });
386
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [{
387
+ range: vscode_languageserver_1.Range.create(5, 24, 5, 35)
388
+ }]);
402
389
  });
403
390
  it('handles the erraneous `stop` keyword', () => {
404
391
  //the current version of BRS causes parse errors after the `parse` keyword, showing error in comments
@@ -411,7 +398,7 @@ describe('BrsFile', () => {
411
398
  end sub
412
399
  `);
413
400
  program.validate();
414
- (0, chai_1.expect)(program.getDiagnostics()).to.be.lengthOf(0);
401
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
415
402
  });
416
403
  });
417
404
  });
@@ -447,7 +434,7 @@ describe('BrsFile', () => {
447
434
  myLabel:
448
435
  end sub
449
436
  `);
450
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
437
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
451
438
  });
452
439
  it('supports empty print statements', () => {
453
440
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -455,7 +442,7 @@ describe('BrsFile', () => {
455
442
  print
456
443
  end sub
457
444
  `);
458
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
445
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
459
446
  });
460
447
  describe('conditional compile', () => {
461
448
  it('works for upper case keywords', () => {
@@ -471,7 +458,7 @@ describe('BrsFile', () => {
471
458
  #ENDIF
472
459
  end sub
473
460
  `);
474
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
461
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
475
462
  });
476
463
  it('supports single-word #elseif and #endif', () => {
477
464
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -484,7 +471,7 @@ describe('BrsFile', () => {
484
471
  #endif
485
472
  end sub
486
473
  `);
487
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
474
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
488
475
  });
489
476
  it('supports multi-word #else if and #end if', () => {
490
477
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -497,7 +484,7 @@ describe('BrsFile', () => {
497
484
  #end if
498
485
  end sub
499
486
  `);
500
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
487
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
501
488
  });
502
489
  it('does not choke on invalid code inside a false conditional compile', () => {
503
490
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -507,7 +494,7 @@ describe('BrsFile', () => {
507
494
  #end if
508
495
  end sub
509
496
  `);
510
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
497
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
511
498
  });
512
499
  it('detects syntax error in #if', () => {
513
500
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -517,7 +504,9 @@ describe('BrsFile', () => {
517
504
  #end if
518
505
  end sub
519
506
  `);
520
- (0, chai_1.expect)(file.getDiagnostics()[0]).to.exist.and.deep.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.invalidHashConstValue));
507
+ (0, testHelpers_spec_1.expectDiagnostics)(file, [
508
+ DiagnosticMessages_1.DiagnosticMessages.referencedConstDoesNotExist()
509
+ ]);
521
510
  });
522
511
  it('detects syntax error in #const', () => {
523
512
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -527,7 +516,10 @@ describe('BrsFile', () => {
527
516
  #end if
528
517
  end sub
529
518
  `);
530
- (0, chai_1.expect)(file.getDiagnostics()[0]).to.exist.and.deep.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unexpectedCharacter('%')));
519
+ (0, testHelpers_spec_1.expectDiagnostics)(file, [
520
+ DiagnosticMessages_1.DiagnosticMessages.unexpectedCharacter('%'),
521
+ DiagnosticMessages_1.DiagnosticMessages.invalidHashIfValue()
522
+ ]);
531
523
  });
532
524
  it('detects #const name using reserved word', () => {
533
525
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -535,7 +527,10 @@ describe('BrsFile', () => {
535
527
  #const function = true
536
528
  end sub
537
529
  `);
538
- (0, chai_1.expect)(file.getDiagnostics()[0]).to.exist.and.deep.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.constNameCannotBeReservedWord()));
530
+ (0, testHelpers_spec_1.expectDiagnostics)(file, [
531
+ DiagnosticMessages_1.DiagnosticMessages.constNameCannotBeReservedWord(),
532
+ DiagnosticMessages_1.DiagnosticMessages.unexpectedToken('#const')
533
+ ]);
539
534
  });
540
535
  it('detects syntax error in #const', () => {
541
536
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -543,7 +538,9 @@ describe('BrsFile', () => {
543
538
  #const someConst = 123
544
539
  end sub
545
540
  `);
546
- (0, chai_1.expect)(file.getDiagnostics()[0]).to.exist.and.deep.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.invalidHashConstValue()));
541
+ (0, testHelpers_spec_1.expectDiagnostics)(file, [
542
+ DiagnosticMessages_1.DiagnosticMessages.invalidHashConstValue()
543
+ ]);
547
544
  });
548
545
  });
549
546
  it('supports stop statement', () => {
@@ -552,7 +549,7 @@ describe('BrsFile', () => {
552
549
  stop
553
550
  end sub
554
551
  `);
555
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
552
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
556
553
  });
557
554
  it('supports single-line if statements', () => {
558
555
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -565,16 +562,15 @@ describe('BrsFile', () => {
565
562
  if true then : test = sub() : print "yes" : end sub : end if
566
563
  end sub
567
564
  `);
568
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
565
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
569
566
  });
570
567
  it('supports line_num as global variable', () => {
571
- var _a;
572
568
  file.parse(`
573
569
  sub Main()
574
570
  print LINE_NUM
575
571
  end sub
576
572
  `);
577
- (0, chai_1.expect)((_a = file.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
573
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
578
574
  });
579
575
  it('supports many keywords as object property names', () => {
580
576
  file.parse(`
@@ -640,7 +636,7 @@ describe('BrsFile', () => {
640
636
  person.new = true
641
637
  end sub
642
638
  `);
643
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
639
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
644
640
  });
645
641
  it('does not error on numeric literal type designators', () => {
646
642
  file.parse(`
@@ -654,7 +650,7 @@ describe('BrsFile', () => {
654
650
  print 9876543210&
655
651
  end sub
656
652
  `);
657
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
653
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
658
654
  });
659
655
  it('does not error when encountering sub with return type', () => {
660
656
  file.parse(`
@@ -662,7 +658,7 @@ describe('BrsFile', () => {
662
658
  return
663
659
  end sub
664
660
  `);
665
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
661
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
666
662
  });
667
663
  it('does not lose function scopes when mismatched end sub', () => {
668
664
  file.parse(`
@@ -697,7 +693,7 @@ describe('BrsFile', () => {
697
693
  foo.bar = true and false or 3 > 4
698
694
  end sub
699
695
  `);
700
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
696
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
701
697
  });
702
698
  it('does not error with boolean in RHS of set statement', () => {
703
699
  file.parse(`
@@ -710,7 +706,7 @@ describe('BrsFile', () => {
710
706
  m.isTrue = m.isTrue = m.isTrue
711
707
  end sub
712
708
  `);
713
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
709
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
714
710
  });
715
711
  it('supports variable names ending with type designators', () => {
716
712
  file.parse(`
@@ -722,7 +718,7 @@ describe('BrsFile', () => {
722
718
  someHex& = 13
723
719
  end sub
724
720
  `);
725
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
721
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
726
722
  });
727
723
  it('supports multiple spaces between two-word keywords', () => {
728
724
  file.parse(`
@@ -734,7 +730,7 @@ describe('BrsFile', () => {
734
730
  end if
735
731
  end sub
736
732
  `);
737
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
733
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
738
734
  });
739
735
  it('does not error with `stop` as object key', () => {
740
736
  file.parse(`
@@ -747,7 +743,7 @@ describe('BrsFile', () => {
747
743
  return obj
748
744
  end function
749
745
  `);
750
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
746
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
751
747
  });
752
748
  it('does not error with `run` as object key', () => {
753
749
  file.parse(`
@@ -760,7 +756,7 @@ describe('BrsFile', () => {
760
756
  return obj
761
757
  end function
762
758
  `);
763
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
759
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
764
760
  });
765
761
  it('supports assignment operators', () => {
766
762
  file.parse(`
@@ -777,7 +773,7 @@ describe('BrsFile', () => {
777
773
  print x
778
774
  end function
779
775
  `);
780
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
776
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
781
777
  });
782
778
  it('supports `then` as object property', () => {
783
779
  file.parse(`
@@ -789,7 +785,7 @@ describe('BrsFile', () => {
789
785
  promise.then()
790
786
  end function
791
787
  `);
792
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
788
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
793
789
  });
794
790
  it('supports function as parameter type', () => {
795
791
  file.parse(`
@@ -798,7 +794,7 @@ describe('BrsFile', () => {
798
794
  end function
799
795
  end sub
800
796
  `);
801
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
797
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
802
798
  });
803
799
  it('supports increment operator', () => {
804
800
  file.parse(`
@@ -807,8 +803,7 @@ describe('BrsFile', () => {
807
803
  x++
808
804
  end function
809
805
  `);
810
- file.getDiagnostics();
811
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
806
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
812
807
  });
813
808
  it('supports decrement operator', () => {
814
809
  file.parse(`
@@ -817,8 +812,7 @@ describe('BrsFile', () => {
817
812
  x--
818
813
  end function
819
814
  `);
820
- file.getDiagnostics();
821
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
815
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
822
816
  });
823
817
  it('supports writing numbers with decimal but no trailing digit', () => {
824
818
  file.parse(`
@@ -827,7 +821,7 @@ describe('BrsFile', () => {
827
821
  print x
828
822
  end function
829
823
  `);
830
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
824
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
831
825
  });
832
826
  it('supports assignment operators against object properties', () => {
833
827
  file.parse(`
@@ -849,7 +843,7 @@ describe('BrsFile', () => {
849
843
  print m.age
850
844
  end function
851
845
  `);
852
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
846
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
853
847
  });
854
848
  //skipped until `brs` supports this
855
849
  it('supports bitshift assignment operators', () => {
@@ -861,7 +855,7 @@ describe('BrsFile', () => {
861
855
  print x
862
856
  end function
863
857
  `);
864
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
858
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
865
859
  });
866
860
  //skipped until `brs` supports this
867
861
  it('supports bitshift assignment operators on objects', () => {
@@ -873,7 +867,7 @@ describe('BrsFile', () => {
873
867
  print m.x
874
868
  end function
875
869
  `);
876
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
870
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
877
871
  });
878
872
  it('supports leading and trailing periods for numeric literals', () => {
879
873
  file.parse(`
@@ -884,7 +878,7 @@ describe('BrsFile', () => {
884
878
  print pointOne
885
879
  end function
886
880
  `);
887
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
881
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
888
882
  });
889
883
  it('supports bitshift assignment operators on object properties accessed by array syntax', () => {
890
884
  file.parse(`
@@ -895,7 +889,7 @@ describe('BrsFile', () => {
895
889
  print m.x
896
890
  end function
897
891
  `);
898
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
892
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
899
893
  });
900
894
  it('supports weird period AA accessor', () => {
901
895
  file.parse(`
@@ -904,7 +898,7 @@ describe('BrsFile', () => {
904
898
  print m.["_uuid"]
905
899
  end function
906
900
  `);
907
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
901
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
908
902
  });
909
903
  it('adds error for library statements NOT at top of file', () => {
910
904
  let file = program.addOrReplaceFile('source/main.bs', `
@@ -912,15 +906,15 @@ describe('BrsFile', () => {
912
906
  end sub
913
907
  import "file.brs"
914
908
  `);
915
- (0, chai_1.expect)(file.getDiagnostics().map(x => x.message)).to.eql([
916
- DiagnosticMessages_1.DiagnosticMessages.importStatementMustBeDeclaredAtTopOfFile().message
909
+ (0, testHelpers_spec_1.expectDiagnostics)(file, [
910
+ DiagnosticMessages_1.DiagnosticMessages.importStatementMustBeDeclaredAtTopOfFile()
917
911
  ]);
918
912
  });
919
913
  it('supports library imports', () => {
920
914
  file.parse(`
921
915
  Library "v30/bslCore.brs"
922
916
  `);
923
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
917
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
924
918
  });
925
919
  it('adds error for library statements NOT at top of file', () => {
926
920
  let file = program.addOrReplaceFile('source/main.brs', `
@@ -928,8 +922,8 @@ describe('BrsFile', () => {
928
922
  end sub
929
923
  Library "v30/bslCore.brs"
930
924
  `);
931
- (0, chai_1.expect)(file.getDiagnostics().map(x => x.message)).to.eql([
932
- DiagnosticMessages_1.DiagnosticMessages.libraryStatementMustBeDeclaredAtTopOfFile().message
925
+ (0, testHelpers_spec_1.expectDiagnostics)(file, [
926
+ DiagnosticMessages_1.DiagnosticMessages.libraryStatementMustBeDeclaredAtTopOfFile()
933
927
  ]);
934
928
  });
935
929
  it('adds error for library statements inside of function body', () => {
@@ -938,8 +932,8 @@ describe('BrsFile', () => {
938
932
  Library "v30/bslCore.brs"
939
933
  end sub
940
934
  `);
941
- (0, chai_1.expect)(file.getDiagnostics().map(x => x.message)).to.eql([
942
- DiagnosticMessages_1.DiagnosticMessages.libraryStatementMustBeDeclaredAtTopOfFile().message
935
+ (0, testHelpers_spec_1.expectDiagnostics)(file, [
936
+ DiagnosticMessages_1.DiagnosticMessages.libraryStatementMustBeDeclaredAtTopOfFile()
943
937
  ]);
944
938
  });
945
939
  it('supports colons as separators in associative array properties', () => {
@@ -948,7 +942,7 @@ describe('BrsFile', () => {
948
942
  obj = {x:0 : y: 1}
949
943
  end sub
950
944
  `);
951
- (0, chai_1.expect)(file.getDiagnostics()).to.be.lengthOf(0);
945
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
952
946
  });
953
947
  it('succeeds when finding variables with "sub" in them', () => {
954
948
  let file = program.addOrReplaceFile('source/main.brs', `
@@ -1034,10 +1028,8 @@ describe('BrsFile', () => {
1034
1028
  function DoSomething
1035
1029
  end function
1036
1030
  `);
1037
- (0, chai_1.expect)(file.getDiagnostics().length).to.be.greaterThan(0);
1038
- (0, chai_1.expect)(file.getDiagnostics()[0]).to.deep.include({
1039
- file: file
1040
- });
1031
+ (0, testHelpers_spec_1.expectHasDiagnostics)(file);
1032
+ (0, chai_1.expect)(file.getDiagnostics()[0].file).to.equal(file);
1041
1033
  (0, chai_1.expect)(file.getDiagnostics()[0].range.start.line).to.equal(1);
1042
1034
  });
1043
1035
  it('supports using the `next` keyword in a for loop', () => {
@@ -1049,7 +1041,7 @@ describe('BrsFile', () => {
1049
1041
  next
1050
1042
  end sub
1051
1043
  `);
1052
- (0, chai_1.expect)(file.getDiagnostics()).to.be.empty;
1044
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
1053
1045
  });
1054
1046
  //test is not working yet, but will be enabled when brs supports this syntax
1055
1047
  it('supports assigning functions to objects', () => {
@@ -1062,7 +1054,7 @@ describe('BrsFile', () => {
1062
1054
  end sub
1063
1055
  end function
1064
1056
  `);
1065
- (0, chai_1.expect)(file.getDiagnostics().length).to.equal(0);
1057
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(file);
1066
1058
  });
1067
1059
  });
1068
1060
  describe('findCallables', () => {
@@ -1183,7 +1175,6 @@ describe('BrsFile', () => {
1183
1175
  }]);
1184
1176
  });
1185
1177
  it('finds function calls nested inside statements', () => {
1186
- var _a;
1187
1178
  program.addOrReplaceFile(`source/main.brs`, `
1188
1179
  sub main()
1189
1180
  if true then
@@ -1192,7 +1183,9 @@ describe('BrsFile', () => {
1192
1183
  end sub
1193
1184
  `);
1194
1185
  program.validate();
1195
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.callToUnknownFunction('DoesNotExist', 'source').message);
1186
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1187
+ DiagnosticMessages_1.DiagnosticMessages.callToUnknownFunction('DoesNotExist', 'source')
1188
+ ]);
1196
1189
  });
1197
1190
  it('finds arguments with variable values', () => {
1198
1191
  let file = new BrsFile_1.BrsFile('absolute_path/file.brs', 'relative_path/file.brs', program);
@@ -1406,7 +1399,11 @@ describe('BrsFile', () => {
1406
1399
  let hover = file.getHover(vscode_languageserver_1.Position.create(1, 28));
1407
1400
  (0, chai_1.expect)(hover).to.exist;
1408
1401
  (0, chai_1.expect)(hover.range).to.eql(vscode_languageserver_1.Range.create(1, 25, 1, 29));
1409
- (0, chai_1.expect)(hover.contents).to.equal('function Main(count? as dynamic) as dynamic');
1402
+ (0, chai_1.expect)(hover.contents).to.equal([
1403
+ '```brightscript',
1404
+ 'function Main(count? as dynamic) as dynamic',
1405
+ '```'
1406
+ ].join('\n'));
1410
1407
  });
1411
1408
  it('finds variable function hover in same scope', () => {
1412
1409
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -1419,7 +1416,11 @@ describe('BrsFile', () => {
1419
1416
  `);
1420
1417
  let hover = file.getHover(vscode_languageserver_1.Position.create(5, 24));
1421
1418
  (0, chai_1.expect)(hover.range).to.eql(vscode_languageserver_1.Range.create(5, 20, 5, 29));
1422
- (0, chai_1.expect)(hover.contents).to.equal('sub sayMyName(name as string) as void');
1419
+ (0, chai_1.expect)(hover.contents).to.equal([
1420
+ '```brightscript',
1421
+ 'sub sayMyName(name as string) as void',
1422
+ '```'
1423
+ ].join('\n'));
1423
1424
  });
1424
1425
  it('finds function hover in file scope', () => {
1425
1426
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -1433,7 +1434,11 @@ describe('BrsFile', () => {
1433
1434
  `);
1434
1435
  let hover = file.getHover(vscode_languageserver_1.Position.create(2, 25));
1435
1436
  (0, chai_1.expect)(hover.range).to.eql(vscode_languageserver_1.Range.create(2, 20, 2, 29));
1436
- (0, chai_1.expect)(hover.contents).to.equal('sub sayMyName() as void');
1437
+ (0, chai_1.expect)(hover.contents).to.equal([
1438
+ '```brightscript',
1439
+ 'sub sayMyName() as void',
1440
+ '```'
1441
+ ].join('\n'));
1437
1442
  });
1438
1443
  it('finds function hover in scope', () => {
1439
1444
  let rootDir = process.cwd();
@@ -1453,7 +1458,53 @@ describe('BrsFile', () => {
1453
1458
  let hover = mainFile.getHover(vscode_languageserver_1.Position.create(2, 25));
1454
1459
  (0, chai_1.expect)(hover).to.exist;
1455
1460
  (0, chai_1.expect)(hover.range).to.eql(vscode_languageserver_1.Range.create(2, 20, 2, 29));
1456
- (0, chai_1.expect)(hover.contents).to.equal('sub sayMyName(name as string) as void');
1461
+ (0, chai_1.expect)(hover.contents).to.equal([
1462
+ '```brightscript',
1463
+ 'sub sayMyName(name as string) as void',
1464
+ '```'
1465
+ ].join('\n'));
1466
+ });
1467
+ it('includes markdown comments in hover.', async () => {
1468
+ let rootDir = process.cwd();
1469
+ program = new Program_1.Program({
1470
+ rootDir: rootDir
1471
+ });
1472
+ const file = program.addOrReplaceFile('source/lib.brs', `
1473
+ '
1474
+ ' The main function
1475
+ '
1476
+ sub main()
1477
+ log("hello")
1478
+ end sub
1479
+
1480
+ '
1481
+ ' Prints a message to the log.
1482
+ ' Works with *markdown* **content**
1483
+ '
1484
+ sub log(message as string)
1485
+ print message
1486
+ end sub
1487
+ `);
1488
+ //hover over log("hello")
1489
+ (0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(5, 22))).contents).to.equal([
1490
+ '```brightscript',
1491
+ 'sub log(message as string) as void',
1492
+ '```',
1493
+ '***',
1494
+ '',
1495
+ ' Prints a message to the log.',
1496
+ ' Works with *markdown* **content**',
1497
+ ''
1498
+ ].join('\n'));
1499
+ //hover over sub ma|in()
1500
+ (0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(4, 22))).contents).to.equal((0, testHelpers_spec_1.trim) `
1501
+ \`\`\`brightscript
1502
+ sub main() as void
1503
+ \`\`\`
1504
+ ***
1505
+
1506
+ The main function
1507
+ `);
1457
1508
  });
1458
1509
  it('handles mixed case `then` partions of conditionals', () => {
1459
1510
  let mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -1463,7 +1514,7 @@ describe('BrsFile', () => {
1463
1514
  end if
1464
1515
  end sub
1465
1516
  `);
1466
- (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1517
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1467
1518
  mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1468
1519
  sub Main()
1469
1520
  if true Then
@@ -1471,7 +1522,7 @@ describe('BrsFile', () => {
1471
1522
  end if
1472
1523
  end sub
1473
1524
  `);
1474
- (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1525
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1475
1526
  mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1476
1527
  sub Main()
1477
1528
  if true THEN
@@ -1479,7 +1530,7 @@ describe('BrsFile', () => {
1479
1530
  end if
1480
1531
  end sub
1481
1532
  `);
1482
- (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1533
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1483
1534
  });
1484
1535
  });
1485
1536
  it('does not throw when encountering incomplete import statement', () => {
@@ -1788,9 +1839,9 @@ describe('BrsFile', () => {
1788
1839
  });
1789
1840
  it('computes correct locations for sourcemap', async () => {
1790
1841
  let source = `function abc(name)\n firstName = name\nend function`;
1791
- let tokens = lexer_1.Lexer.scan(source).tokens
1842
+ let tokens = Lexer_1.Lexer.scan(source).tokens
1792
1843
  //remove newlines and EOF
1793
- .filter(x => x.kind !== lexer_1.TokenKind.Eof && x.kind !== lexer_1.TokenKind.Newline);
1844
+ .filter(x => x.kind !== TokenKind_1.TokenKind.Eof && x.kind !== TokenKind_1.TokenKind.Newline);
1794
1845
  program.options.sourceMap = true;
1795
1846
  let result = testTranspile(source, source, 'none');
1796
1847
  //load the source map
@@ -2048,14 +2099,13 @@ describe('BrsFile', () => {
2048
2099
  describe('callfunc operator', () => {
2049
2100
  describe('transpile', () => {
2050
2101
  it('does not produce diagnostics', () => {
2051
- var _a;
2052
2102
  program.addOrReplaceFile('source/main.bs', `
2053
2103
  sub main()
2054
2104
  someObject@.someFunction(paramObject.value)
2055
2105
  end sub
2056
2106
  `);
2057
2107
  program.validate();
2058
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
2108
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
2059
2109
  });
2060
2110
  it('sets invalid on empty callfunc', () => {
2061
2111
  testTranspile(`
@@ -2095,13 +2145,12 @@ describe('BrsFile', () => {
2095
2145
  name: 'transform callback',
2096
2146
  afterFileParse: onParsed
2097
2147
  });
2098
- const file = new BrsFile_1.BrsFile(`absolute_path/file${ext}`, `relative_path/file${ext}`, program);
2099
- (0, chai_1.expect)(file.extension).to.equal(ext);
2100
- file.parse(`
2148
+ file = program.addOrReplaceFile({ src: `absolute_path/file${ext}`, dest: `relative_path/file${ext}` }, `
2101
2149
  sub Sum()
2102
2150
  print "hello world"
2103
2151
  end sub
2104
2152
  `);
2153
+ (0, chai_1.expect)(file.extension).to.equal(ext);
2105
2154
  return file;
2106
2155
  }
2107
2156
  it('called for BRS file', () => {