brighterscript 0.65.1 → 0.66.0-alpha.1

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 (254) hide show
  1. package/CHANGELOG.md +14 -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 +94 -68
  17. package/dist/Program.js.map +1 -1
  18. package/dist/ProgramBuilder.d.ts +4 -0
  19. package/dist/ProgramBuilder.js +33 -13
  20. package/dist/ProgramBuilder.js.map +1 -1
  21. package/dist/Scope.d.ts +1 -5
  22. package/dist/Scope.js +53 -37
  23. package/dist/Scope.js.map +1 -1
  24. package/dist/SymbolTable.d.ts +44 -6
  25. package/dist/SymbolTable.js +154 -26
  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 +8 -6
  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.d.ts +2 -3
  46. package/dist/bscPlugin/BscPlugin.js +6 -2
  47. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  48. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -1
  49. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +2 -2
  50. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  51. package/dist/bscPlugin/hover/HoverProcessor.js +71 -59
  52. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  53. package/dist/bscPlugin/hover/HoverProcessor.spec.js +110 -10
  54. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  55. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +6 -5
  56. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  57. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  58. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +1 -1
  59. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -1
  60. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +11 -0
  61. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +53 -0
  62. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
  63. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +4 -0
  64. package/dist/bscPlugin/validation/BrsFileValidator.js +37 -16
  65. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  66. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +1 -1
  67. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -1
  68. package/dist/bscPlugin/validation/ProgramValidator.d.ts +3 -3
  69. package/dist/bscPlugin/validation/ProgramValidator.js +6 -6
  70. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -1
  71. package/dist/bscPlugin/validation/ScopeValidator.d.ts +1 -0
  72. package/dist/bscPlugin/validation/ScopeValidator.js +72 -18
  73. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  74. package/dist/bscPlugin/validation/XmlFileValidator.js +9 -9
  75. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -1
  76. package/dist/files/BrsFile.Class.spec.js +9 -10
  77. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  78. package/dist/files/BrsFile.d.ts +8 -10
  79. package/dist/files/BrsFile.js +72 -52
  80. package/dist/files/BrsFile.js.map +1 -1
  81. package/dist/files/BrsFile.spec.js +57 -15
  82. package/dist/files/BrsFile.spec.js.map +1 -1
  83. package/dist/files/XmlFile.d.ts +19 -19
  84. package/dist/files/XmlFile.js +24 -42
  85. package/dist/files/XmlFile.js.map +1 -1
  86. package/dist/files/XmlFile.spec.js +70 -17
  87. package/dist/files/XmlFile.spec.js.map +1 -1
  88. package/dist/files/tests/imports.spec.js +8 -11
  89. package/dist/files/tests/imports.spec.js.map +1 -1
  90. package/dist/globalCallables.js +2 -1
  91. package/dist/globalCallables.js.map +1 -1
  92. package/dist/index.d.ts +2 -0
  93. package/dist/index.js +2 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/interfaces.d.ts +107 -28
  96. package/dist/interfaces.js +13 -0
  97. package/dist/interfaces.js.map +1 -1
  98. package/dist/lexer/TokenKind.d.ts +2 -0
  99. package/dist/lexer/TokenKind.js +5 -1
  100. package/dist/lexer/TokenKind.js.map +1 -1
  101. package/dist/parser/AstNode.d.ts +78 -1
  102. package/dist/parser/AstNode.js +80 -1
  103. package/dist/parser/AstNode.js.map +1 -1
  104. package/dist/parser/Expression.d.ts +87 -53
  105. package/dist/parser/Expression.js +243 -139
  106. package/dist/parser/Expression.js.map +1 -1
  107. package/dist/parser/Parser.Class.spec.js +10 -7
  108. package/dist/parser/Parser.Class.spec.js.map +1 -1
  109. package/dist/parser/Parser.d.ts +9 -5
  110. package/dist/parser/Parser.js +125 -78
  111. package/dist/parser/Parser.js.map +1 -1
  112. package/dist/parser/Parser.spec.d.ts +2 -0
  113. package/dist/parser/Parser.spec.js +117 -5
  114. package/dist/parser/Parser.spec.js.map +1 -1
  115. package/dist/parser/SGParser.d.ts +42 -4
  116. package/dist/parser/SGParser.js +191 -195
  117. package/dist/parser/SGParser.js.map +1 -1
  118. package/dist/parser/SGParser.spec.js +13 -10
  119. package/dist/parser/SGParser.spec.js.map +1 -1
  120. package/dist/parser/SGTypes.d.ts +279 -51
  121. package/dist/parser/SGTypes.js +562 -185
  122. package/dist/parser/SGTypes.js.map +1 -1
  123. package/dist/parser/Statement.d.ts +88 -70
  124. package/dist/parser/Statement.js +212 -136
  125. package/dist/parser/Statement.js.map +1 -1
  126. package/dist/parser/TranspileState.d.ts +1 -1
  127. package/dist/parser/TranspileState.js +5 -2
  128. package/dist/parser/TranspileState.js.map +1 -1
  129. package/dist/parser/tests/expression/TypeExpression.spec.d.ts +1 -0
  130. package/dist/parser/tests/expression/TypeExpression.spec.js +127 -0
  131. package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -0
  132. package/dist/types/ArrayType.d.ts +6 -4
  133. package/dist/types/ArrayType.js +30 -22
  134. package/dist/types/ArrayType.js.map +1 -1
  135. package/dist/types/ArrayType.spec.js +8 -8
  136. package/dist/types/ArrayType.spec.js.map +1 -1
  137. package/dist/types/BooleanType.d.ts +7 -4
  138. package/dist/types/BooleanType.js +13 -8
  139. package/dist/types/BooleanType.js.map +1 -1
  140. package/dist/types/BooleanType.spec.js +9 -3
  141. package/dist/types/BooleanType.spec.js.map +1 -1
  142. package/dist/types/BscType.d.ts +25 -2
  143. package/dist/types/BscType.js +64 -0
  144. package/dist/types/BscType.js.map +1 -1
  145. package/dist/types/BscTypeKind.d.ts +22 -0
  146. package/dist/types/BscTypeKind.js +27 -0
  147. package/dist/types/BscTypeKind.js.map +1 -0
  148. package/dist/types/ClassType.d.ts +11 -0
  149. package/dist/types/ClassType.js +31 -0
  150. package/dist/types/ClassType.js.map +1 -0
  151. package/dist/types/ClassType.spec.d.ts +1 -0
  152. package/dist/types/ClassType.spec.js +75 -0
  153. package/dist/types/ClassType.spec.js.map +1 -0
  154. package/dist/types/DoubleType.d.ts +7 -4
  155. package/dist/types/DoubleType.js +16 -20
  156. package/dist/types/DoubleType.js.map +1 -1
  157. package/dist/types/DoubleType.spec.js +11 -3
  158. package/dist/types/DoubleType.spec.js.map +1 -1
  159. package/dist/types/DynamicType.d.ts +9 -3
  160. package/dist/types/DynamicType.js +16 -2
  161. package/dist/types/DynamicType.js.map +1 -1
  162. package/dist/types/DynamicType.spec.js +15 -4
  163. package/dist/types/DynamicType.spec.js.map +1 -1
  164. package/dist/types/EnumType.d.ts +22 -0
  165. package/dist/types/EnumType.js +59 -0
  166. package/dist/types/EnumType.js.map +1 -0
  167. package/dist/types/EnumType.spec.d.ts +1 -0
  168. package/dist/types/EnumType.spec.js +33 -0
  169. package/dist/types/EnumType.spec.js.map +1 -0
  170. package/dist/types/FloatType.d.ts +7 -4
  171. package/dist/types/FloatType.js +16 -20
  172. package/dist/types/FloatType.js.map +1 -1
  173. package/dist/types/FloatType.spec.js +3 -3
  174. package/dist/types/FloatType.spec.js.map +1 -1
  175. package/dist/types/FunctionType.d.ts +6 -4
  176. package/dist/types/FunctionType.js +22 -19
  177. package/dist/types/FunctionType.js.map +1 -1
  178. package/dist/types/FunctionType.spec.js +5 -5
  179. package/dist/types/FunctionType.spec.js.map +1 -1
  180. package/dist/types/InheritableType.d.ts +25 -0
  181. package/dist/types/InheritableType.js +88 -0
  182. package/dist/types/InheritableType.js.map +1 -0
  183. package/dist/types/IntegerType.d.ts +7 -4
  184. package/dist/types/IntegerType.js +16 -20
  185. package/dist/types/IntegerType.js.map +1 -1
  186. package/dist/types/IntegerType.spec.js +7 -3
  187. package/dist/types/IntegerType.spec.js.map +1 -1
  188. package/dist/types/InterfaceType.d.ts +10 -10
  189. package/dist/types/InterfaceType.js +24 -45
  190. package/dist/types/InterfaceType.js.map +1 -1
  191. package/dist/types/InterfaceType.spec.js +59 -45
  192. package/dist/types/InterfaceType.spec.js.map +1 -1
  193. package/dist/types/InvalidType.d.ts +6 -4
  194. package/dist/types/InvalidType.js +12 -8
  195. package/dist/types/InvalidType.js.map +1 -1
  196. package/dist/types/InvalidType.spec.js +7 -3
  197. package/dist/types/InvalidType.spec.js.map +1 -1
  198. package/dist/types/LongIntegerType.d.ts +7 -4
  199. package/dist/types/LongIntegerType.js +16 -20
  200. package/dist/types/LongIntegerType.js.map +1 -1
  201. package/dist/types/LongIntegerType.spec.js +9 -3
  202. package/dist/types/LongIntegerType.spec.js.map +1 -1
  203. package/dist/types/NamespaceType.d.ts +11 -0
  204. package/dist/types/NamespaceType.js +25 -0
  205. package/dist/types/NamespaceType.js.map +1 -0
  206. package/dist/types/ObjectType.d.ts +8 -4
  207. package/dist/types/ObjectType.js +26 -7
  208. package/dist/types/ObjectType.js.map +1 -1
  209. package/dist/types/ObjectType.spec.js +2 -2
  210. package/dist/types/ObjectType.spec.js.map +1 -1
  211. package/dist/types/ReferenceType.d.ts +51 -0
  212. package/dist/types/ReferenceType.js +274 -0
  213. package/dist/types/ReferenceType.js.map +1 -0
  214. package/dist/types/ReferenceType.spec.d.ts +1 -0
  215. package/dist/types/ReferenceType.spec.js +122 -0
  216. package/dist/types/ReferenceType.spec.js.map +1 -0
  217. package/dist/types/StringType.d.ts +10 -4
  218. package/dist/types/StringType.js +16 -8
  219. package/dist/types/StringType.js.map +1 -1
  220. package/dist/types/StringType.spec.js +2 -2
  221. package/dist/types/StringType.spec.js.map +1 -1
  222. package/dist/types/UninitializedType.d.ts +6 -3
  223. package/dist/types/UninitializedType.js +14 -3
  224. package/dist/types/UninitializedType.js.map +1 -1
  225. package/dist/types/UnionType.d.ts +18 -0
  226. package/dist/types/UnionType.js +91 -0
  227. package/dist/types/UnionType.js.map +1 -0
  228. package/dist/types/UnionType.spec.d.ts +1 -0
  229. package/dist/types/UnionType.spec.js +103 -0
  230. package/dist/types/UnionType.spec.js.map +1 -0
  231. package/dist/types/VoidType.d.ts +7 -4
  232. package/dist/types/VoidType.js +13 -8
  233. package/dist/types/VoidType.js.map +1 -1
  234. package/dist/types/VoidType.spec.js +2 -2
  235. package/dist/types/VoidType.spec.js.map +1 -1
  236. package/dist/types/helper.spec.d.ts +1 -0
  237. package/dist/types/helper.spec.js +130 -0
  238. package/dist/types/helper.spec.js.map +1 -0
  239. package/dist/types/helpers.d.ts +19 -0
  240. package/dist/types/helpers.js +131 -0
  241. package/dist/types/helpers.js.map +1 -0
  242. package/dist/types/index.d.ts +22 -0
  243. package/dist/types/index.js +39 -0
  244. package/dist/types/index.js.map +1 -0
  245. package/dist/util.d.ts +9 -8
  246. package/dist/util.js +78 -32
  247. package/dist/util.js.map +1 -1
  248. package/dist/validators/ClassValidator.d.ts +0 -4
  249. package/dist/validators/ClassValidator.js +6 -30
  250. package/dist/validators/ClassValidator.js.map +1 -1
  251. package/package.json +2 -1
  252. package/dist/types/CustomType.d.ts +0 -9
  253. package/dist/types/CustomType.js +0 -32
  254. 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)) {
@@ -1528,37 +1605,25 @@ class MethodStatement extends FunctionStatement {
1528
1605
  }
1529
1606
  }
1530
1607
  exports.MethodStatement = MethodStatement;
1531
- /**
1532
- * @deprecated use `MethodStatement`
1533
- */
1534
- class ClassMethodStatement extends MethodStatement {
1535
- }
1536
- exports.ClassMethodStatement = ClassMethodStatement;
1537
- class FieldStatement extends AstNode_1.Statement {
1538
- constructor(accessModifier, name, as, type, equal, initialValue) {
1608
+ class FieldStatement extends AstNode_2.Statement {
1609
+ constructor(accessModifier, name, as, typeExpression, equal, initialValue) {
1539
1610
  super();
1540
1611
  this.accessModifier = accessModifier;
1541
1612
  this.name = name;
1542
1613
  this.as = as;
1543
- this.type = type;
1614
+ this.typeExpression = typeExpression;
1544
1615
  this.equal = equal;
1545
1616
  this.initialValue = initialValue;
1546
- 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);
1547
1619
  }
1548
1620
  /**
1549
1621
  * Derive a ValueKind from the type token, or the initial value.
1550
1622
  * Defaults to `DynamicType`
1551
1623
  */
1552
- getType() {
1553
- if (this.type) {
1554
- return util_1.util.tokenToBscType(this.type);
1555
- }
1556
- else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
1557
- return this.initialValue.type;
1558
- }
1559
- else {
1560
- return new DynamicType_1.DynamicType();
1561
- }
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;
1562
1627
  }
1563
1628
  transpile(state) {
1564
1629
  throw new Error('transpile not implemented for ' + Object.getPrototypeOf(this).constructor.name);
@@ -1570,7 +1635,7 @@ class FieldStatement extends AstNode_1.Statement {
1570
1635
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1571
1636
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1572
1637
  }
1573
- let type = this.getType();
1638
+ let type = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.typetime });
1574
1639
  if ((0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
1575
1640
  type = new DynamicType_1.DynamicType();
1576
1641
  }
@@ -1579,24 +1644,20 @@ class FieldStatement extends AstNode_1.Statement {
1579
1644
  return result;
1580
1645
  }
1581
1646
  walk(visitor, options) {
1582
- 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);
1583
1649
  (0, visitors_1.walk)(this, 'initialValue', visitor, options);
1584
1650
  }
1585
1651
  }
1586
1652
  }
1587
1653
  exports.FieldStatement = FieldStatement;
1588
- /**
1589
- * @deprecated use `FieldStatement`
1590
- */
1591
- class ClassFieldStatement extends FieldStatement {
1592
- }
1593
- exports.ClassFieldStatement = ClassFieldStatement;
1594
- class TryCatchStatement extends AstNode_1.Statement {
1654
+ class TryCatchStatement extends AstNode_2.Statement {
1595
1655
  constructor(tokens, tryBranch, catchStatement) {
1596
1656
  super();
1597
1657
  this.tokens = tokens;
1598
1658
  this.tryBranch = tryBranch;
1599
1659
  this.catchStatement = catchStatement;
1660
+ this.kind = AstNode_1.AstNodeKind.TryCatchStatement;
1600
1661
  this.range = util_1.util.createBoundingRange(tokens.try, tryBranch, catchStatement, tokens.endTry);
1601
1662
  }
1602
1663
  transpile(state) {
@@ -1620,12 +1681,13 @@ class TryCatchStatement extends AstNode_1.Statement {
1620
1681
  }
1621
1682
  }
1622
1683
  exports.TryCatchStatement = TryCatchStatement;
1623
- class CatchStatement extends AstNode_1.Statement {
1684
+ class CatchStatement extends AstNode_2.Statement {
1624
1685
  constructor(tokens, exceptionVariable, catchBranch) {
1625
1686
  super();
1626
1687
  this.tokens = tokens;
1627
1688
  this.exceptionVariable = exceptionVariable;
1628
1689
  this.catchBranch = catchBranch;
1690
+ this.kind = AstNode_1.AstNodeKind.CatchStatement;
1629
1691
  this.range = util_1.util.createBoundingRange(tokens.catch, exceptionVariable, catchBranch);
1630
1692
  }
1631
1693
  transpile(state) {
@@ -1644,11 +1706,12 @@ class CatchStatement extends AstNode_1.Statement {
1644
1706
  }
1645
1707
  }
1646
1708
  exports.CatchStatement = CatchStatement;
1647
- class ThrowStatement extends AstNode_1.Statement {
1709
+ class ThrowStatement extends AstNode_2.Statement {
1648
1710
  constructor(throwToken, expression) {
1649
1711
  super();
1650
1712
  this.throwToken = throwToken;
1651
1713
  this.expression = expression;
1714
+ this.kind = AstNode_1.AstNodeKind.ThrowStatement;
1652
1715
  this.range = util_1.util.createBoundingRange(throwToken, expression);
1653
1716
  }
1654
1717
  transpile(state) {
@@ -1673,25 +1736,19 @@ class ThrowStatement extends AstNode_1.Statement {
1673
1736
  }
1674
1737
  }
1675
1738
  exports.ThrowStatement = ThrowStatement;
1676
- class EnumStatement extends AstNode_1.Statement {
1739
+ class EnumStatement extends AstNode_2.Statement {
1677
1740
  constructor(tokens, body) {
1678
1741
  var _a;
1679
1742
  super();
1680
1743
  this.tokens = tokens;
1681
1744
  this.body = body;
1745
+ this.kind = AstNode_1.AstNodeKind.EnumStatement;
1746
+ this.symbolTable = new SymbolTable_2.SymbolTable('Enum');
1682
1747
  this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1683
1748
  }
1684
1749
  get range() {
1685
1750
  return util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum);
1686
1751
  }
1687
- /**
1688
- * Get the name of the wrapping namespace (if it exists)
1689
- * @deprecated use `.findAncestor(isNamespaceStatement)` instead.
1690
- */
1691
- get namespaceName() {
1692
- var _a;
1693
- return (_a = this.findAncestor(reflection_1.isNamespaceStatement)) === null || _a === void 0 ? void 0 : _a.nameExpression;
1694
- }
1695
1752
  getMembers() {
1696
1753
  const result = [];
1697
1754
  for (const statement of this.body) {
@@ -1795,13 +1852,26 @@ class EnumStatement extends AstNode_1.Statement {
1795
1852
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1796
1853
  }
1797
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
+ }
1798
1864
  }
1799
1865
  exports.EnumStatement = EnumStatement;
1800
- class EnumMemberStatement extends AstNode_1.Statement {
1866
+ class EnumMemberStatement extends AstNode_2.Statement {
1801
1867
  constructor(tokens, value) {
1802
1868
  super();
1803
1869
  this.tokens = tokens;
1804
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);
1805
1875
  }
1806
1876
  /**
1807
1877
  * The name of the member
@@ -1809,9 +1879,6 @@ class EnumMemberStatement extends AstNode_1.Statement {
1809
1879
  get name() {
1810
1880
  return this.tokens.name.text;
1811
1881
  }
1812
- get range() {
1813
- return util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value);
1814
- }
1815
1882
  transpile(state) {
1816
1883
  return [];
1817
1884
  }
@@ -1832,13 +1899,18 @@ class EnumMemberStatement extends AstNode_1.Statement {
1832
1899
  (0, visitors_1.walk)(this, 'value', visitor, options);
1833
1900
  }
1834
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
+ }
1835
1906
  }
1836
1907
  exports.EnumMemberStatement = EnumMemberStatement;
1837
- class ConstStatement extends AstNode_1.Statement {
1908
+ class ConstStatement extends AstNode_2.Statement {
1838
1909
  constructor(tokens, value) {
1839
1910
  super();
1840
1911
  this.tokens = tokens;
1841
1912
  this.value = value;
1913
+ this.kind = AstNode_1.AstNodeKind.ConstStatement;
1842
1914
  this.range = util_1.util.createBoundingRange(this.tokens.const, this.tokens.name, this.tokens.equals, this.value);
1843
1915
  }
1844
1916
  get name() {
@@ -1885,12 +1957,16 @@ class ConstStatement extends AstNode_1.Statement {
1885
1957
  (0, visitors_1.walk)(this, 'value', visitor, options);
1886
1958
  }
1887
1959
  }
1960
+ getType(options) {
1961
+ return this.value.getType(options);
1962
+ }
1888
1963
  }
1889
1964
  exports.ConstStatement = ConstStatement;
1890
- class ContinueStatement extends AstNode_1.Statement {
1965
+ class ContinueStatement extends AstNode_2.Statement {
1891
1966
  constructor(tokens) {
1892
1967
  super();
1893
1968
  this.tokens = tokens;
1969
+ this.kind = AstNode_1.AstNodeKind.ContinueStatement;
1894
1970
  this.range = util_1.util.createBoundingRange(tokens.continue, tokens.loopType);
1895
1971
  }
1896
1972
  transpile(state) {