brighterscript 1.0.0-alpha.27 → 1.0.0-alpha.28

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 (147) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +1 -1
  3. package/dist/AstValidationSegmenter.d.ts +1 -1
  4. package/dist/AstValidationSegmenter.js +2 -2
  5. package/dist/AstValidationSegmenter.js.map +1 -1
  6. package/dist/DiagnosticFilterer.d.ts +7 -4
  7. package/dist/DiagnosticFilterer.js +67 -37
  8. package/dist/DiagnosticFilterer.js.map +1 -1
  9. package/dist/DiagnosticMessages.d.ts +1 -1
  10. package/dist/PluginInterface.js +1 -1
  11. package/dist/PluginInterface.js.map +1 -1
  12. package/dist/Program.d.ts +1 -1
  13. package/dist/Program.js +10 -6
  14. package/dist/Program.js.map +1 -1
  15. package/dist/Scope.d.ts +6 -27
  16. package/dist/Scope.js +40 -298
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/SymbolTable.d.ts +1 -1
  19. package/dist/{SymbolTableFlag.js → SymbolTypeFlag.js} +1 -1
  20. package/dist/SymbolTypeFlag.js.map +1 -0
  21. package/dist/XmlScope.d.ts +0 -8
  22. package/dist/XmlScope.js +0 -77
  23. package/dist/XmlScope.js.map +1 -1
  24. package/dist/astUtils/CachedLookups.js +4 -8
  25. package/dist/astUtils/CachedLookups.js.map +1 -1
  26. package/dist/astUtils/creators.d.ts +1 -0
  27. package/dist/astUtils/creators.js +3 -2
  28. package/dist/astUtils/creators.js.map +1 -1
  29. package/dist/astUtils/creators.spec.js +0 -10
  30. package/dist/astUtils/creators.spec.js.map +1 -1
  31. package/dist/astUtils/reflection.d.ts +1 -2
  32. package/dist/astUtils/reflection.js +3 -7
  33. package/dist/astUtils/reflection.js.map +1 -1
  34. package/dist/astUtils/reflection.spec.js +10 -15
  35. package/dist/astUtils/reflection.spec.js.map +1 -1
  36. package/dist/astUtils/visitors.d.ts +1 -2
  37. package/dist/astUtils/visitors.js.map +1 -1
  38. package/dist/astUtils/visitors.spec.js +1 -5
  39. package/dist/astUtils/visitors.spec.js.map +1 -1
  40. package/dist/bscPlugin/BscPlugin.d.ts +2 -1
  41. package/dist/bscPlugin/BscPlugin.js +4 -0
  42. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  43. package/dist/bscPlugin/SignatureHelpUtil.js +4 -3
  44. package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -1
  45. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +1 -0
  46. package/dist/bscPlugin/completions/CompletionsProcessor.js +26 -9
  47. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
  48. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +39 -0
  49. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -1
  50. package/dist/bscPlugin/hover/HoverProcessor.js +5 -5
  51. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  52. package/dist/bscPlugin/hover/HoverProcessor.spec.js +51 -5
  53. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  54. package/dist/bscPlugin/references/ReferencesProvider.d.ts +12 -0
  55. package/dist/bscPlugin/references/ReferencesProvider.js +56 -0
  56. package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -0
  57. package/dist/bscPlugin/references/ReferencesProvider.spec.d.ts +1 -0
  58. package/dist/bscPlugin/references/ReferencesProvider.spec.js +51 -0
  59. package/dist/bscPlugin/references/ReferencesProvider.spec.js.map +1 -0
  60. package/dist/bscPlugin/validation/BrsFileValidator.js +1 -6
  61. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  62. package/dist/bscPlugin/validation/ScopeValidator.d.ts +28 -1
  63. package/dist/bscPlugin/validation/ScopeValidator.js +365 -7
  64. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  65. package/dist/bscPlugin/validation/ScopeValidator.spec.js +89 -3
  66. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -1
  67. package/dist/files/BrsFile.Class.spec.js +11 -4
  68. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  69. package/dist/files/BrsFile.d.ts +12 -2
  70. package/dist/files/BrsFile.js +64 -38
  71. package/dist/files/BrsFile.js.map +1 -1
  72. package/dist/files/BrsFile.spec.js +373 -6
  73. package/dist/files/BrsFile.spec.js.map +1 -1
  74. package/dist/files/XmlFile.js +1 -1
  75. package/dist/files/XmlFile.js.map +1 -1
  76. package/dist/index.d.ts +1 -0
  77. package/dist/index.js +1 -0
  78. package/dist/index.js.map +1 -1
  79. package/dist/interfaces.d.ts +41 -3
  80. package/dist/interfaces.js.map +1 -1
  81. package/dist/lexer/Lexer.d.ts +9 -3
  82. package/dist/lexer/Lexer.js +36 -15
  83. package/dist/lexer/Lexer.js.map +1 -1
  84. package/dist/lexer/Lexer.spec.js +76 -38
  85. package/dist/lexer/Lexer.spec.js.map +1 -1
  86. package/dist/lexer/Token.js +1 -1
  87. package/dist/lexer/Token.js.map +1 -1
  88. package/dist/lexer/TokenKind.d.ts +1 -0
  89. package/dist/lexer/TokenKind.js +4 -1
  90. package/dist/lexer/TokenKind.js.map +1 -1
  91. package/dist/parser/AstNode.d.ts +1 -2
  92. package/dist/parser/AstNode.js +0 -1
  93. package/dist/parser/AstNode.js.map +1 -1
  94. package/dist/parser/BrsTranspileState.d.ts +1 -1
  95. package/dist/parser/Expression.d.ts +71 -47
  96. package/dist/parser/Expression.js +155 -87
  97. package/dist/parser/Expression.js.map +1 -1
  98. package/dist/parser/Parser.d.ts +7 -2
  99. package/dist/parser/Parser.js +40 -87
  100. package/dist/parser/Parser.js.map +1 -1
  101. package/dist/parser/Parser.spec.js +21 -44
  102. package/dist/parser/Parser.spec.js.map +1 -1
  103. package/dist/parser/SGTypes.js +5 -5
  104. package/dist/parser/SGTypes.js.map +1 -1
  105. package/dist/parser/Statement.d.ts +92 -84
  106. package/dist/parser/Statement.js +199 -133
  107. package/dist/parser/Statement.js.map +1 -1
  108. package/dist/parser/Statement.spec.js +0 -13
  109. package/dist/parser/Statement.spec.js.map +1 -1
  110. package/dist/parser/TranspileState.d.ts +17 -8
  111. package/dist/parser/TranspileState.js +64 -6
  112. package/dist/parser/TranspileState.js.map +1 -1
  113. package/dist/parser/tests/Parser.spec.d.ts +1 -1
  114. package/dist/parser/tests/Parser.spec.js +1 -2
  115. package/dist/parser/tests/Parser.spec.js.map +1 -1
  116. package/dist/parser/tests/controlFlow/If.spec.js +1 -1
  117. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  118. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +1 -3
  119. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  120. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +44 -0
  121. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  122. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +6 -6
  123. package/dist/parser/tests/expression/TernaryExpression.spec.js +47 -0
  124. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  125. package/dist/parser/tests/statement/ConstStatement.spec.js +2 -2
  126. package/dist/parser/tests/statement/InterfaceStatement.spec.js +8 -1
  127. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  128. package/dist/parser/tests/statement/Misc.spec.js +25 -5
  129. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  130. package/dist/preprocessor/Chunk.js +1 -2
  131. package/dist/preprocessor/Chunk.js.map +1 -1
  132. package/dist/preprocessor/PreprocessorParser.js +2 -1
  133. package/dist/preprocessor/PreprocessorParser.js.map +1 -1
  134. package/dist/types/AssociativeArrayType.d.ts +3 -0
  135. package/dist/types/AssociativeArrayType.js +9 -0
  136. package/dist/types/AssociativeArrayType.js.map +1 -1
  137. package/dist/types/BscType.d.ts +1 -1
  138. package/dist/types/BscType.js +1 -0
  139. package/dist/types/BscType.js.map +1 -1
  140. package/dist/types/ComponentType.d.ts +1 -1
  141. package/dist/types/ReferenceType.d.ts +1 -1
  142. package/dist/util.d.ts +18 -8
  143. package/dist/util.js +96 -18
  144. package/dist/util.js.map +1 -1
  145. package/package.json +6 -3
  146. package/dist/SymbolTableFlag.js.map +0 -1
  147. /package/dist/{SymbolTableFlag.d.ts → SymbolTypeFlag.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ContinueStatement = exports.ConstStatement = exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.FieldStatement = exports.MethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = void 0;
3
+ exports.ContinueStatement = exports.ConstStatement = exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.FieldStatement = exports.MethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = void 0;
4
4
  const TokenKind_1 = require("../lexer/TokenKind");
5
5
  const Expression_1 = require("./Expression");
6
6
  const util_1 = require("../util");
@@ -22,10 +22,9 @@ const TypedFunctionType_1 = require("../types/TypedFunctionType");
22
22
  const ArrayType_1 = require("../types/ArrayType");
23
23
  class EmptyStatement extends AstNode_2.Statement {
24
24
  constructor(options) {
25
- var _a;
26
25
  super();
27
26
  this.kind = AstNode_1.AstNodeKind.EmptyStatement;
28
- this.range = (_a = options === null || options === void 0 ? void 0 : options.range) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
27
+ this.range = undefined;
29
28
  }
30
29
  transpile(state) {
31
30
  return [];
@@ -53,6 +52,7 @@ class Body extends AstNode_2.Statement {
53
52
  return util_1.util.createBoundingRange(...((_a = this.statements) !== null && _a !== void 0 ? _a : []));
54
53
  }
55
54
  transpile(state) {
55
+ var _a, _b, _c, _d;
56
56
  let result = [];
57
57
  for (let i = 0; i < this.statements.length; i++) {
58
58
  let statement = this.statements[i];
@@ -62,20 +62,20 @@ class Body extends AstNode_2.Statement {
62
62
  //this is the first statement. do nothing related to spacing and newlines
63
63
  //if comment is on same line as prior sibling
64
64
  }
65
- else if ((0, reflection_1.isCommentStatement)(statement) && previousStatement && statement.range.start.line === previousStatement.range.end.line) {
65
+ else if (util_1.util.hasLeadingComments(statement) && previousStatement && ((_c = (_b = (_a = util_1.util.getLeadingComments(statement)) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.range) === null || _c === void 0 ? void 0 : _c.start.line) === ((_d = previousStatement.range) === null || _d === void 0 ? void 0 : _d.end.line)) {
66
66
  result.push(' ');
67
67
  //add double newline if this is a comment, and next is a function
68
68
  }
69
- else if ((0, reflection_1.isCommentStatement)(statement) && nextStatement && (0, reflection_1.isFunctionStatement)(nextStatement)) {
70
- result.push('\n\n');
69
+ else if (util_1.util.hasLeadingComments(statement) && nextStatement && (0, reflection_1.isFunctionStatement)(nextStatement)) {
70
+ result.push(state.newline, state.newline);
71
71
  //add double newline if is function not preceeded by a comment
72
72
  }
73
- else if ((0, reflection_1.isFunctionStatement)(statement) && previousStatement && !((0, reflection_1.isCommentStatement)(previousStatement))) {
74
- result.push('\n\n');
73
+ else if ((0, reflection_1.isFunctionStatement)(statement) && previousStatement && !util_1.util.hasLeadingComments(statement)) {
74
+ result.push(state.newline, state.newline);
75
75
  }
76
76
  else {
77
77
  //separate statements by a single newline
78
- result.push('\n');
78
+ result.push(state.newline);
79
79
  }
80
80
  result.push(...statement.transpile(state));
81
81
  }
@@ -129,7 +129,7 @@ class AssignmentStatement extends AstNode_2.Statement {
129
129
  }
130
130
  walk(visitor, options) {
131
131
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
132
- //TODO: Walk TypeExpression. We need to decide how to implement types on assignments
132
+ (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
133
133
  (0, visitors_1.walk)(this, 'value', visitor, options);
134
134
  }
135
135
  }
@@ -141,6 +141,10 @@ class AssignmentStatement extends AstNode_2.Statement {
141
141
  (_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry({ name: this.tokens.name.text, type: variableType, data: options.data, range: this.tokens.name.range, kind: this.kind }));
142
142
  return variableType;
143
143
  }
144
+ getLeadingTrivia() {
145
+ var _a;
146
+ return (_a = this.tokens.name.leadingTrivia) !== null && _a !== void 0 ? _a : [];
147
+ }
144
148
  }
145
149
  exports.AssignmentStatement = AssignmentStatement;
146
150
  class Block extends AstNode_2.Statement {
@@ -158,9 +162,10 @@ class Block extends AstNode_2.Statement {
158
162
  for (let i = 0; i < this.statements.length; i++) {
159
163
  let previousStatement = this.statements[i - 1];
160
164
  let statement = this.statements[i];
165
+ //is not a comment
161
166
  //if comment is on same line as parent
162
- if ((0, reflection_1.isCommentStatement)(statement) &&
163
- (util_1.util.linesTouch(state.lineage[0], statement) || util_1.util.linesTouch(previousStatement, statement))) {
167
+ if (util_1.util.isLeadingCommentOnSameLine(state.lineage[0], statement) ||
168
+ util_1.util.isLeadingCommentOnSameLine(previousStatement, statement)) {
164
169
  results.push(' ');
165
170
  //is not a comment
166
171
  }
@@ -198,47 +203,11 @@ class ExpressionStatement extends AstNode_2.Statement {
198
203
  (0, visitors_1.walk)(this, 'expression', visitor, options);
199
204
  }
200
205
  }
201
- }
202
- exports.ExpressionStatement = ExpressionStatement;
203
- class CommentStatement extends AstNode_2.Statement {
204
- constructor(options) {
205
- var _a;
206
- super();
207
- this.kind = AstNode_1.AstNodeKind.CommentStatement;
208
- this.visitMode = visitors_1.InternalWalkMode.visitStatements | visitors_1.InternalWalkMode.visitExpressions;
209
- this.tokens = {
210
- comments: options.comments
211
- };
212
- if (((_a = this.tokens.comments) === null || _a === void 0 ? void 0 : _a.length) > 0) {
213
- this.range = util_1.util.createBoundingRange(...this.tokens.comments);
214
- }
215
- }
216
- get text() {
217
- return this.tokens.comments.map(x => x.text).join('\n');
218
- }
219
- transpile(state) {
220
- let result = [];
221
- for (let i = 0; i < this.tokens.comments.length; i++) {
222
- let comment = this.tokens.comments[i];
223
- if (i > 0) {
224
- result.push(state.indent());
225
- }
226
- result.push(state.transpileToken(comment));
227
- //add newline for all except final comment
228
- if (i < this.tokens.comments.length - 1) {
229
- result.push('\n');
230
- }
231
- }
232
- return result;
233
- }
234
- getTypedef(state) {
235
- return this.transpile(state);
236
- }
237
- walk(visitor, options) {
238
- //nothing to walk
206
+ getLeadingTrivia() {
207
+ return this.expression.getLeadingTrivia();
239
208
  }
240
209
  }
241
- exports.CommentStatement = CommentStatement;
210
+ exports.ExpressionStatement = ExpressionStatement;
242
211
  class ExitForStatement extends AstNode_2.Statement {
243
212
  constructor(options) {
244
213
  var _a;
@@ -250,13 +219,15 @@ class ExitForStatement extends AstNode_2.Statement {
250
219
  this.range = (_a = this.tokens.exitFor) === null || _a === void 0 ? void 0 : _a.range;
251
220
  }
252
221
  transpile(state) {
253
- return [
254
- this.tokens.exitFor ? state.transpileToken(this.tokens.exitFor) : 'exit for'
255
- ];
222
+ return this.tokens.exitFor ? state.transpileToken(this.tokens.exitFor) : ['exit for'];
256
223
  }
257
224
  walk(visitor, options) {
258
225
  //nothing to walk
259
226
  }
227
+ getLeadingTrivia() {
228
+ var _a, _b;
229
+ return (_b = (_a = this.tokens.exitFor) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
230
+ }
260
231
  }
261
232
  exports.ExitForStatement = ExitForStatement;
262
233
  class ExitWhileStatement extends AstNode_2.Statement {
@@ -270,13 +241,15 @@ class ExitWhileStatement extends AstNode_2.Statement {
270
241
  this.range = (_a = this.tokens.exitWhile) === null || _a === void 0 ? void 0 : _a.range;
271
242
  }
272
243
  transpile(state) {
273
- return [
274
- this.tokens.exitWhile ? state.transpileToken(this.tokens.exitWhile) : 'exit while'
275
- ];
244
+ return this.tokens.exitWhile ? state.transpileToken(this.tokens.exitWhile) : ['exit while'];
276
245
  }
277
246
  walk(visitor, options) {
278
247
  //nothing to walk
279
248
  }
249
+ getLeadingTrivia() {
250
+ var _a, _b;
251
+ return (_b = (_a = this.tokens.exitWhile) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
252
+ }
280
253
  }
281
254
  exports.ExitWhileStatement = ExitWhileStatement;
282
255
  class FunctionStatement extends AstNode_2.Statement {
@@ -316,9 +289,12 @@ class FunctionStatement extends AstNode_2.Statement {
316
289
  return this.func.transpile(state, nameToken);
317
290
  }
318
291
  getTypedef(state) {
319
- var _a;
292
+ var _a, _b;
320
293
  let result = [];
321
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
294
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
295
+ result.push(comment.text, state.newline, state.indent());
296
+ }
297
+ for (let annotation of (_b = this.annotations) !== null && _b !== void 0 ? _b : []) {
322
298
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
323
299
  }
324
300
  result.push(...this.func.getTypedef(state));
@@ -354,7 +330,7 @@ class IfStatement extends AstNode_2.Statement {
354
330
  this.range = util_1.util.createBoundingRange(util_1.util.createBoundingRangeFromTokens(this.tokens), this.condition, this.thenBranch, this.elseBranch);
355
331
  }
356
332
  transpile(state) {
357
- var _a;
333
+ var _a, _b;
358
334
  let results = [];
359
335
  //if (already indented by block)
360
336
  results.push(state.transpileToken((_a = this.tokens.if) !== null && _a !== void 0 ? _a : (0, creators_1.createToken)(TokenKind_1.TokenKind.If)));
@@ -373,13 +349,10 @@ class IfStatement extends AstNode_2.Statement {
373
349
  if (thenNodes.length > 0) {
374
350
  results.push(thenNodes);
375
351
  }
376
- results.push('\n');
377
352
  //else branch
378
- if (this.tokens.else) {
379
- //else
380
- results.push(state.indent(), state.transpileToken(this.tokens.else));
381
- }
382
353
  if (this.elseBranch) {
354
+ //else
355
+ results.push(...state.transpileEndBlockToken(this.thenBranch, this.tokens.else, 'else'));
383
356
  if ((0, reflection_1.isIfStatement)(this.elseBranch)) {
384
357
  //chained elseif
385
358
  state.lineage.unshift(this.elseBranch);
@@ -404,17 +377,10 @@ class IfStatement extends AstNode_2.Statement {
404
377
  if (body.length > 0) {
405
378
  results.push(...body);
406
379
  }
407
- results.push('\n');
408
380
  }
409
381
  }
410
382
  //end if
411
- results.push(state.indent());
412
- if (this.tokens.endIf) {
413
- results.push(state.transpileToken(this.tokens.endIf));
414
- }
415
- else {
416
- results.push('end if');
417
- }
383
+ results.push(...state.transpileEndBlockToken((_b = this.elseBranch) !== null && _b !== void 0 ? _b : this.thenBranch, this.tokens.endIf, 'end if'));
418
384
  return results;
419
385
  }
420
386
  walk(visitor, options) {
@@ -428,6 +394,10 @@ class IfStatement extends AstNode_2.Statement {
428
394
  (0, visitors_1.walk)(this, 'elseBranch', visitor, options);
429
395
  }
430
396
  }
397
+ getLeadingTrivia() {
398
+ var _a, _b;
399
+ return (_b = (_a = this.tokens.if) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
400
+ }
431
401
  }
432
402
  exports.IfStatement = IfStatement;
433
403
  class IncrementStatement extends AstNode_2.Statement {
@@ -451,6 +421,10 @@ class IncrementStatement extends AstNode_2.Statement {
451
421
  (0, visitors_1.walk)(this, 'value', visitor, options);
452
422
  }
453
423
  }
424
+ getLeadingTrivia() {
425
+ var _a, _b;
426
+ return (_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.getLeadingTrivia()) !== null && _b !== void 0 ? _b : [];
427
+ }
454
428
  }
455
429
  exports.IncrementStatement = IncrementStatement;
456
430
  /**
@@ -500,6 +474,10 @@ class PrintStatement extends AstNode_2.Statement {
500
474
  (0, visitors_1.walkArray)(this.expressions, visitor, options, this, (item) => (0, reflection_1.isExpression)(item));
501
475
  }
502
476
  }
477
+ getLeadingTrivia() {
478
+ var _a, _b;
479
+ return (_b = (_a = this.tokens.print) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
480
+ }
503
481
  }
504
482
  exports.PrintStatement = PrintStatement;
505
483
  class DimStatement extends AstNode_2.Statement {
@@ -533,8 +511,8 @@ class DimStatement extends AstNode_2.Statement {
533
511
  return result;
534
512
  }
535
513
  walk(visitor, options) {
536
- var _a;
537
- if (((_a = this.dimensions) === null || _a === void 0 ? void 0 : _a.length) > 0 && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
514
+ var _a, _b;
515
+ if (((_a = this.dimensions) === null || _a === void 0 ? void 0 : _a.length) !== undefined && ((_b = this.dimensions) === null || _b === void 0 ? void 0 : _b.length) > 0 && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
538
516
  (0, visitors_1.walkArray)(this.dimensions, visitor, options, this);
539
517
  }
540
518
  }
@@ -547,6 +525,10 @@ class DimStatement extends AstNode_2.Statement {
547
525
  }
548
526
  return type;
549
527
  }
528
+ getLeadingTrivia() {
529
+ var _a, _b;
530
+ return (_b = (_a = this.tokens.dim) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
531
+ }
550
532
  }
551
533
  exports.DimStatement = DimStatement;
552
534
  class GotoStatement extends AstNode_2.Statement {
@@ -569,6 +551,10 @@ class GotoStatement extends AstNode_2.Statement {
569
551
  walk(visitor, options) {
570
552
  //nothing to walk
571
553
  }
554
+ getLeadingTrivia() {
555
+ var _a, _b;
556
+ return (_b = (_a = this.tokens.goto) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
557
+ }
572
558
  }
573
559
  exports.GotoStatement = GotoStatement;
574
560
  class LabelStatement extends AstNode_2.Statement {
@@ -619,6 +605,10 @@ class ReturnStatement extends AstNode_2.Statement {
619
605
  (0, visitors_1.walk)(this, 'value', visitor, options);
620
606
  }
621
607
  }
608
+ getLeadingTrivia() {
609
+ var _a, _b;
610
+ return (_b = (_a = this.tokens.return) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
611
+ }
622
612
  }
623
613
  exports.ReturnStatement = ReturnStatement;
624
614
  class EndStatement extends AstNode_2.Statement {
@@ -639,6 +629,10 @@ class EndStatement extends AstNode_2.Statement {
639
629
  walk(visitor, options) {
640
630
  //nothing to walk
641
631
  }
632
+ getLeadingTrivia() {
633
+ var _a, _b;
634
+ return (_b = (_a = this.tokens.end) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
635
+ }
642
636
  }
643
637
  exports.EndStatement = EndStatement;
644
638
  class StopStatement extends AstNode_2.Statement {
@@ -657,6 +651,10 @@ class StopStatement extends AstNode_2.Statement {
657
651
  walk(visitor, options) {
658
652
  //nothing to walk
659
653
  }
654
+ getLeadingTrivia() {
655
+ var _a, _b;
656
+ return (_b = (_a = this.tokens.stop) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
657
+ }
660
658
  }
661
659
  exports.StopStatement = StopStatement;
662
660
  class ForStatement extends AstNode_2.Statement {
@@ -693,10 +691,8 @@ class ForStatement extends AstNode_2.Statement {
693
691
  state.lineage.unshift(this);
694
692
  result.push(...this.body.transpile(state));
695
693
  state.lineage.shift();
696
- // add new line before "end for"
697
- result.push('\n');
698
694
  //end for
699
- result.push(state.indent(), state.transpileToken(this.tokens.endFor, 'end for'));
695
+ result.push(...state.transpileEndBlockToken(this.body, this.tokens.endFor, 'end for'));
700
696
  return result;
701
697
  }
702
698
  walk(visitor, options) {
@@ -711,6 +707,10 @@ class ForStatement extends AstNode_2.Statement {
711
707
  (0, visitors_1.walk)(this, 'body', visitor, options);
712
708
  }
713
709
  }
710
+ getLeadingTrivia() {
711
+ var _a, _b;
712
+ return (_b = (_a = this.tokens.for) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
713
+ }
714
714
  }
715
715
  exports.ForStatement = ForStatement;
716
716
  class ForEachStatement extends AstNode_2.Statement {
@@ -741,10 +741,8 @@ class ForEachStatement extends AstNode_2.Statement {
741
741
  state.lineage.unshift(this);
742
742
  result.push(...this.body.transpile(state));
743
743
  state.lineage.shift();
744
- // add new line before "end for"
745
- result.push('\n');
746
744
  //end for
747
- result.push(state.indent(), state.transpileToken(this.tokens.endFor, 'end for'));
745
+ result.push(...state.transpileEndBlockToken(this.body, this.tokens.endFor, 'end for'));
748
746
  return result;
749
747
  }
750
748
  walk(visitor, options) {
@@ -755,6 +753,13 @@ class ForEachStatement extends AstNode_2.Statement {
755
753
  (0, visitors_1.walk)(this, 'body', visitor, options);
756
754
  }
757
755
  }
756
+ getType(options) {
757
+ return this.getSymbolTable().getSymbolType(this.tokens.item.text, options);
758
+ }
759
+ getLeadingTrivia() {
760
+ var _a, _b;
761
+ return (_b = (_a = this.tokens.forEach) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
762
+ }
758
763
  }
759
764
  exports.ForEachStatement = ForEachStatement;
760
765
  class WhileStatement extends AstNode_2.Statement {
@@ -779,10 +784,8 @@ class WhileStatement extends AstNode_2.Statement {
779
784
  //body
780
785
  result.push(...this.body.transpile(state));
781
786
  state.lineage.shift();
782
- //trailing newline only if we have body statements
783
- result.push('\n');
784
787
  //end while
785
- result.push(state.indent(), state.transpileToken(this.tokens.endWhile, 'end while'));
788
+ result.push(...state.transpileEndBlockToken(this.body, this.tokens.endWhile, 'end while'));
786
789
  return result;
787
790
  }
788
791
  walk(visitor, options) {
@@ -793,6 +796,10 @@ class WhileStatement extends AstNode_2.Statement {
793
796
  (0, visitors_1.walk)(this, 'body', visitor, options);
794
797
  }
795
798
  }
799
+ getLeadingTrivia() {
800
+ var _a, _b;
801
+ return (_b = (_a = this.tokens.while) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
802
+ }
796
803
  }
797
804
  exports.WhileStatement = WhileStatement;
798
805
  class DottedSetStatement extends AstNode_2.Statement {
@@ -844,6 +851,9 @@ class DottedSetStatement extends AstNode_2.Statement {
844
851
  }));
845
852
  return result;
846
853
  }
854
+ getLeadingTrivia() {
855
+ return this.obj.getLeadingTrivia();
856
+ }
847
857
  }
848
858
  exports.DottedSetStatement = DottedSetStatement;
849
859
  class IndexedSetStatement extends AstNode_2.Statement {
@@ -891,6 +901,9 @@ class IndexedSetStatement extends AstNode_2.Statement {
891
901
  (0, visitors_1.walk)(this, 'value', visitor, options);
892
902
  }
893
903
  }
904
+ getLeadingTrivia() {
905
+ return this.obj.getLeadingTrivia();
906
+ }
894
907
  }
895
908
  exports.IndexedSetStatement = IndexedSetStatement;
896
909
  class LibraryStatement extends AstNode_2.Statement {
@@ -918,6 +931,10 @@ class LibraryStatement extends AstNode_2.Statement {
918
931
  walk(visitor, options) {
919
932
  //nothing to walk
920
933
  }
934
+ getLeadingTrivia() {
935
+ var _a, _b;
936
+ return (_b = (_a = this.tokens.library) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
937
+ }
921
938
  }
922
939
  exports.LibraryStatement = LibraryStatement;
923
940
  class NamespaceStatement extends AstNode_2.Statement {
@@ -937,9 +954,8 @@ class NamespaceStatement extends AstNode_2.Statement {
937
954
  return this.cacheRange();
938
955
  }
939
956
  cacheRange() {
940
- var _a;
941
957
  if (!this._range) {
942
- this._range = (_a = util_1.util.createBoundingRange(this.tokens.namespace, this.nameExpression, this.body, this.tokens.endNamespace)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
958
+ this._range = util_1.util.createBoundingRange(this.tokens.namespace, this.nameExpression, this.body, this.tokens.endNamespace);
943
959
  }
944
960
  return this._range;
945
961
  }
@@ -969,11 +985,12 @@ class NamespaceStatement extends AstNode_2.Statement {
969
985
  return this.body.transpile(state);
970
986
  }
971
987
  getTypedef(state) {
972
- let result = [
973
- 'namespace ',
974
- ...this.getName(Parser_1.ParseMode.BrighterScript),
975
- state.newline
976
- ];
988
+ var _a;
989
+ let result = [];
990
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
991
+ result.push(comment.text, state.newline, state.indent());
992
+ }
993
+ result.push('namespace ', ...this.getName(Parser_1.ParseMode.BrighterScript), state.newline);
977
994
  state.blockDepth++;
978
995
  result.push(...this.body.getTypedef(state));
979
996
  state.blockDepth--;
@@ -996,6 +1013,7 @@ class NamespaceStatement extends AstNode_2.Statement {
996
1013
  exports.NamespaceStatement = NamespaceStatement;
997
1014
  class ImportStatement extends AstNode_2.Statement {
998
1015
  constructor(options) {
1016
+ var _a;
999
1017
  super();
1000
1018
  this.kind = AstNode_1.AstNodeKind.ImportStatement;
1001
1019
  this.tokens = {
@@ -1006,8 +1024,10 @@ class ImportStatement extends AstNode_2.Statement {
1006
1024
  if (this.tokens.path) {
1007
1025
  //remove quotes
1008
1026
  this.filePath = this.tokens.path.text.replace(/"/g, '');
1009
- //adjust the range to exclude the quotes
1010
- this.tokens.path.range = util_1.util.createRange(this.tokens.path.range.start.line, this.tokens.path.range.start.character + 1, this.tokens.path.range.end.line, this.tokens.path.range.end.character - 1);
1027
+ if ((_a = this.tokens.path) === null || _a === void 0 ? void 0 : _a.range) {
1028
+ //adjust the range to exclude the quotes
1029
+ this.tokens.path.range = util_1.util.createRange(this.tokens.path.range.start.line, this.tokens.path.range.start.character + 1, this.tokens.path.range.end.line, this.tokens.path.range.end.character - 1);
1030
+ }
1011
1031
  }
1012
1032
  }
1013
1033
  transpile(state) {
@@ -1035,6 +1055,10 @@ class ImportStatement extends AstNode_2.Statement {
1035
1055
  walk(visitor, options) {
1036
1056
  //nothing to walk
1037
1057
  }
1058
+ getLeadingTrivia() {
1059
+ var _a, _b;
1060
+ return (_b = (_a = this.tokens.import) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
1061
+ }
1038
1062
  }
1039
1063
  exports.ImportStatement = ImportStatement;
1040
1064
  class InterfaceStatement extends AstNode_2.Statement {
@@ -1111,17 +1135,20 @@ class InterfaceStatement extends AstNode_2.Statement {
1111
1135
  return [];
1112
1136
  }
1113
1137
  getTypedef(state) {
1114
- var _a, _b, _c;
1138
+ var _a, _b, _c, _d;
1115
1139
  const result = [];
1116
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1140
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
1141
+ result.push(comment.text, state.newline, state.indent());
1142
+ }
1143
+ for (let annotation of (_b = this.annotations) !== null && _b !== void 0 ? _b : []) {
1117
1144
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1118
1145
  }
1119
1146
  result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
1120
- const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName();
1147
+ const parentInterfaceName = (_c = this.parentInterfaceName) === null || _c === void 0 ? void 0 : _c.getName();
1121
1148
  if (parentInterfaceName) {
1122
1149
  result.push(' extends ', parentInterfaceName);
1123
1150
  }
1124
- const body = (_c = this.body) !== null && _c !== void 0 ? _c : [];
1151
+ const body = (_d = this.body) !== null && _d !== void 0 ? _d : [];
1125
1152
  if (body.length > 0) {
1126
1153
  state.blockDepth++;
1127
1154
  }
@@ -1202,9 +1229,12 @@ class InterfaceFieldStatement extends AstNode_2.Statement {
1202
1229
  }
1203
1230
  }
1204
1231
  getTypedef(state) {
1205
- var _a;
1232
+ var _a, _b;
1206
1233
  const result = [];
1207
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1234
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
1235
+ result.push(comment.text, state.newline, state.indent());
1236
+ }
1237
+ for (let annotation of (_b = this.annotations) !== null && _b !== void 0 ? _b : []) {
1208
1238
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1209
1239
  }
1210
1240
  if (this.isOptional) {
@@ -1266,16 +1296,19 @@ class InterfaceMethodStatement extends AstNode_2.Statement {
1266
1296
  }
1267
1297
  }
1268
1298
  getTypedef(state) {
1269
- var _a, _b, _c, _d;
1299
+ var _a, _b, _c, _d, _e;
1270
1300
  const result = [];
1271
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1301
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
1302
+ result.push(comment.text, state.newline, state.indent());
1303
+ }
1304
+ for (let annotation of (_b = this.annotations) !== null && _b !== void 0 ? _b : []) {
1272
1305
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1273
1306
  }
1274
1307
  if (this.isOptional) {
1275
1308
  result.push(this.tokens.optional.text, ' ');
1276
1309
  }
1277
- result.push((_c = (_b = this.tokens.functionType) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'function', ' ', this.tokens.name.text, '(');
1278
- const params = (_d = this.params) !== null && _d !== void 0 ? _d : [];
1310
+ result.push((_d = (_c = this.tokens.functionType) === null || _c === void 0 ? void 0 : _c.text) !== null && _d !== void 0 ? _d : 'function', ' ', this.tokens.name.text, '(');
1311
+ const params = (_e = this.params) !== null && _e !== void 0 ? _e : [];
1279
1312
  for (let i = 0; i < params.length; i++) {
1280
1313
  if (i > 0) {
1281
1314
  result.push(', ');
@@ -1379,9 +1412,12 @@ class ClassStatement extends AstNode_2.Statement {
1379
1412
  return result;
1380
1413
  }
1381
1414
  getTypedef(state) {
1382
- var _a;
1415
+ var _a, _b;
1383
1416
  const result = [];
1384
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1417
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
1418
+ result.push(comment.text, state.newline, state.indent());
1419
+ }
1420
+ for (let annotation of (_b = this.annotations) !== null && _b !== void 0 ? _b : []) {
1385
1421
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1386
1422
  }
1387
1423
  result.push('class ', this.tokens.name.text);
@@ -1573,7 +1609,7 @@ class ClassStatement extends AstNode_2.Statement {
1573
1609
  let result = [];
1574
1610
  const constructorFunction = this.getConstructorFunction();
1575
1611
  const constructorParams = constructorFunction ? constructorFunction.func.parameters : [];
1576
- result.push(state.sourceNode(this, 'function'), state.sourceNode(this, ' '), state.sourceNode(this.tokens.name, this.getName(Parser_1.ParseMode.BrightScript)), `(`);
1612
+ result.push(state.sourceNode(this.tokens.class, 'function'), state.sourceNode(this.tokens.class, ' '), state.sourceNode(this.tokens.name, this.getName(Parser_1.ParseMode.BrightScript)), `(`);
1577
1613
  let i = 0;
1578
1614
  for (let param of constructorParams) {
1579
1615
  if (i > 0) {
@@ -1711,9 +1747,12 @@ class MethodStatement extends FunctionStatement {
1711
1747
  return this.func.transpile(state);
1712
1748
  }
1713
1749
  getTypedef(state) {
1714
- var _a;
1750
+ var _a, _b;
1715
1751
  const result = [];
1716
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1752
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
1753
+ result.push(comment.text, state.newline, state.indent());
1754
+ }
1755
+ for (let annotation of (_b = this.annotations) !== null && _b !== void 0 ? _b : []) {
1717
1756
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1718
1757
  }
1719
1758
  if (this.accessModifier) {
@@ -1736,10 +1775,11 @@ class MethodStatement extends FunctionStatement {
1736
1775
  }
1737
1776
  //check whether any calls to super exist
1738
1777
  let containsSuperCall = this.func.body.statements.findIndex((x) => {
1778
+ var _a;
1739
1779
  //is a call statement
1740
1780
  return (0, reflection_1.isExpressionStatement)(x) && (0, reflection_1.isCallExpression)(x.expression) &&
1741
1781
  //is a call to super
1742
- util_1.util.findBeginningVariableExpression(x.expression.callee).tokens.name.text.toLowerCase() === 'super';
1782
+ ((_a = util_1.util.findBeginningVariableExpression(x.expression.callee).tokens.name) === null || _a === void 0 ? void 0 : _a.text.toLowerCase()) === 'super';
1743
1783
  }) !== -1;
1744
1784
  //if a call to super exists, quit here
1745
1785
  if (containsSuperCall) {
@@ -1783,12 +1823,13 @@ class MethodStatement extends FunctionStatement {
1783
1823
  * Inject field initializers at the top of the `new` function (after any present `super()` call)
1784
1824
  */
1785
1825
  injectFieldInitializersForConstructor(state) {
1826
+ var _a;
1786
1827
  let startingIndex = state.classStatement.hasParentClass() ? 1 : 0;
1787
1828
  let newStatements = [];
1788
1829
  //insert the field initializers in order
1789
1830
  for (let field of state.classStatement.fields) {
1790
1831
  let thisQualifiedName = Object.assign({}, field.tokens.name);
1791
- thisQualifiedName.text = 'm.' + field.tokens.name.text;
1832
+ thisQualifiedName.text = 'm.' + ((_a = field.tokens.name) === null || _a === void 0 ? void 0 : _a.text);
1792
1833
  const fieldAssignment = field.initialValue
1793
1834
  ? new AssignmentStatement({
1794
1835
  equals: field.tokens.equals,
@@ -1848,21 +1889,24 @@ class FieldStatement extends AstNode_2.Statement {
1848
1889
  throw new Error('transpile not implemented for ' + Object.getPrototypeOf(this).constructor.name);
1849
1890
  }
1850
1891
  getTypedef(state) {
1851
- var _a, _b, _c, _d;
1892
+ var _a, _b, _c, _d, _e;
1852
1893
  const result = [];
1853
1894
  if (this.tokens.name) {
1854
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1895
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
1896
+ result.push(comment.text, state.newline, state.indent());
1897
+ }
1898
+ for (let annotation of (_b = this.annotations) !== null && _b !== void 0 ? _b : []) {
1855
1899
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1856
1900
  }
1857
1901
  let type = this.getType({ flags: 2 /* SymbolTypeFlag.typetime */ });
1858
1902
  if ((0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
1859
1903
  type = new DynamicType_1.DynamicType();
1860
1904
  }
1861
- result.push((_c = (_b = this.tokens.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' ');
1905
+ result.push((_d = (_c = this.tokens.accessModifier) === null || _c === void 0 ? void 0 : _c.text) !== null && _d !== void 0 ? _d : 'public', ' ');
1862
1906
  if (this.isOptional) {
1863
1907
  result.push(this.tokens.optional.text, ' ');
1864
1908
  }
1865
- result.push((_d = this.tokens.name) === null || _d === void 0 ? void 0 : _d.text, ' as ', type.toTypeString());
1909
+ result.push((_e = this.tokens.name) === null || _e === void 0 ? void 0 : _e.text, ' as ', type.toTypeString());
1866
1910
  }
1867
1911
  return result;
1868
1912
  }
@@ -1905,6 +1949,10 @@ class TryCatchStatement extends AstNode_2.Statement {
1905
1949
  (0, visitors_1.walk)(this, 'catchStatement', visitor, options);
1906
1950
  }
1907
1951
  }
1952
+ getLeadingTrivia() {
1953
+ var _a, _b;
1954
+ return (_b = (_a = this.tokens.try) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
1955
+ }
1908
1956
  }
1909
1957
  exports.TryCatchStatement = TryCatchStatement;
1910
1958
  class CatchStatement extends AstNode_2.Statement {
@@ -1932,6 +1980,10 @@ class CatchStatement extends AstNode_2.Statement {
1932
1980
  (0, visitors_1.walk)(this, 'catchBranch', visitor, options);
1933
1981
  }
1934
1982
  }
1983
+ getLeadingTrivia() {
1984
+ var _a, _b;
1985
+ return (_b = (_a = this.tokens.catch) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
1986
+ }
1935
1987
  }
1936
1988
  exports.CatchStatement = CatchStatement;
1937
1989
  class ThrowStatement extends AstNode_2.Statement {
@@ -1955,7 +2007,7 @@ class ThrowStatement extends AstNode_2.Statement {
1955
2007
  //no expression found. Rather than emit syntax errors, provide a generic error message
1956
2008
  }
1957
2009
  else {
1958
- result.push('"An error has occurred"');
2010
+ result.push('"User-specified exception"');
1959
2011
  }
1960
2012
  return result;
1961
2013
  }
@@ -1964,6 +2016,10 @@ class ThrowStatement extends AstNode_2.Statement {
1964
2016
  (0, visitors_1.walk)(this, 'expression', visitor, options);
1965
2017
  }
1966
2018
  }
2019
+ getLeadingTrivia() {
2020
+ var _a, _b;
2021
+ return (_b = (_a = this.tokens.throw) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
2022
+ }
1967
2023
  }
1968
2024
  exports.ThrowStatement = ThrowStatement;
1969
2025
  class EnumStatement extends AstNode_2.Statement {
@@ -1992,7 +2048,8 @@ class EnumStatement extends AstNode_2.Statement {
1992
2048
  return result;
1993
2049
  }
1994
2050
  getLeadingTrivia() {
1995
- return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.enum.leadingTrivia);
2051
+ var _a;
2052
+ return util_1.util.concatAnnotationLeadingTrivia(this, (_a = this.tokens.enum) === null || _a === void 0 ? void 0 : _a.leadingTrivia);
1996
2053
  }
1997
2054
  /**
1998
2055
  * Get a map of member names and their values.
@@ -2066,12 +2123,15 @@ class EnumStatement extends AstNode_2.Statement {
2066
2123
  return [];
2067
2124
  }
2068
2125
  getTypedef(state) {
2069
- var _a, _b, _c, _d, _e;
2126
+ var _a, _b, _c, _d, _e, _f;
2070
2127
  const result = [];
2071
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
2128
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
2129
+ result.push(comment.text, state.newline, state.indent());
2130
+ }
2131
+ for (let annotation of (_b = this.annotations) !== null && _b !== void 0 ? _b : []) {
2072
2132
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
2073
2133
  }
2074
- result.push((_c = (_b = this.tokens.enum) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'enum', ' ', this.tokens.name.text);
2134
+ result.push((_d = (_c = this.tokens.enum) === null || _c === void 0 ? void 0 : _c.text) !== null && _d !== void 0 ? _d : 'enum', ' ', this.tokens.name.text);
2075
2135
  result.push(state.newline);
2076
2136
  state.blockDepth++;
2077
2137
  for (const member of this.body) {
@@ -2080,7 +2140,7 @@ class EnumStatement extends AstNode_2.Statement {
2080
2140
  }
2081
2141
  }
2082
2142
  state.blockDepth--;
2083
- result.push(state.indent(), (_e = (_d = this.tokens.endEnum) === null || _d === void 0 ? void 0 : _d.text) !== null && _e !== void 0 ? _e : 'end enum');
2143
+ result.push(state.indent(), (_f = (_e = this.tokens.endEnum) === null || _e === void 0 ? void 0 : _e.text) !== null && _f !== void 0 ? _f : 'end enum');
2084
2144
  return result;
2085
2145
  }
2086
2146
  walk(visitor, options) {
@@ -2126,9 +2186,12 @@ class EnumMemberStatement extends AstNode_2.Statement {
2126
2186
  return [];
2127
2187
  }
2128
2188
  getTypedef(state) {
2129
- const result = [
2130
- this.tokens.name.text
2131
- ];
2189
+ var _a;
2190
+ const result = [];
2191
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
2192
+ result.push(comment.text, state.newline, state.indent());
2193
+ }
2194
+ result.push(this.tokens.name.text);
2132
2195
  if (this.tokens.equals) {
2133
2196
  result.push(' ', this.tokens.equals.text, ' ');
2134
2197
  if (this.value) {
@@ -2164,7 +2227,8 @@ class ConstStatement extends AstNode_2.Statement {
2164
2227
  return this.tokens.name.text;
2165
2228
  }
2166
2229
  getLeadingTrivia() {
2167
- return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.const.leadingTrivia);
2230
+ var _a;
2231
+ return util_1.util.concatAnnotationLeadingTrivia(this, (_a = this.tokens.const) === null || _a === void 0 ? void 0 : _a.leadingTrivia);
2168
2232
  }
2169
2233
  /**
2170
2234
  * The name of the statement WITH its leading namespace (if applicable)
@@ -2192,15 +2256,13 @@ class ConstStatement extends AstNode_2.Statement {
2192
2256
  return [];
2193
2257
  }
2194
2258
  getTypedef(state) {
2195
- return [
2196
- this.tokens.const ? state.tokenToSourceNode(this.tokens.const) : 'const',
2197
- ' ',
2198
- state.tokenToSourceNode(this.tokens.name),
2199
- ' ',
2200
- this.tokens.equals ? state.tokenToSourceNode(this.tokens.equals) : '=',
2201
- ' ',
2202
- ...this.value.transpile(state)
2203
- ];
2259
+ var _a;
2260
+ const result = [];
2261
+ for (let comment of (_a = util_1.util.getLeadingComments(this)) !== null && _a !== void 0 ? _a : []) {
2262
+ result.push(comment.text, state.newline, state.indent());
2263
+ }
2264
+ result.push(this.tokens.const ? state.tokenToSourceNode(this.tokens.const) : 'const', ' ', state.tokenToSourceNode(this.tokens.name), ' ', this.tokens.equals ? state.tokenToSourceNode(this.tokens.equals) : '=', ' ', ...this.value.transpile(state));
2265
+ return result;
2204
2266
  }
2205
2267
  walk(visitor, options) {
2206
2268
  if (this.value && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
@@ -2233,6 +2295,10 @@ class ContinueStatement extends AstNode_2.Statement {
2233
2295
  walk(visitor, options) {
2234
2296
  //nothing to walk
2235
2297
  }
2298
+ getLeadingTrivia() {
2299
+ var _a, _b;
2300
+ return (_b = (_a = this.tokens.continue) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : [];
2301
+ }
2236
2302
  }
2237
2303
  exports.ContinueStatement = ContinueStatement;
2238
2304
  //# sourceMappingURL=Statement.js.map