brighterscript 1.0.0-alpha.26 → 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 (200) hide show
  1. package/CHANGELOG.md +82 -5
  2. package/README.md +1 -1
  3. package/dist/AstValidationSegmenter.d.ts +1 -1
  4. package/dist/AstValidationSegmenter.js +4 -5
  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 -3
  10. package/dist/DiagnosticMessages.js +5 -8
  11. package/dist/DiagnosticMessages.js.map +1 -1
  12. package/dist/PluginInterface.js +1 -1
  13. package/dist/PluginInterface.js.map +1 -1
  14. package/dist/Program.d.ts +1 -1
  15. package/dist/Program.js +34 -31
  16. package/dist/Program.js.map +1 -1
  17. package/dist/Scope.d.ts +7 -34
  18. package/dist/Scope.js +45 -305
  19. package/dist/Scope.js.map +1 -1
  20. package/dist/SymbolTable.d.ts +1 -8
  21. package/dist/SymbolTable.js +1 -10
  22. package/dist/SymbolTable.js.map +1 -1
  23. package/dist/SymbolTypeFlag.d.ts +8 -0
  24. package/dist/SymbolTypeFlag.js +13 -0
  25. package/dist/SymbolTypeFlag.js.map +1 -0
  26. package/dist/XmlScope.d.ts +0 -8
  27. package/dist/XmlScope.js +6 -84
  28. package/dist/XmlScope.js.map +1 -1
  29. package/dist/astUtils/CachedLookups.d.ts +1 -2
  30. package/dist/astUtils/CachedLookups.js +4 -19
  31. package/dist/astUtils/CachedLookups.js.map +1 -1
  32. package/dist/astUtils/creators.d.ts +1 -0
  33. package/dist/astUtils/creators.js +48 -8
  34. package/dist/astUtils/creators.js.map +1 -1
  35. package/dist/astUtils/creators.spec.js +0 -10
  36. package/dist/astUtils/creators.spec.js.map +1 -1
  37. package/dist/astUtils/reflection.d.ts +3 -2
  38. package/dist/astUtils/reflection.js +11 -7
  39. package/dist/astUtils/reflection.js.map +1 -1
  40. package/dist/astUtils/reflection.spec.js +11 -16
  41. package/dist/astUtils/reflection.spec.js.map +1 -1
  42. package/dist/astUtils/visitors.d.ts +1 -2
  43. package/dist/astUtils/visitors.js.map +1 -1
  44. package/dist/astUtils/visitors.spec.js +1 -5
  45. package/dist/astUtils/visitors.spec.js.map +1 -1
  46. package/dist/bscPlugin/BscPlugin.d.ts +2 -1
  47. package/dist/bscPlugin/BscPlugin.js +4 -0
  48. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  49. package/dist/bscPlugin/SignatureHelpUtil.js +4 -3
  50. package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -1
  51. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +1 -0
  52. package/dist/bscPlugin/completions/CompletionsProcessor.js +46 -29
  53. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
  54. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +39 -0
  55. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -1
  56. package/dist/bscPlugin/hover/HoverProcessor.d.ts +1 -0
  57. package/dist/bscPlugin/hover/HoverProcessor.js +30 -10
  58. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  59. package/dist/bscPlugin/hover/HoverProcessor.spec.js +125 -7
  60. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  61. package/dist/bscPlugin/references/ReferencesProvider.d.ts +12 -0
  62. package/dist/bscPlugin/references/ReferencesProvider.js +56 -0
  63. package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -0
  64. package/dist/bscPlugin/references/ReferencesProvider.spec.d.ts +1 -0
  65. package/dist/bscPlugin/references/ReferencesProvider.spec.js +51 -0
  66. package/dist/bscPlugin/references/ReferencesProvider.spec.js.map +1 -0
  67. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +2 -3
  68. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  69. package/dist/bscPlugin/validation/BrsFileValidator.js +25 -31
  70. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  71. package/dist/bscPlugin/validation/ScopeValidator.d.ts +34 -1
  72. package/dist/bscPlugin/validation/ScopeValidator.js +435 -27
  73. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  74. package/dist/bscPlugin/validation/ScopeValidator.spec.js +178 -10
  75. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -1
  76. package/dist/diagnosticUtils.d.ts +1 -1
  77. package/dist/files/BrsFile.Class.spec.js +15 -7
  78. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  79. package/dist/files/BrsFile.d.ts +14 -5
  80. package/dist/files/BrsFile.js +83 -150
  81. package/dist/files/BrsFile.js.map +1 -1
  82. package/dist/files/BrsFile.spec.js +429 -162
  83. package/dist/files/BrsFile.spec.js.map +1 -1
  84. package/dist/files/XmlFile.d.ts +2 -3
  85. package/dist/files/XmlFile.js +1 -3
  86. package/dist/files/XmlFile.js.map +1 -1
  87. package/dist/index.d.ts +1 -0
  88. package/dist/index.js +1 -0
  89. package/dist/index.js.map +1 -1
  90. package/dist/interfaces.d.ts +117 -85
  91. package/dist/interfaces.js +9 -9
  92. package/dist/interfaces.js.map +1 -1
  93. package/dist/lexer/Lexer.d.ts +9 -3
  94. package/dist/lexer/Lexer.js +36 -15
  95. package/dist/lexer/Lexer.js.map +1 -1
  96. package/dist/lexer/Lexer.spec.js +76 -38
  97. package/dist/lexer/Lexer.spec.js.map +1 -1
  98. package/dist/lexer/Token.js +1 -1
  99. package/dist/lexer/Token.js.map +1 -1
  100. package/dist/lexer/TokenKind.d.ts +1 -0
  101. package/dist/lexer/TokenKind.js +4 -1
  102. package/dist/lexer/TokenKind.js.map +1 -1
  103. package/dist/parser/AstNode.d.ts +1 -2
  104. package/dist/parser/AstNode.js +0 -1
  105. package/dist/parser/AstNode.js.map +1 -1
  106. package/dist/parser/BrsTranspileState.d.ts +1 -1
  107. package/dist/parser/Expression.d.ts +153 -135
  108. package/dist/parser/Expression.js +204 -114
  109. package/dist/parser/Expression.js.map +1 -1
  110. package/dist/parser/Parser.Class.spec.js +15 -16
  111. package/dist/parser/Parser.Class.spec.js.map +1 -1
  112. package/dist/parser/Parser.d.ts +8 -4
  113. package/dist/parser/Parser.js +108 -149
  114. package/dist/parser/Parser.js.map +1 -1
  115. package/dist/parser/Parser.spec.js +48 -72
  116. package/dist/parser/Parser.spec.js.map +1 -1
  117. package/dist/parser/SGParser.js +49 -35
  118. package/dist/parser/SGParser.js.map +1 -1
  119. package/dist/parser/SGTypes.d.ts +36 -24
  120. package/dist/parser/SGTypes.js +31 -60
  121. package/dist/parser/SGTypes.js.map +1 -1
  122. package/dist/parser/Statement.d.ts +214 -207
  123. package/dist/parser/Statement.js +248 -169
  124. package/dist/parser/Statement.js.map +1 -1
  125. package/dist/parser/Statement.spec.js +0 -13
  126. package/dist/parser/Statement.spec.js.map +1 -1
  127. package/dist/parser/TranspileState.d.ts +17 -8
  128. package/dist/parser/TranspileState.js +64 -6
  129. package/dist/parser/TranspileState.js.map +1 -1
  130. package/dist/parser/tests/Parser.spec.d.ts +1 -1
  131. package/dist/parser/tests/Parser.spec.js +1 -2
  132. package/dist/parser/tests/Parser.spec.js.map +1 -1
  133. package/dist/parser/tests/controlFlow/If.spec.js +1 -1
  134. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  135. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +1 -3
  136. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  137. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +44 -0
  138. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  139. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +6 -6
  140. package/dist/parser/tests/expression/TernaryExpression.spec.js +47 -0
  141. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  142. package/dist/parser/tests/expression/TypeExpression.spec.js +8 -9
  143. package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -1
  144. package/dist/parser/tests/statement/ConstStatement.spec.js +2 -2
  145. package/dist/parser/tests/statement/InterfaceStatement.spec.js +8 -1
  146. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  147. package/dist/parser/tests/statement/Misc.spec.js +25 -5
  148. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  149. package/dist/parser/tests/statement/TryCatch.spec.js +9 -2
  150. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  151. package/dist/preprocessor/Chunk.js +1 -2
  152. package/dist/preprocessor/Chunk.js.map +1 -1
  153. package/dist/preprocessor/PreprocessorParser.js +2 -1
  154. package/dist/preprocessor/PreprocessorParser.js.map +1 -1
  155. package/dist/roku-types/data.json +70 -52
  156. package/dist/roku-types/index.d.ts +43 -21
  157. package/dist/types/ArrayType.js +1 -2
  158. package/dist/types/ArrayType.js.map +1 -1
  159. package/dist/types/ArrayType.spec.js +7 -8
  160. package/dist/types/ArrayType.spec.js.map +1 -1
  161. package/dist/types/AssociativeArrayType.d.ts +3 -0
  162. package/dist/types/AssociativeArrayType.js +10 -2
  163. package/dist/types/AssociativeArrayType.js.map +1 -1
  164. package/dist/types/BscType.d.ts +1 -1
  165. package/dist/types/BscType.js +3 -3
  166. package/dist/types/BscType.js.map +1 -1
  167. package/dist/types/BuiltInInterfaceAdder.js +7 -8
  168. package/dist/types/BuiltInInterfaceAdder.js.map +1 -1
  169. package/dist/types/BuiltInInterfaceAdder.spec.js +31 -32
  170. package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -1
  171. package/dist/types/ClassType.spec.js +10 -11
  172. package/dist/types/ClassType.spec.js.map +1 -1
  173. package/dist/types/ComponentType.d.ts +2 -1
  174. package/dist/types/ComponentType.js.map +1 -1
  175. package/dist/types/EnumType.js +2 -3
  176. package/dist/types/EnumType.js.map +1 -1
  177. package/dist/types/InheritableType.js +3 -4
  178. package/dist/types/InheritableType.js.map +1 -1
  179. package/dist/types/InterfaceType.js +2 -3
  180. package/dist/types/InterfaceType.js.map +1 -1
  181. package/dist/types/InterfaceType.spec.js +3 -4
  182. package/dist/types/InterfaceType.spec.js.map +1 -1
  183. package/dist/types/ObjectType.js +1 -2
  184. package/dist/types/ObjectType.js.map +1 -1
  185. package/dist/types/ReferenceType.d.ts +1 -1
  186. package/dist/types/ReferenceType.spec.js +21 -22
  187. package/dist/types/ReferenceType.spec.js.map +1 -1
  188. package/dist/types/UnionType.js +3 -3
  189. package/dist/types/UnionType.js.map +1 -1
  190. package/dist/types/UnionType.spec.js +37 -38
  191. package/dist/types/UnionType.spec.js.map +1 -1
  192. package/dist/types/helper.spec.js +4 -5
  193. package/dist/types/helper.spec.js.map +1 -1
  194. package/dist/util.d.ts +21 -11
  195. package/dist/util.js +116 -37
  196. package/dist/util.js.map +1 -1
  197. package/dist/validators/ClassValidator.d.ts +0 -9
  198. package/dist/validators/ClassValidator.js +3 -46
  199. package/dist/validators/ClassValidator.js.map +1 -1
  200. package/package.json +6 -3
@@ -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");
@@ -8,10 +8,9 @@ const Parser_1 = require("./Parser");
8
8
  const visitors_1 = require("../astUtils/visitors");
9
9
  const reflection_1 = require("../astUtils/reflection");
10
10
  const interfaces_1 = require("../interfaces");
11
- const SymbolTable_1 = require("../SymbolTable");
12
11
  const creators_1 = require("../astUtils/creators");
13
12
  const DynamicType_1 = require("../types/DynamicType");
14
- const SymbolTable_2 = require("../SymbolTable");
13
+ const SymbolTable_1 = require("../SymbolTable");
15
14
  const AstNode_1 = require("./AstNode");
16
15
  const AstNode_2 = require("./AstNode");
17
16
  const ClassType_1 = require("../types/ClassType");
@@ -20,13 +19,12 @@ const NamespaceType_1 = require("../types/NamespaceType");
20
19
  const InterfaceType_1 = require("../types/InterfaceType");
21
20
  const VoidType_1 = require("../types/VoidType");
22
21
  const TypedFunctionType_1 = require("../types/TypedFunctionType");
23
- const types_1 = require("../types");
22
+ const ArrayType_1 = require("../types/ArrayType");
24
23
  class EmptyStatement extends AstNode_2.Statement {
25
24
  constructor(options) {
26
- var _a;
27
25
  super();
28
26
  this.kind = AstNode_1.AstNodeKind.EmptyStatement;
29
- this.range = (_a = options === null || options === void 0 ? void 0 : options.range) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
27
+ this.range = undefined;
30
28
  }
31
29
  transpile(state) {
32
30
  return [];
@@ -45,7 +43,7 @@ class Body extends AstNode_2.Statement {
45
43
  super();
46
44
  this.statements = [];
47
45
  this.kind = AstNode_1.AstNodeKind.Body;
48
- this.symbolTable = new SymbolTable_2.SymbolTable('Body', () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
46
+ this.symbolTable = new SymbolTable_1.SymbolTable('Body', () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
49
47
  this.statements = (_a = options === null || options === void 0 ? void 0 : options.statements) !== null && _a !== void 0 ? _a : [];
50
48
  }
51
49
  get range() {
@@ -54,6 +52,7 @@ class Body extends AstNode_2.Statement {
54
52
  return util_1.util.createBoundingRange(...((_a = this.statements) !== null && _a !== void 0 ? _a : []));
55
53
  }
56
54
  transpile(state) {
55
+ var _a, _b, _c, _d;
57
56
  let result = [];
58
57
  for (let i = 0; i < this.statements.length; i++) {
59
58
  let statement = this.statements[i];
@@ -63,20 +62,20 @@ class Body extends AstNode_2.Statement {
63
62
  //this is the first statement. do nothing related to spacing and newlines
64
63
  //if comment is on same line as prior sibling
65
64
  }
66
- 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)) {
67
66
  result.push(' ');
68
67
  //add double newline if this is a comment, and next is a function
69
68
  }
70
- else if ((0, reflection_1.isCommentStatement)(statement) && nextStatement && (0, reflection_1.isFunctionStatement)(nextStatement)) {
71
- 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);
72
71
  //add double newline if is function not preceeded by a comment
73
72
  }
74
- else if ((0, reflection_1.isFunctionStatement)(statement) && previousStatement && !((0, reflection_1.isCommentStatement)(previousStatement))) {
75
- 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);
76
75
  }
77
76
  else {
78
77
  //separate statements by a single newline
79
- result.push('\n');
78
+ result.push(state.newline);
80
79
  }
81
80
  result.push(...statement.transpile(state));
82
81
  }
@@ -130,7 +129,7 @@ class AssignmentStatement extends AstNode_2.Statement {
130
129
  }
131
130
  walk(visitor, options) {
132
131
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
133
- //TODO: Walk TypeExpression. We need to decide how to implement types on assignments
132
+ (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
134
133
  (0, visitors_1.walk)(this, 'value', visitor, options);
135
134
  }
136
135
  }
@@ -139,9 +138,13 @@ class AssignmentStatement extends AstNode_2.Statement {
139
138
  const variableType = (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(Object.assign(Object.assign({}, options), { typeChain: undefined }))) !== null && _b !== void 0 ? _b : this.value.getType(Object.assign(Object.assign({}, options), { typeChain: undefined }));
140
139
  // Note: compound assignments (eg. +=) are internally dealt with via the RHS being a BinaryExpression
141
140
  // so this.value will be a BinaryExpression, and BinaryExpressions can figure out their own types
142
- (_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry(this.tokens.name.text, variableType, options.data, this.tokens.name.range));
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 }));
143
142
  return variableType;
144
143
  }
144
+ getLeadingTrivia() {
145
+ var _a;
146
+ return (_a = this.tokens.name.leadingTrivia) !== null && _a !== void 0 ? _a : [];
147
+ }
145
148
  }
146
149
  exports.AssignmentStatement = AssignmentStatement;
147
150
  class Block extends AstNode_2.Statement {
@@ -151,7 +154,7 @@ class Block extends AstNode_2.Statement {
151
154
  this.kind = AstNode_1.AstNodeKind.Block;
152
155
  this.statements = options.statements;
153
156
  this.startingRange = options.startingRange;
154
- this.range = util_1.util.createBoundingRange({ range: this.startingRange }, ...((_a = this.statements) !== null && _a !== void 0 ? _a : []));
157
+ this.range = util_1.util.createBoundingRange(this.startingRange, ...((_a = this.statements) !== null && _a !== void 0 ? _a : []));
155
158
  }
156
159
  transpile(state) {
157
160
  state.blockDepth++;
@@ -159,9 +162,10 @@ class Block extends AstNode_2.Statement {
159
162
  for (let i = 0; i < this.statements.length; i++) {
160
163
  let previousStatement = this.statements[i - 1];
161
164
  let statement = this.statements[i];
165
+ //is not a comment
162
166
  //if comment is on same line as parent
163
- if ((0, reflection_1.isCommentStatement)(statement) &&
164
- (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)) {
165
169
  results.push(' ');
166
170
  //is not a comment
167
171
  }
@@ -199,47 +203,11 @@ class ExpressionStatement extends AstNode_2.Statement {
199
203
  (0, visitors_1.walk)(this, 'expression', visitor, options);
200
204
  }
201
205
  }
202
- }
203
- exports.ExpressionStatement = ExpressionStatement;
204
- class CommentStatement extends AstNode_2.Statement {
205
- constructor(options) {
206
- var _a;
207
- super();
208
- this.kind = AstNode_1.AstNodeKind.CommentStatement;
209
- this.visitMode = visitors_1.InternalWalkMode.visitStatements | visitors_1.InternalWalkMode.visitExpressions;
210
- this.tokens = {
211
- comments: options.comments
212
- };
213
- if (((_a = this.tokens.comments) === null || _a === void 0 ? void 0 : _a.length) > 0) {
214
- this.range = util_1.util.createBoundingRange(...this.tokens.comments);
215
- }
216
- }
217
- get text() {
218
- return this.tokens.comments.map(x => x.text).join('\n');
219
- }
220
- transpile(state) {
221
- let result = [];
222
- for (let i = 0; i < this.tokens.comments.length; i++) {
223
- let comment = this.tokens.comments[i];
224
- if (i > 0) {
225
- result.push(state.indent());
226
- }
227
- result.push(state.transpileToken(comment));
228
- //add newline for all except final comment
229
- if (i < this.tokens.comments.length - 1) {
230
- result.push('\n');
231
- }
232
- }
233
- return result;
234
- }
235
- getTypedef(state) {
236
- return this.transpile(state);
237
- }
238
- walk(visitor, options) {
239
- //nothing to walk
206
+ getLeadingTrivia() {
207
+ return this.expression.getLeadingTrivia();
240
208
  }
241
209
  }
242
- exports.CommentStatement = CommentStatement;
210
+ exports.ExpressionStatement = ExpressionStatement;
243
211
  class ExitForStatement extends AstNode_2.Statement {
244
212
  constructor(options) {
245
213
  var _a;
@@ -251,13 +219,15 @@ class ExitForStatement extends AstNode_2.Statement {
251
219
  this.range = (_a = this.tokens.exitFor) === null || _a === void 0 ? void 0 : _a.range;
252
220
  }
253
221
  transpile(state) {
254
- return [
255
- this.tokens.exitFor ? state.transpileToken(this.tokens.exitFor) : 'exit for'
256
- ];
222
+ return this.tokens.exitFor ? state.transpileToken(this.tokens.exitFor) : ['exit for'];
257
223
  }
258
224
  walk(visitor, options) {
259
225
  //nothing to walk
260
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
+ }
261
231
  }
262
232
  exports.ExitForStatement = ExitForStatement;
263
233
  class ExitWhileStatement extends AstNode_2.Statement {
@@ -271,23 +241,28 @@ class ExitWhileStatement extends AstNode_2.Statement {
271
241
  this.range = (_a = this.tokens.exitWhile) === null || _a === void 0 ? void 0 : _a.range;
272
242
  }
273
243
  transpile(state) {
274
- return [
275
- this.tokens.exitWhile ? state.transpileToken(this.tokens.exitWhile) : 'exit while'
276
- ];
244
+ return this.tokens.exitWhile ? state.transpileToken(this.tokens.exitWhile) : ['exit while'];
277
245
  }
278
246
  walk(visitor, options) {
279
247
  //nothing to walk
280
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
+ }
281
253
  }
282
254
  exports.ExitWhileStatement = ExitWhileStatement;
283
255
  class FunctionStatement extends AstNode_2.Statement {
284
256
  constructor(options) {
257
+ var _a;
285
258
  super();
286
259
  this.kind = AstNode_1.AstNodeKind.FunctionStatement;
287
260
  this.tokens = {
288
261
  name: options.name
289
262
  };
290
263
  this.func = options.func;
264
+ this.func.symbolTable.name += `: '${(_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text}'`;
265
+ this.func.functionStatement = this;
291
266
  this.range = this.func.range;
292
267
  }
293
268
  /**
@@ -314,9 +289,12 @@ class FunctionStatement extends AstNode_2.Statement {
314
289
  return this.func.transpile(state, nameToken);
315
290
  }
316
291
  getTypedef(state) {
317
- var _a;
292
+ var _a, _b;
318
293
  let result = [];
319
- 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 : []) {
320
298
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
321
299
  }
322
300
  result.push(...this.func.getTypedef(state));
@@ -352,7 +330,7 @@ class IfStatement extends AstNode_2.Statement {
352
330
  this.range = util_1.util.createBoundingRange(util_1.util.createBoundingRangeFromTokens(this.tokens), this.condition, this.thenBranch, this.elseBranch);
353
331
  }
354
332
  transpile(state) {
355
- var _a;
333
+ var _a, _b;
356
334
  let results = [];
357
335
  //if (already indented by block)
358
336
  results.push(state.transpileToken((_a = this.tokens.if) !== null && _a !== void 0 ? _a : (0, creators_1.createToken)(TokenKind_1.TokenKind.If)));
@@ -371,13 +349,10 @@ class IfStatement extends AstNode_2.Statement {
371
349
  if (thenNodes.length > 0) {
372
350
  results.push(thenNodes);
373
351
  }
374
- results.push('\n');
375
352
  //else branch
376
- if (this.tokens.else) {
377
- //else
378
- results.push(state.indent(), state.transpileToken(this.tokens.else));
379
- }
380
353
  if (this.elseBranch) {
354
+ //else
355
+ results.push(...state.transpileEndBlockToken(this.thenBranch, this.tokens.else, 'else'));
381
356
  if ((0, reflection_1.isIfStatement)(this.elseBranch)) {
382
357
  //chained elseif
383
358
  state.lineage.unshift(this.elseBranch);
@@ -402,17 +377,10 @@ class IfStatement extends AstNode_2.Statement {
402
377
  if (body.length > 0) {
403
378
  results.push(...body);
404
379
  }
405
- results.push('\n');
406
380
  }
407
381
  }
408
382
  //end if
409
- results.push(state.indent());
410
- if (this.tokens.endIf) {
411
- results.push(state.transpileToken(this.tokens.endIf));
412
- }
413
- else {
414
- results.push('end if');
415
- }
383
+ results.push(...state.transpileEndBlockToken((_b = this.elseBranch) !== null && _b !== void 0 ? _b : this.thenBranch, this.tokens.endIf, 'end if'));
416
384
  return results;
417
385
  }
418
386
  walk(visitor, options) {
@@ -426,6 +394,10 @@ class IfStatement extends AstNode_2.Statement {
426
394
  (0, visitors_1.walk)(this, 'elseBranch', visitor, options);
427
395
  }
428
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
+ }
429
401
  }
430
402
  exports.IfStatement = IfStatement;
431
403
  class IncrementStatement extends AstNode_2.Statement {
@@ -449,6 +421,10 @@ class IncrementStatement extends AstNode_2.Statement {
449
421
  (0, visitors_1.walk)(this, 'value', visitor, options);
450
422
  }
451
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
+ }
452
428
  }
453
429
  exports.IncrementStatement = IncrementStatement;
454
430
  /**
@@ -498,6 +474,10 @@ class PrintStatement extends AstNode_2.Statement {
498
474
  (0, visitors_1.walkArray)(this.expressions, visitor, options, this, (item) => (0, reflection_1.isExpression)(item));
499
475
  }
500
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
+ }
501
481
  }
502
482
  exports.PrintStatement = PrintStatement;
503
483
  class DimStatement extends AstNode_2.Statement {
@@ -531,20 +511,24 @@ class DimStatement extends AstNode_2.Statement {
531
511
  return result;
532
512
  }
533
513
  walk(visitor, options) {
534
- var _a;
535
- 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) {
536
516
  (0, visitors_1.walkArray)(this.dimensions, visitor, options, this);
537
517
  }
538
518
  }
539
519
  getType(options) {
540
520
  var _a, _b;
541
521
  const numDimensions = (_b = (_a = this.dimensions) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 1;
542
- let type = new types_1.ArrayType();
522
+ let type = new ArrayType_1.ArrayType();
543
523
  for (let i = 0; i < numDimensions - 1; i++) {
544
- type = new types_1.ArrayType(type);
524
+ type = new ArrayType_1.ArrayType(type);
545
525
  }
546
526
  return type;
547
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
+ }
548
532
  }
549
533
  exports.DimStatement = DimStatement;
550
534
  class GotoStatement extends AstNode_2.Statement {
@@ -567,6 +551,10 @@ class GotoStatement extends AstNode_2.Statement {
567
551
  walk(visitor, options) {
568
552
  //nothing to walk
569
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
+ }
570
558
  }
571
559
  exports.GotoStatement = GotoStatement;
572
560
  class LabelStatement extends AstNode_2.Statement {
@@ -617,6 +605,10 @@ class ReturnStatement extends AstNode_2.Statement {
617
605
  (0, visitors_1.walk)(this, 'value', visitor, options);
618
606
  }
619
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
+ }
620
612
  }
621
613
  exports.ReturnStatement = ReturnStatement;
622
614
  class EndStatement extends AstNode_2.Statement {
@@ -637,6 +629,10 @@ class EndStatement extends AstNode_2.Statement {
637
629
  walk(visitor, options) {
638
630
  //nothing to walk
639
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
+ }
640
636
  }
641
637
  exports.EndStatement = EndStatement;
642
638
  class StopStatement extends AstNode_2.Statement {
@@ -655,6 +651,10 @@ class StopStatement extends AstNode_2.Statement {
655
651
  walk(visitor, options) {
656
652
  //nothing to walk
657
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
+ }
658
658
  }
659
659
  exports.StopStatement = StopStatement;
660
660
  class ForStatement extends AstNode_2.Statement {
@@ -691,10 +691,8 @@ class ForStatement extends AstNode_2.Statement {
691
691
  state.lineage.unshift(this);
692
692
  result.push(...this.body.transpile(state));
693
693
  state.lineage.shift();
694
- // add new line before "end for"
695
- result.push('\n');
696
694
  //end for
697
- result.push(state.indent(), state.transpileToken(this.tokens.endFor, 'end for'));
695
+ result.push(...state.transpileEndBlockToken(this.body, this.tokens.endFor, 'end for'));
698
696
  return result;
699
697
  }
700
698
  walk(visitor, options) {
@@ -709,6 +707,10 @@ class ForStatement extends AstNode_2.Statement {
709
707
  (0, visitors_1.walk)(this, 'body', visitor, options);
710
708
  }
711
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
+ }
712
714
  }
713
715
  exports.ForStatement = ForStatement;
714
716
  class ForEachStatement extends AstNode_2.Statement {
@@ -739,10 +741,8 @@ class ForEachStatement extends AstNode_2.Statement {
739
741
  state.lineage.unshift(this);
740
742
  result.push(...this.body.transpile(state));
741
743
  state.lineage.shift();
742
- // add new line before "end for"
743
- result.push('\n');
744
744
  //end for
745
- result.push(state.indent(), state.transpileToken(this.tokens.endFor, 'end for'));
745
+ result.push(...state.transpileEndBlockToken(this.body, this.tokens.endFor, 'end for'));
746
746
  return result;
747
747
  }
748
748
  walk(visitor, options) {
@@ -753,6 +753,13 @@ class ForEachStatement extends AstNode_2.Statement {
753
753
  (0, visitors_1.walk)(this, 'body', visitor, options);
754
754
  }
755
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
+ }
756
763
  }
757
764
  exports.ForEachStatement = ForEachStatement;
758
765
  class WhileStatement extends AstNode_2.Statement {
@@ -777,10 +784,8 @@ class WhileStatement extends AstNode_2.Statement {
777
784
  //body
778
785
  result.push(...this.body.transpile(state));
779
786
  state.lineage.shift();
780
- //trailing newline only if we have body statements
781
- result.push('\n');
782
787
  //end while
783
- result.push(state.indent(), state.transpileToken(this.tokens.endWhile, 'end while'));
788
+ result.push(...state.transpileEndBlockToken(this.body, this.tokens.endWhile, 'end while'));
784
789
  return result;
785
790
  }
786
791
  walk(visitor, options) {
@@ -791,6 +796,10 @@ class WhileStatement extends AstNode_2.Statement {
791
796
  (0, visitors_1.walk)(this, 'body', visitor, options);
792
797
  }
793
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
+ }
794
803
  }
795
804
  exports.WhileStatement = WhileStatement;
796
805
  class DottedSetStatement extends AstNode_2.Statement {
@@ -834,9 +843,17 @@ class DottedSetStatement extends AstNode_2.Statement {
834
843
  var _a, _b, _c, _d, _e, _f;
835
844
  const objType = (_a = this.obj) === null || _a === void 0 ? void 0 : _a.getType(options);
836
845
  const result = objType === null || objType === void 0 ? void 0 : objType.getMemberType((_b = this.tokens.name) === null || _b === void 0 ? void 0 : _b.text, options);
837
- (_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry((_d = this.tokens.name) === null || _d === void 0 ? void 0 : _d.text, result, options.data, (_f = (_e = this.tokens.name) === null || _e === void 0 ? void 0 : _e.range) !== null && _f !== void 0 ? _f : this.range));
846
+ (_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry({
847
+ name: (_d = this.tokens.name) === null || _d === void 0 ? void 0 : _d.text,
848
+ type: result, data: options.data,
849
+ range: (_f = (_e = this.tokens.name) === null || _e === void 0 ? void 0 : _e.range) !== null && _f !== void 0 ? _f : this.range,
850
+ kind: this.kind
851
+ }));
838
852
  return result;
839
853
  }
854
+ getLeadingTrivia() {
855
+ return this.obj.getLeadingTrivia();
856
+ }
840
857
  }
841
858
  exports.DottedSetStatement = DottedSetStatement;
842
859
  class IndexedSetStatement extends AstNode_2.Statement {
@@ -884,6 +901,9 @@ class IndexedSetStatement extends AstNode_2.Statement {
884
901
  (0, visitors_1.walk)(this, 'value', visitor, options);
885
902
  }
886
903
  }
904
+ getLeadingTrivia() {
905
+ return this.obj.getLeadingTrivia();
906
+ }
887
907
  }
888
908
  exports.IndexedSetStatement = IndexedSetStatement;
889
909
  class LibraryStatement extends AstNode_2.Statement {
@@ -911,6 +931,10 @@ class LibraryStatement extends AstNode_2.Statement {
911
931
  walk(visitor, options) {
912
932
  //nothing to walk
913
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
+ }
914
938
  }
915
939
  exports.LibraryStatement = LibraryStatement;
916
940
  class NamespaceStatement extends AstNode_2.Statement {
@@ -924,15 +948,14 @@ class NamespaceStatement extends AstNode_2.Statement {
924
948
  this.nameExpression = options.nameExpression;
925
949
  this.body = options.body;
926
950
  this.name = this.getName(Parser_1.ParseMode.BrighterScript);
927
- this.symbolTable = new SymbolTable_2.SymbolTable(`NamespaceStatement: '${this.name}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
951
+ this.symbolTable = new SymbolTable_1.SymbolTable(`NamespaceStatement: '${this.name}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
928
952
  }
929
953
  get range() {
930
954
  return this.cacheRange();
931
955
  }
932
956
  cacheRange() {
933
- var _a;
934
957
  if (!this._range) {
935
- 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);
936
959
  }
937
960
  return this._range;
938
961
  }
@@ -962,11 +985,12 @@ class NamespaceStatement extends AstNode_2.Statement {
962
985
  return this.body.transpile(state);
963
986
  }
964
987
  getTypedef(state) {
965
- let result = [
966
- 'namespace ',
967
- ...this.getName(Parser_1.ParseMode.BrighterScript),
968
- state.newline
969
- ];
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);
970
994
  state.blockDepth++;
971
995
  result.push(...this.body.getTypedef(state));
972
996
  state.blockDepth--;
@@ -989,18 +1013,21 @@ class NamespaceStatement extends AstNode_2.Statement {
989
1013
  exports.NamespaceStatement = NamespaceStatement;
990
1014
  class ImportStatement extends AstNode_2.Statement {
991
1015
  constructor(options) {
1016
+ var _a;
992
1017
  super();
993
1018
  this.kind = AstNode_1.AstNodeKind.ImportStatement;
994
1019
  this.tokens = {
995
1020
  import: options.import,
996
- filePath: options.filePath
1021
+ path: options.path
997
1022
  };
998
- this.range = util_1.util.createBoundingRange(this.tokens.import, this.tokens.filePath);
999
- if (this.tokens.filePath) {
1023
+ this.range = util_1.util.createBoundingRange(this.tokens.import, this.tokens.path);
1024
+ if (this.tokens.path) {
1000
1025
  //remove quotes
1001
- this.filePath = this.tokens.filePath.text.replace(/"/g, '');
1002
- //adjust the range to exclude the quotes
1003
- this.tokens.filePath.range = util_1.util.createRange(this.tokens.filePath.range.start.line, this.tokens.filePath.range.start.character + 1, this.tokens.filePath.range.end.line, this.tokens.filePath.range.end.character - 1);
1026
+ this.filePath = this.tokens.path.text.replace(/"/g, '');
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
+ }
1004
1031
  }
1005
1032
  }
1006
1033
  transpile(state) {
@@ -1010,7 +1037,7 @@ class ImportStatement extends AstNode_2.Statement {
1010
1037
  `'`,
1011
1038
  state.transpileToken(this.tokens.import, 'import'),
1012
1039
  ' ',
1013
- state.transpileToken(this.tokens.filePath)
1040
+ state.transpileToken(this.tokens.path)
1014
1041
  ];
1015
1042
  }
1016
1043
  /**
@@ -1022,12 +1049,16 @@ class ImportStatement extends AstNode_2.Statement {
1022
1049
  (_b = (_a = this.tokens.import) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : 'import',
1023
1050
  ' ',
1024
1051
  //replace any `.bs` extension with `.brs`
1025
- this.tokens.filePath.text.replace(/\.bs"?$/i, '.brs"')
1052
+ this.tokens.path.text.replace(/\.bs"?$/i, '.brs"')
1026
1053
  ];
1027
1054
  }
1028
1055
  walk(visitor, options) {
1029
1056
  //nothing to walk
1030
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
+ }
1031
1062
  }
1032
1063
  exports.ImportStatement = ImportStatement;
1033
1064
  class InterfaceStatement extends AstNode_2.Statement {
@@ -1104,17 +1135,20 @@ class InterfaceStatement extends AstNode_2.Statement {
1104
1135
  return [];
1105
1136
  }
1106
1137
  getTypedef(state) {
1107
- var _a, _b, _c;
1138
+ var _a, _b, _c, _d;
1108
1139
  const result = [];
1109
- 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 : []) {
1110
1144
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1111
1145
  }
1112
1146
  result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
1113
- 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();
1114
1148
  if (parentInterfaceName) {
1115
1149
  result.push(' extends ', parentInterfaceName);
1116
1150
  }
1117
- const body = (_c = this.body) !== null && _c !== void 0 ? _c : [];
1151
+ const body = (_d = this.body) !== null && _d !== void 0 ? _d : [];
1118
1152
  if (body.length > 0) {
1119
1153
  state.blockDepth++;
1120
1154
  }
@@ -1145,15 +1179,21 @@ class InterfaceStatement extends AstNode_2.Statement {
1145
1179
  const resultType = new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), superIface);
1146
1180
  for (const statement of this.methods) {
1147
1181
  const memberType = statement === null || statement === void 0 ? void 0 : statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); // no typechain info needed
1148
- const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
1182
+ const flag = statement.isOptional ? 1 /* SymbolTypeFlag.runtime */ | 4 /* SymbolTypeFlag.optional */ : 1 /* SymbolTypeFlag.runtime */;
1149
1183
  resultType.addMember((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, { definingNode: statement }, memberType, flag);
1150
1184
  }
1151
1185
  for (const statement of this.fields) {
1152
1186
  const memberType = statement === null || statement === void 0 ? void 0 : statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); // no typechain info needed
1153
- const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
1187
+ const flag = statement.isOptional ? 1 /* SymbolTypeFlag.runtime */ | 4 /* SymbolTypeFlag.optional */ : 1 /* SymbolTypeFlag.runtime */;
1154
1188
  resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, memberType, flag);
1155
1189
  }
1156
- (_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry(this.getName(Parser_1.ParseMode.BrighterScript), resultType, options.data, this.range));
1190
+ (_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry({
1191
+ name: this.getName(Parser_1.ParseMode.BrighterScript),
1192
+ type: resultType,
1193
+ data: options.data,
1194
+ range: this.range,
1195
+ kind: this.kind
1196
+ }));
1157
1197
  return resultType;
1158
1198
  }
1159
1199
  }
@@ -1189,9 +1229,12 @@ class InterfaceFieldStatement extends AstNode_2.Statement {
1189
1229
  }
1190
1230
  }
1191
1231
  getTypedef(state) {
1192
- var _a;
1232
+ var _a, _b;
1193
1233
  const result = [];
1194
- 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 : []) {
1195
1238
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1196
1239
  }
1197
1240
  if (this.isOptional) {
@@ -1253,16 +1296,19 @@ class InterfaceMethodStatement extends AstNode_2.Statement {
1253
1296
  }
1254
1297
  }
1255
1298
  getTypedef(state) {
1256
- var _a, _b, _c, _d;
1299
+ var _a, _b, _c, _d, _e;
1257
1300
  const result = [];
1258
- 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 : []) {
1259
1305
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1260
1306
  }
1261
1307
  if (this.isOptional) {
1262
1308
  result.push(this.tokens.optional.text, ' ');
1263
1309
  }
1264
- 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, '(');
1265
- 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 : [];
1266
1312
  for (let i = 0; i < params.length; i++) {
1267
1313
  if (i > 0) {
1268
1314
  result.push(', ');
@@ -1299,7 +1345,7 @@ class InterfaceMethodStatement extends AstNode_2.Statement {
1299
1345
  }
1300
1346
  let funcName = this.getName(Parser_1.ParseMode.BrighterScript);
1301
1347
  resultType.setName(funcName);
1302
- (_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry(resultType.name, resultType, options.data, this.range));
1348
+ (_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry({ name: resultType.name, type: resultType, data: options.data, range: this.range, kind: this.kind }));
1303
1349
  return resultType;
1304
1350
  }
1305
1351
  }
@@ -1320,7 +1366,7 @@ class ClassStatement extends AstNode_2.Statement {
1320
1366
  extends: options.extends
1321
1367
  };
1322
1368
  this.parentClassName = options.parentClassName;
1323
- this.symbolTable = new SymbolTable_2.SymbolTable(`ClassStatement: '${(_b = this.tokens.name) === null || _b === void 0 ? void 0 : _b.text}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
1369
+ this.symbolTable = new SymbolTable_1.SymbolTable(`ClassStatement: '${(_b = this.tokens.name) === null || _b === void 0 ? void 0 : _b.text}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
1324
1370
  for (let statement of this.body) {
1325
1371
  if ((0, reflection_1.isMethodStatement)(statement)) {
1326
1372
  this.methods.push(statement);
@@ -1366,9 +1412,12 @@ class ClassStatement extends AstNode_2.Statement {
1366
1412
  return result;
1367
1413
  }
1368
1414
  getTypedef(state) {
1369
- var _a;
1415
+ var _a, _b;
1370
1416
  const result = [];
1371
- 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 : []) {
1372
1421
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1373
1422
  }
1374
1423
  result.push('class ', this.tokens.name.text);
@@ -1459,8 +1508,8 @@ class ClassStatement extends AstNode_2.Statement {
1459
1508
  }
1460
1509
  getConstructorType() {
1461
1510
  var _a, _b;
1462
- const constructorType = (_b = (_a = this.getConstructorFunction()) === null || _a === void 0 ? void 0 : _a.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime })) !== null && _b !== void 0 ? _b : new TypedFunctionType_1.TypedFunctionType(null);
1463
- constructorType.returnType = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime });
1511
+ const constructorType = (_b = (_a = this.getConstructorFunction()) === null || _a === void 0 ? void 0 : _a.getType({ flags: 1 /* SymbolTypeFlag.runtime */ })) !== null && _b !== void 0 ? _b : new TypedFunctionType_1.TypedFunctionType(null);
1512
+ constructorType.returnType = this.getType({ flags: 1 /* SymbolTypeFlag.runtime */ });
1464
1513
  return constructorType;
1465
1514
  }
1466
1515
  /**
@@ -1560,7 +1609,7 @@ class ClassStatement extends AstNode_2.Statement {
1560
1609
  let result = [];
1561
1610
  const constructorFunction = this.getConstructorFunction();
1562
1611
  const constructorParams = constructorFunction ? constructorFunction.func.parameters : [];
1563
- 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)), `(`);
1564
1613
  let i = 0;
1565
1614
  for (let param of constructorParams) {
1566
1615
  if (i > 0) {
@@ -1605,30 +1654,30 @@ class ClassStatement extends AstNode_2.Statement {
1605
1654
  const resultType = new ClassType_1.ClassType(this.getName(Parser_1.ParseMode.BrighterScript), superClass);
1606
1655
  for (const statement of this.methods) {
1607
1656
  const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); //no typechain needed
1608
- let flag = SymbolTable_1.SymbolTypeFlag.runtime;
1657
+ let flag = 1 /* SymbolTypeFlag.runtime */;
1609
1658
  if (((_b = statement.accessModifier) === null || _b === void 0 ? void 0 : _b.kind) === TokenKind_1.TokenKind.Private) {
1610
- flag |= SymbolTable_1.SymbolTypeFlag.private;
1659
+ flag |= 8 /* SymbolTypeFlag.private */;
1611
1660
  }
1612
1661
  if (((_c = statement.accessModifier) === null || _c === void 0 ? void 0 : _c.kind) === TokenKind_1.TokenKind.Protected) {
1613
- flag |= SymbolTable_1.SymbolTypeFlag.protected;
1662
+ flag |= 16 /* SymbolTypeFlag.protected */;
1614
1663
  }
1615
1664
  resultType.addMember((_d = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _d === void 0 ? void 0 : _d.text, { definingNode: statement }, funcType, flag);
1616
1665
  }
1617
1666
  for (const statement of this.fields) {
1618
1667
  const fieldType = statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); //no typechain needed
1619
- let flag = SymbolTable_1.SymbolTypeFlag.runtime;
1668
+ let flag = 1 /* SymbolTypeFlag.runtime */;
1620
1669
  if (statement.isOptional) {
1621
- flag |= SymbolTable_1.SymbolTypeFlag.optional;
1670
+ flag |= 4 /* SymbolTypeFlag.optional */;
1622
1671
  }
1623
1672
  if (((_e = statement.tokens.accessModifier) === null || _e === void 0 ? void 0 : _e.kind) === TokenKind_1.TokenKind.Private) {
1624
- flag |= SymbolTable_1.SymbolTypeFlag.private;
1673
+ flag |= 8 /* SymbolTypeFlag.private */;
1625
1674
  }
1626
1675
  if (((_f = statement.tokens.accessModifier) === null || _f === void 0 ? void 0 : _f.kind) === TokenKind_1.TokenKind.Protected) {
1627
- flag |= SymbolTable_1.SymbolTypeFlag.protected;
1676
+ flag |= 16 /* SymbolTypeFlag.protected */;
1628
1677
  }
1629
1678
  resultType.addMember((_g = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _g === void 0 ? void 0 : _g.text, { definingNode: statement }, fieldType, flag);
1630
1679
  }
1631
- (_h = options.typeChain) === null || _h === void 0 ? void 0 : _h.push(new interfaces_1.TypeChainEntry(resultType.name, resultType, options.data, this.range));
1680
+ (_h = options.typeChain) === null || _h === void 0 ? void 0 : _h.push(new interfaces_1.TypeChainEntry({ name: resultType.name, type: resultType, data: options.data, range: this.range, kind: this.kind }));
1632
1681
  return resultType;
1633
1682
  }
1634
1683
  }
@@ -1698,9 +1747,12 @@ class MethodStatement extends FunctionStatement {
1698
1747
  return this.func.transpile(state);
1699
1748
  }
1700
1749
  getTypedef(state) {
1701
- var _a;
1750
+ var _a, _b;
1702
1751
  const result = [];
1703
- 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 : []) {
1704
1756
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1705
1757
  }
1706
1758
  if (this.accessModifier) {
@@ -1723,10 +1775,11 @@ class MethodStatement extends FunctionStatement {
1723
1775
  }
1724
1776
  //check whether any calls to super exist
1725
1777
  let containsSuperCall = this.func.body.statements.findIndex((x) => {
1778
+ var _a;
1726
1779
  //is a call statement
1727
1780
  return (0, reflection_1.isExpressionStatement)(x) && (0, reflection_1.isCallExpression)(x.expression) &&
1728
1781
  //is a call to super
1729
- 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';
1730
1783
  }) !== -1;
1731
1784
  //if a call to super exists, quit here
1732
1785
  if (containsSuperCall) {
@@ -1770,12 +1823,13 @@ class MethodStatement extends FunctionStatement {
1770
1823
  * Inject field initializers at the top of the `new` function (after any present `super()` call)
1771
1824
  */
1772
1825
  injectFieldInitializersForConstructor(state) {
1826
+ var _a;
1773
1827
  let startingIndex = state.classStatement.hasParentClass() ? 1 : 0;
1774
1828
  let newStatements = [];
1775
1829
  //insert the field initializers in order
1776
1830
  for (let field of state.classStatement.fields) {
1777
1831
  let thisQualifiedName = Object.assign({}, field.tokens.name);
1778
- thisQualifiedName.text = 'm.' + field.tokens.name.text;
1832
+ thisQualifiedName.text = 'm.' + ((_a = field.tokens.name) === null || _a === void 0 ? void 0 : _a.text);
1779
1833
  const fieldAssignment = field.initialValue
1780
1834
  ? new AssignmentStatement({
1781
1835
  equals: field.tokens.equals,
@@ -1822,7 +1876,7 @@ class FieldStatement extends AstNode_2.Statement {
1822
1876
  */
1823
1877
  getType(options) {
1824
1878
  var _a, _b, _c, _d;
1825
- return (_d = (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.typetime }))) !== null && _b !== void 0 ? _b : (_c = this.initialValue) === null || _c === void 0 ? void 0 : _c.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.runtime }))) !== null && _d !== void 0 ? _d : DynamicType_1.DynamicType.instance;
1879
+ return (_d = (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(Object.assign(Object.assign({}, options), { flags: 2 /* SymbolTypeFlag.typetime */ }))) !== null && _b !== void 0 ? _b : (_c = this.initialValue) === null || _c === void 0 ? void 0 : _c.getType(Object.assign(Object.assign({}, options), { flags: 1 /* SymbolTypeFlag.runtime */ }))) !== null && _d !== void 0 ? _d : DynamicType_1.DynamicType.instance;
1826
1880
  }
1827
1881
  getLeadingTrivia() {
1828
1882
  var _a, _b, _c, _d, _e, _f;
@@ -1835,21 +1889,24 @@ class FieldStatement extends AstNode_2.Statement {
1835
1889
  throw new Error('transpile not implemented for ' + Object.getPrototypeOf(this).constructor.name);
1836
1890
  }
1837
1891
  getTypedef(state) {
1838
- var _a, _b, _c, _d;
1892
+ var _a, _b, _c, _d, _e;
1839
1893
  const result = [];
1840
1894
  if (this.tokens.name) {
1841
- 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 : []) {
1842
1899
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1843
1900
  }
1844
- let type = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.typetime });
1901
+ let type = this.getType({ flags: 2 /* SymbolTypeFlag.typetime */ });
1845
1902
  if ((0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
1846
1903
  type = new DynamicType_1.DynamicType();
1847
1904
  }
1848
- 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', ' ');
1849
1906
  if (this.isOptional) {
1850
1907
  result.push(this.tokens.optional.text, ' ');
1851
1908
  }
1852
- 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());
1853
1910
  }
1854
1911
  return result;
1855
1912
  }
@@ -1892,6 +1949,10 @@ class TryCatchStatement extends AstNode_2.Statement {
1892
1949
  (0, visitors_1.walk)(this, 'catchStatement', visitor, options);
1893
1950
  }
1894
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
+ }
1895
1956
  }
1896
1957
  exports.TryCatchStatement = TryCatchStatement;
1897
1958
  class CatchStatement extends AstNode_2.Statement {
@@ -1919,6 +1980,10 @@ class CatchStatement extends AstNode_2.Statement {
1919
1980
  (0, visitors_1.walk)(this, 'catchBranch', visitor, options);
1920
1981
  }
1921
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
+ }
1922
1987
  }
1923
1988
  exports.CatchStatement = CatchStatement;
1924
1989
  class ThrowStatement extends AstNode_2.Statement {
@@ -1942,7 +2007,7 @@ class ThrowStatement extends AstNode_2.Statement {
1942
2007
  //no expression found. Rather than emit syntax errors, provide a generic error message
1943
2008
  }
1944
2009
  else {
1945
- result.push('"An error has occurred"');
2010
+ result.push('"User-specified exception"');
1946
2011
  }
1947
2012
  return result;
1948
2013
  }
@@ -1951,6 +2016,10 @@ class ThrowStatement extends AstNode_2.Statement {
1951
2016
  (0, visitors_1.walk)(this, 'expression', visitor, options);
1952
2017
  }
1953
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
+ }
1954
2023
  }
1955
2024
  exports.ThrowStatement = ThrowStatement;
1956
2025
  class EnumStatement extends AstNode_2.Statement {
@@ -1958,13 +2027,13 @@ class EnumStatement extends AstNode_2.Statement {
1958
2027
  var _a;
1959
2028
  super();
1960
2029
  this.kind = AstNode_1.AstNodeKind.EnumStatement;
1961
- this.symbolTable = new SymbolTable_2.SymbolTable('Enum');
1962
2030
  this.tokens = {
1963
2031
  enum: options.enum,
1964
2032
  name: options.name,
1965
2033
  endEnum: options.endEnum
1966
2034
  };
1967
- this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
2035
+ this.symbolTable = new SymbolTable_1.SymbolTable('Enum');
2036
+ this.body = (_a = options.body) !== null && _a !== void 0 ? _a : [];
1968
2037
  }
1969
2038
  get range() {
1970
2039
  return util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum);
@@ -1979,7 +2048,8 @@ class EnumStatement extends AstNode_2.Statement {
1979
2048
  return result;
1980
2049
  }
1981
2050
  getLeadingTrivia() {
1982
- 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);
1983
2053
  }
1984
2054
  /**
1985
2055
  * Get a map of member names and their values.
@@ -2053,12 +2123,15 @@ class EnumStatement extends AstNode_2.Statement {
2053
2123
  return [];
2054
2124
  }
2055
2125
  getTypedef(state) {
2056
- var _a, _b, _c, _d, _e;
2126
+ var _a, _b, _c, _d, _e, _f;
2057
2127
  const result = [];
2058
- 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 : []) {
2059
2132
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
2060
2133
  }
2061
- 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);
2062
2135
  result.push(state.newline);
2063
2136
  state.blockDepth++;
2064
2137
  for (const member of this.body) {
@@ -2067,7 +2140,7 @@ class EnumStatement extends AstNode_2.Statement {
2067
2140
  }
2068
2141
  }
2069
2142
  state.blockDepth--;
2070
- 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');
2071
2144
  return result;
2072
2145
  }
2073
2146
  walk(visitor, options) {
@@ -2081,7 +2154,7 @@ class EnumStatement extends AstNode_2.Statement {
2081
2154
  const resultType = new EnumType_1.EnumType(this.fullName, (_a = members[0]) === null || _a === void 0 ? void 0 : _a.getType(options).underlyingType);
2082
2155
  resultType.pushMemberProvider(() => this.getSymbolTable());
2083
2156
  for (const statement of members) {
2084
- resultType.addMember((_c = (_b = statement === null || statement === void 0 ? void 0 : statement.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
2157
+ resultType.addMember((_c = (_b = statement === null || statement === void 0 ? void 0 : statement.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, statement.getType(options), 1 /* SymbolTypeFlag.runtime */);
2085
2158
  }
2086
2159
  return resultType;
2087
2160
  }
@@ -2113,9 +2186,12 @@ class EnumMemberStatement extends AstNode_2.Statement {
2113
2186
  return [];
2114
2187
  }
2115
2188
  getTypedef(state) {
2116
- const result = [
2117
- this.tokens.name.text
2118
- ];
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);
2119
2195
  if (this.tokens.equals) {
2120
2196
  result.push(' ', this.tokens.equals.text, ' ');
2121
2197
  if (this.value) {
@@ -2151,7 +2227,8 @@ class ConstStatement extends AstNode_2.Statement {
2151
2227
  return this.tokens.name.text;
2152
2228
  }
2153
2229
  getLeadingTrivia() {
2154
- 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);
2155
2232
  }
2156
2233
  /**
2157
2234
  * The name of the statement WITH its leading namespace (if applicable)
@@ -2179,15 +2256,13 @@ class ConstStatement extends AstNode_2.Statement {
2179
2256
  return [];
2180
2257
  }
2181
2258
  getTypedef(state) {
2182
- return [
2183
- this.tokens.const ? state.tokenToSourceNode(this.tokens.const) : 'const',
2184
- ' ',
2185
- state.tokenToSourceNode(this.tokens.name),
2186
- ' ',
2187
- this.tokens.equals ? state.tokenToSourceNode(this.tokens.equals) : '=',
2188
- ' ',
2189
- ...this.value.transpile(state)
2190
- ];
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;
2191
2266
  }
2192
2267
  walk(visitor, options) {
2193
2268
  if (this.value && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
@@ -2220,6 +2295,10 @@ class ContinueStatement extends AstNode_2.Statement {
2220
2295
  walk(visitor, options) {
2221
2296
  //nothing to walk
2222
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
+ }
2223
2302
  }
2224
2303
  exports.ContinueStatement = ContinueStatement;
2225
2304
  //# sourceMappingURL=Statement.js.map