brighterscript 1.0.0-alpha.14 → 1.0.0-alpha.17

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 (151) hide show
  1. package/CHANGELOG.md +83 -1
  2. package/README.md +28 -9
  3. package/dist/Cache.d.ts +2 -7
  4. package/dist/Cache.js +4 -13
  5. package/dist/Cache.js.map +1 -1
  6. package/dist/DependencyGraph.js +5 -4
  7. package/dist/DependencyGraph.js.map +1 -1
  8. package/dist/DiagnosticMessages.d.ts +21 -1
  9. package/dist/DiagnosticMessages.js +21 -1
  10. package/dist/DiagnosticMessages.js.map +1 -1
  11. package/dist/Logger.js +5 -5
  12. package/dist/Logger.js.map +1 -1
  13. package/dist/Program.d.ts +3 -3
  14. package/dist/Program.js +9 -7
  15. package/dist/Program.js.map +1 -1
  16. package/dist/ProgramBuilder.js +1 -1
  17. package/dist/ProgramBuilder.js.map +1 -1
  18. package/dist/Scope.d.ts +16 -11
  19. package/dist/Scope.js +42 -12
  20. package/dist/Scope.js.map +1 -1
  21. package/dist/XmlScope.d.ts +3 -3
  22. package/dist/XmlScope.js +1 -1
  23. package/dist/XmlScope.js.map +1 -1
  24. package/dist/astUtils/AstEditor.d.ts +6 -0
  25. package/dist/astUtils/AstEditor.js +10 -0
  26. package/dist/astUtils/AstEditor.js.map +1 -1
  27. package/dist/astUtils/AstEditor.spec.js +37 -0
  28. package/dist/astUtils/AstEditor.spec.js.map +1 -1
  29. package/dist/astUtils/creators.d.ts +10 -6
  30. package/dist/astUtils/creators.js +93 -12
  31. package/dist/astUtils/creators.js.map +1 -1
  32. package/dist/astUtils/creators.spec.js +10 -0
  33. package/dist/astUtils/creators.spec.js.map +1 -1
  34. package/dist/astUtils/reflection.d.ts +7 -2
  35. package/dist/astUtils/reflection.js +19 -3
  36. package/dist/astUtils/reflection.js.map +1 -1
  37. package/dist/astUtils/reflection.spec.js +5 -4
  38. package/dist/astUtils/reflection.spec.js.map +1 -1
  39. package/dist/astUtils/visitors.d.ts +3 -1
  40. package/dist/astUtils/visitors.js.map +1 -1
  41. package/dist/astUtils/visitors.spec.js +2 -0
  42. package/dist/astUtils/visitors.spec.js.map +1 -1
  43. package/dist/bscPlugin/BscPlugin.d.ts +4 -1
  44. package/dist/bscPlugin/BscPlugin.js +16 -0
  45. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  46. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +1 -0
  47. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +38 -2
  48. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  49. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +28 -0
  50. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  51. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
  52. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +40 -0
  53. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
  54. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts +1 -0
  55. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
  56. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -0
  57. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
  58. package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
  59. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  60. package/dist/bscPlugin/validation/ScopeValidator.d.ts +11 -0
  61. package/dist/bscPlugin/validation/ScopeValidator.js +94 -0
  62. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  63. package/dist/diagnosticUtils.js +3 -3
  64. package/dist/diagnosticUtils.js.map +1 -1
  65. package/dist/examples/plugins/removePrint.js +12 -14
  66. package/dist/examples/plugins/removePrint.js.map +1 -1
  67. package/dist/files/BrsFile.Class.spec.js +22 -23
  68. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  69. package/dist/files/BrsFile.d.ts +10 -3
  70. package/dist/files/BrsFile.js +133 -49
  71. package/dist/files/BrsFile.js.map +1 -1
  72. package/dist/files/BrsFile.spec.js +299 -123
  73. package/dist/files/BrsFile.spec.js.map +1 -1
  74. package/dist/files/XmlFile.d.ts +5 -5
  75. package/dist/files/XmlFile.js +3 -3
  76. package/dist/files/XmlFile.js.map +1 -1
  77. package/dist/files/XmlFile.spec.js +9 -9
  78. package/dist/files/XmlFile.spec.js.map +1 -1
  79. package/dist/interfaces.d.ts +29 -37
  80. package/dist/lexer/Lexer.spec.js +8 -0
  81. package/dist/lexer/Lexer.spec.js.map +1 -1
  82. package/dist/lexer/TokenKind.d.ts +2 -0
  83. package/dist/lexer/TokenKind.js +5 -0
  84. package/dist/lexer/TokenKind.js.map +1 -1
  85. package/dist/parser/Expression.d.ts +85 -21
  86. package/dist/parser/Expression.js +177 -53
  87. package/dist/parser/Expression.js.map +1 -1
  88. package/dist/parser/Parser.Class.spec.js +1 -1
  89. package/dist/parser/Parser.Class.spec.js.map +1 -1
  90. package/dist/parser/Parser.d.ts +12 -3
  91. package/dist/parser/Parser.js +156 -56
  92. package/dist/parser/Parser.js.map +1 -1
  93. package/dist/parser/Parser.spec.js +57 -2
  94. package/dist/parser/Parser.spec.js.map +1 -1
  95. package/dist/parser/Statement.d.ts +94 -30
  96. package/dist/parser/Statement.js +281 -106
  97. package/dist/parser/Statement.js.map +1 -1
  98. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  99. package/dist/parser/tests/statement/Enum.spec.js +774 -0
  100. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  101. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  102. package/dist/parser/tests/statement/For.spec.js +46 -0
  103. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  104. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  105. package/dist/parser/tests/statement/ForEach.spec.js +37 -0
  106. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  107. package/dist/types/BooleanType.d.ts +4 -2
  108. package/dist/types/BooleanType.js +5 -1
  109. package/dist/types/BooleanType.js.map +1 -1
  110. package/dist/types/DoubleType.d.ts +2 -0
  111. package/dist/types/DoubleType.js +5 -1
  112. package/dist/types/DoubleType.js.map +1 -1
  113. package/dist/types/DynamicType.d.ts +2 -0
  114. package/dist/types/DynamicType.js +5 -1
  115. package/dist/types/DynamicType.js.map +1 -1
  116. package/dist/types/FloatType.d.ts +3 -1
  117. package/dist/types/FloatType.js +5 -1
  118. package/dist/types/FloatType.js.map +1 -1
  119. package/dist/types/FunctionType.d.ts +2 -1
  120. package/dist/types/FunctionType.js +11 -8
  121. package/dist/types/FunctionType.js.map +1 -1
  122. package/dist/types/FunctionType.spec.js +6 -0
  123. package/dist/types/FunctionType.spec.js.map +1 -1
  124. package/dist/types/IntegerType.d.ts +3 -1
  125. package/dist/types/IntegerType.js +5 -1
  126. package/dist/types/IntegerType.js.map +1 -1
  127. package/dist/types/InvalidType.d.ts +4 -2
  128. package/dist/types/InvalidType.js +5 -1
  129. package/dist/types/InvalidType.js.map +1 -1
  130. package/dist/types/LongIntegerType.d.ts +3 -1
  131. package/dist/types/LongIntegerType.js +5 -1
  132. package/dist/types/LongIntegerType.js.map +1 -1
  133. package/dist/types/ObjectType.d.ts +2 -1
  134. package/dist/types/ObjectType.js +4 -2
  135. package/dist/types/ObjectType.js.map +1 -1
  136. package/dist/types/StringType.d.ts +4 -2
  137. package/dist/types/StringType.js +5 -1
  138. package/dist/types/StringType.js.map +1 -1
  139. package/dist/types/UninitializedType.js.map +1 -1
  140. package/dist/types/UniversalFunctionType.d.ts +9 -0
  141. package/dist/types/UniversalFunctionType.js +25 -0
  142. package/dist/types/UniversalFunctionType.js.map +1 -0
  143. package/dist/types/VoidType.d.ts +4 -2
  144. package/dist/types/VoidType.js +5 -1
  145. package/dist/types/VoidType.js.map +1 -1
  146. package/dist/util.d.ts +12 -2
  147. package/dist/util.js +74 -44
  148. package/dist/util.js.map +1 -1
  149. package/dist/validators/ClassValidator.js +3 -3
  150. package/dist/validators/ClassValidator.js.map +1 -1
  151. package/package.json +2 -3
@@ -1,10 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ThrowStatement = exports.TryCatchStatement = exports.ClassFieldStatement = exports.ClassMethodStatement = 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 = exports.Statement = void 0;
3
+ exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.TryCatchStatement = exports.ClassFieldStatement = exports.ClassMethodStatement = 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 = exports.Statement = void 0;
4
4
  const TokenKind_1 = require("../lexer/TokenKind");
5
5
  const Expression_1 = require("./Expression");
6
6
  const util_1 = require("../util");
7
- const vscode_languageserver_1 = require("vscode-languageserver");
8
7
  const Parser_1 = require("./Parser");
9
8
  const visitors_1 = require("../astUtils/visitors");
10
9
  const reflection_1 = require("../astUtils/reflection");
@@ -46,12 +45,10 @@ exports.EmptyStatement = EmptyStatement;
46
45
  */
47
46
  class Body extends Statement {
48
47
  constructor(statements = []) {
48
+ var _a;
49
49
  super();
50
50
  this.statements = statements;
51
- }
52
- get range() {
53
- var _a, _b, _c, _d;
54
- return util_1.util.createRangeFromPositions((_b = (_a = this.statements[0]) === null || _a === void 0 ? void 0 : _a.range.start) !== null && _b !== void 0 ? _b : vscode_languageserver_1.Position.create(0, 0), (_d = (_c = this.statements[this.statements.length - 1]) === null || _c === void 0 ? void 0 : _c.range.end) !== null && _d !== void 0 ? _d : vscode_languageserver_1.Position.create(0, 0));
51
+ this.range = (_a = util_1.util.createBoundingRange(...this.statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
55
52
  }
56
53
  transpile(state) {
57
54
  let result = [];
@@ -103,12 +100,13 @@ class Body extends Statement {
103
100
  exports.Body = Body;
104
101
  class AssignmentStatement extends Statement {
105
102
  constructor(name, equals, value, containingFunction) {
103
+ var _a;
106
104
  super();
107
105
  this.name = name;
108
106
  this.equals = equals;
109
107
  this.value = value;
110
108
  this.containingFunction = containingFunction;
111
- this.range = util_1.util.createRangeFromPositions(this.name.range.start, this.value.range.end);
109
+ this.range = (_a = util_1.util.createBoundingRange(this.name, this.equals, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
112
110
  }
113
111
  transpile(state) {
114
112
  var _a, _b;
@@ -135,12 +133,11 @@ class AssignmentStatement extends Statement {
135
133
  exports.AssignmentStatement = AssignmentStatement;
136
134
  class Block extends Statement {
137
135
  constructor(statements, startingRange) {
136
+ var _a;
138
137
  super();
139
138
  this.statements = statements;
140
139
  this.startingRange = startingRange;
141
- this.range = util_1.util.createRangeFromPositions(this.startingRange.start, this.statements.length
142
- ? this.statements[this.statements.length - 1].range.end
143
- : this.startingRange.start);
140
+ this.range = (_a = util_1.util.createBoundingRange({ range: this.startingRange }, ...statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
144
141
  }
145
142
  transpile(state) {
146
143
  state.blockDepth++;
@@ -177,9 +174,10 @@ class Block extends Statement {
177
174
  exports.Block = Block;
178
175
  class ExpressionStatement extends Statement {
179
176
  constructor(expression) {
177
+ var _a, _b;
180
178
  super();
181
179
  this.expression = expression;
182
- this.range = this.expression.range;
180
+ this.range = (_b = (_a = this.expression) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
183
181
  }
184
182
  transpile(state) {
185
183
  return this.expression.transpile(state);
@@ -196,10 +194,8 @@ class CommentStatement extends Statement {
196
194
  var _a;
197
195
  super();
198
196
  this.comments = comments;
197
+ this.range = (_a = util_1.util.createBoundingRange(...this.comments)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
199
198
  this.visitMode = visitors_1.InternalWalkMode.visitStatements | visitors_1.InternalWalkMode.visitExpressions;
200
- if (((_a = this.comments) === null || _a === void 0 ? void 0 : _a.length) > 0) {
201
- this.range = util_1.util.createRangeFromPositions(this.comments[0].range.start, this.comments[this.comments.length - 1].range.end);
202
- }
203
199
  }
204
200
  get text() {
205
201
  return this.comments.map(x => x.text).join('\n');
@@ -229,9 +225,10 @@ class CommentStatement extends Statement {
229
225
  exports.CommentStatement = CommentStatement;
230
226
  class ExitForStatement extends Statement {
231
227
  constructor(tokens) {
228
+ var _a, _b, _c;
232
229
  super();
233
230
  this.tokens = tokens;
234
- this.range = this.tokens.exitFor.range;
231
+ this.range = (_c = (_b = (_a = this.tokens) === null || _a === void 0 ? void 0 : _a.exitFor) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : creators_1.interpolatedRange;
235
232
  }
236
233
  transpile(state) {
237
234
  return [
@@ -245,9 +242,10 @@ class ExitForStatement extends Statement {
245
242
  exports.ExitForStatement = ExitForStatement;
246
243
  class ExitWhileStatement extends Statement {
247
244
  constructor(tokens) {
245
+ var _a, _b, _c;
248
246
  super();
249
247
  this.tokens = tokens;
250
- this.range = this.tokens.exitWhile.range;
248
+ this.range = (_c = (_b = (_a = this.tokens) === null || _a === void 0 ? void 0 : _a.exitWhile) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : creators_1.interpolatedRange;
251
249
  }
252
250
  transpile(state) {
253
251
  return [
@@ -265,7 +263,16 @@ class FunctionStatement extends Statement {
265
263
  this.name = name;
266
264
  this.func = func;
267
265
  this.namespaceName = namespaceName;
268
- this.range = this.func.range;
266
+ }
267
+ get range() {
268
+ return this.cacheRange();
269
+ }
270
+ cacheRange() {
271
+ var _a, _b;
272
+ if (!this._range) {
273
+ this._range = (_b = (_a = this.func) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : this.name.range;
274
+ }
275
+ return this._range;
269
276
  }
270
277
  /**
271
278
  * Get the name of this expression based on the parse mode
@@ -303,14 +310,14 @@ class FunctionStatement extends Statement {
303
310
  exports.FunctionStatement = FunctionStatement;
304
311
  class IfStatement extends Statement {
305
312
  constructor(tokens, condition, thenBranch, elseBranch, isInline) {
306
- var _a, _b;
313
+ var _a;
307
314
  super();
308
315
  this.tokens = tokens;
309
316
  this.condition = condition;
310
317
  this.thenBranch = thenBranch;
311
318
  this.elseBranch = elseBranch;
312
319
  this.isInline = isInline;
313
- this.range = util_1.util.createRangeFromPositions(this.tokens.if.range.start, ((_b = (_a = this.tokens.endIf) !== null && _a !== void 0 ? _a : this.elseBranch) !== null && _b !== void 0 ? _b : this.thenBranch).range.end);
320
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.if, this.condition, this.tokens.then, this.thenBranch, this.tokens.else, this.elseBranch, this.tokens.endIf)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
314
321
  }
315
322
  transpile(state) {
316
323
  let results = [];
@@ -319,14 +326,11 @@ class IfStatement extends Statement {
319
326
  results.push(' ');
320
327
  //conditions
321
328
  results.push(...this.condition.transpile(state));
322
- results.push(' ');
323
329
  //then
324
330
  if (this.tokens.then) {
331
+ results.push(' ');
325
332
  results.push(state.transpileToken(this.tokens.then));
326
333
  }
327
- else {
328
- results.push('then');
329
- }
330
334
  state.lineage.unshift(this);
331
335
  //if statement body
332
336
  let thenNodes = this.thenBranch.transpile(state);
@@ -347,7 +351,8 @@ class IfStatement extends Statement {
347
351
  let body = this.elseBranch.transpile(state);
348
352
  state.lineage.shift();
349
353
  if (body.length > 0) {
350
- results.push(' ');
354
+ //zero or more spaces between the `else` and the `if`
355
+ results.push(this.elseBranch.tokens.if.leadingWhitespace);
351
356
  results.push(...body);
352
357
  // stop here because chained if will transpile the rest
353
358
  return results;
@@ -392,10 +397,11 @@ class IfStatement extends Statement {
392
397
  exports.IfStatement = IfStatement;
393
398
  class IncrementStatement extends Statement {
394
399
  constructor(value, operator) {
400
+ var _a;
395
401
  super();
396
402
  this.value = value;
397
403
  this.operator = operator;
398
- this.range = util_1.util.createRangeFromPositions(this.value.range.start, this.operator.range.end);
404
+ this.range = (_a = util_1.util.createBoundingRange(this.value, this.operator)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
399
405
  }
400
406
  transpile(state) {
401
407
  return [
@@ -420,12 +426,11 @@ class PrintStatement extends Statement {
420
426
  * evaluated and printed.
421
427
  */
422
428
  constructor(tokens, expressions) {
429
+ var _a;
423
430
  super();
424
431
  this.tokens = tokens;
425
432
  this.expressions = expressions;
426
- this.range = util_1.util.createRangeFromPositions(this.tokens.print.range.start, this.expressions.length
427
- ? this.expressions[this.expressions.length - 1].range.end
428
- : this.tokens.print.range.end);
433
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.print, ...this.expressions)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
429
434
  }
430
435
  transpile(state) {
431
436
  var _a;
@@ -462,14 +467,14 @@ class PrintStatement extends Statement {
462
467
  exports.PrintStatement = PrintStatement;
463
468
  class DimStatement extends Statement {
464
469
  constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
465
- var _a, _b, _c, _d;
470
+ var _a;
466
471
  super();
467
472
  this.dimToken = dimToken;
468
473
  this.identifier = identifier;
469
474
  this.openingSquare = openingSquare;
470
475
  this.dimensions = dimensions;
471
476
  this.closingSquare = closingSquare;
472
- this.range = util_1.util.createRangeFromPositions(this.dimToken.range.start, ((_d = (_c = (_b = (_a = this.closingSquare) !== null && _a !== void 0 ? _a : this.dimensions[this.dimensions.length - 1]) !== null && _b !== void 0 ? _b : this.openingSquare) !== null && _c !== void 0 ? _c : this.identifier) !== null && _d !== void 0 ? _d : this.dimToken).range.end);
477
+ this.range = (_a = util_1.util.createBoundingRange(this.dimToken, this.identifier, this.openingSquare, ...this.dimensions, this.closingSquare)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
473
478
  }
474
479
  transpile(state) {
475
480
  let result = [
@@ -499,9 +504,10 @@ class DimStatement extends Statement {
499
504
  exports.DimStatement = DimStatement;
500
505
  class GotoStatement extends Statement {
501
506
  constructor(tokens) {
507
+ var _a;
502
508
  super();
503
509
  this.tokens = tokens;
504
- this.range = util_1.util.createRangeFromPositions(this.tokens.goto.range.start, this.tokens.label.range.end);
510
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.goto, this.tokens.label)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
505
511
  }
506
512
  transpile(state) {
507
513
  return [
@@ -517,9 +523,10 @@ class GotoStatement extends Statement {
517
523
  exports.GotoStatement = GotoStatement;
518
524
  class LabelStatement extends Statement {
519
525
  constructor(tokens) {
526
+ var _a;
520
527
  super();
521
528
  this.tokens = tokens;
522
- this.range = util_1.util.createRangeFromPositions(this.tokens.identifier.range.start, this.tokens.colon.range.end);
529
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.identifier, this.tokens.colon)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
523
530
  }
524
531
  transpile(state) {
525
532
  return [
@@ -538,7 +545,7 @@ class ReturnStatement extends Statement {
538
545
  super();
539
546
  this.tokens = tokens;
540
547
  this.value = value;
541
- this.range = util_1.util.createRangeFromPositions(this.tokens.return.range.start, ((_a = this.value) === null || _a === void 0 ? void 0 : _a.range.end) || this.tokens.return.range.end);
548
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.return, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
542
549
  }
543
550
  transpile(state) {
544
551
  let result = [];
@@ -558,9 +565,10 @@ class ReturnStatement extends Statement {
558
565
  exports.ReturnStatement = ReturnStatement;
559
566
  class EndStatement extends Statement {
560
567
  constructor(tokens) {
568
+ var _a, _b;
561
569
  super();
562
570
  this.tokens = tokens;
563
- this.range = util_1.util.createRangeFromPositions(this.tokens.end.range.start, this.tokens.end.range.end);
571
+ this.range = (_b = (_a = this.tokens.end) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
564
572
  }
565
573
  transpile(state) {
566
574
  return [
@@ -574,9 +582,10 @@ class EndStatement extends Statement {
574
582
  exports.EndStatement = EndStatement;
575
583
  class StopStatement extends Statement {
576
584
  constructor(tokens) {
585
+ var _a, _b;
577
586
  super();
578
587
  this.tokens = tokens;
579
- this.range = util_1.util.createRangeFromPositions(this.tokens.stop.range.start, this.tokens.stop.range.end);
588
+ this.range = (_b = (_a = this.tokens.stop) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
580
589
  }
581
590
  transpile(state) {
582
591
  return [
@@ -590,7 +599,7 @@ class StopStatement extends Statement {
590
599
  exports.StopStatement = StopStatement;
591
600
  class ForStatement extends Statement {
592
601
  constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
593
- var _a, _b;
602
+ var _a;
594
603
  super();
595
604
  this.forToken = forToken;
596
605
  this.counterDeclaration = counterDeclaration;
@@ -600,8 +609,7 @@ class ForStatement extends Statement {
600
609
  this.endForToken = endForToken;
601
610
  this.stepToken = stepToken;
602
611
  this.increment = increment;
603
- const lastRange = (_b = (_a = this.endForToken) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : body.range;
604
- this.range = util_1.util.createRangeFromPositions(this.forToken.range.start, lastRange.end);
612
+ this.range = (_a = util_1.util.createBoundingRange(this.forToken, this.counterDeclaration, this.toToken, this.finalValue, this.body, this.stepToken, this.increment, this.endForToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
605
613
  }
606
614
  transpile(state) {
607
615
  let result = [];
@@ -621,9 +629,8 @@ class ForStatement extends Statement {
621
629
  state.lineage.unshift(this);
622
630
  result.push(...this.body.transpile(state));
623
631
  state.lineage.shift();
624
- if (this.body.statements.length > 0) {
625
- result.push('\n');
626
- }
632
+ // add new line before "end for"
633
+ result.push('\n');
627
634
  //end for
628
635
  result.push(state.indent(), state.transpileToken(this.endForToken));
629
636
  return result;
@@ -644,7 +651,7 @@ class ForStatement extends Statement {
644
651
  exports.ForStatement = ForStatement;
645
652
  class ForEachStatement extends Statement {
646
653
  constructor(forEachToken, item, inToken, target, body, endForToken) {
647
- var _a, _b, _c, _d, _e;
654
+ var _a;
648
655
  super();
649
656
  this.forEachToken = forEachToken;
650
657
  this.item = item;
@@ -652,7 +659,7 @@ class ForEachStatement extends Statement {
652
659
  this.target = target;
653
660
  this.body = body;
654
661
  this.endForToken = endForToken;
655
- this.range = util_1.util.createRangeFromPositions(this.forEachToken.range.start, ((_e = (_d = (_c = (_b = (_a = this.endForToken) !== null && _a !== void 0 ? _a : this.body) !== null && _b !== void 0 ? _b : this.target) !== null && _c !== void 0 ? _c : this.inToken) !== null && _d !== void 0 ? _d : this.item) !== null && _e !== void 0 ? _e : this.forEachToken).range.end);
662
+ this.range = (_a = util_1.util.createBoundingRange(this.forEachToken, this.item, this.inToken, this.target, this.body, this.endForToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
656
663
  }
657
664
  transpile(state) {
658
665
  let result = [];
@@ -668,9 +675,8 @@ class ForEachStatement extends Statement {
668
675
  state.lineage.unshift(this);
669
676
  result.push(...this.body.transpile(state));
670
677
  state.lineage.shift();
671
- if (this.body.statements.length > 0) {
672
- result.push('\n');
673
- }
678
+ // add new line before "end for"
679
+ result.push('\n');
674
680
  //end for
675
681
  result.push(state.indent(), state.transpileToken(this.endForToken));
676
682
  return result;
@@ -687,13 +693,12 @@ class ForEachStatement extends Statement {
687
693
  exports.ForEachStatement = ForEachStatement;
688
694
  class WhileStatement extends Statement {
689
695
  constructor(tokens, condition, body) {
690
- var _a, _b;
696
+ var _a;
691
697
  super();
692
698
  this.tokens = tokens;
693
699
  this.condition = condition;
694
700
  this.body = body;
695
- const lastRange = (_b = (_a = this.tokens.endWhile) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : body.range;
696
- this.range = util_1.util.createRangeFromPositions(this.tokens.while.range.start, lastRange.end);
701
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.while, this.condition, this.body, this.tokens.endWhile)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
697
702
  }
698
703
  transpile(state) {
699
704
  let result = [];
@@ -722,12 +727,15 @@ class WhileStatement extends Statement {
722
727
  }
723
728
  exports.WhileStatement = WhileStatement;
724
729
  class DottedSetStatement extends Statement {
725
- constructor(obj, name, value) {
730
+ constructor(obj, name, value, dot, operator) {
731
+ var _a;
726
732
  super();
727
733
  this.obj = obj;
728
734
  this.name = name;
729
735
  this.value = value;
730
- this.range = util_1.util.createRangeFromPositions(this.obj.range.start, this.value.range.end);
736
+ this.dot = dot;
737
+ this.operator = operator;
738
+ this.range = (_a = util_1.util.createBoundingRange(this.obj, this.dot, this.name, this.operator, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
731
739
  }
732
740
  transpile(state) {
733
741
  var _a, _b;
@@ -757,14 +765,16 @@ class DottedSetStatement extends Statement {
757
765
  }
758
766
  exports.DottedSetStatement = DottedSetStatement;
759
767
  class IndexedSetStatement extends Statement {
760
- constructor(obj, index, value, openingSquare, closingSquare) {
768
+ constructor(obj, index, value, openingSquare, closingSquare, operator) {
769
+ var _a;
761
770
  super();
762
771
  this.obj = obj;
763
772
  this.index = index;
764
773
  this.value = value;
765
774
  this.openingSquare = openingSquare;
766
775
  this.closingSquare = closingSquare;
767
- this.range = util_1.util.createRangeFromPositions(this.obj.range.start, this.value.range.end);
776
+ this.operator = operator;
777
+ this.range = (_a = util_1.util.createBoundingRange(this.obj, this.openingSquare, this.index, this.closingSquare, this.operator, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
768
778
  }
769
779
  transpile(state) {
770
780
  var _a, _b;
@@ -800,9 +810,10 @@ class IndexedSetStatement extends Statement {
800
810
  exports.IndexedSetStatement = IndexedSetStatement;
801
811
  class LibraryStatement extends Statement {
802
812
  constructor(tokens) {
813
+ var _a;
803
814
  super();
804
815
  this.tokens = tokens;
805
- this.range = util_1.util.createRangeFromPositions(this.tokens.library.range.start, this.tokens.filePath ? this.tokens.filePath.range.end : this.tokens.library.range.end);
816
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
806
817
  }
807
818
  transpile(state) {
808
819
  let result = [];
@@ -835,8 +846,14 @@ class NamespaceStatement extends Statement {
835
846
  this.symbolTable = new SymbolTable_1.SymbolTable(parentSymbolTable);
836
847
  }
837
848
  get range() {
838
- var _a, _b, _c;
839
- return util_1.util.createRangeFromPositions(this.keyword.range.start, ((_c = (_b = (_a = this.endKeyword) !== null && _a !== void 0 ? _a : this.body) !== null && _b !== void 0 ? _b : this.nameExpression) !== null && _c !== void 0 ? _c : this.keyword).range.end);
849
+ return this.cacheRange();
850
+ }
851
+ cacheRange() {
852
+ var _a;
853
+ if (!this._range) {
854
+ this._range = (_a = util_1.util.createBoundingRange(this.keyword, this.nameExpression, this.body, this.endKeyword)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
855
+ }
856
+ return this._range;
840
857
  }
841
858
  getName(parseMode) {
842
859
  return this.nameExpression.getName(parseMode);
@@ -869,10 +886,11 @@ class NamespaceStatement extends Statement {
869
886
  exports.NamespaceStatement = NamespaceStatement;
870
887
  class ImportStatement extends Statement {
871
888
  constructor(importToken, filePathToken) {
889
+ var _a;
872
890
  super();
873
891
  this.importToken = importToken;
874
892
  this.filePathToken = filePathToken;
875
- this.range = util_1.util.createRangeFromPositions(importToken.range.start, (filePathToken !== null && filePathToken !== void 0 ? filePathToken : importToken).range.end);
893
+ this.range = (_a = util_1.util.createBoundingRange(this.importToken, this.filePathToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
876
894
  if (this.filePathToken) {
877
895
  //remove quotes
878
896
  this.filePath = this.filePathToken.text.replace(/"/g, '');
@@ -908,6 +926,7 @@ class ImportStatement extends Statement {
908
926
  exports.ImportStatement = ImportStatement;
909
927
  class InterfaceStatement extends Statement {
910
928
  constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
929
+ var _a;
911
930
  super();
912
931
  this.parentInterfaceName = parentInterfaceName;
913
932
  this.body = body;
@@ -917,6 +936,7 @@ class InterfaceStatement extends Statement {
917
936
  this.tokens.name = name;
918
937
  this.tokens.extends = extendsToken;
919
938
  this.tokens.endInterface = endInterfaceToken;
939
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
920
940
  }
921
941
  get fields() {
922
942
  return this.body.filter(x => (0, reflection_1.isInterfaceFieldStatement)(x));
@@ -994,20 +1014,21 @@ class InterfaceStatement extends Statement {
994
1014
  }
995
1015
  exports.InterfaceStatement = InterfaceStatement;
996
1016
  class InterfaceFieldStatement extends Statement {
997
- constructor(nameToken, asToken, typeToken, type) {
1017
+ constructor(nameToken, asToken, type) {
1018
+ var _a;
998
1019
  super();
999
1020
  this.type = type;
1000
1021
  this.tokens = {};
1001
1022
  this.tokens.name = nameToken;
1002
1023
  this.tokens.as = asToken;
1003
- this.tokens.type = typeToken;
1024
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1004
1025
  }
1005
1026
  transpile(state) {
1006
1027
  throw new Error('Method not implemented.');
1007
1028
  }
1008
- get range() {
1009
- var _a, _b;
1010
- return util_1.util.createRangeFromPositions(this.tokens.name.range.start, ((_b = (_a = this.tokens.type) !== null && _a !== void 0 ? _a : this.tokens.as) !== null && _b !== void 0 ? _b : this.tokens.name).range.end);
1029
+ getType() {
1030
+ var _a;
1031
+ return (_a = this.type) === null || _a === void 0 ? void 0 : _a.type;
1011
1032
  }
1012
1033
  get name() {
1013
1034
  return this.tokens.name.text;
@@ -1016,21 +1037,22 @@ class InterfaceFieldStatement extends Statement {
1016
1037
  //nothing to walk
1017
1038
  }
1018
1039
  getTypedef(state) {
1019
- var _a, _b, _c;
1040
+ var _a;
1020
1041
  const result = [];
1021
1042
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1022
1043
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1023
1044
  }
1024
1045
  result.push(this.tokens.name.text);
1025
- if (((_c = (_b = this.tokens.type) === null || _b === void 0 ? void 0 : _b.text) === null || _c === void 0 ? void 0 : _c.length) > 0) {
1026
- result.push(' as ', this.tokens.type.text);
1046
+ if (this.tokens.as && this.type) {
1047
+ result.push(' as ', ...this.type.transpile(state));
1027
1048
  }
1028
1049
  return result;
1029
1050
  }
1030
1051
  }
1031
1052
  exports.InterfaceFieldStatement = InterfaceFieldStatement;
1032
1053
  class InterfaceMethodStatement extends Statement {
1033
- constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeToken, returnType) {
1054
+ constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnType) {
1055
+ var _a;
1034
1056
  super();
1035
1057
  this.params = params;
1036
1058
  this.returnType = returnType;
@@ -1040,20 +1062,16 @@ class InterfaceMethodStatement extends Statement {
1040
1062
  this.tokens.leftParen = leftParen;
1041
1063
  this.tokens.rightParen = rightParen;
1042
1064
  this.tokens.as = asToken;
1043
- this.tokens.returnType = returnTypeToken;
1044
- }
1045
- transpile(state) {
1046
- throw new Error('Method not implemented.');
1065
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.tokens.leftParen, ...this.params, this.tokens.rightParen, this.tokens.as, this.returnType)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1047
1066
  }
1048
- get range() {
1049
- var _a, _b, _c, _d, _e, _f, _g, _h;
1050
- return util_1.util.createRangeFromPositions(this.tokens.name.range.start, ((_h = (_g = (_f = (_c = (_b = (_a = this.tokens.returnType) !== null && _a !== void 0 ? _a : this.tokens.as) !== null && _b !== void 0 ? _b : this.tokens.rightParen) !== null && _c !== void 0 ? _c : (_d = this.params) === null || _d === void 0 ? void 0 : _d[((_e = this.params) === null || _e === void 0 ? void 0 : _e.length) - 1]) !== null && _f !== void 0 ? _f : this.tokens.leftParen) !== null && _g !== void 0 ? _g : this.tokens.name) !== null && _h !== void 0 ? _h : this.tokens.functionType).range.end);
1067
+ getReturnType() {
1068
+ return this.returnType.type;
1051
1069
  }
1052
1070
  walk(visitor, options) {
1053
1071
  //nothing to walk
1054
1072
  }
1055
1073
  getTypedef(state) {
1056
- var _a, _b, _c, _d, _e;
1074
+ var _a, _b;
1057
1075
  const result = [];
1058
1076
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1059
1077
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
@@ -1066,16 +1084,19 @@ class InterfaceMethodStatement extends Statement {
1066
1084
  }
1067
1085
  const param = params[i];
1068
1086
  result.push(param.name.text);
1069
- if (((_d = (_c = param.typeToken) === null || _c === void 0 ? void 0 : _c.text) === null || _d === void 0 ? void 0 : _d.length) > 0) {
1070
- result.push(' as ', param.typeToken.text);
1087
+ if (param.asToken && param.type) {
1088
+ result.push(' as ', ...param.type.transpile(state));
1071
1089
  }
1072
1090
  }
1073
1091
  result.push(')');
1074
- if (((_e = this.tokens.returnType) === null || _e === void 0 ? void 0 : _e.text.length) > 0) {
1075
- result.push(' as ', this.tokens.returnType.text);
1092
+ if (this.returnType) {
1093
+ result.push(' as ', ...this.returnType.transpile(state));
1076
1094
  }
1077
1095
  return result;
1078
1096
  }
1097
+ transpile(state) {
1098
+ throw new Error('Method not implemented.');
1099
+ }
1079
1100
  }
1080
1101
  exports.InterfaceMethodStatement = InterfaceMethodStatement;
1081
1102
  class ClassStatement extends Statement {
@@ -1084,7 +1105,7 @@ class ClassStatement extends Statement {
1084
1105
  * The name of the class (without namespace prefix)
1085
1106
  */
1086
1107
  name, body, end, extendsKeyword, parentClassName, namespaceName, currentSymbolTable) {
1087
- var _a, _b, _c;
1108
+ var _a, _b, _c, _d;
1088
1109
  super();
1089
1110
  this.classKeyword = classKeyword;
1090
1111
  this.name = name;
@@ -1101,15 +1122,15 @@ class ClassStatement extends Statement {
1101
1122
  this.fields = [];
1102
1123
  this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1103
1124
  this.symbolTable.setParent(currentSymbolTable);
1104
- this.range = util_1.util.createRangeFromPositions(this.classKeyword.range.start, this.end.range.end);
1125
+ this.range = (_b = util_1.util.createBoundingRange(this.classKeyword, this.name, this.extendsKeyword, this.parentClassName, ...this.body, this.end)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
1105
1126
  for (let statement of this.body) {
1106
1127
  if ((0, reflection_1.isClassMethodStatement)(statement)) {
1107
1128
  this.methods.push(statement);
1108
- this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
1129
+ this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
1109
1130
  }
1110
1131
  else if ((0, reflection_1.isClassFieldStatement)(statement)) {
1111
1132
  this.fields.push(statement);
1112
- this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
1133
+ this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
1113
1134
  }
1114
1135
  }
1115
1136
  }
@@ -1172,6 +1193,7 @@ class ClassStatement extends Statement {
1172
1193
  }
1173
1194
  getTypedef(state) {
1174
1195
  var _a, _b;
1196
+ this.ensureConstructorFunctionExists();
1175
1197
  const result = [];
1176
1198
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1177
1199
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
@@ -1275,14 +1297,16 @@ class ClassStatement extends Statement {
1275
1297
  }
1276
1298
  }
1277
1299
  getEmptyNewFunction() {
1278
- let stmt = Parser_1.Parser.parse(`
1279
- class UtilClass
1280
- sub new()
1281
- end sub
1282
- end class
1283
- `, { mode: Parser_1.ParseMode.BrighterScript }).statements[0].memberMap.new;
1284
- //TODO make locations point to 0,0 (might not matter?)
1285
- return stmt;
1300
+ return (0, creators_1.createClassMethodStatement)('new', TokenKind_1.TokenKind.Sub);
1301
+ }
1302
+ /**
1303
+ * Create an empty `new` function if class is missing it (simplifies transpile logic)
1304
+ */
1305
+ ensureConstructorFunctionExists() {
1306
+ if (!this.getConstructorFunction()) {
1307
+ this.memberMap.new = this.getEmptyNewFunction();
1308
+ this.body = [this.memberMap.new, ...this.body];
1309
+ }
1286
1310
  }
1287
1311
  /**
1288
1312
  * Determine if the specified field was declared in one of the ancestor classes
@@ -1303,6 +1327,7 @@ class ClassStatement extends Statement {
1303
1327
  */
1304
1328
  getTranspiledBuilder(state) {
1305
1329
  var _a;
1330
+ this.ensureConstructorFunctionExists();
1306
1331
  let result = [];
1307
1332
  result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
1308
1333
  state.blockDepth++;
@@ -1323,11 +1348,6 @@ class ClassStatement extends Statement {
1323
1348
  }
1324
1349
  result.push(state.newline, state.indent());
1325
1350
  let parentClassIndex = this.getParentClassIndex(state);
1326
- //create empty `new` function if class is missing it (simplifies transpile logic)
1327
- if (!this.getConstructorFunction()) {
1328
- this.memberMap.new = this.getEmptyNewFunction();
1329
- this.body = [this.memberMap.new, ...this.body];
1330
- }
1331
1351
  for (let statement of this.body) {
1332
1352
  //is field statement
1333
1353
  if ((0, reflection_1.isClassFieldStatement)(statement)) {
@@ -1412,11 +1432,19 @@ class ClassStatement extends Statement {
1412
1432
  exports.ClassStatement = ClassStatement;
1413
1433
  class ClassMethodStatement extends FunctionStatement {
1414
1434
  constructor(accessModifier, name, func, override) {
1415
- var _a;
1416
1435
  super(name, func, undefined);
1417
1436
  this.accessModifier = accessModifier;
1418
1437
  this.override = override;
1419
- this.range = util_1.util.createRangeFromPositions(((_a = this.accessModifier) !== null && _a !== void 0 ? _a : this.func).range.start, this.func.range.end);
1438
+ }
1439
+ get range() {
1440
+ return this.cacheRange();
1441
+ }
1442
+ cacheRange() {
1443
+ var _a, _b;
1444
+ if (!this._range) {
1445
+ this._range = (_b = util_1.util.createBoundingRange(this.accessModifier, this.override, (_a = this.func) !== null && _a !== void 0 ? _a : this.name)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
1446
+ }
1447
+ return this._range;
1420
1448
  }
1421
1449
  transpile(state) {
1422
1450
  if (this.name.text.toLowerCase() === 'new') {
@@ -1532,7 +1560,7 @@ class ClassMethodStatement extends FunctionStatement {
1532
1560
  exports.ClassMethodStatement = ClassMethodStatement;
1533
1561
  class ClassFieldStatement extends Statement {
1534
1562
  constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
1535
- var _a, _b, _c, _d;
1563
+ var _a;
1536
1564
  super();
1537
1565
  this.accessModifier = accessModifier;
1538
1566
  this.name = name;
@@ -1541,7 +1569,7 @@ class ClassFieldStatement extends Statement {
1541
1569
  this.equal = equal;
1542
1570
  this.initialValue = initialValue;
1543
1571
  this.namespaceName = namespaceName;
1544
- this.range = util_1.util.createRangeFromPositions(((_a = this.accessModifier) !== null && _a !== void 0 ? _a : this.name).range.start, ((_d = (_c = (_b = this.initialValue) !== null && _b !== void 0 ? _b : this.type) !== null && _c !== void 0 ? _c : this.as) !== null && _d !== void 0 ? _d : this.name).range.end);
1572
+ this.range = (_a = util_1.util.createBoundingRange(this.accessModifier, this.name, this.as, this.type, this.equal, this.initialValue)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1545
1573
  }
1546
1574
  /**
1547
1575
  * Derive a ValueKind from the type token, or the initial value.
@@ -1549,7 +1577,7 @@ class ClassFieldStatement extends Statement {
1549
1577
  */
1550
1578
  getType(parseMode = Parser_1.ParseMode.BrighterScript) {
1551
1579
  if (this.type) {
1552
- return util_1.util.tokenToBscType(this.type, parseMode === Parser_1.ParseMode.BrighterScript, this.namespaceName);
1580
+ return this.type.type;
1553
1581
  }
1554
1582
  else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
1555
1583
  return this.initialValue.type;
@@ -1577,7 +1605,8 @@ class ClassFieldStatement extends Statement {
1577
1605
  return result;
1578
1606
  }
1579
1607
  walk(visitor, options) {
1580
- if (this.initialValue && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1608
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1609
+ (0, visitors_1.walk)(this, 'type', visitor, options);
1581
1610
  (0, visitors_1.walk)(this, 'initialValue', visitor, options);
1582
1611
  }
1583
1612
  }
@@ -1585,6 +1614,7 @@ class ClassFieldStatement extends Statement {
1585
1614
  exports.ClassFieldStatement = ClassFieldStatement;
1586
1615
  class TryCatchStatement extends Statement {
1587
1616
  constructor(tryToken, tryBranch, catchToken, exceptionVariable, catchBranch, endTryToken) {
1617
+ var _a;
1588
1618
  super();
1589
1619
  this.tryToken = tryToken;
1590
1620
  this.tryBranch = tryBranch;
@@ -1592,10 +1622,7 @@ class TryCatchStatement extends Statement {
1592
1622
  this.exceptionVariable = exceptionVariable;
1593
1623
  this.catchBranch = catchBranch;
1594
1624
  this.endTryToken = endTryToken;
1595
- }
1596
- get range() {
1597
- var _a, _b, _c, _d, _e;
1598
- return util_1.util.createRangeFromPositions(this.tryToken.range.start, ((_e = (_d = (_c = (_b = (_a = this.endTryToken) !== null && _a !== void 0 ? _a : this.catchBranch) !== null && _b !== void 0 ? _b : this.exceptionVariable) !== null && _c !== void 0 ? _c : this.catchToken) !== null && _d !== void 0 ? _d : this.tryBranch) !== null && _e !== void 0 ? _e : this.tryToken).range.end);
1625
+ this.range = (_a = util_1.util.createBoundingRange(this.tryToken, this.tryBranch, this.catchToken, this.exceptionVariable, this.catchBranch, this.endTryToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1599
1626
  }
1600
1627
  transpile(state) {
1601
1628
  return [
@@ -1626,7 +1653,7 @@ class ThrowStatement extends Statement {
1626
1653
  super();
1627
1654
  this.throwToken = throwToken;
1628
1655
  this.expression = expression;
1629
- this.range = util_1.util.createRangeFromPositions(this.throwToken.range.start, ((_a = this.expression) !== null && _a !== void 0 ? _a : this.throwToken).range.end);
1656
+ this.range = (_a = util_1.util.createBoundingRange(this.throwToken, this.expression)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1630
1657
  }
1631
1658
  transpile(state) {
1632
1659
  const result = [
@@ -1650,4 +1677,152 @@ class ThrowStatement extends Statement {
1650
1677
  }
1651
1678
  }
1652
1679
  exports.ThrowStatement = ThrowStatement;
1680
+ class EnumStatement extends Statement {
1681
+ constructor(tokens, body, namespaceName) {
1682
+ var _a, _b;
1683
+ super();
1684
+ this.tokens = tokens;
1685
+ this.body = body;
1686
+ this.namespaceName = namespaceName;
1687
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1688
+ this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
1689
+ }
1690
+ getMembers() {
1691
+ const result = [];
1692
+ for (const statement of this.body) {
1693
+ if ((0, reflection_1.isEnumMemberStatement)(statement)) {
1694
+ result.push(statement);
1695
+ }
1696
+ }
1697
+ return result;
1698
+ }
1699
+ /**
1700
+ * Get a map of member names and their values.
1701
+ * All values are stored as their AST LiteralExpression representation (i.e. string enum values include the wrapping quotes)
1702
+ */
1703
+ getMemberValueMap() {
1704
+ var _a, _b, _c, _d, _e, _f, _g;
1705
+ const result = new Map();
1706
+ const members = this.getMembers();
1707
+ let currentIntValue = 0;
1708
+ for (const member of members) {
1709
+ //if there is no value, assume an integer and increment the int counter
1710
+ if (!member.value) {
1711
+ result.set((_a = member.name) === null || _a === void 0 ? void 0 : _a.toLowerCase(), currentIntValue.toString());
1712
+ currentIntValue++;
1713
+ //if explicit integer value, use it and increment the int counter
1714
+ }
1715
+ else if ((0, reflection_1.isLiteralExpression)(member.value) && member.value.token.kind === TokenKind_1.TokenKind.IntegerLiteral) {
1716
+ //try parsing as integer literal, then as hex integer literal.
1717
+ let tokenIntValue = (_b = util_1.util.parseInt(member.value.token.text)) !== null && _b !== void 0 ? _b : util_1.util.parseInt(member.value.token.text.replace(/&h/i, '0x'));
1718
+ if (tokenIntValue !== undefined) {
1719
+ currentIntValue = tokenIntValue;
1720
+ currentIntValue++;
1721
+ }
1722
+ result.set((_c = member.name) === null || _c === void 0 ? void 0 : _c.toLowerCase(), member.value.token.text);
1723
+ //all other values
1724
+ }
1725
+ else {
1726
+ result.set((_d = member.name) === null || _d === void 0 ? void 0 : _d.toLowerCase(), (_g = (_f = (_e = member.value) === null || _e === void 0 ? void 0 : _e.token) === null || _f === void 0 ? void 0 : _f.text) !== null && _g !== void 0 ? _g : 'invalid');
1727
+ }
1728
+ }
1729
+ return result;
1730
+ }
1731
+ getMemberValue(name) {
1732
+ return this.getMemberValueMap().get(name.toLowerCase());
1733
+ }
1734
+ /**
1735
+ * The name of the enum (without the namespace prefix)
1736
+ */
1737
+ get name() {
1738
+ var _a;
1739
+ return (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1740
+ }
1741
+ /**
1742
+ * The name of the enum WITH its leading namespace (if applicable)
1743
+ */
1744
+ get fullName() {
1745
+ var _a;
1746
+ const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1747
+ if (name) {
1748
+ if (this.namespaceName) {
1749
+ let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
1750
+ return `${namespaceName}.${name}`;
1751
+ }
1752
+ else {
1753
+ return name;
1754
+ }
1755
+ }
1756
+ else {
1757
+ //return undefined which will allow outside callers to know that this doesn't have a name
1758
+ return undefined;
1759
+ }
1760
+ }
1761
+ transpile(state) {
1762
+ //enum declarations do not exist at runtime, so don't transpile anything...
1763
+ return [];
1764
+ }
1765
+ getTypedef(state) {
1766
+ var _a, _b, _c;
1767
+ const result = [];
1768
+ for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1769
+ result.push(...annotation.getTypedef(state), state.newline, state.indent());
1770
+ }
1771
+ result.push((_b = this.tokens.enum.text) !== null && _b !== void 0 ? _b : 'enum', ' ', this.tokens.name.text);
1772
+ result.push(state.newline);
1773
+ state.blockDepth++;
1774
+ for (const member of this.body) {
1775
+ if ((0, reflection_1.isTypedefProvider)(member)) {
1776
+ result.push(state.indent(), ...member.getTypedef(state), state.newline);
1777
+ }
1778
+ }
1779
+ state.blockDepth--;
1780
+ result.push(state.indent(), (_c = this.tokens.endEnum.text) !== null && _c !== void 0 ? _c : 'end enum');
1781
+ return result;
1782
+ }
1783
+ walk(visitor, options) {
1784
+ if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1785
+ for (let i = 0; i < this.body.length; i++) {
1786
+ (0, visitors_1.walk)(this.body, i, visitor, options, this);
1787
+ }
1788
+ }
1789
+ }
1790
+ }
1791
+ exports.EnumStatement = EnumStatement;
1792
+ class EnumMemberStatement extends Statement {
1793
+ constructor(tokens, value) {
1794
+ var _a;
1795
+ super();
1796
+ this.tokens = tokens;
1797
+ this.value = value;
1798
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1799
+ }
1800
+ /**
1801
+ * The name of the member
1802
+ */
1803
+ get name() {
1804
+ return this.tokens.name.text;
1805
+ }
1806
+ transpile(state) {
1807
+ return [];
1808
+ }
1809
+ getTypedef(state) {
1810
+ const result = [
1811
+ this.tokens.name.text
1812
+ ];
1813
+ if (this.tokens.equal) {
1814
+ result.push(' ', this.tokens.equal.text, ' ');
1815
+ if (this.value) {
1816
+ result.push(...this.value.transpile(state));
1817
+ }
1818
+ }
1819
+ return result;
1820
+ }
1821
+ walk(visitor, options) {
1822
+ if (this.value && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1823
+ (0, visitors_1.walk)(this, 'value', visitor, options);
1824
+ }
1825
+ }
1826
+ }
1827
+ exports.EnumMemberStatement = EnumMemberStatement;
1653
1828
  //# sourceMappingURL=Statement.js.map