brighterscript 0.41.5 → 0.43.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/CHANGELOG.md +39 -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 +3 -2
  10. package/dist/Scope.js +14 -14
  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 +107 -67
  33. package/dist/files/BrsFile.js.map +1 -1
  34. package/dist/files/BrsFile.spec.js +175 -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 +41 -39
  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,36 @@ 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'));
1424
+ });
1425
+ it('does not crash when hovering on built-in functions', async () => {
1426
+ let file = program.addOrReplaceFile('source/main.brs', `
1427
+ function doUcase(text)
1428
+ return ucase(text)
1429
+ end function
1430
+ `);
1431
+ (0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(2, 30))).contents).to.equal([
1432
+ '```brightscript',
1433
+ 'function UCase(s? as string) as string',
1434
+ '```'
1435
+ ].join('\n'));
1436
+ });
1437
+ it('does not crash when hovering on object method call', async () => {
1438
+ let file = program.addOrReplaceFile('source/main.brs', `
1439
+ function getInstr(url, text)
1440
+ return url.instr(text)
1441
+ end function
1442
+ `);
1443
+ (0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(2, 35))).contents).to.equal([
1444
+ '```brightscript',
1445
+ //TODO this really shouldn't be returning the global function, but it does...so make sure it doesn't crash right now.
1446
+ 'function Instr(start? as integer, text? as string, substring? as string) as integer',
1447
+ '```'
1448
+ ].join('\n'));
1423
1449
  });
1424
1450
  it('finds function hover in file scope', () => {
1425
1451
  let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -1433,7 +1459,11 @@ describe('BrsFile', () => {
1433
1459
  `);
1434
1460
  let hover = file.getHover(vscode_languageserver_1.Position.create(2, 25));
1435
1461
  (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');
1462
+ (0, chai_1.expect)(hover.contents).to.equal([
1463
+ '```brightscript',
1464
+ 'sub sayMyName() as void',
1465
+ '```'
1466
+ ].join('\n'));
1437
1467
  });
1438
1468
  it('finds function hover in scope', () => {
1439
1469
  let rootDir = process.cwd();
@@ -1453,7 +1483,53 @@ describe('BrsFile', () => {
1453
1483
  let hover = mainFile.getHover(vscode_languageserver_1.Position.create(2, 25));
1454
1484
  (0, chai_1.expect)(hover).to.exist;
1455
1485
  (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');
1486
+ (0, chai_1.expect)(hover.contents).to.equal([
1487
+ '```brightscript',
1488
+ 'sub sayMyName(name as string) as void',
1489
+ '```'
1490
+ ].join('\n'));
1491
+ });
1492
+ it('includes markdown comments in hover.', async () => {
1493
+ let rootDir = process.cwd();
1494
+ program = new Program_1.Program({
1495
+ rootDir: rootDir
1496
+ });
1497
+ const file = program.addOrReplaceFile('source/lib.brs', `
1498
+ '
1499
+ ' The main function
1500
+ '
1501
+ sub main()
1502
+ log("hello")
1503
+ end sub
1504
+
1505
+ '
1506
+ ' Prints a message to the log.
1507
+ ' Works with *markdown* **content**
1508
+ '
1509
+ sub log(message as string)
1510
+ print message
1511
+ end sub
1512
+ `);
1513
+ //hover over log("hello")
1514
+ (0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(5, 22))).contents).to.equal([
1515
+ '```brightscript',
1516
+ 'sub log(message as string) as void',
1517
+ '```',
1518
+ '***',
1519
+ '',
1520
+ ' Prints a message to the log.',
1521
+ ' Works with *markdown* **content**',
1522
+ ''
1523
+ ].join('\n'));
1524
+ //hover over sub ma|in()
1525
+ (0, chai_1.expect)((await program.getHover(file.pathAbsolute, vscode_languageserver_1.Position.create(4, 22))).contents).to.equal((0, testHelpers_spec_1.trim) `
1526
+ \`\`\`brightscript
1527
+ sub main() as void
1528
+ \`\`\`
1529
+ ***
1530
+
1531
+ The main function
1532
+ `);
1457
1533
  });
1458
1534
  it('handles mixed case `then` partions of conditionals', () => {
1459
1535
  let mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
@@ -1463,7 +1539,7 @@ describe('BrsFile', () => {
1463
1539
  end if
1464
1540
  end sub
1465
1541
  `);
1466
- (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1542
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1467
1543
  mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1468
1544
  sub Main()
1469
1545
  if true Then
@@ -1471,7 +1547,7 @@ describe('BrsFile', () => {
1471
1547
  end if
1472
1548
  end sub
1473
1549
  `);
1474
- (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1550
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1475
1551
  mainFile = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1476
1552
  sub Main()
1477
1553
  if true THEN
@@ -1479,7 +1555,7 @@ describe('BrsFile', () => {
1479
1555
  end if
1480
1556
  end sub
1481
1557
  `);
1482
- (0, chai_1.expect)(mainFile.getDiagnostics()).to.be.lengthOf(0);
1558
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(mainFile);
1483
1559
  });
1484
1560
  });
1485
1561
  it('does not throw when encountering incomplete import statement', () => {
@@ -1788,9 +1864,9 @@ describe('BrsFile', () => {
1788
1864
  });
1789
1865
  it('computes correct locations for sourcemap', async () => {
1790
1866
  let source = `function abc(name)\n firstName = name\nend function`;
1791
- let tokens = lexer_1.Lexer.scan(source).tokens
1867
+ let tokens = Lexer_1.Lexer.scan(source).tokens
1792
1868
  //remove newlines and EOF
1793
- .filter(x => x.kind !== lexer_1.TokenKind.Eof && x.kind !== lexer_1.TokenKind.Newline);
1869
+ .filter(x => x.kind !== TokenKind_1.TokenKind.Eof && x.kind !== TokenKind_1.TokenKind.Newline);
1794
1870
  program.options.sourceMap = true;
1795
1871
  let result = testTranspile(source, source, 'none');
1796
1872
  //load the source map
@@ -2048,14 +2124,13 @@ describe('BrsFile', () => {
2048
2124
  describe('callfunc operator', () => {
2049
2125
  describe('transpile', () => {
2050
2126
  it('does not produce diagnostics', () => {
2051
- var _a;
2052
2127
  program.addOrReplaceFile('source/main.bs', `
2053
2128
  sub main()
2054
2129
  someObject@.someFunction(paramObject.value)
2055
2130
  end sub
2056
2131
  `);
2057
2132
  program.validate();
2058
- (0, chai_1.expect)((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
2133
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
2059
2134
  });
2060
2135
  it('sets invalid on empty callfunc', () => {
2061
2136
  testTranspile(`
@@ -2095,13 +2170,12 @@ describe('BrsFile', () => {
2095
2170
  name: 'transform callback',
2096
2171
  afterFileParse: onParsed
2097
2172
  });
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(`
2173
+ file = program.addOrReplaceFile({ src: `absolute_path/file${ext}`, dest: `relative_path/file${ext}` }, `
2101
2174
  sub Sum()
2102
2175
  print "hello world"
2103
2176
  end sub
2104
2177
  `);
2178
+ (0, chai_1.expect)(file.extension).to.equal(ext);
2105
2179
  return file;
2106
2180
  }
2107
2181
  it('called for BRS file', () => {