brighterscript 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (381) hide show
  1. package/CHANGELOG.md +542 -253
  2. package/README.md +30 -9
  3. package/bsconfig.schema.json +13 -1
  4. package/dist/BsConfig.d.ts +4 -0
  5. package/dist/Cache.d.ts +3 -8
  6. package/dist/Cache.js +9 -14
  7. package/dist/Cache.js.map +1 -1
  8. package/dist/CodeActionUtil.d.ts +11 -2
  9. package/dist/CodeActionUtil.js +17 -3
  10. package/dist/CodeActionUtil.js.map +1 -1
  11. package/dist/CommentFlagProcessor.d.ts +4 -4
  12. package/dist/CommentFlagProcessor.js +5 -3
  13. package/dist/CommentFlagProcessor.js.map +1 -1
  14. package/dist/DependencyGraph.js +5 -4
  15. package/dist/DependencyGraph.js.map +1 -1
  16. package/dist/DiagnosticFilterer.js +1 -1
  17. package/dist/DiagnosticFilterer.js.map +1 -1
  18. package/dist/DiagnosticMessages.d.ts +59 -4
  19. package/dist/DiagnosticMessages.js +65 -7
  20. package/dist/DiagnosticMessages.js.map +1 -1
  21. package/dist/LanguageServer.d.ts +4 -14
  22. package/dist/LanguageServer.js +40 -26
  23. package/dist/LanguageServer.js.map +1 -1
  24. package/dist/Logger.d.ts +2 -0
  25. package/dist/Logger.js +10 -8
  26. package/dist/Logger.js.map +1 -1
  27. package/dist/PluginInterface.d.ts +7 -3
  28. package/dist/PluginInterface.js +9 -0
  29. package/dist/PluginInterface.js.map +1 -1
  30. package/dist/Program.d.ts +43 -25
  31. package/dist/Program.js +180 -82
  32. package/dist/Program.js.map +1 -1
  33. package/dist/ProgramBuilder.d.ts +4 -0
  34. package/dist/ProgramBuilder.js +30 -14
  35. package/dist/ProgramBuilder.js.map +1 -1
  36. package/dist/Scope.d.ts +100 -28
  37. package/dist/Scope.js +382 -154
  38. package/dist/Scope.js.map +1 -1
  39. package/dist/SemanticTokenUtils.d.ts +14 -0
  40. package/dist/SemanticTokenUtils.js +81 -0
  41. package/dist/SemanticTokenUtils.js.map +1 -0
  42. package/dist/SymbolTable.d.ts +10 -4
  43. package/dist/SymbolTable.js +40 -13
  44. package/dist/SymbolTable.js.map +1 -1
  45. package/dist/XmlScope.d.ts +8 -3
  46. package/dist/XmlScope.js +65 -27
  47. package/dist/XmlScope.js.map +1 -1
  48. package/dist/astUtils/AstEditor.d.ts +33 -0
  49. package/dist/astUtils/AstEditor.js +107 -0
  50. package/dist/astUtils/AstEditor.js.map +1 -0
  51. package/dist/{types/FunctionType.spec.d.ts → astUtils/AstEditor.spec.d.ts} +0 -0
  52. package/dist/astUtils/AstEditor.spec.js +170 -0
  53. package/dist/astUtils/AstEditor.spec.js.map +1 -0
  54. package/dist/astUtils/creators.d.ts +24 -6
  55. package/dist/astUtils/creators.js +130 -19
  56. package/dist/astUtils/creators.js.map +1 -1
  57. package/dist/astUtils/creators.spec.js +14 -4
  58. package/dist/astUtils/creators.spec.js.map +1 -1
  59. package/dist/astUtils/reflection.d.ts +27 -8
  60. package/dist/astUtils/reflection.js +66 -1
  61. package/dist/astUtils/reflection.js.map +1 -1
  62. package/dist/astUtils/reflection.spec.js +130 -119
  63. package/dist/astUtils/reflection.spec.js.map +1 -1
  64. package/dist/astUtils/stackedVisitor.js.map +1 -1
  65. package/dist/astUtils/stackedVisitor.spec.js +13 -13
  66. package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
  67. package/dist/astUtils/visitors.d.ts +17 -2
  68. package/dist/astUtils/visitors.js +2 -2
  69. package/dist/astUtils/visitors.js.map +1 -1
  70. package/dist/astUtils/visitors.spec.js +31 -29
  71. package/dist/astUtils/visitors.spec.js.map +1 -1
  72. package/dist/astUtils/xml.d.ts +4 -3
  73. package/dist/astUtils/xml.js +8 -3
  74. package/dist/astUtils/xml.js.map +1 -1
  75. package/dist/bscPlugin/BscPlugin.d.ts +7 -1
  76. package/dist/bscPlugin/BscPlugin.js +28 -0
  77. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  78. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +4 -4
  79. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  80. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +26 -26
  81. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  82. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
  83. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -0
  84. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  85. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
  86. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +73 -0
  87. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  88. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
  89. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +52 -0
  90. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
  91. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts +1 -0
  92. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
  93. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -0
  94. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
  95. package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
  96. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  97. package/dist/bscPlugin/validation/ScopeValidator.d.ts +29 -0
  98. package/dist/bscPlugin/validation/ScopeValidator.js +183 -0
  99. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  100. package/dist/cli.js +9 -3
  101. package/dist/cli.js.map +1 -1
  102. package/dist/diagnosticUtils.d.ts +1 -0
  103. package/dist/diagnosticUtils.js +15 -8
  104. package/dist/diagnosticUtils.js.map +1 -1
  105. package/dist/examples/plugins/removePrint.js +12 -14
  106. package/dist/examples/plugins/removePrint.js.map +1 -1
  107. package/dist/files/BrsFile.Class.spec.js +634 -145
  108. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  109. package/dist/files/BrsFile.d.ts +62 -30
  110. package/dist/files/BrsFile.js +683 -335
  111. package/dist/files/BrsFile.js.map +1 -1
  112. package/dist/files/BrsFile.spec.js +1055 -449
  113. package/dist/files/BrsFile.spec.js.map +1 -1
  114. package/dist/files/XmlFile.d.ts +11 -10
  115. package/dist/files/XmlFile.js +33 -26
  116. package/dist/files/XmlFile.js.map +1 -1
  117. package/dist/files/XmlFile.spec.js +302 -237
  118. package/dist/files/XmlFile.spec.js.map +1 -1
  119. package/dist/files/tests/imports.spec.js +44 -42
  120. package/dist/files/tests/imports.spec.js.map +1 -1
  121. package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
  122. package/dist/files/tests/optionalChaning.spec.js +88 -0
  123. package/dist/files/tests/optionalChaning.spec.js.map +1 -0
  124. package/dist/globalCallables.d.ts +3 -1
  125. package/dist/globalCallables.js +424 -152
  126. package/dist/globalCallables.js.map +1 -1
  127. package/dist/index.d.ts +13 -3
  128. package/dist/index.js +23 -4
  129. package/dist/index.js.map +1 -1
  130. package/dist/interfaces.d.ts +129 -16
  131. package/dist/lexer/Lexer.d.ts +19 -1
  132. package/dist/lexer/Lexer.js +127 -21
  133. package/dist/lexer/Lexer.js.map +1 -1
  134. package/dist/lexer/Lexer.spec.js +657 -536
  135. package/dist/lexer/Lexer.spec.js.map +1 -1
  136. package/dist/lexer/Token.d.ts +2 -2
  137. package/dist/lexer/TokenKind.d.ts +13 -1
  138. package/dist/lexer/TokenKind.js +60 -3
  139. package/dist/lexer/TokenKind.js.map +1 -1
  140. package/dist/parser/BrsTranspileState.d.ts +7 -0
  141. package/dist/parser/BrsTranspileState.js +9 -0
  142. package/dist/parser/BrsTranspileState.js.map +1 -1
  143. package/dist/parser/Expression.d.ts +150 -34
  144. package/dist/parser/Expression.js +337 -150
  145. package/dist/parser/Expression.js.map +1 -1
  146. package/dist/parser/Parser.Class.spec.js +189 -89
  147. package/dist/parser/Parser.Class.spec.js.map +1 -1
  148. package/dist/parser/Parser.d.ts +152 -29
  149. package/dist/parser/Parser.js +1095 -501
  150. package/dist/parser/Parser.js.map +1 -1
  151. package/dist/parser/Parser.spec.js +687 -266
  152. package/dist/parser/Parser.spec.js.map +1 -1
  153. package/dist/parser/SGParser.d.ts +41 -4
  154. package/dist/parser/SGParser.js +186 -175
  155. package/dist/parser/SGParser.js.map +1 -1
  156. package/dist/parser/SGParser.spec.js +35 -22
  157. package/dist/parser/SGParser.spec.js.map +1 -1
  158. package/dist/parser/SGTypes.d.ts +206 -38
  159. package/dist/parser/SGTypes.js +470 -161
  160. package/dist/parser/SGTypes.js.map +1 -1
  161. package/dist/parser/SGTypes.spec.d.ts +1 -0
  162. package/dist/parser/SGTypes.spec.js +351 -0
  163. package/dist/parser/SGTypes.spec.js.map +1 -0
  164. package/dist/parser/Statement.d.ts +194 -40
  165. package/dist/parser/Statement.js +597 -160
  166. package/dist/parser/Statement.js.map +1 -1
  167. package/dist/parser/Statement.spec.js +11 -11
  168. package/dist/parser/Statement.spec.js.map +1 -1
  169. package/dist/parser/TranspileState.d.ts +1 -1
  170. package/dist/parser/TranspileState.js +15 -7
  171. package/dist/parser/TranspileState.js.map +1 -1
  172. package/dist/parser/tests/Parser.spec.d.ts +10 -9
  173. package/dist/parser/tests/Parser.spec.js +15 -11
  174. package/dist/parser/tests/Parser.spec.js.map +1 -1
  175. package/dist/parser/tests/controlFlow/For.spec.js +60 -60
  176. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  177. package/dist/parser/tests/controlFlow/ForEach.spec.js +40 -39
  178. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  179. package/dist/parser/tests/controlFlow/If.spec.js +213 -194
  180. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  181. package/dist/parser/tests/controlFlow/While.spec.js +37 -37
  182. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  183. package/dist/parser/tests/expression/Additive.spec.js +30 -30
  184. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  185. package/dist/parser/tests/expression/ArrayLiterals.spec.js +119 -119
  186. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  187. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +162 -138
  188. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  189. package/dist/parser/tests/expression/Boolean.spec.js +24 -24
  190. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  191. package/dist/parser/tests/expression/Call.spec.js +41 -40
  192. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  193. package/dist/parser/tests/expression/Exponential.spec.js +17 -17
  194. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  195. package/dist/parser/tests/expression/Function.spec.js +256 -256
  196. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  197. package/dist/parser/tests/expression/Indexing.spec.js +87 -87
  198. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  199. package/dist/parser/tests/expression/Multiplicative.spec.js +37 -37
  200. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  201. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +75 -63
  202. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  203. package/dist/parser/tests/expression/PrefixUnary.spec.js +41 -41
  204. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  205. package/dist/parser/tests/expression/Primary.spec.js +41 -41
  206. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  207. package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
  208. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
  209. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
  210. package/dist/parser/tests/expression/Relational.spec.js +43 -43
  211. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  212. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +9 -9
  213. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  214. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +28 -28
  215. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  216. package/dist/parser/tests/expression/TernaryExpression.spec.js +102 -102
  217. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  218. package/dist/parser/tests/statement/AssignmentOperators.spec.js +36 -36
  219. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  220. package/dist/parser/tests/statement/Declaration.spec.js +44 -44
  221. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  222. package/dist/parser/tests/statement/Dim.spec.js +21 -21
  223. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  224. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  225. package/dist/parser/tests/statement/Enum.spec.js +840 -0
  226. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  227. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  228. package/dist/parser/tests/statement/For.spec.js +46 -0
  229. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  230. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  231. package/dist/parser/tests/statement/ForEach.spec.js +37 -0
  232. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  233. package/dist/parser/tests/statement/Function.spec.js +198 -197
  234. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  235. package/dist/parser/tests/statement/Goto.spec.js +15 -14
  236. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  237. package/dist/parser/tests/statement/Increment.spec.js +50 -50
  238. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  239. package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
  240. package/dist/parser/tests/statement/InterfaceStatement.spec.js +254 -0
  241. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
  242. package/dist/parser/tests/statement/LibraryStatement.spec.js +17 -17
  243. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  244. package/dist/parser/tests/statement/Misc.spec.js +108 -106
  245. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  246. package/dist/parser/tests/statement/PrintStatement.spec.js +40 -40
  247. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  248. package/dist/parser/tests/statement/ReturnStatement.spec.js +46 -46
  249. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  250. package/dist/parser/tests/statement/Set.spec.js +83 -83
  251. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  252. package/dist/parser/tests/statement/Stop.spec.js +12 -11
  253. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  254. package/dist/parser/tests/statement/Throw.spec.js +5 -5
  255. package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
  256. package/dist/parser/tests/statement/TryCatch.spec.js +15 -13
  257. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  258. package/dist/preprocessor/Chunk.d.ts +1 -1
  259. package/dist/preprocessor/Chunk.js.map +1 -1
  260. package/dist/preprocessor/Manifest.d.ts +5 -5
  261. package/dist/preprocessor/Manifest.js +14 -35
  262. package/dist/preprocessor/Manifest.js.map +1 -1
  263. package/dist/preprocessor/Manifest.spec.d.ts +1 -0
  264. package/dist/preprocessor/Manifest.spec.js +78 -103
  265. package/dist/preprocessor/Manifest.spec.js.map +1 -1
  266. package/dist/preprocessor/Preprocessor.d.ts +1 -1
  267. package/dist/preprocessor/Preprocessor.js +8 -8
  268. package/dist/preprocessor/Preprocessor.js.map +1 -1
  269. package/dist/preprocessor/Preprocessor.spec.js +49 -49
  270. package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
  271. package/dist/preprocessor/PreprocessorParser.spec.js +72 -72
  272. package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
  273. package/dist/roku-types/data.json +21891 -0
  274. package/dist/roku-types/index.d.ts +6776 -0
  275. package/dist/roku-types/index.js +11 -0
  276. package/dist/roku-types/index.js.map +1 -0
  277. package/dist/types/ArrayType.d.ts +8 -5
  278. package/dist/types/ArrayType.js +52 -12
  279. package/dist/types/ArrayType.js.map +1 -1
  280. package/dist/types/ArrayType.spec.js +72 -11
  281. package/dist/types/ArrayType.spec.js.map +1 -1
  282. package/dist/types/BooleanType.d.ts +4 -2
  283. package/dist/types/BooleanType.js +9 -4
  284. package/dist/types/BooleanType.js.map +1 -1
  285. package/dist/types/BooleanType.spec.js +5 -3
  286. package/dist/types/BooleanType.spec.js.map +1 -1
  287. package/dist/types/BscType.d.ts +20 -5
  288. package/dist/types/BscType.js +24 -0
  289. package/dist/types/BscType.js.map +1 -1
  290. package/dist/types/CustomType.d.ts +8 -6
  291. package/dist/types/CustomType.js +20 -11
  292. package/dist/types/CustomType.js.map +1 -1
  293. package/dist/types/DoubleType.d.ts +2 -0
  294. package/dist/types/DoubleType.js +14 -9
  295. package/dist/types/DoubleType.js.map +1 -1
  296. package/dist/types/DoubleType.spec.js +5 -3
  297. package/dist/types/DoubleType.spec.js.map +1 -1
  298. package/dist/types/DynamicType.d.ts +2 -0
  299. package/dist/types/DynamicType.js +6 -2
  300. package/dist/types/DynamicType.js.map +1 -1
  301. package/dist/types/DynamicType.spec.js +2 -2
  302. package/dist/types/DynamicType.spec.js.map +1 -1
  303. package/dist/types/FloatType.d.ts +2 -0
  304. package/dist/types/FloatType.js +14 -9
  305. package/dist/types/FloatType.js.map +1 -1
  306. package/dist/types/FloatType.spec.js +4 -2
  307. package/dist/types/FloatType.spec.js.map +1 -1
  308. package/dist/types/FunctionType.d.ts +7 -31
  309. package/dist/types/FunctionType.js +11 -57
  310. package/dist/types/FunctionType.js.map +1 -1
  311. package/dist/types/IntegerType.d.ts +2 -0
  312. package/dist/types/IntegerType.js +14 -9
  313. package/dist/types/IntegerType.js.map +1 -1
  314. package/dist/types/IntegerType.spec.js +5 -3
  315. package/dist/types/IntegerType.spec.js.map +1 -1
  316. package/dist/types/InterfaceType.d.ts +13 -4
  317. package/dist/types/InterfaceType.js +48 -8
  318. package/dist/types/InterfaceType.js.map +1 -1
  319. package/dist/types/InterfaceType.spec.d.ts +1 -0
  320. package/dist/types/InterfaceType.spec.js +194 -0
  321. package/dist/types/InterfaceType.spec.js.map +1 -0
  322. package/dist/types/InvalidType.d.ts +4 -2
  323. package/dist/types/InvalidType.js +10 -5
  324. package/dist/types/InvalidType.js.map +1 -1
  325. package/dist/types/InvalidType.spec.js +4 -2
  326. package/dist/types/InvalidType.spec.js.map +1 -1
  327. package/dist/types/LazyType.d.ts +8 -7
  328. package/dist/types/LazyType.js +22 -10
  329. package/dist/types/LazyType.js.map +1 -1
  330. package/dist/types/LongIntegerType.d.ts +2 -0
  331. package/dist/types/LongIntegerType.js +14 -9
  332. package/dist/types/LongIntegerType.js.map +1 -1
  333. package/dist/types/LongIntegerType.spec.js +4 -2
  334. package/dist/types/LongIntegerType.spec.js.map +1 -1
  335. package/dist/types/ObjectType.d.ts +8 -4
  336. package/dist/types/ObjectType.js +9 -4
  337. package/dist/types/ObjectType.js.map +1 -1
  338. package/dist/types/ObjectType.spec.js +2 -2
  339. package/dist/types/ObjectType.spec.js.map +1 -1
  340. package/dist/types/StringType.d.ts +4 -2
  341. package/dist/types/StringType.js +9 -4
  342. package/dist/types/StringType.js.map +1 -1
  343. package/dist/types/StringType.spec.js +4 -2
  344. package/dist/types/StringType.spec.js.map +1 -1
  345. package/dist/types/TypedFunctionType.d.ts +28 -0
  346. package/dist/types/TypedFunctionType.js +88 -0
  347. package/dist/types/TypedFunctionType.js.map +1 -0
  348. package/dist/types/TypedFunctionType.spec.d.ts +1 -0
  349. package/dist/types/TypedFunctionType.spec.js +37 -0
  350. package/dist/types/TypedFunctionType.spec.js.map +1 -0
  351. package/dist/types/UninitializedType.js +3 -3
  352. package/dist/types/UninitializedType.js.map +1 -1
  353. package/dist/types/VoidType.d.ts +4 -2
  354. package/dist/types/VoidType.js +8 -4
  355. package/dist/types/VoidType.js.map +1 -1
  356. package/dist/types/VoidType.spec.js +2 -2
  357. package/dist/types/VoidType.spec.js.map +1 -1
  358. package/dist/types/helpers.d.ts +42 -0
  359. package/dist/types/helpers.js +118 -0
  360. package/dist/types/helpers.js.map +1 -0
  361. package/dist/util.d.ts +87 -16
  362. package/dist/util.js +339 -94
  363. package/dist/util.js.map +1 -1
  364. package/dist/validators/ClassValidator.d.ts +19 -2
  365. package/dist/validators/ClassValidator.js +163 -102
  366. package/dist/validators/ClassValidator.js.map +1 -1
  367. package/package.json +26 -15
  368. package/dist/astUtils/index.d.ts +0 -7
  369. package/dist/astUtils/index.js +0 -26
  370. package/dist/astUtils/index.js.map +0 -1
  371. package/dist/lexer/index.d.ts +0 -3
  372. package/dist/lexer/index.js +0 -17
  373. package/dist/lexer/index.js.map +0 -1
  374. package/dist/parser/index.d.ts +0 -3
  375. package/dist/parser/index.js +0 -16
  376. package/dist/parser/index.js.map +0 -1
  377. package/dist/preprocessor/index.d.ts +0 -3
  378. package/dist/preprocessor/index.js +0 -16
  379. package/dist/preprocessor/index.js.map +0 -1
  380. package/dist/types/FunctionType.spec.js +0 -23
  381. package/dist/types/FunctionType.spec.js.map +0 -1
@@ -1,16 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ThrowStatement = exports.TryCatchStatement = exports.ClassFieldStatement = exports.ClassMethodStatement = exports.ClassStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = exports.Statement = void 0;
4
- const lexer_1 = require("../lexer");
3
+ exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.ClassFieldStatement = exports.ClassMethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = exports.Statement = void 0;
4
+ const TokenKind_1 = require("../lexer/TokenKind");
5
5
  const Expression_1 = require("./Expression");
6
6
  const util_1 = require("../util");
7
- const vscode_languageserver_1 = require("vscode-languageserver");
8
7
  const Parser_1 = require("./Parser");
9
8
  const visitors_1 = require("../astUtils/visitors");
10
9
  const reflection_1 = require("../astUtils/reflection");
11
10
  const creators_1 = require("../astUtils/creators");
12
11
  const DynamicType_1 = require("../types/DynamicType");
13
12
  const SymbolTable_1 = require("../SymbolTable");
13
+ const CustomType_1 = require("../types/CustomType");
14
+ const InterfaceType_1 = require("../types/InterfaceType");
14
15
  /**
15
16
  * A BrightScript statement
16
17
  */
@@ -45,12 +46,10 @@ exports.EmptyStatement = EmptyStatement;
45
46
  */
46
47
  class Body extends Statement {
47
48
  constructor(statements = []) {
49
+ var _a;
48
50
  super();
49
51
  this.statements = statements;
50
- }
51
- get range() {
52
- var _a, _b, _c, _d;
53
- return util_1.util.createRangeFromPositions((_b = (_a = this.statements[0]) === null || _a === void 0 ? void 0 : _a.range.start) !== null && _b !== void 0 ? _b : vscode_languageserver_1.Position.create(0, 0), (_d = (_c = this.statements[this.statements.length - 1]) === null || _c === void 0 ? void 0 : _c.range.end) !== null && _d !== void 0 ? _d : vscode_languageserver_1.Position.create(0, 0));
52
+ this.range = (_a = util_1.util.createBoundingRange(...this.statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
54
53
  }
55
54
  transpile(state) {
56
55
  let result = [];
@@ -62,15 +61,15 @@ class Body extends Statement {
62
61
  //this is the first statement. do nothing related to spacing and newlines
63
62
  //if comment is on same line as prior sibling
64
63
  }
65
- else if (reflection_1.isCommentStatement(statement) && previousStatement && statement.range.start.line === previousStatement.range.end.line) {
64
+ else if ((0, reflection_1.isCommentStatement)(statement) && previousStatement && statement.range.start.line === previousStatement.range.end.line) {
66
65
  result.push(' ');
67
66
  //add double newline if this is a comment, and next is a function
68
67
  }
69
- else if (reflection_1.isCommentStatement(statement) && nextStatement && reflection_1.isFunctionStatement(nextStatement)) {
68
+ else if ((0, reflection_1.isCommentStatement)(statement) && nextStatement && (0, reflection_1.isFunctionStatement)(nextStatement)) {
70
69
  result.push('\n\n');
71
70
  //add double newline if is function not preceeded by a comment
72
71
  }
73
- else if (reflection_1.isFunctionStatement(statement) && previousStatement && !(reflection_1.isCommentStatement(previousStatement))) {
72
+ else if ((0, reflection_1.isFunctionStatement)(statement) && previousStatement && !((0, reflection_1.isCommentStatement)(previousStatement))) {
74
73
  result.push('\n\n');
75
74
  }
76
75
  else {
@@ -85,7 +84,7 @@ class Body extends Statement {
85
84
  let result = [];
86
85
  for (const statement of this.statements) {
87
86
  //if the current statement supports generating typedef, call it
88
- if ('getTypedef' in statement) {
87
+ if ((0, reflection_1.isTypedefProvider)(statement)) {
89
88
  result.push(state.indent(), ...statement.getTypedef(state), state.newline);
90
89
  }
91
90
  }
@@ -94,7 +93,7 @@ class Body extends Statement {
94
93
  walk(visitor, options) {
95
94
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
96
95
  for (let i = 0; i < this.statements.length; i++) {
97
- visitors_1.walk(this.statements, i, visitor, options, this);
96
+ (0, visitors_1.walk)(this.statements, i, visitor, options, this);
98
97
  }
99
98
  }
100
99
  }
@@ -102,17 +101,18 @@ class Body extends Statement {
102
101
  exports.Body = Body;
103
102
  class AssignmentStatement extends Statement {
104
103
  constructor(name, equals, value, containingFunction) {
104
+ var _a;
105
105
  super();
106
106
  this.name = name;
107
107
  this.equals = equals;
108
108
  this.value = value;
109
109
  this.containingFunction = containingFunction;
110
- this.range = util_1.util.createRangeFromPositions(this.name.range.start, this.value.range.end);
110
+ this.range = (_a = util_1.util.createBoundingRange(this.name, this.equals, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
111
111
  }
112
112
  transpile(state) {
113
113
  var _a, _b;
114
114
  //if the value is a compound assignment, just transpile the expression itself
115
- if (lexer_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
115
+ if (TokenKind_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
116
116
  return this.value.transpile(state);
117
117
  }
118
118
  else {
@@ -127,19 +127,18 @@ class AssignmentStatement extends Statement {
127
127
  }
128
128
  walk(visitor, options) {
129
129
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
130
- visitors_1.walk(this, 'value', visitor, options);
130
+ (0, visitors_1.walk)(this, 'value', visitor, options);
131
131
  }
132
132
  }
133
133
  }
134
134
  exports.AssignmentStatement = AssignmentStatement;
135
135
  class Block extends Statement {
136
136
  constructor(statements, startingRange) {
137
+ var _a;
137
138
  super();
138
139
  this.statements = statements;
139
140
  this.startingRange = startingRange;
140
- this.range = util_1.util.createRangeFromPositions(this.startingRange.start, this.statements.length
141
- ? this.statements[this.statements.length - 1].range.end
142
- : this.startingRange.start);
141
+ this.range = (_a = util_1.util.createBoundingRange({ range: this.startingRange }, ...statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
143
142
  }
144
143
  transpile(state) {
145
144
  state.blockDepth++;
@@ -148,7 +147,7 @@ class Block extends Statement {
148
147
  let previousStatement = this.statements[i - 1];
149
148
  let statement = this.statements[i];
150
149
  //if comment is on same line as parent
151
- if (reflection_1.isCommentStatement(statement) &&
150
+ if ((0, reflection_1.isCommentStatement)(statement) &&
152
151
  (util_1.util.linesTouch(state.lineage[0], statement) || util_1.util.linesTouch(previousStatement, statement))) {
153
152
  results.push(' ');
154
153
  //is not a comment
@@ -168,7 +167,7 @@ class Block extends Statement {
168
167
  walk(visitor, options) {
169
168
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
170
169
  for (let i = 0; i < this.statements.length; i++) {
171
- visitors_1.walk(this.statements, i, visitor, options, this);
170
+ (0, visitors_1.walk)(this.statements, i, visitor, options, this);
172
171
  }
173
172
  }
174
173
  }
@@ -176,16 +175,17 @@ class Block extends Statement {
176
175
  exports.Block = Block;
177
176
  class ExpressionStatement extends Statement {
178
177
  constructor(expression) {
178
+ var _a, _b;
179
179
  super();
180
180
  this.expression = expression;
181
- this.range = this.expression.range;
181
+ this.range = (_b = (_a = this.expression) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
182
182
  }
183
183
  transpile(state) {
184
184
  return this.expression.transpile(state);
185
185
  }
186
186
  walk(visitor, options) {
187
187
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
188
- visitors_1.walk(this, 'expression', visitor, options);
188
+ (0, visitors_1.walk)(this, 'expression', visitor, options);
189
189
  }
190
190
  }
191
191
  }
@@ -195,10 +195,8 @@ class CommentStatement extends Statement {
195
195
  var _a;
196
196
  super();
197
197
  this.comments = comments;
198
+ this.range = (_a = util_1.util.createBoundingRange(...this.comments)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
198
199
  this.visitMode = visitors_1.InternalWalkMode.visitStatements | visitors_1.InternalWalkMode.visitExpressions;
199
- if (((_a = this.comments) === null || _a === void 0 ? void 0 : _a.length) > 0) {
200
- this.range = util_1.util.createRangeFromPositions(this.comments[0].range.start, this.comments[this.comments.length - 1].range.end);
201
- }
202
200
  }
203
201
  get text() {
204
202
  return this.comments.map(x => x.text).join('\n');
@@ -228,9 +226,10 @@ class CommentStatement extends Statement {
228
226
  exports.CommentStatement = CommentStatement;
229
227
  class ExitForStatement extends Statement {
230
228
  constructor(tokens) {
229
+ var _a, _b, _c;
231
230
  super();
232
231
  this.tokens = tokens;
233
- this.range = this.tokens.exitFor.range;
232
+ this.range = (_c = (_b = (_a = this.tokens) === null || _a === void 0 ? void 0 : _a.exitFor) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : creators_1.interpolatedRange;
234
233
  }
235
234
  transpile(state) {
236
235
  return [
@@ -244,9 +243,10 @@ class ExitForStatement extends Statement {
244
243
  exports.ExitForStatement = ExitForStatement;
245
244
  class ExitWhileStatement extends Statement {
246
245
  constructor(tokens) {
246
+ var _a, _b, _c;
247
247
  super();
248
248
  this.tokens = tokens;
249
- this.range = this.tokens.exitWhile.range;
249
+ this.range = (_c = (_b = (_a = this.tokens) === null || _a === void 0 ? void 0 : _a.exitWhile) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : creators_1.interpolatedRange;
250
250
  }
251
251
  transpile(state) {
252
252
  return [
@@ -264,7 +264,16 @@ class FunctionStatement extends Statement {
264
264
  this.name = name;
265
265
  this.func = func;
266
266
  this.namespaceName = namespaceName;
267
- this.range = this.func.range;
267
+ }
268
+ get range() {
269
+ return this.cacheRange();
270
+ }
271
+ cacheRange() {
272
+ var _a, _b;
273
+ if (!this._range) {
274
+ this._range = (_b = (_a = this.func) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : this.name.range;
275
+ }
276
+ return this._range;
268
277
  }
269
278
  /**
270
279
  * Get the name of this expression based on the parse mode
@@ -295,21 +304,21 @@ class FunctionStatement extends Statement {
295
304
  }
296
305
  walk(visitor, options) {
297
306
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
298
- visitors_1.walk(this, 'func', visitor, options);
307
+ (0, visitors_1.walk)(this, 'func', visitor, options);
299
308
  }
300
309
  }
301
310
  }
302
311
  exports.FunctionStatement = FunctionStatement;
303
312
  class IfStatement extends Statement {
304
313
  constructor(tokens, condition, thenBranch, elseBranch, isInline) {
305
- var _a, _b;
314
+ var _a;
306
315
  super();
307
316
  this.tokens = tokens;
308
317
  this.condition = condition;
309
318
  this.thenBranch = thenBranch;
310
319
  this.elseBranch = elseBranch;
311
320
  this.isInline = isInline;
312
- this.range = util_1.util.createRangeFromPositions(this.tokens.if.range.start, ((_b = (_a = this.tokens.endIf) !== null && _a !== void 0 ? _a : this.elseBranch) !== null && _b !== void 0 ? _b : this.thenBranch).range.end);
321
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.if, this.condition, this.tokens.then, this.thenBranch, this.tokens.else, this.elseBranch, this.tokens.endIf)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
313
322
  }
314
323
  transpile(state) {
315
324
  let results = [];
@@ -318,14 +327,11 @@ class IfStatement extends Statement {
318
327
  results.push(' ');
319
328
  //conditions
320
329
  results.push(...this.condition.transpile(state));
321
- results.push(' ');
322
330
  //then
323
331
  if (this.tokens.then) {
332
+ results.push(' ');
324
333
  results.push(state.transpileToken(this.tokens.then));
325
334
  }
326
- else {
327
- results.push('then');
328
- }
329
335
  state.lineage.unshift(this);
330
336
  //if statement body
331
337
  let thenNodes = this.thenBranch.transpile(state);
@@ -340,13 +346,14 @@ class IfStatement extends Statement {
340
346
  results.push(state.indent(), state.transpileToken(this.tokens.else));
341
347
  }
342
348
  if (this.elseBranch) {
343
- if (reflection_1.isIfStatement(this.elseBranch)) {
349
+ if ((0, reflection_1.isIfStatement)(this.elseBranch)) {
344
350
  //chained elseif
345
351
  state.lineage.unshift(this.elseBranch);
346
352
  let body = this.elseBranch.transpile(state);
347
353
  state.lineage.shift();
348
354
  if (body.length > 0) {
349
- results.push(' ');
355
+ //zero or more spaces between the `else` and the `if`
356
+ results.push(this.elseBranch.tokens.if.leadingWhitespace);
350
357
  results.push(...body);
351
358
  // stop here because chained if will transpile the rest
352
359
  return results;
@@ -378,23 +385,24 @@ class IfStatement extends Statement {
378
385
  }
379
386
  walk(visitor, options) {
380
387
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
381
- visitors_1.walk(this, 'condition', visitor, options);
388
+ (0, visitors_1.walk)(this, 'condition', visitor, options);
382
389
  }
383
390
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
384
- visitors_1.walk(this, 'thenBranch', visitor, options);
391
+ (0, visitors_1.walk)(this, 'thenBranch', visitor, options);
385
392
  }
386
393
  if (this.elseBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
387
- visitors_1.walk(this, 'elseBranch', visitor, options);
394
+ (0, visitors_1.walk)(this, 'elseBranch', visitor, options);
388
395
  }
389
396
  }
390
397
  }
391
398
  exports.IfStatement = IfStatement;
392
399
  class IncrementStatement extends Statement {
393
400
  constructor(value, operator) {
401
+ var _a;
394
402
  super();
395
403
  this.value = value;
396
404
  this.operator = operator;
397
- this.range = util_1.util.createRangeFromPositions(this.value.range.start, this.operator.range.end);
405
+ this.range = (_a = util_1.util.createBoundingRange(this.value, this.operator)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
398
406
  }
399
407
  transpile(state) {
400
408
  return [
@@ -404,7 +412,7 @@ class IncrementStatement extends Statement {
404
412
  }
405
413
  walk(visitor, options) {
406
414
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
407
- visitors_1.walk(this, 'value', visitor, options);
415
+ (0, visitors_1.walk)(this, 'value', visitor, options);
408
416
  }
409
417
  }
410
418
  }
@@ -419,12 +427,11 @@ class PrintStatement extends Statement {
419
427
  * evaluated and printed.
420
428
  */
421
429
  constructor(tokens, expressions) {
430
+ var _a;
422
431
  super();
423
432
  this.tokens = tokens;
424
433
  this.expressions = expressions;
425
- this.range = util_1.util.createRangeFromPositions(this.tokens.print.range.start, this.expressions.length
426
- ? this.expressions[this.expressions.length - 1].range.end
427
- : this.tokens.print.range.end);
434
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.print, ...this.expressions)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
428
435
  }
429
436
  transpile(state) {
430
437
  var _a;
@@ -451,8 +458,8 @@ class PrintStatement extends Statement {
451
458
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
452
459
  for (let i = 0; i < this.expressions.length; i++) {
453
460
  //sometimes we have semicolon `Token`s in the expressions list (should probably fix that...), so only emit the actual expressions
454
- if (reflection_1.isExpression(this.expressions[i])) {
455
- visitors_1.walk(this.expressions, i, visitor, options, this);
461
+ if ((0, reflection_1.isExpression)(this.expressions[i])) {
462
+ (0, visitors_1.walk)(this.expressions, i, visitor, options, this);
456
463
  }
457
464
  }
458
465
  }
@@ -461,14 +468,14 @@ class PrintStatement extends Statement {
461
468
  exports.PrintStatement = PrintStatement;
462
469
  class DimStatement extends Statement {
463
470
  constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
464
- var _a, _b, _c, _d;
471
+ var _a;
465
472
  super();
466
473
  this.dimToken = dimToken;
467
474
  this.identifier = identifier;
468
475
  this.openingSquare = openingSquare;
469
476
  this.dimensions = dimensions;
470
477
  this.closingSquare = closingSquare;
471
- this.range = util_1.util.createRangeFromPositions(this.dimToken.range.start, ((_d = (_c = (_b = (_a = this.closingSquare) !== null && _a !== void 0 ? _a : this.dimensions[this.dimensions.length - 1]) !== null && _b !== void 0 ? _b : this.openingSquare) !== null && _c !== void 0 ? _c : this.identifier) !== null && _d !== void 0 ? _d : this.dimToken).range.end);
478
+ this.range = (_a = util_1.util.createBoundingRange(this.dimToken, this.identifier, this.openingSquare, ...this.dimensions, this.closingSquare)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
472
479
  }
473
480
  transpile(state) {
474
481
  let result = [
@@ -490,7 +497,7 @@ class DimStatement extends Statement {
490
497
  var _a;
491
498
  if (((_a = this.dimensions) === null || _a === void 0 ? void 0 : _a.length) > 0 && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
492
499
  for (let i = 0; i < this.dimensions.length; i++) {
493
- visitors_1.walk(this.dimensions, i, visitor, options, this);
500
+ (0, visitors_1.walk)(this.dimensions, i, visitor, options, this);
494
501
  }
495
502
  }
496
503
  }
@@ -498,9 +505,10 @@ class DimStatement extends Statement {
498
505
  exports.DimStatement = DimStatement;
499
506
  class GotoStatement extends Statement {
500
507
  constructor(tokens) {
508
+ var _a;
501
509
  super();
502
510
  this.tokens = tokens;
503
- this.range = util_1.util.createRangeFromPositions(this.tokens.goto.range.start, this.tokens.label.range.end);
511
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.goto, this.tokens.label)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
504
512
  }
505
513
  transpile(state) {
506
514
  return [
@@ -516,9 +524,10 @@ class GotoStatement extends Statement {
516
524
  exports.GotoStatement = GotoStatement;
517
525
  class LabelStatement extends Statement {
518
526
  constructor(tokens) {
527
+ var _a;
519
528
  super();
520
529
  this.tokens = tokens;
521
- this.range = util_1.util.createRangeFromPositions(this.tokens.identifier.range.start, this.tokens.colon.range.end);
530
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.identifier, this.tokens.colon)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
522
531
  }
523
532
  transpile(state) {
524
533
  return [
@@ -537,7 +546,7 @@ class ReturnStatement extends Statement {
537
546
  super();
538
547
  this.tokens = tokens;
539
548
  this.value = value;
540
- this.range = util_1.util.createRangeFromPositions(this.tokens.return.range.start, ((_a = this.value) === null || _a === void 0 ? void 0 : _a.range.end) || this.tokens.return.range.end);
549
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.return, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
541
550
  }
542
551
  transpile(state) {
543
552
  let result = [];
@@ -550,16 +559,17 @@ class ReturnStatement extends Statement {
550
559
  }
551
560
  walk(visitor, options) {
552
561
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
553
- visitors_1.walk(this, 'value', visitor, options);
562
+ (0, visitors_1.walk)(this, 'value', visitor, options);
554
563
  }
555
564
  }
556
565
  }
557
566
  exports.ReturnStatement = ReturnStatement;
558
567
  class EndStatement extends Statement {
559
568
  constructor(tokens) {
569
+ var _a, _b;
560
570
  super();
561
571
  this.tokens = tokens;
562
- this.range = util_1.util.createRangeFromPositions(this.tokens.end.range.start, this.tokens.end.range.end);
572
+ this.range = (_b = (_a = this.tokens.end) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
563
573
  }
564
574
  transpile(state) {
565
575
  return [
@@ -573,9 +583,10 @@ class EndStatement extends Statement {
573
583
  exports.EndStatement = EndStatement;
574
584
  class StopStatement extends Statement {
575
585
  constructor(tokens) {
586
+ var _a, _b;
576
587
  super();
577
588
  this.tokens = tokens;
578
- this.range = util_1.util.createRangeFromPositions(this.tokens.stop.range.start, this.tokens.stop.range.end);
589
+ this.range = (_b = (_a = this.tokens.stop) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
579
590
  }
580
591
  transpile(state) {
581
592
  return [
@@ -589,7 +600,7 @@ class StopStatement extends Statement {
589
600
  exports.StopStatement = StopStatement;
590
601
  class ForStatement extends Statement {
591
602
  constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
592
- var _a, _b;
603
+ var _a;
593
604
  super();
594
605
  this.forToken = forToken;
595
606
  this.counterDeclaration = counterDeclaration;
@@ -599,8 +610,7 @@ class ForStatement extends Statement {
599
610
  this.endForToken = endForToken;
600
611
  this.stepToken = stepToken;
601
612
  this.increment = increment;
602
- const lastRange = (_b = (_a = this.endForToken) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : body.range;
603
- this.range = util_1.util.createRangeFromPositions(this.forToken.range.start, lastRange.end);
613
+ this.range = (_a = util_1.util.createBoundingRange(this.forToken, this.counterDeclaration, this.toToken, this.finalValue, this.body, this.stepToken, this.increment, this.endForToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
604
614
  }
605
615
  transpile(state) {
606
616
  let result = [];
@@ -620,30 +630,29 @@ class ForStatement extends Statement {
620
630
  state.lineage.unshift(this);
621
631
  result.push(...this.body.transpile(state));
622
632
  state.lineage.shift();
623
- if (this.body.statements.length > 0) {
624
- result.push('\n');
625
- }
633
+ // add new line before "end for"
634
+ result.push('\n');
626
635
  //end for
627
636
  result.push(state.indent(), state.transpileToken(this.endForToken));
628
637
  return result;
629
638
  }
630
639
  walk(visitor, options) {
631
640
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
632
- visitors_1.walk(this, 'counterDeclaration', visitor, options);
641
+ (0, visitors_1.walk)(this, 'counterDeclaration', visitor, options);
633
642
  }
634
643
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
635
- visitors_1.walk(this, 'finalValue', visitor, options);
636
- visitors_1.walk(this, 'increment', visitor, options);
644
+ (0, visitors_1.walk)(this, 'finalValue', visitor, options);
645
+ (0, visitors_1.walk)(this, 'increment', visitor, options);
637
646
  }
638
647
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
639
- visitors_1.walk(this, 'body', visitor, options);
648
+ (0, visitors_1.walk)(this, 'body', visitor, options);
640
649
  }
641
650
  }
642
651
  }
643
652
  exports.ForStatement = ForStatement;
644
653
  class ForEachStatement extends Statement {
645
654
  constructor(forEachToken, item, inToken, target, body, endForToken) {
646
- var _a, _b, _c, _d, _e;
655
+ var _a;
647
656
  super();
648
657
  this.forEachToken = forEachToken;
649
658
  this.item = item;
@@ -651,7 +660,7 @@ class ForEachStatement extends Statement {
651
660
  this.target = target;
652
661
  this.body = body;
653
662
  this.endForToken = endForToken;
654
- this.range = util_1.util.createRangeFromPositions(this.forEachToken.range.start, ((_e = (_d = (_c = (_b = (_a = this.endForToken) !== null && _a !== void 0 ? _a : this.body) !== null && _b !== void 0 ? _b : this.target) !== null && _c !== void 0 ? _c : this.inToken) !== null && _d !== void 0 ? _d : this.item) !== null && _e !== void 0 ? _e : this.forEachToken).range.end);
663
+ this.range = (_a = util_1.util.createBoundingRange(this.forEachToken, this.item, this.inToken, this.target, this.body, this.endForToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
655
664
  }
656
665
  transpile(state) {
657
666
  let result = [];
@@ -667,32 +676,30 @@ class ForEachStatement extends Statement {
667
676
  state.lineage.unshift(this);
668
677
  result.push(...this.body.transpile(state));
669
678
  state.lineage.shift();
670
- if (this.body.statements.length > 0) {
671
- result.push('\n');
672
- }
679
+ // add new line before "end for"
680
+ result.push('\n');
673
681
  //end for
674
682
  result.push(state.indent(), state.transpileToken(this.endForToken));
675
683
  return result;
676
684
  }
677
685
  walk(visitor, options) {
678
686
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
679
- visitors_1.walk(this, 'target', visitor, options);
687
+ (0, visitors_1.walk)(this, 'target', visitor, options);
680
688
  }
681
689
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
682
- visitors_1.walk(this, 'body', visitor, options);
690
+ (0, visitors_1.walk)(this, 'body', visitor, options);
683
691
  }
684
692
  }
685
693
  }
686
694
  exports.ForEachStatement = ForEachStatement;
687
695
  class WhileStatement extends Statement {
688
696
  constructor(tokens, condition, body) {
689
- var _a, _b;
697
+ var _a;
690
698
  super();
691
699
  this.tokens = tokens;
692
700
  this.condition = condition;
693
701
  this.body = body;
694
- const lastRange = (_b = (_a = this.tokens.endWhile) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : body.range;
695
- this.range = util_1.util.createRangeFromPositions(this.tokens.while.range.start, lastRange.end);
702
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.while, this.condition, this.body, this.tokens.endWhile)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
696
703
  }
697
704
  transpile(state) {
698
705
  let result = [];
@@ -712,26 +719,29 @@ class WhileStatement extends Statement {
712
719
  }
713
720
  walk(visitor, options) {
714
721
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
715
- visitors_1.walk(this, 'condition', visitor, options);
722
+ (0, visitors_1.walk)(this, 'condition', visitor, options);
716
723
  }
717
724
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
718
- visitors_1.walk(this, 'body', visitor, options);
725
+ (0, visitors_1.walk)(this, 'body', visitor, options);
719
726
  }
720
727
  }
721
728
  }
722
729
  exports.WhileStatement = WhileStatement;
723
730
  class DottedSetStatement extends Statement {
724
- constructor(obj, name, value) {
731
+ constructor(obj, name, value, dot, operator) {
732
+ var _a;
725
733
  super();
726
734
  this.obj = obj;
727
735
  this.name = name;
728
736
  this.value = value;
729
- this.range = util_1.util.createRangeFromPositions(this.obj.range.start, this.value.range.end);
737
+ this.dot = dot;
738
+ this.operator = operator;
739
+ this.range = (_a = util_1.util.createBoundingRange(this.obj, this.dot, this.name, this.operator, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
730
740
  }
731
741
  transpile(state) {
732
742
  var _a, _b;
733
743
  //if the value is a compound assignment, don't add the obj, dot, name, or operator...the expression will handle that
734
- if (lexer_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
744
+ if (TokenKind_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
735
745
  return this.value.transpile(state);
736
746
  }
737
747
  else {
@@ -749,26 +759,28 @@ class DottedSetStatement extends Statement {
749
759
  }
750
760
  walk(visitor, options) {
751
761
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
752
- visitors_1.walk(this, 'obj', visitor, options);
753
- visitors_1.walk(this, 'value', visitor, options);
762
+ (0, visitors_1.walk)(this, 'obj', visitor, options);
763
+ (0, visitors_1.walk)(this, 'value', visitor, options);
754
764
  }
755
765
  }
756
766
  }
757
767
  exports.DottedSetStatement = DottedSetStatement;
758
768
  class IndexedSetStatement extends Statement {
759
- constructor(obj, index, value, openingSquare, closingSquare) {
769
+ constructor(obj, index, value, openingSquare, closingSquare, operator) {
770
+ var _a;
760
771
  super();
761
772
  this.obj = obj;
762
773
  this.index = index;
763
774
  this.value = value;
764
775
  this.openingSquare = openingSquare;
765
776
  this.closingSquare = closingSquare;
766
- this.range = util_1.util.createRangeFromPositions(this.obj.range.start, this.value.range.end);
777
+ this.operator = operator;
778
+ this.range = (_a = util_1.util.createBoundingRange(this.obj, this.openingSquare, this.index, this.closingSquare, this.operator, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
767
779
  }
768
780
  transpile(state) {
769
781
  var _a, _b;
770
782
  //if the value is a component assignment, don't add the obj, index or operator...the expression will handle that
771
- if (lexer_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
783
+ if (TokenKind_1.CompoundAssignmentOperators.includes((_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.operator) === null || _b === void 0 ? void 0 : _b.kind)) {
772
784
  return this.value.transpile(state);
773
785
  }
774
786
  else {
@@ -790,18 +802,19 @@ class IndexedSetStatement extends Statement {
790
802
  }
791
803
  walk(visitor, options) {
792
804
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
793
- visitors_1.walk(this, 'obj', visitor, options);
794
- visitors_1.walk(this, 'index', visitor, options);
795
- visitors_1.walk(this, 'value', visitor, options);
805
+ (0, visitors_1.walk)(this, 'obj', visitor, options);
806
+ (0, visitors_1.walk)(this, 'index', visitor, options);
807
+ (0, visitors_1.walk)(this, 'value', visitor, options);
796
808
  }
797
809
  }
798
810
  }
799
811
  exports.IndexedSetStatement = IndexedSetStatement;
800
812
  class LibraryStatement extends Statement {
801
813
  constructor(tokens) {
814
+ var _a;
802
815
  super();
803
816
  this.tokens = tokens;
804
- this.range = util_1.util.createRangeFromPositions(this.tokens.library.range.start, this.tokens.filePath ? this.tokens.filePath.range.end : this.tokens.library.range.end);
817
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
805
818
  }
806
819
  transpile(state) {
807
820
  let result = [];
@@ -834,8 +847,14 @@ class NamespaceStatement extends Statement {
834
847
  this.symbolTable = new SymbolTable_1.SymbolTable(parentSymbolTable);
835
848
  }
836
849
  get range() {
837
- var _a, _b, _c;
838
- return util_1.util.createRangeFromPositions(this.keyword.range.start, ((_c = (_b = (_a = this.endKeyword) !== null && _a !== void 0 ? _a : this.body) !== null && _b !== void 0 ? _b : this.nameExpression) !== null && _c !== void 0 ? _c : this.keyword).range.end);
850
+ return this.cacheRange();
851
+ }
852
+ cacheRange() {
853
+ var _a;
854
+ if (!this._range) {
855
+ this._range = (_a = util_1.util.createBoundingRange(this.keyword, this.nameExpression, this.body, this.endKeyword)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
856
+ }
857
+ return this._range;
839
858
  }
840
859
  getName(parseMode) {
841
860
  return this.nameExpression.getName(parseMode);
@@ -858,20 +877,21 @@ class NamespaceStatement extends Statement {
858
877
  }
859
878
  walk(visitor, options) {
860
879
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
861
- visitors_1.walk(this, 'nameExpression', visitor, options);
880
+ (0, visitors_1.walk)(this, 'nameExpression', visitor, options);
862
881
  }
863
882
  if (this.body.statements.length > 0 && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
864
- visitors_1.walk(this, 'body', visitor, options);
883
+ (0, visitors_1.walk)(this, 'body', visitor, options);
865
884
  }
866
885
  }
867
886
  }
868
887
  exports.NamespaceStatement = NamespaceStatement;
869
888
  class ImportStatement extends Statement {
870
889
  constructor(importToken, filePathToken) {
890
+ var _a;
871
891
  super();
872
892
  this.importToken = importToken;
873
893
  this.filePathToken = filePathToken;
874
- this.range = util_1.util.createRangeFromPositions(importToken.range.start, (filePathToken !== null && filePathToken !== void 0 ? filePathToken : importToken).range.end);
894
+ this.range = (_a = util_1.util.createBoundingRange(this.importToken, this.filePathToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
875
895
  if (this.filePathToken) {
876
896
  //remove quotes
877
897
  this.filePath = this.filePathToken.text.replace(/"/g, '');
@@ -905,13 +925,198 @@ class ImportStatement extends Statement {
905
925
  }
906
926
  }
907
927
  exports.ImportStatement = ImportStatement;
928
+ class InterfaceStatement extends Statement {
929
+ constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
930
+ var _a, _b, _c;
931
+ super();
932
+ this.name = name;
933
+ this.parentInterfaceName = parentInterfaceName;
934
+ this.body = body;
935
+ this.namespaceName = namespaceName;
936
+ this.memberTable = new SymbolTable_1.SymbolTable();
937
+ this.tokens = {};
938
+ this.memberMap = {};
939
+ this.methods = [];
940
+ this.fields = [];
941
+ this.tokens.interface = interfaceToken;
942
+ this.tokens.name = name;
943
+ this.tokens.extends = extendsToken;
944
+ this.tokens.endInterface = endInterfaceToken;
945
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
946
+ for (let statement of this.body) {
947
+ if ((0, reflection_1.isInterfaceMethodStatement)(statement)) {
948
+ this.methods.push(statement);
949
+ this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
950
+ }
951
+ else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
952
+ this.fields.push(statement);
953
+ this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
954
+ }
955
+ }
956
+ }
957
+ /**
958
+ * The name of the interface WITH its leading namespace (if applicable)
959
+ */
960
+ getName(parseMode) {
961
+ var _a;
962
+ const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
963
+ if (name) {
964
+ if (this.namespaceName) {
965
+ let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
966
+ return `${namespaceName}.${name}`;
967
+ }
968
+ else {
969
+ return name;
970
+ }
971
+ }
972
+ else {
973
+ //return undefined which will allow outside callers to know that this interface doesn't have a name
974
+ return undefined;
975
+ }
976
+ }
977
+ buildSymbolTable(parentIface) {
978
+ var _a, _b;
979
+ this.memberTable.clear();
980
+ if (parentIface) {
981
+ this.memberTable.setParent(parentIface === null || parentIface === void 0 ? void 0 : parentIface.memberTable);
982
+ }
983
+ for (const statement of this.methods) {
984
+ const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
985
+ this.memberTable.addSymbol((_a = statement === null || statement === void 0 ? void 0 : statement.name) === null || _a === void 0 ? void 0 : _a.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType);
986
+ }
987
+ for (const statement of this.fields) {
988
+ this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
989
+ }
990
+ }
991
+ hasParent() {
992
+ return !!this.parentInterfaceName;
993
+ }
994
+ getParentName() {
995
+ return !!this.parentInterfaceName;
996
+ }
997
+ /**
998
+ * Gets an array of possible parent interface names, taking into account the namespace this interface was created under
999
+ * @returns array of possible parent interface names
1000
+ */
1001
+ getPossibleFullParentNames() {
1002
+ var _a;
1003
+ if (!this.hasParent()) {
1004
+ return [];
1005
+ }
1006
+ if (((_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
1007
+ // The specified parent interface already has a dot, so it must already reference a namespace
1008
+ return [this.parentInterfaceName.getName()];
1009
+ }
1010
+ const names = [];
1011
+ if (this.namespaceName) {
1012
+ // We're under a namespace, so the full parent name MIGHT be with this namespace too
1013
+ names.push(this.namespaceName.getName() + '.' + this.parentInterfaceName.getName());
1014
+ }
1015
+ names.push(this.parentInterfaceName.getName());
1016
+ return names;
1017
+ }
1018
+ getThisBscType() {
1019
+ return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
1020
+ }
1021
+ transpile(state) {
1022
+ //interfaces should completely disappear at runtime
1023
+ return [];
1024
+ }
1025
+ getTypedef(state) {
1026
+ var _a, _b, _c;
1027
+ const result = [];
1028
+ for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1029
+ result.push(...annotation.getTypedef(state), state.newline, state.indent());
1030
+ }
1031
+ result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
1032
+ const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName(Parser_1.ParseMode.BrighterScript);
1033
+ if (parentInterfaceName) {
1034
+ result.push(' extends ', parentInterfaceName);
1035
+ }
1036
+ const body = (_c = this.body) !== null && _c !== void 0 ? _c : [];
1037
+ if (body.length > 0) {
1038
+ state.blockDepth++;
1039
+ }
1040
+ for (const statement of body) {
1041
+ if ((0, reflection_1.isInterfaceMethodStatement)(statement) || (0, reflection_1.isInterfaceFieldStatement)(statement)) {
1042
+ result.push(state.newline, state.indent(), ...statement.getTypedef(state));
1043
+ }
1044
+ else {
1045
+ result.push(state.newline, state.indent(), ...statement.transpile(state));
1046
+ }
1047
+ }
1048
+ if (body.length > 0) {
1049
+ state.blockDepth--;
1050
+ }
1051
+ result.push(state.newline, state.indent(), 'end interface', state.newline);
1052
+ return result;
1053
+ }
1054
+ walk(visitor, options) {
1055
+ if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1056
+ for (let i = 0; i < this.body.length; i++) {
1057
+ (0, visitors_1.walk)(this.body, i, visitor, options, this);
1058
+ }
1059
+ }
1060
+ }
1061
+ }
1062
+ exports.InterfaceStatement = InterfaceStatement;
1063
+ class InterfaceFieldStatement extends Statement {
1064
+ constructor(nameToken, asToken, type, namespaceName) {
1065
+ var _a;
1066
+ super();
1067
+ this.type = type;
1068
+ this.namespaceName = namespaceName;
1069
+ this.tokens = {};
1070
+ this.tokens.name = nameToken;
1071
+ this.tokens.as = asToken;
1072
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1073
+ }
1074
+ transpile(state) {
1075
+ throw new Error('Method not implemented.');
1076
+ }
1077
+ getType() {
1078
+ var _a;
1079
+ return (_a = this.type) === null || _a === void 0 ? void 0 : _a.type;
1080
+ }
1081
+ get name() {
1082
+ return this.tokens.name;
1083
+ }
1084
+ walk(visitor, options) {
1085
+ //nothing to walk
1086
+ }
1087
+ getTypedef(state) {
1088
+ var _a;
1089
+ const result = [];
1090
+ for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1091
+ result.push(...annotation.getTypedef(state), state.newline, state.indent());
1092
+ }
1093
+ result.push(this.tokens.name.text);
1094
+ if (this.tokens.as && this.type) {
1095
+ result.push(' as ', ...this.type.transpile(state));
1096
+ }
1097
+ return result;
1098
+ }
1099
+ }
1100
+ exports.InterfaceFieldStatement = InterfaceFieldStatement;
1101
+ class InterfaceMethodStatement extends FunctionStatement {
1102
+ transpile(state) {
1103
+ throw new Error('Method not implemented.');
1104
+ }
1105
+ constructor(name, func) {
1106
+ super(name, func, undefined);
1107
+ }
1108
+ walk(visitor, options) {
1109
+ //nothing to walk
1110
+ }
1111
+ }
1112
+ exports.InterfaceMethodStatement = InterfaceMethodStatement;
908
1113
  class ClassStatement extends Statement {
909
1114
  constructor(classKeyword,
910
1115
  /**
911
1116
  * The name of the class (without namespace prefix)
912
1117
  */
913
- name, body, end, extendsKeyword, parentClassName, namespaceName) {
914
- var _a, _b, _c;
1118
+ name, body, end, extendsKeyword, parentClassName, namespaceName, currentSymbolTable) {
1119
+ var _a, _b, _c, _d;
915
1120
  super();
916
1121
  this.classKeyword = classKeyword;
917
1122
  this.name = name;
@@ -920,21 +1125,25 @@ class ClassStatement extends Statement {
920
1125
  this.extendsKeyword = extendsKeyword;
921
1126
  this.parentClassName = parentClassName;
922
1127
  this.namespaceName = namespaceName;
1128
+ this.currentSymbolTable = currentSymbolTable;
1129
+ this.symbolTable = new SymbolTable_1.SymbolTable();
1130
+ this.memberTable = new SymbolTable_1.SymbolTable();
923
1131
  this.memberMap = {};
924
1132
  this.methods = [];
925
1133
  this.fields = [];
926
1134
  this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1135
+ this.symbolTable.setParent(currentSymbolTable);
1136
+ this.range = (_b = util_1.util.createBoundingRange(this.classKeyword, this.name, this.extendsKeyword, this.parentClassName, ...this.body, this.end)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
927
1137
  for (let statement of this.body) {
928
- if (reflection_1.isClassMethodStatement(statement)) {
1138
+ if ((0, reflection_1.isClassMethodStatement)(statement)) {
929
1139
  this.methods.push(statement);
930
- this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
1140
+ this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
931
1141
  }
932
- else if (reflection_1.isClassFieldStatement(statement)) {
1142
+ else if ((0, reflection_1.isClassFieldStatement)(statement)) {
933
1143
  this.fields.push(statement);
934
- this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
1144
+ this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
935
1145
  }
936
1146
  }
937
- this.range = util_1.util.createRangeFromPositions(this.classKeyword.range.start, this.end.range.end);
938
1147
  }
939
1148
  getName(parseMode) {
940
1149
  var _a;
@@ -954,6 +1163,36 @@ class ClassStatement extends Statement {
954
1163
  return undefined;
955
1164
  }
956
1165
  }
1166
+ getThisBscType() {
1167
+ return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
1168
+ }
1169
+ getConstructorFunctionType() {
1170
+ var _a;
1171
+ const constructFunc = (_a = this.getConstructorFunction()) !== null && _a !== void 0 ? _a : this.getEmptyNewFunction();
1172
+ const constructorFuncType = constructFunc.func.getFunctionType();
1173
+ constructorFuncType.setName(this.getName(Parser_1.ParseMode.BrighterScript));
1174
+ constructorFuncType.isNew = true;
1175
+ return constructorFuncType;
1176
+ }
1177
+ buildSymbolTable(parentClass) {
1178
+ var _a, _b, _c, _d, _e;
1179
+ this.symbolTable.clear();
1180
+ this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getThisBscType());
1181
+ this.memberTable.clear();
1182
+ if ((0, reflection_1.isClassStatement)(parentClass)) {
1183
+ this.symbolTable.addSymbol('super', (_b = this.parentClassName) === null || _b === void 0 ? void 0 : _b.range, parentClass.getConstructorFunctionType());
1184
+ this.memberTable.setParent(parentClass === null || parentClass === void 0 ? void 0 : parentClass.memberTable);
1185
+ }
1186
+ for (const statement of this.methods) {
1187
+ statement === null || statement === void 0 ? void 0 : statement.func.symbolTable.setParent(this.symbolTable);
1188
+ const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
1189
+ funcType.setName(this.getName(Parser_1.ParseMode.BrighterScript) + '.' + ((_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text));
1190
+ this.memberTable.addSymbol((_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType);
1191
+ }
1192
+ for (const statement of this.fields) {
1193
+ this.memberTable.addSymbol((_e = statement === null || statement === void 0 ? void 0 : statement.name) === null || _e === void 0 ? void 0 : _e.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
1194
+ }
1195
+ }
957
1196
  transpile(state) {
958
1197
  let result = [];
959
1198
  //make the builder
@@ -965,6 +1204,7 @@ class ClassStatement extends Statement {
965
1204
  }
966
1205
  getTypedef(state) {
967
1206
  var _a, _b;
1207
+ this.ensureConstructorFunctionExists();
968
1208
  const result = [];
969
1209
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
970
1210
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
@@ -977,7 +1217,7 @@ class ClassStatement extends Statement {
977
1217
  result.push(state.newline);
978
1218
  state.blockDepth++;
979
1219
  for (const member of this.body) {
980
- if ('getTypedef' in member) {
1220
+ if ((0, reflection_1.isTypedefProvider)(member)) {
981
1221
  result.push(state.indent(), ...member.getTypedef(state), state.newline);
982
1222
  }
983
1223
  }
@@ -1006,9 +1246,30 @@ class ClassStatement extends Statement {
1006
1246
  }
1007
1247
  return myIndex - 1;
1008
1248
  }
1009
- hasParentClass() {
1249
+ hasParent() {
1010
1250
  return !!this.parentClassName;
1011
1251
  }
1252
+ /**
1253
+ * Gets an array of possible parent class names, taking into account the namespace this class was created under
1254
+ * @returns array of possible parent class names
1255
+ */
1256
+ getPossibleFullParentNames() {
1257
+ var _a;
1258
+ if (!this.hasParent()) {
1259
+ return [];
1260
+ }
1261
+ if (((_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
1262
+ // The specified parent class already has a dot, so it must already reference a namespace
1263
+ return [this.parentClassName.getName()];
1264
+ }
1265
+ const names = [];
1266
+ if (this.namespaceName) {
1267
+ // We're under a namespace, so the full parent name MIGHT be with this namespace too
1268
+ names.push(this.namespaceName.getName() + '.' + this.parentClassName.getName());
1269
+ }
1270
+ names.push(this.parentClassName.getName());
1271
+ return names;
1272
+ }
1012
1273
  /**
1013
1274
  * Get all ancestor classes, in closest-to-furthest order (i.e. 0 is parent, 1 is grandparent, etc...).
1014
1275
  * This will return an empty array if no ancestors were found
@@ -1047,14 +1308,16 @@ class ClassStatement extends Statement {
1047
1308
  }
1048
1309
  }
1049
1310
  getEmptyNewFunction() {
1050
- let stmt = Parser_1.Parser.parse(`
1051
- class UtilClass
1052
- sub new()
1053
- end sub
1054
- end class
1055
- `, { mode: Parser_1.ParseMode.BrighterScript }).statements[0].memberMap.new;
1056
- //TODO make locations point to 0,0 (might not matter?)
1057
- return stmt;
1311
+ return (0, creators_1.createClassMethodStatement)('new', TokenKind_1.TokenKind.Sub);
1312
+ }
1313
+ /**
1314
+ * Create an empty `new` function if class is missing it (simplifies transpile logic)
1315
+ */
1316
+ ensureConstructorFunctionExists() {
1317
+ if (!this.getConstructorFunction()) {
1318
+ this.memberMap.new = this.getEmptyNewFunction();
1319
+ this.body = [this.memberMap.new, ...this.body];
1320
+ }
1058
1321
  }
1059
1322
  /**
1060
1323
  * Determine if the specified field was declared in one of the ancestor classes
@@ -1075,6 +1338,7 @@ class ClassStatement extends Statement {
1075
1338
  */
1076
1339
  getTranspiledBuilder(state) {
1077
1340
  var _a;
1341
+ this.ensureConstructorFunctionExists();
1078
1342
  let result = [];
1079
1343
  result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
1080
1344
  state.blockDepth++;
@@ -1095,19 +1359,14 @@ class ClassStatement extends Statement {
1095
1359
  }
1096
1360
  result.push(state.newline, state.indent());
1097
1361
  let parentClassIndex = this.getParentClassIndex(state);
1098
- //create empty `new` function if class is missing it (simplifies transpile logic)
1099
- if (!this.getConstructorFunction()) {
1100
- this.memberMap.new = this.getEmptyNewFunction();
1101
- this.body = [this.memberMap.new, ...this.body];
1102
- }
1103
1362
  for (let statement of this.body) {
1104
1363
  //is field statement
1105
- if (reflection_1.isClassFieldStatement(statement)) {
1364
+ if ((0, reflection_1.isClassFieldStatement)(statement)) {
1106
1365
  //do nothing with class fields in this situation, they are handled elsewhere
1107
1366
  continue;
1108
1367
  //methods
1109
1368
  }
1110
- else if (reflection_1.isClassMethodStatement(statement)) {
1369
+ else if ((0, reflection_1.isClassMethodStatement)(statement)) {
1111
1370
  //store overridden parent methods as super{parentIndex}_{methodName}
1112
1371
  if (
1113
1372
  //is override method
@@ -1176,7 +1435,7 @@ class ClassStatement extends Statement {
1176
1435
  walk(visitor, options) {
1177
1436
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1178
1437
  for (let i = 0; i < this.body.length; i++) {
1179
- visitors_1.walk(this.body, i, visitor, options, this);
1438
+ (0, visitors_1.walk)(this.body, i, visitor, options, this);
1180
1439
  }
1181
1440
  }
1182
1441
  }
@@ -1184,11 +1443,19 @@ class ClassStatement extends Statement {
1184
1443
  exports.ClassStatement = ClassStatement;
1185
1444
  class ClassMethodStatement extends FunctionStatement {
1186
1445
  constructor(accessModifier, name, func, override) {
1187
- var _a;
1188
1446
  super(name, func, undefined);
1189
1447
  this.accessModifier = accessModifier;
1190
1448
  this.override = override;
1191
- this.range = util_1.util.createRangeFromPositions(((_a = this.accessModifier) !== null && _a !== void 0 ? _a : this.func).range.start, this.func.range.end);
1449
+ }
1450
+ get range() {
1451
+ return this.cacheRange();
1452
+ }
1453
+ cacheRange() {
1454
+ var _a, _b;
1455
+ if (!this._range) {
1456
+ this._range = (_b = util_1.util.createBoundingRange(this.accessModifier, this.override, (_a = this.func) !== null && _a !== void 0 ? _a : this.name)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
1457
+ }
1458
+ return this._range;
1192
1459
  }
1193
1460
  transpile(state) {
1194
1461
  if (this.name.text.toLowerCase() === 'new') {
@@ -1199,7 +1466,7 @@ class ClassMethodStatement extends FunctionStatement {
1199
1466
  //TODO - remove type information from these methods because that doesn't work
1200
1467
  //convert the `super` calls into the proper methods
1201
1468
  const parentClassIndex = state.classStatement.getParentClassIndex(state);
1202
- const visitor = visitors_1.createVisitor({
1469
+ const visitor = (0, visitors_1.createVisitor)({
1203
1470
  VariableExpression: e => {
1204
1471
  if (e.name.text.toLocaleLowerCase() === 'super') {
1205
1472
  e.name.text = `m.super${parentClassIndex}_new`;
@@ -1249,26 +1516,26 @@ class ClassMethodStatement extends FunctionStatement {
1249
1516
  let firstStatement = this.func.body.statements[0];
1250
1517
  if (
1251
1518
  //is a call statement
1252
- reflection_1.isExpressionStatement(firstStatement) && reflection_1.isCallExpression(firstStatement.expression) &&
1519
+ (0, reflection_1.isExpressionStatement)(firstStatement) && (0, reflection_1.isCallExpression)(firstStatement.expression) &&
1253
1520
  //is a call to super
1254
1521
  util_1.util.findBeginningVariableExpression(firstStatement === null || firstStatement === void 0 ? void 0 : firstStatement.expression.callee).name.text.toLowerCase() === 'super') {
1255
1522
  return;
1256
1523
  }
1257
1524
  //this is a child class, and the first statement isn't a call to super. Inject one
1258
1525
  this.func.body.statements.unshift(new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
1259
- kind: lexer_1.TokenKind.Identifier,
1526
+ kind: TokenKind_1.TokenKind.Identifier,
1260
1527
  text: 'super',
1261
1528
  isReserved: false,
1262
1529
  range: state.classStatement.name.range,
1263
1530
  leadingWhitespace: ''
1264
1531
  }, null), {
1265
- kind: lexer_1.TokenKind.LeftParen,
1532
+ kind: TokenKind_1.TokenKind.LeftParen,
1266
1533
  text: '(',
1267
1534
  isReserved: false,
1268
1535
  range: state.classStatement.name.range,
1269
1536
  leadingWhitespace: ''
1270
1537
  }, {
1271
- kind: lexer_1.TokenKind.RightParen,
1538
+ kind: TokenKind_1.TokenKind.RightParen,
1272
1539
  text: ')',
1273
1540
  isReserved: false,
1274
1541
  range: state.classStatement.name.range,
@@ -1279,7 +1546,7 @@ class ClassMethodStatement extends FunctionStatement {
1279
1546
  * Inject field initializers at the top of the `new` function (after any present `super()` call)
1280
1547
  */
1281
1548
  injectFieldInitializersForConstructor(state) {
1282
- let startingIndex = state.classStatement.hasParentClass() ? 1 : 0;
1549
+ let startingIndex = state.classStatement.hasParent() ? 1 : 0;
1283
1550
  let newStatements = [];
1284
1551
  //insert the field initializers in order
1285
1552
  for (let field of state.classStatement.fields) {
@@ -1290,21 +1557,21 @@ class ClassMethodStatement extends FunctionStatement {
1290
1557
  }
1291
1558
  else {
1292
1559
  //if there is no initial value, set the initial value to `invalid`
1293
- newStatements.push(new AssignmentStatement(thisQualifiedName, creators_1.createToken(lexer_1.TokenKind.Equal, '=', field.name.range), creators_1.createInvalidLiteral('invalid', field.name.range), this.func));
1560
+ newStatements.push(new AssignmentStatement(thisQualifiedName, (0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), (0, creators_1.createInvalidLiteral)('invalid', field.name.range), this.func));
1294
1561
  }
1295
1562
  }
1296
1563
  this.func.body.statements.splice(startingIndex, 0, ...newStatements);
1297
1564
  }
1298
1565
  walk(visitor, options) {
1299
1566
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1300
- visitors_1.walk(this, 'func', visitor, options);
1567
+ (0, visitors_1.walk)(this, 'func', visitor, options);
1301
1568
  }
1302
1569
  }
1303
1570
  }
1304
1571
  exports.ClassMethodStatement = ClassMethodStatement;
1305
1572
  class ClassFieldStatement extends Statement {
1306
- constructor(accessModifier, name, as, type, equal, initialValue) {
1307
- var _a, _b, _c, _d;
1573
+ constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
1574
+ var _a;
1308
1575
  super();
1309
1576
  this.accessModifier = accessModifier;
1310
1577
  this.name = name;
@@ -1312,17 +1579,18 @@ class ClassFieldStatement extends Statement {
1312
1579
  this.type = type;
1313
1580
  this.equal = equal;
1314
1581
  this.initialValue = initialValue;
1315
- this.range = util_1.util.createRangeFromPositions(((_a = this.accessModifier) !== null && _a !== void 0 ? _a : this.name).range.start, ((_d = (_c = (_b = this.initialValue) !== null && _b !== void 0 ? _b : this.type) !== null && _c !== void 0 ? _c : this.as) !== null && _d !== void 0 ? _d : this.name).range.end);
1582
+ this.namespaceName = namespaceName;
1583
+ this.range = (_a = util_1.util.createBoundingRange(this.accessModifier, this.name, this.as, this.type, this.equal, this.initialValue)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1316
1584
  }
1317
1585
  /**
1318
1586
  * Derive a ValueKind from the type token, or the initial value.
1319
1587
  * Defaults to `DynamicType`
1320
1588
  */
1321
- getType() {
1589
+ getType(parseMode = Parser_1.ParseMode.BrighterScript) {
1322
1590
  if (this.type) {
1323
- return util_1.util.tokenToBscType(this.type);
1591
+ return this.type.type;
1324
1592
  }
1325
- else if (reflection_1.isLiteralExpression(this.initialValue)) {
1593
+ else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
1326
1594
  return this.initialValue.type;
1327
1595
  }
1328
1596
  else {
@@ -1339,8 +1607,8 @@ class ClassFieldStatement extends Statement {
1339
1607
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1340
1608
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1341
1609
  }
1342
- let type = this.getType();
1343
- if (reflection_1.isInvalidType(type) || reflection_1.isVoidType(type)) {
1610
+ let type = this.getType(Parser_1.ParseMode.BrightScript);
1611
+ if (!type || (0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
1344
1612
  type = new DynamicType_1.DynamicType();
1345
1613
  }
1346
1614
  result.push((_c = (_b = this.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' ', (_d = this.name) === null || _d === void 0 ? void 0 : _d.text, ' as ', type.toTypeString());
@@ -1348,56 +1616,77 @@ class ClassFieldStatement extends Statement {
1348
1616
  return result;
1349
1617
  }
1350
1618
  walk(visitor, options) {
1351
- if (this.initialValue && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1352
- visitors_1.walk(this, 'initialValue', visitor, options);
1619
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1620
+ (0, visitors_1.walk)(this, 'type', visitor, options);
1621
+ (0, visitors_1.walk)(this, 'initialValue', visitor, options);
1353
1622
  }
1354
1623
  }
1355
1624
  }
1356
1625
  exports.ClassFieldStatement = ClassFieldStatement;
1357
1626
  class TryCatchStatement extends Statement {
1358
- constructor(tryToken, tryBranch, catchToken, exceptionVariable, catchBranch, endTryToken) {
1627
+ constructor(tokens, tryBranch, catchStatement) {
1628
+ var _a;
1359
1629
  super();
1360
- this.tryToken = tryToken;
1630
+ this.tokens = tokens;
1361
1631
  this.tryBranch = tryBranch;
1362
- this.catchToken = catchToken;
1363
- this.exceptionVariable = exceptionVariable;
1364
- this.catchBranch = catchBranch;
1365
- this.endTryToken = endTryToken;
1366
- }
1367
- get range() {
1368
- var _a, _b, _c, _d, _e;
1369
- return util_1.util.createRangeFromPositions(this.tryToken.range.start, ((_e = (_d = (_c = (_b = (_a = this.endTryToken) !== null && _a !== void 0 ? _a : this.catchBranch) !== null && _b !== void 0 ? _b : this.exceptionVariable) !== null && _c !== void 0 ? _c : this.catchToken) !== null && _d !== void 0 ? _d : this.tryBranch) !== null && _e !== void 0 ? _e : this.tryToken).range.end);
1632
+ this.catchStatement = catchStatement;
1633
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.try, this.tryBranch, this.catchStatement, this.tokens.endTry)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1370
1634
  }
1371
1635
  transpile(state) {
1636
+ var _a, _b;
1372
1637
  return [
1373
- state.transpileToken(this.tryToken),
1638
+ state.transpileToken(this.tokens.try),
1374
1639
  ...this.tryBranch.transpile(state),
1375
1640
  state.newline,
1376
1641
  state.indent(),
1377
- state.transpileToken(this.catchToken),
1378
- ' ',
1379
- state.transpileToken(this.exceptionVariable),
1380
- ...this.catchBranch.transpile(state),
1642
+ ...((_b = (_a = this.catchStatement) === null || _a === void 0 ? void 0 : _a.transpile(state)) !== null && _b !== void 0 ? _b : ['catch']),
1381
1643
  state.newline,
1382
1644
  state.indent(),
1383
- state.transpileToken(this.endTryToken)
1645
+ state.transpileToken(this.tokens.endTry)
1384
1646
  ];
1385
1647
  }
1386
1648
  walk(visitor, options) {
1387
1649
  if (this.tryBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1388
- visitors_1.walk(this, 'tryBranch', visitor, options);
1389
- visitors_1.walk(this, 'catchBranch', visitor, options);
1650
+ (0, visitors_1.walk)(this, 'tryBranch', visitor, options);
1651
+ (0, visitors_1.walk)(this, 'catchStatement', visitor, options);
1390
1652
  }
1391
1653
  }
1392
1654
  }
1393
1655
  exports.TryCatchStatement = TryCatchStatement;
1656
+ class CatchStatement extends Statement {
1657
+ constructor(tokens, exceptionVariable, catchBranch) {
1658
+ super();
1659
+ this.tokens = tokens;
1660
+ this.exceptionVariable = exceptionVariable;
1661
+ this.catchBranch = catchBranch;
1662
+ }
1663
+ get range() {
1664
+ var _a, _b;
1665
+ return util_1.util.createRangeFromPositions(this.tokens.catch.range.start, ((_b = (_a = this.catchBranch) !== null && _a !== void 0 ? _a : this.exceptionVariable) !== null && _b !== void 0 ? _b : this.tokens.catch).range.end);
1666
+ }
1667
+ transpile(state) {
1668
+ var _a, _b, _c, _d;
1669
+ return [
1670
+ state.transpileToken(this.tokens.catch),
1671
+ ' ',
1672
+ (_b = (_a = this.exceptionVariable) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : 'e',
1673
+ ...((_d = (_c = this.catchBranch) === null || _c === void 0 ? void 0 : _c.transpile(state)) !== null && _d !== void 0 ? _d : [])
1674
+ ];
1675
+ }
1676
+ walk(visitor, options) {
1677
+ if (this.catchBranch && options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1678
+ (0, visitors_1.walk)(this, 'catchBranch', visitor, options);
1679
+ }
1680
+ }
1681
+ }
1682
+ exports.CatchStatement = CatchStatement;
1394
1683
  class ThrowStatement extends Statement {
1395
1684
  constructor(throwToken, expression) {
1396
1685
  var _a;
1397
1686
  super();
1398
1687
  this.throwToken = throwToken;
1399
1688
  this.expression = expression;
1400
- this.range = util_1.util.createRangeFromPositions(this.throwToken.range.start, ((_a = this.expression) !== null && _a !== void 0 ? _a : this.throwToken).range.end);
1689
+ this.range = (_a = util_1.util.createBoundingRange(this.throwToken, this.expression)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1401
1690
  }
1402
1691
  transpile(state) {
1403
1692
  const result = [
@@ -1416,9 +1705,157 @@ class ThrowStatement extends Statement {
1416
1705
  }
1417
1706
  walk(visitor, options) {
1418
1707
  if (this.expression && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1419
- visitors_1.walk(this, 'expression', visitor, options);
1708
+ (0, visitors_1.walk)(this, 'expression', visitor, options);
1420
1709
  }
1421
1710
  }
1422
1711
  }
1423
1712
  exports.ThrowStatement = ThrowStatement;
1713
+ class EnumStatement extends Statement {
1714
+ constructor(tokens, body, namespaceName) {
1715
+ var _a, _b;
1716
+ super();
1717
+ this.tokens = tokens;
1718
+ this.body = body;
1719
+ this.namespaceName = namespaceName;
1720
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1721
+ this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
1722
+ }
1723
+ getMembers() {
1724
+ const result = [];
1725
+ for (const statement of this.body) {
1726
+ if ((0, reflection_1.isEnumMemberStatement)(statement)) {
1727
+ result.push(statement);
1728
+ }
1729
+ }
1730
+ return result;
1731
+ }
1732
+ /**
1733
+ * Get a map of member names and their values.
1734
+ * All values are stored as their AST LiteralExpression representation (i.e. string enum values include the wrapping quotes)
1735
+ */
1736
+ getMemberValueMap() {
1737
+ var _a, _b, _c, _d, _e, _f, _g;
1738
+ const result = new Map();
1739
+ const members = this.getMembers();
1740
+ let currentIntValue = 0;
1741
+ for (const member of members) {
1742
+ //if there is no value, assume an integer and increment the int counter
1743
+ if (!member.value) {
1744
+ result.set((_a = member.name) === null || _a === void 0 ? void 0 : _a.toLowerCase(), currentIntValue.toString());
1745
+ currentIntValue++;
1746
+ //if explicit integer value, use it and increment the int counter
1747
+ }
1748
+ else if ((0, reflection_1.isLiteralExpression)(member.value) && member.value.token.kind === TokenKind_1.TokenKind.IntegerLiteral) {
1749
+ //try parsing as integer literal, then as hex integer literal.
1750
+ let tokenIntValue = (_b = util_1.util.parseInt(member.value.token.text)) !== null && _b !== void 0 ? _b : util_1.util.parseInt(member.value.token.text.replace(/&h/i, '0x'));
1751
+ if (tokenIntValue !== undefined) {
1752
+ currentIntValue = tokenIntValue;
1753
+ currentIntValue++;
1754
+ }
1755
+ result.set((_c = member.name) === null || _c === void 0 ? void 0 : _c.toLowerCase(), member.value.token.text);
1756
+ //all other values
1757
+ }
1758
+ else {
1759
+ result.set((_d = member.name) === null || _d === void 0 ? void 0 : _d.toLowerCase(), (_g = (_f = (_e = member.value) === null || _e === void 0 ? void 0 : _e.token) === null || _f === void 0 ? void 0 : _f.text) !== null && _g !== void 0 ? _g : 'invalid');
1760
+ }
1761
+ }
1762
+ return result;
1763
+ }
1764
+ getMemberValue(name) {
1765
+ return this.getMemberValueMap().get(name.toLowerCase());
1766
+ }
1767
+ /**
1768
+ * The name of the enum (without the namespace prefix)
1769
+ */
1770
+ get name() {
1771
+ var _a;
1772
+ return (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1773
+ }
1774
+ /**
1775
+ * The name of the enum WITH its leading namespace (if applicable)
1776
+ */
1777
+ get fullName() {
1778
+ var _a;
1779
+ const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1780
+ if (name) {
1781
+ if (this.namespaceName) {
1782
+ let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
1783
+ return `${namespaceName}.${name}`;
1784
+ }
1785
+ else {
1786
+ return name;
1787
+ }
1788
+ }
1789
+ else {
1790
+ //return undefined which will allow outside callers to know that this doesn't have a name
1791
+ return undefined;
1792
+ }
1793
+ }
1794
+ transpile(state) {
1795
+ //enum declarations do not exist at runtime, so don't transpile anything...
1796
+ return [];
1797
+ }
1798
+ getTypedef(state) {
1799
+ var _a, _b, _c;
1800
+ const result = [];
1801
+ for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1802
+ result.push(...annotation.getTypedef(state), state.newline, state.indent());
1803
+ }
1804
+ result.push((_b = this.tokens.enum.text) !== null && _b !== void 0 ? _b : 'enum', ' ', this.tokens.name.text);
1805
+ result.push(state.newline);
1806
+ state.blockDepth++;
1807
+ for (const member of this.body) {
1808
+ if ((0, reflection_1.isTypedefProvider)(member)) {
1809
+ result.push(state.indent(), ...member.getTypedef(state), state.newline);
1810
+ }
1811
+ }
1812
+ state.blockDepth--;
1813
+ result.push(state.indent(), (_c = this.tokens.endEnum.text) !== null && _c !== void 0 ? _c : 'end enum');
1814
+ return result;
1815
+ }
1816
+ walk(visitor, options) {
1817
+ if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1818
+ for (let i = 0; i < this.body.length; i++) {
1819
+ (0, visitors_1.walk)(this.body, i, visitor, options, this);
1820
+ }
1821
+ }
1822
+ }
1823
+ }
1824
+ exports.EnumStatement = EnumStatement;
1825
+ class EnumMemberStatement extends Statement {
1826
+ constructor(tokens, value) {
1827
+ var _a;
1828
+ super();
1829
+ this.tokens = tokens;
1830
+ this.value = value;
1831
+ this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1832
+ }
1833
+ /**
1834
+ * The name of the member
1835
+ */
1836
+ get name() {
1837
+ return this.tokens.name.text;
1838
+ }
1839
+ transpile(state) {
1840
+ return [];
1841
+ }
1842
+ getTypedef(state) {
1843
+ const result = [
1844
+ this.tokens.name.text
1845
+ ];
1846
+ if (this.tokens.equal) {
1847
+ result.push(' ', this.tokens.equal.text, ' ');
1848
+ if (this.value) {
1849
+ result.push(...this.value.transpile(state));
1850
+ }
1851
+ }
1852
+ return result;
1853
+ }
1854
+ walk(visitor, options) {
1855
+ if (this.value && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1856
+ (0, visitors_1.walk)(this, 'value', visitor, options);
1857
+ }
1858
+ }
1859
+ }
1860
+ exports.EnumMemberStatement = EnumMemberStatement;
1424
1861
  //# sourceMappingURL=Statement.js.map