brighterscript 1.0.0-alpha.15 → 1.0.0-alpha.16

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 (47) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/DependencyGraph.js +5 -4
  3. package/dist/DependencyGraph.js.map +1 -1
  4. package/dist/Program.js +2 -0
  5. package/dist/Program.js.map +1 -1
  6. package/dist/Scope.js +4 -1
  7. package/dist/Scope.js.map +1 -1
  8. package/dist/astUtils/creators.d.ts +8 -4
  9. package/dist/astUtils/creators.js +87 -6
  10. package/dist/astUtils/creators.js.map +1 -1
  11. package/dist/astUtils/reflection.d.ts +2 -0
  12. package/dist/astUtils/reflection.js +6 -2
  13. package/dist/astUtils/reflection.js.map +1 -1
  14. package/dist/astUtils/reflection.spec.js +5 -4
  15. package/dist/astUtils/reflection.spec.js.map +1 -1
  16. package/dist/diagnosticUtils.js +3 -3
  17. package/dist/diagnosticUtils.js.map +1 -1
  18. package/dist/files/BrsFile.js +10 -4
  19. package/dist/files/BrsFile.js.map +1 -1
  20. package/dist/files/XmlFile.js +3 -3
  21. package/dist/files/XmlFile.js.map +1 -1
  22. package/dist/parser/Expression.d.ts +17 -15
  23. package/dist/parser/Expression.js +47 -38
  24. package/dist/parser/Expression.js.map +1 -1
  25. package/dist/parser/Parser.js +25 -17
  26. package/dist/parser/Parser.js.map +1 -1
  27. package/dist/parser/Statement.d.ts +28 -20
  28. package/dist/parser/Statement.js +105 -93
  29. package/dist/parser/Statement.js.map +1 -1
  30. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  31. package/dist/parser/tests/statement/For.spec.js +46 -0
  32. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  33. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  34. package/dist/parser/tests/statement/ForEach.spec.js +37 -0
  35. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  36. package/dist/types/FunctionType.d.ts +2 -1
  37. package/dist/types/FunctionType.js +11 -8
  38. package/dist/types/FunctionType.js.map +1 -1
  39. package/dist/types/FunctionType.spec.js +6 -0
  40. package/dist/types/FunctionType.spec.js.map +1 -1
  41. package/dist/types/UniversalFunctionType.d.ts +9 -0
  42. package/dist/types/UniversalFunctionType.js +25 -0
  43. package/dist/types/UniversalFunctionType.js.map +1 -0
  44. package/dist/util.d.ts +2 -2
  45. package/dist/util.js +15 -11
  46. package/dist/util.js.map +1 -1
  47. package/package.json +2 -3
@@ -4,7 +4,6 @@ exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = e
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 = [];
@@ -392,10 +399,11 @@ class IfStatement extends Statement {
392
399
  exports.IfStatement = IfStatement;
393
400
  class IncrementStatement extends Statement {
394
401
  constructor(value, operator) {
402
+ var _a;
395
403
  super();
396
404
  this.value = value;
397
405
  this.operator = operator;
398
- this.range = util_1.util.createRangeFromPositions(this.value.range.start, this.operator.range.end);
406
+ this.range = (_a = util_1.util.createBoundingRange(this.value, this.operator)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
399
407
  }
400
408
  transpile(state) {
401
409
  return [
@@ -420,12 +428,11 @@ class PrintStatement extends Statement {
420
428
  * evaluated and printed.
421
429
  */
422
430
  constructor(tokens, expressions) {
431
+ var _a;
423
432
  super();
424
433
  this.tokens = tokens;
425
434
  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);
435
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.print, ...this.expressions)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
429
436
  }
430
437
  transpile(state) {
431
438
  var _a;
@@ -462,14 +469,14 @@ class PrintStatement extends Statement {
462
469
  exports.PrintStatement = PrintStatement;
463
470
  class DimStatement extends Statement {
464
471
  constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
465
- var _a, _b, _c, _d;
472
+ var _a;
466
473
  super();
467
474
  this.dimToken = dimToken;
468
475
  this.identifier = identifier;
469
476
  this.openingSquare = openingSquare;
470
477
  this.dimensions = dimensions;
471
478
  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);
479
+ 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
480
  }
474
481
  transpile(state) {
475
482
  let result = [
@@ -499,9 +506,10 @@ class DimStatement extends Statement {
499
506
  exports.DimStatement = DimStatement;
500
507
  class GotoStatement extends Statement {
501
508
  constructor(tokens) {
509
+ var _a;
502
510
  super();
503
511
  this.tokens = tokens;
504
- this.range = util_1.util.createRangeFromPositions(this.tokens.goto.range.start, this.tokens.label.range.end);
512
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.goto, this.tokens.label)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
505
513
  }
506
514
  transpile(state) {
507
515
  return [
@@ -517,9 +525,10 @@ class GotoStatement extends Statement {
517
525
  exports.GotoStatement = GotoStatement;
518
526
  class LabelStatement extends Statement {
519
527
  constructor(tokens) {
528
+ var _a;
520
529
  super();
521
530
  this.tokens = tokens;
522
- this.range = util_1.util.createRangeFromPositions(this.tokens.identifier.range.start, this.tokens.colon.range.end);
531
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.identifier, this.tokens.colon)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
523
532
  }
524
533
  transpile(state) {
525
534
  return [
@@ -538,7 +547,7 @@ class ReturnStatement extends Statement {
538
547
  super();
539
548
  this.tokens = tokens;
540
549
  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);
550
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.return, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
542
551
  }
543
552
  transpile(state) {
544
553
  let result = [];
@@ -558,9 +567,10 @@ class ReturnStatement extends Statement {
558
567
  exports.ReturnStatement = ReturnStatement;
559
568
  class EndStatement extends Statement {
560
569
  constructor(tokens) {
570
+ var _a, _b;
561
571
  super();
562
572
  this.tokens = tokens;
563
- this.range = util_1.util.createRangeFromPositions(this.tokens.end.range.start, this.tokens.end.range.end);
573
+ this.range = (_b = (_a = this.tokens.end) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
564
574
  }
565
575
  transpile(state) {
566
576
  return [
@@ -574,9 +584,10 @@ class EndStatement extends Statement {
574
584
  exports.EndStatement = EndStatement;
575
585
  class StopStatement extends Statement {
576
586
  constructor(tokens) {
587
+ var _a, _b;
577
588
  super();
578
589
  this.tokens = tokens;
579
- this.range = util_1.util.createRangeFromPositions(this.tokens.stop.range.start, this.tokens.stop.range.end);
590
+ this.range = (_b = (_a = this.tokens.stop) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
580
591
  }
581
592
  transpile(state) {
582
593
  return [
@@ -590,7 +601,7 @@ class StopStatement extends Statement {
590
601
  exports.StopStatement = StopStatement;
591
602
  class ForStatement extends Statement {
592
603
  constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
593
- var _a, _b;
604
+ var _a;
594
605
  super();
595
606
  this.forToken = forToken;
596
607
  this.counterDeclaration = counterDeclaration;
@@ -600,8 +611,7 @@ class ForStatement extends Statement {
600
611
  this.endForToken = endForToken;
601
612
  this.stepToken = stepToken;
602
613
  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);
614
+ 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
615
  }
606
616
  transpile(state) {
607
617
  let result = [];
@@ -621,9 +631,8 @@ class ForStatement extends Statement {
621
631
  state.lineage.unshift(this);
622
632
  result.push(...this.body.transpile(state));
623
633
  state.lineage.shift();
624
- if (this.body.statements.length > 0) {
625
- result.push('\n');
626
- }
634
+ // add new line before "end for"
635
+ result.push('\n');
627
636
  //end for
628
637
  result.push(state.indent(), state.transpileToken(this.endForToken));
629
638
  return result;
@@ -644,7 +653,7 @@ class ForStatement extends Statement {
644
653
  exports.ForStatement = ForStatement;
645
654
  class ForEachStatement extends Statement {
646
655
  constructor(forEachToken, item, inToken, target, body, endForToken) {
647
- var _a, _b, _c, _d, _e;
656
+ var _a;
648
657
  super();
649
658
  this.forEachToken = forEachToken;
650
659
  this.item = item;
@@ -652,7 +661,7 @@ class ForEachStatement extends Statement {
652
661
  this.target = target;
653
662
  this.body = body;
654
663
  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);
664
+ 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
665
  }
657
666
  transpile(state) {
658
667
  let result = [];
@@ -668,9 +677,8 @@ class ForEachStatement extends Statement {
668
677
  state.lineage.unshift(this);
669
678
  result.push(...this.body.transpile(state));
670
679
  state.lineage.shift();
671
- if (this.body.statements.length > 0) {
672
- result.push('\n');
673
- }
680
+ // add new line before "end for"
681
+ result.push('\n');
674
682
  //end for
675
683
  result.push(state.indent(), state.transpileToken(this.endForToken));
676
684
  return result;
@@ -687,13 +695,12 @@ class ForEachStatement extends Statement {
687
695
  exports.ForEachStatement = ForEachStatement;
688
696
  class WhileStatement extends Statement {
689
697
  constructor(tokens, condition, body) {
690
- var _a, _b;
698
+ var _a;
691
699
  super();
692
700
  this.tokens = tokens;
693
701
  this.condition = condition;
694
702
  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);
703
+ 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
704
  }
698
705
  transpile(state) {
699
706
  let result = [];
@@ -722,12 +729,15 @@ class WhileStatement extends Statement {
722
729
  }
723
730
  exports.WhileStatement = WhileStatement;
724
731
  class DottedSetStatement extends Statement {
725
- constructor(obj, name, value) {
732
+ constructor(obj, name, value, dot, operator) {
733
+ var _a;
726
734
  super();
727
735
  this.obj = obj;
728
736
  this.name = name;
729
737
  this.value = value;
730
- this.range = util_1.util.createRangeFromPositions(this.obj.range.start, this.value.range.end);
738
+ this.dot = dot;
739
+ this.operator = operator;
740
+ 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
741
  }
732
742
  transpile(state) {
733
743
  var _a, _b;
@@ -757,14 +767,16 @@ class DottedSetStatement extends Statement {
757
767
  }
758
768
  exports.DottedSetStatement = DottedSetStatement;
759
769
  class IndexedSetStatement extends Statement {
760
- constructor(obj, index, value, openingSquare, closingSquare) {
770
+ constructor(obj, index, value, openingSquare, closingSquare, operator) {
771
+ var _a;
761
772
  super();
762
773
  this.obj = obj;
763
774
  this.index = index;
764
775
  this.value = value;
765
776
  this.openingSquare = openingSquare;
766
777
  this.closingSquare = closingSquare;
767
- this.range = util_1.util.createRangeFromPositions(this.obj.range.start, this.value.range.end);
778
+ this.operator = operator;
779
+ 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
780
  }
769
781
  transpile(state) {
770
782
  var _a, _b;
@@ -800,9 +812,10 @@ class IndexedSetStatement extends Statement {
800
812
  exports.IndexedSetStatement = IndexedSetStatement;
801
813
  class LibraryStatement extends Statement {
802
814
  constructor(tokens) {
815
+ var _a;
803
816
  super();
804
817
  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);
818
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
806
819
  }
807
820
  transpile(state) {
808
821
  let result = [];
@@ -835,8 +848,14 @@ class NamespaceStatement extends Statement {
835
848
  this.symbolTable = new SymbolTable_1.SymbolTable(parentSymbolTable);
836
849
  }
837
850
  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);
851
+ return this.cacheRange();
852
+ }
853
+ cacheRange() {
854
+ var _a;
855
+ if (!this._range) {
856
+ this._range = (_a = util_1.util.createBoundingRange(this.keyword, this.nameExpression, this.body, this.endKeyword)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
857
+ }
858
+ return this._range;
840
859
  }
841
860
  getName(parseMode) {
842
861
  return this.nameExpression.getName(parseMode);
@@ -869,10 +888,11 @@ class NamespaceStatement extends Statement {
869
888
  exports.NamespaceStatement = NamespaceStatement;
870
889
  class ImportStatement extends Statement {
871
890
  constructor(importToken, filePathToken) {
891
+ var _a;
872
892
  super();
873
893
  this.importToken = importToken;
874
894
  this.filePathToken = filePathToken;
875
- this.range = util_1.util.createRangeFromPositions(importToken.range.start, (filePathToken !== null && filePathToken !== void 0 ? filePathToken : importToken).range.end);
895
+ this.range = (_a = util_1.util.createBoundingRange(this.importToken, this.filePathToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
876
896
  if (this.filePathToken) {
877
897
  //remove quotes
878
898
  this.filePath = this.filePathToken.text.replace(/"/g, '');
@@ -908,6 +928,7 @@ class ImportStatement extends Statement {
908
928
  exports.ImportStatement = ImportStatement;
909
929
  class InterfaceStatement extends Statement {
910
930
  constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
931
+ var _a;
911
932
  super();
912
933
  this.parentInterfaceName = parentInterfaceName;
913
934
  this.body = body;
@@ -917,6 +938,7 @@ class InterfaceStatement extends Statement {
917
938
  this.tokens.name = name;
918
939
  this.tokens.extends = extendsToken;
919
940
  this.tokens.endInterface = endInterfaceToken;
941
+ 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
942
  }
921
943
  get fields() {
922
944
  return this.body.filter(x => (0, reflection_1.isInterfaceFieldStatement)(x));
@@ -995,20 +1017,18 @@ class InterfaceStatement extends Statement {
995
1017
  exports.InterfaceStatement = InterfaceStatement;
996
1018
  class InterfaceFieldStatement extends Statement {
997
1019
  constructor(nameToken, asToken, typeToken, type) {
1020
+ var _a;
998
1021
  super();
999
1022
  this.type = type;
1000
1023
  this.tokens = {};
1001
1024
  this.tokens.name = nameToken;
1002
1025
  this.tokens.as = asToken;
1003
1026
  this.tokens.type = typeToken;
1027
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.tokens.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1004
1028
  }
1005
1029
  transpile(state) {
1006
1030
  throw new Error('Method not implemented.');
1007
1031
  }
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);
1011
- }
1012
1032
  get name() {
1013
1033
  return this.tokens.name.text;
1014
1034
  }
@@ -1031,6 +1051,7 @@ class InterfaceFieldStatement extends Statement {
1031
1051
  exports.InterfaceFieldStatement = InterfaceFieldStatement;
1032
1052
  class InterfaceMethodStatement extends Statement {
1033
1053
  constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeToken, returnType) {
1054
+ var _a;
1034
1055
  super();
1035
1056
  this.params = params;
1036
1057
  this.returnType = returnType;
@@ -1041,13 +1062,7 @@ class InterfaceMethodStatement extends Statement {
1041
1062
  this.tokens.rightParen = rightParen;
1042
1063
  this.tokens.as = asToken;
1043
1064
  this.tokens.returnType = returnTypeToken;
1044
- }
1045
- transpile(state) {
1046
- throw new Error('Method not implemented.');
1047
- }
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);
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.tokens.returnType)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1051
1066
  }
1052
1067
  walk(visitor, options) {
1053
1068
  //nothing to walk
@@ -1076,6 +1091,9 @@ class InterfaceMethodStatement extends Statement {
1076
1091
  }
1077
1092
  return result;
1078
1093
  }
1094
+ transpile(state) {
1095
+ throw new Error('Method not implemented.');
1096
+ }
1079
1097
  }
1080
1098
  exports.InterfaceMethodStatement = InterfaceMethodStatement;
1081
1099
  class ClassStatement extends Statement {
@@ -1084,7 +1102,7 @@ class ClassStatement extends Statement {
1084
1102
  * The name of the class (without namespace prefix)
1085
1103
  */
1086
1104
  name, body, end, extendsKeyword, parentClassName, namespaceName, currentSymbolTable) {
1087
- var _a, _b, _c;
1105
+ var _a, _b, _c, _d;
1088
1106
  super();
1089
1107
  this.classKeyword = classKeyword;
1090
1108
  this.name = name;
@@ -1101,15 +1119,15 @@ class ClassStatement extends Statement {
1101
1119
  this.fields = [];
1102
1120
  this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1103
1121
  this.symbolTable.setParent(currentSymbolTable);
1104
- this.range = util_1.util.createRangeFromPositions(this.classKeyword.range.start, this.end.range.end);
1122
+ 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
1123
  for (let statement of this.body) {
1106
1124
  if ((0, reflection_1.isClassMethodStatement)(statement)) {
1107
1125
  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;
1126
+ this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
1109
1127
  }
1110
1128
  else if ((0, reflection_1.isClassFieldStatement)(statement)) {
1111
1129
  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;
1130
+ this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
1113
1131
  }
1114
1132
  }
1115
1133
  }
@@ -1275,14 +1293,7 @@ class ClassStatement extends Statement {
1275
1293
  }
1276
1294
  }
1277
1295
  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;
1296
+ return (0, creators_1.createClassMethodStatement)('new', TokenKind_1.TokenKind.Sub);
1286
1297
  }
1287
1298
  /**
1288
1299
  * Determine if the specified field was declared in one of the ancestor classes
@@ -1412,11 +1423,19 @@ class ClassStatement extends Statement {
1412
1423
  exports.ClassStatement = ClassStatement;
1413
1424
  class ClassMethodStatement extends FunctionStatement {
1414
1425
  constructor(accessModifier, name, func, override) {
1415
- var _a;
1416
1426
  super(name, func, undefined);
1417
1427
  this.accessModifier = accessModifier;
1418
1428
  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);
1429
+ }
1430
+ get range() {
1431
+ return this.cacheRange();
1432
+ }
1433
+ cacheRange() {
1434
+ var _a, _b;
1435
+ if (!this._range) {
1436
+ 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;
1437
+ }
1438
+ return this._range;
1420
1439
  }
1421
1440
  transpile(state) {
1422
1441
  if (this.name.text.toLowerCase() === 'new') {
@@ -1532,7 +1551,7 @@ class ClassMethodStatement extends FunctionStatement {
1532
1551
  exports.ClassMethodStatement = ClassMethodStatement;
1533
1552
  class ClassFieldStatement extends Statement {
1534
1553
  constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
1535
- var _a, _b, _c, _d;
1554
+ var _a;
1536
1555
  super();
1537
1556
  this.accessModifier = accessModifier;
1538
1557
  this.name = name;
@@ -1541,7 +1560,7 @@ class ClassFieldStatement extends Statement {
1541
1560
  this.equal = equal;
1542
1561
  this.initialValue = initialValue;
1543
1562
  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);
1563
+ 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
1564
  }
1546
1565
  /**
1547
1566
  * Derive a ValueKind from the type token, or the initial value.
@@ -1585,6 +1604,7 @@ class ClassFieldStatement extends Statement {
1585
1604
  exports.ClassFieldStatement = ClassFieldStatement;
1586
1605
  class TryCatchStatement extends Statement {
1587
1606
  constructor(tryToken, tryBranch, catchToken, exceptionVariable, catchBranch, endTryToken) {
1607
+ var _a;
1588
1608
  super();
1589
1609
  this.tryToken = tryToken;
1590
1610
  this.tryBranch = tryBranch;
@@ -1592,10 +1612,7 @@ class TryCatchStatement extends Statement {
1592
1612
  this.exceptionVariable = exceptionVariable;
1593
1613
  this.catchBranch = catchBranch;
1594
1614
  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);
1615
+ 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
1616
  }
1600
1617
  transpile(state) {
1601
1618
  return [
@@ -1626,7 +1643,7 @@ class ThrowStatement extends Statement {
1626
1643
  super();
1627
1644
  this.throwToken = throwToken;
1628
1645
  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);
1646
+ this.range = (_a = util_1.util.createBoundingRange(this.throwToken, this.expression)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1630
1647
  }
1631
1648
  transpile(state) {
1632
1649
  const result = [
@@ -1652,16 +1669,13 @@ class ThrowStatement extends Statement {
1652
1669
  exports.ThrowStatement = ThrowStatement;
1653
1670
  class EnumStatement extends Statement {
1654
1671
  constructor(tokens, body, namespaceName) {
1655
- var _a;
1672
+ var _a, _b;
1656
1673
  super();
1657
1674
  this.tokens = tokens;
1658
1675
  this.body = body;
1659
1676
  this.namespaceName = namespaceName;
1660
- this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1661
- }
1662
- get range() {
1663
- var _a, _b, _c;
1664
- return util_1.util.createRangeFromPositions((_a = this.tokens.enum.range.start) !== null && _a !== void 0 ? _a : vscode_languageserver_1.Position.create(0, 0), ((_c = (_b = this.tokens.endEnum) !== null && _b !== void 0 ? _b : this.tokens.name) !== null && _c !== void 0 ? _c : this.tokens.enum).range.end);
1677
+ 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;
1678
+ this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
1665
1679
  }
1666
1680
  getMembers() {
1667
1681
  const result = [];
@@ -1767,9 +1781,11 @@ class EnumStatement extends Statement {
1767
1781
  exports.EnumStatement = EnumStatement;
1768
1782
  class EnumMemberStatement extends Statement {
1769
1783
  constructor(tokens, value) {
1784
+ var _a;
1770
1785
  super();
1771
1786
  this.tokens = tokens;
1772
1787
  this.value = value;
1788
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1773
1789
  }
1774
1790
  /**
1775
1791
  * The name of the member
@@ -1777,10 +1793,6 @@ class EnumMemberStatement extends Statement {
1777
1793
  get name() {
1778
1794
  return this.tokens.name.text;
1779
1795
  }
1780
- get range() {
1781
- var _a, _b, _c, _d, _e;
1782
- return util_1.util.createRangeFromPositions((_c = ((_b = (_a = this.tokens.name) !== null && _a !== void 0 ? _a : this.tokens.equal) !== null && _b !== void 0 ? _b : this.value).range.start) !== null && _c !== void 0 ? _c : vscode_languageserver_1.Position.create(0, 0), ((_e = (_d = this.value) !== null && _d !== void 0 ? _d : this.tokens.equal) !== null && _e !== void 0 ? _e : this.tokens.name).range.end);
1783
- }
1784
1796
  transpile(state) {
1785
1797
  return [];
1786
1798
  }