brighterscript 1.0.0-alpha.23 → 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 (536) hide show
  1. package/CHANGELOG.md +585 -218
  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 +79 -15
  33. package/dist/DiagnosticMessages.js +134 -21
  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 +222 -87
  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 +162 -81
  54. package/dist/Program.js +903 -732
  55. package/dist/Program.js.map +1 -1
  56. package/dist/ProgramBuilder.d.ts +22 -12
  57. package/dist/ProgramBuilder.js +132 -104
  58. package/dist/ProgramBuilder.js.map +1 -1
  59. package/dist/Scope.d.ts +95 -134
  60. package/dist/Scope.js +477 -551
  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 +95 -29
  65. package/dist/SymbolTable.js +256 -102
  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 -68
  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 -100
  90. package/dist/astUtils/reflection.js +225 -166
  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 +54 -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 +12 -2
  105. package/dist/bscPlugin/BscPlugin.js +41 -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.d.ts +1 -1
  117. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +21 -12
  118. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  119. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +86 -12
  120. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  121. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +57 -0
  122. package/dist/bscPlugin/completions/CompletionsProcessor.js +544 -0
  123. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
  124. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +1909 -0
  125. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -0
  126. package/dist/bscPlugin/fileProviders/FileProvider.d.ts +9 -0
  127. package/dist/bscPlugin/fileProviders/FileProvider.js +51 -0
  128. package/dist/bscPlugin/fileProviders/FileProvider.js.map +1 -0
  129. package/dist/bscPlugin/hover/HoverProcessor.d.ts +17 -0
  130. package/dist/bscPlugin/hover/HoverProcessor.js +188 -0
  131. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
  132. package/dist/bscPlugin/hover/HoverProcessor.spec.js +513 -0
  133. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
  134. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +3 -1
  135. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +102 -29
  136. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  137. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +167 -6
  138. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  139. package/dist/bscPlugin/serialize/BslibInjector.spec.d.ts +1 -0
  140. package/dist/bscPlugin/serialize/BslibInjector.spec.js +19 -0
  141. package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
  142. package/dist/bscPlugin/serialize/BslibManager.d.ts +9 -0
  143. package/dist/bscPlugin/serialize/BslibManager.js +40 -0
  144. package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
  145. package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
  146. package/dist/bscPlugin/serialize/FileSerializer.js +72 -0
  147. package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
  148. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +16 -0
  149. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +123 -0
  150. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -0
  151. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.d.ts +1 -0
  152. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js +41 -0
  153. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +1 -0
  154. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +12 -0
  155. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +99 -0
  156. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
  157. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +22 -1
  158. package/dist/bscPlugin/validation/BrsFileValidator.js +316 -29
  159. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  160. package/dist/bscPlugin/validation/BrsFileValidator.spec.d.ts +1 -0
  161. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +264 -0
  162. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -0
  163. package/dist/bscPlugin/validation/ProgramValidator.d.ts +10 -0
  164. package/dist/bscPlugin/validation/ProgramValidator.js +32 -0
  165. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -0
  166. package/dist/bscPlugin/validation/ScopeValidator.d.ts +56 -8
  167. package/dist/bscPlugin/validation/ScopeValidator.js +514 -116
  168. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  169. package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +1 -0
  170. package/dist/bscPlugin/validation/ScopeValidator.spec.js +2454 -0
  171. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -0
  172. package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
  173. package/dist/bscPlugin/validation/XmlFileValidator.js +44 -0
  174. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
  175. package/dist/cli.js +107 -8
  176. package/dist/cli.js.map +1 -1
  177. package/dist/deferred.d.ts +3 -3
  178. package/dist/deferred.js.map +1 -1
  179. package/dist/diagnosticUtils.d.ts +8 -2
  180. package/dist/diagnosticUtils.js +47 -17
  181. package/dist/diagnosticUtils.js.map +1 -1
  182. package/dist/examples/plugins/removePrint.js +8 -10
  183. package/dist/examples/plugins/removePrint.js.map +1 -1
  184. package/dist/files/AssetFile.d.ts +26 -0
  185. package/dist/files/AssetFile.js +26 -0
  186. package/dist/files/AssetFile.js.map +1 -0
  187. package/dist/files/BrsFile.Class.spec.js +529 -486
  188. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  189. package/dist/files/BrsFile.d.ts +124 -112
  190. package/dist/files/BrsFile.js +819 -1131
  191. package/dist/files/BrsFile.js.map +1 -1
  192. package/dist/files/BrsFile.spec.js +1869 -1277
  193. package/dist/files/BrsFile.spec.js.map +1 -1
  194. package/dist/files/BscFile.d.ts +104 -0
  195. package/dist/files/BscFile.js +16 -0
  196. package/dist/files/BscFile.js.map +1 -0
  197. package/dist/files/Factory.d.ts +25 -0
  198. package/dist/files/Factory.js +22 -0
  199. package/dist/files/Factory.js.map +1 -0
  200. package/dist/files/LazyFileData.d.ts +20 -0
  201. package/dist/files/LazyFileData.js +54 -0
  202. package/dist/files/LazyFileData.js.map +1 -0
  203. package/dist/files/LazyFileData.spec.d.ts +1 -0
  204. package/dist/files/LazyFileData.spec.js +27 -0
  205. package/dist/files/LazyFileData.spec.js.map +1 -0
  206. package/dist/files/XmlFile.d.ts +70 -32
  207. package/dist/files/XmlFile.js +106 -117
  208. package/dist/files/XmlFile.js.map +1 -1
  209. package/dist/files/XmlFile.spec.js +325 -262
  210. package/dist/files/XmlFile.spec.js.map +1 -1
  211. package/dist/files/tests/imports.spec.js +49 -41
  212. package/dist/files/tests/imports.spec.js.map +1 -1
  213. package/dist/files/tests/optionalChaning.spec.js +104 -40
  214. package/dist/files/tests/optionalChaning.spec.js.map +1 -1
  215. package/dist/globalCallables.js +16 -18
  216. package/dist/globalCallables.js.map +1 -1
  217. package/dist/index.d.ts +13 -2
  218. package/dist/index.js +15 -2
  219. package/dist/index.js.map +1 -1
  220. package/dist/interfaces.d.ts +440 -150
  221. package/dist/interfaces.js +27 -0
  222. package/dist/interfaces.js.map +1 -1
  223. package/dist/lexer/Character.spec.js +5 -5
  224. package/dist/lexer/Character.spec.js.map +1 -1
  225. package/dist/lexer/Lexer.d.ts +12 -5
  226. package/dist/lexer/Lexer.js +28 -13
  227. package/dist/lexer/Lexer.js.map +1 -1
  228. package/dist/lexer/Lexer.spec.js +187 -134
  229. package/dist/lexer/Lexer.spec.js.map +1 -1
  230. package/dist/lexer/Token.d.ts +9 -1
  231. package/dist/lexer/Token.js +9 -1
  232. package/dist/lexer/Token.js.map +1 -1
  233. package/dist/lexer/TokenKind.d.ts +9 -0
  234. package/dist/lexer/TokenKind.js +30 -5
  235. package/dist/lexer/TokenKind.js.map +1 -1
  236. package/dist/parser/AstNode.d.ts +162 -0
  237. package/dist/parser/AstNode.js +225 -0
  238. package/dist/parser/AstNode.js.map +1 -0
  239. package/dist/parser/AstNode.spec.d.ts +1 -0
  240. package/dist/parser/AstNode.spec.js +165 -0
  241. package/dist/parser/AstNode.spec.js.map +1 -0
  242. package/dist/parser/BrsTranspileState.d.ts +4 -7
  243. package/dist/parser/BrsTranspileState.js +4 -12
  244. package/dist/parser/BrsTranspileState.js.map +1 -1
  245. package/dist/parser/Expression.d.ts +126 -167
  246. package/dist/parser/Expression.js +524 -394
  247. package/dist/parser/Expression.js.map +1 -1
  248. package/dist/parser/Parser.Class.spec.js +152 -146
  249. package/dist/parser/Parser.Class.spec.js.map +1 -1
  250. package/dist/parser/Parser.d.ts +45 -196
  251. package/dist/parser/Parser.js +470 -926
  252. package/dist/parser/Parser.js.map +1 -1
  253. package/dist/parser/Parser.spec.d.ts +3 -1
  254. package/dist/parser/Parser.spec.js +1034 -805
  255. package/dist/parser/Parser.spec.js.map +1 -1
  256. package/dist/parser/SGParser.d.ts +9 -8
  257. package/dist/parser/SGParser.js +10 -8
  258. package/dist/parser/SGParser.js.map +1 -1
  259. package/dist/parser/SGParser.spec.js +27 -38
  260. package/dist/parser/SGParser.spec.js.map +1 -1
  261. package/dist/parser/SGTypes.d.ts +98 -35
  262. package/dist/parser/SGTypes.js +169 -99
  263. package/dist/parser/SGTypes.js.map +1 -1
  264. package/dist/parser/Statement.d.ts +208 -122
  265. package/dist/parser/Statement.js +599 -364
  266. package/dist/parser/Statement.js.map +1 -1
  267. package/dist/parser/Statement.spec.js +45 -21
  268. package/dist/parser/Statement.spec.js.map +1 -1
  269. package/dist/parser/TranspileState.d.ts +1 -1
  270. package/dist/parser/TranspileState.js +7 -12
  271. package/dist/parser/TranspileState.js.map +1 -1
  272. package/dist/parser/tests/Parser.spec.js +3 -2
  273. package/dist/parser/tests/Parser.spec.js.map +1 -1
  274. package/dist/parser/tests/controlFlow/For.spec.js +33 -23
  275. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  276. package/dist/parser/tests/controlFlow/ForEach.spec.js +25 -20
  277. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  278. package/dist/parser/tests/controlFlow/If.spec.js +96 -94
  279. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  280. package/dist/parser/tests/controlFlow/While.spec.js +22 -16
  281. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  282. package/dist/parser/tests/expression/Additive.spec.js +8 -8
  283. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  284. package/dist/parser/tests/expression/ArrayLiterals.spec.js +58 -21
  285. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  286. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +61 -20
  287. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  288. package/dist/parser/tests/expression/Boolean.spec.js +8 -8
  289. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  290. package/dist/parser/tests/expression/Call.spec.js +129 -21
  291. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  292. package/dist/parser/tests/expression/Exponential.spec.js +5 -5
  293. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  294. package/dist/parser/tests/expression/Function.spec.js +36 -36
  295. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  296. package/dist/parser/tests/expression/Indexing.spec.js +67 -22
  297. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  298. package/dist/parser/tests/expression/Multiplicative.spec.js +9 -9
  299. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  300. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +123 -81
  301. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  302. package/dist/parser/tests/expression/PrefixUnary.spec.js +12 -12
  303. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  304. package/dist/parser/tests/expression/Primary.spec.js +12 -12
  305. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  306. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +10 -10
  307. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -1
  308. package/dist/parser/tests/expression/Relational.spec.js +13 -13
  309. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  310. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +24 -24
  311. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  312. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +221 -81
  313. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  314. package/dist/parser/tests/expression/TernaryExpression.spec.js +287 -105
  315. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  316. package/dist/parser/tests/expression/TypeExpression.spec.d.ts +1 -0
  317. package/dist/parser/tests/expression/TypeExpression.spec.js +127 -0
  318. package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -0
  319. package/dist/parser/tests/expression/UnaryExpression.spec.d.ts +1 -0
  320. package/dist/parser/tests/expression/UnaryExpression.spec.js +52 -0
  321. package/dist/parser/tests/expression/UnaryExpression.spec.js.map +1 -0
  322. package/dist/parser/tests/statement/AssignmentOperators.spec.js +15 -15
  323. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  324. package/dist/parser/tests/statement/ConstStatement.spec.d.ts +1 -0
  325. package/dist/parser/tests/statement/ConstStatement.spec.js +262 -0
  326. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -0
  327. package/dist/parser/tests/statement/Continue.spec.d.ts +1 -0
  328. package/dist/parser/tests/statement/Continue.spec.js +119 -0
  329. package/dist/parser/tests/statement/Continue.spec.js.map +1 -0
  330. package/dist/parser/tests/statement/Declaration.spec.js +19 -19
  331. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  332. package/dist/parser/tests/statement/Dim.spec.js +22 -22
  333. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  334. package/dist/parser/tests/statement/Enum.spec.js +111 -300
  335. package/dist/parser/tests/statement/Enum.spec.js.map +1 -1
  336. package/dist/parser/tests/statement/For.spec.js +9 -10
  337. package/dist/parser/tests/statement/For.spec.js.map +1 -1
  338. package/dist/parser/tests/statement/ForEach.spec.js +8 -9
  339. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -1
  340. package/dist/parser/tests/statement/Function.spec.js +44 -35
  341. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  342. package/dist/parser/tests/statement/Goto.spec.js +5 -5
  343. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  344. package/dist/parser/tests/statement/Increment.spec.js +20 -20
  345. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  346. package/dist/parser/tests/statement/InterfaceStatement.spec.js +30 -196
  347. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -1
  348. package/dist/parser/tests/statement/LibraryStatement.spec.js +11 -11
  349. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  350. package/dist/parser/tests/statement/Misc.spec.js +16 -78
  351. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  352. package/dist/parser/tests/statement/PrintStatement.spec.js +107 -90
  353. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  354. package/dist/parser/tests/statement/ReturnStatement.spec.js +14 -12
  355. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  356. package/dist/parser/tests/statement/Set.spec.js +48 -35
  357. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  358. package/dist/parser/tests/statement/Stop.spec.js +6 -6
  359. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  360. package/dist/parser/tests/statement/Throw.spec.js +6 -6
  361. package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
  362. package/dist/parser/tests/statement/TryCatch.spec.js +18 -16
  363. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  364. package/dist/preprocessor/Manifest.d.ts +1 -1
  365. package/dist/preprocessor/Manifest.js +3 -3
  366. package/dist/preprocessor/Manifest.js.map +1 -1
  367. package/dist/preprocessor/Manifest.spec.js +8 -8
  368. package/dist/preprocessor/Manifest.spec.js.map +1 -1
  369. package/dist/preprocessor/Preprocessor.d.ts +5 -6
  370. package/dist/preprocessor/Preprocessor.js +15 -11
  371. package/dist/preprocessor/Preprocessor.js.map +1 -1
  372. package/dist/preprocessor/Preprocessor.spec.js +25 -25
  373. package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
  374. package/dist/preprocessor/PreprocessorParser.d.ts +1 -1
  375. package/dist/preprocessor/PreprocessorParser.js +7 -1
  376. package/dist/preprocessor/PreprocessorParser.js.map +1 -1
  377. package/dist/preprocessor/PreprocessorParser.spec.js +13 -13
  378. package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
  379. package/dist/roku-types/data.json +6544 -10519
  380. package/dist/roku-types/index.d.ts +662 -1934
  381. package/dist/types/ArrayType.d.ts +10 -9
  382. package/dist/types/ArrayType.js +65 -60
  383. package/dist/types/ArrayType.js.map +1 -1
  384. package/dist/types/ArrayType.spec.js +36 -68
  385. package/dist/types/ArrayType.spec.js.map +1 -1
  386. package/dist/types/AssociativeArrayType.d.ts +11 -0
  387. package/dist/types/AssociativeArrayType.js +52 -0
  388. package/dist/types/AssociativeArrayType.js.map +1 -0
  389. package/dist/types/BaseFunctionType.d.ts +9 -0
  390. package/dist/types/BaseFunctionType.js +25 -0
  391. package/dist/types/BaseFunctionType.js.map +1 -0
  392. package/dist/types/BooleanType.d.ts +8 -5
  393. package/dist/types/BooleanType.js +14 -7
  394. package/dist/types/BooleanType.js.map +1 -1
  395. package/dist/types/BooleanType.spec.js +10 -6
  396. package/dist/types/BooleanType.spec.js.map +1 -1
  397. package/dist/types/BscType.d.ts +32 -21
  398. package/dist/types/BscType.js +118 -21
  399. package/dist/types/BscType.js.map +1 -1
  400. package/dist/types/BscTypeKind.d.ts +25 -0
  401. package/dist/types/BscTypeKind.js +30 -0
  402. package/dist/types/BscTypeKind.js.map +1 -0
  403. package/dist/types/BuiltInInterfaceAdder.d.ts +23 -0
  404. package/dist/types/BuiltInInterfaceAdder.js +164 -0
  405. package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
  406. package/dist/types/BuiltInInterfaceAdder.spec.d.ts +1 -0
  407. package/dist/types/BuiltInInterfaceAdder.spec.js +116 -0
  408. package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -0
  409. package/dist/types/ClassType.d.ts +17 -0
  410. package/dist/types/ClassType.js +58 -0
  411. package/dist/types/ClassType.js.map +1 -0
  412. package/dist/types/ClassType.spec.d.ts +1 -0
  413. package/dist/types/ClassType.spec.js +77 -0
  414. package/dist/types/ClassType.spec.js.map +1 -0
  415. package/dist/types/ComponentType.d.ts +26 -0
  416. package/dist/types/ComponentType.js +83 -0
  417. package/dist/types/ComponentType.js.map +1 -0
  418. package/dist/types/DoubleType.d.ts +8 -5
  419. package/dist/types/DoubleType.js +18 -16
  420. package/dist/types/DoubleType.js.map +1 -1
  421. package/dist/types/DoubleType.spec.js +12 -6
  422. package/dist/types/DoubleType.spec.js.map +1 -1
  423. package/dist/types/DynamicType.d.ts +10 -5
  424. package/dist/types/DynamicType.js +16 -4
  425. package/dist/types/DynamicType.js.map +1 -1
  426. package/dist/types/DynamicType.spec.js +16 -5
  427. package/dist/types/DynamicType.spec.js.map +1 -1
  428. package/dist/types/EnumType.d.ts +30 -12
  429. package/dist/types/EnumType.js +43 -17
  430. package/dist/types/EnumType.js.map +1 -1
  431. package/dist/types/EnumType.spec.d.ts +1 -0
  432. package/dist/types/EnumType.spec.js +33 -0
  433. package/dist/types/EnumType.spec.js.map +1 -0
  434. package/dist/types/FloatType.d.ts +8 -5
  435. package/dist/types/FloatType.js +18 -16
  436. package/dist/types/FloatType.js.map +1 -1
  437. package/dist/types/FloatType.spec.js +4 -6
  438. package/dist/types/FloatType.spec.js.map +1 -1
  439. package/dist/types/FunctionType.d.ts +13 -8
  440. package/dist/types/FunctionType.js +30 -14
  441. package/dist/types/FunctionType.js.map +1 -1
  442. package/dist/types/InheritableType.d.ts +28 -0
  443. package/dist/types/InheritableType.js +152 -0
  444. package/dist/types/InheritableType.js.map +1 -0
  445. package/dist/types/IntegerType.d.ts +8 -5
  446. package/dist/types/IntegerType.js +18 -16
  447. package/dist/types/IntegerType.js.map +1 -1
  448. package/dist/types/IntegerType.spec.js +8 -6
  449. package/dist/types/IntegerType.spec.js.map +1 -1
  450. package/dist/types/InterfaceType.d.ts +12 -13
  451. package/dist/types/InterfaceType.js +20 -48
  452. package/dist/types/InterfaceType.js.map +1 -1
  453. package/dist/types/InterfaceType.spec.js +90 -56
  454. package/dist/types/InterfaceType.spec.js.map +1 -1
  455. package/dist/types/InvalidType.d.ts +7 -5
  456. package/dist/types/InvalidType.js +13 -7
  457. package/dist/types/InvalidType.js.map +1 -1
  458. package/dist/types/InvalidType.spec.js +8 -6
  459. package/dist/types/InvalidType.spec.js.map +1 -1
  460. package/dist/types/LongIntegerType.d.ts +8 -5
  461. package/dist/types/LongIntegerType.js +17 -15
  462. package/dist/types/LongIntegerType.js.map +1 -1
  463. package/dist/types/LongIntegerType.spec.js +10 -6
  464. package/dist/types/LongIntegerType.spec.js.map +1 -1
  465. package/dist/types/NamespaceType.d.ts +12 -0
  466. package/dist/types/NamespaceType.js +28 -0
  467. package/dist/types/NamespaceType.js.map +1 -0
  468. package/dist/types/ObjectType.d.ts +9 -8
  469. package/dist/types/ObjectType.js +21 -11
  470. package/dist/types/ObjectType.js.map +1 -1
  471. package/dist/types/ObjectType.spec.js +3 -3
  472. package/dist/types/ObjectType.spec.js.map +1 -1
  473. package/dist/types/ReferenceType.d.ts +63 -0
  474. package/dist/types/ReferenceType.js +423 -0
  475. package/dist/types/ReferenceType.js.map +1 -0
  476. package/dist/types/ReferenceType.spec.d.ts +1 -0
  477. package/dist/types/ReferenceType.spec.js +137 -0
  478. package/dist/types/ReferenceType.spec.js.map +1 -0
  479. package/dist/types/StringType.d.ts +11 -5
  480. package/dist/types/StringType.js +18 -7
  481. package/dist/types/StringType.js.map +1 -1
  482. package/dist/types/StringType.spec.js +3 -5
  483. package/dist/types/StringType.spec.js.map +1 -1
  484. package/dist/types/TypedFunctionType.d.ts +22 -17
  485. package/dist/types/TypedFunctionType.js +78 -60
  486. package/dist/types/TypedFunctionType.js.map +1 -1
  487. package/dist/types/TypedFunctionType.spec.js +105 -20
  488. package/dist/types/TypedFunctionType.spec.js.map +1 -1
  489. package/dist/types/UninitializedType.d.ts +8 -6
  490. package/dist/types/UninitializedType.js +13 -7
  491. package/dist/types/UninitializedType.js.map +1 -1
  492. package/dist/types/UnionType.d.ts +20 -0
  493. package/dist/types/UnionType.js +123 -0
  494. package/dist/types/UnionType.js.map +1 -0
  495. package/dist/types/UnionType.spec.d.ts +1 -0
  496. package/dist/types/UnionType.spec.js +130 -0
  497. package/dist/types/UnionType.spec.js.map +1 -0
  498. package/dist/types/VoidType.d.ts +8 -5
  499. package/dist/types/VoidType.js +14 -7
  500. package/dist/types/VoidType.js.map +1 -1
  501. package/dist/types/VoidType.spec.js +3 -3
  502. package/dist/types/VoidType.spec.js.map +1 -1
  503. package/dist/types/helper.spec.d.ts +1 -0
  504. package/dist/types/helper.spec.js +145 -0
  505. package/dist/types/helper.spec.js.map +1 -0
  506. package/dist/types/helpers.d.ts +19 -37
  507. package/dist/types/helpers.js +159 -99
  508. package/dist/types/helpers.js.map +1 -1
  509. package/dist/types/index.d.ts +22 -0
  510. package/dist/types/index.js +39 -0
  511. package/dist/types/index.js.map +1 -0
  512. package/dist/util.d.ts +167 -131
  513. package/dist/util.js +890 -350
  514. package/dist/util.js.map +1 -1
  515. package/dist/validators/ClassValidator.d.ts +7 -25
  516. package/dist/validators/ClassValidator.js +103 -194
  517. package/dist/validators/ClassValidator.js.map +1 -1
  518. package/package.json +165 -149
  519. package/dist/astUtils/AstEditor.js.map +0 -1
  520. package/dist/astUtils/AstEditor.spec.js.map +0 -1
  521. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +0 -8
  522. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +0 -40
  523. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +0 -1
  524. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +0 -32
  525. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +0 -1
  526. package/dist/parser/SGTypes.spec.js +0 -351
  527. package/dist/parser/SGTypes.spec.js.map +0 -1
  528. package/dist/types/CustomType.d.ts +0 -12
  529. package/dist/types/CustomType.js +0 -44
  530. package/dist/types/CustomType.js.map +0 -1
  531. package/dist/types/LazyType.d.ts +0 -16
  532. package/dist/types/LazyType.js +0 -44
  533. package/dist/types/LazyType.js.map +0 -1
  534. /package/dist/astUtils/{AstEditor.spec.d.ts → Editor.spec.d.ts} +0 -0
  535. /package/dist/bscPlugin/{transpile/BrsFilePreTranspileProcessor.spec.d.ts → completions/CompletionsProcessor.spec.d.ts} +0 -0
  536. /package/dist/{parser/SGTypes.spec.d.ts → bscPlugin/hover/HoverProcessor.spec.d.ts} +0 -0
@@ -1,32 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EnumMemberStatement = exports.EnumStatement = exports.ThrowStatement = exports.CatchStatement = exports.TryCatchStatement = exports.FieldStatement = exports.MethodStatement = exports.ClassStatement = exports.InterfaceMethodStatement = exports.InterfaceFieldStatement = exports.InterfaceStatement = exports.ImportStatement = exports.NamespaceStatement = exports.LibraryStatement = exports.IndexedSetStatement = exports.DottedSetStatement = exports.WhileStatement = exports.ForEachStatement = exports.ForStatement = exports.StopStatement = exports.EndStatement = exports.ReturnStatement = exports.LabelStatement = exports.GotoStatement = exports.DimStatement = exports.PrintStatement = exports.IncrementStatement = exports.IfStatement = exports.FunctionStatement = exports.ExitWhileStatement = exports.ExitForStatement = exports.CommentStatement = exports.ExpressionStatement = exports.Block = exports.AssignmentStatement = exports.Body = exports.EmptyStatement = exports.Statement = void 0;
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 InterfaceType_1 = require("../types/InterfaceType");
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");
15
18
  const EnumType_1 = require("../types/EnumType");
16
- const FunctionType_1 = require("../types/FunctionType");
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
- exports.Statement = Statement;
29
- class EmptyStatement extends Statement {
19
+ const NamespaceType_1 = require("../types/NamespaceType");
20
+ const InterfaceType_1 = require("../types/InterfaceType");
21
+ const VoidType_1 = require("../types/VoidType");
22
+ const TypedFunctionType_1 = require("../types/TypedFunctionType");
23
+ class EmptyStatement extends AstNode_2.Statement {
30
24
  constructor(
31
25
  /**
32
26
  * Create a negative range to indicate this is an interpolated location
@@ -34,6 +28,7 @@ class EmptyStatement extends Statement {
34
28
  range = creators_1.interpolatedRange) {
35
29
  super();
36
30
  this.range = range;
31
+ this.kind = AstNode_1.AstNodeKind.EmptyStatement;
37
32
  }
38
33
  transpile(state) {
39
34
  return [];
@@ -46,12 +41,17 @@ exports.EmptyStatement = EmptyStatement;
46
41
  /**
47
42
  * This is a top-level statement. Consider this the root of the AST
48
43
  */
49
- class Body extends Statement {
44
+ class Body extends AstNode_2.Statement {
50
45
  constructor(statements = []) {
51
- var _a;
52
46
  super();
53
47
  this.statements = statements;
54
- this.range = (_a = util_1.util.createBoundingRange(...this.statements)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
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(); });
50
+ }
51
+ get range() {
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 : []));
55
55
  }
56
56
  transpile(state) {
57
57
  let result = [];
@@ -99,15 +99,16 @@ class Body extends Statement {
99
99
  }
100
100
  }
101
101
  exports.Body = Body;
102
- class AssignmentStatement extends Statement {
103
- constructor(name, equals, value, containingFunction) {
104
- var _a;
102
+ class AssignmentStatement extends AstNode_2.Statement {
103
+ constructor(equals, name, value, asToken, typeExpression) {
105
104
  super();
106
- this.name = name;
107
105
  this.equals = equals;
106
+ this.name = name;
108
107
  this.value = value;
109
- this.containingFunction = containingFunction;
110
- 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);
111
112
  }
112
113
  transpile(state) {
113
114
  var _a, _b;
@@ -127,18 +128,28 @@ class AssignmentStatement extends Statement {
127
128
  }
128
129
  walk(visitor, options) {
129
130
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
131
+ //TODO: Walk TypeExpression. We need to decide how to implement types on assignments
130
132
  (0, visitors_1.walk)(this, 'value', visitor, options);
131
133
  }
132
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
+ }
133
144
  }
134
145
  exports.AssignmentStatement = AssignmentStatement;
135
- class Block extends Statement {
146
+ class Block extends AstNode_2.Statement {
136
147
  constructor(statements, startingRange) {
137
- var _a;
138
148
  super();
139
149
  this.statements = statements;
140
150
  this.startingRange = startingRange;
141
- 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 : []));
142
153
  }
143
154
  transpile(state) {
144
155
  state.blockDepth++;
@@ -171,12 +182,12 @@ class Block extends Statement {
171
182
  }
172
183
  }
173
184
  exports.Block = Block;
174
- class ExpressionStatement extends Statement {
185
+ class ExpressionStatement extends AstNode_2.Statement {
175
186
  constructor(expression) {
176
- var _a, _b;
177
187
  super();
178
188
  this.expression = expression;
179
- 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;
180
191
  }
181
192
  transpile(state) {
182
193
  return this.expression.transpile(state);
@@ -188,13 +199,16 @@ class ExpressionStatement extends Statement {
188
199
  }
189
200
  }
190
201
  exports.ExpressionStatement = ExpressionStatement;
191
- class CommentStatement extends Statement {
202
+ class CommentStatement extends AstNode_2.Statement {
192
203
  constructor(comments) {
193
204
  var _a;
194
205
  super();
195
206
  this.comments = comments;
196
- this.range = (_a = util_1.util.createBoundingRange(...this.comments)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
207
+ this.kind = AstNode_1.AstNodeKind.CommentStatement;
197
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
+ }
198
212
  }
199
213
  get text() {
200
214
  return this.comments.map(x => x.text).join('\n');
@@ -222,12 +236,12 @@ class CommentStatement extends Statement {
222
236
  }
223
237
  }
224
238
  exports.CommentStatement = CommentStatement;
225
- class ExitForStatement extends Statement {
239
+ class ExitForStatement extends AstNode_2.Statement {
226
240
  constructor(tokens) {
227
- var _a, _b, _c;
228
241
  super();
229
242
  this.tokens = tokens;
230
- this.range = (_c = (_b = (_a = this.tokens) === null || _a === void 0 ? void 0 : _a.exitFor) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : creators_1.interpolatedRange;
243
+ this.kind = AstNode_1.AstNodeKind.ExitForStatement;
244
+ this.range = this.tokens.exitFor.range;
231
245
  }
232
246
  transpile(state) {
233
247
  return [
@@ -239,12 +253,12 @@ class ExitForStatement extends Statement {
239
253
  }
240
254
  }
241
255
  exports.ExitForStatement = ExitForStatement;
242
- class ExitWhileStatement extends Statement {
256
+ class ExitWhileStatement extends AstNode_2.Statement {
243
257
  constructor(tokens) {
244
- var _a, _b, _c;
245
258
  super();
246
259
  this.tokens = tokens;
247
- this.range = (_c = (_b = (_a = this.tokens) === null || _a === void 0 ? void 0 : _a.exitWhile) === null || _b === void 0 ? void 0 : _b.range) !== null && _c !== void 0 ? _c : creators_1.interpolatedRange;
260
+ this.kind = AstNode_1.AstNodeKind.ExitWhileStatement;
261
+ this.range = this.tokens.exitWhile.range;
248
262
  }
249
263
  transpile(state) {
250
264
  return [
@@ -256,36 +270,32 @@ class ExitWhileStatement extends Statement {
256
270
  }
257
271
  }
258
272
  exports.ExitWhileStatement = ExitWhileStatement;
259
- class FunctionStatement extends Statement {
260
- constructor(name, func, namespaceName) {
273
+ class FunctionStatement extends AstNode_2.Statement {
274
+ constructor(name, func) {
261
275
  super();
262
276
  this.name = name;
263
277
  this.func = func;
264
- this.namespaceName = namespaceName;
265
- }
266
- get range() {
267
- return this.cacheRange();
268
- }
269
- cacheRange() {
270
- var _a, _b;
271
- if (!this._range) {
272
- this._range = (_b = (_a = this.func) === null || _a === void 0 ? void 0 : _a.range) !== null && _b !== void 0 ? _b : this.name.range;
273
- }
274
- return this._range;
278
+ this.kind = AstNode_1.AstNodeKind.FunctionStatement;
279
+ this.range = this.func.range;
275
280
  }
276
281
  /**
277
282
  * Get the name of this expression based on the parse mode
278
283
  */
279
284
  getName(parseMode) {
280
- if (this.namespaceName) {
285
+ var _a;
286
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
287
+ if (namespace) {
281
288
  let delimiter = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
282
- let namespaceName = this.namespaceName.getName(parseMode);
283
- 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);
284
291
  }
285
292
  else {
286
293
  return this.name.text;
287
294
  }
288
295
  }
296
+ getLeadingTrivia() {
297
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.func.getLeadingTrivia());
298
+ }
289
299
  transpile(state) {
290
300
  //create a fake token using the full transpiled name
291
301
  let nameToken = Object.assign(Object.assign({}, this.name), { text: this.getName(Parser_1.ParseMode.BrightScript) });
@@ -297,7 +307,7 @@ class FunctionStatement extends Statement {
297
307
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
298
308
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
299
309
  }
300
- result.push(...this.func.getTypedef(state, this.name));
310
+ result.push(...this.func.getTypedef(state));
301
311
  return result;
302
312
  }
303
313
  walk(visitor, options) {
@@ -305,18 +315,24 @@ class FunctionStatement extends Statement {
305
315
  (0, visitors_1.walk)(this, 'func', visitor, options);
306
316
  }
307
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
+ }
308
324
  }
309
325
  exports.FunctionStatement = FunctionStatement;
310
- class IfStatement extends Statement {
326
+ class IfStatement extends AstNode_2.Statement {
311
327
  constructor(tokens, condition, thenBranch, elseBranch, isInline) {
312
- var _a;
313
328
  super();
314
329
  this.tokens = tokens;
315
330
  this.condition = condition;
316
331
  this.thenBranch = thenBranch;
317
332
  this.elseBranch = elseBranch;
318
333
  this.isInline = isInline;
319
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.if, this.condition, this.tokens.then, this.thenBranch, this.tokens.else, this.elseBranch, this.tokens.endIf)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
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);
320
336
  }
321
337
  transpile(state) {
322
338
  let results = [];
@@ -362,7 +378,7 @@ class IfStatement extends Statement {
362
378
  }
363
379
  else {
364
380
  //else body
365
- state.lineage.unshift(this.elseBranch);
381
+ state.lineage.unshift(this.tokens.else);
366
382
  let body = this.elseBranch.transpile(state);
367
383
  state.lineage.shift();
368
384
  if (body.length > 0) {
@@ -394,13 +410,13 @@ class IfStatement extends Statement {
394
410
  }
395
411
  }
396
412
  exports.IfStatement = IfStatement;
397
- class IncrementStatement extends Statement {
413
+ class IncrementStatement extends AstNode_2.Statement {
398
414
  constructor(value, operator) {
399
- var _a;
400
415
  super();
401
416
  this.value = value;
402
417
  this.operator = operator;
403
- 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);
404
420
  }
405
421
  transpile(state) {
406
422
  return [
@@ -418,18 +434,19 @@ exports.IncrementStatement = IncrementStatement;
418
434
  /**
419
435
  * Represents a `print` statement within BrightScript.
420
436
  */
421
- class PrintStatement extends Statement {
437
+ class PrintStatement extends AstNode_2.Statement {
422
438
  /**
423
439
  * Creates a new internal representation of a BrightScript `print` statement.
424
- * @param expressions an array of expressions or `PrintSeparator`s to be
425
- * 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.
426
443
  */
427
444
  constructor(tokens, expressions) {
428
- var _a;
429
445
  super();
430
446
  this.tokens = tokens;
431
447
  this.expressions = expressions;
432
- 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 : []));
433
450
  }
434
451
  transpile(state) {
435
452
  var _a;
@@ -460,16 +477,16 @@ class PrintStatement extends Statement {
460
477
  }
461
478
  }
462
479
  exports.PrintStatement = PrintStatement;
463
- class DimStatement extends Statement {
480
+ class DimStatement extends AstNode_2.Statement {
464
481
  constructor(dimToken, identifier, openingSquare, dimensions, closingSquare) {
465
- var _a;
466
482
  super();
467
483
  this.dimToken = dimToken;
468
484
  this.identifier = identifier;
469
485
  this.openingSquare = openingSquare;
470
486
  this.dimensions = dimensions;
471
487
  this.closingSquare = closingSquare;
472
- this.range = (_a = util_1.util.createBoundingRange(this.dimToken, this.identifier, this.openingSquare, ...this.dimensions, this.closingSquare)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
488
+ this.kind = AstNode_1.AstNodeKind.DimStatement;
489
+ this.range = util_1.util.createBoundingRange(dimToken, identifier, openingSquare, ...(dimensions !== null && dimensions !== void 0 ? dimensions : []), closingSquare);
473
490
  }
474
491
  transpile(state) {
475
492
  let result = [
@@ -495,12 +512,12 @@ class DimStatement extends Statement {
495
512
  }
496
513
  }
497
514
  exports.DimStatement = DimStatement;
498
- class GotoStatement extends Statement {
515
+ class GotoStatement extends AstNode_2.Statement {
499
516
  constructor(tokens) {
500
- var _a;
501
517
  super();
502
518
  this.tokens = tokens;
503
- 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);
504
521
  }
505
522
  transpile(state) {
506
523
  return [
@@ -514,12 +531,15 @@ class GotoStatement extends Statement {
514
531
  }
515
532
  }
516
533
  exports.GotoStatement = GotoStatement;
517
- class LabelStatement extends Statement {
534
+ class LabelStatement extends AstNode_2.Statement {
518
535
  constructor(tokens) {
519
- var _a;
520
536
  super();
521
537
  this.tokens = tokens;
522
- 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);
523
543
  }
524
544
  transpile(state) {
525
545
  return [
@@ -532,13 +552,13 @@ class LabelStatement extends Statement {
532
552
  }
533
553
  }
534
554
  exports.LabelStatement = LabelStatement;
535
- class ReturnStatement extends Statement {
555
+ class ReturnStatement extends AstNode_2.Statement {
536
556
  constructor(tokens, value) {
537
- var _a;
538
557
  super();
539
558
  this.tokens = tokens;
540
559
  this.value = value;
541
- 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);
542
562
  }
543
563
  transpile(state) {
544
564
  let result = [];
@@ -556,12 +576,12 @@ class ReturnStatement extends Statement {
556
576
  }
557
577
  }
558
578
  exports.ReturnStatement = ReturnStatement;
559
- class EndStatement extends Statement {
579
+ class EndStatement extends AstNode_2.Statement {
560
580
  constructor(tokens) {
561
- var _a, _b;
562
581
  super();
563
582
  this.tokens = tokens;
564
- 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;
565
585
  }
566
586
  transpile(state) {
567
587
  return [
@@ -573,12 +593,13 @@ class EndStatement extends Statement {
573
593
  }
574
594
  }
575
595
  exports.EndStatement = EndStatement;
576
- class StopStatement extends Statement {
596
+ class StopStatement extends AstNode_2.Statement {
577
597
  constructor(tokens) {
578
- var _a, _b;
598
+ var _a;
579
599
  super();
580
600
  this.tokens = tokens;
581
- 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;
582
603
  }
583
604
  transpile(state) {
584
605
  return [
@@ -590,9 +611,8 @@ class StopStatement extends Statement {
590
611
  }
591
612
  }
592
613
  exports.StopStatement = StopStatement;
593
- class ForStatement extends Statement {
614
+ class ForStatement extends AstNode_2.Statement {
594
615
  constructor(forToken, counterDeclaration, toToken, finalValue, body, endForToken, stepToken, increment) {
595
- var _a;
596
616
  super();
597
617
  this.forToken = forToken;
598
618
  this.counterDeclaration = counterDeclaration;
@@ -602,7 +622,8 @@ class ForStatement extends Statement {
602
622
  this.endForToken = endForToken;
603
623
  this.stepToken = stepToken;
604
624
  this.increment = increment;
605
- this.range = (_a = util_1.util.createBoundingRange(this.forToken, this.counterDeclaration, this.toToken, this.finalValue, this.body, this.stepToken, this.increment, this.endForToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
625
+ this.kind = AstNode_1.AstNodeKind.ForStatement;
626
+ this.range = util_1.util.createBoundingRange(forToken, counterDeclaration, toToken, finalValue, stepToken, increment, body, endForToken);
606
627
  }
607
628
  transpile(state) {
608
629
  let result = [];
@@ -642,26 +663,24 @@ class ForStatement extends Statement {
642
663
  }
643
664
  }
644
665
  exports.ForStatement = ForStatement;
645
- class ForEachStatement extends Statement {
646
- constructor(forEachToken, item, inToken, target, body, endForToken) {
647
- var _a;
666
+ class ForEachStatement extends AstNode_2.Statement {
667
+ constructor(tokens, item, target, body) {
648
668
  super();
649
- this.forEachToken = forEachToken;
669
+ this.tokens = tokens;
650
670
  this.item = item;
651
- this.inToken = inToken;
652
671
  this.target = target;
653
672
  this.body = body;
654
- this.endForToken = endForToken;
655
- this.range = (_a = util_1.util.createBoundingRange(this.forEachToken, this.item, this.inToken, this.target, this.body, this.endForToken)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
673
+ this.kind = AstNode_1.AstNodeKind.ForEachStatement;
674
+ this.range = util_1.util.createBoundingRange(tokens.forEach, item, tokens.in, target, body, tokens.endFor);
656
675
  }
657
676
  transpile(state) {
658
677
  let result = [];
659
678
  //for each
660
- result.push(state.transpileToken(this.forEachToken), ' ');
679
+ result.push(state.transpileToken(this.tokens.forEach), ' ');
661
680
  //item
662
681
  result.push(state.transpileToken(this.item), ' ');
663
682
  //in
664
- result.push(state.transpileToken(this.inToken), ' ');
683
+ result.push(state.transpileToken(this.tokens.in), ' ');
665
684
  //target
666
685
  result.push(...this.target.transpile(state));
667
686
  //body
@@ -671,7 +690,7 @@ class ForEachStatement extends Statement {
671
690
  // add new line before "end for"
672
691
  result.push('\n');
673
692
  //end for
674
- result.push(state.indent(), state.transpileToken(this.endForToken));
693
+ result.push(state.indent(), state.transpileToken(this.tokens.endFor));
675
694
  return result;
676
695
  }
677
696
  walk(visitor, options) {
@@ -684,14 +703,14 @@ class ForEachStatement extends Statement {
684
703
  }
685
704
  }
686
705
  exports.ForEachStatement = ForEachStatement;
687
- class WhileStatement extends Statement {
706
+ class WhileStatement extends AstNode_2.Statement {
688
707
  constructor(tokens, condition, body) {
689
- var _a;
690
708
  super();
691
709
  this.tokens = tokens;
692
710
  this.condition = condition;
693
711
  this.body = body;
694
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.while, this.condition, this.body, this.tokens.endWhile)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
712
+ this.kind = AstNode_1.AstNodeKind.WhileStatement;
713
+ this.range = util_1.util.createBoundingRange(tokens.while, condition, body, tokens.endWhile);
695
714
  }
696
715
  transpile(state) {
697
716
  let result = [];
@@ -719,16 +738,15 @@ class WhileStatement extends Statement {
719
738
  }
720
739
  }
721
740
  exports.WhileStatement = WhileStatement;
722
- class DottedSetStatement extends Statement {
723
- constructor(obj, name, value, dot, operator) {
724
- var _a;
741
+ class DottedSetStatement extends AstNode_2.Statement {
742
+ constructor(obj, name, value, dot) {
725
743
  super();
726
744
  this.obj = obj;
727
745
  this.name = name;
728
746
  this.value = value;
729
747
  this.dot = dot;
730
- this.operator = operator;
731
- this.range = (_a = util_1.util.createBoundingRange(this.obj, this.dot, this.name, this.operator, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
748
+ this.kind = AstNode_1.AstNodeKind.DottedSetStatement;
749
+ this.range = util_1.util.createBoundingRange(obj, dot, name, value);
732
750
  }
733
751
  transpile(state) {
734
752
  var _a, _b;
@@ -740,7 +758,7 @@ class DottedSetStatement extends Statement {
740
758
  return [
741
759
  //object
742
760
  ...this.obj.transpile(state),
743
- '.',
761
+ this.dot ? state.tokenToSourceNode(this.dot) : '.',
744
762
  //name
745
763
  state.transpileToken(this.name),
746
764
  ' = ',
@@ -755,19 +773,25 @@ class DottedSetStatement extends Statement {
755
773
  (0, visitors_1.walk)(this, 'value', visitor, options);
756
774
  }
757
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
+ }
758
783
  }
759
784
  exports.DottedSetStatement = DottedSetStatement;
760
- class IndexedSetStatement extends Statement {
761
- constructor(obj, index, value, openingSquare, closingSquare, operator) {
762
- var _a;
785
+ class IndexedSetStatement extends AstNode_2.Statement {
786
+ constructor(obj, index, value, openingSquare, closingSquare) {
763
787
  super();
764
788
  this.obj = obj;
765
789
  this.index = index;
766
790
  this.value = value;
767
791
  this.openingSquare = openingSquare;
768
792
  this.closingSquare = closingSquare;
769
- this.operator = operator;
770
- this.range = (_a = util_1.util.createBoundingRange(this.obj, this.openingSquare, this.index, this.closingSquare, this.operator, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
793
+ this.kind = AstNode_1.AstNodeKind.IndexedSetStatement;
794
+ this.range = util_1.util.createBoundingRange(obj, openingSquare, index, closingSquare, value);
771
795
  }
772
796
  transpile(state) {
773
797
  var _a, _b;
@@ -801,12 +825,12 @@ class IndexedSetStatement extends Statement {
801
825
  }
802
826
  }
803
827
  exports.IndexedSetStatement = IndexedSetStatement;
804
- class LibraryStatement extends Statement {
828
+ class LibraryStatement extends AstNode_2.Statement {
805
829
  constructor(tokens) {
806
- var _a;
807
830
  super();
808
831
  this.tokens = tokens;
809
- 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);
810
834
  }
811
835
  transpile(state) {
812
836
  let result = [];
@@ -825,18 +849,16 @@ class LibraryStatement extends Statement {
825
849
  }
826
850
  }
827
851
  exports.LibraryStatement = LibraryStatement;
828
- class NamespaceStatement extends Statement {
829
- constructor(keyword,
830
- //this should technically only be a VariableExpression or DottedGetExpression, but that can be enforced elsewhere
831
- nameExpression, body, endKeyword, parentSymbolTable) {
852
+ class NamespaceStatement extends AstNode_2.Statement {
853
+ constructor(keyword, nameExpression, body, endKeyword) {
832
854
  super();
833
855
  this.keyword = keyword;
834
856
  this.nameExpression = nameExpression;
835
857
  this.body = body;
836
858
  this.endKeyword = endKeyword;
837
- this.parentSymbolTable = parentSymbolTable;
838
- this.name = this.nameExpression.getName(Parser_1.ParseMode.BrighterScript);
839
- this.symbolTable = new SymbolTable_1.SymbolTable(parentSymbolTable);
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(); });
840
862
  }
841
863
  get range() {
842
864
  return this.cacheRange();
@@ -849,7 +871,24 @@ class NamespaceStatement extends Statement {
849
871
  return this._range;
850
872
  }
851
873
  getName(parseMode) {
852
- 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;
853
892
  }
854
893
  transpile(state) {
855
894
  //namespaces don't actually have any real content, so just transpile their bodies
@@ -858,7 +897,7 @@ class NamespaceStatement extends Statement {
858
897
  getTypedef(state) {
859
898
  let result = [
860
899
  'namespace ',
861
- ...this.nameExpression.getName(Parser_1.ParseMode.BrighterScript),
900
+ ...this.getName(Parser_1.ParseMode.BrighterScript),
862
901
  state.newline
863
902
  ];
864
903
  state.blockDepth++;
@@ -875,15 +914,19 @@ class NamespaceStatement extends Statement {
875
914
  (0, visitors_1.walk)(this, 'body', visitor, options);
876
915
  }
877
916
  }
917
+ getType(options) {
918
+ const resultType = new NamespaceType_1.NamespaceType(this.name);
919
+ return resultType;
920
+ }
878
921
  }
879
922
  exports.NamespaceStatement = NamespaceStatement;
880
- class ImportStatement extends Statement {
923
+ class ImportStatement extends AstNode_2.Statement {
881
924
  constructor(importToken, filePathToken) {
882
- var _a;
883
925
  super();
884
926
  this.importToken = importToken;
885
927
  this.filePathToken = filePathToken;
886
- 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);
887
930
  if (this.filePathToken) {
888
931
  //remove quotes
889
932
  this.filePath = this.filePathToken.text.replace(/"/g, '');
@@ -917,88 +960,41 @@ class ImportStatement extends Statement {
917
960
  }
918
961
  }
919
962
  exports.ImportStatement = ImportStatement;
920
- class InterfaceStatement extends Statement {
921
- constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken, namespaceName) {
922
- var _a, _b, _c;
963
+ class InterfaceStatement extends AstNode_2.Statement {
964
+ constructor(interfaceToken, name, extendsToken, parentInterfaceName, body, endInterfaceToken) {
923
965
  super();
924
- this.name = name;
925
966
  this.parentInterfaceName = parentInterfaceName;
926
967
  this.body = body;
927
- this.namespaceName = namespaceName;
928
- this.memberTable = new SymbolTable_1.SymbolTable();
968
+ this.kind = AstNode_1.AstNodeKind.InterfaceStatement;
929
969
  this.tokens = {};
930
- this.memberMap = {};
931
- this.methods = [];
932
- this.fields = [];
933
970
  this.tokens.interface = interfaceToken;
934
971
  this.tokens.name = name;
935
972
  this.tokens.extends = extendsToken;
936
973
  this.tokens.endInterface = endInterfaceToken;
937
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
938
- for (let statement of this.body) {
939
- if ((0, reflection_1.isInterfaceMethodStatement)(statement)) {
940
- this.methods.push(statement);
941
- this.memberMap[(_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text.toLowerCase()] = statement;
942
- }
943
- else if ((0, reflection_1.isInterfaceFieldStatement)(statement)) {
944
- this.fields.push(statement);
945
- this.memberMap[(_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()] = statement;
946
- }
947
- }
974
+ this.range = util_1.util.createBoundingRange(this.tokens.interface, this.tokens.name, this.tokens.extends, this.parentInterfaceName, ...this.body, this.tokens.endInterface);
948
975
  }
949
- buildSymbolTable(parentIface) {
950
- var _a, _b;
951
- this.memberTable.clear();
952
- if (parentIface) {
953
- this.memberTable.setParent(parentIface === null || parentIface === void 0 ? void 0 : parentIface.memberTable);
954
- }
955
- for (const statement of this.methods) {
956
- const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
957
- this.memberTable.addSymbol((_a = statement === null || statement === void 0 ? void 0 : statement.name) === null || _a === void 0 ? void 0 : _a.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType);
958
- }
959
- for (const statement of this.fields) {
960
- this.memberTable.addSymbol((_b = statement === null || statement === void 0 ? void 0 : statement.name) === null || _b === void 0 ? void 0 : _b.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
961
- }
976
+ get fields() {
977
+ return this.body.filter(x => (0, reflection_1.isInterfaceFieldStatement)(x));
962
978
  }
963
- hasParent() {
964
- return !!this.parentInterfaceName;
979
+ get methods() {
980
+ return this.body.filter(x => (0, reflection_1.isInterfaceMethodStatement)(x));
965
981
  }
966
- getParentName() {
982
+ hasParentInterface() {
967
983
  return !!this.parentInterfaceName;
968
984
  }
969
- /**
970
- * Gets an array of possible parent interface names, taking into account the namespace this interface was created under
971
- * @returns array of possible parent interface names
972
- */
973
- getPossibleFullParentNames() {
974
- var _a;
975
- if (!this.hasParent()) {
976
- return [];
977
- }
978
- if (((_a = this.parentInterfaceName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
979
- // The specified parent interface already has a dot, so it must already reference a namespace
980
- return [this.parentInterfaceName.getName()];
981
- }
982
- const names = [];
983
- if (this.namespaceName) {
984
- // We're under a namespace, so the full parent name MIGHT be with this namespace too
985
- names.push(this.namespaceName.getName() + '.' + this.parentInterfaceName.getName());
986
- }
987
- names.push(this.parentInterfaceName.getName());
988
- return names;
989
- }
990
- getThisBscType() {
991
- return new InterfaceType_1.InterfaceType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
985
+ getLeadingTrivia() {
986
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.interface.leadingTrivia);
992
987
  }
993
988
  /**
994
989
  * The name of the interface WITH its leading namespace (if applicable)
995
990
  */
996
- getName(parseMode) {
991
+ get fullName() {
997
992
  var _a;
998
993
  const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
999
994
  if (name) {
1000
- if (this.namespaceName) {
1001
- 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);
1002
998
  return `${namespaceName}.${name}`;
1003
999
  }
1004
1000
  else {
@@ -1010,6 +1006,27 @@ class InterfaceStatement extends Statement {
1010
1006
  return undefined;
1011
1007
  }
1012
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
+ }
1013
1030
  transpile(state) {
1014
1031
  //interfaces should completely disappear at runtime
1015
1032
  return [];
@@ -1021,7 +1038,7 @@ class InterfaceStatement extends Statement {
1021
1038
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1022
1039
  }
1023
1040
  result.push(this.tokens.interface.text, ' ', this.tokens.name.text);
1024
- const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName(Parser_1.ParseMode.BrighterScript);
1041
+ const parentInterfaceName = (_b = this.parentInterfaceName) === null || _b === void 0 ? void 0 : _b.getName();
1025
1042
  if (parentInterfaceName) {
1026
1043
  result.push(' extends ', parentInterfaceName);
1027
1044
  }
@@ -1044,35 +1061,59 @@ class InterfaceStatement extends Statement {
1044
1061
  return result;
1045
1062
  }
1046
1063
  walk(visitor, options) {
1064
+ //visitor-less walk function to do parent linking
1065
+ (0, visitors_1.walk)(this, 'parentInterfaceName', null, options);
1047
1066
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1048
1067
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1049
1068
  }
1050
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
+ }
1051
1087
  }
1052
1088
  exports.InterfaceStatement = InterfaceStatement;
1053
- class InterfaceFieldStatement extends Statement {
1054
- constructor(nameToken, asToken, type, namespaceName) {
1055
- var _a;
1089
+ class InterfaceFieldStatement extends AstNode_2.Statement {
1090
+ constructor(nameToken, asToken, typeExpression, optionalToken) {
1056
1091
  super();
1057
- this.type = type;
1058
- this.namespaceName = namespaceName;
1092
+ this.typeExpression = typeExpression;
1093
+ this.kind = AstNode_1.AstNodeKind.InterfaceFieldStatement;
1059
1094
  this.tokens = {};
1095
+ this.tokens.optional = optionalToken;
1060
1096
  this.tokens.name = nameToken;
1061
1097
  this.tokens.as = asToken;
1062
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.as, this.type)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1098
+ this.range = util_1.util.createBoundingRange(this.tokens.optional, this.tokens.name, this.tokens.as, this.typeExpression);
1063
1099
  }
1064
1100
  transpile(state) {
1065
1101
  throw new Error('Method not implemented.');
1066
1102
  }
1067
- getType() {
1068
- var _a;
1069
- 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);
1070
1106
  }
1071
1107
  get name() {
1072
- return this.tokens.name;
1108
+ return this.tokens.name.text;
1109
+ }
1110
+ get isOptional() {
1111
+ return !!this.tokens.optional;
1073
1112
  }
1074
1113
  walk(visitor, options) {
1075
- //nothing to walk
1114
+ if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1115
+ (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
1116
+ }
1076
1117
  }
1077
1118
  getTypedef(state) {
1078
1119
  var _a;
@@ -1080,32 +1121,120 @@ class InterfaceFieldStatement extends Statement {
1080
1121
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1081
1122
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1082
1123
  }
1124
+ if (this.isOptional) {
1125
+ result.push(this.tokens.optional.text, ' ');
1126
+ }
1083
1127
  result.push(this.tokens.name.text);
1084
- if (this.tokens.as && this.type) {
1085
- result.push(' as ', ...this.type.transpile(state));
1128
+ if (this.typeExpression) {
1129
+ result.push(' as ', ...this.typeExpression.getTypedef(state));
1086
1130
  }
1087
1131
  return result;
1088
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
+ }
1089
1137
  }
1090
1138
  exports.InterfaceFieldStatement = InterfaceFieldStatement;
1091
- 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
+ }
1092
1155
  transpile(state) {
1093
1156
  throw new Error('Method not implemented.');
1094
1157
  }
1095
- constructor(name, func) {
1096
- 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);
1097
1174
  }
1098
1175
  walk(visitor, options) {
1099
- //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;
1100
1229
  }
1101
1230
  }
1102
1231
  exports.InterfaceMethodStatement = InterfaceMethodStatement;
1103
- class ClassStatement extends Statement {
1232
+ class ClassStatement extends AstNode_2.Statement {
1104
1233
  constructor(classKeyword,
1105
1234
  /**
1106
1235
  * The name of the class (without namespace prefix)
1107
1236
  */
1108
- name, body, end, extendsKeyword, parentClassName, namespaceName, currentSymbolTable) {
1237
+ name, body, end, extendsKeyword, parentClassName) {
1109
1238
  var _a, _b, _c, _d;
1110
1239
  super();
1111
1240
  this.classKeyword = classKeyword;
@@ -1114,16 +1243,12 @@ class ClassStatement extends Statement {
1114
1243
  this.end = end;
1115
1244
  this.extendsKeyword = extendsKeyword;
1116
1245
  this.parentClassName = parentClassName;
1117
- this.namespaceName = namespaceName;
1118
- this.currentSymbolTable = currentSymbolTable;
1119
- this.symbolTable = new SymbolTable_1.SymbolTable();
1120
- this.memberTable = new SymbolTable_1.SymbolTable();
1246
+ this.kind = AstNode_1.AstNodeKind.ClassStatement;
1121
1247
  this.memberMap = {};
1122
1248
  this.methods = [];
1123
1249
  this.fields = [];
1124
1250
  this.body = (_a = this.body) !== null && _a !== void 0 ? _a : [];
1125
- this.symbolTable.setParent(currentSymbolTable);
1126
- this.range = (_b = util_1.util.createBoundingRange(this.classKeyword, this.name, this.extendsKeyword, this.parentClassName, ...this.body, this.end)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
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(); });
1127
1252
  for (let statement of this.body) {
1128
1253
  if ((0, reflection_1.isMethodStatement)(statement)) {
1129
1254
  this.methods.push(statement);
@@ -1134,13 +1259,15 @@ class ClassStatement extends Statement {
1134
1259
  this.memberMap[(_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()] = statement;
1135
1260
  }
1136
1261
  }
1262
+ this.range = util_1.util.createBoundingRange(classKeyword, name, extendsKeyword, parentClassName, ...(body !== null && body !== void 0 ? body : []), end);
1137
1263
  }
1138
1264
  getName(parseMode) {
1139
1265
  var _a;
1140
1266
  const name = (_a = this.name) === null || _a === void 0 ? void 0 : _a.text;
1141
1267
  if (name) {
1142
- if (this.namespaceName) {
1143
- let namespaceName = this.namespaceName.getName(parseMode);
1268
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
1269
+ if (namespace) {
1270
+ let namespaceName = namespace.getName(parseMode);
1144
1271
  let separator = parseMode === Parser_1.ParseMode.BrighterScript ? '.' : '_';
1145
1272
  return namespaceName + separator + name;
1146
1273
  }
@@ -1153,35 +1280,8 @@ class ClassStatement extends Statement {
1153
1280
  return undefined;
1154
1281
  }
1155
1282
  }
1156
- getThisBscType() {
1157
- return new CustomType_1.CustomType(this.getName(Parser_1.ParseMode.BrighterScript), this.memberTable);
1158
- }
1159
- getConstructorFunctionType() {
1160
- var _a, _b;
1161
- const constructFunc = this.getConstructorFunction();
1162
- const constructorFuncType = (_b = (_a = constructFunc === null || constructFunc === void 0 ? void 0 : constructFunc.func) === null || _a === void 0 ? void 0 : _a.getFunctionType()) !== null && _b !== void 0 ? _b : new FunctionType_1.FunctionType();
1163
- constructorFuncType.setName(this.getName(Parser_1.ParseMode.BrighterScript));
1164
- constructorFuncType.isNew = true;
1165
- return constructorFuncType;
1166
- }
1167
- buildSymbolTable(parentClass) {
1168
- var _a, _b, _c, _d, _e;
1169
- this.symbolTable.clear();
1170
- this.symbolTable.addSymbol('m', (_a = this.name) === null || _a === void 0 ? void 0 : _a.range, this.getThisBscType());
1171
- this.memberTable.clear();
1172
- if ((0, reflection_1.isClassStatement)(parentClass)) {
1173
- this.symbolTable.addSymbol('super', (_b = this.parentClassName) === null || _b === void 0 ? void 0 : _b.range, parentClass.getConstructorFunctionType());
1174
- this.memberTable.setParent(parentClass === null || parentClass === void 0 ? void 0 : parentClass.memberTable);
1175
- }
1176
- for (const statement of this.methods) {
1177
- statement === null || statement === void 0 ? void 0 : statement.func.symbolTable.setParent(this.symbolTable);
1178
- const funcType = statement === null || statement === void 0 ? void 0 : statement.func.getFunctionType();
1179
- funcType.setName(this.getName(Parser_1.ParseMode.BrighterScript) + '.' + ((_c = statement === null || statement === void 0 ? void 0 : statement.name) === null || _c === void 0 ? void 0 : _c.text));
1180
- this.memberTable.addSymbol((_d = statement === null || statement === void 0 ? void 0 : statement.name) === null || _d === void 0 ? void 0 : _d.text, statement === null || statement === void 0 ? void 0 : statement.range, funcType);
1181
- }
1182
- for (const statement of this.fields) {
1183
- this.memberTable.addSymbol((_e = statement === null || statement === void 0 ? void 0 : statement.name) === null || _e === void 0 ? void 0 : _e.text, statement === null || statement === void 0 ? void 0 : statement.range, statement.getType());
1184
- }
1283
+ getLeadingTrivia() {
1284
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.classKeyword.leadingTrivia);
1185
1285
  }
1186
1286
  transpile(state) {
1187
1287
  let result = [];
@@ -1193,14 +1293,15 @@ class ClassStatement extends Statement {
1193
1293
  return result;
1194
1294
  }
1195
1295
  getTypedef(state) {
1196
- var _a, _b;
1296
+ var _a;
1197
1297
  const result = [];
1198
1298
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1199
1299
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1200
1300
  }
1201
1301
  result.push('class ', this.name.text);
1202
1302
  if (this.extendsKeyword && this.parentClassName) {
1203
- 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));
1204
1305
  result.push(` extends ${fqName}`);
1205
1306
  }
1206
1307
  result.push(state.newline);
@@ -1208,8 +1309,12 @@ class ClassStatement extends Statement {
1208
1309
  let body = this.body;
1209
1310
  //inject an empty "new" method if missing
1210
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();
1211
1316
  body = [
1212
- (0, creators_1.createMethodStatement)('new', TokenKind_1.TokenKind.Sub),
1317
+ constructor,
1213
1318
  ...this.body
1214
1319
  ];
1215
1320
  }
@@ -1228,13 +1333,14 @@ class ClassStatement extends Statement {
1228
1333
  * The base class is index 0, its child is index 1, and so on.
1229
1334
  */
1230
1335
  getParentClassIndex(state) {
1231
- var _a, _b;
1336
+ var _a;
1232
1337
  let myIndex = 0;
1233
1338
  let stmt = this;
1234
1339
  while (stmt) {
1235
1340
  if (stmt.parentClassName) {
1341
+ const namespace = stmt.findAncestor(reflection_1.isNamespaceStatement);
1236
1342
  //find the parent class
1237
- 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;
1238
1344
  myIndex++;
1239
1345
  }
1240
1346
  else {
@@ -1249,41 +1355,21 @@ class ClassStatement extends Statement {
1249
1355
  return null;
1250
1356
  }
1251
1357
  }
1252
- hasParent() {
1358
+ hasParentClass() {
1253
1359
  return !!this.parentClassName;
1254
1360
  }
1255
- /**
1256
- * Gets an array of possible parent class names, taking into account the namespace this class was created under
1257
- * @returns array of possible parent class names
1258
- */
1259
- getPossibleFullParentNames() {
1260
- var _a;
1261
- if (!this.hasParent()) {
1262
- return [];
1263
- }
1264
- if (((_a = this.parentClassName) === null || _a === void 0 ? void 0 : _a.getNameParts().length) > 1) {
1265
- // The specified parent class already has a dot, so it must already reference a namespace
1266
- return [this.parentClassName.getName()];
1267
- }
1268
- const names = [];
1269
- if (this.namespaceName) {
1270
- // We're under a namespace, so the full parent name MIGHT be with this namespace too
1271
- names.push(this.namespaceName.getName() + '.' + this.parentClassName.getName());
1272
- }
1273
- names.push(this.parentClassName.getName());
1274
- return names;
1275
- }
1276
1361
  /**
1277
1362
  * Get all ancestor classes, in closest-to-furthest order (i.e. 0 is parent, 1 is grandparent, etc...).
1278
1363
  * This will return an empty array if no ancestors were found
1279
1364
  */
1280
1365
  getAncestors(state) {
1281
- var _a, _b;
1366
+ var _a;
1282
1367
  let ancestors = [];
1283
1368
  let stmt = this;
1284
1369
  while (stmt) {
1285
1370
  if (stmt.parentClassName) {
1286
- 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;
1287
1373
  ancestors.push(stmt);
1288
1374
  }
1289
1375
  else {
@@ -1298,6 +1384,12 @@ class ClassStatement extends Statement {
1298
1384
  }
1299
1385
  return `__${name}_builder`;
1300
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
+ }
1301
1393
  /**
1302
1394
  * Get the constructor function for this class (if exists), or undefined if not exist
1303
1395
  */
@@ -1325,7 +1417,6 @@ class ClassStatement extends Statement {
1325
1417
  * without instantiating the parent constructor at that point in time.
1326
1418
  */
1327
1419
  getTranspiledBuilder(state) {
1328
- var _a;
1329
1420
  let result = [];
1330
1421
  result.push(`function ${this.getBuilderName(this.getName(Parser_1.ParseMode.BrightScript))}()\n`);
1331
1422
  state.blockDepth++;
@@ -1337,7 +1428,8 @@ class ClassStatement extends Statement {
1337
1428
  let ancestors = this.getAncestors(state);
1338
1429
  //construct parent class or empty object
1339
1430
  if (ancestors[0]) {
1340
- 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));
1341
1433
  result.push('instance = ', this.getBuilderName(fullyQualifiedClassName), '()');
1342
1434
  }
1343
1435
  else {
@@ -1428,10 +1520,44 @@ class ClassStatement extends Statement {
1428
1520
  return result;
1429
1521
  }
1430
1522
  walk(visitor, options) {
1523
+ //visitor-less walk function to do parent linking
1524
+ (0, visitors_1.walk)(this, 'parentClassName', null, options);
1431
1525
  if (options.walkMode & visitors_1.InternalWalkMode.walkStatements) {
1432
1526
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1433
1527
  }
1434
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
+ }
1435
1561
  }
1436
1562
  exports.ClassStatement = ClassStatement;
1437
1563
  const accessModifiers = [
@@ -1441,8 +1567,9 @@ const accessModifiers = [
1441
1567
  ];
1442
1568
  class MethodStatement extends FunctionStatement {
1443
1569
  constructor(modifiers, name, func, override) {
1444
- super(name, func, undefined);
1570
+ super(name, func);
1445
1571
  this.override = override;
1572
+ this.kind = AstNode_1.AstNodeKind.MethodStatement;
1446
1573
  this.modifiers = [];
1447
1574
  if (modifiers) {
1448
1575
  if (Array.isArray(modifiers)) {
@@ -1452,19 +1579,19 @@ class MethodStatement extends FunctionStatement {
1452
1579
  this.modifiers.push(modifiers);
1453
1580
  }
1454
1581
  }
1582
+ this.range = util_1.util.createBoundingRange(...(this.modifiers), override, func);
1455
1583
  }
1456
1584
  get accessModifier() {
1457
1585
  return this.modifiers.find(x => accessModifiers.includes(x.kind));
1458
1586
  }
1459
- get range() {
1460
- return this.cacheRange();
1587
+ /**
1588
+ * Get the name of this method.
1589
+ */
1590
+ getName(parseMode) {
1591
+ return this.name.text;
1461
1592
  }
1462
- cacheRange() {
1463
- var _a, _b;
1464
- if (!this._range) {
1465
- this._range = (_b = util_1.util.createBoundingRange(this.accessModifier, this.override, (_a = this.func) !== null && _a !== void 0 ? _a : this.name)) !== null && _b !== void 0 ? _b : creators_1.interpolatedRange;
1466
- }
1467
- return this._range;
1593
+ getLeadingTrivia() {
1594
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.func.getLeadingTrivia());
1468
1595
  }
1469
1596
  transpile(state) {
1470
1597
  if (this.name.text.toLowerCase() === 'new') {
@@ -1509,7 +1636,7 @@ class MethodStatement extends FunctionStatement {
1509
1636
  if (this.override) {
1510
1637
  result.push('override ');
1511
1638
  }
1512
- result.push(...this.func.getTypedef(state, this.name));
1639
+ result.push(...this.func.getTypedef(state));
1513
1640
  return result;
1514
1641
  }
1515
1642
  /**
@@ -1521,54 +1648,60 @@ class MethodStatement extends FunctionStatement {
1521
1648
  if (state.classStatement.getAncestors(state).length === 0) {
1522
1649
  return;
1523
1650
  }
1524
- //if the first statement is a call to super, quit here
1525
- let firstStatement = this.func.body.statements[0];
1526
- if (
1527
- //is a call statement
1528
- (0, reflection_1.isExpressionStatement)(firstStatement) && (0, reflection_1.isCallExpression)(firstStatement.expression) &&
1529
- //is a call to super
1530
- 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) {
1531
1660
  return;
1532
1661
  }
1533
- //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
1534
1663
  const superCall = new ExpressionStatement(new Expression_1.CallExpression(new Expression_1.VariableExpression({
1535
1664
  kind: TokenKind_1.TokenKind.Identifier,
1536
1665
  text: 'super',
1537
1666
  isReserved: false,
1538
1667
  range: state.classStatement.name.range,
1539
- leadingWhitespace: ''
1540
- }, null), {
1668
+ leadingWhitespace: '',
1669
+ leadingTrivia: []
1670
+ }), {
1541
1671
  kind: TokenKind_1.TokenKind.LeftParen,
1542
1672
  text: '(',
1543
1673
  isReserved: false,
1544
1674
  range: state.classStatement.name.range,
1545
- leadingWhitespace: ''
1675
+ leadingWhitespace: '',
1676
+ leadingTrivia: []
1546
1677
  }, {
1547
1678
  kind: TokenKind_1.TokenKind.RightParen,
1548
1679
  text: ')',
1549
1680
  isReserved: false,
1550
1681
  range: state.classStatement.name.range,
1551
- leadingWhitespace: ''
1552
- }, [], null));
1682
+ leadingWhitespace: '',
1683
+ leadingTrivia: []
1684
+ }, []));
1553
1685
  state.editor.arrayUnshift(this.func.body.statements, superCall);
1554
1686
  }
1555
1687
  /**
1556
1688
  * Inject field initializers at the top of the `new` function (after any present `super()` call)
1557
1689
  */
1558
1690
  injectFieldInitializersForConstructor(state) {
1559
- let startingIndex = state.classStatement.hasParent() ? 1 : 0;
1691
+ let startingIndex = state.classStatement.hasParentClass() ? 1 : 0;
1560
1692
  let newStatements = [];
1561
1693
  //insert the field initializers in order
1562
1694
  for (let field of state.classStatement.fields) {
1563
1695
  let thisQualifiedName = Object.assign({}, field.name);
1564
1696
  thisQualifiedName.text = 'm.' + field.name.text;
1565
- if (field.initialValue) {
1566
- newStatements.push(new AssignmentStatement(thisQualifiedName, field.equal, field.initialValue, this.func));
1567
- }
1568
- 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,
1569
1700
  //if there is no initial value, set the initial value to `invalid`
1570
- newStatements.push(new AssignmentStatement(thisQualifiedName, (0, creators_1.createToken)(TokenKind_1.TokenKind.Equal, '=', field.name.range), (0, creators_1.createInvalidLiteral)('invalid', field.name.range), this.func));
1571
- }
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);
1572
1705
  }
1573
1706
  state.editor.arraySplice(this.func.body.statements, startingIndex, 0, ...newStatements);
1574
1707
  }
@@ -1579,33 +1712,33 @@ class MethodStatement extends FunctionStatement {
1579
1712
  }
1580
1713
  }
1581
1714
  exports.MethodStatement = MethodStatement;
1582
- class FieldStatement extends Statement {
1583
- constructor(accessModifier, name, as, type, equal, initialValue, namespaceName) {
1584
- var _a;
1715
+ class FieldStatement extends AstNode_2.Statement {
1716
+ constructor(accessModifier, name, as, typeExpression, equal, initialValue, optional) {
1585
1717
  super();
1586
1718
  this.accessModifier = accessModifier;
1587
1719
  this.name = name;
1588
1720
  this.as = as;
1589
- this.type = type;
1721
+ this.typeExpression = typeExpression;
1590
1722
  this.equal = equal;
1591
1723
  this.initialValue = initialValue;
1592
- this.namespaceName = namespaceName;
1593
- this.range = (_a = util_1.util.createBoundingRange(this.accessModifier, this.name, this.as, this.type, this.equal, this.initialValue)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
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);
1594
1727
  }
1595
1728
  /**
1596
1729
  * Derive a ValueKind from the type token, or the initial value.
1597
1730
  * Defaults to `DynamicType`
1598
1731
  */
1599
- getType(parseMode = Parser_1.ParseMode.BrighterScript) {
1600
- if (this.type) {
1601
- return this.type.type;
1602
- }
1603
- else if ((0, reflection_1.isLiteralExpression)(this.initialValue)) {
1604
- return this.initialValue.type;
1605
- }
1606
- else {
1607
- return new DynamicType_1.DynamicType();
1608
- }
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;
1609
1742
  }
1610
1743
  transpile(state) {
1611
1744
  throw new Error('transpile not implemented for ' + Object.getPrototypeOf(this).constructor.name);
@@ -1617,30 +1750,34 @@ class FieldStatement extends Statement {
1617
1750
  for (let annotation of (_a = this.annotations) !== null && _a !== void 0 ? _a : []) {
1618
1751
  result.push(...annotation.getTypedef(state), state.newline, state.indent());
1619
1752
  }
1620
- let type = this.getType(Parser_1.ParseMode.BrightScript);
1621
- 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)) {
1622
1755
  type = new DynamicType_1.DynamicType();
1623
1756
  }
1624
- result.push((_c = (_b = this.accessModifier) === null || _b === void 0 ? void 0 : _b.text) !== null && _c !== void 0 ? _c : 'public', ' ', (_d = this.name) === null || _d === void 0 ? void 0 : _d.text, ' as ', type.toTypeString());
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());
1625
1762
  }
1626
1763
  return result;
1627
1764
  }
1628
1765
  walk(visitor, options) {
1629
1766
  if (options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
1630
- (0, visitors_1.walk)(this, 'type', visitor, options);
1767
+ (0, visitors_1.walk)(this, 'typeExpression', visitor, options);
1631
1768
  (0, visitors_1.walk)(this, 'initialValue', visitor, options);
1632
1769
  }
1633
1770
  }
1634
1771
  }
1635
1772
  exports.FieldStatement = FieldStatement;
1636
- class TryCatchStatement extends Statement {
1773
+ class TryCatchStatement extends AstNode_2.Statement {
1637
1774
  constructor(tokens, tryBranch, catchStatement) {
1638
- var _a;
1639
1775
  super();
1640
1776
  this.tokens = tokens;
1641
1777
  this.tryBranch = tryBranch;
1642
1778
  this.catchStatement = catchStatement;
1643
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.try, this.tryBranch, this.catchStatement, this.tokens.endTry)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1779
+ this.kind = AstNode_1.AstNodeKind.TryCatchStatement;
1780
+ this.range = util_1.util.createBoundingRange(tokens.try, tryBranch, catchStatement, tokens.endTry);
1644
1781
  }
1645
1782
  transpile(state) {
1646
1783
  var _a, _b;
@@ -1663,16 +1800,14 @@ class TryCatchStatement extends Statement {
1663
1800
  }
1664
1801
  }
1665
1802
  exports.TryCatchStatement = TryCatchStatement;
1666
- class CatchStatement extends Statement {
1803
+ class CatchStatement extends AstNode_2.Statement {
1667
1804
  constructor(tokens, exceptionVariable, catchBranch) {
1668
1805
  super();
1669
1806
  this.tokens = tokens;
1670
1807
  this.exceptionVariable = exceptionVariable;
1671
1808
  this.catchBranch = catchBranch;
1672
- }
1673
- get range() {
1674
- var _a, _b;
1675
- return util_1.util.createRangeFromPositions(this.tokens.catch.range.start, ((_b = (_a = this.catchBranch) !== null && _a !== void 0 ? _a : this.exceptionVariable) !== null && _b !== void 0 ? _b : this.tokens.catch).range.end);
1809
+ this.kind = AstNode_1.AstNodeKind.CatchStatement;
1810
+ this.range = util_1.util.createBoundingRange(tokens.catch, exceptionVariable, catchBranch);
1676
1811
  }
1677
1812
  transpile(state) {
1678
1813
  var _a, _b, _c, _d;
@@ -1690,13 +1825,13 @@ class CatchStatement extends Statement {
1690
1825
  }
1691
1826
  }
1692
1827
  exports.CatchStatement = CatchStatement;
1693
- class ThrowStatement extends Statement {
1828
+ class ThrowStatement extends AstNode_2.Statement {
1694
1829
  constructor(throwToken, expression) {
1695
- var _a;
1696
1830
  super();
1697
1831
  this.throwToken = throwToken;
1698
1832
  this.expression = expression;
1699
- 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);
1700
1835
  }
1701
1836
  transpile(state) {
1702
1837
  const result = [
@@ -1720,16 +1855,18 @@ class ThrowStatement extends Statement {
1720
1855
  }
1721
1856
  }
1722
1857
  exports.ThrowStatement = ThrowStatement;
1723
- class EnumStatement extends Statement {
1724
- constructor(tokens, body, namespaceName) {
1725
- var _a, _b;
1858
+ class EnumStatement extends AstNode_2.Statement {
1859
+ constructor(tokens, body) {
1860
+ var _a;
1726
1861
  super();
1727
1862
  this.tokens = tokens;
1728
1863
  this.body = body;
1729
- this.namespaceName = namespaceName;
1730
- this.symbolTable = new SymbolTable_1.SymbolTable();
1731
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.enum, this.tokens.name, ...this.body, this.tokens.endEnum)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
1732
- this.body = (_b = this.body) !== null && _b !== void 0 ? _b : [];
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);
1733
1870
  }
1734
1871
  getMembers() {
1735
1872
  const result = [];
@@ -1740,12 +1877,15 @@ class EnumStatement extends Statement {
1740
1877
  }
1741
1878
  return result;
1742
1879
  }
1880
+ getLeadingTrivia() {
1881
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.enum.leadingTrivia);
1882
+ }
1743
1883
  /**
1744
1884
  * Get a map of member names and their values.
1745
1885
  * All values are stored as their AST LiteralExpression representation (i.e. string enum values include the wrapping quotes)
1746
1886
  */
1747
1887
  getMemberValueMap() {
1748
- var _a, _b, _c, _d, _e, _f, _g;
1888
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1749
1889
  const result = new Map();
1750
1890
  const members = this.getMembers();
1751
1891
  let currentIntValue = 0;
@@ -1764,10 +1904,14 @@ class EnumStatement extends Statement {
1764
1904
  currentIntValue++;
1765
1905
  }
1766
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);
1767
1911
  //all other values
1768
1912
  }
1769
1913
  else {
1770
- result.set((_d = member.name) === null || _d === void 0 ? void 0 : _d.toLowerCase(), (_g = (_f = (_e = member.value) === null || _e === void 0 ? void 0 : _e.token) === null || _f === void 0 ? void 0 : _f.text) !== null && _g !== void 0 ? _g : 'invalid');
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');
1771
1915
  }
1772
1916
  }
1773
1917
  return result;
@@ -1775,12 +1919,6 @@ class EnumStatement extends Statement {
1775
1919
  getMemberValue(name) {
1776
1920
  return this.getMemberValueMap().get(name.toLowerCase());
1777
1921
  }
1778
- buildSymbolTable() {
1779
- this.symbolTable.clear();
1780
- for (const member of this.getMembers()) {
1781
- this.symbolTable.addSymbol(member === null || member === void 0 ? void 0 : member.name, member === null || member === void 0 ? void 0 : member.range, new EnumType_1.EnumMemberType(this.fullName, member === null || member === void 0 ? void 0 : member.name));
1782
- }
1783
- }
1784
1922
  /**
1785
1923
  * The name of the enum (without the namespace prefix)
1786
1924
  */
@@ -1795,8 +1933,9 @@ class EnumStatement extends Statement {
1795
1933
  var _a;
1796
1934
  const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
1797
1935
  if (name) {
1798
- if (this.namespaceName) {
1799
- 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);
1800
1939
  return `${namespaceName}.${name}`;
1801
1940
  }
1802
1941
  else {
@@ -1808,9 +1947,6 @@ class EnumStatement extends Statement {
1808
1947
  return undefined;
1809
1948
  }
1810
1949
  }
1811
- getThisBscType() {
1812
- return new EnumType_1.EnumType(this.fullName, this.symbolTable);
1813
- }
1814
1950
  transpile(state) {
1815
1951
  //enum declarations do not exist at runtime, so don't transpile anything...
1816
1952
  return [];
@@ -1838,15 +1974,27 @@ class EnumStatement extends Statement {
1838
1974
  (0, visitors_1.walkArray)(this.body, visitor, options, this);
1839
1975
  }
1840
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
+ }
1841
1987
  }
1842
1988
  exports.EnumStatement = EnumStatement;
1843
- class EnumMemberStatement extends Statement {
1989
+ class EnumMemberStatement extends AstNode_2.Statement {
1844
1990
  constructor(tokens, value) {
1845
- var _a;
1846
1991
  super();
1847
1992
  this.tokens = tokens;
1848
1993
  this.value = value;
1849
- this.range = (_a = util_1.util.createBoundingRange(this.tokens.name, this.tokens.equal, this.value)) !== null && _a !== void 0 ? _a : creators_1.interpolatedRange;
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);
1850
1998
  }
1851
1999
  /**
1852
2000
  * The name of the member
@@ -1854,6 +2002,9 @@ class EnumMemberStatement extends Statement {
1854
2002
  get name() {
1855
2003
  return this.tokens.name.text;
1856
2004
  }
2005
+ getLeadingTrivia() {
2006
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.name.leadingTrivia);
2007
+ }
1857
2008
  transpile(state) {
1858
2009
  return [];
1859
2010
  }
@@ -1874,6 +2025,90 @@ class EnumMemberStatement extends Statement {
1874
2025
  (0, visitors_1.walk)(this, 'value', visitor, options);
1875
2026
  }
1876
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
+ }
1877
2032
  }
1878
2033
  exports.EnumMemberStatement = EnumMemberStatement;
2034
+ class ConstStatement extends AstNode_2.Statement {
2035
+ constructor(tokens, value) {
2036
+ super();
2037
+ this.tokens = tokens;
2038
+ this.value = value;
2039
+ this.kind = AstNode_1.AstNodeKind.ConstStatement;
2040
+ this.range = util_1.util.createBoundingRange(this.tokens.const, this.tokens.name, this.tokens.equals, this.value);
2041
+ }
2042
+ get name() {
2043
+ return this.tokens.name.text;
2044
+ }
2045
+ getLeadingTrivia() {
2046
+ return util_1.util.concatAnnotationLeadingTrivia(this, this.tokens.const.leadingTrivia);
2047
+ }
2048
+ /**
2049
+ * The name of the statement WITH its leading namespace (if applicable)
2050
+ */
2051
+ get fullName() {
2052
+ var _a;
2053
+ const name = (_a = this.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
2054
+ if (name) {
2055
+ const namespace = this.findAncestor(reflection_1.isNamespaceStatement);
2056
+ if (namespace) {
2057
+ let namespaceName = namespace.getName(Parser_1.ParseMode.BrighterScript);
2058
+ return `${namespaceName}.${name}`;
2059
+ }
2060
+ else {
2061
+ return name;
2062
+ }
2063
+ }
2064
+ else {
2065
+ //return undefined which will allow outside callers to know that this doesn't have a name
2066
+ return undefined;
2067
+ }
2068
+ }
2069
+ transpile(state) {
2070
+ //const declarations don't exist at runtime, so just transpile empty
2071
+ return [];
2072
+ }
2073
+ getTypedef(state) {
2074
+ return [
2075
+ state.tokenToSourceNode(this.tokens.const),
2076
+ ' ',
2077
+ state.tokenToSourceNode(this.tokens.name),
2078
+ ' ',
2079
+ state.tokenToSourceNode(this.tokens.equals),
2080
+ ' ',
2081
+ ...this.value.transpile(state)
2082
+ ];
2083
+ }
2084
+ walk(visitor, options) {
2085
+ if (this.value && options.walkMode & visitors_1.InternalWalkMode.walkExpressions) {
2086
+ (0, visitors_1.walk)(this, 'value', visitor, options);
2087
+ }
2088
+ }
2089
+ getType(options) {
2090
+ return this.value.getType(options);
2091
+ }
2092
+ }
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;
1879
2114
  //# sourceMappingURL=Statement.js.map