brighterscript 1.0.0-alpha.16 → 1.0.0-alpha.19

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 (158) hide show
  1. package/CHANGELOG.md +72 -1
  2. package/README.md +30 -9
  3. package/dist/BsConfig.d.ts +4 -0
  4. package/dist/DiagnosticMessages.d.ts +16 -1
  5. package/dist/DiagnosticMessages.js +15 -0
  6. package/dist/DiagnosticMessages.js.map +1 -1
  7. package/dist/Logger.js +5 -5
  8. package/dist/Logger.js.map +1 -1
  9. package/dist/Program.d.ts +2 -2
  10. package/dist/Program.js +3 -3
  11. package/dist/Program.js.map +1 -1
  12. package/dist/ProgramBuilder.d.ts +4 -0
  13. package/dist/ProgramBuilder.js +14 -4
  14. package/dist/ProgramBuilder.js.map +1 -1
  15. package/dist/Scope.d.ts +58 -8
  16. package/dist/Scope.js +141 -25
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/XmlScope.js +1 -1
  19. package/dist/XmlScope.js.map +1 -1
  20. package/dist/astUtils/creators.d.ts +3 -3
  21. package/dist/astUtils/creators.js +8 -8
  22. package/dist/astUtils/creators.js.map +1 -1
  23. package/dist/astUtils/creators.spec.js +10 -0
  24. package/dist/astUtils/creators.spec.js.map +1 -1
  25. package/dist/astUtils/reflection.d.ts +8 -5
  26. package/dist/astUtils/reflection.js +18 -6
  27. package/dist/astUtils/reflection.js.map +1 -1
  28. package/dist/astUtils/reflection.spec.js +10 -0
  29. package/dist/astUtils/reflection.spec.js.map +1 -1
  30. package/dist/astUtils/visitors.d.ts +4 -1
  31. package/dist/astUtils/visitors.js.map +1 -1
  32. package/dist/astUtils/visitors.spec.js +2 -0
  33. package/dist/astUtils/visitors.spec.js.map +1 -1
  34. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +2 -2
  35. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  36. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +7 -3
  37. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
  38. package/dist/{types/FunctionType.spec.d.ts → bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts} +0 -0
  39. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
  40. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -0
  41. package/dist/cli.js +9 -2
  42. package/dist/cli.js.map +1 -1
  43. package/dist/examples/plugins/removePrint.js +12 -14
  44. package/dist/examples/plugins/removePrint.js.map +1 -1
  45. package/dist/files/BrsFile.Class.spec.js +3 -3
  46. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  47. package/dist/files/BrsFile.d.ts +2 -2
  48. package/dist/files/BrsFile.js +89 -59
  49. package/dist/files/BrsFile.js.map +1 -1
  50. package/dist/files/BrsFile.spec.js +187 -67
  51. package/dist/files/BrsFile.spec.js.map +1 -1
  52. package/dist/globalCallables.js +79 -79
  53. package/dist/globalCallables.js.map +1 -1
  54. package/dist/interfaces.d.ts +43 -4
  55. package/dist/parser/Expression.d.ts +75 -8
  56. package/dist/parser/Expression.js +147 -22
  57. package/dist/parser/Expression.js.map +1 -1
  58. package/dist/parser/Parser.Class.spec.js +6 -6
  59. package/dist/parser/Parser.Class.spec.js.map +1 -1
  60. package/dist/parser/Parser.d.ts +3 -6
  61. package/dist/parser/Parser.js +145 -142
  62. package/dist/parser/Parser.js.map +1 -1
  63. package/dist/parser/Parser.spec.js +61 -6
  64. package/dist/parser/Parser.spec.js.map +1 -1
  65. package/dist/parser/SGTypes.d.ts +2 -2
  66. package/dist/parser/SGTypes.js +2 -2
  67. package/dist/parser/SGTypes.js.map +1 -1
  68. package/dist/parser/Statement.d.ts +63 -43
  69. package/dist/parser/Statement.js +135 -92
  70. package/dist/parser/Statement.js.map +1 -1
  71. package/dist/parser/tests/statement/InterfaceStatement.spec.js +181 -0
  72. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  73. package/dist/parser/tests/statement/TryCatch.spec.js +7 -5
  74. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  75. package/dist/types/ArrayType.js +4 -1
  76. package/dist/types/ArrayType.js.map +1 -1
  77. package/dist/types/ArrayType.spec.js +3 -1
  78. package/dist/types/ArrayType.spec.js.map +1 -1
  79. package/dist/types/BooleanType.d.ts +4 -2
  80. package/dist/types/BooleanType.js +7 -2
  81. package/dist/types/BooleanType.js.map +1 -1
  82. package/dist/types/BooleanType.spec.js +3 -1
  83. package/dist/types/BooleanType.spec.js.map +1 -1
  84. package/dist/types/BscType.d.ts +1 -0
  85. package/dist/types/BscType.js +16 -1
  86. package/dist/types/BscType.js.map +1 -1
  87. package/dist/types/CustomType.js +10 -0
  88. package/dist/types/CustomType.js.map +1 -1
  89. package/dist/types/DoubleType.d.ts +2 -0
  90. package/dist/types/DoubleType.js +7 -2
  91. package/dist/types/DoubleType.js.map +1 -1
  92. package/dist/types/DoubleType.spec.js +3 -1
  93. package/dist/types/DoubleType.spec.js.map +1 -1
  94. package/dist/types/DynamicType.d.ts +2 -0
  95. package/dist/types/DynamicType.js +5 -1
  96. package/dist/types/DynamicType.js.map +1 -1
  97. package/dist/types/FloatType.d.ts +3 -1
  98. package/dist/types/FloatType.js +7 -2
  99. package/dist/types/FloatType.js.map +1 -1
  100. package/dist/types/FloatType.spec.js +2 -0
  101. package/dist/types/FloatType.spec.js.map +1 -1
  102. package/dist/types/FunctionType.d.ts +3 -22
  103. package/dist/types/FunctionType.js +8 -68
  104. package/dist/types/FunctionType.js.map +1 -1
  105. package/dist/types/IntegerType.d.ts +3 -1
  106. package/dist/types/IntegerType.js +7 -2
  107. package/dist/types/IntegerType.js.map +1 -1
  108. package/dist/types/IntegerType.spec.js +3 -1
  109. package/dist/types/IntegerType.spec.js.map +1 -1
  110. package/dist/types/InterfaceType.d.ts +13 -10
  111. package/dist/types/InterfaceType.js +33 -29
  112. package/dist/types/InterfaceType.js.map +1 -1
  113. package/dist/types/InterfaceType.spec.js +36 -16
  114. package/dist/types/InterfaceType.spec.js.map +1 -1
  115. package/dist/types/InvalidType.d.ts +4 -2
  116. package/dist/types/InvalidType.js +7 -2
  117. package/dist/types/InvalidType.js.map +1 -1
  118. package/dist/types/InvalidType.spec.js +2 -0
  119. package/dist/types/InvalidType.spec.js.map +1 -1
  120. package/dist/types/LazyType.js +4 -0
  121. package/dist/types/LazyType.js.map +1 -1
  122. package/dist/types/LongIntegerType.d.ts +3 -1
  123. package/dist/types/LongIntegerType.js +7 -2
  124. package/dist/types/LongIntegerType.js.map +1 -1
  125. package/dist/types/LongIntegerType.spec.js +2 -0
  126. package/dist/types/LongIntegerType.spec.js.map +1 -1
  127. package/dist/types/ObjectType.d.ts +2 -1
  128. package/dist/types/ObjectType.js +4 -2
  129. package/dist/types/ObjectType.js.map +1 -1
  130. package/dist/types/StringType.d.ts +4 -2
  131. package/dist/types/StringType.js +7 -2
  132. package/dist/types/StringType.js.map +1 -1
  133. package/dist/types/StringType.spec.js +2 -0
  134. package/dist/types/StringType.spec.js.map +1 -1
  135. package/dist/types/TypedFunctionType.d.ts +28 -0
  136. package/dist/types/TypedFunctionType.js +88 -0
  137. package/dist/types/TypedFunctionType.js.map +1 -0
  138. package/dist/types/TypedFunctionType.spec.d.ts +1 -0
  139. package/dist/types/TypedFunctionType.spec.js +37 -0
  140. package/dist/types/TypedFunctionType.spec.js.map +1 -0
  141. package/dist/types/UninitializedType.js.map +1 -1
  142. package/dist/types/VoidType.d.ts +4 -2
  143. package/dist/types/VoidType.js +5 -1
  144. package/dist/types/VoidType.js.map +1 -1
  145. package/dist/types/helpers.js +7 -2
  146. package/dist/types/helpers.js.map +1 -1
  147. package/dist/util.d.ts +6 -7
  148. package/dist/util.js +43 -55
  149. package/dist/util.js.map +1 -1
  150. package/dist/validators/ClassValidator.d.ts +14 -1
  151. package/dist/validators/ClassValidator.js +129 -82
  152. package/dist/validators/ClassValidator.js.map +1 -1
  153. package/package.json +3 -2
  154. package/dist/types/FunctionType.spec.js +0 -35
  155. package/dist/types/FunctionType.spec.js.map +0 -1
  156. package/dist/types/UniversalFunctionType.d.ts +0 -9
  157. package/dist/types/UniversalFunctionType.js +0 -25
  158. package/dist/types/UniversalFunctionType.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
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;
4
4
  const TokenKind_1 = require("../lexer/TokenKind");
5
5
  const Expression_1 = require("./Expression");
6
6
  const util_1 = require("../util");
@@ -11,6 +11,7 @@ const creators_1 = require("../astUtils/creators");
11
11
  const DynamicType_1 = require("../types/DynamicType");
12
12
  const SymbolTable_1 = require("../SymbolTable");
13
13
  const CustomType_1 = require("../types/CustomType");
14
+ const InterfaceType_1 = require("../types/InterfaceType");
14
15
  /**
15
16
  * A BrightScript statement
16
17
  */
@@ -326,14 +327,11 @@ class IfStatement extends Statement {
326
327
  results.push(' ');
327
328
  //conditions
328
329
  results.push(...this.condition.transpile(state));
329
- results.push(' ');
330
330
  //then
331
331
  if (this.tokens.then) {
332
+ results.push(' ');
332
333
  results.push(state.transpileToken(this.tokens.then));
333
334
  }
334
- else {
335
- results.push('then');
336
- }
337
335
  state.lineage.unshift(this);
338
336
  //if statement body
339
337
  let thenNodes = this.thenBranch.transpile(state);
@@ -354,7 +352,8 @@ class IfStatement extends Statement {
354
352
  let body = this.elseBranch.transpile(state);
355
353
  state.lineage.shift();
356
354
  if (body.length > 0) {
357
- results.push(' ');
355
+ //zero or more spaces between the `else` and the `if`
356
+ results.push(this.elseBranch.tokens.if.leadingWhitespace);
358
357
  results.push(...body);
359
358
  // stop here because chained if will transpile the rest
360
359
  return results;
@@ -928,28 +927,37 @@ class ImportStatement extends Statement {
928
927
  exports.ImportStatement = ImportStatement;
929
928
  class InterfaceStatement extends Statement {
930
929
  constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
931
- var _a;
930
+ var _a, _b, _c;
932
931
  super();
932
+ this.name = name;
933
933
  this.parentInterfaceName = parentInterfaceName;
934
934
  this.body = body;
935
935
  this.namespaceName = namespaceName;
936
+ this.memberTable = new SymbolTable_1.SymbolTable();
936
937
  this.tokens = {};
938
+ this.memberMap = {};
939
+ this.methods = [];
940
+ this.fields = [];
937
941
  this.tokens.interface = interfaceToken;
938
942
  this.tokens.name = name;
939
943
  this.tokens.extends = extendsToken;
940
944
  this.tokens.endInterface = endInterfaceToken;
941
945
  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;
942
- }
943
- get fields() {
944
- return this.body.filter(x => (0, reflection_1.isInterfaceFieldStatement)(x));
945
- }
946
- get methods() {
947
- return this.body.filter(x => (0, reflection_1.isInterfaceMethodStatement)(x));
946
+ for (let statement of this.body) {
947
+ if ((0, reflection_1.isInterfaceMethodStatement)(statement)) {
948
+ this.methods.push(statement);
949
+ this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
950
+ }
951
+ else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
952
+ 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
+ }
948
956
  }
949
957
  /**
950
958
  * The name of the interface WITH its leading namespace (if applicable)
951
959
  */
952
- get fullName() {
960
+ getName(parseMode) {
953
961
  var _a;
954
962
  const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
955
963
  if (name) {
@@ -966,12 +974,49 @@ class InterfaceStatement extends Statement {
966
974
  return undefined;
967
975
  }
968
976
  }
977
+ buildSymbolTable(parentIface) {
978
+ var _a, _b;
979
+ this.memberTable.clear();
980
+ if (parentIface) {
981
+ this.memberTable.setParent(parentIface === null || parentIface === void 0 ? void 0 : parentIface.memberTable);
982
+ }
983
+ for (const statement of this.methods) {
984
+ const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
985
+ 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
+ }
987
+ 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());
989
+ }
990
+ }
991
+ hasParent() {
992
+ return !!this.parentInterfaceName;
993
+ }
994
+ getParentName() {
995
+ return !!this.parentInterfaceName;
996
+ }
969
997
  /**
970
- * The name of the interface (without the namespace prefix)
998
+ * Gets an array of possible parent interface names, taking into account the namespace this interface was created under
999
+ * @returns array of possible parent interface names
971
1000
  */
972
- get name() {
1001
+ getPossibleFullParentNames() {
973
1002
  var _a;
974
- return (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1003
+ if (!this.hasParent()) {
1004
+ return [];
1005
+ }
1006
+ if (((_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
1007
+ // The specified parent interface already has a dot, so it must already reference a namespace
1008
+ return [this.parentInterfaceName.getName()];
1009
+ }
1010
+ const names = [];
1011
+ if (this.namespaceName) {
1012
+ // We're under a namespace, so the full parent name MIGHT be with this namespace too
1013
+ names.push(this.namespaceName.getName() + '.' + this.parentInterfaceName.getName());
1014
+ }
1015
+ names.push(this.parentInterfaceName.getName());
1016
+ return names;
1017
+ }
1018
+ getThisBscType() {
1019
+ return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
975
1020
  }
976
1021
  transpile(state) {
977
1022
  //interfaces should completely disappear at runtime
@@ -1016,84 +1061,53 @@ class InterfaceStatement extends Statement {
1016
1061
  }
1017
1062
  exports.InterfaceStatement = InterfaceStatement;
1018
1063
  class InterfaceFieldStatement extends Statement {
1019
- constructor(nameToken, asToken, typeToken, type) {
1064
+ constructor(nameToken, asToken, type, namespaceName) {
1020
1065
  var _a;
1021
1066
  super();
1022
1067
  this.type = type;
1068
+ this.namespaceName = namespaceName;
1023
1069
  this.tokens = {};
1024
1070
  this.tokens.name = nameToken;
1025
1071
  this.tokens.as = asToken;
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;
1072
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1028
1073
  }
1029
1074
  transpile(state) {
1030
1075
  throw new Error('Method not implemented.');
1031
1076
  }
1077
+ getType() {
1078
+ var _a;
1079
+ return (_a = this.type) === null || _a === void 0 ? void 0 : _a.type;
1080
+ }
1032
1081
  get name() {
1033
- return this.tokens.name.text;
1082
+ return this.tokens.name;
1034
1083
  }
1035
1084
  walk(visitor, options) {
1036
1085
  //nothing to walk
1037
1086
  }
1038
1087
  getTypedef(state) {
1039
- var _a, _b, _c;
1088
+ var _a;
1040
1089
  const result = [];
1041
1090
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1042
1091
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1043
1092
  }
1044
1093
  result.push(this.tokens.name.text);
1045
- if (((_c = (_b = this.tokens.type) === null || _b === void 0 ? void 0 : _b.text) === null || _c === void 0 ? void 0 : _c.length) > 0) {
1046
- result.push(' as ', this.tokens.type.text);
1094
+ if (this.tokens.as && this.type) {
1095
+ result.push(' as ', ...this.type.transpile(state));
1047
1096
  }
1048
1097
  return result;
1049
1098
  }
1050
1099
  }
1051
1100
  exports.InterfaceFieldStatement = InterfaceFieldStatement;
1052
- class InterfaceMethodStatement extends Statement {
1053
- constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeToken, returnType) {
1054
- var _a;
1055
- super();
1056
- this.params = params;
1057
- this.returnType = returnType;
1058
- this.tokens = {};
1059
- this.tokens.functionType = functionTypeToken;
1060
- this.tokens.name = nameToken;
1061
- this.tokens.leftParen = leftParen;
1062
- this.tokens.rightParen = rightParen;
1063
- this.tokens.as = asToken;
1064
- this.tokens.returnType = returnTypeToken;
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;
1101
+ class InterfaceMethodStatement extends FunctionStatement {
1102
+ transpile(state) {
1103
+ throw new Error('Method not implemented.');
1104
+ }
1105
+ constructor(name, func) {
1106
+ super(name, func, undefined);
1066
1107
  }
1067
1108
  walk(visitor, options) {
1068
1109
  //nothing to walk
1069
1110
  }
1070
- getTypedef(state) {
1071
- var _a, _b, _c, _d, _e;
1072
- const result = [];
1073
- for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1074
- result.push(...annotation.getTypedef(state), state.newline, state.indent());
1075
- }
1076
- result.push(this.tokens.functionType.text, ' ', this.tokens.name.text, '(');
1077
- const params = (_b = this.params) !== null && _b !== void 0 ? _b : [];
1078
- for (let i = 0; i < params.length; i++) {
1079
- if (i > 0) {
1080
- result.push(', ');
1081
- }
1082
- const param = params[i];
1083
- result.push(param.name.text);
1084
- if (((_d = (_c = param.typeToken) === null || _c === void 0 ? void 0 : _c.text) === null || _d === void 0 ? void 0 : _d.length) > 0) {
1085
- result.push(' as ', param.typeToken.text);
1086
- }
1087
- }
1088
- result.push(')');
1089
- if (((_e = this.tokens.returnType) === null || _e === void 0 ? void 0 : _e.text.length) > 0) {
1090
- result.push(' as ', this.tokens.returnType.text);
1091
- }
1092
- return result;
1093
- }
1094
- transpile(state) {
1095
- throw new Error('Method not implemented.');
1096
- }
1097
1111
  }
1098
1112
  exports.InterfaceMethodStatement = InterfaceMethodStatement;
1099
1113
  class ClassStatement extends Statement {
@@ -1149,7 +1163,7 @@ class ClassStatement extends Statement {
1149
1163
  return undefined;
1150
1164
  }
1151
1165
  }
1152
- getCustomType() {
1166
+ getThisBscType() {
1153
1167
  return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
1154
1168
  }
1155
1169
  getConstructorFunctionType() {
@@ -1163,9 +1177,9 @@ class ClassStatement extends Statement {
1163
1177
  buildSymbolTable(parentClass) {
1164
1178
  var _a, _b, _c, _d, _e;
1165
1179
  this.symbolTable.clear();
1166
- this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getCustomType());
1180
+ this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getThisBscType());
1167
1181
  this.memberTable.clear();
1168
- if (parentClass) {
1182
+ if ((0, reflection_1.isClassStatement)(parentClass)) {
1169
1183
  this.symbolTable.addSymbol('super', (_b = this.parentClassName) === null || _b === void 0 ? void 0 : _b.range, parentClass.getConstructorFunctionType());
1170
1184
  this.memberTable.setParent(parentClass === null || parentClass === void 0 ? void 0 : parentClass.memberTable);
1171
1185
  }
@@ -1190,6 +1204,7 @@ class ClassStatement extends Statement {
1190
1204
  }
1191
1205
  getTypedef(state) {
1192
1206
  var _a, _b;
1207
+ this.ensureConstructorFunctionExists();
1193
1208
  const result = [];
1194
1209
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1195
1210
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
@@ -1231,7 +1246,7 @@ class ClassStatement extends Statement {
1231
1246
  }
1232
1247
  return myIndex - 1;
1233
1248
  }
1234
- hasParentClass() {
1249
+ hasParent() {
1235
1250
  return !!this.parentClassName;
1236
1251
  }
1237
1252
  /**
@@ -1240,7 +1255,7 @@ class ClassStatement extends Statement {
1240
1255
  */
1241
1256
  getPossibleFullParentNames() {
1242
1257
  var _a;
1243
- if (!this.hasParentClass()) {
1258
+ if (!this.hasParent()) {
1244
1259
  return [];
1245
1260
  }
1246
1261
  if (((_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
@@ -1295,6 +1310,15 @@ class ClassStatement extends Statement {
1295
1310
  getEmptyNewFunction() {
1296
1311
  return (0, creators_1.createClassMethodStatement)('new', TokenKind_1.TokenKind.Sub);
1297
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
+ }
1321
+ }
1298
1322
  /**
1299
1323
  * Determine if the specified field was declared in one of the ancestor classes
1300
1324
  */
@@ -1314,6 +1338,7 @@ class ClassStatement extends Statement {
1314
1338
  */
1315
1339
  getTranspiledBuilder(state) {
1316
1340
  var _a;
1341
+ this.ensureConstructorFunctionExists();
1317
1342
  let result = [];
1318
1343
  result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
1319
1344
  state.blockDepth++;
@@ -1334,11 +1359,6 @@ class ClassStatement extends Statement {
1334
1359
  }
1335
1360
  result.push(state.newline, state.indent());
1336
1361
  let parentClassIndex = this.getParentClassIndex(state);
1337
- //create empty `new` function if class is missing it (simplifies transpile logic)
1338
- if (!this.getConstructorFunction()) {
1339
- this.memberMap.new = this.getEmptyNewFunction();
1340
- this.body = [this.memberMap.new, ...this.body];
1341
- }
1342
1362
  for (let statement of this.body) {
1343
1363
  //is field statement
1344
1364
  if ((0, reflection_1.isClassFieldStatement)(statement)) {
@@ -1526,7 +1546,7 @@ class ClassMethodStatement extends FunctionStatement {
1526
1546
  * Inject field initializers at the top of the `new` function (after any present `super()` call)
1527
1547
  */
1528
1548
  injectFieldInitializersForConstructor(state) {
1529
- let startingIndex = state.classStatement.hasParentClass() ? 1 : 0;
1549
+ let startingIndex = state.classStatement.hasParent() ? 1 : 0;
1530
1550
  let newStatements = [];
1531
1551
  //insert the field initializers in order
1532
1552
  for (let field of state.classStatement.fields) {
@@ -1568,7 +1588,7 @@ class ClassFieldStatement extends Statement {
1568
1588
  */
1569
1589
  getType(parseMode = Parser_1.ParseMode.BrighterScript) {
1570
1590
  if (this.type) {
1571
- return util_1.util.tokenToBscType(this.type, parseMode === Parser_1.ParseMode.BrighterScript, this.namespaceName);
1591
+ return this.type.type;
1572
1592
  }
1573
1593
  else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
1574
1594
  return this.initialValue.type;
@@ -1596,47 +1616,70 @@ class ClassFieldStatement extends Statement {
1596
1616
  return result;
1597
1617
  }
1598
1618
  walk(visitor, options) {
1599
- if (this.initialValue && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1619
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1620
+ (0, visitors_1.walk)(this, 'type', visitor, options);
1600
1621
  (0, visitors_1.walk)(this, 'initialValue', visitor, options);
1601
1622
  }
1602
1623
  }
1603
1624
  }
1604
1625
  exports.ClassFieldStatement = ClassFieldStatement;
1605
1626
  class TryCatchStatement extends Statement {
1606
- constructor(tryToken, tryBranch, catchToken, exceptionVariable, catchBranch, endTryToken) {
1627
+ constructor(tokens, tryBranch, catchStatement) {
1607
1628
  var _a;
1608
1629
  super();
1609
- this.tryToken = tryToken;
1630
+ this.tokens = tokens;
1610
1631
  this.tryBranch = tryBranch;
1611
- this.catchToken = catchToken;
1612
- this.exceptionVariable = exceptionVariable;
1613
- this.catchBranch = catchBranch;
1614
- this.endTryToken = endTryToken;
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;
1632
+ this.catchStatement = catchStatement;
1633
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.try, this.tryBranch, this.catchStatement, this.tokens.endTry)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1616
1634
  }
1617
1635
  transpile(state) {
1636
+ var _a, _b;
1618
1637
  return [
1619
- state.transpileToken(this.tryToken),
1638
+ state.transpileToken(this.tokens.try),
1620
1639
  ...this.tryBranch.transpile(state),
1621
1640
  state.newline,
1622
1641
  state.indent(),
1623
- state.transpileToken(this.catchToken),
1624
- ' ',
1625
- state.transpileToken(this.exceptionVariable),
1626
- ...this.catchBranch.transpile(state),
1642
+ ...((_b = (_a = this.catchStatement) === null || _a === void 0 ? void 0 : _a.transpile(state)) !== null && _b !== void 0 ? _b : ['catch']),
1627
1643
  state.newline,
1628
1644
  state.indent(),
1629
- state.transpileToken(this.endTryToken)
1645
+ state.transpileToken(this.tokens.endTry)
1630
1646
  ];
1631
1647
  }
1632
1648
  walk(visitor, options) {
1633
1649
  if (this.tryBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1634
1650
  (0, visitors_1.walk)(this, 'tryBranch', visitor, options);
1635
- (0, visitors_1.walk)(this, 'catchBranch', visitor, options);
1651
+ (0, visitors_1.walk)(this, 'catchStatement', visitor, options);
1636
1652
  }
1637
1653
  }
1638
1654
  }
1639
1655
  exports.TryCatchStatement = TryCatchStatement;
1656
+ class CatchStatement extends Statement {
1657
+ constructor(tokens, exceptionVariable, catchBranch) {
1658
+ super();
1659
+ this.tokens = tokens;
1660
+ this.exceptionVariable = exceptionVariable;
1661
+ this.catchBranch = catchBranch;
1662
+ }
1663
+ get range() {
1664
+ var _a, _b;
1665
+ return util_1.util.createRangeFromPositions(this.tokens.catch.range.start, ((_b = (_a = this.catchBranch) !== null && _a !== void 0 ? _a : this.exceptionVariable) !== null && _b !== void 0 ? _b : this.tokens.catch).range.end);
1666
+ }
1667
+ transpile(state) {
1668
+ var _a, _b, _c, _d;
1669
+ return [
1670
+ state.transpileToken(this.tokens.catch),
1671
+ ' ',
1672
+ (_b = (_a = this.exceptionVariable) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : 'e',
1673
+ ...((_d = (_c = this.catchBranch) === null || _c === void 0 ? void 0 : _c.transpile(state)) !== null && _d !== void 0 ? _d : [])
1674
+ ];
1675
+ }
1676
+ walk(visitor, options) {
1677
+ if (this.catchBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1678
+ (0, visitors_1.walk)(this, 'catchBranch', visitor, options);
1679
+ }
1680
+ }
1681
+ }
1682
+ exports.CatchStatement = CatchStatement;
1640
1683
  class ThrowStatement extends Statement {
1641
1684
  constructor(throwToken, expression) {
1642
1685
  var _a;