brighterscript 0.65.0 → 0.66.0-alpha.0

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 (249) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +8 -0
  3. package/dist/BsConfig.d.ts +5 -11
  4. package/dist/CacheVerifier.d.ts +8 -0
  5. package/dist/CacheVerifier.js +20 -0
  6. package/dist/CacheVerifier.js.map +1 -0
  7. package/dist/DiagnosticMessages.d.ts +9 -4
  8. package/dist/DiagnosticMessages.js +8 -3
  9. package/dist/DiagnosticMessages.js.map +1 -1
  10. package/dist/FunctionScope.d.ts +1 -0
  11. package/dist/FunctionScope.js +3 -0
  12. package/dist/FunctionScope.js.map +1 -1
  13. package/dist/PluginInterface.d.ts +0 -4
  14. package/dist/PluginInterface.js.map +1 -1
  15. package/dist/Program.d.ts +6 -39
  16. package/dist/Program.js +42 -44
  17. package/dist/Program.js.map +1 -1
  18. package/dist/ProgramBuilder.d.ts +4 -0
  19. package/dist/ProgramBuilder.js +12 -7
  20. package/dist/ProgramBuilder.js.map +1 -1
  21. package/dist/Scope.d.ts +1 -5
  22. package/dist/Scope.js +3 -28
  23. package/dist/Scope.js.map +1 -1
  24. package/dist/SymbolTable.d.ts +44 -6
  25. package/dist/SymbolTable.js +151 -25
  26. package/dist/SymbolTable.js.map +1 -1
  27. package/dist/XmlScope.js +11 -12
  28. package/dist/XmlScope.js.map +1 -1
  29. package/dist/astUtils/creators.d.ts +16 -6
  30. package/dist/astUtils/creators.js +39 -16
  31. package/dist/astUtils/creators.js.map +1 -1
  32. package/dist/astUtils/reflection.d.ts +46 -37
  33. package/dist/astUtils/reflection.js +145 -147
  34. package/dist/astUtils/reflection.js.map +1 -1
  35. package/dist/astUtils/reflection.spec.js +1 -6
  36. package/dist/astUtils/reflection.spec.js.map +1 -1
  37. package/dist/astUtils/visitors.d.ts +4 -11
  38. package/dist/astUtils/visitors.js +0 -7
  39. package/dist/astUtils/visitors.js.map +1 -1
  40. package/dist/astUtils/visitors.spec.js +4 -2
  41. package/dist/astUtils/visitors.spec.js.map +1 -1
  42. package/dist/astUtils/xml.d.ts +9 -9
  43. package/dist/astUtils/xml.js +6 -6
  44. package/dist/astUtils/xml.js.map +1 -1
  45. package/dist/bscPlugin/BscPlugin.js +4 -0
  46. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  47. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -1
  48. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +2 -2
  49. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  50. package/dist/bscPlugin/hover/HoverProcessor.js +71 -59
  51. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  52. package/dist/bscPlugin/hover/HoverProcessor.spec.js +110 -10
  53. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  54. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +6 -5
  55. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  56. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +1 -1
  57. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
  58. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +11 -0
  59. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +53 -0
  60. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
  61. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +4 -0
  62. package/dist/bscPlugin/validation/BrsFileValidator.js +72 -16
  63. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  64. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +1 -1
  65. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -1
  66. package/dist/bscPlugin/validation/ScopeValidator.d.ts +1 -0
  67. package/dist/bscPlugin/validation/ScopeValidator.js +72 -18
  68. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  69. package/dist/bscPlugin/validation/XmlFileValidator.js +9 -9
  70. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -1
  71. package/dist/files/BrsFile.Class.spec.js +47 -10
  72. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  73. package/dist/files/BrsFile.d.ts +8 -10
  74. package/dist/files/BrsFile.js +72 -52
  75. package/dist/files/BrsFile.js.map +1 -1
  76. package/dist/files/BrsFile.spec.js +56 -14
  77. package/dist/files/BrsFile.spec.js.map +1 -1
  78. package/dist/files/XmlFile.d.ts +19 -19
  79. package/dist/files/XmlFile.js +24 -42
  80. package/dist/files/XmlFile.js.map +1 -1
  81. package/dist/files/XmlFile.spec.js +61 -9
  82. package/dist/files/XmlFile.spec.js.map +1 -1
  83. package/dist/files/tests/imports.spec.js +8 -11
  84. package/dist/files/tests/imports.spec.js.map +1 -1
  85. package/dist/globalCallables.js +2 -1
  86. package/dist/globalCallables.js.map +1 -1
  87. package/dist/index.d.ts +2 -0
  88. package/dist/index.js +2 -0
  89. package/dist/index.js.map +1 -1
  90. package/dist/interfaces.d.ts +20 -1
  91. package/dist/interfaces.js +13 -0
  92. package/dist/interfaces.js.map +1 -1
  93. package/dist/lexer/TokenKind.d.ts +2 -0
  94. package/dist/lexer/TokenKind.js +5 -1
  95. package/dist/lexer/TokenKind.js.map +1 -1
  96. package/dist/parser/AstNode.d.ts +78 -1
  97. package/dist/parser/AstNode.js +80 -1
  98. package/dist/parser/AstNode.js.map +1 -1
  99. package/dist/parser/Expression.d.ts +87 -53
  100. package/dist/parser/Expression.js +243 -139
  101. package/dist/parser/Expression.js.map +1 -1
  102. package/dist/parser/Parser.Class.spec.js +10 -7
  103. package/dist/parser/Parser.Class.spec.js.map +1 -1
  104. package/dist/parser/Parser.d.ts +9 -5
  105. package/dist/parser/Parser.js +125 -78
  106. package/dist/parser/Parser.js.map +1 -1
  107. package/dist/parser/Parser.spec.d.ts +2 -0
  108. package/dist/parser/Parser.spec.js +117 -5
  109. package/dist/parser/Parser.spec.js.map +1 -1
  110. package/dist/parser/SGParser.d.ts +42 -4
  111. package/dist/parser/SGParser.js +191 -195
  112. package/dist/parser/SGParser.js.map +1 -1
  113. package/dist/parser/SGParser.spec.js +13 -10
  114. package/dist/parser/SGParser.spec.js.map +1 -1
  115. package/dist/parser/SGTypes.d.ts +279 -51
  116. package/dist/parser/SGTypes.js +562 -185
  117. package/dist/parser/SGTypes.js.map +1 -1
  118. package/dist/parser/Statement.d.ts +88 -70
  119. package/dist/parser/Statement.js +222 -145
  120. package/dist/parser/Statement.js.map +1 -1
  121. package/dist/parser/TranspileState.d.ts +1 -1
  122. package/dist/parser/TranspileState.js +5 -2
  123. package/dist/parser/TranspileState.js.map +1 -1
  124. package/dist/parser/tests/expression/TypeExpression.spec.d.ts +1 -0
  125. package/dist/parser/tests/expression/TypeExpression.spec.js +127 -0
  126. package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -0
  127. package/dist/types/ArrayType.d.ts +6 -4
  128. package/dist/types/ArrayType.js +30 -22
  129. package/dist/types/ArrayType.js.map +1 -1
  130. package/dist/types/ArrayType.spec.js +8 -8
  131. package/dist/types/ArrayType.spec.js.map +1 -1
  132. package/dist/types/BooleanType.d.ts +7 -4
  133. package/dist/types/BooleanType.js +13 -8
  134. package/dist/types/BooleanType.js.map +1 -1
  135. package/dist/types/BooleanType.spec.js +9 -3
  136. package/dist/types/BooleanType.spec.js.map +1 -1
  137. package/dist/types/BscType.d.ts +25 -2
  138. package/dist/types/BscType.js +64 -0
  139. package/dist/types/BscType.js.map +1 -1
  140. package/dist/types/BscTypeKind.d.ts +22 -0
  141. package/dist/types/BscTypeKind.js +27 -0
  142. package/dist/types/BscTypeKind.js.map +1 -0
  143. package/dist/types/ClassType.d.ts +11 -0
  144. package/dist/types/ClassType.js +31 -0
  145. package/dist/types/ClassType.js.map +1 -0
  146. package/dist/types/ClassType.spec.d.ts +1 -0
  147. package/dist/types/ClassType.spec.js +75 -0
  148. package/dist/types/ClassType.spec.js.map +1 -0
  149. package/dist/types/DoubleType.d.ts +7 -4
  150. package/dist/types/DoubleType.js +16 -20
  151. package/dist/types/DoubleType.js.map +1 -1
  152. package/dist/types/DoubleType.spec.js +11 -3
  153. package/dist/types/DoubleType.spec.js.map +1 -1
  154. package/dist/types/DynamicType.d.ts +9 -3
  155. package/dist/types/DynamicType.js +16 -2
  156. package/dist/types/DynamicType.js.map +1 -1
  157. package/dist/types/DynamicType.spec.js +15 -4
  158. package/dist/types/DynamicType.spec.js.map +1 -1
  159. package/dist/types/EnumType.d.ts +22 -0
  160. package/dist/types/EnumType.js +59 -0
  161. package/dist/types/EnumType.js.map +1 -0
  162. package/dist/types/EnumType.spec.d.ts +1 -0
  163. package/dist/types/EnumType.spec.js +33 -0
  164. package/dist/types/EnumType.spec.js.map +1 -0
  165. package/dist/types/FloatType.d.ts +7 -4
  166. package/dist/types/FloatType.js +16 -20
  167. package/dist/types/FloatType.js.map +1 -1
  168. package/dist/types/FloatType.spec.js +3 -3
  169. package/dist/types/FloatType.spec.js.map +1 -1
  170. package/dist/types/FunctionType.d.ts +6 -4
  171. package/dist/types/FunctionType.js +22 -19
  172. package/dist/types/FunctionType.js.map +1 -1
  173. package/dist/types/FunctionType.spec.js +5 -5
  174. package/dist/types/FunctionType.spec.js.map +1 -1
  175. package/dist/types/InheritableType.d.ts +25 -0
  176. package/dist/types/InheritableType.js +88 -0
  177. package/dist/types/InheritableType.js.map +1 -0
  178. package/dist/types/IntegerType.d.ts +7 -4
  179. package/dist/types/IntegerType.js +16 -20
  180. package/dist/types/IntegerType.js.map +1 -1
  181. package/dist/types/IntegerType.spec.js +7 -3
  182. package/dist/types/IntegerType.spec.js.map +1 -1
  183. package/dist/types/InterfaceType.d.ts +10 -10
  184. package/dist/types/InterfaceType.js +24 -45
  185. package/dist/types/InterfaceType.js.map +1 -1
  186. package/dist/types/InterfaceType.spec.js +59 -45
  187. package/dist/types/InterfaceType.spec.js.map +1 -1
  188. package/dist/types/InvalidType.d.ts +6 -4
  189. package/dist/types/InvalidType.js +12 -8
  190. package/dist/types/InvalidType.js.map +1 -1
  191. package/dist/types/InvalidType.spec.js +7 -3
  192. package/dist/types/InvalidType.spec.js.map +1 -1
  193. package/dist/types/LongIntegerType.d.ts +7 -4
  194. package/dist/types/LongIntegerType.js +16 -20
  195. package/dist/types/LongIntegerType.js.map +1 -1
  196. package/dist/types/LongIntegerType.spec.js +9 -3
  197. package/dist/types/LongIntegerType.spec.js.map +1 -1
  198. package/dist/types/NamespaceType.d.ts +11 -0
  199. package/dist/types/NamespaceType.js +25 -0
  200. package/dist/types/NamespaceType.js.map +1 -0
  201. package/dist/types/ObjectType.d.ts +8 -4
  202. package/dist/types/ObjectType.js +26 -7
  203. package/dist/types/ObjectType.js.map +1 -1
  204. package/dist/types/ObjectType.spec.js +2 -2
  205. package/dist/types/ObjectType.spec.js.map +1 -1
  206. package/dist/types/ReferenceType.d.ts +51 -0
  207. package/dist/types/ReferenceType.js +274 -0
  208. package/dist/types/ReferenceType.js.map +1 -0
  209. package/dist/types/ReferenceType.spec.d.ts +1 -0
  210. package/dist/types/ReferenceType.spec.js +122 -0
  211. package/dist/types/ReferenceType.spec.js.map +1 -0
  212. package/dist/types/StringType.d.ts +10 -4
  213. package/dist/types/StringType.js +16 -8
  214. package/dist/types/StringType.js.map +1 -1
  215. package/dist/types/StringType.spec.js +2 -2
  216. package/dist/types/StringType.spec.js.map +1 -1
  217. package/dist/types/UninitializedType.d.ts +6 -3
  218. package/dist/types/UninitializedType.js +14 -3
  219. package/dist/types/UninitializedType.js.map +1 -1
  220. package/dist/types/UnionType.d.ts +18 -0
  221. package/dist/types/UnionType.js +91 -0
  222. package/dist/types/UnionType.js.map +1 -0
  223. package/dist/types/UnionType.spec.d.ts +1 -0
  224. package/dist/types/UnionType.spec.js +103 -0
  225. package/dist/types/UnionType.spec.js.map +1 -0
  226. package/dist/types/VoidType.d.ts +7 -4
  227. package/dist/types/VoidType.js +13 -8
  228. package/dist/types/VoidType.js.map +1 -1
  229. package/dist/types/VoidType.spec.js +2 -2
  230. package/dist/types/VoidType.spec.js.map +1 -1
  231. package/dist/types/helper.spec.d.ts +1 -0
  232. package/dist/types/helper.spec.js +130 -0
  233. package/dist/types/helper.spec.js.map +1 -0
  234. package/dist/types/helpers.d.ts +19 -0
  235. package/dist/types/helpers.js +131 -0
  236. package/dist/types/helpers.js.map +1 -0
  237. package/dist/types/index.d.ts +22 -0
  238. package/dist/types/index.js +39 -0
  239. package/dist/types/index.js.map +1 -0
  240. package/dist/util.d.ts +9 -8
  241. package/dist/util.js +78 -32
  242. package/dist/util.js.map +1 -1
  243. package/dist/validators/ClassValidator.d.ts +0 -4
  244. package/dist/validators/ClassValidator.js +6 -30
  245. package/dist/validators/ClassValidator.js.map +1 -1
  246. package/package.json +2 -1
  247. package/dist/types/CustomType.d.ts +0 -9
  248. package/dist/types/CustomType.js +0 -32
  249. package/dist/types/CustomType.js.map +0 -1
@@ -1,17 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ContinueStatement = exports.ConstStatement = exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.ClassFieldStatement = exports.FieldStatement = exports.ClassMethodStatement = exports.MethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = void 0;
3
+ exports.ContinueStatement = exports.ConstStatement = exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.FieldStatement = exports.MethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = void 0;
4
4
  const TokenKind_1 = require("../lexer/TokenKind");
5
5
  const Expression_1 = require("./Expression");
6
6
  const util_1 = require("../util");
7
7
  const Parser_1 = require("./Parser");
8
8
  const visitors_1 = require("../astUtils/visitors");
9
9
  const reflection_1 = require("../astUtils/reflection");
10
+ const SymbolTable_1 = require("../SymbolTable");
10
11
  const creators_1 = require("../astUtils/creators");
11
12
  const DynamicType_1 = require("../types/DynamicType");
12
- const SymbolTable_1 = require("../SymbolTable");
13
+ const SymbolTable_2 = require("../SymbolTable");
13
14
  const AstNode_1 = require("./AstNode");
14
- class EmptyStatement extends AstNode_1.Statement {
15
+ const AstNode_2 = require("./AstNode");
16
+ const ClassType_1 = require("../types/ClassType");
17
+ const EnumType_1 = require("../types/EnumType");
18
+ const NamespaceType_1 = require("../types/NamespaceType");
19
+ const InterfaceType_1 = require("../types/InterfaceType");
20
+ const VoidType_1 = require("../types/VoidType");
21
+ const FunctionType_1 = require("../types/FunctionType");
22
+ class EmptyStatement extends AstNode_2.Statement {
15
23
  constructor(
16
24
  /**
17
25
  * Create a negative range to indicate this is an interpolated location
@@ -19,6 +27,7 @@ class EmptyStatement extends AstNode_1.Statement {
19
27
  range = creators_1.interpolatedRange) {
20
28
  super();
21
29
  this.range = range;
30
+ this.kind = AstNode_1.AstNodeKind.EmptyStatement;
22
31
  }
23
32
  transpile(state) {
24
33
  return [];
@@ -31,11 +40,12 @@ exports.EmptyStatement = EmptyStatement;
31
40
  /**
32
41
  * This is a top-level statement. Consider this the root of the AST
33
42
  */
34
- class Body extends AstNode_1.Statement {
43
+ class Body extends AstNode_2.Statement {
35
44
  constructor(statements = []) {
36
45
  super();
37
46
  this.statements = statements;
38
- this.symbolTable = new SymbolTable_1.SymbolTable('Body', () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
47
+ this.kind = AstNode_1.AstNodeKind.Body;
48
+ this.symbolTable = new SymbolTable_2.SymbolTable('Body', () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
39
49
  }
40
50
  get range() {
41
51
  var _a;
@@ -88,21 +98,17 @@ class Body extends AstNode_1.Statement {
88
98
  }
89
99
  }
90
100
  exports.Body = Body;
91
- class AssignmentStatement extends AstNode_1.Statement {
92
- constructor(equals, name, value) {
101
+ class AssignmentStatement extends AstNode_2.Statement {
102
+ constructor(equals, name, value, asToken, typeExpression) {
93
103
  super();
94
104
  this.equals = equals;
95
105
  this.name = name;
96
106
  this.value = value;
107
+ this.asToken = asToken;
108
+ this.typeExpression = typeExpression;
109
+ this.kind = AstNode_1.AstNodeKind.AssignmentStatement;
97
110
  this.range = util_1.util.createBoundingRange(name, equals, value);
98
111
  }
99
- /**
100
- * Get the name of the wrapping namespace (if it exists)
101
- * @deprecated use `.findAncestor(isFunctionExpression)` instead.
102
- */
103
- get containingFunction() {
104
- return this.findAncestor(reflection_1.isFunctionExpression);
105
- }
106
112
  transpile(state) {
107
113
  var _a, _b;
108
114
  //if the value is a compound assignment, just transpile the expression itself
@@ -121,16 +127,22 @@ class AssignmentStatement extends AstNode_1.Statement {
121
127
  }
122
128
  walk(visitor, options) {
123
129
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
130
+ //TODO: Walk TypeExpression. We need to decide how to implement types on assignments
124
131
  (0, visitors_1.walk)(this, 'value', visitor, options);
125
132
  }
126
133
  }
134
+ getType(options) {
135
+ const rhs = this.value.getType(options);
136
+ return rhs;
137
+ }
127
138
  }
128
139
  exports.AssignmentStatement = AssignmentStatement;
129
- class Block extends AstNode_1.Statement {
140
+ class Block extends AstNode_2.Statement {
130
141
  constructor(statements, startingRange) {
131
142
  super();
132
143
  this.statements = statements;
133
144
  this.startingRange = startingRange;
145
+ this.kind = AstNode_1.AstNodeKind.Block;
134
146
  this.range = util_1.util.createBoundingRange({ range: this.startingRange }, ...(statements !== null && statements !== void 0 ? statements : []));
135
147
  }
136
148
  transpile(state) {
@@ -164,10 +176,11 @@ class Block extends AstNode_1.Statement {
164
176
  }
165
177
  }
166
178
  exports.Block = Block;
167
- class ExpressionStatement extends AstNode_1.Statement {
179
+ class ExpressionStatement extends AstNode_2.Statement {
168
180
  constructor(expression) {
169
181
  super();
170
182
  this.expression = expression;
183
+ this.kind = AstNode_1.AstNodeKind.ExpressionStatement;
171
184
  this.range = this.expression.range;
172
185
  }
173
186
  transpile(state) {
@@ -180,11 +193,12 @@ class ExpressionStatement extends AstNode_1.Statement {
180
193
  }
181
194
  }
182
195
  exports.ExpressionStatement = ExpressionStatement;
183
- class CommentStatement extends AstNode_1.Statement {
196
+ class CommentStatement extends AstNode_2.Statement {
184
197
  constructor(comments) {
185
198
  var _a;
186
199
  super();
187
200
  this.comments = comments;
201
+ this.kind = AstNode_1.AstNodeKind.CommentStatement;
188
202
  this.visitMode = visitors_1.InternalWalkMode.visitStatements | visitors_1.InternalWalkMode.visitExpressions;
189
203
  if (((_a = this.comments) === null || _a === void 0 ? void 0 : _a.length) > 0) {
190
204
  this.range = util_1.util.createBoundingRange(...this.comments);
@@ -216,10 +230,11 @@ class CommentStatement extends AstNode_1.Statement {
216
230
  }
217
231
  }
218
232
  exports.CommentStatement = CommentStatement;
219
- class ExitForStatement extends AstNode_1.Statement {
233
+ class ExitForStatement extends AstNode_2.Statement {
220
234
  constructor(tokens) {
221
235
  super();
222
236
  this.tokens = tokens;
237
+ this.kind = AstNode_1.AstNodeKind.ExitForStatement;
223
238
  this.range = this.tokens.exitFor.range;
224
239
  }
225
240
  transpile(state) {
@@ -232,10 +247,11 @@ class ExitForStatement extends AstNode_1.Statement {
232
247
  }
233
248
  }
234
249
  exports.ExitForStatement = ExitForStatement;
235
- class ExitWhileStatement extends AstNode_1.Statement {
250
+ class ExitWhileStatement extends AstNode_2.Statement {
236
251
  constructor(tokens) {
237
252
  super();
238
253
  this.tokens = tokens;
254
+ this.kind = AstNode_1.AstNodeKind.ExitWhileStatement;
239
255
  this.range = this.tokens.exitWhile.range;
240
256
  }
241
257
  transpile(state) {
@@ -248,11 +264,12 @@ class ExitWhileStatement extends AstNode_1.Statement {
248
264
  }
249
265
  }
250
266
  exports.ExitWhileStatement = ExitWhileStatement;
251
- class FunctionStatement extends AstNode_1.Statement {
267
+ class FunctionStatement extends AstNode_2.Statement {
252
268
  constructor(name, func) {
253
269
  super();
254
270
  this.name = name;
255
271
  this.func = func;
272
+ this.kind = AstNode_1.AstNodeKind.FunctionStatement;
256
273
  this.range = this.func.range;
257
274
  }
258
275
  /**
@@ -270,14 +287,6 @@ class FunctionStatement extends AstNode_1.Statement {
270
287
  return this.name.text;
271
288
  }
272
289
  }
273
- /**
274
- * Get the name of the wrapping namespace (if it exists)
275
- * @deprecated use `.findAncestor(isNamespaceStatement)` instead.
276
- */
277
- get namespaceName() {
278
- var _a;
279
- return (_a = this.findAncestor(reflection_1.isNamespaceStatement)) === null || _a === void 0 ? void 0 : _a.nameExpression;
280
- }
281
290
  transpile(state) {
282
291
  //create a fake token using the full transpiled name
283
292
  let nameToken = Object.assign(Object.assign({}, this.name), { text: this.getName(Parser_1.ParseMode.BrightScript) });
@@ -297,9 +306,14 @@ class FunctionStatement extends AstNode_1.Statement {
297
306
  (0, visitors_1.walk)(this, 'func', visitor, options);
298
307
  }
299
308
  }
309
+ getType(options) {
310
+ const funcExprType = this.func.getType(options);
311
+ funcExprType.setName(this.name.text);
312
+ return funcExprType;
313
+ }
300
314
  }
301
315
  exports.FunctionStatement = FunctionStatement;
302
- class IfStatement extends AstNode_1.Statement {
316
+ class IfStatement extends AstNode_2.Statement {
303
317
  constructor(tokens, condition, thenBranch, elseBranch, isInline) {
304
318
  super();
305
319
  this.tokens = tokens;
@@ -307,6 +321,7 @@ class IfStatement extends AstNode_1.Statement {
307
321
  this.thenBranch = thenBranch;
308
322
  this.elseBranch = elseBranch;
309
323
  this.isInline = isInline;
324
+ this.kind = AstNode_1.AstNodeKind.IfStatement;
310
325
  this.range = util_1.util.createBoundingRange(tokens.if, condition, tokens.then, thenBranch, tokens.else, elseBranch, tokens.endIf);
311
326
  }
312
327
  transpile(state) {
@@ -385,11 +400,12 @@ class IfStatement extends AstNode_1.Statement {
385
400
  }
386
401
  }
387
402
  exports.IfStatement = IfStatement;
388
- class IncrementStatement extends AstNode_1.Statement {
403
+ class IncrementStatement extends AstNode_2.Statement {
389
404
  constructor(value, operator) {
390
405
  super();
391
406
  this.value = value;
392
407
  this.operator = operator;
408
+ this.kind = AstNode_1.AstNodeKind.IncrementStatement;
393
409
  this.range = util_1.util.createBoundingRange(value, operator);
394
410
  }
395
411
  transpile(state) {
@@ -408,7 +424,7 @@ exports.IncrementStatement = IncrementStatement;
408
424
  /**
409
425
  * Represents a `print` statement within BrightScript.
410
426
  */
411
- class PrintStatement extends AstNode_1.Statement {
427
+ class PrintStatement extends AstNode_2.Statement {
412
428
  /**
413
429
  * Creates a new internal representation of a BrightScript `print` statement.
414
430
  * @param tokens the tokens for this statement
@@ -419,6 +435,7 @@ class PrintStatement extends AstNode_1.Statement {
419
435
  super();
420
436
  this.tokens = tokens;
421
437
  this.expressions = expressions;
438
+ this.kind = AstNode_1.AstNodeKind.PrintStatement;
422
439
  this.range = util_1.util.createBoundingRange(tokens.print, ...(expressions !== null && expressions !== void 0 ? expressions : []));
423
440
  }
424
441
  transpile(state) {
@@ -450,7 +467,7 @@ class PrintStatement extends AstNode_1.Statement {
450
467
  }
451
468
  }
452
469
  exports.PrintStatement = PrintStatement;
453
- class DimStatement extends AstNode_1.Statement {
470
+ class DimStatement extends AstNode_2.Statement {
454
471
  constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
455
472
  super();
456
473
  this.dimToken = dimToken;
@@ -458,6 +475,7 @@ class DimStatement extends AstNode_1.Statement {
458
475
  this.openingSquare = openingSquare;
459
476
  this.dimensions = dimensions;
460
477
  this.closingSquare = closingSquare;
478
+ this.kind = AstNode_1.AstNodeKind.DimStatement;
461
479
  this.range = util_1.util.createBoundingRange(dimToken, identifier, openingSquare, ...(dimensions !== null && dimensions !== void 0 ? dimensions : []), closingSquare);
462
480
  }
463
481
  transpile(state) {
@@ -484,10 +502,11 @@ class DimStatement extends AstNode_1.Statement {
484
502
  }
485
503
  }
486
504
  exports.DimStatement = DimStatement;
487
- class GotoStatement extends AstNode_1.Statement {
505
+ class GotoStatement extends AstNode_2.Statement {
488
506
  constructor(tokens) {
489
507
  super();
490
508
  this.tokens = tokens;
509
+ this.kind = AstNode_1.AstNodeKind.GotoStatement;
491
510
  this.range = util_1.util.createBoundingRange(tokens.goto, tokens.label);
492
511
  }
493
512
  transpile(state) {
@@ -502,10 +521,11 @@ class GotoStatement extends AstNode_1.Statement {
502
521
  }
503
522
  }
504
523
  exports.GotoStatement = GotoStatement;
505
- class LabelStatement extends AstNode_1.Statement {
524
+ class LabelStatement extends AstNode_2.Statement {
506
525
  constructor(tokens) {
507
526
  super();
508
527
  this.tokens = tokens;
528
+ this.kind = AstNode_1.AstNodeKind.LabelStatement;
509
529
  this.range = util_1.util.createBoundingRange(tokens.identifier, tokens.colon);
510
530
  }
511
531
  transpile(state) {
@@ -519,11 +539,12 @@ class LabelStatement extends AstNode_1.Statement {
519
539
  }
520
540
  }
521
541
  exports.LabelStatement = LabelStatement;
522
- class ReturnStatement extends AstNode_1.Statement {
542
+ class ReturnStatement extends AstNode_2.Statement {
523
543
  constructor(tokens, value) {
524
544
  super();
525
545
  this.tokens = tokens;
526
546
  this.value = value;
547
+ this.kind = AstNode_1.AstNodeKind.ReturnStatement;
527
548
  this.range = util_1.util.createBoundingRange(tokens.return, value);
528
549
  }
529
550
  transpile(state) {
@@ -542,10 +563,11 @@ class ReturnStatement extends AstNode_1.Statement {
542
563
  }
543
564
  }
544
565
  exports.ReturnStatement = ReturnStatement;
545
- class EndStatement extends AstNode_1.Statement {
566
+ class EndStatement extends AstNode_2.Statement {
546
567
  constructor(tokens) {
547
568
  super();
548
569
  this.tokens = tokens;
570
+ this.kind = AstNode_1.AstNodeKind.EndStatement;
549
571
  this.range = tokens.end.range;
550
572
  }
551
573
  transpile(state) {
@@ -558,11 +580,12 @@ class EndStatement extends AstNode_1.Statement {
558
580
  }
559
581
  }
560
582
  exports.EndStatement = EndStatement;
561
- class StopStatement extends AstNode_1.Statement {
583
+ class StopStatement extends AstNode_2.Statement {
562
584
  constructor(tokens) {
563
585
  var _a;
564
586
  super();
565
587
  this.tokens = tokens;
588
+ this.kind = AstNode_1.AstNodeKind.StopStatement;
566
589
  this.range = (_a = tokens === null || tokens === void 0 ? void 0 : tokens.stop) === null || _a === void 0 ? void 0 : _a.range;
567
590
  }
568
591
  transpile(state) {
@@ -575,7 +598,7 @@ class StopStatement extends AstNode_1.Statement {
575
598
  }
576
599
  }
577
600
  exports.StopStatement = StopStatement;
578
- class ForStatement extends AstNode_1.Statement {
601
+ class ForStatement extends AstNode_2.Statement {
579
602
  constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
580
603
  super();
581
604
  this.forToken = forToken;
@@ -586,6 +609,7 @@ class ForStatement extends AstNode_1.Statement {
586
609
  this.endForToken = endForToken;
587
610
  this.stepToken = stepToken;
588
611
  this.increment = increment;
612
+ this.kind = AstNode_1.AstNodeKind.ForStatement;
589
613
  this.range = util_1.util.createBoundingRange(forToken, counterDeclaration, toToken, finalValue, stepToken, increment, body, endForToken);
590
614
  }
591
615
  transpile(state) {
@@ -626,13 +650,14 @@ class ForStatement extends AstNode_1.Statement {
626
650
  }
627
651
  }
628
652
  exports.ForStatement = ForStatement;
629
- class ForEachStatement extends AstNode_1.Statement {
653
+ class ForEachStatement extends AstNode_2.Statement {
630
654
  constructor(tokens, item, target, body) {
631
655
  super();
632
656
  this.tokens = tokens;
633
657
  this.item = item;
634
658
  this.target = target;
635
659
  this.body = body;
660
+ this.kind = AstNode_1.AstNodeKind.ForEachStatement;
636
661
  this.range = util_1.util.createBoundingRange(tokens.forEach, item, tokens.in, target, body, tokens.endFor);
637
662
  }
638
663
  transpile(state) {
@@ -665,12 +690,13 @@ class ForEachStatement extends AstNode_1.Statement {
665
690
  }
666
691
  }
667
692
  exports.ForEachStatement = ForEachStatement;
668
- class WhileStatement extends AstNode_1.Statement {
693
+ class WhileStatement extends AstNode_2.Statement {
669
694
  constructor(tokens, condition, body) {
670
695
  super();
671
696
  this.tokens = tokens;
672
697
  this.condition = condition;
673
698
  this.body = body;
699
+ this.kind = AstNode_1.AstNodeKind.WhileStatement;
674
700
  this.range = util_1.util.createBoundingRange(tokens.while, condition, body, tokens.endWhile);
675
701
  }
676
702
  transpile(state) {
@@ -699,13 +725,14 @@ class WhileStatement extends AstNode_1.Statement {
699
725
  }
700
726
  }
701
727
  exports.WhileStatement = WhileStatement;
702
- class DottedSetStatement extends AstNode_1.Statement {
728
+ class DottedSetStatement extends AstNode_2.Statement {
703
729
  constructor(obj, name, value, dot) {
704
730
  super();
705
731
  this.obj = obj;
706
732
  this.name = name;
707
733
  this.value = value;
708
734
  this.dot = dot;
735
+ this.kind = AstNode_1.AstNodeKind.DottedSetStatement;
709
736
  this.range = util_1.util.createBoundingRange(obj, dot, name, value);
710
737
  }
711
738
  transpile(state) {
@@ -735,7 +762,7 @@ class DottedSetStatement extends AstNode_1.Statement {
735
762
  }
736
763
  }
737
764
  exports.DottedSetStatement = DottedSetStatement;
738
- class IndexedSetStatement extends AstNode_1.Statement {
765
+ class IndexedSetStatement extends AstNode_2.Statement {
739
766
  constructor(obj, index, value, openingSquare, closingSquare) {
740
767
  super();
741
768
  this.obj = obj;
@@ -743,6 +770,7 @@ class IndexedSetStatement extends AstNode_1.Statement {
743
770
  this.value = value;
744
771
  this.openingSquare = openingSquare;
745
772
  this.closingSquare = closingSquare;
773
+ this.kind = AstNode_1.AstNodeKind.IndexedSetStatement;
746
774
  this.range = util_1.util.createBoundingRange(obj, openingSquare, index, closingSquare, value);
747
775
  }
748
776
  transpile(state) {
@@ -777,10 +805,11 @@ class IndexedSetStatement extends AstNode_1.Statement {
777
805
  }
778
806
  }
779
807
  exports.IndexedSetStatement = IndexedSetStatement;
780
- class LibraryStatement extends AstNode_1.Statement {
808
+ class LibraryStatement extends AstNode_2.Statement {
781
809
  constructor(tokens) {
782
810
  super();
783
811
  this.tokens = tokens;
812
+ this.kind = AstNode_1.AstNodeKind.LibraryStatement;
784
813
  this.range = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath);
785
814
  }
786
815
  transpile(state) {
@@ -800,7 +829,7 @@ class LibraryStatement extends AstNode_1.Statement {
800
829
  }
801
830
  }
802
831
  exports.LibraryStatement = LibraryStatement;
803
- class NamespaceStatement extends AstNode_1.Statement {
832
+ class NamespaceStatement extends AstNode_2.Statement {
804
833
  constructor(keyword,
805
834
  // this should technically only be a VariableExpression or DottedGetExpression, but that can be enforced elsewhere
806
835
  nameExpression, body, endKeyword) {
@@ -809,8 +838,9 @@ class NamespaceStatement extends AstNode_1.Statement {
809
838
  this.nameExpression = nameExpression;
810
839
  this.body = body;
811
840
  this.endKeyword = endKeyword;
841
+ this.kind = AstNode_1.AstNodeKind.NamespaceStatement;
812
842
  this.name = this.getName(Parser_1.ParseMode.BrighterScript);
813
- this.symbolTable = new SymbolTable_1.SymbolTable(`NamespaceStatement: '${this.name}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
843
+ this.symbolTable = new SymbolTable_2.SymbolTable(`NamespaceStatement: '${this.name}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
814
844
  }
815
845
  get range() {
816
846
  return this.cacheRange();
@@ -824,9 +854,9 @@ class NamespaceStatement extends AstNode_1.Statement {
824
854
  }
825
855
  getName(parseMode) {
826
856
  const parentNamespace = this.findAncestor(reflection_1.isNamespaceStatement);
827
- let name = this.nameExpression.getName(parseMode);
857
+ const sep = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
858
+ let name = util_1.util.getAllDottedGetPartsAsString(this.nameExpression, parseMode);
828
859
  if (parentNamespace) {
829
- const sep = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
830
860
  name = parentNamespace.getName(parseMode) + sep + name;
831
861
  }
832
862
  return name;
@@ -855,13 +885,19 @@ class NamespaceStatement extends AstNode_1.Statement {
855
885
  (0, visitors_1.walk)(this, 'body', visitor, options);
856
886
  }
857
887
  }
888
+ getType(options) {
889
+ const resultType = new NamespaceType_1.NamespaceType(this.name);
890
+ resultType.pushMemberProvider(() => this.body.getSymbolTable());
891
+ return resultType;
892
+ }
858
893
  }
859
894
  exports.NamespaceStatement = NamespaceStatement;
860
- class ImportStatement extends AstNode_1.Statement {
895
+ class ImportStatement extends AstNode_2.Statement {
861
896
  constructor(importToken, filePathToken) {
862
897
  super();
863
898
  this.importToken = importToken;
864
899
  this.filePathToken = filePathToken;
900
+ this.kind = AstNode_1.AstNodeKind.ImportStatement;
865
901
  this.range = util_1.util.createBoundingRange(importToken, filePathToken);
866
902
  if (this.filePathToken) {
867
903
  //remove quotes
@@ -896,11 +932,12 @@ class ImportStatement extends AstNode_1.Statement {
896
932
  }
897
933
  }
898
934
  exports.ImportStatement = ImportStatement;
899
- class InterfaceStatement extends AstNode_1.Statement {
935
+ class InterfaceStatement extends AstNode_2.Statement {
900
936
  constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken) {
901
937
  super();
902
938
  this.parentInterfaceName = parentInterfaceName;
903
939
  this.body = body;
940
+ this.kind = AstNode_1.AstNodeKind.InterfaceStatement;
904
941
  this.tokens = {};
905
942
  this.tokens.interface = interfaceToken;
906
943
  this.tokens.name = name;
@@ -908,20 +945,15 @@ class InterfaceStatement extends AstNode_1.Statement {
908
945
  this.tokens.endInterface = endInterfaceToken;
909
946
  this.range = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface);
910
947
  }
911
- /**
912
- * Get the name of the wrapping namespace (if it exists)
913
- * @deprecated use `.findAncestor(isNamespaceStatement)` instead.
914
- */
915
- get namespaceName() {
916
- var _a;
917
- return (_a = this.findAncestor(reflection_1.isNamespaceStatement)) === null || _a === void 0 ? void 0 : _a.nameExpression;
918
- }
919
948
  get fields() {
920
949
  return this.body.filter(x => (0, reflection_1.isInterfaceFieldStatement)(x));
921
950
  }
922
951
  get methods() {
923
952
  return this.body.filter(x => (0, reflection_1.isInterfaceMethodStatement)(x));
924
953
  }
954
+ hasParentInterface() {
955
+ return !!this.parentInterfaceName;
956
+ }
925
957
  /**
926
958
  * The name of the interface WITH its leading namespace (if applicable)
927
959
  */
@@ -975,7 +1007,7 @@ class InterfaceStatement extends AstNode_1.Statement {
975
1007
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
976
1008
  }
977
1009
  result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
978
- const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName(Parser_1.ParseMode.BrighterScript);
1010
+ const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName();
979
1011
  if (parentInterfaceName) {
980
1012
  result.push(' extends ', parentInterfaceName);
981
1013
  }
@@ -1004,17 +1036,29 @@ class InterfaceStatement extends AstNode_1.Statement {
1004
1036
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1005
1037
  }
1006
1038
  }
1039
+ getType(options) {
1040
+ var _a, _b, _c;
1041
+ const superIface = (_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getType(options);
1042
+ const resultType = new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), superIface);
1043
+ for (const statement of this.methods) {
1044
+ resultType.addMember((_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 === null || statement === void 0 ? void 0 : statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
1045
+ }
1046
+ for (const statement of this.fields) {
1047
+ resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
1048
+ }
1049
+ return resultType;
1050
+ }
1007
1051
  }
1008
1052
  exports.InterfaceStatement = InterfaceStatement;
1009
- class InterfaceFieldStatement extends AstNode_1.Statement {
1010
- constructor(nameToken, asToken, typeToken, type) {
1053
+ class InterfaceFieldStatement extends AstNode_2.Statement {
1054
+ constructor(nameToken, asToken, typeExpression) {
1011
1055
  super();
1012
- this.type = type;
1056
+ this.typeExpression = typeExpression;
1057
+ this.kind = AstNode_1.AstNodeKind.InterfaceFieldStatement;
1013
1058
  this.tokens = {};
1014
1059
  this.tokens.name = nameToken;
1015
1060
  this.tokens.as = asToken;
1016
- this.tokens.type = typeToken;
1017
- this.range = util_1.util.createBoundingRange(nameToken, asToken, typeToken);
1061
+ this.range = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.typeExpression);
1018
1062
  }
1019
1063
  transpile(state) {
1020
1064
  throw new Error('Method not implemented.');
@@ -1023,47 +1067,57 @@ class InterfaceFieldStatement extends AstNode_1.Statement {
1023
1067
  return this.tokens.name.text;
1024
1068
  }
1025
1069
  walk(visitor, options) {
1026
- //nothing to walk
1070
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1071
+ (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
1072
+ }
1027
1073
  }
1028
1074
  getTypedef(state) {
1029
- var _a, _b, _c;
1075
+ var _a;
1030
1076
  const result = [];
1031
1077
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1032
1078
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1033
1079
  }
1034
1080
  result.push(this.tokens.name.text);
1035
- if (((_c = (_b = this.tokens.type) === null || _b === void 0 ? void 0 : _b.text) === null || _c === void 0 ? void 0 : _c.length) > 0) {
1036
- result.push(' as ', this.tokens.type.text);
1081
+ if (this.typeExpression) {
1082
+ result.push(' as ', ...this.typeExpression.getTypedef(state));
1037
1083
  }
1038
1084
  return result;
1039
1085
  }
1086
+ getType(options) {
1087
+ var _a, _b;
1088
+ return (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(options)) !== null && _b !== void 0 ? _b : DynamicType_1.DynamicType.instance;
1089
+ }
1040
1090
  }
1041
1091
  exports.InterfaceFieldStatement = InterfaceFieldStatement;
1042
- class InterfaceMethodStatement extends AstNode_1.Statement {
1043
- constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeToken, returnType) {
1092
+ //TODO: there is much that is similar with this and FunctionExpression.
1093
+ //It would be nice to refactor this so there is less duplicated code
1094
+ class InterfaceMethodStatement extends AstNode_2.Statement {
1095
+ constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeExpression) {
1044
1096
  super();
1045
1097
  this.params = params;
1046
- this.returnType = returnType;
1098
+ this.returnTypeExpression = returnTypeExpression;
1099
+ this.kind = AstNode_1.AstNodeKind.InterfaceMethodStatement;
1047
1100
  this.tokens = {};
1048
1101
  this.tokens.functionType = functionTypeToken;
1049
1102
  this.tokens.name = nameToken;
1050
1103
  this.tokens.leftParen = leftParen;
1051
1104
  this.tokens.rightParen = rightParen;
1052
1105
  this.tokens.as = asToken;
1053
- this.tokens.returnType = returnTypeToken;
1054
1106
  }
1055
1107
  transpile(state) {
1056
1108
  throw new Error('Method not implemented.');
1057
1109
  }
1058
1110
  get range() {
1059
1111
  var _a;
1060
- return util_1.util.createBoundingRange(this.tokens.functionType, this.tokens.name, this.tokens.leftParen, ...((_a = this.params) !== null && _a !== void 0 ? _a : []), this.tokens.rightParen, this.tokens.as, this.tokens.returnType);
1112
+ return util_1.util.createBoundingRange(this.tokens.functionType, this.tokens.name, this.tokens.leftParen, ...((_a = this.params) !== null && _a !== void 0 ? _a : []), this.tokens.rightParen, this.tokens.as, this.returnTypeExpression);
1061
1113
  }
1062
1114
  walk(visitor, options) {
1063
- //nothing to walk
1115
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1116
+ (0, visitors_1.walk)(this, 'returnTypeExpression', visitor, options);
1117
+ }
1064
1118
  }
1065
1119
  getTypedef(state) {
1066
- var _a, _b, _c, _d, _e;
1120
+ var _a, _b;
1067
1121
  const result = [];
1068
1122
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1069
1123
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
@@ -1076,19 +1130,35 @@ class InterfaceMethodStatement extends AstNode_1.Statement {
1076
1130
  }
1077
1131
  const param = params[i];
1078
1132
  result.push(param.name.text);
1079
- if (((_d = (_c = param.typeToken) === null || _c === void 0 ? void 0 : _c.text) === null || _d === void 0 ? void 0 : _d.length) > 0) {
1080
- result.push(' as ', param.typeToken.text);
1133
+ if (param.typeExpression) {
1134
+ result.push(' as ', ...param.typeExpression.getTypedef(state));
1081
1135
  }
1082
1136
  }
1083
1137
  result.push(')');
1084
- if (((_e = this.tokens.returnType) === null || _e === void 0 ? void 0 : _e.text.length) > 0) {
1085
- result.push(' as ', this.tokens.returnType.text);
1138
+ if (this.returnTypeExpression) {
1139
+ result.push(' as ', ...this.returnTypeExpression.getTypedef(state));
1086
1140
  }
1087
1141
  return result;
1088
1142
  }
1143
+ getType(options) {
1144
+ var _a;
1145
+ //if there's a defined return type, use that
1146
+ let returnType = (_a = this.returnTypeExpression) === null || _a === void 0 ? void 0 : _a.getType(options);
1147
+ const isSub = this.tokens.functionType.kind === TokenKind_1.TokenKind.Sub;
1148
+ //if we don't have a return type and this is a sub, set the return type to `void`. else use `dynamic`
1149
+ if (!returnType) {
1150
+ returnType = isSub ? VoidType_1.VoidType.instance : DynamicType_1.DynamicType.instance;
1151
+ }
1152
+ const resultType = new FunctionType_1.FunctionType(returnType);
1153
+ resultType.isSub = isSub;
1154
+ for (let param of this.params) {
1155
+ resultType.addParameter(param.name.text, param.getType(options), !!param.defaultValue);
1156
+ }
1157
+ return resultType;
1158
+ }
1089
1159
  }
1090
1160
  exports.InterfaceMethodStatement = InterfaceMethodStatement;
1091
- class ClassStatement extends AstNode_1.Statement {
1161
+ class ClassStatement extends AstNode_2.Statement {
1092
1162
  constructor(classKeyword,
1093
1163
  /**
1094
1164
  * The name of the class (without namespace prefix)
@@ -1102,6 +1172,7 @@ class ClassStatement extends AstNode_1.Statement {
1102
1172
  this.end = end;
1103
1173
  this.extendsKeyword = extendsKeyword;
1104
1174
  this.parentClassName = parentClassName;
1175
+ this.kind = AstNode_1.AstNodeKind.ClassStatement;
1105
1176
  this.memberMap = {};
1106
1177
  this.methods = [];
1107
1178
  this.fields = [];
@@ -1118,14 +1189,6 @@ class ClassStatement extends AstNode_1.Statement {
1118
1189
  }
1119
1190
  this.range = util_1.util.createBoundingRange(classKeyword, name, extendsKeyword, parentClassName, ...(body !== null && body !== void 0 ? body : []), end);
1120
1191
  }
1121
- /**
1122
- * Get the name of the wrapping namespace (if it exists)
1123
- * @deprecated use `.findAncestor(isNamespaceStatement)` instead.
1124
- */
1125
- get namespaceName() {
1126
- var _a;
1127
- return (_a = this.findAncestor(reflection_1.isNamespaceStatement)) === null || _a === void 0 ? void 0 : _a.nameExpression;
1128
- }
1129
1192
  getName(parseMode) {
1130
1193
  var _a;
1131
1194
  const name = (_a = this.name) === null || _a === void 0 ? void 0 : _a.text;
@@ -1163,7 +1226,7 @@ class ClassStatement extends AstNode_1.Statement {
1163
1226
  result.push('class ', this.name.text);
1164
1227
  if (this.extendsKeyword && this.parentClassName) {
1165
1228
  const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1166
- const fqName = util_1.util.getFullyQualifiedClassName(this.parentClassName.getName(Parser_1.ParseMode.BrighterScript), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript));
1229
+ const fqName = util_1.util.getFullyQualifiedClassName(this.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript));
1167
1230
  result.push(` extends ${fqName}`);
1168
1231
  }
1169
1232
  result.push(state.newline);
@@ -1202,7 +1265,7 @@ class ClassStatement extends AstNode_1.Statement {
1202
1265
  if (stmt.parentClassName) {
1203
1266
  const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1204
1267
  //find the parent class
1205
- stmt = (_a = state.file.getClassFileLink(stmt.parentClassName.getName(Parser_1.ParseMode.BrighterScript), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript))) === null || _a === void 0 ? void 0 : _a.item;
1268
+ stmt = (_a = state.file.getClassFileLink(stmt.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript))) === null || _a === void 0 ? void 0 : _a.item;
1206
1269
  myIndex++;
1207
1270
  }
1208
1271
  else {
@@ -1231,7 +1294,7 @@ class ClassStatement extends AstNode_1.Statement {
1231
1294
  while (stmt) {
1232
1295
  if (stmt.parentClassName) {
1233
1296
  const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1234
- stmt = (_a = state.file.getClassFileLink(stmt.parentClassName.getName(Parser_1.ParseMode.BrighterScript), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript))) === null || _a === void 0 ? void 0 : _a.item;
1297
+ stmt = (_a = state.file.getClassFileLink(stmt.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript))) === null || _a === void 0 ? void 0 : _a.item;
1235
1298
  ancestors.push(stmt);
1236
1299
  }
1237
1300
  else {
@@ -1382,6 +1445,19 @@ class ClassStatement extends AstNode_1.Statement {
1382
1445
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1383
1446
  }
1384
1447
  }
1448
+ getType(options) {
1449
+ var _a, _b, _c;
1450
+ const superClass = (_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getType(options);
1451
+ const resultType = new ClassType_1.ClassType(this.getName(Parser_1.ParseMode.BrighterScript), superClass);
1452
+ for (const statement of this.methods) {
1453
+ const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getType(options);
1454
+ resultType.addMember((_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, funcType, SymbolTable_1.SymbolTypeFlag.runtime);
1455
+ }
1456
+ for (const statement of this.fields) {
1457
+ resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
1458
+ }
1459
+ return resultType;
1460
+ }
1385
1461
  }
1386
1462
  exports.ClassStatement = ClassStatement;
1387
1463
  const accessModifiers = [
@@ -1393,6 +1469,7 @@ class MethodStatement extends FunctionStatement {
1393
1469
  constructor(modifiers, name, func, override) {
1394
1470
  super(name, func);
1395
1471
  this.override = override;
1472
+ this.kind = AstNode_1.AstNodeKind.MethodStatement;
1396
1473
  this.modifiers = [];
1397
1474
  if (modifiers) {
1398
1475
  if (Array.isArray(modifiers)) {
@@ -1468,17 +1545,18 @@ class MethodStatement extends FunctionStatement {
1468
1545
  if (state.classStatement.getAncestors(state).length === 0) {
1469
1546
  return;
1470
1547
  }
1471
- //find the first non-comment statement
1472
- let firstStatement = this.func.body.statements.find(x => !(0, reflection_1.isCommentStatement)(x));
1473
- //if the first statement is a call to super, quit here
1474
- if (
1475
- //is a call statement
1476
- (0, reflection_1.isExpressionStatement)(firstStatement) && (0, reflection_1.isCallExpression)(firstStatement.expression) &&
1477
- //is a call to super
1478
- util_1.util.findBeginningVariableExpression(firstStatement === null || firstStatement === void 0 ? void 0 : firstStatement.expression.callee).name.text.toLowerCase() === 'super') {
1548
+ //check whether any calls to super exist
1549
+ let containsSuperCall = this.func.body.statements.findIndex((x) => {
1550
+ //is a call statement
1551
+ return (0, reflection_1.isExpressionStatement)(x) && (0, reflection_1.isCallExpression)(x.expression) &&
1552
+ //is a call to super
1553
+ util_1.util.findBeginningVariableExpression(x.expression.callee).name.text.toLowerCase() === 'super';
1554
+ }) !== -1;
1555
+ //if a call to super exists, quit here
1556
+ if (containsSuperCall) {
1479
1557
  return;
1480
1558
  }
1481
- //this is a child class, and the first statement isn't a call to super. Inject one
1559
+ //this is a child class, and the constructor doesn't contain a call to super. Inject one
1482
1560
  const superCall = new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
1483
1561
  kind: TokenKind_1.TokenKind.Identifier,
1484
1562
  text: 'super',
@@ -1527,37 +1605,25 @@ class MethodStatement extends FunctionStatement {
1527
1605
  }
1528
1606
  }
1529
1607
  exports.MethodStatement = MethodStatement;
1530
- /**
1531
- * @deprecated use `MethodStatement`
1532
- */
1533
- class ClassMethodStatement extends MethodStatement {
1534
- }
1535
- exports.ClassMethodStatement = ClassMethodStatement;
1536
- class FieldStatement extends AstNode_1.Statement {
1537
- constructor(accessModifier, name, as, type, equal, initialValue) {
1608
+ class FieldStatement extends AstNode_2.Statement {
1609
+ constructor(accessModifier, name, as, typeExpression, equal, initialValue) {
1538
1610
  super();
1539
1611
  this.accessModifier = accessModifier;
1540
1612
  this.name = name;
1541
1613
  this.as = as;
1542
- this.type = type;
1614
+ this.typeExpression = typeExpression;
1543
1615
  this.equal = equal;
1544
1616
  this.initialValue = initialValue;
1545
- this.range = util_1.util.createBoundingRange(accessModifier, name, as, type, equal, initialValue);
1617
+ this.kind = AstNode_1.AstNodeKind.FieldStatement;
1618
+ this.range = util_1.util.createBoundingRange(accessModifier, name, as, typeExpression, equal, initialValue);
1546
1619
  }
1547
1620
  /**
1548
1621
  * Derive a ValueKind from the type token, or the initial value.
1549
1622
  * Defaults to `DynamicType`
1550
1623
  */
1551
- getType() {
1552
- if (this.type) {
1553
- return util_1.util.tokenToBscType(this.type);
1554
- }
1555
- else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
1556
- return this.initialValue.type;
1557
- }
1558
- else {
1559
- return new DynamicType_1.DynamicType();
1560
- }
1624
+ getType(options) {
1625
+ var _a, _b, _c, _d;
1626
+ return (_d = (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.typetime }))) !== null && _b !== void 0 ? _b : (_c = this.initialValue) === null || _c === void 0 ? void 0 : _c.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.runtime }))) !== null && _d !== void 0 ? _d : DynamicType_1.DynamicType.instance;
1561
1627
  }
1562
1628
  transpile(state) {
1563
1629
  throw new Error('transpile not implemented for ' + Object.getPrototypeOf(this).constructor.name);
@@ -1569,7 +1635,7 @@ class FieldStatement extends AstNode_1.Statement {
1569
1635
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1570
1636
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1571
1637
  }
1572
- let type = this.getType();
1638
+ let type = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.typetime });
1573
1639
  if ((0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
1574
1640
  type = new DynamicType_1.DynamicType();
1575
1641
  }
@@ -1578,24 +1644,20 @@ class FieldStatement extends AstNode_1.Statement {
1578
1644
  return result;
1579
1645
  }
1580
1646
  walk(visitor, options) {
1581
- if (this.initialValue && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1647
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1648
+ (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
1582
1649
  (0, visitors_1.walk)(this, 'initialValue', visitor, options);
1583
1650
  }
1584
1651
  }
1585
1652
  }
1586
1653
  exports.FieldStatement = FieldStatement;
1587
- /**
1588
- * @deprecated use `FieldStatement`
1589
- */
1590
- class ClassFieldStatement extends FieldStatement {
1591
- }
1592
- exports.ClassFieldStatement = ClassFieldStatement;
1593
- class TryCatchStatement extends AstNode_1.Statement {
1654
+ class TryCatchStatement extends AstNode_2.Statement {
1594
1655
  constructor(tokens, tryBranch, catchStatement) {
1595
1656
  super();
1596
1657
  this.tokens = tokens;
1597
1658
  this.tryBranch = tryBranch;
1598
1659
  this.catchStatement = catchStatement;
1660
+ this.kind = AstNode_1.AstNodeKind.TryCatchStatement;
1599
1661
  this.range = util_1.util.createBoundingRange(tokens.try, tryBranch, catchStatement, tokens.endTry);
1600
1662
  }
1601
1663
  transpile(state) {
@@ -1619,12 +1681,13 @@ class TryCatchStatement extends AstNode_1.Statement {
1619
1681
  }
1620
1682
  }
1621
1683
  exports.TryCatchStatement = TryCatchStatement;
1622
- class CatchStatement extends AstNode_1.Statement {
1684
+ class CatchStatement extends AstNode_2.Statement {
1623
1685
  constructor(tokens, exceptionVariable, catchBranch) {
1624
1686
  super();
1625
1687
  this.tokens = tokens;
1626
1688
  this.exceptionVariable = exceptionVariable;
1627
1689
  this.catchBranch = catchBranch;
1690
+ this.kind = AstNode_1.AstNodeKind.CatchStatement;
1628
1691
  this.range = util_1.util.createBoundingRange(tokens.catch, exceptionVariable, catchBranch);
1629
1692
  }
1630
1693
  transpile(state) {
@@ -1643,11 +1706,12 @@ class CatchStatement extends AstNode_1.Statement {
1643
1706
  }
1644
1707
  }
1645
1708
  exports.CatchStatement = CatchStatement;
1646
- class ThrowStatement extends AstNode_1.Statement {
1709
+ class ThrowStatement extends AstNode_2.Statement {
1647
1710
  constructor(throwToken, expression) {
1648
1711
  super();
1649
1712
  this.throwToken = throwToken;
1650
1713
  this.expression = expression;
1714
+ this.kind = AstNode_1.AstNodeKind.ThrowStatement;
1651
1715
  this.range = util_1.util.createBoundingRange(throwToken, expression);
1652
1716
  }
1653
1717
  transpile(state) {
@@ -1672,25 +1736,19 @@ class ThrowStatement extends AstNode_1.Statement {
1672
1736
  }
1673
1737
  }
1674
1738
  exports.ThrowStatement = ThrowStatement;
1675
- class EnumStatement extends AstNode_1.Statement {
1739
+ class EnumStatement extends AstNode_2.Statement {
1676
1740
  constructor(tokens, body) {
1677
1741
  var _a;
1678
1742
  super();
1679
1743
  this.tokens = tokens;
1680
1744
  this.body = body;
1745
+ this.kind = AstNode_1.AstNodeKind.EnumStatement;
1746
+ this.symbolTable = new SymbolTable_2.SymbolTable('Enum');
1681
1747
  this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1682
1748
  }
1683
1749
  get range() {
1684
1750
  return util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum);
1685
1751
  }
1686
- /**
1687
- * Get the name of the wrapping namespace (if it exists)
1688
- * @deprecated use `.findAncestor(isNamespaceStatement)` instead.
1689
- */
1690
- get namespaceName() {
1691
- var _a;
1692
- return (_a = this.findAncestor(reflection_1.isNamespaceStatement)) === null || _a === void 0 ? void 0 : _a.nameExpression;
1693
- }
1694
1752
  getMembers() {
1695
1753
  const result = [];
1696
1754
  for (const statement of this.body) {
@@ -1794,13 +1852,26 @@ class EnumStatement extends AstNode_1.Statement {
1794
1852
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1795
1853
  }
1796
1854
  }
1855
+ getType() {
1856
+ var _a, _b;
1857
+ const resultType = new EnumType_1.EnumType(this.fullName);
1858
+ resultType.pushMemberProvider(() => this.getSymbolTable());
1859
+ for (const statement of this.getMembers()) {
1860
+ resultType.addMember((_b = (_a = statement === null || statement === void 0 ? void 0 : statement.tokens) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType(), SymbolTable_1.SymbolTypeFlag.runtime);
1861
+ }
1862
+ return resultType;
1863
+ }
1797
1864
  }
1798
1865
  exports.EnumStatement = EnumStatement;
1799
- class EnumMemberStatement extends AstNode_1.Statement {
1866
+ class EnumMemberStatement extends AstNode_2.Statement {
1800
1867
  constructor(tokens, value) {
1801
1868
  super();
1802
1869
  this.tokens = tokens;
1803
1870
  this.value = value;
1871
+ this.kind = AstNode_1.AstNodeKind.EnumMemberStatement;
1872
+ }
1873
+ get range() {
1874
+ return util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value);
1804
1875
  }
1805
1876
  /**
1806
1877
  * The name of the member
@@ -1808,9 +1879,6 @@ class EnumMemberStatement extends AstNode_1.Statement {
1808
1879
  get name() {
1809
1880
  return this.tokens.name.text;
1810
1881
  }
1811
- get range() {
1812
- return util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value);
1813
- }
1814
1882
  transpile(state) {
1815
1883
  return [];
1816
1884
  }
@@ -1831,13 +1899,18 @@ class EnumMemberStatement extends AstNode_1.Statement {
1831
1899
  (0, visitors_1.walk)(this, 'value', visitor, options);
1832
1900
  }
1833
1901
  }
1902
+ getType() {
1903
+ var _a, _b, _c;
1904
+ return new EnumType_1.EnumMemberType((_a = this.parent) === null || _a === void 0 ? void 0 : _a.fullName, (_c = (_b = this.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text);
1905
+ }
1834
1906
  }
1835
1907
  exports.EnumMemberStatement = EnumMemberStatement;
1836
- class ConstStatement extends AstNode_1.Statement {
1908
+ class ConstStatement extends AstNode_2.Statement {
1837
1909
  constructor(tokens, value) {
1838
1910
  super();
1839
1911
  this.tokens = tokens;
1840
1912
  this.value = value;
1913
+ this.kind = AstNode_1.AstNodeKind.ConstStatement;
1841
1914
  this.range = util_1.util.createBoundingRange(this.tokens.const, this.tokens.name, this.tokens.equals, this.value);
1842
1915
  }
1843
1916
  get name() {
@@ -1884,12 +1957,16 @@ class ConstStatement extends AstNode_1.Statement {
1884
1957
  (0, visitors_1.walk)(this, 'value', visitor, options);
1885
1958
  }
1886
1959
  }
1960
+ getType(options) {
1961
+ return this.value.getType(options);
1962
+ }
1887
1963
  }
1888
1964
  exports.ConstStatement = ConstStatement;
1889
- class ContinueStatement extends AstNode_1.Statement {
1965
+ class ContinueStatement extends AstNode_2.Statement {
1890
1966
  constructor(tokens) {
1891
1967
  super();
1892
1968
  this.tokens = tokens;
1969
+ this.kind = AstNode_1.AstNodeKind.ContinueStatement;
1893
1970
  this.range = util_1.util.createBoundingRange(tokens.continue, tokens.loopType);
1894
1971
  }
1895
1972
  transpile(state) {