brighterscript 1.0.0-alpha.2 → 1.0.0-alpha.22

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