brighterscript 1.0.0-alpha.5 → 1.0.0-alpha.51

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 (652) hide show
  1. package/README.md +79 -138
  2. package/bsconfig.schema.json +196 -5
  3. package/dist/ActionPipeline.d.ts +10 -0
  4. package/dist/ActionPipeline.js +40 -0
  5. package/dist/ActionPipeline.js.map +1 -0
  6. package/dist/AstValidationSegmenter.d.ts +45 -0
  7. package/dist/AstValidationSegmenter.js +322 -0
  8. package/dist/AstValidationSegmenter.js.map +1 -0
  9. package/dist/BsConfig.d.ts +161 -43
  10. package/dist/BusyStatusTracker.d.ts +61 -0
  11. package/dist/BusyStatusTracker.js +148 -0
  12. package/dist/BusyStatusTracker.js.map +1 -0
  13. package/dist/Cache.d.ts +3 -8
  14. package/dist/Cache.js +9 -14
  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 +29 -4
  20. package/dist/CodeActionUtil.js +22 -5
  21. package/dist/CodeActionUtil.js.map +1 -1
  22. package/dist/CommentFlagProcessor.d.ts +20 -15
  23. package/dist/CommentFlagProcessor.js +143 -58
  24. package/dist/CommentFlagProcessor.js.map +1 -1
  25. package/dist/CrossScopeValidator.d.ts +68 -0
  26. package/dist/CrossScopeValidator.js +650 -0
  27. package/dist/CrossScopeValidator.js.map +1 -0
  28. package/dist/DependencyGraph.d.ts +8 -3
  29. package/dist/DependencyGraph.js +49 -16
  30. package/dist/DependencyGraph.js.map +1 -1
  31. package/dist/DiagnosticCollection.d.ts +21 -5
  32. package/dist/DiagnosticCollection.js +77 -24
  33. package/dist/DiagnosticCollection.js.map +1 -1
  34. package/dist/DiagnosticFilterer.d.ts +27 -6
  35. package/dist/DiagnosticFilterer.js +273 -60
  36. package/dist/DiagnosticFilterer.js.map +1 -1
  37. package/dist/DiagnosticManager.d.ts +83 -0
  38. package/dist/DiagnosticManager.js +422 -0
  39. package/dist/DiagnosticManager.js.map +1 -0
  40. package/dist/DiagnosticMessages.d.ts +602 -196
  41. package/dist/DiagnosticMessages.js +926 -342
  42. package/dist/DiagnosticMessages.js.map +1 -1
  43. package/dist/DiagnosticSeverityAdjuster.d.ts +7 -0
  44. package/dist/DiagnosticSeverityAdjuster.js +45 -0
  45. package/dist/DiagnosticSeverityAdjuster.js.map +1 -0
  46. package/dist/FunctionScope.d.ts +28 -0
  47. package/dist/FunctionScope.js +52 -0
  48. package/dist/FunctionScope.js.map +1 -0
  49. package/dist/KeyedThrottler.d.ts +3 -3
  50. package/dist/KeyedThrottler.js +3 -3
  51. package/dist/KeyedThrottler.js.map +1 -1
  52. package/dist/LanguageServer.d.ts +136 -104
  53. package/dist/LanguageServer.js +577 -741
  54. package/dist/LanguageServer.js.map +1 -1
  55. package/dist/Logger.d.ts +17 -13
  56. package/dist/Logger.js +64 -34
  57. package/dist/Logger.js.map +1 -1
  58. package/dist/PluginInterface.d.ts +32 -10
  59. package/dist/PluginInterface.js +117 -7
  60. package/dist/PluginInterface.js.map +1 -1
  61. package/dist/Program.d.ts +302 -98
  62. package/dist/Program.js +1613 -726
  63. package/dist/Program.js.map +1 -1
  64. package/dist/ProgramBuilder.d.ts +39 -22
  65. package/dist/ProgramBuilder.js +245 -179
  66. package/dist/ProgramBuilder.js.map +1 -1
  67. package/dist/Scope.d.ts +227 -106
  68. package/dist/Scope.js +609 -557
  69. package/dist/Scope.js.map +1 -1
  70. package/dist/ScopeNamespaceLookup.d.ts +73 -0
  71. package/dist/ScopeNamespaceLookup.js +242 -0
  72. package/dist/ScopeNamespaceLookup.js.map +1 -0
  73. package/dist/SemanticTokenUtils.js +5 -1
  74. package/dist/SemanticTokenUtils.js.map +1 -1
  75. package/dist/Stopwatch.d.ts +4 -0
  76. package/dist/Stopwatch.js +8 -1
  77. package/dist/Stopwatch.js.map +1 -1
  78. package/dist/SymbolTable.d.ts +145 -26
  79. package/dist/SymbolTable.js +575 -64
  80. package/dist/SymbolTable.js.map +1 -1
  81. package/dist/SymbolTypeFlag.d.ts +9 -0
  82. package/dist/SymbolTypeFlag.js +14 -0
  83. package/dist/SymbolTypeFlag.js.map +1 -0
  84. package/dist/Throttler.d.ts +12 -0
  85. package/dist/Throttler.js +39 -0
  86. package/dist/Throttler.js.map +1 -1
  87. package/dist/Watcher.d.ts +0 -3
  88. package/dist/Watcher.js +0 -3
  89. package/dist/Watcher.js.map +1 -1
  90. package/dist/XmlScope.d.ts +5 -15
  91. package/dist/XmlScope.js +34 -90
  92. package/dist/XmlScope.js.map +1 -1
  93. package/dist/astUtils/CachedLookups.d.ts +50 -0
  94. package/dist/astUtils/CachedLookups.js +337 -0
  95. package/dist/astUtils/CachedLookups.js.map +1 -0
  96. package/dist/astUtils/Editor.d.ts +69 -0
  97. package/dist/astUtils/Editor.js +245 -0
  98. package/dist/astUtils/Editor.js.map +1 -0
  99. package/dist/astUtils/creators.d.ts +54 -19
  100. package/dist/astUtils/creators.js +242 -42
  101. package/dist/astUtils/creators.js.map +1 -1
  102. package/dist/astUtils/reflection.d.ts +199 -85
  103. package/dist/astUtils/reflection.js +518 -145
  104. package/dist/astUtils/reflection.js.map +1 -1
  105. package/dist/astUtils/stackedVisitor.js.map +1 -1
  106. package/dist/astUtils/visitors.d.ts +117 -53
  107. package/dist/astUtils/visitors.js +95 -15
  108. package/dist/astUtils/visitors.js.map +1 -1
  109. package/dist/astUtils/xml.d.ts +9 -8
  110. package/dist/astUtils/xml.js +12 -7
  111. package/dist/astUtils/xml.js.map +1 -1
  112. package/dist/bscPlugin/BscPlugin.d.ts +26 -4
  113. package/dist/bscPlugin/BscPlugin.js +96 -4
  114. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  115. package/dist/bscPlugin/CallExpressionInfo.d.ts +36 -0
  116. package/dist/bscPlugin/CallExpressionInfo.js +142 -0
  117. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -0
  118. package/dist/bscPlugin/FileWriter.d.ts +19 -0
  119. package/dist/bscPlugin/FileWriter.js +79 -0
  120. package/dist/bscPlugin/FileWriter.js.map +1 -0
  121. package/dist/bscPlugin/SignatureHelpUtil.d.ts +10 -0
  122. package/dist/bscPlugin/SignatureHelpUtil.js +137 -0
  123. package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -0
  124. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +109 -7
  125. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +676 -26
  126. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  127. package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.d.ts +17 -0
  128. package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.js +66 -0
  129. package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.js.map +1 -0
  130. package/dist/bscPlugin/codeActions/codeActionHelpers.d.ts +18 -0
  131. package/dist/bscPlugin/codeActions/codeActionHelpers.js +31 -0
  132. package/dist/bscPlugin/codeActions/codeActionHelpers.js.map +1 -0
  133. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +65 -0
  134. package/dist/bscPlugin/completions/CompletionsProcessor.js +633 -0
  135. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
  136. package/dist/bscPlugin/definition/DefinitionProvider.d.ts +13 -0
  137. package/dist/bscPlugin/definition/DefinitionProvider.js +220 -0
  138. package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -0
  139. package/dist/bscPlugin/fileProviders/FileProvider.d.ts +9 -0
  140. package/dist/bscPlugin/fileProviders/FileProvider.js +51 -0
  141. package/dist/bscPlugin/fileProviders/FileProvider.js.map +1 -0
  142. package/dist/bscPlugin/hover/HoverProcessor.d.ts +18 -0
  143. package/dist/bscPlugin/hover/HoverProcessor.js +238 -0
  144. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
  145. package/dist/bscPlugin/references/ReferencesProvider.d.ts +12 -0
  146. package/dist/bscPlugin/references/ReferencesProvider.js +57 -0
  147. package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -0
  148. package/dist/bscPlugin/selectionRanges/SelectionRangesProcessor.d.ts +7 -0
  149. package/dist/bscPlugin/selectionRanges/SelectionRangesProcessor.js +77 -0
  150. package/dist/bscPlugin/selectionRanges/SelectionRangesProcessor.js.map +1 -0
  151. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +14 -0
  152. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +164 -0
  153. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  154. package/dist/bscPlugin/serialize/BslibManager.d.ts +12 -0
  155. package/dist/bscPlugin/serialize/BslibManager.js +46 -0
  156. package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
  157. package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
  158. package/dist/bscPlugin/serialize/FileSerializer.js +80 -0
  159. package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
  160. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.d.ts +7 -0
  161. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js +22 -0
  162. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js.map +1 -0
  163. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.d.ts +7 -0
  164. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js +26 -0
  165. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js.map +1 -0
  166. package/dist/bscPlugin/symbols/symbolUtils.d.ts +5 -0
  167. package/dist/bscPlugin/symbols/symbolUtils.js +141 -0
  168. package/dist/bscPlugin/symbols/symbolUtils.js.map +1 -0
  169. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +34 -0
  170. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +504 -0
  171. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -0
  172. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +12 -0
  173. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +99 -0
  174. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
  175. package/dist/bscPlugin/validation/BrsFileAfterValidator.d.ts +7 -0
  176. package/dist/bscPlugin/validation/BrsFileAfterValidator.js +18 -0
  177. package/dist/bscPlugin/validation/BrsFileAfterValidator.js.map +1 -0
  178. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +51 -0
  179. package/dist/bscPlugin/validation/BrsFileValidator.js +714 -0
  180. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  181. package/dist/bscPlugin/validation/ProgramValidator.d.ts +11 -0
  182. package/dist/bscPlugin/validation/ProgramValidator.js +33 -0
  183. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -0
  184. package/dist/bscPlugin/validation/ScopeValidator.d.ts +158 -0
  185. package/dist/bscPlugin/validation/ScopeValidator.js +1481 -0
  186. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  187. package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
  188. package/dist/bscPlugin/validation/XmlFileValidator.js +50 -0
  189. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
  190. package/dist/cli.js +140 -28
  191. package/dist/cli.js.map +1 -1
  192. package/dist/common/Sequencer.d.ts +53 -0
  193. package/dist/common/Sequencer.js +233 -0
  194. package/dist/common/Sequencer.js.map +1 -0
  195. package/dist/deferred.d.ts +5 -3
  196. package/dist/deferred.js +10 -0
  197. package/dist/deferred.js.map +1 -1
  198. package/dist/diagnosticUtils.d.ts +61 -4
  199. package/dist/diagnosticUtils.js +285 -25
  200. package/dist/diagnosticUtils.js.map +1 -1
  201. package/dist/examples/plugins/removePrint.d.ts +2 -2
  202. package/dist/examples/plugins/removePrint.js +8 -12
  203. package/dist/examples/plugins/removePrint.js.map +1 -1
  204. package/dist/files/AssetFile.d.ts +24 -0
  205. package/dist/files/AssetFile.js +25 -0
  206. package/dist/files/AssetFile.js.map +1 -0
  207. package/dist/files/BrsFile.d.ts +161 -87
  208. package/dist/files/BrsFile.js +919 -936
  209. package/dist/files/BrsFile.js.map +1 -1
  210. package/dist/files/BscFile.d.ts +102 -0
  211. package/dist/files/BscFile.js +15 -0
  212. package/dist/files/BscFile.js.map +1 -0
  213. package/dist/files/Factory.d.ts +25 -0
  214. package/dist/files/Factory.js +22 -0
  215. package/dist/files/Factory.js.map +1 -0
  216. package/dist/files/LazyFileData.d.ts +21 -0
  217. package/dist/files/LazyFileData.js +54 -0
  218. package/dist/files/LazyFileData.js.map +1 -0
  219. package/dist/files/XmlFile.d.ts +80 -41
  220. package/dist/files/XmlFile.js +162 -137
  221. package/dist/files/XmlFile.js.map +1 -1
  222. package/dist/globalCallables.d.ts +3 -1
  223. package/dist/globalCallables.js +424 -184
  224. package/dist/globalCallables.js.map +1 -1
  225. package/dist/index.d.ts +32 -4
  226. package/dist/index.js +54 -7
  227. package/dist/index.js.map +1 -1
  228. package/dist/interfaces.d.ts +987 -125
  229. package/dist/interfaces.js +21 -0
  230. package/dist/interfaces.js.map +1 -1
  231. package/dist/lexer/Lexer.d.ts +51 -12
  232. package/dist/lexer/Lexer.js +214 -65
  233. package/dist/lexer/Lexer.js.map +1 -1
  234. package/dist/lexer/Token.d.ts +27 -11
  235. package/dist/lexer/Token.js +10 -2
  236. package/dist/lexer/Token.js.map +1 -1
  237. package/dist/lexer/TokenKind.d.ts +48 -2
  238. package/dist/lexer/TokenKind.js +167 -10
  239. package/dist/lexer/TokenKind.js.map +1 -1
  240. package/dist/logging.d.ts +14 -0
  241. package/dist/logging.js +29 -0
  242. package/dist/logging.js.map +1 -0
  243. package/dist/lsp/ActionQueue.d.ts +35 -0
  244. package/dist/lsp/ActionQueue.js +115 -0
  245. package/dist/lsp/ActionQueue.js.map +1 -0
  246. package/dist/lsp/DocumentManager.d.ts +63 -0
  247. package/dist/lsp/DocumentManager.js +122 -0
  248. package/dist/lsp/DocumentManager.js.map +1 -0
  249. package/dist/lsp/LspProject.d.ts +287 -0
  250. package/dist/lsp/LspProject.js +3 -0
  251. package/dist/lsp/LspProject.js.map +1 -0
  252. package/dist/lsp/PathFilterer.d.ts +75 -0
  253. package/dist/lsp/PathFilterer.js +196 -0
  254. package/dist/lsp/PathFilterer.js.map +1 -0
  255. package/dist/lsp/Project.d.ts +200 -0
  256. package/dist/lsp/Project.js +562 -0
  257. package/dist/lsp/Project.js.map +1 -0
  258. package/dist/lsp/ProjectManager.d.ts +288 -0
  259. package/dist/lsp/ProjectManager.js +967 -0
  260. package/dist/lsp/ProjectManager.js.map +1 -0
  261. package/dist/lsp/ReaderWriterManager.d.ts +21 -0
  262. package/dist/lsp/ReaderWriterManager.js +60 -0
  263. package/dist/lsp/ReaderWriterManager.js.map +1 -0
  264. package/dist/lsp/worker/MessageHandler.d.ts +99 -0
  265. package/dist/lsp/worker/MessageHandler.js +138 -0
  266. package/dist/lsp/worker/MessageHandler.js.map +1 -0
  267. package/dist/lsp/worker/WorkerPool.d.ts +38 -0
  268. package/dist/lsp/worker/WorkerPool.js +78 -0
  269. package/dist/lsp/worker/WorkerPool.js.map +1 -0
  270. package/dist/lsp/worker/WorkerThreadProject.d.ts +168 -0
  271. package/dist/lsp/worker/WorkerThreadProject.js +205 -0
  272. package/dist/lsp/worker/WorkerThreadProject.js.map +1 -0
  273. package/dist/lsp/worker/WorkerThreadProjectRunner.d.ts +15 -0
  274. package/dist/lsp/worker/WorkerThreadProjectRunner.js +58 -0
  275. package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -0
  276. package/dist/lsp/worker/run.js +14 -0
  277. package/dist/lsp/worker/run.js.map +1 -0
  278. package/dist/parser/AstNode.d.ts +205 -0
  279. package/dist/parser/AstNode.js +305 -0
  280. package/dist/parser/AstNode.js.map +1 -0
  281. package/dist/parser/BrightScriptDocParser.d.ts +56 -0
  282. package/dist/parser/BrightScriptDocParser.js +294 -0
  283. package/dist/parser/BrightScriptDocParser.js.map +1 -0
  284. package/dist/parser/BrsTranspileState.d.ts +22 -3
  285. package/dist/parser/BrsTranspileState.js +19 -0
  286. package/dist/parser/BrsTranspileState.js.map +1 -1
  287. package/dist/parser/Expression.d.ts +601 -220
  288. package/dist/parser/Expression.js +1516 -502
  289. package/dist/parser/Expression.js.map +1 -1
  290. package/dist/parser/Parser.d.ts +137 -121
  291. package/dist/parser/Parser.js +1808 -982
  292. package/dist/parser/Parser.js.map +1 -1
  293. package/dist/parser/SGParser.d.ts +30 -13
  294. package/dist/parser/SGParser.js +94 -56
  295. package/dist/parser/SGParser.js.map +1 -1
  296. package/dist/parser/SGTypes.d.ts +134 -46
  297. package/dist/parser/SGTypes.js +206 -115
  298. package/dist/parser/SGTypes.js.map +1 -1
  299. package/dist/parser/Statement.d.ts +854 -267
  300. package/dist/parser/Statement.js +2416 -621
  301. package/dist/parser/Statement.js.map +1 -1
  302. package/dist/parser/TranspileState.d.ts +30 -14
  303. package/dist/parser/TranspileState.js +124 -27
  304. package/dist/parser/TranspileState.js.map +1 -1
  305. package/dist/preprocessor/Manifest.d.ts +6 -6
  306. package/dist/preprocessor/Manifest.js +17 -38
  307. package/dist/preprocessor/Manifest.js.map +1 -1
  308. package/dist/roku-types/data.json +20554 -0
  309. package/dist/roku-types/index.d.ts +5726 -0
  310. package/dist/roku-types/index.js +11 -0
  311. package/dist/roku-types/index.js.map +1 -0
  312. package/dist/types/ArrayType.d.ts +12 -5
  313. package/dist/types/ArrayType.js +95 -25
  314. package/dist/types/ArrayType.js.map +1 -1
  315. package/dist/types/AssociativeArrayType.d.ts +15 -0
  316. package/dist/types/AssociativeArrayType.js +64 -0
  317. package/dist/types/AssociativeArrayType.js.map +1 -0
  318. package/dist/types/BaseFunctionType.d.ts +10 -0
  319. package/dist/types/BaseFunctionType.js +26 -0
  320. package/dist/types/BaseFunctionType.js.map +1 -0
  321. package/dist/types/BooleanType.d.ts +9 -5
  322. package/dist/types/BooleanType.js +19 -8
  323. package/dist/types/BooleanType.js.map +1 -1
  324. package/dist/types/BscType.d.ts +41 -3
  325. package/dist/types/BscType.js +152 -0
  326. package/dist/types/BscType.js.map +1 -1
  327. package/dist/types/BscTypeKind.d.ts +28 -0
  328. package/dist/types/BscTypeKind.js +33 -0
  329. package/dist/types/BscTypeKind.js.map +1 -0
  330. package/dist/types/BuiltInInterfaceAdder.d.ts +28 -0
  331. package/dist/types/BuiltInInterfaceAdder.js +212 -0
  332. package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
  333. package/dist/types/CallFuncableType.d.ts +24 -0
  334. package/dist/types/CallFuncableType.js +91 -0
  335. package/dist/types/CallFuncableType.js.map +1 -0
  336. package/dist/types/ClassType.d.ts +17 -0
  337. package/dist/types/ClassType.js +63 -0
  338. package/dist/types/ClassType.js.map +1 -0
  339. package/dist/types/ComponentType.d.ts +22 -0
  340. package/dist/types/ComponentType.js +110 -0
  341. package/dist/types/ComponentType.js.map +1 -0
  342. package/dist/types/DoubleType.d.ts +10 -5
  343. package/dist/types/DoubleType.js +21 -17
  344. package/dist/types/DoubleType.js.map +1 -1
  345. package/dist/types/DynamicType.d.ts +13 -5
  346. package/dist/types/DynamicType.js +26 -5
  347. package/dist/types/DynamicType.js.map +1 -1
  348. package/dist/types/EnumType.d.ts +42 -0
  349. package/dist/types/EnumType.js +101 -0
  350. package/dist/types/EnumType.js.map +1 -0
  351. package/dist/types/FloatType.d.ts +10 -5
  352. package/dist/types/FloatType.js +21 -17
  353. package/dist/types/FloatType.js.map +1 -1
  354. package/dist/types/FunctionType.d.ts +8 -22
  355. package/dist/types/FunctionType.js +25 -63
  356. package/dist/types/FunctionType.js.map +1 -1
  357. package/dist/types/InheritableType.d.ts +29 -0
  358. package/dist/types/InheritableType.js +173 -0
  359. package/dist/types/InheritableType.js.map +1 -0
  360. package/dist/types/InlineInterfaceType.d.ts +5 -0
  361. package/dist/types/InlineInterfaceType.js +17 -0
  362. package/dist/types/InlineInterfaceType.js.map +1 -0
  363. package/dist/types/IntegerType.d.ts +10 -5
  364. package/dist/types/IntegerType.js +21 -17
  365. package/dist/types/IntegerType.js.map +1 -1
  366. package/dist/types/InterfaceType.d.ts +14 -6
  367. package/dist/types/InterfaceType.js +30 -15
  368. package/dist/types/InterfaceType.js.map +1 -1
  369. package/dist/types/IntersectionType.d.ts +29 -0
  370. package/dist/types/IntersectionType.js +256 -0
  371. package/dist/types/IntersectionType.js.map +1 -0
  372. package/dist/types/InvalidType.d.ts +10 -5
  373. package/dist/types/InvalidType.js +21 -9
  374. package/dist/types/InvalidType.js.map +1 -1
  375. package/dist/types/LongIntegerType.d.ts +10 -5
  376. package/dist/types/LongIntegerType.js +21 -17
  377. package/dist/types/LongIntegerType.js.map +1 -1
  378. package/dist/types/NamespaceType.d.ts +12 -0
  379. package/dist/types/NamespaceType.js +28 -0
  380. package/dist/types/NamespaceType.js.map +1 -0
  381. package/dist/types/ObjectType.d.ts +12 -5
  382. package/dist/types/ObjectType.js +25 -8
  383. package/dist/types/ObjectType.js.map +1 -1
  384. package/dist/types/ReferenceType.d.ts +123 -0
  385. package/dist/types/ReferenceType.js +726 -0
  386. package/dist/types/ReferenceType.js.map +1 -0
  387. package/dist/types/StringType.d.ts +12 -5
  388. package/dist/types/StringType.js +23 -8
  389. package/dist/types/StringType.js.map +1 -1
  390. package/dist/types/TypeStatementType.d.ts +19 -0
  391. package/dist/types/TypeStatementType.js +56 -0
  392. package/dist/types/TypeStatementType.js.map +1 -0
  393. package/dist/types/TypedFunctionType.d.ts +34 -0
  394. package/dist/types/TypedFunctionType.js +157 -0
  395. package/dist/types/TypedFunctionType.js.map +1 -0
  396. package/dist/types/UninitializedType.d.ts +11 -6
  397. package/dist/types/UninitializedType.js +20 -11
  398. package/dist/types/UninitializedType.js.map +1 -1
  399. package/dist/types/UnionType.d.ts +27 -0
  400. package/dist/types/UnionType.js +196 -0
  401. package/dist/types/UnionType.js.map +1 -0
  402. package/dist/types/VoidType.d.ts +11 -5
  403. package/dist/types/VoidType.js +22 -8
  404. package/dist/types/VoidType.js.map +1 -1
  405. package/dist/types/helpers.d.ts +51 -0
  406. package/dist/types/helpers.js +329 -0
  407. package/dist/types/helpers.js.map +1 -0
  408. package/dist/types/index.d.ts +22 -0
  409. package/dist/types/index.js +39 -0
  410. package/dist/types/index.js.map +1 -0
  411. package/dist/types/roFunctionType.d.ts +11 -0
  412. package/dist/types/roFunctionType.js +37 -0
  413. package/dist/types/roFunctionType.js.map +1 -0
  414. package/dist/util.d.ts +325 -185
  415. package/dist/util.js +2135 -568
  416. package/dist/util.js.map +1 -1
  417. package/dist/validators/ClassValidator.d.ts +9 -15
  418. package/dist/validators/ClassValidator.js +93 -138
  419. package/dist/validators/ClassValidator.js.map +1 -1
  420. package/package.json +183 -138
  421. package/CHANGELOG.md +0 -1188
  422. package/dist/astUtils/creators.spec.js +0 -21
  423. package/dist/astUtils/creators.spec.js.map +0 -1
  424. package/dist/astUtils/index.d.ts +0 -7
  425. package/dist/astUtils/index.js +0 -26
  426. package/dist/astUtils/index.js.map +0 -1
  427. package/dist/astUtils/reflection.spec.d.ts +0 -1
  428. package/dist/astUtils/reflection.spec.js +0 -292
  429. package/dist/astUtils/reflection.spec.js.map +0 -1
  430. package/dist/astUtils/stackedVisitor.spec.d.ts +0 -1
  431. package/dist/astUtils/stackedVisitor.spec.js +0 -79
  432. package/dist/astUtils/stackedVisitor.spec.js.map +0 -1
  433. package/dist/astUtils/visitors.spec.d.ts +0 -1
  434. package/dist/astUtils/visitors.spec.js +0 -854
  435. package/dist/astUtils/visitors.spec.js.map +0 -1
  436. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.d.ts +0 -1
  437. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +0 -194
  438. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +0 -1
  439. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
  440. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
  441. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
  442. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.d.ts +0 -1
  443. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js +0 -45
  444. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
  445. package/dist/files/BrsFile.Class.spec.d.ts +0 -1
  446. package/dist/files/BrsFile.Class.spec.js +0 -1081
  447. package/dist/files/BrsFile.Class.spec.js.map +0 -1
  448. package/dist/files/BrsFile.spec.d.ts +0 -1
  449. package/dist/files/BrsFile.spec.js +0 -2524
  450. package/dist/files/BrsFile.spec.js.map +0 -1
  451. package/dist/files/XmlFile.spec.d.ts +0 -1
  452. package/dist/files/XmlFile.spec.js +0 -1065
  453. package/dist/files/XmlFile.spec.js.map +0 -1
  454. package/dist/files/tests/imports.spec.d.ts +0 -1
  455. package/dist/files/tests/imports.spec.js +0 -241
  456. package/dist/files/tests/imports.spec.js.map +0 -1
  457. package/dist/lexer/Character.spec.d.ts +0 -1
  458. package/dist/lexer/Character.spec.js +0 -27
  459. package/dist/lexer/Character.spec.js.map +0 -1
  460. package/dist/lexer/Lexer.spec.d.ts +0 -1
  461. package/dist/lexer/Lexer.spec.js +0 -1101
  462. package/dist/lexer/Lexer.spec.js.map +0 -1
  463. package/dist/lexer/index.d.ts +0 -3
  464. package/dist/lexer/index.js +0 -17
  465. package/dist/lexer/index.js.map +0 -1
  466. package/dist/parser/Parser.Class.spec.d.ts +0 -1
  467. package/dist/parser/Parser.Class.spec.js +0 -390
  468. package/dist/parser/Parser.Class.spec.js.map +0 -1
  469. package/dist/parser/Parser.spec.d.ts +0 -4
  470. package/dist/parser/Parser.spec.js +0 -1216
  471. package/dist/parser/Parser.spec.js.map +0 -1
  472. package/dist/parser/SGParser.spec.d.ts +0 -1
  473. package/dist/parser/SGParser.spec.js +0 -145
  474. package/dist/parser/SGParser.spec.js.map +0 -1
  475. package/dist/parser/SGTypes.spec.d.ts +0 -1
  476. package/dist/parser/SGTypes.spec.js +0 -351
  477. package/dist/parser/SGTypes.spec.js.map +0 -1
  478. package/dist/parser/Statement.spec.d.ts +0 -1
  479. package/dist/parser/Statement.spec.js +0 -94
  480. package/dist/parser/Statement.spec.js.map +0 -1
  481. package/dist/parser/index.d.ts +0 -3
  482. package/dist/parser/index.js +0 -16
  483. package/dist/parser/index.js.map +0 -1
  484. package/dist/parser/tests/Parser.spec.d.ts +0 -18
  485. package/dist/parser/tests/Parser.spec.js +0 -35
  486. package/dist/parser/tests/Parser.spec.js.map +0 -1
  487. package/dist/parser/tests/controlFlow/For.spec.d.ts +0 -1
  488. package/dist/parser/tests/controlFlow/For.spec.js +0 -161
  489. package/dist/parser/tests/controlFlow/For.spec.js.map +0 -1
  490. package/dist/parser/tests/controlFlow/ForEach.spec.d.ts +0 -1
  491. package/dist/parser/tests/controlFlow/ForEach.spec.js +0 -106
  492. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +0 -1
  493. package/dist/parser/tests/controlFlow/If.spec.d.ts +0 -1
  494. package/dist/parser/tests/controlFlow/If.spec.js +0 -551
  495. package/dist/parser/tests/controlFlow/If.spec.js.map +0 -1
  496. package/dist/parser/tests/controlFlow/While.spec.d.ts +0 -1
  497. package/dist/parser/tests/controlFlow/While.spec.js +0 -107
  498. package/dist/parser/tests/controlFlow/While.spec.js.map +0 -1
  499. package/dist/parser/tests/expression/Additive.spec.d.ts +0 -1
  500. package/dist/parser/tests/expression/Additive.spec.js +0 -99
  501. package/dist/parser/tests/expression/Additive.spec.js.map +0 -1
  502. package/dist/parser/tests/expression/ArrayLiterals.spec.d.ts +0 -1
  503. package/dist/parser/tests/expression/ArrayLiterals.spec.js +0 -254
  504. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +0 -1
  505. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.d.ts +0 -1
  506. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +0 -266
  507. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +0 -1
  508. package/dist/parser/tests/expression/Boolean.spec.d.ts +0 -1
  509. package/dist/parser/tests/expression/Boolean.spec.js +0 -83
  510. package/dist/parser/tests/expression/Boolean.spec.js.map +0 -1
  511. package/dist/parser/tests/expression/Call.spec.d.ts +0 -1
  512. package/dist/parser/tests/expression/Call.spec.js +0 -134
  513. package/dist/parser/tests/expression/Call.spec.js.map +0 -1
  514. package/dist/parser/tests/expression/Exponential.spec.d.ts +0 -1
  515. package/dist/parser/tests/expression/Exponential.spec.js +0 -37
  516. package/dist/parser/tests/expression/Exponential.spec.js.map +0 -1
  517. package/dist/parser/tests/expression/Function.spec.d.ts +0 -1
  518. package/dist/parser/tests/expression/Function.spec.js +0 -403
  519. package/dist/parser/tests/expression/Function.spec.js.map +0 -1
  520. package/dist/parser/tests/expression/Indexing.spec.d.ts +0 -1
  521. package/dist/parser/tests/expression/Indexing.spec.js +0 -219
  522. package/dist/parser/tests/expression/Indexing.spec.js.map +0 -1
  523. package/dist/parser/tests/expression/Multiplicative.spec.d.ts +0 -1
  524. package/dist/parser/tests/expression/Multiplicative.spec.js +0 -67
  525. package/dist/parser/tests/expression/Multiplicative.spec.js.map +0 -1
  526. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.d.ts +0 -1
  527. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +0 -201
  528. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +0 -1
  529. package/dist/parser/tests/expression/PrefixUnary.spec.d.ts +0 -1
  530. package/dist/parser/tests/expression/PrefixUnary.spec.js +0 -105
  531. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +0 -1
  532. package/dist/parser/tests/expression/Primary.spec.d.ts +0 -1
  533. package/dist/parser/tests/expression/Primary.spec.js +0 -149
  534. package/dist/parser/tests/expression/Primary.spec.js.map +0 -1
  535. package/dist/parser/tests/expression/Relational.spec.d.ts +0 -1
  536. package/dist/parser/tests/expression/Relational.spec.js +0 -83
  537. package/dist/parser/tests/expression/Relational.spec.js.map +0 -1
  538. package/dist/parser/tests/expression/SourceLiteralExpression.spec.d.ts +0 -1
  539. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +0 -201
  540. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +0 -1
  541. package/dist/parser/tests/expression/TemplateStringExpression.spec.d.ts +0 -1
  542. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +0 -202
  543. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +0 -1
  544. package/dist/parser/tests/expression/TernaryExpression.spec.d.ts +0 -1
  545. package/dist/parser/tests/expression/TernaryExpression.spec.js +0 -323
  546. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +0 -1
  547. package/dist/parser/tests/statement/AssignmentOperators.spec.d.ts +0 -1
  548. package/dist/parser/tests/statement/AssignmentOperators.spec.js +0 -79
  549. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +0 -1
  550. package/dist/parser/tests/statement/Declaration.spec.d.ts +0 -1
  551. package/dist/parser/tests/statement/Declaration.spec.js +0 -108
  552. package/dist/parser/tests/statement/Declaration.spec.js.map +0 -1
  553. package/dist/parser/tests/statement/Dim.spec.d.ts +0 -1
  554. package/dist/parser/tests/statement/Dim.spec.js +0 -73
  555. package/dist/parser/tests/statement/Dim.spec.js.map +0 -1
  556. package/dist/parser/tests/statement/Function.spec.d.ts +0 -1
  557. package/dist/parser/tests/statement/Function.spec.js +0 -332
  558. package/dist/parser/tests/statement/Function.spec.js.map +0 -1
  559. package/dist/parser/tests/statement/Goto.spec.d.ts +0 -1
  560. package/dist/parser/tests/statement/Goto.spec.js +0 -50
  561. package/dist/parser/tests/statement/Goto.spec.js.map +0 -1
  562. package/dist/parser/tests/statement/Increment.spec.d.ts +0 -1
  563. package/dist/parser/tests/statement/Increment.spec.js +0 -117
  564. package/dist/parser/tests/statement/Increment.spec.js.map +0 -1
  565. package/dist/parser/tests/statement/LibraryStatement.spec.d.ts +0 -1
  566. package/dist/parser/tests/statement/LibraryStatement.spec.js +0 -74
  567. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +0 -1
  568. package/dist/parser/tests/statement/Misc.spec.d.ts +0 -1
  569. package/dist/parser/tests/statement/Misc.spec.js +0 -333
  570. package/dist/parser/tests/statement/Misc.spec.js.map +0 -1
  571. package/dist/parser/tests/statement/PrintStatement.spec.d.ts +0 -1
  572. package/dist/parser/tests/statement/PrintStatement.spec.js +0 -181
  573. package/dist/parser/tests/statement/PrintStatement.spec.js.map +0 -1
  574. package/dist/parser/tests/statement/ReturnStatement.spec.d.ts +0 -1
  575. package/dist/parser/tests/statement/ReturnStatement.spec.js +0 -94
  576. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +0 -1
  577. package/dist/parser/tests/statement/Set.spec.d.ts +0 -1
  578. package/dist/parser/tests/statement/Set.spec.js +0 -218
  579. package/dist/parser/tests/statement/Set.spec.js.map +0 -1
  580. package/dist/parser/tests/statement/Stop.spec.d.ts +0 -1
  581. package/dist/parser/tests/statement/Stop.spec.js +0 -37
  582. package/dist/parser/tests/statement/Stop.spec.js.map +0 -1
  583. package/dist/parser/tests/statement/Throw.spec.d.ts +0 -1
  584. package/dist/parser/tests/statement/Throw.spec.js +0 -35
  585. package/dist/parser/tests/statement/Throw.spec.js.map +0 -1
  586. package/dist/parser/tests/statement/TryCatch.spec.d.ts +0 -1
  587. package/dist/parser/tests/statement/TryCatch.spec.js +0 -140
  588. package/dist/parser/tests/statement/TryCatch.spec.js.map +0 -1
  589. package/dist/preprocessor/Chunk.d.ts +0 -82
  590. package/dist/preprocessor/Chunk.js +0 -77
  591. package/dist/preprocessor/Chunk.js.map +0 -1
  592. package/dist/preprocessor/Manifest.spec.d.ts +0 -0
  593. package/dist/preprocessor/Manifest.spec.js +0 -105
  594. package/dist/preprocessor/Manifest.spec.js.map +0 -1
  595. package/dist/preprocessor/Preprocessor.d.ts +0 -60
  596. package/dist/preprocessor/Preprocessor.js +0 -156
  597. package/dist/preprocessor/Preprocessor.js.map +0 -1
  598. package/dist/preprocessor/Preprocessor.spec.d.ts +0 -1
  599. package/dist/preprocessor/Preprocessor.spec.js +0 -152
  600. package/dist/preprocessor/Preprocessor.spec.js.map +0 -1
  601. package/dist/preprocessor/PreprocessorParser.d.ts +0 -61
  602. package/dist/preprocessor/PreprocessorParser.js +0 -194
  603. package/dist/preprocessor/PreprocessorParser.js.map +0 -1
  604. package/dist/preprocessor/PreprocessorParser.spec.d.ts +0 -1
  605. package/dist/preprocessor/PreprocessorParser.spec.js +0 -116
  606. package/dist/preprocessor/PreprocessorParser.spec.js.map +0 -1
  607. package/dist/preprocessor/index.d.ts +0 -3
  608. package/dist/preprocessor/index.js +0 -16
  609. package/dist/preprocessor/index.js.map +0 -1
  610. package/dist/types/ArrayType.spec.d.ts +0 -1
  611. package/dist/types/ArrayType.spec.js +0 -30
  612. package/dist/types/ArrayType.spec.js.map +0 -1
  613. package/dist/types/BooleanType.spec.d.ts +0 -1
  614. package/dist/types/BooleanType.spec.js +0 -12
  615. package/dist/types/BooleanType.spec.js.map +0 -1
  616. package/dist/types/CustomType.d.ts +0 -10
  617. package/dist/types/CustomType.js +0 -35
  618. package/dist/types/CustomType.js.map +0 -1
  619. package/dist/types/DoubleType.spec.d.ts +0 -1
  620. package/dist/types/DoubleType.spec.js +0 -12
  621. package/dist/types/DoubleType.spec.js.map +0 -1
  622. package/dist/types/DynamicType.spec.d.ts +0 -1
  623. package/dist/types/DynamicType.spec.js +0 -12
  624. package/dist/types/DynamicType.spec.js.map +0 -1
  625. package/dist/types/FloatType.spec.d.ts +0 -1
  626. package/dist/types/FloatType.spec.js +0 -12
  627. package/dist/types/FloatType.spec.js.map +0 -1
  628. package/dist/types/FunctionType.spec.d.ts +0 -1
  629. package/dist/types/FunctionType.spec.js +0 -29
  630. package/dist/types/FunctionType.spec.js.map +0 -1
  631. package/dist/types/IntegerType.spec.d.ts +0 -1
  632. package/dist/types/IntegerType.spec.js +0 -12
  633. package/dist/types/IntegerType.spec.js.map +0 -1
  634. package/dist/types/InvalidType.spec.d.ts +0 -1
  635. package/dist/types/InvalidType.spec.js +0 -12
  636. package/dist/types/InvalidType.spec.js.map +0 -1
  637. package/dist/types/LazyType.d.ts +0 -15
  638. package/dist/types/LazyType.js +0 -32
  639. package/dist/types/LazyType.js.map +0 -1
  640. package/dist/types/LongIntegerType.spec.d.ts +0 -1
  641. package/dist/types/LongIntegerType.spec.js +0 -12
  642. package/dist/types/LongIntegerType.spec.js.map +0 -1
  643. package/dist/types/ObjectType.spec.d.ts +0 -1
  644. package/dist/types/ObjectType.spec.js +0 -12
  645. package/dist/types/ObjectType.spec.js.map +0 -1
  646. package/dist/types/StringType.spec.d.ts +0 -1
  647. package/dist/types/StringType.spec.js +0 -12
  648. package/dist/types/StringType.spec.js.map +0 -1
  649. package/dist/types/VoidType.spec.d.ts +0 -1
  650. package/dist/types/VoidType.spec.js +0 -12
  651. package/dist/types/VoidType.spec.js.map +0 -1
  652. /package/dist/{astUtils/creators.spec.d.ts → lsp/worker/run.d.ts} +0 -0
@@ -1,130 +1,641 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SymbolTable = void 0;
4
- const DynamicType_1 = require("./types/DynamicType");
5
- const UninitializedType_1 = require("./types/UninitializedType");
4
+ const CacheVerifier_1 = require("./CacheVerifier");
5
+ const helpers_1 = require("./types/helpers");
6
+ const reflection_1 = require("./astUtils/reflection");
6
7
  /**
7
8
  * Stores the types associated with variables and functions in the Brighterscript code
8
9
  * Can be part of a hierarchy, so lookups can reference parent scopes
9
10
  */
10
11
  class SymbolTable {
11
- constructor(parent) {
12
- this.parent = parent;
12
+ constructor(name, parentProvider) {
13
+ this.name = name;
13
14
  /**
14
15
  * The map of symbols declared directly in this SymbolTable (excludes parent SymbolTable).
15
16
  * Indexed by lower symbol name
16
17
  */
17
18
  this.symbolMap = new Map();
19
+ this.parentProviders = [];
20
+ this.siblings = new Set();
21
+ /**
22
+ * Does the order of symbols in this symbol table matter?
23
+ * Normally, this would only be for symbol tables referencing symbols declared within a function
24
+ */
25
+ this.isOrdered = false;
26
+ this.pocketTables = new Array();
27
+ this.isPocketTable = false;
28
+ this.complementsTables = new Set();
29
+ this.cachedCircularReferenceCheck = null;
30
+ this.resetTypeCache();
31
+ if (parentProvider) {
32
+ this.pushParentProvider(parentProvider);
33
+ }
18
34
  }
19
35
  /**
20
- * Get list of symbols declared directly in this SymbolTable (excludes parent SymbolTable).
36
+ * Push a function that will provide a parent SymbolTable when requested
21
37
  */
22
- get ownSymbols() {
23
- return [].concat(...this.symbolMap.values());
38
+ pushParentProvider(provider) {
39
+ this.cachedCircularReferenceCheck = null;
40
+ this.parentProviders.push(provider);
41
+ return () => {
42
+ this.popParentProvider();
43
+ };
24
44
  }
25
45
  /**
26
- * Sets the parent table for lookups
27
- *
28
- * @param [parent]
46
+ * Pop the current parentProvider
47
+ */
48
+ popParentProvider() {
49
+ this.cachedCircularReferenceCheck = null;
50
+ this.parentProviders.pop();
51
+ }
52
+ /**
53
+ * The parent SymbolTable (if there is one)
54
+ */
55
+ get parent() {
56
+ var _a, _b;
57
+ return (_b = (_a = this.parentProviders)[this.parentProviders.length - 1]) === null || _b === void 0 ? void 0 : _b.call(_a);
58
+ }
59
+ /**
60
+ * Add a sibling symbol table (which will be inspected first before walking upward to the parent
61
+ */
62
+ addSibling(sibling) {
63
+ this.siblings.add(sibling);
64
+ return () => {
65
+ this.siblings.delete(sibling);
66
+ };
67
+ }
68
+ /**
69
+ * Remove a sibling symbol table
70
+ */
71
+ removeSibling(sibling) {
72
+ this.siblings.delete(sibling);
73
+ }
74
+ addPocketTable(pocketTable) {
75
+ pocketTable.table.isPocketTable = true;
76
+ this.pocketTables.push(pocketTable);
77
+ return () => {
78
+ const index = this.pocketTables.findIndex(pt => pt === pocketTable);
79
+ if (index >= 0) {
80
+ this.pocketTables.splice(index, 1);
81
+ }
82
+ };
83
+ }
84
+ getCurrentPocketTableDepth() {
85
+ let depth = 0;
86
+ let currentTable = this;
87
+ while (currentTable.isPocketTable) {
88
+ depth++;
89
+ currentTable = currentTable.parent;
90
+ }
91
+ return depth;
92
+ }
93
+ getStatementIndexOfPocketTable(symbolTable) {
94
+ var _a, _b;
95
+ return (_b = (_a = this.pocketTables.find(pt => pt.table === symbolTable)) === null || _a === void 0 ? void 0 : _a.index) !== null && _b !== void 0 ? _b : -1;
96
+ }
97
+ /**
98
+ * This table complements this other table
99
+ * Eg. This is an else branch, it complements a then branch
29
100
  */
30
- setParent(parent) {
31
- this.parent = parent;
101
+ complementOtherTable(otherTable) {
102
+ this.complementsTables.add(otherTable);
103
+ }
104
+ clearSymbols() {
105
+ this.symbolMap.clear();
32
106
  }
33
107
  /**
34
108
  * Checks if the symbol table contains the given symbol by name
35
109
  * If the identifier is not in this table, it will check the parent
36
110
  *
37
111
  * @param name the name to lookup
38
- * @param searchParent should we look to our parent if we don't have the symbol?
112
+ * @param bitFlags flags to match (See SymbolTypeFlags)
39
113
  * @returns true if this symbol is in the symbol table
40
114
  */
41
- hasSymbol(name, searchParent = true) {
42
- var _a;
43
- const key = name.toLowerCase();
44
- let result = this.symbolMap.has(key);
45
- if (!result && searchParent) {
46
- result = !!((_a = this.parent) === null || _a === void 0 ? void 0 : _a.hasSymbol(key));
47
- }
48
- return result;
115
+ hasSymbol(name, bitFlags) {
116
+ let currentTable = this;
117
+ const key = name === null || name === void 0 ? void 0 : name.toLowerCase();
118
+ let result;
119
+ do {
120
+ // look in our map first
121
+ if ((result = currentTable.symbolMap.get(key))) {
122
+ // eslint-disable-next-line no-bitwise
123
+ if (result.find(symbol => symbol.flags & bitFlags)) {
124
+ return true;
125
+ }
126
+ }
127
+ //look in pocket tables
128
+ for (let pocket of this.pocketTables) {
129
+ if ((result = pocket.table.symbolMap.get(key))) {
130
+ // eslint-disable-next-line no-bitwise
131
+ if (result.find(symbol => symbol.flags & bitFlags)) {
132
+ return true;
133
+ }
134
+ }
135
+ }
136
+ if ((result = currentTable.symbolMap.get(key))) {
137
+ // eslint-disable-next-line no-bitwise
138
+ if (result.find(symbol => symbol.flags & bitFlags)) {
139
+ return true;
140
+ }
141
+ }
142
+ //look through any sibling maps next
143
+ for (let sibling of currentTable.siblings) {
144
+ if ((result = sibling.symbolMap.get(key))) {
145
+ // eslint-disable-next-line no-bitwise
146
+ if (result.find(symbol => symbol.flags & bitFlags)) {
147
+ return true;
148
+ }
149
+ }
150
+ }
151
+ currentTable = currentTable.parent;
152
+ } while (currentTable);
153
+ return false;
49
154
  }
50
155
  /**
51
156
  * Gets the name/type pair for a given named variable or function name
52
157
  * If the identifier is not in this table, it will check the parent
53
158
  *
54
159
  * @param name the name to lookup
55
- * @param searchParent should we look to our parent if we don't have the symbol?
160
+ * @param bitFlags flags to match
56
161
  * @returns An array of BscSymbols - one for each time this symbol had a type implicitly defined
57
162
  */
58
- getSymbol(name, searchParent = true) {
163
+ getSymbol(name, bitFlags, additionalOptions = {}) {
164
+ var _a, _b, _c, _d;
165
+ let currentTable = this;
166
+ let previousTable;
167
+ const key = name === null || name === void 0 ? void 0 : name.toLowerCase();
168
+ let result;
169
+ let memberOfAncestor = false;
170
+ //only clone the symbol when we actually need to attach the `memberOfAncestor` flag
171
+ //(i.e., we walked up to a parent table). Returning the original reference for own-table
172
+ //hits keeps identity stable, which downstream consumers (and one symbol-table spec)
173
+ //rely on.
174
+ const addAncestorInfo = (symbol) => (memberOfAncestor
175
+ ? Object.assign(Object.assign({}, symbol), { data: Object.assign(Object.assign({}, symbol.data), { memberOfAncestor: true }) }) : symbol);
176
+ let maxStatementIndex = Number.isInteger(additionalOptions === null || additionalOptions === void 0 ? void 0 : additionalOptions.maxStatementIndex) ? additionalOptions.maxStatementIndex : Number.MAX_SAFE_INTEGER;
177
+ do {
178
+ if (previousTable) {
179
+ maxStatementIndex = currentTable.isOrdered ? currentTable.getStatementIndexOfPocketTable(previousTable) : Number.MAX_SAFE_INTEGER;
180
+ }
181
+ // look in our map first
182
+ let currentResults = currentTable.symbolMap.get(key);
183
+ if (currentResults) {
184
+ // eslint-disable-next-line no-bitwise
185
+ currentResults = currentResults.filter(symbol => symbol.flags & bitFlags)
186
+ .filter(this.getSymbolLookupFilter(currentTable, maxStatementIndex, memberOfAncestor));
187
+ }
188
+ let precedingAssignmentIndex = -1;
189
+ if ((currentResults === null || currentResults === void 0 ? void 0 : currentResults.length) > 0 && currentTable.isOrdered && maxStatementIndex >= 0) {
190
+ this.sortSymbolsByAssignmentOrderInPlace(currentResults);
191
+ const lastResult = currentResults[currentResults.length - 1];
192
+ currentResults = [lastResult];
193
+ precedingAssignmentIndex = (_c = (_b = (_a = lastResult.data) === null || _a === void 0 ? void 0 : _a.definingNode) === null || _b === void 0 ? void 0 : _b.statementIndex) !== null && _c !== void 0 ? _c : -1;
194
+ }
195
+ if ((result === null || result === void 0 ? void 0 : result.length) > 0) {
196
+ // we already have results from a deeper pocketTable
197
+ if ((currentResults === null || currentResults === void 0 ? void 0 : currentResults.length) > 0) {
198
+ result.push(...currentResults);
199
+ }
200
+ }
201
+ else if ((currentResults === null || currentResults === void 0 ? void 0 : currentResults.length) > 0) {
202
+ result = currentResults;
203
+ }
204
+ let depth = (_d = additionalOptions === null || additionalOptions === void 0 ? void 0 : additionalOptions.depth) !== null && _d !== void 0 ? _d : currentTable.getCurrentPocketTableDepth();
205
+ const augmentationResult = currentTable.augmentSymbolResultsWithPocketTableResults(name, bitFlags, result, Object.assign(Object.assign({}, additionalOptions), { depth: depth, maxStatementIndex: maxStatementIndex, precedingAssignmentIndex: precedingAssignmentIndex }));
206
+ result = augmentationResult.symbols;
207
+ const needCheckParent = (!augmentationResult.exhaustive && depth > 0);
208
+ if ((result === null || result === void 0 ? void 0 : result.length) > 0 && !needCheckParent) {
209
+ result = result.map(addAncestorInfo);
210
+ break;
211
+ }
212
+ if (additionalOptions === null || additionalOptions === void 0 ? void 0 : additionalOptions.ignoreParentsAndSiblings) {
213
+ break;
214
+ }
215
+ //look through any sibling maps next
216
+ for (let sibling of currentTable.siblings) {
217
+ result = sibling.getSymbol(key, bitFlags);
218
+ if ((result === null || result === void 0 ? void 0 : result.length) > 0) {
219
+ return result.map(addAncestorInfo);
220
+ }
221
+ }
222
+ previousTable = currentTable;
223
+ currentTable = currentTable.parent;
224
+ memberOfAncestor = true;
225
+ } while (currentTable);
226
+ return result;
227
+ }
228
+ augmentSymbolResultsWithPocketTableResults(name, bitFlags, result, additionalOptions = {}) {
229
+ var _a, _b;
230
+ let pocketTableResults = [];
231
+ let pocketTablesWeFoundSomethingIn = this.getSymbolDataFromPocketTables(name, bitFlags, additionalOptions);
232
+ let pocketTablesAreExhaustive = false;
233
+ const depth = (_a = additionalOptions.depth) !== null && _a !== void 0 ? _a : 0;
234
+ for (let i = 0; i < pocketTablesWeFoundSomethingIn.length; i++) {
235
+ let tableData = pocketTablesWeFoundSomethingIn[i];
236
+ let pocketTable = tableData.pocketTable;
237
+ pocketTableResults.push(...tableData.results);
238
+ if (pocketTable.willAlwaysBeExecuted) {
239
+ // remove all results before this
240
+ pocketTableResults = [...tableData.results];
241
+ pocketTablesAreExhaustive = true;
242
+ }
243
+ if (i === 0) {
244
+ continue;
245
+ }
246
+ if (((_b = pocketTable.table.complementsTables) === null || _b === void 0 ? void 0 : _b.size) > 0) {
247
+ let tableSatisfied = true;
248
+ let allPossibleSatisfiedResults = [];
249
+ // need to check if all tables this complements are satisfied
250
+ for (const otherTable of pocketTable.table.complementsTables) {
251
+ const foundTableData = pocketTablesWeFoundSomethingIn.find((ptd => {
252
+ return otherTable === ptd.pocketTable.table;
253
+ }));
254
+ if (foundTableData) {
255
+ allPossibleSatisfiedResults.push(...foundTableData.results);
256
+ }
257
+ else {
258
+ tableSatisfied = false;
259
+ break;
260
+ }
261
+ }
262
+ if (tableSatisfied) {
263
+ // remove all results before this
264
+ pocketTableResults = [...allPossibleSatisfiedResults, ...tableData.results];
265
+ pocketTablesAreExhaustive = true;
266
+ }
267
+ }
268
+ }
269
+ if (pocketTablesAreExhaustive) {
270
+ result = pocketTableResults;
271
+ }
272
+ else {
273
+ // we need to take into account the types before the pocket tables
274
+ if (!result) {
275
+ // there was no result before the pocket tables
276
+ if (pocketTableResults.length > 0) {
277
+ if (depth === 0) {
278
+ // we got pocket tables results, and this is the top recursion
279
+ // add uninitialized
280
+ result = [{ name: name, type: SymbolTable.uninitializedTypeFactory(), data: {}, flags: bitFlags }, ...pocketTableResults];
281
+ }
282
+ else {
283
+ //just return pocket table results:
284
+ result = pocketTableResults;
285
+ }
286
+ }
287
+ else {
288
+ // result should be undefined
289
+ }
290
+ }
291
+ else {
292
+ // just add any pocket table results....
293
+ result.push(...pocketTableResults);
294
+ }
295
+ }
296
+ // Do the results cover all possible execution paths?
297
+ const areResultsExhaustive = pocketTablesAreExhaustive || pocketTablesWeFoundSomethingIn.length === 0;
298
+ return { symbols: result, exhaustive: areResultsExhaustive };
299
+ }
300
+ getSymbolDataFromPocketTables(name, bitFlags, additionalOptions = {}) {
59
301
  var _a;
60
- const key = name.toLowerCase();
61
- let result = this.symbolMap.get(key);
62
- if (!result && searchParent) {
63
- result = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbol(key);
302
+ const possiblePocketTables = this.getPossiblePocketTables({ statementIndex: additionalOptions.maxStatementIndex }, additionalOptions.precedingAssignmentIndex);
303
+ const depth = (_a = additionalOptions.depth) !== null && _a !== void 0 ? _a : 0;
304
+ const pocketTablesWeFoundSomethingIn = new Array();
305
+ for (const pocketTable of possiblePocketTables) {
306
+ const pocketTableTypes = pocketTable.table.getSymbol(name, bitFlags, {
307
+ ignoreParentsAndSiblings: true,
308
+ maxStatementIndex: Number.MAX_SAFE_INTEGER,
309
+ depth: depth + 1
310
+ });
311
+ if ((pocketTableTypes === null || pocketTableTypes === void 0 ? void 0 : pocketTableTypes.length) > 0) {
312
+ if (pocketTable.table.isOrdered) {
313
+ const lastResult = pocketTableTypes[pocketTableTypes.length - 1];
314
+ pocketTablesWeFoundSomethingIn.push({ pocketTable: pocketTable, results: [lastResult] });
315
+ }
316
+ else {
317
+ pocketTablesWeFoundSomethingIn.push({ pocketTable: pocketTable, results: pocketTableTypes });
318
+ }
319
+ }
64
320
  }
65
- return result;
321
+ return pocketTablesWeFoundSomethingIn;
66
322
  }
67
323
  /**
68
324
  * Adds a new symbol to the table
69
- * @param name
70
- * @param type
71
325
  */
72
- addSymbol(name, range, type) {
73
- const key = name.toLowerCase();
326
+ addSymbol(name, data, type, bitFlags) {
327
+ var _a;
328
+ if (!name) {
329
+ return;
330
+ }
331
+ const key = name === null || name === void 0 ? void 0 : name.toLowerCase();
74
332
  if (!this.symbolMap.has(key)) {
75
333
  this.symbolMap.set(key, []);
76
334
  }
77
- this.symbolMap.get(key).push({
335
+ (_a = this.symbolMap.get(key)) === null || _a === void 0 ? void 0 : _a.push({
78
336
  name: name,
79
- range: range,
80
- type: type
337
+ data: data,
338
+ type: type,
339
+ flags: bitFlags
81
340
  });
82
341
  }
83
342
  /**
84
- * Gets the type for a symbol
85
- * @param name the name of the symbol to get the type for
86
- * @param searchParent should we look to our parent if we don't have the symbol?
87
- * @returns The type, if found. If the type has ever changed, return DynamicType. If not found, returns UninitializedType
343
+ * Removes a new symbol from the table
88
344
  */
89
- getSymbolType(name, searchParent = true) {
90
- var _a, _b;
345
+ removeSymbol(name) {
91
346
  const key = name.toLowerCase();
92
- const symbols = this.symbolMap.get(key);
93
- if ((symbols === null || symbols === void 0 ? void 0 : symbols.length) > 1) {
94
- //Check if each time it was set, it was set to the same type
95
- // TODO handle union types
96
- let sameImpliedType = true;
97
- let impliedType = symbols[0].type;
98
- for (const symbol of symbols) {
99
- sameImpliedType = (impliedType.equals(symbol.type));
100
- if (!sameImpliedType) {
101
- break;
347
+ if (!this.symbolMap.has(key)) {
348
+ this.symbolMap.set(key, []);
349
+ }
350
+ this.symbolMap.delete(key);
351
+ }
352
+ getSymbolTypes(name, options, sortByStatementIndex = false) {
353
+ const symbolArray = this.getSymbol(name, options.flags, {
354
+ ignoreParentsAndSiblings: options.ignoreParentTables,
355
+ maxStatementIndex: Number.isInteger(options.statementIndex) ? options.statementIndex : -1
356
+ });
357
+ if (!symbolArray) {
358
+ return undefined;
359
+ }
360
+ let symbols = symbolArray === null || symbolArray === void 0 ? void 0 : symbolArray.map(symbol => ({ type: symbol.type, data: symbol.data, flags: symbol.flags }));
361
+ if (sortByStatementIndex) {
362
+ this.sortSymbolsByAssignmentOrderInPlace(symbols);
363
+ }
364
+ return symbols;
365
+ }
366
+ getSymbolType(name, options) {
367
+ var _a, _b, _c;
368
+ const cacheEntry = options.ignoreCacheForRetrieval ? undefined : this.getCachedType(name, options);
369
+ let resolvedType = cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.type;
370
+ let doSetCache = !resolvedType;
371
+ const originalIsReferenceType = (0, reflection_1.isAnyReferenceType)(resolvedType);
372
+ let data = (cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.data) || {};
373
+ let foundFlags = cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.flags;
374
+ if (!resolvedType || originalIsReferenceType) {
375
+ let symbolTypes;
376
+ symbolTypes = this.getSymbolTypes(name, Object.assign(Object.assign({}, options), { statementIndex: options.statementIndex }));
377
+ data = (_a = symbolTypes === null || symbolTypes === void 0 ? void 0 : symbolTypes[0]) === null || _a === void 0 ? void 0 : _a.data;
378
+ foundFlags = (_b = symbolTypes === null || symbolTypes === void 0 ? void 0 : symbolTypes[0]) === null || _b === void 0 ? void 0 : _b.flags;
379
+ resolvedType = (0, helpers_1.getUniqueType)(symbolTypes === null || symbolTypes === void 0 ? void 0 : symbolTypes.map(symbol => symbol.type), SymbolTable.unionTypeFactory);
380
+ }
381
+ if (!resolvedType && options.fullName && options.tableProvider) {
382
+ resolvedType = SymbolTable.referenceTypeFactory(name, options.fullName, options.flags, options.tableProvider);
383
+ }
384
+ const resolvedTypeIsReference = (0, reflection_1.isAnyReferenceType)(resolvedType);
385
+ const newNonReferenceType = originalIsReferenceType && !(0, reflection_1.isAnyReferenceType)(resolvedType) && resolvedType;
386
+ doSetCache = doSetCache && (options.onlyCacheResolvedTypes ? !resolvedTypeIsReference : true);
387
+ if (doSetCache || newNonReferenceType) {
388
+ this.setCachedType(name, { type: resolvedType, data: data, flags: foundFlags }, options);
389
+ }
390
+ (_c = options.data) !== null && _c !== void 0 ? _c : (options.data = {});
391
+ if (options.data) {
392
+ options.data.definingNode = data === null || data === void 0 ? void 0 : data.definingNode;
393
+ options.data.description = data === null || data === void 0 ? void 0 : data.description;
394
+ options.data.flags = foundFlags !== null && foundFlags !== void 0 ? foundFlags : options.flags;
395
+ options.data.memberOfAncestor = data === null || data === void 0 ? void 0 : data.memberOfAncestor;
396
+ options.data.doNotMerge = data === null || data === void 0 ? void 0 : data.doNotMerge;
397
+ options.data.isAlias = data === null || data === void 0 ? void 0 : data.isAlias;
398
+ options.data.isInstance = data === null || data === void 0 ? void 0 : data.isInstance;
399
+ options.data.isFromDocComment = data === null || data === void 0 ? void 0 : data.isFromDocComment;
400
+ options.data.isBuiltIn = data === null || data === void 0 ? void 0 : data.isBuiltIn;
401
+ options.data.isFromCallFunc = data === null || data === void 0 ? void 0 : data.isFromCallFunc;
402
+ options.data.isFromTypeStatement = data === null || data === void 0 ? void 0 : data.isFromTypeStatement;
403
+ }
404
+ return resolvedType;
405
+ }
406
+ isSymbolTypeInstance(name) {
407
+ const data = {};
408
+ this.getSymbolType(name, { flags: 1 /* SymbolTypeFlag.runtime */, data: data });
409
+ return data === null || data === void 0 ? void 0 : data.isInstance;
410
+ }
411
+ /**
412
+ * Adds all the symbols from another table to this one.
413
+ * Source symbols are shared by reference (not cloned) since BscSymbol is treated as immutable.
414
+ * The destination still owns its own array per key, so subsequent addSymbol calls on either
415
+ * table do not leak across.
416
+ */
417
+ mergeSymbolTable(symbolTable) {
418
+ for (const [key, sourceSymbols] of symbolTable.symbolMap) {
419
+ //skip symbols flagged `doNotMerge` (e.g. typecast/alias bindings) so they stay
420
+ //local to their declaring block instead of bleeding into sibling tables that
421
+ //share the same merge target (e.g. the per-namespace aggregate symbol table).
422
+ const symbolsToMerge = sourceSymbols.filter(symbol => { var _a; return !((_a = symbol.data) === null || _a === void 0 ? void 0 : _a.doNotMerge); });
423
+ if (symbolsToMerge.length === 0) {
424
+ continue;
425
+ }
426
+ let destSymbols = this.symbolMap.get(key);
427
+ if (!destSymbols) {
428
+ destSymbols = [];
429
+ this.symbolMap.set(key, destSymbols);
430
+ }
431
+ destSymbols.push(...symbolsToMerge);
432
+ }
433
+ for (let pocketTable of symbolTable.pocketTables) {
434
+ this.mergeSymbolTable(pocketTable.table);
435
+ }
436
+ }
437
+ mergeNamespaceSymbolTables(symbolTable) {
438
+ var _a;
439
+ const disposables = [];
440
+ for (let [_name, value] of symbolTable.symbolMap) {
441
+ const symbol = value[0];
442
+ if (symbol) {
443
+ if ((_a = symbol.data) === null || _a === void 0 ? void 0 : _a.doNotMerge) {
444
+ continue;
445
+ }
446
+ const existingRuntimeType = this.getSymbolType(symbol.name, { flags: symbol.flags });
447
+ if ((0, reflection_1.isNamespaceType)(existingRuntimeType) && (0, reflection_1.isNamespaceType)(symbol.type)) {
448
+ disposables.push(...existingRuntimeType.memberTable.mergeNamespaceSymbolTables(symbol.type.memberTable));
449
+ }
450
+ else {
451
+ this.addSymbol(symbol.name, symbol.data, symbol.type, symbol.flags);
452
+ disposables.push(() => this.removeSymbol(symbol.name));
102
453
  }
103
454
  }
104
- return sameImpliedType ? impliedType : new DynamicType_1.DynamicType();
105
455
  }
106
- else if ((symbols === null || symbols === void 0 ? void 0 : symbols.length) === 1) {
107
- return symbols[0].type;
456
+ for (let siblingTable of symbolTable.siblings) {
457
+ disposables.push(...this.mergeNamespaceSymbolTables(siblingTable));
458
+ }
459
+ return disposables;
460
+ }
461
+ /**
462
+ * Get list of symbols declared directly in this SymbolTable (excludes parent SymbolTable).
463
+ */
464
+ getOwnSymbols(bitFlags) {
465
+ let symbols = [].concat(...this.symbolMap.values());
466
+ // eslint-disable-next-line no-bitwise
467
+ symbols = symbols.filter(symbol => symbol.flags & bitFlags);
468
+ return symbols;
469
+ }
470
+ hasCircularReferenceWithAncestor() {
471
+ if (this.cachedCircularReferenceCheck === false || this.cachedCircularReferenceCheck === true) {
472
+ return this.cachedCircularReferenceCheck;
108
473
  }
109
- if (searchParent) {
110
- return (_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.getSymbolType(name)) !== null && _b !== void 0 ? _b : new UninitializedType_1.UninitializedType();
474
+ let foundCircReference = false;
475
+ let p = this.parent;
476
+ while (!foundCircReference && p) {
477
+ foundCircReference = p === this;
478
+ p = p.parent;
479
+ }
480
+ this.cachedCircularReferenceCheck = foundCircReference;
481
+ return foundCircReference;
482
+ }
483
+ /**
484
+ * Get list of all symbols declared in this SymbolTable (includes parent SymbolTable).
485
+ */
486
+ getAllSymbols(bitFlags) {
487
+ let symbols = [].concat(...this.symbolMap.values());
488
+ //look through any sibling maps next
489
+ for (let sibling of this.siblings) {
490
+ symbols = symbols.concat(sibling.getAllSymbols(bitFlags));
491
+ }
492
+ if (this.parent && !this.hasCircularReferenceWithAncestor()) {
493
+ symbols = symbols.concat(this.parent.getAllSymbols(bitFlags));
494
+ }
495
+ // eslint-disable-next-line no-bitwise
496
+ symbols = symbols.filter(symbol => symbol.flags & bitFlags);
497
+ //remove duplicate symbols
498
+ const symbolsMap = new Map();
499
+ for (const symbol of symbols) {
500
+ const lowerSymbolName = symbol.name.toLowerCase();
501
+ if (!symbolsMap.has(lowerSymbolName)) {
502
+ symbolsMap.set(lowerSymbolName, symbol);
503
+ }
504
+ }
505
+ return [...symbolsMap.values()];
506
+ }
507
+ resetTypeCache() {
508
+ var _a;
509
+ this.typeCache = [
510
+ undefined,
511
+ new Map(),
512
+ new Map(),
513
+ new Map() // SymbolTypeFlags.runtime & SymbolTypeFlags.typetime
514
+ ];
515
+ this.cacheToken = (_a = SymbolTable.cacheVerifier) === null || _a === void 0 ? void 0 : _a.getToken();
516
+ }
517
+ getCachedType(name, options) {
518
+ var _a, _b;
519
+ if (SymbolTable.cacheVerifier) {
520
+ if (!((_a = SymbolTable.cacheVerifier) === null || _a === void 0 ? void 0 : _a.checkToken(this.cacheToken))) {
521
+ // we have a bad token
522
+ this.resetTypeCache();
523
+ return;
524
+ }
111
525
  }
112
526
  else {
113
- return new UninitializedType_1.UninitializedType();
527
+ // no cache verifier
528
+ return;
114
529
  }
530
+ const cacheKey = this.getCacheKey(name, options);
531
+ return (_b = this.typeCache[options.flags]) === null || _b === void 0 ? void 0 : _b.get(cacheKey);
532
+ }
533
+ setCachedType(name, cacheEntry, options) {
534
+ var _a, _b, _c;
535
+ if (!cacheEntry || !cacheEntry.type) {
536
+ return;
537
+ }
538
+ if (SymbolTable.cacheVerifier) {
539
+ if (!((_a = SymbolTable.cacheVerifier) === null || _a === void 0 ? void 0 : _a.checkToken(this.cacheToken))) {
540
+ // we have a bad token - remove all other caches
541
+ this.resetTypeCache();
542
+ }
543
+ }
544
+ else {
545
+ // no cache verifier
546
+ return;
547
+ }
548
+ const cacheKey = this.getCacheKey(name, options);
549
+ let existingCachedValue = (_b = this.typeCache[options.flags]) === null || _b === void 0 ? void 0 : _b.get(cacheKey);
550
+ if ((0, reflection_1.isReferenceType)(cacheEntry.type) && !(0, reflection_1.isReferenceType)(existingCachedValue)) {
551
+ // No need to overwrite a non-referenceType with a referenceType
552
+ return;
553
+ }
554
+ return (_c = this.typeCache[options.flags]) === null || _c === void 0 ? void 0 : _c.set(cacheKey, cacheEntry);
555
+ }
556
+ getCacheKey(name, options) {
557
+ var _a;
558
+ return this.isOrdered ? `${name.toLowerCase()}@${(_a = options.statementIndex) !== null && _a !== void 0 ? _a : '*'}` : `${name.toLowerCase()}`;
115
559
  }
116
560
  /**
117
- * Adds all the symbols from another table to this one
118
- * It will overwrite any existing symbols in this table
119
- * @param symbolTable
561
+ * Serialize this SymbolTable to JSON (useful for debugging reasons)
120
562
  */
121
- mergeSymbolTable(symbolTable) {
122
- for (let [, value] of symbolTable.symbolMap) {
123
- for (const symbol of value) {
124
- this.addSymbol(symbol.name, symbol.range, symbol.type);
563
+ toJSON() {
564
+ var _a;
565
+ return {
566
+ name: this.name,
567
+ siblings: [...this.siblings].map(sibling => sibling.toJSON()),
568
+ parent: (_a = this.parent) === null || _a === void 0 ? void 0 : _a.toJSON(),
569
+ symbols: [
570
+ ...new Set([...this.symbolMap.entries()].map(([key, symbols]) => {
571
+ return symbols.map(x => {
572
+ var _a;
573
+ return { name: x.name, type: (_a = x.type) === null || _a === void 0 ? void 0 : _a.__identifier };
574
+ });
575
+ }).flat().sort())
576
+ ]
577
+ };
578
+ }
579
+ sortSymbolsByAssignmentOrderInPlace(symbols) {
580
+ symbols.sort((a, b) => {
581
+ var _a, _b, _c, _d;
582
+ if (!Number.isInteger((_b = (_a = a.data) === null || _a === void 0 ? void 0 : _a.definingNode) === null || _b === void 0 ? void 0 : _b.statementIndex)) {
583
+ return -1;
584
+ }
585
+ if (!Number.isInteger((_d = (_c = b.data) === null || _c === void 0 ? void 0 : _c.definingNode) === null || _d === void 0 ? void 0 : _d.statementIndex)) {
586
+ return 1;
587
+ }
588
+ if (b.data.definingNode.statementIndex > a.data.definingNode.statementIndex) {
589
+ return -1;
125
590
  }
591
+ if (b.data.definingNode.statementIndex < a.data.definingNode.statementIndex) {
592
+ return 1;
593
+ }
594
+ return -1;
595
+ });
596
+ return symbols;
597
+ }
598
+ getPossiblePocketTables(options, precedingAssignmentIndex = -1) {
599
+ if (!this.isOrdered) {
600
+ return this.pocketTables;
126
601
  }
602
+ const pocketTablesBetweenAssignmentAndPosition = this.pocketTables.filter(pt => {
603
+ const isBeforePosition = options.statementIndex === 'end' ? true : options.statementIndex > pt.index;
604
+ let isAfterPrecedingAssignment = true;
605
+ if (Number.isInteger(precedingAssignmentIndex)) {
606
+ isAfterPrecedingAssignment = precedingAssignmentIndex < pt.index;
607
+ }
608
+ return isAfterPrecedingAssignment && isBeforePosition;
609
+ });
610
+ return pocketTablesBetweenAssignmentAndPosition;
611
+ }
612
+ getSymbolLookupFilter(currentTable, maxAllowedStatementIndex, memberOfAncestor) {
613
+ return (t) => {
614
+ var _a;
615
+ if (!currentTable.isOrdered) {
616
+ // order doesn't matter for current table
617
+ return true;
618
+ }
619
+ if (maxAllowedStatementIndex >= 0 && ((_a = t.data) === null || _a === void 0 ? void 0 : _a.definingNode)) {
620
+ if (memberOfAncestor) {
621
+ // if we've already gone up a level, it's possible to have a variable assigned and used
622
+ // in the same statement, eg. for loop
623
+ return t.data.definingNode.statementIndex <= maxAllowedStatementIndex;
624
+ }
625
+ else {
626
+ return t.data.definingNode.statementIndex < maxAllowedStatementIndex;
627
+ }
628
+ }
629
+ return true;
630
+ };
127
631
  }
128
632
  }
129
633
  exports.SymbolTable = SymbolTable;
634
+ /**
635
+ * Used to invalidate the cache for all symbol tables.
636
+ *
637
+ * This is not the most optimized solution as cache will be shared across all instances of SymbolTable across all programs,
638
+ * but this is the easiest way to handle nested/linked symbol table cache management so we can optimize this in the future some time...
639
+ */
640
+ SymbolTable.cacheVerifier = new CacheVerifier_1.CacheVerifier();
130
641
  //# sourceMappingURL=SymbolTable.js.map