brighterscript 1.0.0-alpha.20 → 1.0.0-alpha.23

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 (100) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/README.md +6 -3
  3. package/bsconfig.schema.json +10 -2
  4. package/dist/BsConfig.d.ts +5 -0
  5. package/dist/Cache.d.ts +5 -1
  6. package/dist/Cache.js +6 -0
  7. package/dist/Cache.js.map +1 -1
  8. package/dist/DependencyGraph.d.ts +2 -2
  9. package/dist/DependencyGraph.js +15 -3
  10. package/dist/DependencyGraph.js.map +1 -1
  11. package/dist/DiagnosticCollection.d.ts +5 -3
  12. package/dist/DiagnosticCollection.js +10 -12
  13. package/dist/DiagnosticCollection.js.map +1 -1
  14. package/dist/DiagnosticFilterer.js +4 -3
  15. package/dist/DiagnosticFilterer.js.map +1 -1
  16. package/dist/DiagnosticMessages.d.ts +6 -1
  17. package/dist/DiagnosticMessages.js +9 -4
  18. package/dist/DiagnosticMessages.js.map +1 -1
  19. package/dist/LanguageServer.d.ts +48 -25
  20. package/dist/LanguageServer.js +303 -222
  21. package/dist/LanguageServer.js.map +1 -1
  22. package/dist/Program.d.ts +7 -3
  23. package/dist/Program.js +60 -22
  24. package/dist/Program.js.map +1 -1
  25. package/dist/ProgramBuilder.js +11 -11
  26. package/dist/ProgramBuilder.js.map +1 -1
  27. package/dist/Scope.d.ts +41 -15
  28. package/dist/Scope.js +86 -21
  29. package/dist/Scope.js.map +1 -1
  30. package/dist/SymbolTable.js +15 -0
  31. package/dist/SymbolTable.js.map +1 -1
  32. package/dist/XmlScope.d.ts +3 -3
  33. package/dist/astUtils/AstEditor.d.ts +32 -0
  34. package/dist/astUtils/AstEditor.js +132 -0
  35. package/dist/astUtils/AstEditor.js.map +1 -1
  36. package/dist/astUtils/AstEditor.spec.js +118 -34
  37. package/dist/astUtils/AstEditor.spec.js.map +1 -1
  38. package/dist/astUtils/creators.d.ts +6 -2
  39. package/dist/astUtils/creators.js +9 -2
  40. package/dist/astUtils/creators.js.map +1 -1
  41. package/dist/astUtils/reflection.d.ts +6 -3
  42. package/dist/astUtils/reflection.js +18 -8
  43. package/dist/astUtils/reflection.js.map +1 -1
  44. package/dist/astUtils/visitors.d.ts +74 -64
  45. package/dist/astUtils/visitors.js +30 -10
  46. package/dist/astUtils/visitors.js.map +1 -1
  47. package/dist/astUtils/visitors.spec.js +95 -3
  48. package/dist/astUtils/visitors.spec.js.map +1 -1
  49. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +7 -1
  50. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +55 -54
  51. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  52. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +205 -17
  53. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  54. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +13 -25
  55. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
  56. package/dist/bscPlugin/validation/ScopeValidator.js +26 -20
  57. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  58. package/dist/cli.js +1 -0
  59. package/dist/cli.js.map +1 -1
  60. package/dist/files/BrsFile.Class.spec.js +167 -2
  61. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  62. package/dist/files/BrsFile.d.ts +8 -0
  63. package/dist/files/BrsFile.js +48 -30
  64. package/dist/files/BrsFile.js.map +1 -1
  65. package/dist/files/BrsFile.spec.js +183 -0
  66. package/dist/files/BrsFile.spec.js.map +1 -1
  67. package/dist/files/XmlFile.d.ts +5 -5
  68. package/dist/files/XmlFile.js +5 -4
  69. package/dist/files/XmlFile.js.map +1 -1
  70. package/dist/index.js +5 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/interfaces.d.ts +18 -2
  73. package/dist/parser/BrsTranspileState.d.ts +2 -0
  74. package/dist/parser/BrsTranspileState.js +5 -0
  75. package/dist/parser/BrsTranspileState.js.map +1 -1
  76. package/dist/parser/Expression.js +6 -23
  77. package/dist/parser/Expression.js.map +1 -1
  78. package/dist/parser/Parser.Class.spec.js.map +1 -1
  79. package/dist/parser/Parser.d.ts +8 -4
  80. package/dist/parser/Parser.js +40 -7
  81. package/dist/parser/Parser.js.map +1 -1
  82. package/dist/parser/Parser.spec.js +51 -7
  83. package/dist/parser/Parser.spec.js.map +1 -1
  84. package/dist/parser/Statement.d.ts +20 -20
  85. package/dist/parser/Statement.js +108 -90
  86. package/dist/parser/Statement.js.map +1 -1
  87. package/dist/parser/tests/statement/Enum.spec.js +39 -6
  88. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  89. package/dist/parser/tests/statement/InterfaceStatement.spec.js +16 -2
  90. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  91. package/dist/types/EnumType.d.ts +22 -0
  92. package/dist/types/EnumType.js +55 -0
  93. package/dist/types/EnumType.js.map +1 -0
  94. package/dist/util.d.ts +6 -7
  95. package/dist/util.js +32 -24
  96. package/dist/util.js.map +1 -1
  97. package/dist/validators/ClassValidator.d.ts +4 -0
  98. package/dist/validators/ClassValidator.js +27 -7
  99. package/dist/validators/ClassValidator.js.map +1 -1
  100. package/package.json +11 -11
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = 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.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 = 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");
@@ -12,6 +12,8 @@ const DynamicType_1 = require("../types/DynamicType");
12
12
  const SymbolTable_1 = require("../SymbolTable");
13
13
  const CustomType_1 = require("../types/CustomType");
14
14
  const InterfaceType_1 = require("../types/InterfaceType");
15
+ const EnumType_1 = require("../types/EnumType");
16
+ const FunctionType_1 = require("../types/FunctionType");
15
17
  /**
16
18
  * A BrightScript statement
17
19
  */
@@ -92,9 +94,7 @@ class Body extends Statement {
92
94
  }
93
95
  walk(visitor, options) {
94
96
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
95
- for (let i = 0; i < this.statements.length; i++) {
96
- (0, visitors_1.walk)(this.statements, i, visitor, options, this);
97
- }
97
+ (0, visitors_1.walkArray)(this.statements, visitor, options, this);
98
98
  }
99
99
  }
100
100
  }
@@ -166,9 +166,7 @@ class Block extends Statement {
166
166
  }
167
167
  walk(visitor, options) {
168
168
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
169
- for (let i = 0; i < this.statements.length; i++) {
170
- (0, visitors_1.walk)(this.statements, i, visitor, options, this);
171
- }
169
+ (0, visitors_1.walkArray)(this.statements, visitor, options, this);
172
170
  }
173
171
  }
174
172
  }
@@ -456,12 +454,8 @@ class PrintStatement extends Statement {
456
454
  }
457
455
  walk(visitor, options) {
458
456
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
459
- for (let i = 0; i < this.expressions.length; i++) {
460
- //sometimes we have semicolon `Token`s in the expressions list (should probably fix that...), so only emit the actual expressions
461
- if ((0, reflection_1.isExpression)(this.expressions[i])) {
462
- (0, visitors_1.walk)(this.expressions, i, visitor, options, this);
463
- }
464
- }
457
+ //sometimes we have semicolon Tokens in the expressions list (should probably fix that...), so only walk the actual expressions
458
+ (0, visitors_1.walkArray)(this.expressions, visitor, options, this, (item) => (0, reflection_1.isExpression)(item));
465
459
  }
466
460
  }
467
461
  }
@@ -496,9 +490,7 @@ class DimStatement extends Statement {
496
490
  walk(visitor, options) {
497
491
  var _a;
498
492
  if (((_a = this.dimensions) === null || _a === void 0 ? void 0 : _a.length) > 0 && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
499
- for (let i = 0; i < this.dimensions.length; i++) {
500
- (0, visitors_1.walk)(this.dimensions, i, visitor, options, this);
501
- }
493
+ (0, visitors_1.walkArray)(this.dimensions, visitor, options, this);
502
494
  }
503
495
  }
504
496
  }
@@ -950,29 +942,9 @@ class InterfaceStatement extends Statement {
950
942
  }
951
943
  else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
952
944
  this.fields.push(statement);
953
- this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
954
- }
955
- }
956
- }
957
- /**
958
- * The name of the interface WITH its leading namespace (if applicable)
959
- */
960
- getName(parseMode) {
961
- var _a;
962
- const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
963
- if (name) {
964
- if (this.namespaceName) {
965
- let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
966
- return `${namespaceName}.${name}`;
967
- }
968
- else {
969
- return name;
945
+ this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
970
946
  }
971
947
  }
972
- else {
973
- //return undefined which will allow outside callers to know that this interface doesn't have a name
974
- return undefined;
975
- }
976
948
  }
977
949
  buildSymbolTable(parentIface) {
978
950
  var _a, _b;
@@ -985,7 +957,7 @@ class InterfaceStatement extends Statement {
985
957
  this.memberTable.addSymbol((_a = statement === null || statement === void 0 ? void 0 : statement.name) === null || _a === void 0 ? void 0 : _a.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType);
986
958
  }
987
959
  for (const statement of this.fields) {
988
- this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
960
+ this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
989
961
  }
990
962
  }
991
963
  hasParent() {
@@ -1018,6 +990,26 @@ class InterfaceStatement extends Statement {
1018
990
  getThisBscType() {
1019
991
  return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
1020
992
  }
993
+ /**
994
+ * The name of the interface WITH its leading namespace (if applicable)
995
+ */
996
+ getName(parseMode) {
997
+ var _a;
998
+ const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
999
+ if (name) {
1000
+ if (this.namespaceName) {
1001
+ let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
1002
+ return `${namespaceName}.${name}`;
1003
+ }
1004
+ else {
1005
+ return name;
1006
+ }
1007
+ }
1008
+ else {
1009
+ //return undefined which will allow outside callers to know that this interface doesn't have a name
1010
+ return undefined;
1011
+ }
1012
+ }
1021
1013
  transpile(state) {
1022
1014
  //interfaces should completely disappear at runtime
1023
1015
  return [];
@@ -1053,9 +1045,7 @@ class InterfaceStatement extends Statement {
1053
1045
  }
1054
1046
  walk(visitor, options) {
1055
1047
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1056
- for (let i = 0; i < this.body.length; i++) {
1057
- (0, visitors_1.walk)(this.body, i, visitor, options, this);
1058
- }
1048
+ (0, visitors_1.walkArray)(this.body, visitor, options, this);
1059
1049
  }
1060
1050
  }
1061
1051
  }
@@ -1135,11 +1125,11 @@ class ClassStatement extends Statement {
1135
1125
  this.symbolTable.setParent(currentSymbolTable);
1136
1126
  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;
1137
1127
  for (let statement of this.body) {
1138
- if ((0, reflection_1.isClassMethodStatement)(statement)) {
1128
+ if ((0, reflection_1.isMethodStatement)(statement)) {
1139
1129
  this.methods.push(statement);
1140
1130
  this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
1141
1131
  }
1142
- else if ((0, reflection_1.isClassFieldStatement)(statement)) {
1132
+ else if ((0, reflection_1.isFieldStatement)(statement)) {
1143
1133
  this.fields.push(statement);
1144
1134
  this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
1145
1135
  }
@@ -1167,9 +1157,9 @@ class ClassStatement extends Statement {
1167
1157
  return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
1168
1158
  }
1169
1159
  getConstructorFunctionType() {
1170
- var _a;
1171
- const constructFunc = (_a = this.getConstructorFunction()) !== null && _a !== void 0 ? _a : this.getEmptyNewFunction();
1172
- const constructorFuncType = constructFunc.func.getFunctionType();
1160
+ var _a, _b;
1161
+ const constructFunc = this.getConstructorFunction();
1162
+ const constructorFuncType = (_b = (_a = constructFunc === null || constructFunc === void 0 ? void 0 : constructFunc.func) === null || _a === void 0 ? void 0 : _a.getFunctionType()) !== null && _b !== void 0 ? _b : new FunctionType_1.FunctionType();
1173
1163
  constructorFuncType.setName(this.getName(Parser_1.ParseMode.BrighterScript));
1174
1164
  constructorFuncType.isNew = true;
1175
1165
  return constructorFuncType;
@@ -1204,7 +1194,6 @@ class ClassStatement extends Statement {
1204
1194
  }
1205
1195
  getTypedef(state) {
1206
1196
  var _a, _b;
1207
- this.ensureConstructorFunctionExists();
1208
1197
  const result = [];
1209
1198
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1210
1199
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
@@ -1216,7 +1205,15 @@ class ClassStatement extends Statement {
1216
1205
  }
1217
1206
  result.push(state.newline);
1218
1207
  state.blockDepth++;
1219
- for (const member of this.body) {
1208
+ let body = this.body;
1209
+ //inject an empty "new" method if missing
1210
+ if (!this.getConstructorFunction()) {
1211
+ body = [
1212
+ (0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub),
1213
+ ...this.body
1214
+ ];
1215
+ }
1216
+ for (const member of body) {
1220
1217
  if ((0, reflection_1.isTypedefProvider)(member)) {
1221
1218
  result.push(state.indent(), ...member.getTypedef(state), state.newline);
1222
1219
  }
@@ -1244,7 +1241,13 @@ class ClassStatement extends Statement {
1244
1241
  break;
1245
1242
  }
1246
1243
  }
1247
- return myIndex - 1;
1244
+ const result = myIndex - 1;
1245
+ if (result >= 0) {
1246
+ return result;
1247
+ }
1248
+ else {
1249
+ return null;
1250
+ }
1248
1251
  }
1249
1252
  hasParent() {
1250
1253
  return !!this.parentClassName;
@@ -1299,25 +1302,10 @@ class ClassStatement extends Statement {
1299
1302
  * Get the constructor function for this class (if exists), or undefined if not exist
1300
1303
  */
1301
1304
  getConstructorFunction() {
1302
- var _a, _b;
1303
- for (let key in this.memberMap) {
1304
- let member = this.memberMap[key];
1305
- if (((_b = (_a = member.name) === null || _a === void 0 ? void 0 : _a.text) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'new') {
1306
- return member;
1307
- }
1308
- }
1309
- }
1310
- getEmptyNewFunction() {
1311
- return (0, creators_1.createClassMethodStatement)('new', TokenKind_1.TokenKind.Sub);
1312
- }
1313
- /**
1314
- * Create an empty `new` function if class is missing it (simplifies transpile logic)
1315
- */
1316
- ensureConstructorFunctionExists() {
1317
- if (!this.getConstructorFunction()) {
1318
- this.memberMap.new = this.getEmptyNewFunction();
1319
- this.body = [this.memberMap.new, ...this.body];
1320
- }
1305
+ return this.body.find((stmt) => {
1306
+ var _a, _b;
1307
+ return ((_b = (_a = stmt === null || stmt === void 0 ? void 0 : stmt.name) === null || _a === void 0 ? void 0 : _a.text) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'new';
1308
+ });
1321
1309
  }
1322
1310
  /**
1323
1311
  * Determine if the specified field was declared in one of the ancestor classes
@@ -1338,7 +1326,6 @@ class ClassStatement extends Statement {
1338
1326
  */
1339
1327
  getTranspiledBuilder(state) {
1340
1328
  var _a;
1341
- this.ensureConstructorFunctionExists();
1342
1329
  let result = [];
1343
1330
  result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
1344
1331
  state.blockDepth++;
@@ -1359,14 +1346,22 @@ class ClassStatement extends Statement {
1359
1346
  }
1360
1347
  result.push(state.newline, state.indent());
1361
1348
  let parentClassIndex = this.getParentClassIndex(state);
1362
- for (let statement of this.body) {
1349
+ let body = this.body;
1350
+ //inject an empty "new" method if missing
1351
+ if (!this.getConstructorFunction()) {
1352
+ body = [
1353
+ (0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub),
1354
+ ...this.body
1355
+ ];
1356
+ }
1357
+ for (let statement of body) {
1363
1358
  //is field statement
1364
- if ((0, reflection_1.isClassFieldStatement)(statement)) {
1359
+ if ((0, reflection_1.isFieldStatement)(statement)) {
1365
1360
  //do nothing with class fields in this situation, they are handled elsewhere
1366
1361
  continue;
1367
1362
  //methods
1368
1363
  }
1369
- else if ((0, reflection_1.isClassMethodStatement)(statement)) {
1364
+ else if ((0, reflection_1.isMethodStatement)(statement)) {
1370
1365
  //store overridden parent methods as super{parentIndex}_{methodName}
1371
1366
  if (
1372
1367
  //is override method
@@ -1434,18 +1429,32 @@ class ClassStatement extends Statement {
1434
1429
  }
1435
1430
  walk(visitor, options) {
1436
1431
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1437
- for (let i = 0; i < this.body.length; i++) {
1438
- (0, visitors_1.walk)(this.body, i, visitor, options, this);
1439
- }
1432
+ (0, visitors_1.walkArray)(this.body, visitor, options, this);
1440
1433
  }
1441
1434
  }
1442
1435
  }
1443
1436
  exports.ClassStatement = ClassStatement;
1444
- class ClassMethodStatement extends FunctionStatement {
1445
- constructor(accessModifier, name, func, override) {
1437
+ const accessModifiers = [
1438
+ TokenKind_1.TokenKind.Public,
1439
+ TokenKind_1.TokenKind.Protected,
1440
+ TokenKind_1.TokenKind.Private
1441
+ ];
1442
+ class MethodStatement extends FunctionStatement {
1443
+ constructor(modifiers, name, func, override) {
1446
1444
  super(name, func, undefined);
1447
- this.accessModifier = accessModifier;
1448
1445
  this.override = override;
1446
+ this.modifiers = [];
1447
+ if (modifiers) {
1448
+ if (Array.isArray(modifiers)) {
1449
+ this.modifiers.push(...modifiers);
1450
+ }
1451
+ else {
1452
+ this.modifiers.push(modifiers);
1453
+ }
1454
+ }
1455
+ }
1456
+ get accessModifier() {
1457
+ return this.modifiers.find(x => accessModifiers.includes(x.kind));
1449
1458
  }
1450
1459
  get range() {
1451
1460
  return this.cacheRange();
@@ -1469,15 +1478,15 @@ class ClassMethodStatement extends FunctionStatement {
1469
1478
  const visitor = (0, visitors_1.createVisitor)({
1470
1479
  VariableExpression: e => {
1471
1480
  if (e.name.text.toLocaleLowerCase() === 'super') {
1472
- e.name.text = `m.super${parentClassIndex}_new`;
1481
+ state.editor.setProperty(e.name, 'text', `m.super${parentClassIndex}_new`);
1473
1482
  }
1474
1483
  },
1475
1484
  DottedGetExpression: e => {
1476
1485
  const beginningVariable = util_1.util.findBeginningVariableExpression(e);
1477
1486
  const lowerName = beginningVariable === null || beginningVariable === void 0 ? void 0 : beginningVariable.getName(Parser_1.ParseMode.BrighterScript).toLowerCase();
1478
1487
  if (lowerName === 'super') {
1479
- beginningVariable.name.text = 'm';
1480
- e.name.text = `super${parentClassIndex}_${e.name.text}`;
1488
+ state.editor.setProperty(beginningVariable.name, 'text', 'm');
1489
+ state.editor.setProperty(e.name, 'text', `super${parentClassIndex}_${e.name.text}`);
1481
1490
  }
1482
1491
  }
1483
1492
  });
@@ -1522,7 +1531,7 @@ class ClassMethodStatement extends FunctionStatement {
1522
1531
  return;
1523
1532
  }
1524
1533
  //this is a child class, and the first statement isn't a call to super. Inject one
1525
- this.func.body.statements.unshift(new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
1534
+ const superCall = new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
1526
1535
  kind: TokenKind_1.TokenKind.Identifier,
1527
1536
  text: 'super',
1528
1537
  isReserved: false,
@@ -1540,7 +1549,8 @@ class ClassMethodStatement extends FunctionStatement {
1540
1549
  isReserved: false,
1541
1550
  range: state.classStatement.name.range,
1542
1551
  leadingWhitespace: ''
1543
- }, [], null)));
1552
+ }, [], null));
1553
+ state.editor.arrayUnshift(this.func.body.statements, superCall);
1544
1554
  }
1545
1555
  /**
1546
1556
  * Inject field initializers at the top of the `new` function (after any present `super()` call)
@@ -1560,7 +1570,7 @@ class ClassMethodStatement extends FunctionStatement {
1560
1570
  newStatements.push(new AssignmentStatement(thisQualifiedName, (0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), (0, creators_1.createInvalidLiteral)('invalid', field.name.range), this.func));
1561
1571
  }
1562
1572
  }
1563
- this.func.body.statements.splice(startingIndex, 0, ...newStatements);
1573
+ state.editor.arraySplice(this.func.body.statements, startingIndex, 0, ...newStatements);
1564
1574
  }
1565
1575
  walk(visitor, options) {
1566
1576
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
@@ -1568,8 +1578,8 @@ class ClassMethodStatement extends FunctionStatement {
1568
1578
  }
1569
1579
  }
1570
1580
  }
1571
- exports.ClassMethodStatement = ClassMethodStatement;
1572
- class ClassFieldStatement extends Statement {
1581
+ exports.MethodStatement = MethodStatement;
1582
+ class FieldStatement extends Statement {
1573
1583
  constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
1574
1584
  var _a;
1575
1585
  super();
@@ -1622,7 +1632,7 @@ class ClassFieldStatement extends Statement {
1622
1632
  }
1623
1633
  }
1624
1634
  }
1625
- exports.ClassFieldStatement = ClassFieldStatement;
1635
+ exports.FieldStatement = FieldStatement;
1626
1636
  class TryCatchStatement extends Statement {
1627
1637
  constructor(tokens, tryBranch, catchStatement) {
1628
1638
  var _a;
@@ -1717,6 +1727,7 @@ class EnumStatement extends Statement {
1717
1727
  this.tokens = tokens;
1718
1728
  this.body = body;
1719
1729
  this.namespaceName = namespaceName;
1730
+ this.symbolTable = new SymbolTable_1.SymbolTable();
1720
1731
  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;
1721
1732
  this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
1722
1733
  }
@@ -1764,6 +1775,12 @@ class EnumStatement extends Statement {
1764
1775
  getMemberValue(name) {
1765
1776
  return this.getMemberValueMap().get(name.toLowerCase());
1766
1777
  }
1778
+ buildSymbolTable() {
1779
+ this.symbolTable.clear();
1780
+ for (const member of this.getMembers()) {
1781
+ this.symbolTable.addSymbol(member === null || member === void 0 ? void 0 : member.name, member === null || member === void 0 ? void 0 : member.range, new EnumType_1.EnumMemberType(this.fullName, member === null || member === void 0 ? void 0 : member.name));
1782
+ }
1783
+ }
1767
1784
  /**
1768
1785
  * The name of the enum (without the namespace prefix)
1769
1786
  */
@@ -1791,6 +1808,9 @@ class EnumStatement extends Statement {
1791
1808
  return undefined;
1792
1809
  }
1793
1810
  }
1811
+ getThisBscType() {
1812
+ return new EnumType_1.EnumType(this.fullName, this.symbolTable);
1813
+ }
1794
1814
  transpile(state) {
1795
1815
  //enum declarations do not exist at runtime, so don't transpile anything...
1796
1816
  return [];
@@ -1815,9 +1835,7 @@ class EnumStatement extends Statement {
1815
1835
  }
1816
1836
  walk(visitor, options) {
1817
1837
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1818
- for (let i = 0; i < this.body.length; i++) {
1819
- (0, visitors_1.walk)(this.body, i, visitor, options, this);
1820
- }
1838
+ (0, visitors_1.walkArray)(this.body, visitor, options, this);
1821
1839
  }
1822
1840
  }
1823
1841
  }