brighterscript 1.0.0-alpha.41 → 1.0.0-alpha.42

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 (210) hide show
  1. package/CHANGELOG.md +62 -2
  2. package/dist/AstValidationSegmenter.d.ts +3 -0
  3. package/dist/AstValidationSegmenter.js +62 -2
  4. package/dist/AstValidationSegmenter.js.map +1 -1
  5. package/dist/BsConfig.d.ts +7 -7
  6. package/dist/CrossScopeValidator.js +3 -3
  7. package/dist/CrossScopeValidator.js.map +1 -1
  8. package/dist/DiagnosticFilterer.d.ts +5 -1
  9. package/dist/DiagnosticFilterer.js +92 -33
  10. package/dist/DiagnosticFilterer.js.map +1 -1
  11. package/dist/DiagnosticManager.js +12 -9
  12. package/dist/DiagnosticManager.js.map +1 -1
  13. package/dist/DiagnosticMessages.d.ts +374 -225
  14. package/dist/DiagnosticMessages.js +641 -424
  15. package/dist/DiagnosticMessages.js.map +1 -1
  16. package/dist/DiagnosticSeverityAdjuster.js +4 -0
  17. package/dist/DiagnosticSeverityAdjuster.js.map +1 -1
  18. package/dist/LanguageServer.js +0 -7
  19. package/dist/LanguageServer.js.map +1 -1
  20. package/dist/PluginInterface.js +2 -0
  21. package/dist/PluginInterface.js.map +1 -1
  22. package/dist/Program.d.ts +22 -1
  23. package/dist/Program.js +206 -49
  24. package/dist/Program.js.map +1 -1
  25. package/dist/SymbolTable.d.ts +3 -0
  26. package/dist/SymbolTable.js +19 -1
  27. package/dist/SymbolTable.js.map +1 -1
  28. package/dist/XmlScope.js +3 -6
  29. package/dist/XmlScope.js.map +1 -1
  30. package/dist/astUtils/creators.d.ts +35 -3
  31. package/dist/astUtils/creators.js +52 -1
  32. package/dist/astUtils/creators.js.map +1 -1
  33. package/dist/astUtils/reflection.d.ts +4 -2
  34. package/dist/astUtils/reflection.js +12 -3
  35. package/dist/astUtils/reflection.js.map +1 -1
  36. package/dist/astUtils/visitors.d.ts +3 -2
  37. package/dist/astUtils/visitors.js +37 -14
  38. package/dist/astUtils/visitors.js.map +1 -1
  39. package/dist/astUtils/visitors.spec.js +172 -6
  40. package/dist/astUtils/visitors.spec.js.map +1 -1
  41. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +0 -1
  42. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +0 -13
  43. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  44. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +2 -1
  45. package/dist/bscPlugin/completions/CompletionsProcessor.js +5 -5
  46. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
  47. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +106 -2
  48. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -1
  49. package/dist/bscPlugin/hover/HoverProcessor.spec.js +51 -3
  50. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  51. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +1 -0
  52. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +149 -0
  53. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -1
  54. package/dist/bscPlugin/validation/BrsFileValidator.js +15 -8
  55. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  56. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +80 -9
  57. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -1
  58. package/dist/bscPlugin/validation/ScopeValidator.d.ts +7 -0
  59. package/dist/bscPlugin/validation/ScopeValidator.js +149 -79
  60. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  61. package/dist/bscPlugin/validation/ScopeValidator.spec.js +1227 -27
  62. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -1
  63. package/dist/bscPlugin/validation/XmlFileValidator.js +0 -8
  64. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -1
  65. package/dist/diagnosticUtils.js +6 -5
  66. package/dist/diagnosticUtils.js.map +1 -1
  67. package/dist/files/BrsFile.Class.spec.js +87 -28
  68. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  69. package/dist/files/BrsFile.d.ts +1 -0
  70. package/dist/files/BrsFile.js +20 -8
  71. package/dist/files/BrsFile.js.map +1 -1
  72. package/dist/files/BrsFile.spec.js +133 -34
  73. package/dist/files/BrsFile.spec.js.map +1 -1
  74. package/dist/files/XmlFile.js +2 -2
  75. package/dist/files/XmlFile.js.map +1 -1
  76. package/dist/files/XmlFile.spec.js +3 -20
  77. package/dist/files/XmlFile.spec.js.map +1 -1
  78. package/dist/globalCallables.js +1 -1
  79. package/dist/index.d.ts +8 -3
  80. package/dist/index.js +24 -16
  81. package/dist/index.js.map +1 -1
  82. package/dist/interfaces.d.ts +18 -0
  83. package/dist/interfaces.js.map +1 -1
  84. package/dist/lexer/Lexer.js +17 -11
  85. package/dist/lexer/Lexer.js.map +1 -1
  86. package/dist/lexer/Lexer.spec.js +21 -3
  87. package/dist/lexer/Lexer.spec.js.map +1 -1
  88. package/dist/lexer/TokenKind.d.ts +9 -0
  89. package/dist/lexer/TokenKind.js +11 -1
  90. package/dist/lexer/TokenKind.js.map +1 -1
  91. package/dist/parser/AstNode.d.ts +2 -1
  92. package/dist/parser/AstNode.js +3 -2
  93. package/dist/parser/AstNode.js.map +1 -1
  94. package/dist/parser/Expression.d.ts +22 -2
  95. package/dist/parser/Expression.js +76 -48
  96. package/dist/parser/Expression.js.map +1 -1
  97. package/dist/parser/Parser.Class.spec.js +3 -3
  98. package/dist/parser/Parser.Class.spec.js.map +1 -1
  99. package/dist/parser/Parser.js +73 -61
  100. package/dist/parser/Parser.js.map +1 -1
  101. package/dist/parser/Parser.spec.js +198 -15
  102. package/dist/parser/Parser.spec.js.map +1 -1
  103. package/dist/parser/SGParser.js +9 -9
  104. package/dist/parser/SGParser.js.map +1 -1
  105. package/dist/parser/SGParser.spec.js +3 -2
  106. package/dist/parser/SGParser.spec.js.map +1 -1
  107. package/dist/parser/Statement.d.ts +16 -18
  108. package/dist/parser/Statement.js +136 -82
  109. package/dist/parser/Statement.js.map +1 -1
  110. package/dist/parser/tests/controlFlow/If.spec.js +1 -1
  111. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  112. package/dist/parser/tests/expression/ArrayLiterals.spec.js +3 -3
  113. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  114. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +3 -3
  115. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  116. package/dist/parser/tests/expression/Call.spec.js +9 -9
  117. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  118. package/dist/parser/tests/expression/Indexing.spec.js +3 -3
  119. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  120. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +1 -1
  121. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  122. package/dist/parser/tests/expression/TernaryExpression.spec.js +353 -71
  123. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  124. package/dist/parser/tests/statement/Dim.spec.js +10 -3
  125. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  126. package/dist/parser/tests/statement/Enum.spec.js +2 -2
  127. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  128. package/dist/parser/tests/statement/Increment.spec.js +3 -5
  129. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  130. package/dist/parser/tests/statement/PrintStatement.spec.js +3 -3
  131. package/dist/parser/tests/statement/TryCatch.spec.js +1 -1
  132. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  133. package/dist/roku-types/data.json +430 -235
  134. package/dist/roku-types/index.d.ts +30 -37
  135. package/dist/types/ArrayType.d.ts +2 -0
  136. package/dist/types/ArrayType.js +14 -4
  137. package/dist/types/ArrayType.js.map +1 -1
  138. package/dist/types/AssociativeArrayType.d.ts +1 -0
  139. package/dist/types/AssociativeArrayType.js +1 -0
  140. package/dist/types/AssociativeArrayType.js.map +1 -1
  141. package/dist/types/BaseFunctionType.d.ts +1 -0
  142. package/dist/types/BaseFunctionType.js +1 -0
  143. package/dist/types/BaseFunctionType.js.map +1 -1
  144. package/dist/types/BooleanType.d.ts +1 -0
  145. package/dist/types/BooleanType.js +1 -0
  146. package/dist/types/BooleanType.js.map +1 -1
  147. package/dist/types/BscType.d.ts +8 -1
  148. package/dist/types/BscType.js +12 -3
  149. package/dist/types/BscType.js.map +1 -1
  150. package/dist/types/BuiltInInterfaceAdder.js +10 -6
  151. package/dist/types/BuiltInInterfaceAdder.js.map +1 -1
  152. package/dist/types/ClassType.d.ts +1 -0
  153. package/dist/types/ClassType.js +5 -2
  154. package/dist/types/ClassType.js.map +1 -1
  155. package/dist/types/ComponentType.d.ts +11 -4
  156. package/dist/types/ComponentType.js +100 -8
  157. package/dist/types/ComponentType.js.map +1 -1
  158. package/dist/types/DoubleType.d.ts +2 -0
  159. package/dist/types/DoubleType.js +2 -0
  160. package/dist/types/DoubleType.js.map +1 -1
  161. package/dist/types/DynamicType.d.ts +1 -0
  162. package/dist/types/DynamicType.js +4 -0
  163. package/dist/types/DynamicType.js.map +1 -1
  164. package/dist/types/EnumType.d.ts +2 -0
  165. package/dist/types/EnumType.js +20 -2
  166. package/dist/types/EnumType.js.map +1 -1
  167. package/dist/types/FloatType.d.ts +2 -0
  168. package/dist/types/FloatType.js +2 -0
  169. package/dist/types/FloatType.js.map +1 -1
  170. package/dist/types/InheritableType.js +8 -0
  171. package/dist/types/InheritableType.js.map +1 -1
  172. package/dist/types/IntegerType.d.ts +2 -0
  173. package/dist/types/IntegerType.js +2 -0
  174. package/dist/types/IntegerType.js.map +1 -1
  175. package/dist/types/InterfaceType.js +4 -1
  176. package/dist/types/InterfaceType.js.map +1 -1
  177. package/dist/types/InvalidType.d.ts +2 -1
  178. package/dist/types/InvalidType.js +1 -0
  179. package/dist/types/InvalidType.js.map +1 -1
  180. package/dist/types/LongIntegerType.d.ts +2 -0
  181. package/dist/types/LongIntegerType.js +2 -0
  182. package/dist/types/LongIntegerType.js.map +1 -1
  183. package/dist/types/ObjectType.d.ts +1 -0
  184. package/dist/types/ObjectType.js +1 -0
  185. package/dist/types/ObjectType.js.map +1 -1
  186. package/dist/types/ReferenceType.d.ts +20 -2
  187. package/dist/types/ReferenceType.js +106 -5
  188. package/dist/types/ReferenceType.js.map +1 -1
  189. package/dist/types/StringType.d.ts +1 -0
  190. package/dist/types/StringType.js +1 -0
  191. package/dist/types/StringType.js.map +1 -1
  192. package/dist/types/TypedFunctionType.d.ts +1 -1
  193. package/dist/types/TypedFunctionType.js +8 -2
  194. package/dist/types/TypedFunctionType.js.map +1 -1
  195. package/dist/types/UninitializedType.d.ts +2 -0
  196. package/dist/types/UninitializedType.js +5 -6
  197. package/dist/types/UninitializedType.js.map +1 -1
  198. package/dist/types/UnionType.js +8 -2
  199. package/dist/types/UnionType.js.map +1 -1
  200. package/dist/types/VoidType.d.ts +4 -1
  201. package/dist/types/VoidType.js +5 -0
  202. package/dist/types/VoidType.js.map +1 -1
  203. package/dist/types/helpers.js +8 -1
  204. package/dist/types/helpers.js.map +1 -1
  205. package/dist/util.d.ts +15 -5
  206. package/dist/util.js +281 -14
  207. package/dist/util.js.map +1 -1
  208. package/dist/validators/ClassValidator.js +13 -5
  209. package/dist/validators/ClassValidator.js.map +1 -1
  210. package/package.json +2 -2
@@ -45,6 +45,22 @@ describe('parser', () => {
45
45
  (0, chai_config_spec_1.expect)((_e = (_d = (_c = (_b = parser.ast.statements[0]) === null || _b === void 0 ? void 0 : _b.func) === null || _c === void 0 ? void 0 : _c.body) === null || _d === void 0 ? void 0 : _d.statements[0]) === null || _e === void 0 ? void 0 : _e.expression).to.be.instanceof(Expression_1.CallfuncExpression);
46
46
  });
47
47
  });
48
+ it('flags function names with invalid characters', () => {
49
+ const { diagnostics } = Parser_1.Parser.parse(`
50
+ function alpha$() : end function
51
+ function beta%() : end function
52
+ function charlie!() : end function
53
+ function delta#() : end function
54
+ function echo&() : end function
55
+ `);
56
+ (0, testHelpers_spec_1.expectDiagnostics)(diagnostics, [
57
+ DiagnosticMessages_1.DiagnosticMessages.invalidIdentifier('alpha$', '$'),
58
+ DiagnosticMessages_1.DiagnosticMessages.invalidIdentifier('beta%', '%'),
59
+ DiagnosticMessages_1.DiagnosticMessages.invalidIdentifier('charlie!', '!'),
60
+ DiagnosticMessages_1.DiagnosticMessages.invalidIdentifier('delta#', '#'),
61
+ DiagnosticMessages_1.DiagnosticMessages.invalidIdentifier('echo&', '&')
62
+ ]);
63
+ });
48
64
  describe('optional chaining operator', () => {
49
65
  function getExpression(text, options) {
50
66
  const parser = parse(text, options === null || options === void 0 ? void 0 : options.parseMode);
@@ -148,7 +164,7 @@ describe('parser', () => {
148
164
  return "6c5cdf1"
149
165
  end functionasdf
150
166
  `).diagnostics;
151
- (0, chai_config_spec_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.exist.and.to.eql(DiagnosticMessages_1.DiagnosticMessages.expectedStatementOrFunctionCallButReceivedExpression().message);
167
+ (0, chai_config_spec_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.exist.and.to.eql(DiagnosticMessages_1.DiagnosticMessages.expectedStatement().message);
152
168
  (0, chai_config_spec_1.expect)((_b = diagnostics[0]) === null || _b === void 0 ? void 0 : _b.location.range).to.eql(vscode_languageserver_1.Range.create(3, 20, 3, 32));
153
169
  });
154
170
  });
@@ -195,11 +211,92 @@ describe('parser', () => {
195
211
  const parser = parse(`
196
212
  sub test(param1 as unknownType)
197
213
  end sub
198
- `);
214
+ `, Parser_1.ParseMode.BrighterScript);
199
215
  // type validation happens at scope validation, not at the parser
200
216
  (0, testHelpers_spec_1.expectZeroDiagnostics)(parser);
201
217
  (0, chai_config_spec_1.expect)((0, reflection_1.isFunctionStatement)(parser.ast.statements[0])).to.be.true;
202
218
  });
219
+ it('does not scrap the entire function when encountering unknown parameter type in brightscript mode', () => {
220
+ const parser = parse(`
221
+ sub test(param1 as unknownType)
222
+ end sub
223
+ `, Parser_1.ParseMode.BrightScript);
224
+ // type validation happens at scope validation, not at the parser
225
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(parser, DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('custom types'));
226
+ (0, chai_config_spec_1.expect)((0, reflection_1.isFunctionStatement)(parser.ast.statements[0])).to.be.true;
227
+ });
228
+ it('adds diagnostics when missing end for statements', () => {
229
+ let parser = parse(`
230
+ sub test1(x)
231
+ for each item in x
232
+ print item
233
+ end sub
234
+ `, Parser_1.ParseMode.BrightScript);
235
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(parser, [
236
+ DiagnosticMessages_1.DiagnosticMessages.expectedEndForOrNextToTerminateForLoop('for each')
237
+ ]);
238
+ parser = parse(`
239
+ sub test2()
240
+ for i = 0 to 10
241
+ print i
242
+ end sub
243
+ `, Parser_1.ParseMode.BrightScript);
244
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(parser, [
245
+ DiagnosticMessages_1.DiagnosticMessages.expectedEndForOrNextToTerminateForLoop('for')
246
+ ]);
247
+ parser = parse(`
248
+ sub test3(x )
249
+ for each item in x
250
+ print item
251
+ next
252
+
253
+ for i = 0 to 10
254
+ print i
255
+ next ' next works the same as "end for"
256
+ end sub
257
+ `, Parser_1.ParseMode.BrightScript);
258
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(parser);
259
+ });
260
+ it('does not allow return type as invalid', () => {
261
+ let parser = parse(`
262
+ function test(x) as invalid
263
+ return invalid
264
+ end function
265
+ `, Parser_1.ParseMode.BrighterScript);
266
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(parser, [
267
+ DiagnosticMessages_1.DiagnosticMessages.expectedIdentifier('as').message
268
+ ]);
269
+ });
270
+ it('does not allow param type as invalid', () => {
271
+ let parser = parse(`
272
+ function test(x as invalid)
273
+ return invalid
274
+ end function
275
+ `, Parser_1.ParseMode.BrighterScript);
276
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(parser, [
277
+ DiagnosticMessages_1.DiagnosticMessages.expectedIdentifier('as').message
278
+ ]);
279
+ });
280
+ it('validates when theres a fraction hex', () => {
281
+ let parser = parse(`
282
+ function test()
283
+ x = &HFF.01234
284
+ return x
285
+ end function
286
+ `);
287
+ (0, testHelpers_spec_1.expectDiagnostics)(parser, [
288
+ DiagnosticMessages_1.DiagnosticMessages.expectedStatement(),
289
+ DiagnosticMessages_1.DiagnosticMessages.expectedNewlineOrColon()
290
+ ]);
291
+ });
292
+ it('allows print statement with hex followed by dot <number>', () => {
293
+ let parser = parse(`
294
+ function test()
295
+ print &HFF.01234
296
+ end function
297
+ `);
298
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(parser);
299
+ });
203
300
  describe('namespace', () => {
204
301
  it('allows namespaces declared inside other namespaces', () => {
205
302
  const parser = parse(`
@@ -261,7 +358,7 @@ describe('parser', () => {
261
358
  namespace
262
359
  end namespace
263
360
  `, Parser_1.ParseMode.BrighterScript);
264
- (0, chai_config_spec_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expectedIdentifierAfterKeyword('namespace').message);
361
+ (0, chai_config_spec_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expectedIdentifier('namespace').message);
265
362
  });
266
363
  it('recovers after missing `end namespace`', () => {
267
364
  var _a, _b, _c;
@@ -342,7 +439,7 @@ describe('parser', () => {
342
439
  function log() as UNKNOWN_TYPE
343
440
  end function
344
441
  `, Parser_1.ParseMode.BrightScript);
345
- (0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics); // type validation happens at scope validation step
442
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('custom types').message); // type validation happens at scope validation step
346
443
  (0, chai_config_spec_1.expect)(ast.statements[0]).to.exist;
347
444
  });
348
445
  it('unknown function type is not a problem in Brighterscript mode', () => {
@@ -350,7 +447,7 @@ describe('parser', () => {
350
447
  function log() as UNKNOWN_TYPE
351
448
  end function
352
449
  `, Parser_1.ParseMode.BrighterScript);
353
- (0, chai_config_spec_1.expect)(diagnostics.length).to.equal(0);
450
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
354
451
  (0, chai_config_spec_1.expect)(ast.statements[0]).to.exist;
355
452
  });
356
453
  it('allows namespaced function type in Brighterscript mode', () => {
@@ -369,12 +466,12 @@ describe('parser', () => {
369
466
  (0, chai_config_spec_1.expect)(diagnostics.length).to.equal(0);
370
467
  (0, chai_config_spec_1.expect)(ast.statements[0]).to.exist;
371
468
  });
372
- it('does not cause any diagnostics when custom parameter types are used in Brightscript Mode', () => {
469
+ it('does cause diagnostics when custom parameter types are used in Brightscript Mode', () => {
373
470
  let { diagnostics } = parse(`
374
471
  sub foo(value as UNKNOWN_TYPE)
375
472
  end sub
376
473
  `, Parser_1.ParseMode.BrightScript);
377
- (0, chai_config_spec_1.expect)(diagnostics.length).to.equal(0);
474
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('custom types').message);
378
475
  });
379
476
  it('allows custom namespaced parameter types in BrighterscriptMode', () => {
380
477
  let { ast, diagnostics } = parse(`
@@ -427,7 +524,7 @@ describe('parser', () => {
427
524
  let { tokens } = Lexer_1.Lexer.scan(`print a.`);
428
525
  let { ast, diagnostics } = Parser_1.Parser.parse(tokens);
429
526
  let printStatement = ast.statements[0];
430
- (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.expectedPropertyNameAfterPeriod());
527
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.expectedIdentifier());
431
528
  (0, chai_config_spec_1.expect)(printStatement).to.be.instanceof(Statement_1.PrintStatement);
432
529
  (0, chai_config_spec_1.expect)(printStatement.expressions[0]).to.be.instanceof(Expression_1.VariableExpression);
433
530
  });
@@ -435,7 +532,7 @@ describe('parser', () => {
435
532
  let { tokens } = Lexer_1.Lexer.scan(`print a.b.`);
436
533
  let { ast, diagnostics } = Parser_1.Parser.parse(tokens);
437
534
  let printStatement = ast.statements[0];
438
- (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.expectedPropertyNameAfterPeriod());
535
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.expectedIdentifier());
439
536
  (0, chai_config_spec_1.expect)(printStatement).to.be.instanceof(Statement_1.PrintStatement);
440
537
  (0, chai_config_spec_1.expect)(printStatement.expressions[0]).to.be.instanceof(Expression_1.DottedGetExpression);
441
538
  });
@@ -452,7 +549,7 @@ describe('parser', () => {
452
549
  end namespace
453
550
  `);
454
551
  let { ast, diagnostics } = Parser_1.Parser.parse(tokens);
455
- (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.expectedStatementOrFunctionCallButReceivedExpression());
552
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.expectedStatement());
456
553
  let stmt = ast.statements[0].func.body.statements[0];
457
554
  (0, chai_config_spec_1.expect)((0, reflection_1.isExpressionStatement)(stmt)).to.be.true;
458
555
  (0, chai_config_spec_1.expect)((0, reflection_1.isVariableExpression)((stmt).expression)).to.be.true;
@@ -526,12 +623,24 @@ describe('parser', () => {
526
623
  end function
527
624
  `);
528
625
  let { ast, diagnostics } = Parser_1.Parser.parse(tokens);
529
- (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.expectedStatementOrFunctionCallButReceivedExpression());
626
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, DiagnosticMessages_1.DiagnosticMessages.expectedStatement());
530
627
  for (const stmt of ast.statements[0].func.body.statements) {
531
628
  (0, chai_config_spec_1.expect)((0, reflection_1.isExpressionStatement)(stmt)).to.be.true;
532
629
  (0, chai_config_spec_1.expect)((0, reflection_1.isBinaryExpression)((stmt).expression)).to.be.true;
533
630
  }
534
631
  });
632
+ it('adds callfunc expressions', () => {
633
+ var _a;
634
+ let parser = parse(`
635
+ sub foo(thing)
636
+ thing@.
637
+ end sub
638
+ `, Parser_1.ParseMode.BrighterScript);
639
+ (0, chai_config_spec_1.expect)((_a = parser.diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).to.exist;
640
+ let body = parser.ast.statements[0].func.body;
641
+ let callFunc = body.findChild(reflection_1.isCallfuncExpression);
642
+ (0, chai_config_spec_1.expect)(callFunc).to.exist;
643
+ });
535
644
  });
536
645
  describe('comments', () => {
537
646
  it('does not include comments', () => {
@@ -1284,7 +1393,7 @@ describe('parser', () => {
1284
1393
  print param
1285
1394
  end sub
1286
1395
  `, Parser_1.ParseMode.BrightScript);
1287
- (0, testHelpers_spec_1.expectDiagnosticsIncludes)(parser.diagnostics, [DiagnosticMessages_1.DiagnosticMessages.expectedStatementOrFunctionCallButReceivedExpression()]);
1396
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(parser.diagnostics, [DiagnosticMessages_1.DiagnosticMessages.expectedStatement()]);
1288
1397
  });
1289
1398
  it('allows union types in parameters', () => {
1290
1399
  let { diagnostics } = parse(`
@@ -1968,7 +2077,7 @@ describe('parser', () => {
1968
2077
  end sub
1969
2078
  `, Parser_1.ParseMode.BrighterScript, { debug: true });
1970
2079
  (0, testHelpers_spec_1.expectDiagnostics)(diagnostics, [
1971
- DiagnosticMessages_1.DiagnosticMessages.expectedEndIfToCloseIfStatement({ line: 3, character: 20 }).message,
2080
+ DiagnosticMessages_1.DiagnosticMessages.expectedTerminator('end if', 'if').message,
1972
2081
  DiagnosticMessages_1.DiagnosticMessages.unexpectedToken('end if').message
1973
2082
  ]);
1974
2083
  });
@@ -2042,7 +2151,7 @@ describe('parser', () => {
2042
2151
  #const test
2043
2152
  `, Parser_1.ParseMode.BrighterScript);
2044
2153
  (0, testHelpers_spec_1.expectDiagnostics)(diagnostics, [
2045
- DiagnosticMessages_1.DiagnosticMessages.expectedOperatorAfterIdentifier([TokenKind_1.TokenKind.Equal], 'test').message
2154
+ DiagnosticMessages_1.DiagnosticMessages.expectedOperator([TokenKind_1.TokenKind.Equal], 'test').message
2046
2155
  ]);
2047
2156
  });
2048
2157
  it('has diagnostic if invalid operator', () => {
@@ -2050,7 +2159,7 @@ describe('parser', () => {
2050
2159
  #const test += other
2051
2160
  `, Parser_1.ParseMode.BrighterScript);
2052
2161
  (0, testHelpers_spec_1.expectDiagnostics)(diagnostics, [
2053
- DiagnosticMessages_1.DiagnosticMessages.expectedOperatorAfterIdentifier([TokenKind_1.TokenKind.Equal], 'test').message
2162
+ DiagnosticMessages_1.DiagnosticMessages.expectedOperator([TokenKind_1.TokenKind.Equal], 'test').message
2054
2163
  ]);
2055
2164
  });
2056
2165
  it('has diagnostic if invalid lhs', () => {
@@ -2192,6 +2301,80 @@ describe('parser', () => {
2192
2301
  (0, chai_config_spec_1.expect)(exitStmt.tokens.loopType.text).to.eq('for');
2193
2302
  });
2194
2303
  });
2304
+ describe('custom types', () => {
2305
+ it('built-in interface param types disallowed in brightscript mode', () => {
2306
+ let { diagnostics } = parse(`
2307
+ sub test(foo as roAssociativeArray)
2308
+ print foo.x
2309
+ end sub
2310
+ `, Parser_1.ParseMode.BrightScript);
2311
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, [
2312
+ DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('custom types')
2313
+ ]);
2314
+ });
2315
+ it('built-in interface types disallowed in brightscript mode', () => {
2316
+ let { diagnostics } = parse(`
2317
+ function test(foo) as roAssociativeArray
2318
+ return foo.x
2319
+ end function
2320
+ `, Parser_1.ParseMode.BrightScript);
2321
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, [
2322
+ DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('custom types')
2323
+ ]);
2324
+ });
2325
+ it('custom param types disallowed in brightscript mode', () => {
2326
+ let { diagnostics } = parse(`
2327
+ sub test(foo as Whatever)
2328
+ print foo.x
2329
+ end sub
2330
+ `, Parser_1.ParseMode.BrightScript);
2331
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, [
2332
+ DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('custom types')
2333
+ ]);
2334
+ });
2335
+ it('custom return types disallowed in brightscript mode', () => {
2336
+ let { diagnostics } = parse(`
2337
+ function test(foo) as Whatever
2338
+ return foo.x
2339
+ end function
2340
+ `, Parser_1.ParseMode.BrightScript);
2341
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(diagnostics, [
2342
+ DiagnosticMessages_1.DiagnosticMessages.bsFeatureNotSupportedInBrsFiles('custom types')
2343
+ ]);
2344
+ });
2345
+ it('built-in interface param types allowed in brighterscript mode', () => {
2346
+ let { diagnostics } = parse(`
2347
+ sub test(foo as roAssociativeArray)
2348
+ print foo.x
2349
+ end sub
2350
+ `, Parser_1.ParseMode.BrighterScript);
2351
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
2352
+ });
2353
+ it('built-in interface types allowed in brighterscript mode', () => {
2354
+ let { diagnostics } = parse(`
2355
+ function test(foo) as roAssociativeArray
2356
+ return foo.x
2357
+ end function
2358
+ `, Parser_1.ParseMode.BrighterScript);
2359
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
2360
+ });
2361
+ it('custom param types allowed in brighterscript mode', () => {
2362
+ let { diagnostics } = parse(`
2363
+ sub test(foo as Whatever)
2364
+ print foo.x
2365
+ end sub
2366
+ `, Parser_1.ParseMode.BrighterScript);
2367
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
2368
+ });
2369
+ it('custom return types allowed in brighterscript mode', () => {
2370
+ let { diagnostics } = parse(`
2371
+ function test(foo) as Whatever
2372
+ return foo.x
2373
+ end function
2374
+ `, Parser_1.ParseMode.BrighterScript);
2375
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(diagnostics);
2376
+ });
2377
+ });
2195
2378
  });
2196
2379
  function parse(text, mode, bsConsts = {}) {
2197
2380
  let { tokens } = Lexer_1.Lexer.scan(text);