brighterscript 1.0.0-alpha.24 → 1.0.0-alpha.25

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 (530) hide show
  1. package/CHANGELOG.md +493 -233
  2. package/README.md +45 -139
  3. package/bsconfig.schema.json +41 -0
  4. package/dist/ActionPipeline.d.ts +10 -0
  5. package/dist/ActionPipeline.js +40 -0
  6. package/dist/ActionPipeline.js.map +1 -0
  7. package/dist/AstValidationSegmenter.d.ts +25 -0
  8. package/dist/AstValidationSegmenter.js +152 -0
  9. package/dist/AstValidationSegmenter.js.map +1 -0
  10. package/dist/BsConfig.d.ts +39 -4
  11. package/dist/BusyStatusTracker.d.ts +31 -0
  12. package/dist/BusyStatusTracker.js +83 -0
  13. package/dist/BusyStatusTracker.js.map +1 -0
  14. package/dist/Cache.js +3 -3
  15. package/dist/Cache.js.map +1 -1
  16. package/dist/CacheVerifier.d.ts +7 -0
  17. package/dist/CacheVerifier.js +20 -0
  18. package/dist/CacheVerifier.js.map +1 -0
  19. package/dist/CodeActionUtil.d.ts +3 -3
  20. package/dist/CodeActionUtil.js.map +1 -1
  21. package/dist/CommentFlagProcessor.d.ts +3 -2
  22. package/dist/CommentFlagProcessor.js +5 -4
  23. package/dist/CommentFlagProcessor.js.map +1 -1
  24. package/dist/DependencyGraph.d.ts +3 -2
  25. package/dist/DependencyGraph.js +11 -10
  26. package/dist/DependencyGraph.js.map +1 -1
  27. package/dist/DiagnosticCollection.js +9 -5
  28. package/dist/DiagnosticCollection.js.map +1 -1
  29. package/dist/DiagnosticFilterer.d.ts +1 -0
  30. package/dist/DiagnosticFilterer.js +5 -3
  31. package/dist/DiagnosticFilterer.js.map +1 -1
  32. package/dist/DiagnosticMessages.d.ts +61 -13
  33. package/dist/DiagnosticMessages.js +116 -19
  34. package/dist/DiagnosticMessages.js.map +1 -1
  35. package/dist/DiagnosticSeverityAdjuster.d.ts +7 -0
  36. package/dist/DiagnosticSeverityAdjuster.js +41 -0
  37. package/dist/DiagnosticSeverityAdjuster.js.map +1 -0
  38. package/dist/FunctionScope.d.ts +28 -0
  39. package/dist/FunctionScope.js +52 -0
  40. package/dist/FunctionScope.js.map +1 -0
  41. package/dist/KeyedThrottler.d.ts +3 -3
  42. package/dist/KeyedThrottler.js +3 -3
  43. package/dist/KeyedThrottler.js.map +1 -1
  44. package/dist/LanguageServer.d.ts +23 -11
  45. package/dist/LanguageServer.js +150 -69
  46. package/dist/LanguageServer.js.map +1 -1
  47. package/dist/Logger.d.ts +3 -2
  48. package/dist/Logger.js +11 -3
  49. package/dist/Logger.js.map +1 -1
  50. package/dist/PluginInterface.d.ts +21 -3
  51. package/dist/PluginInterface.js +74 -6
  52. package/dist/PluginInterface.js.map +1 -1
  53. package/dist/Program.d.ts +158 -79
  54. package/dist/Program.js +831 -695
  55. package/dist/Program.js.map +1 -1
  56. package/dist/ProgramBuilder.d.ts +22 -12
  57. package/dist/ProgramBuilder.js +130 -103
  58. package/dist/ProgramBuilder.js.map +1 -1
  59. package/dist/Scope.d.ts +87 -133
  60. package/dist/Scope.js +450 -510
  61. package/dist/Scope.js.map +1 -1
  62. package/dist/Stopwatch.js +1 -1
  63. package/dist/Stopwatch.js.map +1 -1
  64. package/dist/SymbolTable.d.ts +89 -34
  65. package/dist/SymbolTable.js +239 -114
  66. package/dist/SymbolTable.js.map +1 -1
  67. package/dist/Throttler.d.ts +12 -0
  68. package/dist/Throttler.js +39 -0
  69. package/dist/Throttler.js.map +1 -1
  70. package/dist/Watcher.d.ts +0 -3
  71. package/dist/Watcher.js +0 -3
  72. package/dist/Watcher.js.map +1 -1
  73. package/dist/XmlScope.d.ts +4 -6
  74. package/dist/XmlScope.js +74 -69
  75. package/dist/XmlScope.js.map +1 -1
  76. package/dist/astUtils/CachedLookups.d.ts +48 -0
  77. package/dist/astUtils/CachedLookups.js +323 -0
  78. package/dist/astUtils/CachedLookups.js.map +1 -0
  79. package/dist/astUtils/{AstEditor.d.ts → Editor.d.ts} +9 -5
  80. package/dist/astUtils/{AstEditor.js → Editor.js} +10 -4
  81. package/dist/astUtils/Editor.js.map +1 -0
  82. package/dist/astUtils/{AstEditor.spec.js → Editor.spec.js} +68 -64
  83. package/dist/astUtils/Editor.spec.js.map +1 -0
  84. package/dist/astUtils/creators.d.ts +10 -10
  85. package/dist/astUtils/creators.js +26 -16
  86. package/dist/astUtils/creators.js.map +1 -1
  87. package/dist/astUtils/creators.spec.js +5 -5
  88. package/dist/astUtils/creators.spec.js.map +1 -1
  89. package/dist/astUtils/reflection.d.ts +132 -104
  90. package/dist/astUtils/reflection.js +220 -174
  91. package/dist/astUtils/reflection.js.map +1 -1
  92. package/dist/astUtils/reflection.spec.js +208 -126
  93. package/dist/astUtils/reflection.spec.js.map +1 -1
  94. package/dist/astUtils/stackedVisitor.spec.js +12 -12
  95. package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
  96. package/dist/astUtils/visitors.d.ts +53 -35
  97. package/dist/astUtils/visitors.js +29 -3
  98. package/dist/astUtils/visitors.js.map +1 -1
  99. package/dist/astUtils/visitors.spec.js +178 -33
  100. package/dist/astUtils/visitors.spec.js.map +1 -1
  101. package/dist/astUtils/xml.d.ts +9 -9
  102. package/dist/astUtils/xml.js +9 -9
  103. package/dist/astUtils/xml.js.map +1 -1
  104. package/dist/bscPlugin/BscPlugin.d.ts +10 -2
  105. package/dist/bscPlugin/BscPlugin.js +33 -3
  106. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  107. package/dist/bscPlugin/CallExpressionInfo.d.ts +36 -0
  108. package/dist/bscPlugin/CallExpressionInfo.js +131 -0
  109. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -0
  110. package/dist/bscPlugin/FileWriter.d.ts +6 -0
  111. package/dist/bscPlugin/FileWriter.js +24 -0
  112. package/dist/bscPlugin/FileWriter.js.map +1 -0
  113. package/dist/bscPlugin/SignatureHelpUtil.d.ts +10 -0
  114. package/dist/bscPlugin/SignatureHelpUtil.js +135 -0
  115. package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -0
  116. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +14 -11
  117. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  118. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +16 -16
  119. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  120. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +52 -1
  121. package/dist/bscPlugin/completions/CompletionsProcessor.js +517 -26
  122. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
  123. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +1909 -0
  124. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -0
  125. package/dist/bscPlugin/fileProviders/FileProvider.d.ts +9 -0
  126. package/dist/bscPlugin/fileProviders/FileProvider.js +51 -0
  127. package/dist/bscPlugin/fileProviders/FileProvider.js.map +1 -0
  128. package/dist/bscPlugin/hover/HoverProcessor.d.ts +7 -7
  129. package/dist/bscPlugin/hover/HoverProcessor.js +123 -125
  130. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  131. package/dist/bscPlugin/hover/HoverProcessor.spec.js +371 -53
  132. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  133. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +2 -1
  134. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +85 -23
  135. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  136. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +83 -6
  137. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  138. package/dist/bscPlugin/serialize/BslibInjector.spec.js +19 -0
  139. package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
  140. package/dist/bscPlugin/serialize/BslibManager.d.ts +9 -0
  141. package/dist/bscPlugin/serialize/BslibManager.js +40 -0
  142. package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
  143. package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
  144. package/dist/bscPlugin/serialize/FileSerializer.js +72 -0
  145. package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
  146. package/dist/bscPlugin/transpile/{BrsFilePreTranspileProcessor.d.ts → BrsFileTranspileProcessor.d.ts} +4 -2
  147. package/dist/bscPlugin/transpile/{BrsFilePreTranspileProcessor.js → BrsFileTranspileProcessor.js} +33 -9
  148. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -0
  149. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.d.ts +1 -0
  150. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js +41 -0
  151. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +1 -0
  152. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +12 -0
  153. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +99 -0
  154. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
  155. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +13 -5
  156. package/dist/bscPlugin/validation/BrsFileValidator.js +259 -49
  157. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  158. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +230 -14
  159. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -1
  160. package/dist/bscPlugin/validation/ProgramValidator.d.ts +10 -0
  161. package/dist/bscPlugin/validation/ProgramValidator.js +32 -0
  162. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -0
  163. package/dist/bscPlugin/validation/ScopeValidator.d.ts +54 -27
  164. package/dist/bscPlugin/validation/ScopeValidator.js +483 -286
  165. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  166. package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +1 -0
  167. package/dist/bscPlugin/validation/ScopeValidator.spec.js +2454 -0
  168. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -0
  169. package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
  170. package/dist/bscPlugin/validation/XmlFileValidator.js +44 -0
  171. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
  172. package/dist/cli.js +104 -13
  173. package/dist/cli.js.map +1 -1
  174. package/dist/deferred.d.ts +3 -3
  175. package/dist/deferred.js.map +1 -1
  176. package/dist/diagnosticUtils.d.ts +8 -2
  177. package/dist/diagnosticUtils.js +47 -17
  178. package/dist/diagnosticUtils.js.map +1 -1
  179. package/dist/examples/plugins/removePrint.js +8 -10
  180. package/dist/examples/plugins/removePrint.js.map +1 -1
  181. package/dist/files/AssetFile.d.ts +26 -0
  182. package/dist/files/AssetFile.js +26 -0
  183. package/dist/files/AssetFile.js.map +1 -0
  184. package/dist/files/BrsFile.Class.spec.js +523 -493
  185. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  186. package/dist/files/BrsFile.d.ts +112 -111
  187. package/dist/files/BrsFile.js +741 -1032
  188. package/dist/files/BrsFile.js.map +1 -1
  189. package/dist/files/BrsFile.spec.js +1728 -1232
  190. package/dist/files/BrsFile.spec.js.map +1 -1
  191. package/dist/files/BscFile.d.ts +104 -0
  192. package/dist/files/BscFile.js +16 -0
  193. package/dist/files/BscFile.js.map +1 -0
  194. package/dist/files/Factory.d.ts +25 -0
  195. package/dist/files/Factory.js +22 -0
  196. package/dist/files/Factory.js.map +1 -0
  197. package/dist/files/LazyFileData.d.ts +20 -0
  198. package/dist/files/LazyFileData.js +54 -0
  199. package/dist/files/LazyFileData.js.map +1 -0
  200. package/dist/files/LazyFileData.spec.d.ts +1 -0
  201. package/dist/files/LazyFileData.spec.js +27 -0
  202. package/dist/files/LazyFileData.spec.js.map +1 -0
  203. package/dist/files/XmlFile.d.ts +70 -32
  204. package/dist/files/XmlFile.js +106 -118
  205. package/dist/files/XmlFile.js.map +1 -1
  206. package/dist/files/XmlFile.spec.js +325 -262
  207. package/dist/files/XmlFile.spec.js.map +1 -1
  208. package/dist/files/tests/imports.spec.js +48 -40
  209. package/dist/files/tests/imports.spec.js.map +1 -1
  210. package/dist/files/tests/optionalChaning.spec.js +84 -24
  211. package/dist/files/tests/optionalChaning.spec.js.map +1 -1
  212. package/dist/globalCallables.js +16 -21
  213. package/dist/globalCallables.js.map +1 -1
  214. package/dist/index.d.ts +12 -1
  215. package/dist/index.js +12 -1
  216. package/dist/index.js.map +1 -1
  217. package/dist/interfaces.d.ts +389 -161
  218. package/dist/interfaces.js +27 -0
  219. package/dist/interfaces.js.map +1 -1
  220. package/dist/lexer/Character.spec.js +5 -5
  221. package/dist/lexer/Character.spec.js.map +1 -1
  222. package/dist/lexer/Lexer.d.ts +12 -5
  223. package/dist/lexer/Lexer.js +28 -13
  224. package/dist/lexer/Lexer.js.map +1 -1
  225. package/dist/lexer/Lexer.spec.js +181 -135
  226. package/dist/lexer/Lexer.spec.js.map +1 -1
  227. package/dist/lexer/Token.d.ts +9 -1
  228. package/dist/lexer/Token.js +9 -1
  229. package/dist/lexer/Token.js.map +1 -1
  230. package/dist/lexer/TokenKind.d.ts +8 -0
  231. package/dist/lexer/TokenKind.js +24 -4
  232. package/dist/lexer/TokenKind.js.map +1 -1
  233. package/dist/parser/AstNode.d.ts +162 -0
  234. package/dist/parser/AstNode.js +225 -0
  235. package/dist/parser/AstNode.js.map +1 -0
  236. package/dist/parser/AstNode.spec.d.ts +1 -0
  237. package/dist/parser/AstNode.spec.js +165 -0
  238. package/dist/parser/AstNode.spec.js.map +1 -0
  239. package/dist/parser/BrsTranspileState.d.ts +4 -7
  240. package/dist/parser/BrsTranspileState.js +4 -12
  241. package/dist/parser/BrsTranspileState.js.map +1 -1
  242. package/dist/parser/Expression.d.ts +126 -176
  243. package/dist/parser/Expression.js +523 -405
  244. package/dist/parser/Expression.js.map +1 -1
  245. package/dist/parser/Parser.Class.spec.js +151 -145
  246. package/dist/parser/Parser.Class.spec.js.map +1 -1
  247. package/dist/parser/Parser.d.ts +43 -201
  248. package/dist/parser/Parser.js +446 -962
  249. package/dist/parser/Parser.js.map +1 -1
  250. package/dist/parser/Parser.spec.d.ts +3 -1
  251. package/dist/parser/Parser.spec.js +1002 -846
  252. package/dist/parser/Parser.spec.js.map +1 -1
  253. package/dist/parser/SGParser.d.ts +9 -8
  254. package/dist/parser/SGParser.js +10 -8
  255. package/dist/parser/SGParser.js.map +1 -1
  256. package/dist/parser/SGParser.spec.js +27 -38
  257. package/dist/parser/SGParser.spec.js.map +1 -1
  258. package/dist/parser/SGTypes.d.ts +98 -35
  259. package/dist/parser/SGTypes.js +169 -99
  260. package/dist/parser/SGTypes.js.map +1 -1
  261. package/dist/parser/Statement.d.ts +183 -131
  262. package/dist/parser/Statement.js +549 -387
  263. package/dist/parser/Statement.js.map +1 -1
  264. package/dist/parser/Statement.spec.js +45 -21
  265. package/dist/parser/Statement.spec.js.map +1 -1
  266. package/dist/parser/TranspileState.d.ts +1 -1
  267. package/dist/parser/TranspileState.js +7 -12
  268. package/dist/parser/TranspileState.js.map +1 -1
  269. package/dist/parser/tests/Parser.spec.js +3 -2
  270. package/dist/parser/tests/Parser.spec.js.map +1 -1
  271. package/dist/parser/tests/controlFlow/For.spec.js +33 -23
  272. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  273. package/dist/parser/tests/controlFlow/ForEach.spec.js +25 -20
  274. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  275. package/dist/parser/tests/controlFlow/If.spec.js +96 -94
  276. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  277. package/dist/parser/tests/controlFlow/While.spec.js +22 -16
  278. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  279. package/dist/parser/tests/expression/Additive.spec.js +8 -8
  280. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  281. package/dist/parser/tests/expression/ArrayLiterals.spec.js +58 -21
  282. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  283. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +61 -20
  284. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  285. package/dist/parser/tests/expression/Boolean.spec.js +8 -8
  286. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  287. package/dist/parser/tests/expression/Call.spec.js +129 -21
  288. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  289. package/dist/parser/tests/expression/Exponential.spec.js +5 -5
  290. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  291. package/dist/parser/tests/expression/Function.spec.js +36 -36
  292. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  293. package/dist/parser/tests/expression/Indexing.spec.js +67 -22
  294. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  295. package/dist/parser/tests/expression/Multiplicative.spec.js +9 -9
  296. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  297. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +59 -59
  298. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  299. package/dist/parser/tests/expression/PrefixUnary.spec.js +12 -12
  300. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  301. package/dist/parser/tests/expression/Primary.spec.js +12 -12
  302. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  303. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +10 -10
  304. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
  305. package/dist/parser/tests/expression/Relational.spec.js +13 -13
  306. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  307. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +24 -24
  308. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  309. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +96 -57
  310. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  311. package/dist/parser/tests/expression/TernaryExpression.spec.js +89 -89
  312. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  313. package/dist/parser/tests/expression/TypeExpression.spec.d.ts +1 -0
  314. package/dist/parser/tests/expression/TypeExpression.spec.js +127 -0
  315. package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -0
  316. package/dist/parser/tests/expression/UnaryExpression.spec.d.ts +1 -0
  317. package/dist/parser/tests/expression/UnaryExpression.spec.js +52 -0
  318. package/dist/parser/tests/expression/UnaryExpression.spec.js.map +1 -0
  319. package/dist/parser/tests/statement/AssignmentOperators.spec.js +15 -15
  320. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  321. package/dist/parser/tests/statement/ConstStatement.spec.js +82 -33
  322. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -1
  323. package/dist/parser/tests/statement/Continue.spec.d.ts +1 -0
  324. package/dist/parser/tests/statement/Continue.spec.js +119 -0
  325. package/dist/parser/tests/statement/Continue.spec.js.map +1 -0
  326. package/dist/parser/tests/statement/Declaration.spec.js +19 -19
  327. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  328. package/dist/parser/tests/statement/Dim.spec.js +22 -22
  329. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  330. package/dist/parser/tests/statement/Enum.spec.js +98 -302
  331. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  332. package/dist/parser/tests/statement/For.spec.js +9 -10
  333. package/dist/parser/tests/statement/For.spec.js.map +1 -1
  334. package/dist/parser/tests/statement/ForEach.spec.js +8 -9
  335. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -1
  336. package/dist/parser/tests/statement/Function.spec.js +44 -35
  337. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  338. package/dist/parser/tests/statement/Goto.spec.js +5 -5
  339. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  340. package/dist/parser/tests/statement/Increment.spec.js +20 -20
  341. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  342. package/dist/parser/tests/statement/InterfaceStatement.spec.js +30 -196
  343. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  344. package/dist/parser/tests/statement/LibraryStatement.spec.js +11 -11
  345. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  346. package/dist/parser/tests/statement/Misc.spec.js +16 -78
  347. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  348. package/dist/parser/tests/statement/PrintStatement.spec.js +35 -33
  349. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  350. package/dist/parser/tests/statement/ReturnStatement.spec.js +14 -12
  351. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  352. package/dist/parser/tests/statement/Set.spec.js +48 -35
  353. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  354. package/dist/parser/tests/statement/Stop.spec.js +6 -6
  355. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  356. package/dist/parser/tests/statement/Throw.spec.js +6 -6
  357. package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
  358. package/dist/parser/tests/statement/TryCatch.spec.js +18 -16
  359. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  360. package/dist/preprocessor/Manifest.d.ts +1 -1
  361. package/dist/preprocessor/Manifest.js +2 -2
  362. package/dist/preprocessor/Manifest.js.map +1 -1
  363. package/dist/preprocessor/Manifest.spec.js +8 -8
  364. package/dist/preprocessor/Manifest.spec.js.map +1 -1
  365. package/dist/preprocessor/Preprocessor.d.ts +5 -6
  366. package/dist/preprocessor/Preprocessor.js +5 -5
  367. package/dist/preprocessor/Preprocessor.js.map +1 -1
  368. package/dist/preprocessor/Preprocessor.spec.js +25 -25
  369. package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
  370. package/dist/preprocessor/PreprocessorParser.d.ts +1 -1
  371. package/dist/preprocessor/PreprocessorParser.js +7 -1
  372. package/dist/preprocessor/PreprocessorParser.js.map +1 -1
  373. package/dist/preprocessor/PreprocessorParser.spec.js +13 -13
  374. package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
  375. package/dist/roku-types/data.json +5892 -10081
  376. package/dist/roku-types/index.d.ts +622 -1719
  377. package/dist/types/ArrayType.d.ts +10 -9
  378. package/dist/types/ArrayType.js +65 -60
  379. package/dist/types/ArrayType.js.map +1 -1
  380. package/dist/types/ArrayType.spec.js +36 -68
  381. package/dist/types/ArrayType.spec.js.map +1 -1
  382. package/dist/types/AssociativeArrayType.d.ts +11 -0
  383. package/dist/types/AssociativeArrayType.js +52 -0
  384. package/dist/types/AssociativeArrayType.js.map +1 -0
  385. package/dist/types/BaseFunctionType.d.ts +9 -0
  386. package/dist/types/BaseFunctionType.js +25 -0
  387. package/dist/types/BaseFunctionType.js.map +1 -0
  388. package/dist/types/BooleanType.d.ts +8 -5
  389. package/dist/types/BooleanType.js +14 -7
  390. package/dist/types/BooleanType.js.map +1 -1
  391. package/dist/types/BooleanType.spec.js +10 -6
  392. package/dist/types/BooleanType.spec.js.map +1 -1
  393. package/dist/types/BscType.d.ts +32 -21
  394. package/dist/types/BscType.js +118 -21
  395. package/dist/types/BscType.js.map +1 -1
  396. package/dist/types/BscTypeKind.d.ts +25 -0
  397. package/dist/types/BscTypeKind.js +30 -0
  398. package/dist/types/BscTypeKind.js.map +1 -0
  399. package/dist/types/BuiltInInterfaceAdder.d.ts +23 -0
  400. package/dist/types/BuiltInInterfaceAdder.js +164 -0
  401. package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
  402. package/dist/types/BuiltInInterfaceAdder.spec.d.ts +1 -0
  403. package/dist/types/BuiltInInterfaceAdder.spec.js +116 -0
  404. package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -0
  405. package/dist/types/ClassType.d.ts +17 -0
  406. package/dist/types/ClassType.js +58 -0
  407. package/dist/types/ClassType.js.map +1 -0
  408. package/dist/types/ClassType.spec.d.ts +1 -0
  409. package/dist/types/ClassType.spec.js +77 -0
  410. package/dist/types/ClassType.spec.js.map +1 -0
  411. package/dist/types/ComponentType.d.ts +26 -0
  412. package/dist/types/ComponentType.js +83 -0
  413. package/dist/types/ComponentType.js.map +1 -0
  414. package/dist/types/DoubleType.d.ts +8 -5
  415. package/dist/types/DoubleType.js +18 -16
  416. package/dist/types/DoubleType.js.map +1 -1
  417. package/dist/types/DoubleType.spec.js +12 -6
  418. package/dist/types/DoubleType.spec.js.map +1 -1
  419. package/dist/types/DynamicType.d.ts +9 -5
  420. package/dist/types/DynamicType.js +15 -4
  421. package/dist/types/DynamicType.js.map +1 -1
  422. package/dist/types/DynamicType.spec.js +16 -5
  423. package/dist/types/DynamicType.spec.js.map +1 -1
  424. package/dist/types/EnumType.d.ts +30 -12
  425. package/dist/types/EnumType.js +43 -17
  426. package/dist/types/EnumType.js.map +1 -1
  427. package/dist/types/EnumType.spec.d.ts +1 -0
  428. package/dist/types/EnumType.spec.js +33 -0
  429. package/dist/types/EnumType.spec.js.map +1 -0
  430. package/dist/types/FloatType.d.ts +8 -5
  431. package/dist/types/FloatType.js +18 -16
  432. package/dist/types/FloatType.js.map +1 -1
  433. package/dist/types/FloatType.spec.js +4 -6
  434. package/dist/types/FloatType.spec.js.map +1 -1
  435. package/dist/types/FunctionType.d.ts +13 -8
  436. package/dist/types/FunctionType.js +30 -14
  437. package/dist/types/FunctionType.js.map +1 -1
  438. package/dist/types/InheritableType.d.ts +28 -0
  439. package/dist/types/InheritableType.js +152 -0
  440. package/dist/types/InheritableType.js.map +1 -0
  441. package/dist/types/IntegerType.d.ts +8 -5
  442. package/dist/types/IntegerType.js +18 -16
  443. package/dist/types/IntegerType.js.map +1 -1
  444. package/dist/types/IntegerType.spec.js +8 -6
  445. package/dist/types/IntegerType.spec.js.map +1 -1
  446. package/dist/types/InterfaceType.d.ts +12 -13
  447. package/dist/types/InterfaceType.js +20 -48
  448. package/dist/types/InterfaceType.js.map +1 -1
  449. package/dist/types/InterfaceType.spec.js +90 -56
  450. package/dist/types/InterfaceType.spec.js.map +1 -1
  451. package/dist/types/InvalidType.d.ts +7 -5
  452. package/dist/types/InvalidType.js +13 -7
  453. package/dist/types/InvalidType.js.map +1 -1
  454. package/dist/types/InvalidType.spec.js +8 -6
  455. package/dist/types/InvalidType.spec.js.map +1 -1
  456. package/dist/types/LongIntegerType.d.ts +8 -5
  457. package/dist/types/LongIntegerType.js +17 -15
  458. package/dist/types/LongIntegerType.js.map +1 -1
  459. package/dist/types/LongIntegerType.spec.js +10 -6
  460. package/dist/types/LongIntegerType.spec.js.map +1 -1
  461. package/dist/types/NamespaceType.d.ts +12 -0
  462. package/dist/types/NamespaceType.js +28 -0
  463. package/dist/types/NamespaceType.js.map +1 -0
  464. package/dist/types/ObjectType.d.ts +9 -8
  465. package/dist/types/ObjectType.js +21 -11
  466. package/dist/types/ObjectType.js.map +1 -1
  467. package/dist/types/ObjectType.spec.js +3 -3
  468. package/dist/types/ObjectType.spec.js.map +1 -1
  469. package/dist/types/ReferenceType.d.ts +63 -0
  470. package/dist/types/ReferenceType.js +423 -0
  471. package/dist/types/ReferenceType.js.map +1 -0
  472. package/dist/types/ReferenceType.spec.d.ts +1 -0
  473. package/dist/types/ReferenceType.spec.js +137 -0
  474. package/dist/types/ReferenceType.spec.js.map +1 -0
  475. package/dist/types/StringType.d.ts +11 -5
  476. package/dist/types/StringType.js +18 -7
  477. package/dist/types/StringType.js.map +1 -1
  478. package/dist/types/StringType.spec.js +3 -5
  479. package/dist/types/StringType.spec.js.map +1 -1
  480. package/dist/types/TypedFunctionType.d.ts +22 -17
  481. package/dist/types/TypedFunctionType.js +78 -60
  482. package/dist/types/TypedFunctionType.js.map +1 -1
  483. package/dist/types/TypedFunctionType.spec.js +105 -20
  484. package/dist/types/TypedFunctionType.spec.js.map +1 -1
  485. package/dist/types/UninitializedType.d.ts +8 -6
  486. package/dist/types/UninitializedType.js +13 -7
  487. package/dist/types/UninitializedType.js.map +1 -1
  488. package/dist/types/UnionType.d.ts +20 -0
  489. package/dist/types/UnionType.js +123 -0
  490. package/dist/types/UnionType.js.map +1 -0
  491. package/dist/types/UnionType.spec.d.ts +1 -0
  492. package/dist/types/UnionType.spec.js +130 -0
  493. package/dist/types/UnionType.spec.js.map +1 -0
  494. package/dist/types/VoidType.d.ts +8 -5
  495. package/dist/types/VoidType.js +14 -7
  496. package/dist/types/VoidType.js.map +1 -1
  497. package/dist/types/VoidType.spec.js +3 -3
  498. package/dist/types/VoidType.spec.js.map +1 -1
  499. package/dist/types/helper.spec.d.ts +1 -0
  500. package/dist/types/helper.spec.js +145 -0
  501. package/dist/types/helper.spec.js.map +1 -0
  502. package/dist/types/helpers.d.ts +19 -37
  503. package/dist/types/helpers.js +159 -99
  504. package/dist/types/helpers.js.map +1 -1
  505. package/dist/types/index.d.ts +22 -0
  506. package/dist/types/index.js +39 -0
  507. package/dist/types/index.js.map +1 -0
  508. package/dist/util.d.ts +132 -137
  509. package/dist/util.js +796 -362
  510. package/dist/util.js.map +1 -1
  511. package/dist/validators/ClassValidator.d.ts +8 -25
  512. package/dist/validators/ClassValidator.js +96 -176
  513. package/dist/validators/ClassValidator.js.map +1 -1
  514. package/package.json +165 -152
  515. package/dist/astUtils/AstEditor.js.map +0 -1
  516. package/dist/astUtils/AstEditor.spec.js.map +0 -1
  517. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +0 -1
  518. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +0 -32
  519. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +0 -1
  520. package/dist/parser/SGTypes.spec.js +0 -351
  521. package/dist/parser/SGTypes.spec.js.map +0 -1
  522. package/dist/types/CustomType.d.ts +0 -12
  523. package/dist/types/CustomType.js +0 -44
  524. package/dist/types/CustomType.js.map +0 -1
  525. package/dist/types/LazyType.d.ts +0 -16
  526. package/dist/types/LazyType.js +0 -44
  527. package/dist/types/LazyType.js.map +0 -1
  528. /package/dist/astUtils/{AstEditor.spec.d.ts → Editor.spec.d.ts} +0 -0
  529. /package/dist/bscPlugin/{transpile/BrsFilePreTranspileProcessor.spec.d.ts → completions/CompletionsProcessor.spec.d.ts} +0 -0
  530. /package/dist/{parser/SGTypes.spec.d.ts → bscPlugin/serialize/BslibInjector.spec.d.ts} +0 -0
@@ -1,39 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ConstStatement = exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.FieldStatement = exports.MethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = exports.Statement = void 0;
3
+ exports.ContinueStatement = exports.ConstStatement = exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.FieldStatement = exports.MethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = void 0;
4
4
  const TokenKind_1 = require("../lexer/TokenKind");
5
5
  const Expression_1 = require("./Expression");
6
6
  const util_1 = require("../util");
7
7
  const Parser_1 = require("./Parser");
8
8
  const visitors_1 = require("../astUtils/visitors");
9
9
  const reflection_1 = require("../astUtils/reflection");
10
+ const interfaces_1 = require("../interfaces");
11
+ const SymbolTable_1 = require("../SymbolTable");
10
12
  const creators_1 = require("../astUtils/creators");
11
13
  const DynamicType_1 = require("../types/DynamicType");
12
- const SymbolTable_1 = require("../SymbolTable");
13
- const CustomType_1 = require("../types/CustomType");
14
+ const SymbolTable_2 = require("../SymbolTable");
15
+ const AstNode_1 = require("./AstNode");
16
+ const AstNode_2 = require("./AstNode");
17
+ const ClassType_1 = require("../types/ClassType");
14
18
  const EnumType_1 = require("../types/EnumType");
15
- const FunctionType_1 = require("../types/FunctionType");
19
+ const NamespaceType_1 = require("../types/NamespaceType");
16
20
  const InterfaceType_1 = require("../types/InterfaceType");
17
- /**
18
- * A BrightScript statement
19
- */
20
- class Statement {
21
- constructor() {
22
- /**
23
- * When being considered by the walk visitor, this describes what type of element the current class is.
24
- */
25
- this.visitMode = visitors_1.InternalWalkMode.visitStatements;
26
- }
27
- /**
28
- * Get the closest symbol table for this node. Should be overridden in children that directly contain a symbol table
29
- */
30
- getSymbolTable() {
31
- var _a;
32
- return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable();
33
- }
34
- }
35
- exports.Statement = Statement;
36
- class EmptyStatement extends Statement {
21
+ const VoidType_1 = require("../types/VoidType");
22
+ const TypedFunctionType_1 = require("../types/TypedFunctionType");
23
+ class EmptyStatement extends AstNode_2.Statement {
37
24
  constructor(
38
25
  /**
39
26
  * Create a negative range to indicate this is an interpolated location
@@ -41,6 +28,7 @@ class EmptyStatement extends Statement {
41
28
  range = creators_1.interpolatedRange) {
42
29
  super();
43
30
  this.range = range;
31
+ this.kind = AstNode_1.AstNodeKind.EmptyStatement;
44
32
  }
45
33
  transpile(state) {
46
34
  return [];
@@ -53,18 +41,17 @@ exports.EmptyStatement = EmptyStatement;
53
41
  /**
54
42
  * This is a top-level statement. Consider this the root of the AST
55
43
  */
56
- class Body extends Statement {
57
- constructor(statements = [], symbolTable = new SymbolTable_1.SymbolTable(undefined, `Body`)) {
44
+ class Body extends AstNode_2.Statement {
45
+ constructor(statements = []) {
58
46
  super();
59
47
  this.statements = statements;
60
- this.symbolTable = symbolTable;
61
- }
62
- getSymbolTable() {
63
- return this.symbolTable;
48
+ this.kind = AstNode_1.AstNodeKind.Body;
49
+ this.symbolTable = new SymbolTable_2.SymbolTable('Body', () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
64
50
  }
65
51
  get range() {
66
- var _a, _b, _c, _d;
67
- return util_1.util.createRangeFromPositions((_b = (_a = this.statements[0]) === null || _a === void 0 ? void 0 : _a.range.start) !== null && _b !== void 0 ? _b : util_1.util.createPosition(0, 0), (_d = (_c = this.statements[this.statements.length - 1]) === null || _c === void 0 ? void 0 : _c.range.end) !== null && _d !== void 0 ? _d : util_1.util.createPosition(0, 0));
52
+ var _a;
53
+ //this needs to be a getter because the body has its statements pushed to it after being constructed
54
+ return util_1.util.createBoundingRange(...((_a = this.statements) !== null && _a !== void 0 ? _a : []));
68
55
  }
69
56
  transpile(state) {
70
57
  let result = [];
@@ -112,15 +99,16 @@ class Body extends Statement {
112
99
  }
113
100
  }
114
101
  exports.Body = Body;
115
- class AssignmentStatement extends Statement {
116
- constructor(name, equals, value, containingFunction) {
117
- var _a;
102
+ class AssignmentStatement extends AstNode_2.Statement {
103
+ constructor(equals, name, value, asToken, typeExpression) {
118
104
  super();
119
- this.name = name;
120
105
  this.equals = equals;
106
+ this.name = name;
121
107
  this.value = value;
122
- this.containingFunction = containingFunction;
123
- this.range = (_a = util_1.util.createBoundingRange(this.name, this.equals, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
108
+ this.asToken = asToken;
109
+ this.typeExpression = typeExpression;
110
+ this.kind = AstNode_1.AstNodeKind.AssignmentStatement;
111
+ this.range = util_1.util.createBoundingRange(name, equals, value);
124
112
  }
125
113
  transpile(state) {
126
114
  var _a, _b;
@@ -140,18 +128,28 @@ class AssignmentStatement extends Statement {
140
128
  }
141
129
  walk(visitor, options) {
142
130
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
131
+ //TODO: Walk TypeExpression. We need to decide how to implement types on assignments
143
132
  (0, visitors_1.walk)(this, 'value', visitor, options);
144
133
  }
145
134
  }
135
+ getType(options) {
136
+ // TODO: Do we still need this.typeExpression?
137
+ var _a;
138
+ // Note: compound assignments (eg. +=) are internally dealt with via the RHS being a BinaryExpression
139
+ // so this.value will be a BinaryExpression, and BinaryExpressions can figure out their own types
140
+ const rhs = this.value.getType(Object.assign(Object.assign({}, options), { typeChain: undefined }));
141
+ (_a = options.typeChain) === null || _a === void 0 ? void 0 : _a.push(new interfaces_1.TypeChainEntry(this.name.text, rhs, options.data, this.name.range));
142
+ return rhs;
143
+ }
146
144
  }
147
145
  exports.AssignmentStatement = AssignmentStatement;
148
- class Block extends Statement {
146
+ class Block extends AstNode_2.Statement {
149
147
  constructor(statements, startingRange) {
150
- var _a;
151
148
  super();
152
149
  this.statements = statements;
153
150
  this.startingRange = startingRange;
154
- this.range = (_a = util_1.util.createBoundingRange({ range: this.startingRange }, ...statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
151
+ this.kind = AstNode_1.AstNodeKind.Block;
152
+ this.range = util_1.util.createBoundingRange({ range: this.startingRange }, ...(statements !== null && statements !== void 0 ? statements : []));
155
153
  }
156
154
  transpile(state) {
157
155
  state.blockDepth++;
@@ -184,12 +182,12 @@ class Block extends Statement {
184
182
  }
185
183
  }
186
184
  exports.Block = Block;
187
- class ExpressionStatement extends Statement {
185
+ class ExpressionStatement extends AstNode_2.Statement {
188
186
  constructor(expression) {
189
- var _a, _b;
190
187
  super();
191
188
  this.expression = expression;
192
- this.range = (_b = (_a = this.expression) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
189
+ this.kind = AstNode_1.AstNodeKind.ExpressionStatement;
190
+ this.range = this.expression.range;
193
191
  }
194
192
  transpile(state) {
195
193
  return this.expression.transpile(state);
@@ -201,13 +199,16 @@ class ExpressionStatement extends Statement {
201
199
  }
202
200
  }
203
201
  exports.ExpressionStatement = ExpressionStatement;
204
- class CommentStatement extends Statement {
202
+ class CommentStatement extends AstNode_2.Statement {
205
203
  constructor(comments) {
206
204
  var _a;
207
205
  super();
208
206
  this.comments = comments;
209
- this.range = (_a = util_1.util.createBoundingRange(...this.comments)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
207
+ this.kind = AstNode_1.AstNodeKind.CommentStatement;
210
208
  this.visitMode = visitors_1.InternalWalkMode.visitStatements | visitors_1.InternalWalkMode.visitExpressions;
209
+ if (((_a = this.comments) === null || _a === void 0 ? void 0 : _a.length) > 0) {
210
+ this.range = util_1.util.createBoundingRange(...this.comments);
211
+ }
211
212
  }
212
213
  get text() {
213
214
  return this.comments.map(x => x.text).join('\n');
@@ -235,12 +236,12 @@ class CommentStatement extends Statement {
235
236
  }
236
237
  }
237
238
  exports.CommentStatement = CommentStatement;
238
- class ExitForStatement extends Statement {
239
+ class ExitForStatement extends AstNode_2.Statement {
239
240
  constructor(tokens) {
240
- var _a, _b, _c;
241
241
  super();
242
242
  this.tokens = tokens;
243
- 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;
243
+ this.kind = AstNode_1.AstNodeKind.ExitForStatement;
244
+ this.range = this.tokens.exitFor.range;
244
245
  }
245
246
  transpile(state) {
246
247
  return [
@@ -252,12 +253,12 @@ class ExitForStatement extends Statement {
252
253
  }
253
254
  }
254
255
  exports.ExitForStatement = ExitForStatement;
255
- class ExitWhileStatement extends Statement {
256
+ class ExitWhileStatement extends AstNode_2.Statement {
256
257
  constructor(tokens) {
257
- var _a, _b, _c;
258
258
  super();
259
259
  this.tokens = tokens;
260
- 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;
260
+ this.kind = AstNode_1.AstNodeKind.ExitWhileStatement;
261
+ this.range = this.tokens.exitWhile.range;
261
262
  }
262
263
  transpile(state) {
263
264
  return [
@@ -269,36 +270,32 @@ class ExitWhileStatement extends Statement {
269
270
  }
270
271
  }
271
272
  exports.ExitWhileStatement = ExitWhileStatement;
272
- class FunctionStatement extends Statement {
273
- constructor(name, func, namespaceName) {
273
+ class FunctionStatement extends AstNode_2.Statement {
274
+ constructor(name, func) {
274
275
  super();
275
276
  this.name = name;
276
277
  this.func = func;
277
- this.namespaceName = namespaceName;
278
- }
279
- get range() {
280
- return this.cacheRange();
281
- }
282
- cacheRange() {
283
- var _a, _b;
284
- if (!this._range) {
285
- this._range = (_b = (_a = this.func) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : this.name.range;
286
- }
287
- return this._range;
278
+ this.kind = AstNode_1.AstNodeKind.FunctionStatement;
279
+ this.range = this.func.range;
288
280
  }
289
281
  /**
290
282
  * Get the name of this expression based on the parse mode
291
283
  */
292
284
  getName(parseMode) {
293
- if (this.namespaceName) {
285
+ var _a;
286
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
287
+ if (namespace) {
294
288
  let delimiter = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
295
- let namespaceName = this.namespaceName.getName(parseMode);
296
- return namespaceName + delimiter + this.name.text;
289
+ let namespaceName = namespace.getName(parseMode);
290
+ return namespaceName + delimiter + ((_a = this.name) === null || _a === void 0 ? void 0 : _a.text);
297
291
  }
298
292
  else {
299
293
  return this.name.text;
300
294
  }
301
295
  }
296
+ getLeadingTrivia() {
297
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.func.getLeadingTrivia());
298
+ }
302
299
  transpile(state) {
303
300
  //create a fake token using the full transpiled name
304
301
  let nameToken = Object.assign(Object.assign({}, this.name), { text: this.getName(Parser_1.ParseMode.BrightScript) });
@@ -310,7 +307,7 @@ class FunctionStatement extends Statement {
310
307
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
311
308
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
312
309
  }
313
- result.push(...this.func.getTypedef(state, this.name));
310
+ result.push(...this.func.getTypedef(state));
314
311
  return result;
315
312
  }
316
313
  walk(visitor, options) {
@@ -318,18 +315,24 @@ class FunctionStatement extends Statement {
318
315
  (0, visitors_1.walk)(this, 'func', visitor, options);
319
316
  }
320
317
  }
318
+ getType(options) {
319
+ var _a;
320
+ const funcExprType = this.func.getType(options);
321
+ funcExprType.setName((_a = this.name) === null || _a === void 0 ? void 0 : _a.text);
322
+ return funcExprType;
323
+ }
321
324
  }
322
325
  exports.FunctionStatement = FunctionStatement;
323
- class IfStatement extends Statement {
326
+ class IfStatement extends AstNode_2.Statement {
324
327
  constructor(tokens, condition, thenBranch, elseBranch, isInline) {
325
- var _a;
326
328
  super();
327
329
  this.tokens = tokens;
328
330
  this.condition = condition;
329
331
  this.thenBranch = thenBranch;
330
332
  this.elseBranch = elseBranch;
331
333
  this.isInline = isInline;
332
- 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;
334
+ this.kind = AstNode_1.AstNodeKind.IfStatement;
335
+ this.range = util_1.util.createBoundingRange(tokens.if, condition, tokens.then, thenBranch, tokens.else, elseBranch, tokens.endIf);
333
336
  }
334
337
  transpile(state) {
335
338
  let results = [];
@@ -375,7 +378,7 @@ class IfStatement extends Statement {
375
378
  }
376
379
  else {
377
380
  //else body
378
- state.lineage.unshift(this.elseBranch);
381
+ state.lineage.unshift(this.tokens.else);
379
382
  let body = this.elseBranch.transpile(state);
380
383
  state.lineage.shift();
381
384
  if (body.length > 0) {
@@ -407,13 +410,13 @@ class IfStatement extends Statement {
407
410
  }
408
411
  }
409
412
  exports.IfStatement = IfStatement;
410
- class IncrementStatement extends Statement {
413
+ class IncrementStatement extends AstNode_2.Statement {
411
414
  constructor(value, operator) {
412
- var _a;
413
415
  super();
414
416
  this.value = value;
415
417
  this.operator = operator;
416
- this.range = (_a = util_1.util.createBoundingRange(this.value, this.operator)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
418
+ this.kind = AstNode_1.AstNodeKind.IncrementStatement;
419
+ this.range = util_1.util.createBoundingRange(value, operator);
417
420
  }
418
421
  transpile(state) {
419
422
  return [
@@ -431,18 +434,19 @@ exports.IncrementStatement = IncrementStatement;
431
434
  /**
432
435
  * Represents a `print` statement within BrightScript.
433
436
  */
434
- class PrintStatement extends Statement {
437
+ class PrintStatement extends AstNode_2.Statement {
435
438
  /**
436
439
  * Creates a new internal representation of a BrightScript `print` statement.
437
- * @param expressions an array of expressions or `PrintSeparator`s to be
438
- * evaluated and printed.
440
+ * @param tokens the tokens for this statement
441
+ * @param tokens.print a print token
442
+ * @param expressions an array of expressions or `PrintSeparator`s to be evaluated and printed.
439
443
  */
440
444
  constructor(tokens, expressions) {
441
- var _a;
442
445
  super();
443
446
  this.tokens = tokens;
444
447
  this.expressions = expressions;
445
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.print, ...this.expressions)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
448
+ this.kind = AstNode_1.AstNodeKind.PrintStatement;
449
+ this.range = util_1.util.createBoundingRange(tokens.print, ...(expressions !== null && expressions !== void 0 ? expressions : []));
446
450
  }
447
451
  transpile(state) {
448
452
  var _a;
@@ -473,16 +477,16 @@ class PrintStatement extends Statement {
473
477
  }
474
478
  }
475
479
  exports.PrintStatement = PrintStatement;
476
- class DimStatement extends Statement {
480
+ class DimStatement extends AstNode_2.Statement {
477
481
  constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
478
- var _a;
479
482
  super();
480
483
  this.dimToken = dimToken;
481
484
  this.identifier = identifier;
482
485
  this.openingSquare = openingSquare;
483
486
  this.dimensions = dimensions;
484
487
  this.closingSquare = closingSquare;
485
- 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;
488
+ this.kind = AstNode_1.AstNodeKind.DimStatement;
489
+ this.range = util_1.util.createBoundingRange(dimToken, identifier, openingSquare, ...(dimensions !== null && dimensions !== void 0 ? dimensions : []), closingSquare);
486
490
  }
487
491
  transpile(state) {
488
492
  let result = [
@@ -508,12 +512,12 @@ class DimStatement extends Statement {
508
512
  }
509
513
  }
510
514
  exports.DimStatement = DimStatement;
511
- class GotoStatement extends Statement {
515
+ class GotoStatement extends AstNode_2.Statement {
512
516
  constructor(tokens) {
513
- var _a;
514
517
  super();
515
518
  this.tokens = tokens;
516
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.goto, this.tokens.label)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
519
+ this.kind = AstNode_1.AstNodeKind.GotoStatement;
520
+ this.range = util_1.util.createBoundingRange(tokens.goto, tokens.label);
517
521
  }
518
522
  transpile(state) {
519
523
  return [
@@ -527,12 +531,15 @@ class GotoStatement extends Statement {
527
531
  }
528
532
  }
529
533
  exports.GotoStatement = GotoStatement;
530
- class LabelStatement extends Statement {
534
+ class LabelStatement extends AstNode_2.Statement {
531
535
  constructor(tokens) {
532
- var _a;
533
536
  super();
534
537
  this.tokens = tokens;
535
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.identifier, this.tokens.colon)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
538
+ this.kind = AstNode_1.AstNodeKind.LabelStatement;
539
+ this.range = util_1.util.createBoundingRange(tokens.identifier, tokens.colon);
540
+ }
541
+ getLeadingTrivia() {
542
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.identifier.leadingTrivia);
536
543
  }
537
544
  transpile(state) {
538
545
  return [
@@ -545,13 +552,13 @@ class LabelStatement extends Statement {
545
552
  }
546
553
  }
547
554
  exports.LabelStatement = LabelStatement;
548
- class ReturnStatement extends Statement {
555
+ class ReturnStatement extends AstNode_2.Statement {
549
556
  constructor(tokens, value) {
550
- var _a;
551
557
  super();
552
558
  this.tokens = tokens;
553
559
  this.value = value;
554
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.return, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
560
+ this.kind = AstNode_1.AstNodeKind.ReturnStatement;
561
+ this.range = util_1.util.createBoundingRange(tokens.return, value);
555
562
  }
556
563
  transpile(state) {
557
564
  let result = [];
@@ -569,12 +576,12 @@ class ReturnStatement extends Statement {
569
576
  }
570
577
  }
571
578
  exports.ReturnStatement = ReturnStatement;
572
- class EndStatement extends Statement {
579
+ class EndStatement extends AstNode_2.Statement {
573
580
  constructor(tokens) {
574
- var _a, _b;
575
581
  super();
576
582
  this.tokens = tokens;
577
- this.range = (_b = (_a = this.tokens.end) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
583
+ this.kind = AstNode_1.AstNodeKind.EndStatement;
584
+ this.range = tokens.end.range;
578
585
  }
579
586
  transpile(state) {
580
587
  return [
@@ -586,12 +593,13 @@ class EndStatement extends Statement {
586
593
  }
587
594
  }
588
595
  exports.EndStatement = EndStatement;
589
- class StopStatement extends Statement {
596
+ class StopStatement extends AstNode_2.Statement {
590
597
  constructor(tokens) {
591
- var _a, _b;
598
+ var _a;
592
599
  super();
593
600
  this.tokens = tokens;
594
- this.range = (_b = (_a = this.tokens.stop) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
601
+ this.kind = AstNode_1.AstNodeKind.StopStatement;
602
+ this.range = (_a = tokens === null || tokens === void 0 ? void 0 : tokens.stop) === null || _a === void 0 ? void 0 : _a.range;
595
603
  }
596
604
  transpile(state) {
597
605
  return [
@@ -603,9 +611,8 @@ class StopStatement extends Statement {
603
611
  }
604
612
  }
605
613
  exports.StopStatement = StopStatement;
606
- class ForStatement extends Statement {
614
+ class ForStatement extends AstNode_2.Statement {
607
615
  constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
608
- var _a;
609
616
  super();
610
617
  this.forToken = forToken;
611
618
  this.counterDeclaration = counterDeclaration;
@@ -615,7 +622,8 @@ class ForStatement extends Statement {
615
622
  this.endForToken = endForToken;
616
623
  this.stepToken = stepToken;
617
624
  this.increment = increment;
618
- 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;
625
+ this.kind = AstNode_1.AstNodeKind.ForStatement;
626
+ this.range = util_1.util.createBoundingRange(forToken, counterDeclaration, toToken, finalValue, stepToken, increment, body, endForToken);
619
627
  }
620
628
  transpile(state) {
621
629
  let result = [];
@@ -655,26 +663,24 @@ class ForStatement extends Statement {
655
663
  }
656
664
  }
657
665
  exports.ForStatement = ForStatement;
658
- class ForEachStatement extends Statement {
659
- constructor(forEachToken, item, inToken, target, body, endForToken) {
660
- var _a;
666
+ class ForEachStatement extends AstNode_2.Statement {
667
+ constructor(tokens, item, target, body) {
661
668
  super();
662
- this.forEachToken = forEachToken;
669
+ this.tokens = tokens;
663
670
  this.item = item;
664
- this.inToken = inToken;
665
671
  this.target = target;
666
672
  this.body = body;
667
- this.endForToken = endForToken;
668
- 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;
673
+ this.kind = AstNode_1.AstNodeKind.ForEachStatement;
674
+ this.range = util_1.util.createBoundingRange(tokens.forEach, item, tokens.in, target, body, tokens.endFor);
669
675
  }
670
676
  transpile(state) {
671
677
  let result = [];
672
678
  //for each
673
- result.push(state.transpileToken(this.forEachToken), ' ');
679
+ result.push(state.transpileToken(this.tokens.forEach), ' ');
674
680
  //item
675
681
  result.push(state.transpileToken(this.item), ' ');
676
682
  //in
677
- result.push(state.transpileToken(this.inToken), ' ');
683
+ result.push(state.transpileToken(this.tokens.in), ' ');
678
684
  //target
679
685
  result.push(...this.target.transpile(state));
680
686
  //body
@@ -684,7 +690,7 @@ class ForEachStatement extends Statement {
684
690
  // add new line before "end for"
685
691
  result.push('\n');
686
692
  //end for
687
- result.push(state.indent(), state.transpileToken(this.endForToken));
693
+ result.push(state.indent(), state.transpileToken(this.tokens.endFor));
688
694
  return result;
689
695
  }
690
696
  walk(visitor, options) {
@@ -697,14 +703,14 @@ class ForEachStatement extends Statement {
697
703
  }
698
704
  }
699
705
  exports.ForEachStatement = ForEachStatement;
700
- class WhileStatement extends Statement {
706
+ class WhileStatement extends AstNode_2.Statement {
701
707
  constructor(tokens, condition, body) {
702
- var _a;
703
708
  super();
704
709
  this.tokens = tokens;
705
710
  this.condition = condition;
706
711
  this.body = body;
707
- 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;
712
+ this.kind = AstNode_1.AstNodeKind.WhileStatement;
713
+ this.range = util_1.util.createBoundingRange(tokens.while, condition, body, tokens.endWhile);
708
714
  }
709
715
  transpile(state) {
710
716
  let result = [];
@@ -732,16 +738,15 @@ class WhileStatement extends Statement {
732
738
  }
733
739
  }
734
740
  exports.WhileStatement = WhileStatement;
735
- class DottedSetStatement extends Statement {
736
- constructor(obj, name, value, dot, operator) {
737
- var _a;
741
+ class DottedSetStatement extends AstNode_2.Statement {
742
+ constructor(obj, name, value, dot) {
738
743
  super();
739
744
  this.obj = obj;
740
745
  this.name = name;
741
746
  this.value = value;
742
747
  this.dot = dot;
743
- this.operator = operator;
744
- 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;
748
+ this.kind = AstNode_1.AstNodeKind.DottedSetStatement;
749
+ this.range = util_1.util.createBoundingRange(obj, dot, name, value);
745
750
  }
746
751
  transpile(state) {
747
752
  var _a, _b;
@@ -753,7 +758,7 @@ class DottedSetStatement extends Statement {
753
758
  return [
754
759
  //object
755
760
  ...this.obj.transpile(state),
756
- '.',
761
+ this.dot ? state.tokenToSourceNode(this.dot) : '.',
757
762
  //name
758
763
  state.transpileToken(this.name),
759
764
  ' = ',
@@ -768,19 +773,25 @@ class DottedSetStatement extends Statement {
768
773
  (0, visitors_1.walk)(this, 'value', visitor, options);
769
774
  }
770
775
  }
776
+ getType(options) {
777
+ var _a, _b, _c, _d, _e, _f;
778
+ const objType = (_a = this.obj) === null || _a === void 0 ? void 0 : _a.getType(options);
779
+ const result = objType === null || objType === void 0 ? void 0 : objType.getMemberType((_b = this.name) === null || _b === void 0 ? void 0 : _b.text, options);
780
+ (_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry((_d = this.name) === null || _d === void 0 ? void 0 : _d.text, result, options.data, (_f = (_e = this.name) === null || _e === void 0 ? void 0 : _e.range) !== null && _f !== void 0 ? _f : this.range));
781
+ return result;
782
+ }
771
783
  }
772
784
  exports.DottedSetStatement = DottedSetStatement;
773
- class IndexedSetStatement extends Statement {
774
- constructor(obj, index, value, openingSquare, closingSquare, operator) {
775
- var _a;
785
+ class IndexedSetStatement extends AstNode_2.Statement {
786
+ constructor(obj, index, value, openingSquare, closingSquare) {
776
787
  super();
777
788
  this.obj = obj;
778
789
  this.index = index;
779
790
  this.value = value;
780
791
  this.openingSquare = openingSquare;
781
792
  this.closingSquare = closingSquare;
782
- this.operator = operator;
783
- 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;
793
+ this.kind = AstNode_1.AstNodeKind.IndexedSetStatement;
794
+ this.range = util_1.util.createBoundingRange(obj, openingSquare, index, closingSquare, value);
784
795
  }
785
796
  transpile(state) {
786
797
  var _a, _b;
@@ -814,12 +825,12 @@ class IndexedSetStatement extends Statement {
814
825
  }
815
826
  }
816
827
  exports.IndexedSetStatement = IndexedSetStatement;
817
- class LibraryStatement extends Statement {
828
+ class LibraryStatement extends AstNode_2.Statement {
818
829
  constructor(tokens) {
819
- var _a;
820
830
  super();
821
831
  this.tokens = tokens;
822
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
832
+ this.kind = AstNode_1.AstNodeKind.LibraryStatement;
833
+ this.range = util_1.util.createBoundingRange(this.tokens.library, this.tokens.filePath);
823
834
  }
824
835
  transpile(state) {
825
836
  let result = [];
@@ -838,21 +849,16 @@ class LibraryStatement extends Statement {
838
849
  }
839
850
  }
840
851
  exports.LibraryStatement = LibraryStatement;
841
- class NamespaceStatement extends Statement {
842
- constructor(keyword,
843
- //this should technically only be a VariableExpression or DottedGetExpression, but that can be enforced elsewhere
844
- nameExpression, body, endKeyword, parentSymbolTable) {
852
+ class NamespaceStatement extends AstNode_2.Statement {
853
+ constructor(keyword, nameExpression, body, endKeyword) {
845
854
  super();
846
855
  this.keyword = keyword;
847
856
  this.nameExpression = nameExpression;
848
857
  this.body = body;
849
858
  this.endKeyword = endKeyword;
850
- this.parentSymbolTable = parentSymbolTable;
851
- this.name = this.nameExpression.getName(Parser_1.ParseMode.BrighterScript);
852
- this.symbolTable = new SymbolTable_1.SymbolTable(parentSymbolTable, `Namespace ${this.name}`);
853
- }
854
- getSymbolTable() {
855
- return this.symbolTable;
859
+ this.kind = AstNode_1.AstNodeKind.NamespaceStatement;
860
+ this.name = this.getName(Parser_1.ParseMode.BrighterScript);
861
+ this.symbolTable = new SymbolTable_2.SymbolTable(`NamespaceStatement: '${this.name}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
856
862
  }
857
863
  get range() {
858
864
  return this.cacheRange();
@@ -865,7 +871,24 @@ class NamespaceStatement extends Statement {
865
871
  return this._range;
866
872
  }
867
873
  getName(parseMode) {
868
- return this.nameExpression.getName(parseMode);
874
+ var _a, _b;
875
+ const sep = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
876
+ let name = util_1.util.getAllDottedGetPartsAsString(this.nameExpression, parseMode);
877
+ if (((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.kind) === AstNode_1.AstNodeKind.NamespaceStatement) {
878
+ name = this.parent.parent.getName(parseMode) + sep + name;
879
+ }
880
+ return name;
881
+ }
882
+ getLeadingTrivia() {
883
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.keyword.leadingTrivia);
884
+ }
885
+ getNameParts() {
886
+ var _a, _b;
887
+ let parts = util_1.util.getAllDottedGetParts(this.nameExpression);
888
+ if (((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.kind) === AstNode_1.AstNodeKind.NamespaceStatement) {
889
+ parts = this.parent.parent.getNameParts().concat(parts);
890
+ }
891
+ return parts;
869
892
  }
870
893
  transpile(state) {
871
894
  //namespaces don't actually have any real content, so just transpile their bodies
@@ -874,7 +897,7 @@ class NamespaceStatement extends Statement {
874
897
  getTypedef(state) {
875
898
  let result = [
876
899
  'namespace ',
877
- ...this.nameExpression.getName(Parser_1.ParseMode.BrighterScript),
900
+ ...this.getName(Parser_1.ParseMode.BrighterScript),
878
901
  state.newline
879
902
  ];
880
903
  state.blockDepth++;
@@ -891,15 +914,19 @@ class NamespaceStatement extends Statement {
891
914
  (0, visitors_1.walk)(this, 'body', visitor, options);
892
915
  }
893
916
  }
917
+ getType(options) {
918
+ const resultType = new NamespaceType_1.NamespaceType(this.name);
919
+ return resultType;
920
+ }
894
921
  }
895
922
  exports.NamespaceStatement = NamespaceStatement;
896
- class ImportStatement extends Statement {
923
+ class ImportStatement extends AstNode_2.Statement {
897
924
  constructor(importToken, filePathToken) {
898
- var _a;
899
925
  super();
900
926
  this.importToken = importToken;
901
927
  this.filePathToken = filePathToken;
902
- this.range = (_a = util_1.util.createBoundingRange(this.importToken, this.filePathToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
928
+ this.kind = AstNode_1.AstNodeKind.ImportStatement;
929
+ this.range = util_1.util.createBoundingRange(importToken, filePathToken);
903
930
  if (this.filePathToken) {
904
931
  //remove quotes
905
932
  this.filePath = this.filePathToken.text.replace(/"/g, '');
@@ -933,89 +960,41 @@ class ImportStatement extends Statement {
933
960
  }
934
961
  }
935
962
  exports.ImportStatement = ImportStatement;
936
- class InterfaceStatement extends Statement {
937
- constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
938
- var _a, _b, _c;
963
+ class InterfaceStatement extends AstNode_2.Statement {
964
+ constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken) {
939
965
  super();
940
- this.name = name;
941
966
  this.parentInterfaceName = parentInterfaceName;
942
967
  this.body = body;
943
- this.namespaceName = namespaceName;
944
- this.memberTable = new SymbolTable_1.SymbolTable();
968
+ this.kind = AstNode_1.AstNodeKind.InterfaceStatement;
945
969
  this.tokens = {};
946
- this.memberMap = {};
947
- this.methods = [];
948
- this.fields = [];
949
970
  this.tokens.interface = interfaceToken;
950
971
  this.tokens.name = name;
951
972
  this.tokens.extends = extendsToken;
952
973
  this.tokens.endInterface = endInterfaceToken;
953
- 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;
954
- for (let statement of this.body) {
955
- if ((0, reflection_1.isInterfaceMethodStatement)(statement)) {
956
- this.methods.push(statement);
957
- this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
958
- }
959
- else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
960
- this.fields.push(statement);
961
- this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
962
- }
963
- }
964
- this.memberTable.name = `Interface ${name === null || name === void 0 ? void 0 : name.text} (members)`;
974
+ this.range = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface);
965
975
  }
966
- buildSymbolTable(parentIface) {
967
- var _a, _b;
968
- this.memberTable.clear();
969
- if (parentIface) {
970
- this.memberTable.pushParent(parentIface === null || parentIface === void 0 ? void 0 : parentIface.memberTable);
971
- }
972
- for (const statement of this.methods) {
973
- const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
974
- 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);
975
- }
976
- for (const statement of this.fields) {
977
- 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());
978
- }
976
+ get fields() {
977
+ return this.body.filter(x => (0, reflection_1.isInterfaceFieldStatement)(x));
979
978
  }
980
- hasParent() {
981
- return !!this.parentInterfaceName;
979
+ get methods() {
980
+ return this.body.filter(x => (0, reflection_1.isInterfaceMethodStatement)(x));
982
981
  }
983
- getParentName() {
982
+ hasParentInterface() {
984
983
  return !!this.parentInterfaceName;
985
984
  }
986
- /**
987
- * Gets an array of possible parent interface names, taking into account the namespace this interface was created under
988
- * @returns array of possible parent interface names
989
- */
990
- getPossibleFullParentNames() {
991
- var _a;
992
- if (!this.hasParent()) {
993
- return [];
994
- }
995
- if (((_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
996
- // The specified parent interface already has a dot, so it must already reference a namespace
997
- return [this.parentInterfaceName.getName()];
998
- }
999
- const names = [];
1000
- if (this.namespaceName) {
1001
- // We're under a namespace, so the full parent name MIGHT be with this namespace too
1002
- names.push(this.namespaceName.getName() + '.' + this.parentInterfaceName.getName());
1003
- }
1004
- names.push(this.parentInterfaceName.getName());
1005
- return names;
1006
- }
1007
- getThisBscType() {
1008
- return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
985
+ getLeadingTrivia() {
986
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.interface.leadingTrivia);
1009
987
  }
1010
988
  /**
1011
989
  * The name of the interface WITH its leading namespace (if applicable)
1012
990
  */
1013
- getName(parseMode) {
991
+ get fullName() {
1014
992
  var _a;
1015
993
  const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1016
994
  if (name) {
1017
- if (this.namespaceName) {
1018
- let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
995
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
996
+ if (namespace) {
997
+ let namespaceName = namespace.getName(Parser_1.ParseMode.BrighterScript);
1019
998
  return `${namespaceName}.${name}`;
1020
999
  }
1021
1000
  else {
@@ -1027,6 +1006,27 @@ class InterfaceStatement extends Statement {
1027
1006
  return undefined;
1028
1007
  }
1029
1008
  }
1009
+ /**
1010
+ * The name of the interface (without the namespace prefix)
1011
+ */
1012
+ get name() {
1013
+ var _a;
1014
+ return (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1015
+ }
1016
+ /**
1017
+ * Get the name of this expression based on the parse mode
1018
+ */
1019
+ getName(parseMode) {
1020
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1021
+ if (namespace) {
1022
+ let delimiter = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
1023
+ let namespaceName = namespace.getName(parseMode);
1024
+ return namespaceName + delimiter + this.name;
1025
+ }
1026
+ else {
1027
+ return this.name;
1028
+ }
1029
+ }
1030
1030
  transpile(state) {
1031
1031
  //interfaces should completely disappear at runtime
1032
1032
  return [];
@@ -1038,7 +1038,7 @@ class InterfaceStatement extends Statement {
1038
1038
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1039
1039
  }
1040
1040
  result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
1041
- const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName(Parser_1.ParseMode.BrighterScript);
1041
+ const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName();
1042
1042
  if (parentInterfaceName) {
1043
1043
  result.push(' extends ', parentInterfaceName);
1044
1044
  }
@@ -1061,35 +1061,59 @@ class InterfaceStatement extends Statement {
1061
1061
  return result;
1062
1062
  }
1063
1063
  walk(visitor, options) {
1064
+ //visitor-less walk function to do parent linking
1065
+ (0, visitors_1.walk)(this, 'parentInterfaceName', null, options);
1064
1066
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1065
1067
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1066
1068
  }
1067
1069
  }
1070
+ getType(options) {
1071
+ var _a, _b, _c, _d;
1072
+ const superIface = (_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getType(options);
1073
+ const resultType = new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), superIface);
1074
+ for (const statement of this.methods) {
1075
+ const memberType = statement === null || statement === void 0 ? void 0 : statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); // no typechain info needed
1076
+ const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
1077
+ resultType.addMember((_b = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _b === void 0 ? void 0 : _b.text, { definingNode: statement }, memberType, flag);
1078
+ }
1079
+ for (const statement of this.fields) {
1080
+ const memberType = statement === null || statement === void 0 ? void 0 : statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); // no typechain info needed
1081
+ const flag = statement.isOptional ? SymbolTable_1.SymbolTypeFlag.runtime | SymbolTable_1.SymbolTypeFlag.optional : SymbolTable_1.SymbolTypeFlag.runtime;
1082
+ resultType.addMember((_c = statement === null || statement === void 0 ? void 0 : statement.tokens.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, memberType, flag);
1083
+ }
1084
+ (_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry(this.getName(Parser_1.ParseMode.BrighterScript), resultType, options.data, this.range));
1085
+ return resultType;
1086
+ }
1068
1087
  }
1069
1088
  exports.InterfaceStatement = InterfaceStatement;
1070
- class InterfaceFieldStatement extends Statement {
1071
- constructor(nameToken, asToken, type, namespaceName) {
1072
- var _a;
1089
+ class InterfaceFieldStatement extends AstNode_2.Statement {
1090
+ constructor(nameToken, asToken, typeExpression, optionalToken) {
1073
1091
  super();
1074
- this.type = type;
1075
- this.namespaceName = namespaceName;
1092
+ this.typeExpression = typeExpression;
1093
+ this.kind = AstNode_1.AstNodeKind.InterfaceFieldStatement;
1076
1094
  this.tokens = {};
1095
+ this.tokens.optional = optionalToken;
1077
1096
  this.tokens.name = nameToken;
1078
1097
  this.tokens.as = asToken;
1079
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1098
+ this.range = util_1.util.createBoundingRange(this.tokens.optional, this.tokens.name, this.tokens.as, this.typeExpression);
1080
1099
  }
1081
1100
  transpile(state) {
1082
1101
  throw new Error('Method not implemented.');
1083
1102
  }
1084
- getType() {
1085
- var _a;
1086
- return (_a = this.type) === null || _a === void 0 ? void 0 : _a.type;
1103
+ getLeadingTrivia() {
1104
+ var _a, _b;
1105
+ return util_1.util.concatAnnotationLeadingTrivia(this, (_b = (_a = this.tokens.optional) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : this.tokens.name.leadingTrivia);
1087
1106
  }
1088
1107
  get name() {
1089
- return this.tokens.name;
1108
+ return this.tokens.name.text;
1109
+ }
1110
+ get isOptional() {
1111
+ return !!this.tokens.optional;
1090
1112
  }
1091
1113
  walk(visitor, options) {
1092
- //nothing to walk
1114
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1115
+ (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
1116
+ }
1093
1117
  }
1094
1118
  getTypedef(state) {
1095
1119
  var _a;
@@ -1097,32 +1121,120 @@ class InterfaceFieldStatement extends Statement {
1097
1121
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1098
1122
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1099
1123
  }
1124
+ if (this.isOptional) {
1125
+ result.push(this.tokens.optional.text, ' ');
1126
+ }
1100
1127
  result.push(this.tokens.name.text);
1101
- if (this.tokens.as && this.type) {
1102
- result.push(' as ', ...this.type.transpile(state));
1128
+ if (this.typeExpression) {
1129
+ result.push(' as ', ...this.typeExpression.getTypedef(state));
1103
1130
  }
1104
1131
  return result;
1105
1132
  }
1133
+ getType(options) {
1134
+ var _a, _b;
1135
+ return (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(options)) !== null && _b !== void 0 ? _b : DynamicType_1.DynamicType.instance;
1136
+ }
1106
1137
  }
1107
1138
  exports.InterfaceFieldStatement = InterfaceFieldStatement;
1108
- class InterfaceMethodStatement extends FunctionStatement {
1139
+ //TODO: there is much that is similar with this and FunctionExpression.
1140
+ //It would be nice to refactor this so there is less duplicated code
1141
+ class InterfaceMethodStatement extends AstNode_2.Statement {
1142
+ constructor(functionTypeToken, nameToken, leftParen, params, rightParen, asToken, returnTypeExpression, optionalToken) {
1143
+ super();
1144
+ this.params = params;
1145
+ this.returnTypeExpression = returnTypeExpression;
1146
+ this.kind = AstNode_1.AstNodeKind.InterfaceMethodStatement;
1147
+ this.tokens = {};
1148
+ this.tokens.optional = optionalToken;
1149
+ this.tokens.functionType = functionTypeToken;
1150
+ this.tokens.name = nameToken;
1151
+ this.tokens.leftParen = leftParen;
1152
+ this.tokens.rightParen = rightParen;
1153
+ this.tokens.as = asToken;
1154
+ }
1109
1155
  transpile(state) {
1110
1156
  throw new Error('Method not implemented.');
1111
1157
  }
1112
- constructor(name, func) {
1113
- super(name, func, undefined);
1158
+ get range() {
1159
+ var _a;
1160
+ return util_1.util.createBoundingRange(this.tokens.optional, this.tokens.functionType, this.tokens.name, this.tokens.leftParen, ...((_a = this.params) !== null && _a !== void 0 ? _a : []), this.tokens.rightParen, this.tokens.as, this.returnTypeExpression);
1161
+ }
1162
+ /**
1163
+ * Get the name of this method.
1164
+ */
1165
+ getName(parseMode) {
1166
+ return this.tokens.name.text;
1167
+ }
1168
+ get isOptional() {
1169
+ return !!this.tokens.optional;
1170
+ }
1171
+ getLeadingTrivia() {
1172
+ var _a, _b;
1173
+ return util_1.util.concatAnnotationLeadingTrivia(this, (_b = (_a = this.tokens.optional) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : this.tokens.functionType.leadingTrivia);
1114
1174
  }
1115
1175
  walk(visitor, options) {
1116
- //nothing to walk
1176
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1177
+ (0, visitors_1.walk)(this, 'returnTypeExpression', visitor, options);
1178
+ }
1179
+ }
1180
+ getTypedef(state) {
1181
+ var _a, _b;
1182
+ const result = [];
1183
+ for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1184
+ result.push(...annotation.getTypedef(state), state.newline, state.indent());
1185
+ }
1186
+ if (this.isOptional) {
1187
+ result.push(this.tokens.optional.text, ' ');
1188
+ }
1189
+ result.push(this.tokens.functionType.text, ' ', this.tokens.name.text, '(');
1190
+ const params = (_b = this.params) !== null && _b !== void 0 ? _b : [];
1191
+ for (let i = 0; i < params.length; i++) {
1192
+ if (i > 0) {
1193
+ result.push(', ');
1194
+ }
1195
+ const param = params[i];
1196
+ result.push(param.name.text);
1197
+ if (param.typeExpression) {
1198
+ result.push(' as ', ...param.typeExpression.getTypedef(state));
1199
+ }
1200
+ }
1201
+ result.push(')');
1202
+ if (this.returnTypeExpression) {
1203
+ result.push(' as ', ...this.returnTypeExpression.getTypedef(state));
1204
+ }
1205
+ return result;
1206
+ }
1207
+ getType(options) {
1208
+ var _a, _b, _c;
1209
+ //if there's a defined return type, use that
1210
+ let returnType = (_a = this.returnTypeExpression) === null || _a === void 0 ? void 0 : _a.getType(options);
1211
+ const isSub = this.tokens.functionType.kind === TokenKind_1.TokenKind.Sub;
1212
+ //if we don't have a return type and this is a sub, set the return type to `void`. else use `dynamic`
1213
+ if (!returnType) {
1214
+ returnType = isSub ? VoidType_1.VoidType.instance : DynamicType_1.DynamicType.instance;
1215
+ }
1216
+ const resultType = new TypedFunctionType_1.TypedFunctionType(returnType);
1217
+ resultType.isSub = isSub;
1218
+ for (let param of this.params) {
1219
+ resultType.addParameter(param.name.text, param.getType(options), !!param.defaultValue);
1220
+ }
1221
+ if (options.typeChain) {
1222
+ // need Interface type for type chain
1223
+ (_b = this.parent) === null || _b === void 0 ? void 0 : _b.getType(options);
1224
+ }
1225
+ let funcName = this.getName(Parser_1.ParseMode.BrighterScript);
1226
+ resultType.setName(funcName);
1227
+ (_c = options.typeChain) === null || _c === void 0 ? void 0 : _c.push(new interfaces_1.TypeChainEntry(resultType.name, resultType, options.data, this.range));
1228
+ return resultType;
1117
1229
  }
1118
1230
  }
1119
1231
  exports.InterfaceMethodStatement = InterfaceMethodStatement;
1120
- class ClassStatement extends Statement {
1232
+ class ClassStatement extends AstNode_2.Statement {
1121
1233
  constructor(classKeyword,
1122
1234
  /**
1123
1235
  * The name of the class (without namespace prefix)
1124
1236
  */
1125
- name, body, end, extendsKeyword, parentClassName, namespaceName, currentSymbolTable) {
1237
+ name, body, end, extendsKeyword, parentClassName) {
1126
1238
  var _a, _b, _c, _d;
1127
1239
  super();
1128
1240
  this.classKeyword = classKeyword;
@@ -1131,16 +1243,12 @@ class ClassStatement extends Statement {
1131
1243
  this.end = end;
1132
1244
  this.extendsKeyword = extendsKeyword;
1133
1245
  this.parentClassName = parentClassName;
1134
- this.namespaceName = namespaceName;
1135
- this.currentSymbolTable = currentSymbolTable;
1136
- this.symbolTable = new SymbolTable_1.SymbolTable();
1137
- this.memberTable = new SymbolTable_1.SymbolTable();
1246
+ this.kind = AstNode_1.AstNodeKind.ClassStatement;
1138
1247
  this.memberMap = {};
1139
1248
  this.methods = [];
1140
1249
  this.fields = [];
1141
1250
  this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1142
- this.symbolTable.pushParent(currentSymbolTable);
1143
- 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;
1251
+ this.symbolTable = new SymbolTable_2.SymbolTable(`ClassStatement: '${(_b = this.name) === null || _b === void 0 ? void 0 : _b.text}'`, () => { var _a; return (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolTable(); });
1144
1252
  for (let statement of this.body) {
1145
1253
  if ((0, reflection_1.isMethodStatement)(statement)) {
1146
1254
  this.methods.push(statement);
@@ -1151,15 +1259,15 @@ class ClassStatement extends Statement {
1151
1259
  this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
1152
1260
  }
1153
1261
  }
1154
- this.symbolTable.name = `Class ${name === null || name === void 0 ? void 0 : name.text} (symbols)`;
1155
- this.memberTable.name = `Class ${name === null || name === void 0 ? void 0 : name.text} (members)`;
1262
+ this.range = util_1.util.createBoundingRange(classKeyword, name, extendsKeyword, parentClassName, ...(body !== null && body !== void 0 ? body : []), end);
1156
1263
  }
1157
1264
  getName(parseMode) {
1158
1265
  var _a;
1159
1266
  const name = (_a = this.name) === null || _a === void 0 ? void 0 : _a.text;
1160
1267
  if (name) {
1161
- if (this.namespaceName) {
1162
- let namespaceName = this.namespaceName.getName(parseMode);
1268
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1269
+ if (namespace) {
1270
+ let namespaceName = namespace.getName(parseMode);
1163
1271
  let separator = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
1164
1272
  return namespaceName + separator + name;
1165
1273
  }
@@ -1172,35 +1280,8 @@ class ClassStatement extends Statement {
1172
1280
  return undefined;
1173
1281
  }
1174
1282
  }
1175
- getThisBscType() {
1176
- return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
1177
- }
1178
- getConstructorFunctionType() {
1179
- var _a, _b;
1180
- const constructFunc = this.getConstructorFunction();
1181
- 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();
1182
- constructorFuncType.setName(this.getName(Parser_1.ParseMode.BrighterScript));
1183
- constructorFuncType.isNew = true;
1184
- return constructorFuncType;
1185
- }
1186
- buildSymbolTable(parentClass) {
1187
- var _a, _b, _c, _d, _e;
1188
- this.symbolTable.clear();
1189
- this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getThisBscType());
1190
- this.memberTable.clear();
1191
- if ((0, reflection_1.isClassStatement)(parentClass)) {
1192
- this.symbolTable.addSymbol('super', (_b = this.parentClassName) === null || _b === void 0 ? void 0 : _b.range, parentClass.getConstructorFunctionType());
1193
- this.memberTable.pushParent(parentClass === null || parentClass === void 0 ? void 0 : parentClass.memberTable);
1194
- }
1195
- for (const statement of this.methods) {
1196
- statement === null || statement === void 0 ? void 0 : statement.func.symbolTable.pushParent(this.symbolTable);
1197
- const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
1198
- 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));
1199
- 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);
1200
- }
1201
- for (const statement of this.fields) {
1202
- 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());
1203
- }
1283
+ getLeadingTrivia() {
1284
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.classKeyword.leadingTrivia);
1204
1285
  }
1205
1286
  transpile(state) {
1206
1287
  let result = [];
@@ -1212,14 +1293,15 @@ class ClassStatement extends Statement {
1212
1293
  return result;
1213
1294
  }
1214
1295
  getTypedef(state) {
1215
- var _a, _b;
1296
+ var _a;
1216
1297
  const result = [];
1217
1298
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1218
1299
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1219
1300
  }
1220
1301
  result.push('class ', this.name.text);
1221
1302
  if (this.extendsKeyword && this.parentClassName) {
1222
- const fqName = util_1.util.getFullyQualifiedClassName(this.parentClassName.getName(Parser_1.ParseMode.BrighterScript), (_b = this.namespaceName) === null || _b === void 0 ? void 0 : _b.getName(Parser_1.ParseMode.BrighterScript));
1303
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1304
+ const fqName = util_1.util.getFullyQualifiedClassName(this.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript));
1223
1305
  result.push(` extends ${fqName}`);
1224
1306
  }
1225
1307
  result.push(state.newline);
@@ -1227,8 +1309,12 @@ class ClassStatement extends Statement {
1227
1309
  let body = this.body;
1228
1310
  //inject an empty "new" method if missing
1229
1311
  if (!this.getConstructorFunction()) {
1312
+ const constructor = (0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub);
1313
+ constructor.parent = this;
1314
+ //walk the constructor to set up parent links
1315
+ constructor.link();
1230
1316
  body = [
1231
- (0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub),
1317
+ constructor,
1232
1318
  ...this.body
1233
1319
  ];
1234
1320
  }
@@ -1247,13 +1333,14 @@ class ClassStatement extends Statement {
1247
1333
  * The base class is index 0, its child is index 1, and so on.
1248
1334
  */
1249
1335
  getParentClassIndex(state) {
1250
- var _a, _b;
1336
+ var _a;
1251
1337
  let myIndex = 0;
1252
1338
  let stmt = this;
1253
1339
  while (stmt) {
1254
1340
  if (stmt.parentClassName) {
1341
+ const namespace = stmt.findAncestor(reflection_1.isNamespaceStatement);
1255
1342
  //find the parent class
1256
- stmt = (_b = state.file.getClassFileLink(stmt.parentClassName.getName(Parser_1.ParseMode.BrighterScript), (_a = stmt.namespaceName) === null || _a === void 0 ? void 0 : _a.getName(Parser_1.ParseMode.BrighterScript))) === null || _b === void 0 ? void 0 : _b.item;
1343
+ stmt = (_a = state.file.getClassFileLink(stmt.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript))) === null || _a === void 0 ? void 0 : _a.item;
1257
1344
  myIndex++;
1258
1345
  }
1259
1346
  else {
@@ -1268,41 +1355,21 @@ class ClassStatement extends Statement {
1268
1355
  return null;
1269
1356
  }
1270
1357
  }
1271
- hasParent() {
1358
+ hasParentClass() {
1272
1359
  return !!this.parentClassName;
1273
1360
  }
1274
- /**
1275
- * Gets an array of possible parent class names, taking into account the namespace this class was created under
1276
- * @returns array of possible parent class names
1277
- */
1278
- getPossibleFullParentNames() {
1279
- var _a;
1280
- if (!this.hasParent()) {
1281
- return [];
1282
- }
1283
- if (((_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
1284
- // The specified parent class already has a dot, so it must already reference a namespace
1285
- return [this.parentClassName.getName()];
1286
- }
1287
- const names = [];
1288
- if (this.namespaceName) {
1289
- // We're under a namespace, so the full parent name MIGHT be with this namespace too
1290
- names.push(this.namespaceName.getName() + '.' + this.parentClassName.getName());
1291
- }
1292
- names.push(this.parentClassName.getName());
1293
- return names;
1294
- }
1295
1361
  /**
1296
1362
  * Get all ancestor classes, in closest-to-furthest order (i.e. 0 is parent, 1 is grandparent, etc...).
1297
1363
  * This will return an empty array if no ancestors were found
1298
1364
  */
1299
1365
  getAncestors(state) {
1300
- var _a, _b;
1366
+ var _a;
1301
1367
  let ancestors = [];
1302
1368
  let stmt = this;
1303
1369
  while (stmt) {
1304
1370
  if (stmt.parentClassName) {
1305
- stmt = (_b = state.file.getClassFileLink(stmt.parentClassName.getName(Parser_1.ParseMode.BrighterScript), (_a = this.namespaceName) === null || _a === void 0 ? void 0 : _a.getName(Parser_1.ParseMode.BrighterScript))) === null || _b === void 0 ? void 0 : _b.item;
1371
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1372
+ stmt = (_a = state.file.getClassFileLink(stmt.parentClassName.getName(), namespace === null || namespace === void 0 ? void 0 : namespace.getName(Parser_1.ParseMode.BrighterScript))) === null || _a === void 0 ? void 0 : _a.item;
1306
1373
  ancestors.push(stmt);
1307
1374
  }
1308
1375
  else {
@@ -1317,6 +1384,12 @@ class ClassStatement extends Statement {
1317
1384
  }
1318
1385
  return `__${name}_builder`;
1319
1386
  }
1387
+ getConstructorType() {
1388
+ var _a, _b;
1389
+ const constructorType = (_b = (_a = this.getConstructorFunction()) === null || _a === void 0 ? void 0 : _a.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime })) !== null && _b !== void 0 ? _b : new TypedFunctionType_1.TypedFunctionType(null);
1390
+ constructorType.returnType = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.runtime });
1391
+ return constructorType;
1392
+ }
1320
1393
  /**
1321
1394
  * Get the constructor function for this class (if exists), or undefined if not exist
1322
1395
  */
@@ -1344,7 +1417,6 @@ class ClassStatement extends Statement {
1344
1417
  * without instantiating the parent constructor at that point in time.
1345
1418
  */
1346
1419
  getTranspiledBuilder(state) {
1347
- var _a;
1348
1420
  let result = [];
1349
1421
  result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
1350
1422
  state.blockDepth++;
@@ -1356,7 +1428,8 @@ class ClassStatement extends Statement {
1356
1428
  let ancestors = this.getAncestors(state);
1357
1429
  //construct parent class or empty object
1358
1430
  if (ancestors[0]) {
1359
- let fullyQualifiedClassName = util_1.util.getFullyQualifiedClassName(ancestors[0].getName(Parser_1.ParseMode.BrighterScript), (_a = ancestors[0].namespaceName) === null || _a === void 0 ? void 0 : _a.getName(Parser_1.ParseMode.BrighterScript));
1431
+ const ancestorNamespace = ancestors[0].findAncestor(reflection_1.isNamespaceStatement);
1432
+ let fullyQualifiedClassName = util_1.util.getFullyQualifiedClassName(ancestors[0].getName(Parser_1.ParseMode.BrighterScript), ancestorNamespace === null || ancestorNamespace === void 0 ? void 0 : ancestorNamespace.getName(Parser_1.ParseMode.BrighterScript));
1360
1433
  result.push('instance = ', this.getBuilderName(fullyQualifiedClassName), '()');
1361
1434
  }
1362
1435
  else {
@@ -1447,10 +1520,44 @@ class ClassStatement extends Statement {
1447
1520
  return result;
1448
1521
  }
1449
1522
  walk(visitor, options) {
1523
+ //visitor-less walk function to do parent linking
1524
+ (0, visitors_1.walk)(this, 'parentClassName', null, options);
1450
1525
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1451
1526
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1452
1527
  }
1453
1528
  }
1529
+ getType(options) {
1530
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1531
+ const superClass = (_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getType(options);
1532
+ const resultType = new ClassType_1.ClassType(this.getName(Parser_1.ParseMode.BrighterScript), superClass);
1533
+ for (const statement of this.methods) {
1534
+ const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); //no typechain needed
1535
+ let flag = SymbolTable_1.SymbolTypeFlag.runtime;
1536
+ if (((_b = statement.accessModifier) === null || _b === void 0 ? void 0 : _b.kind) === TokenKind_1.TokenKind.Private) {
1537
+ flag |= SymbolTable_1.SymbolTypeFlag.private;
1538
+ }
1539
+ if (((_c = statement.accessModifier) === null || _c === void 0 ? void 0 : _c.kind) === TokenKind_1.TokenKind.Protected) {
1540
+ flag |= SymbolTable_1.SymbolTypeFlag.protected;
1541
+ }
1542
+ resultType.addMember((_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text, { definingNode: statement }, funcType, flag);
1543
+ }
1544
+ for (const statement of this.fields) {
1545
+ const fieldType = statement.getType(Object.assign(Object.assign({}, options), { typeChain: undefined })); //no typechain needed
1546
+ let flag = SymbolTable_1.SymbolTypeFlag.runtime;
1547
+ if (statement.isOptional) {
1548
+ flag |= SymbolTable_1.SymbolTypeFlag.optional;
1549
+ }
1550
+ if (((_e = statement.accessModifier) === null || _e === void 0 ? void 0 : _e.kind) === TokenKind_1.TokenKind.Private) {
1551
+ flag |= SymbolTable_1.SymbolTypeFlag.private;
1552
+ }
1553
+ if (((_f = statement.accessModifier) === null || _f === void 0 ? void 0 : _f.kind) === TokenKind_1.TokenKind.Protected) {
1554
+ flag |= SymbolTable_1.SymbolTypeFlag.protected;
1555
+ }
1556
+ resultType.addMember((_g = statement === null || statement === void 0 ? void 0 : statement.name) === null || _g === void 0 ? void 0 : _g.text, { definingNode: statement }, fieldType, flag);
1557
+ }
1558
+ (_h = options.typeChain) === null || _h === void 0 ? void 0 : _h.push(new interfaces_1.TypeChainEntry(resultType.name, resultType, options.data, this.range));
1559
+ return resultType;
1560
+ }
1454
1561
  }
1455
1562
  exports.ClassStatement = ClassStatement;
1456
1563
  const accessModifiers = [
@@ -1460,8 +1567,9 @@ const accessModifiers = [
1460
1567
  ];
1461
1568
  class MethodStatement extends FunctionStatement {
1462
1569
  constructor(modifiers, name, func, override) {
1463
- super(name, func, undefined);
1570
+ super(name, func);
1464
1571
  this.override = override;
1572
+ this.kind = AstNode_1.AstNodeKind.MethodStatement;
1465
1573
  this.modifiers = [];
1466
1574
  if (modifiers) {
1467
1575
  if (Array.isArray(modifiers)) {
@@ -1471,19 +1579,19 @@ class MethodStatement extends FunctionStatement {
1471
1579
  this.modifiers.push(modifiers);
1472
1580
  }
1473
1581
  }
1582
+ this.range = util_1.util.createBoundingRange(...(this.modifiers), override, func);
1474
1583
  }
1475
1584
  get accessModifier() {
1476
1585
  return this.modifiers.find(x => accessModifiers.includes(x.kind));
1477
1586
  }
1478
- get range() {
1479
- return this.cacheRange();
1587
+ /**
1588
+ * Get the name of this method.
1589
+ */
1590
+ getName(parseMode) {
1591
+ return this.name.text;
1480
1592
  }
1481
- cacheRange() {
1482
- var _a, _b;
1483
- if (!this._range) {
1484
- 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;
1485
- }
1486
- return this._range;
1593
+ getLeadingTrivia() {
1594
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.func.getLeadingTrivia());
1487
1595
  }
1488
1596
  transpile(state) {
1489
1597
  if (this.name.text.toLowerCase() === 'new') {
@@ -1528,7 +1636,7 @@ class MethodStatement extends FunctionStatement {
1528
1636
  if (this.override) {
1529
1637
  result.push('override ');
1530
1638
  }
1531
- result.push(...this.func.getTypedef(state, this.name));
1639
+ result.push(...this.func.getTypedef(state));
1532
1640
  return result;
1533
1641
  }
1534
1642
  /**
@@ -1540,54 +1648,60 @@ class MethodStatement extends FunctionStatement {
1540
1648
  if (state.classStatement.getAncestors(state).length === 0) {
1541
1649
  return;
1542
1650
  }
1543
- //if the first statement is a call to super, quit here
1544
- let firstStatement = this.func.body.statements[0];
1545
- if (
1546
- //is a call statement
1547
- (0, reflection_1.isExpressionStatement)(firstStatement) && (0, reflection_1.isCallExpression)(firstStatement.expression) &&
1548
- //is a call to super
1549
- util_1.util.findBeginningVariableExpression(firstStatement === null || firstStatement === void 0 ? void 0 : firstStatement.expression.callee).name.text.toLowerCase() === 'super') {
1651
+ //check whether any calls to super exist
1652
+ let containsSuperCall = this.func.body.statements.findIndex((x) => {
1653
+ //is a call statement
1654
+ return (0, reflection_1.isExpressionStatement)(x) && (0, reflection_1.isCallExpression)(x.expression) &&
1655
+ //is a call to super
1656
+ util_1.util.findBeginningVariableExpression(x.expression.callee).name.text.toLowerCase() === 'super';
1657
+ }) !== -1;
1658
+ //if a call to super exists, quit here
1659
+ if (containsSuperCall) {
1550
1660
  return;
1551
1661
  }
1552
- //this is a child class, and the first statement isn't a call to super. Inject one
1662
+ //this is a child class, and the constructor doesn't contain a call to super. Inject one
1553
1663
  const superCall = new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
1554
1664
  kind: TokenKind_1.TokenKind.Identifier,
1555
1665
  text: 'super',
1556
1666
  isReserved: false,
1557
1667
  range: state.classStatement.name.range,
1558
- leadingWhitespace: ''
1559
- }, null), {
1668
+ leadingWhitespace: '',
1669
+ leadingTrivia: []
1670
+ }), {
1560
1671
  kind: TokenKind_1.TokenKind.LeftParen,
1561
1672
  text: '(',
1562
1673
  isReserved: false,
1563
1674
  range: state.classStatement.name.range,
1564
- leadingWhitespace: ''
1675
+ leadingWhitespace: '',
1676
+ leadingTrivia: []
1565
1677
  }, {
1566
1678
  kind: TokenKind_1.TokenKind.RightParen,
1567
1679
  text: ')',
1568
1680
  isReserved: false,
1569
1681
  range: state.classStatement.name.range,
1570
- leadingWhitespace: ''
1571
- }, [], null));
1682
+ leadingWhitespace: '',
1683
+ leadingTrivia: []
1684
+ }, []));
1572
1685
  state.editor.arrayUnshift(this.func.body.statements, superCall);
1573
1686
  }
1574
1687
  /**
1575
1688
  * Inject field initializers at the top of the `new` function (after any present `super()` call)
1576
1689
  */
1577
1690
  injectFieldInitializersForConstructor(state) {
1578
- let startingIndex = state.classStatement.hasParent() ? 1 : 0;
1691
+ let startingIndex = state.classStatement.hasParentClass() ? 1 : 0;
1579
1692
  let newStatements = [];
1580
1693
  //insert the field initializers in order
1581
1694
  for (let field of state.classStatement.fields) {
1582
1695
  let thisQualifiedName = Object.assign({}, field.name);
1583
1696
  thisQualifiedName.text = 'm.' + field.name.text;
1584
- if (field.initialValue) {
1585
- newStatements.push(new AssignmentStatement(thisQualifiedName, field.equal, field.initialValue, this.func));
1586
- }
1587
- else {
1697
+ const fieldAssignment = field.initialValue
1698
+ ? new AssignmentStatement(field.equal, thisQualifiedName, field.initialValue)
1699
+ : new AssignmentStatement((0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), thisQualifiedName,
1588
1700
  //if there is no initial value, set the initial value to `invalid`
1589
- 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));
1590
- }
1701
+ (0, creators_1.createInvalidLiteral)('invalid', field.name.range));
1702
+ // Add parent so namespace lookups work
1703
+ fieldAssignment.parent = state.classStatement;
1704
+ newStatements.push(fieldAssignment);
1591
1705
  }
1592
1706
  state.editor.arraySplice(this.func.body.statements, startingIndex, 0, ...newStatements);
1593
1707
  }
@@ -1598,33 +1712,33 @@ class MethodStatement extends FunctionStatement {
1598
1712
  }
1599
1713
  }
1600
1714
  exports.MethodStatement = MethodStatement;
1601
- class FieldStatement extends Statement {
1602
- constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
1603
- var _a;
1715
+ class FieldStatement extends AstNode_2.Statement {
1716
+ constructor(accessModifier, name, as, typeExpression, equal, initialValue, optional) {
1604
1717
  super();
1605
1718
  this.accessModifier = accessModifier;
1606
1719
  this.name = name;
1607
1720
  this.as = as;
1608
- this.type = type;
1721
+ this.typeExpression = typeExpression;
1609
1722
  this.equal = equal;
1610
1723
  this.initialValue = initialValue;
1611
- this.namespaceName = namespaceName;
1612
- 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;
1724
+ this.optional = optional;
1725
+ this.kind = AstNode_1.AstNodeKind.FieldStatement;
1726
+ this.range = util_1.util.createBoundingRange(accessModifier, optional, name, as, typeExpression, equal, initialValue);
1613
1727
  }
1614
1728
  /**
1615
1729
  * Derive a ValueKind from the type token, or the initial value.
1616
1730
  * Defaults to `DynamicType`
1617
1731
  */
1618
- getType(parseMode = Parser_1.ParseMode.BrighterScript) {
1619
- if (this.type) {
1620
- return this.type.type;
1621
- }
1622
- else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
1623
- return this.initialValue.type;
1624
- }
1625
- else {
1626
- return new DynamicType_1.DynamicType();
1627
- }
1732
+ getType(options) {
1733
+ var _a, _b, _c, _d;
1734
+ return (_d = (_b = (_a = this.typeExpression) === null || _a === void 0 ? void 0 : _a.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.typetime }))) !== null && _b !== void 0 ? _b : (_c = this.initialValue) === null || _c === void 0 ? void 0 : _c.getType(Object.assign(Object.assign({}, options), { flags: SymbolTable_1.SymbolTypeFlag.runtime }))) !== null && _d !== void 0 ? _d : DynamicType_1.DynamicType.instance;
1735
+ }
1736
+ getLeadingTrivia() {
1737
+ var _a, _b, _c, _d, _e, _f;
1738
+ return util_1.util.concatAnnotationLeadingTrivia(this, (_f = (_d = (_b = (_a = this.accessModifier) === null || _a === void 0 ? void 0 : _a.leadingTrivia) !== null && _b !== void 0 ? _b : (_c = this.optional) === null || _c === void 0 ? void 0 : _c.leadingTrivia) !== null && _d !== void 0 ? _d : (_e = this.name) === null || _e === void 0 ? void 0 : _e.leadingTrivia) !== null && _f !== void 0 ? _f : []);
1739
+ }
1740
+ get isOptional() {
1741
+ return !!this.optional;
1628
1742
  }
1629
1743
  transpile(state) {
1630
1744
  throw new Error('transpile not implemented for ' + Object.getPrototypeOf(this).constructor.name);
@@ -1636,30 +1750,34 @@ class FieldStatement extends Statement {
1636
1750
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1637
1751
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1638
1752
  }
1639
- let type = this.getType(Parser_1.ParseMode.BrightScript);
1640
- if (!type || (0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
1753
+ let type = this.getType({ flags: SymbolTable_1.SymbolTypeFlag.typetime });
1754
+ if ((0, reflection_1.isInvalidType)(type) || (0, reflection_1.isVoidType)(type)) {
1641
1755
  type = new DynamicType_1.DynamicType();
1642
1756
  }
1643
- 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());
1757
+ result.push((_c = (_b = this.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' ');
1758
+ if (this.isOptional) {
1759
+ result.push(this.optional.text, ' ');
1760
+ }
1761
+ result.push((_d = this.name) === null || _d === void 0 ? void 0 : _d.text, ' as ', type.toTypeString());
1644
1762
  }
1645
1763
  return result;
1646
1764
  }
1647
1765
  walk(visitor, options) {
1648
1766
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1649
- (0, visitors_1.walk)(this, 'type', visitor, options);
1767
+ (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
1650
1768
  (0, visitors_1.walk)(this, 'initialValue', visitor, options);
1651
1769
  }
1652
1770
  }
1653
1771
  }
1654
1772
  exports.FieldStatement = FieldStatement;
1655
- class TryCatchStatement extends Statement {
1773
+ class TryCatchStatement extends AstNode_2.Statement {
1656
1774
  constructor(tokens, tryBranch, catchStatement) {
1657
- var _a;
1658
1775
  super();
1659
1776
  this.tokens = tokens;
1660
1777
  this.tryBranch = tryBranch;
1661
1778
  this.catchStatement = catchStatement;
1662
- 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;
1779
+ this.kind = AstNode_1.AstNodeKind.TryCatchStatement;
1780
+ this.range = util_1.util.createBoundingRange(tokens.try, tryBranch, catchStatement, tokens.endTry);
1663
1781
  }
1664
1782
  transpile(state) {
1665
1783
  var _a, _b;
@@ -1682,16 +1800,14 @@ class TryCatchStatement extends Statement {
1682
1800
  }
1683
1801
  }
1684
1802
  exports.TryCatchStatement = TryCatchStatement;
1685
- class CatchStatement extends Statement {
1803
+ class CatchStatement extends AstNode_2.Statement {
1686
1804
  constructor(tokens, exceptionVariable, catchBranch) {
1687
1805
  super();
1688
1806
  this.tokens = tokens;
1689
1807
  this.exceptionVariable = exceptionVariable;
1690
1808
  this.catchBranch = catchBranch;
1691
- }
1692
- get range() {
1693
- var _a, _b;
1694
- 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);
1809
+ this.kind = AstNode_1.AstNodeKind.CatchStatement;
1810
+ this.range = util_1.util.createBoundingRange(tokens.catch, exceptionVariable, catchBranch);
1695
1811
  }
1696
1812
  transpile(state) {
1697
1813
  var _a, _b, _c, _d;
@@ -1709,13 +1825,13 @@ class CatchStatement extends Statement {
1709
1825
  }
1710
1826
  }
1711
1827
  exports.CatchStatement = CatchStatement;
1712
- class ThrowStatement extends Statement {
1828
+ class ThrowStatement extends AstNode_2.Statement {
1713
1829
  constructor(throwToken, expression) {
1714
- var _a;
1715
1830
  super();
1716
1831
  this.throwToken = throwToken;
1717
1832
  this.expression = expression;
1718
- this.range = (_a = util_1.util.createBoundingRange(this.throwToken, this.expression)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1833
+ this.kind = AstNode_1.AstNodeKind.ThrowStatement;
1834
+ this.range = util_1.util.createBoundingRange(throwToken, expression);
1719
1835
  }
1720
1836
  transpile(state) {
1721
1837
  const result = [
@@ -1739,17 +1855,18 @@ class ThrowStatement extends Statement {
1739
1855
  }
1740
1856
  }
1741
1857
  exports.ThrowStatement = ThrowStatement;
1742
- class EnumStatement extends Statement {
1743
- constructor(tokens, body, namespaceName) {
1744
- var _a, _b, _c;
1858
+ class EnumStatement extends AstNode_2.Statement {
1859
+ constructor(tokens, body) {
1860
+ var _a;
1745
1861
  super();
1746
1862
  this.tokens = tokens;
1747
1863
  this.body = body;
1748
- this.namespaceName = namespaceName;
1749
- this.symbolTable = new SymbolTable_1.SymbolTable();
1750
- 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;
1751
- this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
1752
- this.symbolTable.name = `Enum ${(_c = tokens === null || tokens === void 0 ? void 0 : tokens.name) === null || _c === void 0 ? void 0 : _c.text}`;
1864
+ this.kind = AstNode_1.AstNodeKind.EnumStatement;
1865
+ this.symbolTable = new SymbolTable_2.SymbolTable('Enum');
1866
+ this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1867
+ }
1868
+ get range() {
1869
+ return util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum);
1753
1870
  }
1754
1871
  getMembers() {
1755
1872
  const result = [];
@@ -1760,12 +1877,15 @@ class EnumStatement extends Statement {
1760
1877
  }
1761
1878
  return result;
1762
1879
  }
1880
+ getLeadingTrivia() {
1881
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.enum.leadingTrivia);
1882
+ }
1763
1883
  /**
1764
1884
  * Get a map of member names and their values.
1765
1885
  * All values are stored as their AST LiteralExpression representation (i.e. string enum values include the wrapping quotes)
1766
1886
  */
1767
1887
  getMemberValueMap() {
1768
- var _a, _b, _c, _d, _e, _f, _g;
1888
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1769
1889
  const result = new Map();
1770
1890
  const members = this.getMembers();
1771
1891
  let currentIntValue = 0;
@@ -1784,10 +1904,14 @@ class EnumStatement extends Statement {
1784
1904
  currentIntValue++;
1785
1905
  }
1786
1906
  result.set((_c = member.name) === null || _c === void 0 ? void 0 : _c.toLowerCase(), member.value.token.text);
1907
+ //simple unary expressions (like `-1`)
1908
+ }
1909
+ else if ((0, reflection_1.isUnaryExpression)(member.value) && (0, reflection_1.isLiteralExpression)(member.value.right)) {
1910
+ result.set((_d = member.name) === null || _d === void 0 ? void 0 : _d.toLowerCase(), member.value.operator.text + member.value.right.token.text);
1787
1911
  //all other values
1788
1912
  }
1789
1913
  else {
1790
- 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');
1914
+ result.set((_e = member.name) === null || _e === void 0 ? void 0 : _e.toLowerCase(), (_h = (_g = (_f = member.value) === null || _f === void 0 ? void 0 : _f.token) === null || _g === void 0 ? void 0 : _g.text) !== null && _h !== void 0 ? _h : 'invalid');
1791
1915
  }
1792
1916
  }
1793
1917
  return result;
@@ -1795,12 +1919,6 @@ class EnumStatement extends Statement {
1795
1919
  getMemberValue(name) {
1796
1920
  return this.getMemberValueMap().get(name.toLowerCase());
1797
1921
  }
1798
- buildSymbolTable() {
1799
- this.symbolTable.clear();
1800
- for (const member of this.getMembers()) {
1801
- 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));
1802
- }
1803
- }
1804
1922
  /**
1805
1923
  * The name of the enum (without the namespace prefix)
1806
1924
  */
@@ -1815,8 +1933,9 @@ class EnumStatement extends Statement {
1815
1933
  var _a;
1816
1934
  const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1817
1935
  if (name) {
1818
- if (this.namespaceName) {
1819
- let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
1936
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1937
+ if (namespace) {
1938
+ let namespaceName = namespace.getName(Parser_1.ParseMode.BrighterScript);
1820
1939
  return `${namespaceName}.${name}`;
1821
1940
  }
1822
1941
  else {
@@ -1828,9 +1947,6 @@ class EnumStatement extends Statement {
1828
1947
  return undefined;
1829
1948
  }
1830
1949
  }
1831
- getThisBscType() {
1832
- return new EnumType_1.EnumType(this.fullName, this.symbolTable);
1833
- }
1834
1950
  transpile(state) {
1835
1951
  //enum declarations do not exist at runtime, so don't transpile anything...
1836
1952
  return [];
@@ -1858,15 +1974,27 @@ class EnumStatement extends Statement {
1858
1974
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1859
1975
  }
1860
1976
  }
1977
+ getType(options) {
1978
+ var _a, _b, _c;
1979
+ const members = this.getMembers();
1980
+ const resultType = new EnumType_1.EnumType(this.fullName, (_a = members[0]) === null || _a === void 0 ? void 0 : _a.getType(options).underlyingType);
1981
+ resultType.pushMemberProvider(() => this.getSymbolTable());
1982
+ for (const statement of members) {
1983
+ resultType.addMember((_c = (_b = statement === null || statement === void 0 ? void 0 : statement.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: statement }, statement.getType(options), SymbolTable_1.SymbolTypeFlag.runtime);
1984
+ }
1985
+ return resultType;
1986
+ }
1861
1987
  }
1862
1988
  exports.EnumStatement = EnumStatement;
1863
- class EnumMemberStatement extends Statement {
1989
+ class EnumMemberStatement extends AstNode_2.Statement {
1864
1990
  constructor(tokens, value) {
1865
- var _a;
1866
1991
  super();
1867
1992
  this.tokens = tokens;
1868
1993
  this.value = value;
1869
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1994
+ this.kind = AstNode_1.AstNodeKind.EnumMemberStatement;
1995
+ }
1996
+ get range() {
1997
+ return util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value);
1870
1998
  }
1871
1999
  /**
1872
2000
  * The name of the member
@@ -1874,6 +2002,9 @@ class EnumMemberStatement extends Statement {
1874
2002
  get name() {
1875
2003
  return this.tokens.name.text;
1876
2004
  }
2005
+ getLeadingTrivia() {
2006
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.name.leadingTrivia);
2007
+ }
1877
2008
  transpile(state) {
1878
2009
  return [];
1879
2010
  }
@@ -1894,19 +2025,26 @@ class EnumMemberStatement extends Statement {
1894
2025
  (0, visitors_1.walk)(this, 'value', visitor, options);
1895
2026
  }
1896
2027
  }
2028
+ getType(options) {
2029
+ var _a, _b, _c, _d;
2030
+ return new EnumType_1.EnumMemberType((_a = this.parent) === null || _a === void 0 ? void 0 : _a.fullName, (_c = (_b = this.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text, (_d = this.value) === null || _d === void 0 ? void 0 : _d.getType(options));
2031
+ }
1897
2032
  }
1898
2033
  exports.EnumMemberStatement = EnumMemberStatement;
1899
- class ConstStatement extends Statement {
1900
- constructor(tokens, value, namespaceName) {
2034
+ class ConstStatement extends AstNode_2.Statement {
2035
+ constructor(tokens, value) {
1901
2036
  super();
1902
2037
  this.tokens = tokens;
1903
2038
  this.value = value;
1904
- this.namespaceName = namespaceName;
2039
+ this.kind = AstNode_1.AstNodeKind.ConstStatement;
1905
2040
  this.range = util_1.util.createBoundingRange(this.tokens.const, this.tokens.name, this.tokens.equals, this.value);
1906
2041
  }
1907
2042
  get name() {
1908
2043
  return this.tokens.name.text;
1909
2044
  }
2045
+ getLeadingTrivia() {
2046
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.const.leadingTrivia);
2047
+ }
1910
2048
  /**
1911
2049
  * The name of the statement WITH its leading namespace (if applicable)
1912
2050
  */
@@ -1914,8 +2052,9 @@ class ConstStatement extends Statement {
1914
2052
  var _a;
1915
2053
  const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1916
2054
  if (name) {
1917
- if (this.namespaceName) {
1918
- let namespaceName = this.namespaceName.getName(Parser_1.ParseMode.BrighterScript);
2055
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
2056
+ if (namespace) {
2057
+ let namespaceName = namespace.getName(Parser_1.ParseMode.BrighterScript);
1919
2058
  return `${namespaceName}.${name}`;
1920
2059
  }
1921
2060
  else {
@@ -1947,6 +2086,29 @@ class ConstStatement extends Statement {
1947
2086
  (0, visitors_1.walk)(this, 'value', visitor, options);
1948
2087
  }
1949
2088
  }
2089
+ getType(options) {
2090
+ return this.value.getType(options);
2091
+ }
1950
2092
  }
1951
2093
  exports.ConstStatement = ConstStatement;
2094
+ class ContinueStatement extends AstNode_2.Statement {
2095
+ constructor(tokens) {
2096
+ super();
2097
+ this.tokens = tokens;
2098
+ this.kind = AstNode_1.AstNodeKind.ContinueStatement;
2099
+ this.range = util_1.util.createBoundingRange(tokens.continue, tokens.loopType);
2100
+ }
2101
+ transpile(state) {
2102
+ var _a, _b, _c, _d, _e;
2103
+ return [
2104
+ state.sourceNode(this.tokens.continue, (_b = (_a = this.tokens.continue) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : 'continue'),
2105
+ (_d = (_c = this.tokens.loopType) === null || _c === void 0 ? void 0 : _c.leadingWhitespace) !== null && _d !== void 0 ? _d : ' ',
2106
+ state.sourceNode(this.tokens.continue, (_e = this.tokens.loopType) === null || _e === void 0 ? void 0 : _e.text)
2107
+ ];
2108
+ }
2109
+ walk(visitor, options) {
2110
+ //nothing to walk
2111
+ }
2112
+ }
2113
+ exports.ContinueStatement = ContinueStatement;
1952
2114
  //# sourceMappingURL=Statement.js.map