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
@@ -0,0 +1,714 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrsFileValidator = void 0;
4
+ const reflection_1 = require("../../astUtils/reflection");
5
+ const visitors_1 = require("../../astUtils/visitors");
6
+ const DiagnosticMessages_1 = require("../../DiagnosticMessages");
7
+ const TokenKind_1 = require("../../lexer/TokenKind");
8
+ const Expression_1 = require("../../parser/Expression");
9
+ const Parser_1 = require("../../parser/Parser");
10
+ const AssociativeArrayType_1 = require("../../types/AssociativeArrayType");
11
+ const DynamicType_1 = require("../../types/DynamicType");
12
+ const util_1 = require("../../util");
13
+ const BrightScriptDocParser_1 = require("../../parser/BrightScriptDocParser");
14
+ const TypeStatementType_1 = require("../../types/TypeStatementType");
15
+ const semver = require("semver");
16
+ class BrsFileValidator {
17
+ constructor(event) {
18
+ this.event = event;
19
+ }
20
+ process() {
21
+ const unlinkGlobalSymbolTable = this.event.file.parser.symbolTable.pushParentProvider(() => this.event.program.globalScope.symbolTable);
22
+ util_1.default.validateTooDeepFile(this.event.file);
23
+ // Invalidate cache on this file
24
+ // It could have potentially changed before this from plugins, after this, it will not change
25
+ // eslint-disable-next-line @typescript-eslint/dot-notation
26
+ this.event.file['_cachedLookups'].invalidate();
27
+ // make a copy of the bsConsts, because they might be added to
28
+ const bsConstsBackup = new Map(this.event.file.ast.getBsConsts());
29
+ this.walk();
30
+ this.flagTopLevelStatements();
31
+ //only validate the file if it was actually parsed (skip files containing typedefs)
32
+ if (!this.event.file.hasTypedef) {
33
+ this.validateTopOfFileStatements();
34
+ this.validateTypecastStatements();
35
+ }
36
+ this.event.file.ast.bsConsts = bsConstsBackup;
37
+ unlinkGlobalSymbolTable();
38
+ }
39
+ /**
40
+ * Walk the full AST
41
+ */
42
+ walk() {
43
+ const isBrighterscript = this.event.file.parser.options.mode === Parser_1.ParseMode.BrighterScript;
44
+ const visitor = (0, visitors_1.createVisitor)({
45
+ MethodStatement: (node) => {
46
+ //add the `super` symbol to class methods
47
+ if ((0, reflection_1.isClassStatement)(node.parent) && node.parent.hasParentClass()) {
48
+ const data = {};
49
+ const parentClassType = node.parent.parentClassName.getType({ flags: 2 /* SymbolTypeFlag.typetime */, data: data });
50
+ node.func.body.getSymbolTable().addSymbol('super', Object.assign(Object.assign({}, data), { isInstance: true }), parentClassType, 1 /* SymbolTypeFlag.runtime */);
51
+ }
52
+ },
53
+ CallfuncExpression: (node) => {
54
+ if (node.args.length > 5) {
55
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.callfuncHasToManyArgs(node.args.length)), { location: node.tokens.methodName.location }));
56
+ }
57
+ },
58
+ DottedGetExpression: (node) => {
59
+ var _a, _b, _c;
60
+ if (((_a = node.tokens.dot) === null || _a === void 0 ? void 0 : _a.kind) === TokenKind_1.TokenKind.QuestionDot) {
61
+ this.validateMinFirmwareVersionForOptionalChaining((_c = (_b = node.tokens.dot) === null || _b === void 0 ? void 0 : _b.location) === null || _c === void 0 ? void 0 : _c.range);
62
+ }
63
+ },
64
+ IndexedGetExpression: (node) => {
65
+ var _a, _b, _c, _d, _e, _f;
66
+ if (node.tokens.questionDot || ((_a = node.tokens.openingSquare) === null || _a === void 0 ? void 0 : _a.kind) === TokenKind_1.TokenKind.QuestionLeftSquare) {
67
+ const range = (_d = (_c = (_b = node.tokens.questionDot) === null || _b === void 0 ? void 0 : _b.location) === null || _c === void 0 ? void 0 : _c.range) !== null && _d !== void 0 ? _d : (_f = (_e = node.tokens.openingSquare) === null || _e === void 0 ? void 0 : _e.location) === null || _f === void 0 ? void 0 : _f.range;
68
+ this.validateMinFirmwareVersionForOptionalChaining(range);
69
+ }
70
+ },
71
+ CallExpression: (node) => {
72
+ var _a, _b, _c;
73
+ if (((_a = node.tokens.openingParen) === null || _a === void 0 ? void 0 : _a.kind) === TokenKind_1.TokenKind.QuestionLeftParen) {
74
+ this.validateMinFirmwareVersionForOptionalChaining((_c = (_b = node.tokens.openingParen) === null || _b === void 0 ? void 0 : _b.location) === null || _c === void 0 ? void 0 : _c.range);
75
+ }
76
+ },
77
+ EnumStatement: (node) => {
78
+ var _a;
79
+ this.validateDeclarationLocations(node, 'enum', () => util_1.default.createBoundingRange(node.tokens.enum, node.tokens.name));
80
+ this.validateEnumDeclaration(node);
81
+ if (!node.tokens.name) {
82
+ return;
83
+ }
84
+ //register this enum declaration
85
+ const nodeType = node.getType({ flags: 2 /* SymbolTypeFlag.typetime */ });
86
+ // eslint-disable-next-line no-bitwise
87
+ (_a = node.parent.getSymbolTable()) === null || _a === void 0 ? void 0 : _a.addSymbol(node.tokens.name.text, { definingNode: node }, nodeType, 2 /* SymbolTypeFlag.typetime */ | 1 /* SymbolTypeFlag.runtime */);
88
+ },
89
+ ClassStatement: (node) => {
90
+ var _a, _b, _c;
91
+ if (!((_a = node === null || node === void 0 ? void 0 : node.tokens) === null || _a === void 0 ? void 0 : _a.name)) {
92
+ return;
93
+ }
94
+ this.validateDeclarationLocations(node, 'class', () => util_1.default.createBoundingRange(node.tokens.class, node.tokens.name));
95
+ //register this class
96
+ const nodeType = node.getType({ flags: 2 /* SymbolTypeFlag.typetime */ });
97
+ node.getSymbolTable().addSymbol('m', { definingNode: node, isInstance: true }, nodeType, 1 /* SymbolTypeFlag.runtime */);
98
+ // eslint-disable-next-line no-bitwise
99
+ (_b = node.parent.getSymbolTable()) === null || _b === void 0 ? void 0 : _b.addSymbol((_c = node.tokens.name) === null || _c === void 0 ? void 0 : _c.text, { definingNode: node }, nodeType, 2 /* SymbolTypeFlag.typetime */ | 1 /* SymbolTypeFlag.runtime */);
100
+ if (node.findAncestor(reflection_1.isNamespaceStatement)) {
101
+ //add the transpiled name for namespaced constructors to the root symbol table
102
+ const transpiledClassConstructor = node.getName(Parser_1.ParseMode.BrightScript);
103
+ this.event.file.parser.ast.symbolTable.addSymbol(transpiledClassConstructor, { definingNode: node }, node.getConstructorType(),
104
+ // eslint-disable-next-line no-bitwise
105
+ 1 /* SymbolTypeFlag.runtime */ | 32 /* SymbolTypeFlag.postTranspile */);
106
+ }
107
+ },
108
+ AssignmentStatement: (node) => {
109
+ var _a, _b;
110
+ if (!((_a = node === null || node === void 0 ? void 0 : node.tokens) === null || _a === void 0 ? void 0 : _a.name)) {
111
+ return;
112
+ }
113
+ if ((0, reflection_1.isForStatement)(node.parent) && node.parent.counterDeclaration === node) {
114
+ // for loop variable variable is added to the block symbol table elsewhere
115
+ return;
116
+ }
117
+ const data = {};
118
+ //register this variable
119
+ let nodeType = node.getType({ flags: 1 /* SymbolTypeFlag.runtime */, data: data });
120
+ if ((0, reflection_1.isInvalidType)(nodeType) || (0, reflection_1.isVoidType)(nodeType)) {
121
+ nodeType = DynamicType_1.DynamicType.instance;
122
+ }
123
+ (_b = node.parent.getSymbolTable()) === null || _b === void 0 ? void 0 : _b.addSymbol(node.tokens.name.text, { definingNode: node, isInstance: true, isFromDocComment: data.isFromDocComment, isFromCallFunc: data.isFromCallFunc }, nodeType, 1 /* SymbolTypeFlag.runtime */);
124
+ },
125
+ DottedSetStatement: (node) => {
126
+ this.validateNoOptionalChainingInVarSet(node, [node.obj]);
127
+ },
128
+ IndexedSetStatement: (node) => {
129
+ this.validateNoOptionalChainingInVarSet(node, [node.obj]);
130
+ },
131
+ ForEachStatement: (node) => {
132
+ //registering the for loop variable happens in the visitor for Block, since the loop variable is scoped to the loop body
133
+ },
134
+ NamespaceStatement: (node) => {
135
+ if (!(node === null || node === void 0 ? void 0 : node.nameExpression)) {
136
+ return;
137
+ }
138
+ this.validateDeclarationLocations(node, 'namespace', () => util_1.default.createBoundingRange(node.tokens.namespace, node.nameExpression));
139
+ //Namespace Types are added at the Scope level - This is handled when the SymbolTables get linked
140
+ },
141
+ FunctionStatement: (node) => {
142
+ var _a, _b, _c;
143
+ this.validateDeclarationLocations(node, 'function', () => util_1.default.createBoundingRange(node.func.tokens.functionType, node.tokens.name));
144
+ const funcType = node.getType({ flags: 2 /* SymbolTypeFlag.typetime */ });
145
+ if ((_a = node.tokens.name) === null || _a === void 0 ? void 0 : _a.text) {
146
+ node.parent.getSymbolTable().addSymbol(node.tokens.name.text, { definingNode: node }, funcType, 1 /* SymbolTypeFlag.runtime */);
147
+ }
148
+ const namespace = node.findAncestor(reflection_1.isNamespaceStatement);
149
+ //this function is declared inside a namespace
150
+ if (namespace) {
151
+ namespace.getSymbolTable().addSymbol((_b = node.tokens.name) === null || _b === void 0 ? void 0 : _b.text, { definingNode: node }, funcType, 1 /* SymbolTypeFlag.runtime */);
152
+ if (!((_c = node.tokens) === null || _c === void 0 ? void 0 : _c.name)) {
153
+ return;
154
+ }
155
+ //add the transpiled name for namespaced functions to the root symbol table
156
+ const transpiledNamespaceFunctionName = node.getName(Parser_1.ParseMode.BrightScript);
157
+ this.event.file.parser.ast.symbolTable.addSymbol(transpiledNamespaceFunctionName, { definingNode: node }, funcType,
158
+ // eslint-disable-next-line no-bitwise
159
+ 1 /* SymbolTypeFlag.runtime */ | 32 /* SymbolTypeFlag.postTranspile */);
160
+ }
161
+ },
162
+ FunctionExpression: (node) => {
163
+ var _a, _b;
164
+ const funcSymbolTable = node.getSymbolTable();
165
+ const isInlineFunc = !((0, reflection_1.isFunctionStatement)(node.parent) || (0, reflection_1.isMethodStatement)(node.parent));
166
+ if (isInlineFunc) {
167
+ // symbol table should not include any symbols from parent func
168
+ funcSymbolTable.pushParentProvider(() => node.findAncestor(reflection_1.isBody).getSymbolTable());
169
+ }
170
+ if (!(funcSymbolTable === null || funcSymbolTable === void 0 ? void 0 : funcSymbolTable.hasSymbol('m', 1 /* SymbolTypeFlag.runtime */)) || isInlineFunc) {
171
+ if (!(0, reflection_1.isTypecastStatement)((_b = (_a = node.body) === null || _a === void 0 ? void 0 : _a.statements) === null || _b === void 0 ? void 0 : _b[0])) {
172
+ // if this is an inline function, or if the function body does not start with a typecast statement, add the `m` symbol to the function scope. If the function body starts with a typecast statement, the `m` symbol will be added in the visitor for TypecastStatement, and it will be typed as the type from the typecast statement
173
+ funcSymbolTable === null || funcSymbolTable === void 0 ? void 0 : funcSymbolTable.addSymbol('m', { isInstance: true }, new AssociativeArrayType_1.AssociativeArrayType(), 1 /* SymbolTypeFlag.runtime */);
174
+ }
175
+ }
176
+ this.validateFunctionParameterCount(node);
177
+ },
178
+ FunctionParameterExpression: (node) => {
179
+ var _a, _b, _c;
180
+ if ((0, reflection_1.isTypedFunctionTypeExpression)(node.parent)) {
181
+ return;
182
+ }
183
+ const paramName = (_b = (_a = node.tokens) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.text;
184
+ if (!paramName) {
185
+ return;
186
+ }
187
+ const data = {};
188
+ const nodeType = node.getType({ flags: 2 /* SymbolTypeFlag.typetime */, data: data });
189
+ // add param symbol at expression level, so it can be used as default value in other params
190
+ const funcExpr = node.findAncestor(reflection_1.isFunctionExpression);
191
+ const funcSymbolTable = funcExpr === null || funcExpr === void 0 ? void 0 : funcExpr.getSymbolTable();
192
+ const extraSymbolData = {
193
+ definingNode: node,
194
+ isInstance: true,
195
+ isFromDocComment: data.isFromDocComment,
196
+ description: data.description
197
+ };
198
+ funcSymbolTable === null || funcSymbolTable === void 0 ? void 0 : funcSymbolTable.addSymbol(paramName, extraSymbolData, nodeType, 1 /* SymbolTypeFlag.runtime */);
199
+ //also add param symbol at block level, as it may be redefined, and if so, should show a union
200
+ (_c = funcExpr.body.getSymbolTable()) === null || _c === void 0 ? void 0 : _c.addSymbol(paramName, extraSymbolData, nodeType, 1 /* SymbolTypeFlag.runtime */);
201
+ },
202
+ InterfaceStatement: (node) => {
203
+ if (!node.tokens.name) {
204
+ return;
205
+ }
206
+ this.validateDeclarationLocations(node, 'interface', () => util_1.default.createBoundingRange(node.tokens.interface, node.tokens.name));
207
+ const nodeType = node.getType({ flags: 2 /* SymbolTypeFlag.typetime */ });
208
+ // eslint-disable-next-line no-bitwise
209
+ node.parent.getSymbolTable().addSymbol(node.tokens.name.text, { definingNode: node }, nodeType, 2 /* SymbolTypeFlag.typetime */);
210
+ },
211
+ ConstStatement: (node) => {
212
+ if (!node.tokens.name) {
213
+ return;
214
+ }
215
+ this.validateDeclarationLocations(node, 'const', () => util_1.default.createBoundingRange(node.tokens.const, node.tokens.name));
216
+ const nodeType = node.getType({ flags: 1 /* SymbolTypeFlag.runtime */ });
217
+ node.parent.getSymbolTable().addSymbol(node.tokens.name.text, { definingNode: node, isInstance: true }, nodeType, 1 /* SymbolTypeFlag.runtime */);
218
+ },
219
+ CatchStatement: (node) => {
220
+ var _a, _b, _c;
221
+ //brs and bs both support variableExpression for the exception variable
222
+ if ((0, reflection_1.isVariableExpression)(node.exceptionVariableExpression)) {
223
+ node.parent.getSymbolTable().addSymbol(node.exceptionVariableExpression.getName(), { definingNode: node, isInstance: true },
224
+ //TODO I think we can produce a slightly more specific type here (like an AA but with the known exception properties)
225
+ DynamicType_1.DynamicType.instance, 1 /* SymbolTypeFlag.runtime */);
226
+ //brighterscript allows catch without an exception variable
227
+ }
228
+ else if (isBrighterscript && !node.exceptionVariableExpression) {
229
+ //this is fine
230
+ //brighterscript allows a typecast expression here
231
+ }
232
+ else if (isBrighterscript && (0, reflection_1.isTypecastExpression)(node.exceptionVariableExpression) && (0, reflection_1.isVariableExpression)(node.exceptionVariableExpression.obj)) {
233
+ node.parent.getSymbolTable().addSymbol(node.exceptionVariableExpression.obj.getName(), { definingNode: node, isInstance: true }, node.exceptionVariableExpression.getType({ flags: 1 /* SymbolTypeFlag.runtime */ }), 1 /* SymbolTypeFlag.runtime */);
234
+ //no other expressions are allowed here
235
+ }
236
+ else {
237
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.expectedExceptionVarToFollowCatch()), { location: (_b = (_a = node.exceptionVariableExpression) === null || _a === void 0 ? void 0 : _a.location) !== null && _b !== void 0 ? _b : (_c = node.tokens.catch) === null || _c === void 0 ? void 0 : _c.location }));
238
+ }
239
+ },
240
+ DimStatement: (node) => {
241
+ if (node.tokens.name) {
242
+ node.parent.getSymbolTable().addSymbol(node.tokens.name.text, { definingNode: node, isInstance: true }, node.getType({ flags: 1 /* SymbolTypeFlag.runtime */ }), 1 /* SymbolTypeFlag.runtime */);
243
+ }
244
+ },
245
+ ReturnStatement: (node) => {
246
+ var _a, _b, _c, _d, _e;
247
+ const func = node.findAncestor(reflection_1.isFunctionExpression);
248
+ //these situations cannot have a value next to `return`
249
+ if (
250
+ //`function as void`, `sub as void`
251
+ ((0, reflection_1.isVariableExpression)((_a = func === null || func === void 0 ? void 0 : func.returnTypeExpression) === null || _a === void 0 ? void 0 : _a.expression) && ((_b = func.returnTypeExpression.expression.tokens.name.text) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'void') ||
252
+ //`sub` <without return value>
253
+ (((_c = func.tokens.functionType) === null || _c === void 0 ? void 0 : _c.kind) === TokenKind_1.TokenKind.Sub && !func.returnTypeExpression)) {
254
+ //there may not be a return value
255
+ if (node.value) {
256
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.voidFunctionMayNotReturnValue((_d = func.tokens.functionType) === null || _d === void 0 ? void 0 : _d.text)), { location: node.location }));
257
+ }
258
+ }
259
+ else {
260
+ //there MUST be a return value
261
+ if (!node.value) {
262
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.nonVoidFunctionMustReturnValue((_e = func === null || func === void 0 ? void 0 : func.tokens.functionType) === null || _e === void 0 ? void 0 : _e.text)), { location: node.location }));
263
+ }
264
+ }
265
+ },
266
+ ContinueStatement: (node) => {
267
+ this.validateContinueStatement(node);
268
+ },
269
+ TypecastStatement: (node) => {
270
+ const obj = node.typecastExpression.obj;
271
+ if ((0, reflection_1.isVariableExpression)(obj)) {
272
+ node.parent.getSymbolTable().addSymbol(obj.tokens.name.text, { definingNode: node, doNotMerge: true, isInstance: true }, node.getType({ flags: 2 /* SymbolTypeFlag.typetime */ }), 1 /* SymbolTypeFlag.runtime */);
273
+ }
274
+ },
275
+ ConditionalCompileConstStatement: (node) => {
276
+ var _a;
277
+ const assign = node.assignment;
278
+ const constNameLower = (_a = assign.tokens.name) === null || _a === void 0 ? void 0 : _a.text.toLowerCase();
279
+ const astBsConsts = this.event.file.ast.bsConsts;
280
+ if ((0, reflection_1.isLiteralExpression)(assign.value)) {
281
+ astBsConsts.set(constNameLower, assign.value.tokens.value.text.toLowerCase() === 'true');
282
+ }
283
+ else if ((0, reflection_1.isVariableExpression)(assign.value)) {
284
+ if (this.validateConditionalCompileConst(assign.value.tokens.name)) {
285
+ astBsConsts.set(constNameLower, astBsConsts.get(assign.value.tokens.name.text.toLowerCase()));
286
+ }
287
+ }
288
+ },
289
+ ConditionalCompileStatement: (node) => {
290
+ this.validateConditionalCompileConst(node.tokens.condition);
291
+ },
292
+ ConditionalCompileErrorStatement: (node) => {
293
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.hashError(node.tokens.message.text)), { location: node.location }));
294
+ },
295
+ AliasStatement: (node) => {
296
+ // eslint-disable-next-line no-bitwise
297
+ const targetType = node.value.getType({ flags: 2 /* SymbolTypeFlag.typetime */ | 1 /* SymbolTypeFlag.runtime */ });
298
+ // eslint-disable-next-line no-bitwise
299
+ node.parent.getSymbolTable().addSymbol(node.tokens.name.text, { definingNode: node, doNotMerge: true, isAlias: true }, targetType, 1 /* SymbolTypeFlag.runtime */ | 2 /* SymbolTypeFlag.typetime */);
300
+ },
301
+ TypeStatement: (node) => {
302
+ this.validateDeclarationLocations(node, 'type', () => util_1.default.createBoundingRange(node.tokens.type, node.tokens.name));
303
+ const wrappedNodeType = node.getType({ flags: 1 /* SymbolTypeFlag.runtime */ });
304
+ const typeStmtType = new TypeStatementType_1.TypeStatementType(node.tokens.name.text, wrappedNodeType);
305
+ node.parent.getSymbolTable().addSymbol(node.tokens.name.text, { definingNode: node, isFromTypeStatement: true }, typeStmtType, 2 /* SymbolTypeFlag.typetime */);
306
+ },
307
+ IfStatement: (node) => {
308
+ this.setUpComplementSymbolTables(node, reflection_1.isIfStatement);
309
+ },
310
+ Block: (node) => {
311
+ var _a, _b, _c;
312
+ const blockSymbolTable = node.symbolTable;
313
+ if (node.findAncestor(reflection_1.isFunctionExpression)) {
314
+ // this block is in a function. order matters!
315
+ blockSymbolTable.isOrdered = true;
316
+ }
317
+ if (!(0, reflection_1.isFunctionExpression)(node.parent) && node.parent) {
318
+ node.symbolTable.name = `Block-${node.parent.kind}@${(_c = (_b = (_a = node.location) === null || _a === void 0 ? void 0 : _a.range) === null || _b === void 0 ? void 0 : _b.start) === null || _c === void 0 ? void 0 : _c.line}`;
319
+ // we're a block inside another block (or body). This block is a pocket in the bigger block
320
+ node.parent.getSymbolTable().addPocketTable({
321
+ index: node.parent.statementIndex,
322
+ table: blockSymbolTable,
323
+ // code always flows through ConditionalCompiles, because we walk according to defined BSConsts
324
+ willAlwaysBeExecuted: (0, reflection_1.isConditionalCompileStatement)(node.parent)
325
+ });
326
+ if ((0, reflection_1.isForStatement)(node.parent)) {
327
+ const counterDecl = node.parent.counterDeclaration;
328
+ const loopVar = counterDecl.tokens.name;
329
+ const loopVarType = counterDecl.getType({ flags: 1 /* SymbolTypeFlag.runtime */ });
330
+ blockSymbolTable.addSymbol(loopVar.text, { isInstance: true }, loopVarType, 1 /* SymbolTypeFlag.runtime */);
331
+ }
332
+ else if ((0, reflection_1.isForEachStatement)(node.parent)) {
333
+ const loopVarType = node.parent.getLoopVariableType({ flags: 1 /* SymbolTypeFlag.runtime */ });
334
+ blockSymbolTable.addSymbol(node.parent.tokens.item.text, { isInstance: true }, loopVarType, 1 /* SymbolTypeFlag.runtime */);
335
+ }
336
+ }
337
+ },
338
+ VariableExpression: (node) => {
339
+ var _a;
340
+ //flag reserved unreferencable builtins (e.g. `ObjFun`, `type`) used in non-call position.
341
+ //these compile cleanly as values today but are device compile errors
342
+ //(`Syntax Error. Builtin function call expected`).
343
+ const name = (_a = node.tokens.name) === null || _a === void 0 ? void 0 : _a.text;
344
+ if (name &&
345
+ TokenKind_1.UnreferencableBuiltins.has(name.toLowerCase()) &&
346
+ //only valid use is as the callee of a CallExpression
347
+ !((0, reflection_1.isCallExpression)(node.parent) && node.parent.callee === node)) {
348
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.reservedBuiltinUsedAsValue(name)), { location: node.tokens.name.location }));
349
+ }
350
+ },
351
+ AstNode: (node) => {
352
+ //check for doc comments
353
+ if (!node.leadingTrivia || node.leadingTrivia.length === 0) {
354
+ return;
355
+ }
356
+ const doc = BrightScriptDocParser_1.default.parseNode(node);
357
+ if (doc.tags.length === 0) {
358
+ return;
359
+ }
360
+ let funcExpr = node.findAncestor(reflection_1.isFunctionExpression);
361
+ if (funcExpr) {
362
+ // handle comment tags inside a function expression
363
+ this.processDocTagsInFunction(doc, node, funcExpr);
364
+ }
365
+ else {
366
+ //handle comment tags outside of a function expression
367
+ this.processDocTagsAtTopLevel(doc, node);
368
+ }
369
+ }
370
+ });
371
+ this.event.file.ast.walk((node, parent) => {
372
+ visitor(node, parent);
373
+ }, {
374
+ walkMode: visitors_1.WalkMode.visitAllRecursive
375
+ });
376
+ }
377
+ processDocTagsInFunction(doc, node, funcExpr) {
378
+ //TODO: Handle doc tags that influence the function they're in
379
+ // For example, declaring variable types:
380
+ // const symbolTable = funcExpr.body.getSymbolTable();
381
+ // for (const varTag of doc.getAllTags(BrsDocTagKind.Var)) {
382
+ // const varName = (varTag as BrsDocParamTag).name;
383
+ // const varTypeStr = (varTag as BrsDocParamTag).type;
384
+ // const data: ExtraSymbolData = {};
385
+ // const type = doc.getTypeFromContext(varTypeStr, node, { flags: SymbolTypeFlag.typetime, fullName: varTypeStr, data: data, tableProvider: () => symbolTable });
386
+ // if (type) {
387
+ // symbolTable.addSymbol(varName, { ...data, isFromDocComment: true }, type, SymbolTypeFlag.runtime);
388
+ // }
389
+ // }
390
+ }
391
+ processDocTagsAtTopLevel(doc, node) {
392
+ //TODO:
393
+ // - handle import statements?
394
+ // - handle library statements?
395
+ // - handle typecast statements?
396
+ // - handle alias statements?
397
+ // - handle const statements?
398
+ // - allow interface definitions?
399
+ }
400
+ /**
401
+ * Validate that a statement is defined in one of these specific locations
402
+ * - the root of the AST
403
+ * - inside a namespace
404
+ * This is applicable to things like FunctionStatement, ClassStatement, NamespaceStatement, EnumStatement, InterfaceStatement
405
+ */
406
+ validateDeclarationLocations(statement, keyword, rangeFactory) {
407
+ var _a;
408
+ //if nested inside a namespace, or defined at the root of the AST (i.e. in a body that has no parent)
409
+ const isOkDeclarationLocation = (parentNode) => {
410
+ return (0, reflection_1.isNamespaceStatement)(parentNode === null || parentNode === void 0 ? void 0 : parentNode.parent) || ((0, reflection_1.isBody)(parentNode) && !(parentNode === null || parentNode === void 0 ? void 0 : parentNode.parent));
411
+ };
412
+ if (isOkDeclarationLocation(statement.parent)) {
413
+ return;
414
+ }
415
+ // is this in a top levelconditional compile?
416
+ if ((0, reflection_1.isConditionalCompileStatement)((_a = statement.parent) === null || _a === void 0 ? void 0 : _a.parent)) {
417
+ if (isOkDeclarationLocation(statement.parent.parent.parent)) {
418
+ return;
419
+ }
420
+ }
421
+ //the statement was defined in the wrong place. Flag it.
422
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.keywordMustBeDeclaredAtNamespaceLevel(keyword)), { location: rangeFactory ? util_1.default.createLocationFromFileRange(this.event.file, rangeFactory()) : statement.location }));
423
+ }
424
+ validateFunctionParameterCount(func) {
425
+ var _a, _b, _c, _d, _e;
426
+ if (func.parameters.length > Expression_1.CallExpression.MaximumArguments) {
427
+ //flag every parameter over the limit
428
+ for (let i = Expression_1.CallExpression.MaximumArguments; i < func.parameters.length; i++) {
429
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.tooManyCallableParameters(func.parameters.length, Expression_1.CallExpression.MaximumArguments)), { location: (_e = (_c = (_b = (_a = func.parameters[i]) === null || _a === void 0 ? void 0 : _a.tokens.name) === null || _b === void 0 ? void 0 : _b.location) !== null && _c !== void 0 ? _c : (_d = func.parameters[i]) === null || _d === void 0 ? void 0 : _d.location) !== null && _e !== void 0 ? _e : func.location }));
430
+ }
431
+ }
432
+ }
433
+ validateEnumDeclaration(stmt) {
434
+ var _a, _b, _c, _d, _e, _f;
435
+ const members = stmt.getMembers();
436
+ //the enum data type is based on the first member value
437
+ const enumValueKind = (_e = (_d = (_c = (_b = (_a = members.find(x => x.value)) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.tokens) === null || _c === void 0 ? void 0 : _c.value) === null || _d === void 0 ? void 0 : _d.kind) !== null && _e !== void 0 ? _e : TokenKind_1.TokenKind.IntegerLiteral;
438
+ const memberNames = new Set();
439
+ for (const member of members) {
440
+ const memberNameLower = (_f = member.name) === null || _f === void 0 ? void 0 : _f.toLowerCase();
441
+ /**
442
+ * flag duplicate member names
443
+ */
444
+ if (memberNames.has(memberNameLower)) {
445
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier(member.name)), { location: member.location }));
446
+ }
447
+ else {
448
+ memberNames.add(memberNameLower);
449
+ }
450
+ //Enforce all member values are the same type
451
+ this.validateEnumValueTypes(member, enumValueKind);
452
+ }
453
+ }
454
+ validateEnumValueTypes(member, enumValueKind) {
455
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
456
+ let memberValueKind;
457
+ let memberValue;
458
+ if ((0, reflection_1.isUnaryExpression)(member.value)) {
459
+ memberValueKind = (_d = (_c = (_b = (_a = member.value) === null || _a === void 0 ? void 0 : _a.right) === null || _b === void 0 ? void 0 : _b.tokens) === null || _c === void 0 ? void 0 : _c.value) === null || _d === void 0 ? void 0 : _d.kind;
460
+ memberValue = (_e = member.value) === null || _e === void 0 ? void 0 : _e.right;
461
+ }
462
+ else {
463
+ memberValueKind = (_h = (_g = (_f = member.value) === null || _f === void 0 ? void 0 : _f.tokens) === null || _g === void 0 ? void 0 : _g.value) === null || _h === void 0 ? void 0 : _h.kind;
464
+ memberValue = member.value;
465
+ }
466
+ const range = (_k = (_j = (memberValue !== null && memberValue !== void 0 ? memberValue : member)) === null || _j === void 0 ? void 0 : _j.location) === null || _k === void 0 ? void 0 : _k.range;
467
+ if (
468
+ //is integer enum, has value, that value type is not integer
469
+ (enumValueKind === TokenKind_1.TokenKind.IntegerLiteral && memberValueKind && memberValueKind !== enumValueKind) ||
470
+ //has value, that value is not a literal
471
+ (memberValue && !(0, reflection_1.isLiteralExpression)(memberValue))) {
472
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.enumValueMustBeType(enumValueKind.replace(/literal$/i, '').toLowerCase())), { location: util_1.default.createLocationFromFileRange(this.event.file, range) }));
473
+ }
474
+ //is non integer value
475
+ if (enumValueKind !== TokenKind_1.TokenKind.IntegerLiteral) {
476
+ //default value present
477
+ if (memberValueKind) {
478
+ //member value is same as enum
479
+ if (memberValueKind !== enumValueKind) {
480
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.enumValueMustBeType(enumValueKind.replace(/literal$/i, '').toLowerCase())), { location: util_1.default.createLocationFromFileRange(this.event.file, range) }));
481
+ }
482
+ //default value missing
483
+ }
484
+ else {
485
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.enumValueIsRequired(enumValueKind.replace(/literal$/i, '').toLowerCase())), { location: util_1.default.createLocationFromFileRange(this.event.file, range) }));
486
+ }
487
+ }
488
+ }
489
+ validateConditionalCompileConst(ccConst) {
490
+ const isBool = ccConst.kind === TokenKind_1.TokenKind.True || ccConst.kind === TokenKind_1.TokenKind.False;
491
+ if (!isBool && !this.event.file.ast.bsConsts.has(ccConst.text.toLowerCase())) {
492
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.hashConstDoesNotExist()), { location: ccConst.location }));
493
+ return false;
494
+ }
495
+ return true;
496
+ }
497
+ /**
498
+ * Find statements defined at the top level (or inside a namespace body) that are not allowed to be there
499
+ */
500
+ flagTopLevelStatements() {
501
+ const statements = [...this.event.file.ast.statements];
502
+ while (statements.length > 0) {
503
+ const statement = statements.pop();
504
+ if ((0, reflection_1.isNamespaceStatement)(statement)) {
505
+ statements.push(...statement.body.statements);
506
+ }
507
+ else {
508
+ //only allow these statement types
509
+ if (!(0, reflection_1.isFunctionStatement)(statement) &&
510
+ !(0, reflection_1.isClassStatement)(statement) &&
511
+ !(0, reflection_1.isEnumStatement)(statement) &&
512
+ !(0, reflection_1.isInterfaceStatement)(statement) &&
513
+ !(0, reflection_1.isLibraryStatement)(statement) &&
514
+ !(0, reflection_1.isImportStatement)(statement) &&
515
+ !(0, reflection_1.isConstStatement)(statement) &&
516
+ !(0, reflection_1.isTypecastStatement)(statement) &&
517
+ !(0, reflection_1.isConditionalCompileConstStatement)(statement) &&
518
+ !(0, reflection_1.isConditionalCompileErrorStatement)(statement) &&
519
+ !(0, reflection_1.isConditionalCompileStatement)(statement) &&
520
+ !(0, reflection_1.isAliasStatement)(statement) &&
521
+ !(0, reflection_1.isTypeStatement)(statement)) {
522
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unexpectedStatementOutsideFunction()), { location: statement.location }));
523
+ }
524
+ }
525
+ }
526
+ }
527
+ isAllowedAtTopOfFile(statement) {
528
+ return (0, reflection_1.isLibraryStatement)(statement) || (0, reflection_1.isImportStatement)(statement) || (0, reflection_1.isTypecastStatement)(statement) || (0, reflection_1.isAliasStatement)(statement);
529
+ }
530
+ getTopOfFileStatements() {
531
+ let topOfFileIncludeStatements = [];
532
+ for (let stmt of this.event.file.parser.ast.statements) {
533
+ //if we found a non-library statement, this statement is not at the top of the file
534
+ if (this.isAllowedAtTopOfFile(stmt)) {
535
+ topOfFileIncludeStatements.push(stmt);
536
+ }
537
+ else {
538
+ //break out of the loop, we found all of our library statements
539
+ break;
540
+ }
541
+ }
542
+ return topOfFileIncludeStatements;
543
+ }
544
+ validateTopOfFileStatements() {
545
+ let topOfFileStatements = this.getTopOfFileStatements();
546
+ let statements = [
547
+ // eslint-disable-next-line @typescript-eslint/dot-notation
548
+ ...this.event.file['_cachedLookups'].libraryStatements,
549
+ // eslint-disable-next-line @typescript-eslint/dot-notation
550
+ ...this.event.file['_cachedLookups'].importStatements,
551
+ // eslint-disable-next-line @typescript-eslint/dot-notation
552
+ ...this.event.file['_cachedLookups'].aliasStatements
553
+ ];
554
+ for (let result of statements) {
555
+ //if this statement is not one of the top-of-file statements,
556
+ //then add a diagnostic explaining that it is invalid
557
+ if (!topOfFileStatements.includes(result)) {
558
+ if ((0, reflection_1.isLibraryStatement)(result)) {
559
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unexpectedStatementLocation('library', 'at the top of the file')), { location: result.location }));
560
+ }
561
+ else if ((0, reflection_1.isImportStatement)(result)) {
562
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unexpectedStatementLocation('import', 'at the top of the file')), { location: result.location }));
563
+ }
564
+ else if ((0, reflection_1.isAliasStatement)(result)) {
565
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unexpectedStatementLocation('alias', 'at the top of the file')), { location: result.location }));
566
+ }
567
+ }
568
+ }
569
+ }
570
+ validateTypecastStatements() {
571
+ // eslint-disable-next-line @typescript-eslint/dot-notation
572
+ for (let typecastStmt of this.event.file['_cachedLookups'].typecastStatements) {
573
+ let isBadTypecastObj = false;
574
+ const block = typecastStmt.findAncestor(node => ((0, reflection_1.isBody)(node) || (0, reflection_1.isBlock)(node)));
575
+ const resultVarStr = util_1.default.getAllDottedGetPartsAsString(typecastStmt.typecastExpression.obj);
576
+ const hasFunctionAncestor = !!typecastStmt.findAncestor(reflection_1.isFunctionExpression);
577
+ if (!(0, reflection_1.isVariableExpression)(typecastStmt.typecastExpression.obj)) {
578
+ isBadTypecastObj = true;
579
+ }
580
+ else if (!hasFunctionAncestor && resultVarStr.toLowerCase() !== 'm') {
581
+ // only 'm' can be typecast outside of a function body
582
+ isBadTypecastObj = true;
583
+ }
584
+ else if (block.getSymbolTable().hasSymbol(resultVarStr, 2 /* SymbolTypeFlag.typetime */)) {
585
+ // can only typecast runtime symbols
586
+ isBadTypecastObj = true;
587
+ }
588
+ if (isBadTypecastObj) {
589
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.invalidTypecastStatementApplication(resultVarStr, hasFunctionAncestor)), { location: typecastStmt.typecastExpression.obj.location }));
590
+ }
591
+ let isFirst = true;
592
+ for (let i = 0; i < typecastStmt.statementIndex; i++) {
593
+ const targetStatement = block.statements[i];
594
+ // allow multiple typecast statements at the top of a block or namespace, but no other statements before them
595
+ isFirst = isFirst && this.isAllowedAtTopOfFile(targetStatement);
596
+ if ((0, reflection_1.isTypecastStatement)(targetStatement) && targetStatement !== typecastStmt) {
597
+ // do not allow multiple typecast statements that typecast the same variable, even if they are at the top of the block/namespace
598
+ const otherResultVarStr = util_1.default.getAllDottedGetPartsAsString(targetStatement.typecastExpression.obj);
599
+ if (otherResultVarStr.toLowerCase() === resultVarStr.toLowerCase()) {
600
+ isFirst = false;
601
+ }
602
+ }
603
+ if (!isFirst) {
604
+ break;
605
+ }
606
+ }
607
+ if (!isFirst) {
608
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.unexpectedStatementLocation('typecast', 'at the top of the file or beginning of block or namespace')), { location: typecastStmt.location }));
609
+ }
610
+ }
611
+ }
612
+ validateContinueStatement(statement) {
613
+ const validateLoopTypeMatch = (expectedLoopType) => {
614
+ var _a;
615
+ //coerce ForEach to For
616
+ expectedLoopType = expectedLoopType === TokenKind_1.TokenKind.ForEach ? TokenKind_1.TokenKind.For : expectedLoopType;
617
+ const actualLoopType = statement.tokens.loopType;
618
+ if (actualLoopType && (expectedLoopType === null || expectedLoopType === void 0 ? void 0 : expectedLoopType.toLowerCase()) !== ((_a = actualLoopType.text) === null || _a === void 0 ? void 0 : _a.toLowerCase())) {
619
+ this.event.program.diagnostics.register(Object.assign({ location: statement.tokens.loopType.location }, DiagnosticMessages_1.DiagnosticMessages.expectedToken(expectedLoopType)));
620
+ }
621
+ };
622
+ //find the parent loop statement
623
+ const parent = statement.findAncestor((node) => {
624
+ if ((0, reflection_1.isWhileStatement)(node)) {
625
+ validateLoopTypeMatch(node.tokens.while.kind);
626
+ return true;
627
+ }
628
+ else if ((0, reflection_1.isForStatement)(node)) {
629
+ validateLoopTypeMatch(node.tokens.for.kind);
630
+ return true;
631
+ }
632
+ else if ((0, reflection_1.isForEachStatement)(node)) {
633
+ validateLoopTypeMatch(node.tokens.forEach.kind);
634
+ return true;
635
+ }
636
+ });
637
+ //flag continue statements found outside of a loop
638
+ if (!parent) {
639
+ this.event.program.diagnostics.register(Object.assign({ location: statement.location }, DiagnosticMessages_1.DiagnosticMessages.illegalContinueStatement()));
640
+ }
641
+ }
642
+ /**
643
+ * Validate that there are no optional chaining operators on the left-hand-side of an assignment, indexed set, or dotted get
644
+ */
645
+ validateNoOptionalChainingInVarSet(parent, children) {
646
+ var _a, _b, _c, _d, _e, _f, _g;
647
+ const nodes = [...children, parent];
648
+ //flag optional chaining anywhere in the left of this statement
649
+ while (nodes.length > 0) {
650
+ const node = nodes.shift();
651
+ if (
652
+ // a?.b = true or a.b?.c = true
653
+ (((0, reflection_1.isDottedSetStatement)(node) || (0, reflection_1.isDottedGetExpression)(node)) && ((_a = node.tokens.dot) === null || _a === void 0 ? void 0 : _a.kind) === TokenKind_1.TokenKind.QuestionDot) ||
654
+ // a.b?[2] = true
655
+ ((0, reflection_1.isIndexedGetExpression)(node) && (((_b = node === null || node === void 0 ? void 0 : node.tokens.questionDot) === null || _b === void 0 ? void 0 : _b.kind) === TokenKind_1.TokenKind.QuestionDot || ((_c = node.tokens.openingSquare) === null || _c === void 0 ? void 0 : _c.kind) === TokenKind_1.TokenKind.QuestionLeftSquare)) ||
656
+ // a?[1] = true
657
+ ((0, reflection_1.isIndexedSetStatement)(node) && ((_d = node.tokens.openingSquare) === null || _d === void 0 ? void 0 : _d.kind) === TokenKind_1.TokenKind.QuestionLeftSquare)) {
658
+ //try to highlight the entire left-hand-side expression if possible
659
+ let range;
660
+ if ((0, reflection_1.isDottedSetStatement)(parent)) {
661
+ range = util_1.default.createBoundingRange((_e = parent.obj) === null || _e === void 0 ? void 0 : _e.location, parent.tokens.dot, parent.tokens.name);
662
+ }
663
+ else if ((0, reflection_1.isIndexedSetStatement)(parent)) {
664
+ range = util_1.default.createBoundingRange((_f = parent.obj) === null || _f === void 0 ? void 0 : _f.location, parent.tokens.openingSquare, ...parent.indexes, parent.tokens.closingSquare);
665
+ }
666
+ else {
667
+ range = (_g = node.location) === null || _g === void 0 ? void 0 : _g.range;
668
+ }
669
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.noOptionalChainingInLeftHandSideOfAssignment()), { location: util_1.default.createLocationFromFileRange(this.event.file, range) }));
670
+ }
671
+ if (node === parent) {
672
+ break;
673
+ }
674
+ else {
675
+ nodes.push(node.parent);
676
+ }
677
+ }
678
+ }
679
+ setUpComplementSymbolTables(node, predicate) {
680
+ if ((0, reflection_1.isBlock)(node.elseBranch)) {
681
+ const elseTable = node.elseBranch.symbolTable;
682
+ let currentNode = node;
683
+ while (predicate(currentNode)) {
684
+ const thenBranch = currentNode.thenBranch;
685
+ elseTable.complementOtherTable(thenBranch.symbolTable);
686
+ currentNode = currentNode.parent;
687
+ }
688
+ }
689
+ }
690
+ /**
691
+ * Add a diagnostic if the configured minFirmwareVersion is lower than the version that
692
+ * introduced optional chaining support (Roku OS 11).
693
+ * This applies to both .brs and .bs files because optional chaining is not transpiled —
694
+ * it is emitted as-is, so the target device must natively support it.
695
+ */
696
+ validateMinFirmwareVersionForOptionalChaining(range) {
697
+ const minFirmwareVersion = this.event.file.program.options.minFirmwareVersion;
698
+ if (!minFirmwareVersion) {
699
+ return;
700
+ }
701
+ const coercedMinVersion = semver.coerce(minFirmwareVersion);
702
+ if (coercedMinVersion && semver.lt(coercedMinVersion, BrsFileValidator.OPTIONAL_CHAINING_MIN_VERSION)) {
703
+ this.event.program.diagnostics.register(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.featureRequiresMinFirmwareVersion('optional chaining', BrsFileValidator.OPTIONAL_CHAINING_MIN_VERSION, minFirmwareVersion)), { location: util_1.default.createLocationFromFileRange(this.event.file, range) }));
704
+ }
705
+ }
706
+ }
707
+ exports.BrsFileValidator = BrsFileValidator;
708
+ /**
709
+ * The minimum Roku firmware version that introduced optional chaining support (Roku OS 11).
710
+ * Optional chaining is NOT transpiled by BrighterScript, so this restriction applies to both
711
+ * .brs and .bs files.
712
+ */
713
+ BrsFileValidator.OPTIONAL_CHAINING_MIN_VERSION = '11.0.0';
714
+ //# sourceMappingURL=BrsFileValidator.js.map