brighterscript 1.0.0-alpha.5 → 1.0.0-alpha.50

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 (715) hide show
  1. package/README.md +76 -138
  2. package/bsconfig.schema.json +121 -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 +72 -39
  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 +12 -4
  20. package/dist/CodeActionUtil.js +22 -5
  21. package/dist/CodeActionUtil.js.map +1 -1
  22. package/dist/CommentFlagProcessor.d.ts +7 -6
  23. package/dist/CommentFlagProcessor.js +11 -8
  24. package/dist/CommentFlagProcessor.js.map +1 -1
  25. package/dist/CrossScopeValidator.d.ts +68 -0
  26. package/dist/CrossScopeValidator.js +642 -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 +82 -0
  38. package/dist/DiagnosticManager.js +406 -0
  39. package/dist/DiagnosticManager.js.map +1 -0
  40. package/dist/DiagnosticMessages.d.ts +558 -196
  41. package/dist/DiagnosticMessages.js +870 -340
  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 +100 -105
  53. package/dist/LanguageServer.js +444 -745
  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 +241 -98
  62. package/dist/Program.js +1432 -717
  63. package/dist/Program.js.map +1 -1
  64. package/dist/ProgramBuilder.d.ts +47 -23
  65. package/dist/ProgramBuilder.js +224 -178
  66. package/dist/ProgramBuilder.js.map +1 -1
  67. package/dist/Scope.d.ts +149 -109
  68. package/dist/Scope.js +557 -550
  69. package/dist/Scope.js.map +1 -1
  70. package/dist/SemanticTokenUtils.js +5 -1
  71. package/dist/SemanticTokenUtils.js.map +1 -1
  72. package/dist/Stopwatch.d.ts +4 -0
  73. package/dist/Stopwatch.js +8 -1
  74. package/dist/Stopwatch.js.map +1 -1
  75. package/dist/SymbolTable.d.ts +136 -24
  76. package/dist/SymbolTable.js +565 -64
  77. package/dist/SymbolTable.js.map +1 -1
  78. package/dist/SymbolTypeFlag.d.ts +9 -0
  79. package/dist/SymbolTypeFlag.js +14 -0
  80. package/dist/SymbolTypeFlag.js.map +1 -0
  81. package/dist/Throttler.d.ts +12 -0
  82. package/dist/Throttler.js +39 -0
  83. package/dist/Throttler.js.map +1 -1
  84. package/dist/Watcher.d.ts +0 -3
  85. package/dist/Watcher.js +0 -3
  86. package/dist/Watcher.js.map +1 -1
  87. package/dist/XmlScope.d.ts +5 -15
  88. package/dist/XmlScope.js +34 -90
  89. package/dist/XmlScope.js.map +1 -1
  90. package/dist/astUtils/CachedLookups.d.ts +50 -0
  91. package/dist/astUtils/CachedLookups.js +334 -0
  92. package/dist/astUtils/CachedLookups.js.map +1 -0
  93. package/dist/astUtils/CachedLookups.spec.js +39 -0
  94. package/dist/astUtils/CachedLookups.spec.js.map +1 -0
  95. package/dist/astUtils/Editor.d.ts +69 -0
  96. package/dist/astUtils/Editor.js +245 -0
  97. package/dist/astUtils/Editor.js.map +1 -0
  98. package/dist/astUtils/Editor.spec.js +258 -0
  99. package/dist/astUtils/Editor.spec.js.map +1 -0
  100. package/dist/astUtils/creators.d.ts +54 -19
  101. package/dist/astUtils/creators.js +242 -42
  102. package/dist/astUtils/creators.js.map +1 -1
  103. package/dist/astUtils/creators.spec.js +5 -5
  104. package/dist/astUtils/creators.spec.js.map +1 -1
  105. package/dist/astUtils/reflection.d.ts +196 -85
  106. package/dist/astUtils/reflection.js +497 -144
  107. package/dist/astUtils/reflection.js.map +1 -1
  108. package/dist/astUtils/reflection.spec.js +267 -167
  109. package/dist/astUtils/reflection.spec.js.map +1 -1
  110. package/dist/astUtils/stackedVisitor.js.map +1 -1
  111. package/dist/astUtils/stackedVisitor.spec.js +14 -14
  112. package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
  113. package/dist/astUtils/visitors.d.ts +116 -53
  114. package/dist/astUtils/visitors.js +95 -15
  115. package/dist/astUtils/visitors.js.map +1 -1
  116. package/dist/astUtils/visitors.spec.js +629 -51
  117. package/dist/astUtils/visitors.spec.js.map +1 -1
  118. package/dist/astUtils/xml.d.ts +9 -8
  119. package/dist/astUtils/xml.js +12 -7
  120. package/dist/astUtils/xml.js.map +1 -1
  121. package/dist/bscPlugin/BscPlugin.d.ts +24 -4
  122. package/dist/bscPlugin/BscPlugin.js +88 -4
  123. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  124. package/dist/bscPlugin/CallExpressionInfo.d.ts +36 -0
  125. package/dist/bscPlugin/CallExpressionInfo.js +143 -0
  126. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -0
  127. package/dist/bscPlugin/FileWriter.d.ts +6 -0
  128. package/dist/bscPlugin/FileWriter.js +24 -0
  129. package/dist/bscPlugin/FileWriter.js.map +1 -0
  130. package/dist/bscPlugin/SignatureHelpUtil.d.ts +10 -0
  131. package/dist/bscPlugin/SignatureHelpUtil.js +137 -0
  132. package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -0
  133. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +6 -5
  134. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +173 -27
  135. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  136. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +138 -21
  137. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  138. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +65 -0
  139. package/dist/bscPlugin/completions/CompletionsProcessor.js +633 -0
  140. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
  141. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +2512 -0
  142. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -0
  143. package/dist/bscPlugin/definition/DefinitionProvider.d.ts +13 -0
  144. package/dist/bscPlugin/definition/DefinitionProvider.js +212 -0
  145. package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -0
  146. package/dist/bscPlugin/definition/DefinitionProvider.spec.js +87 -0
  147. package/dist/bscPlugin/definition/DefinitionProvider.spec.js.map +1 -0
  148. package/dist/bscPlugin/fileProviders/FileProvider.d.ts +9 -0
  149. package/dist/bscPlugin/fileProviders/FileProvider.js +51 -0
  150. package/dist/bscPlugin/fileProviders/FileProvider.js.map +1 -0
  151. package/dist/bscPlugin/hover/HoverProcessor.d.ts +18 -0
  152. package/dist/bscPlugin/hover/HoverProcessor.js +230 -0
  153. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
  154. package/dist/bscPlugin/hover/HoverProcessor.spec.js +991 -0
  155. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
  156. package/dist/bscPlugin/references/ReferencesProvider.d.ts +12 -0
  157. package/dist/bscPlugin/references/ReferencesProvider.js +57 -0
  158. package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -0
  159. package/dist/bscPlugin/references/ReferencesProvider.spec.d.ts +1 -0
  160. package/dist/bscPlugin/references/ReferencesProvider.spec.js +51 -0
  161. package/dist/bscPlugin/references/ReferencesProvider.spec.js.map +1 -0
  162. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +14 -0
  163. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +164 -0
  164. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  165. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
  166. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +564 -0
  167. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  168. package/dist/bscPlugin/serialize/BslibInjector.spec.d.ts +1 -0
  169. package/dist/bscPlugin/serialize/BslibInjector.spec.js +33 -0
  170. package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
  171. package/dist/bscPlugin/serialize/BslibManager.d.ts +12 -0
  172. package/dist/bscPlugin/serialize/BslibManager.js +46 -0
  173. package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
  174. package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
  175. package/dist/bscPlugin/serialize/FileSerializer.js +75 -0
  176. package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
  177. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.d.ts +7 -0
  178. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js +22 -0
  179. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js.map +1 -0
  180. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.d.ts +1 -0
  181. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js +291 -0
  182. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js.map +1 -0
  183. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.d.ts +7 -0
  184. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js +26 -0
  185. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js.map +1 -0
  186. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.d.ts +1 -0
  187. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js +245 -0
  188. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js.map +1 -0
  189. package/dist/bscPlugin/symbols/symbolUtils.d.ts +5 -0
  190. package/dist/bscPlugin/symbols/symbolUtils.js +141 -0
  191. package/dist/bscPlugin/symbols/symbolUtils.js.map +1 -0
  192. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +27 -0
  193. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +418 -0
  194. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -0
  195. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.d.ts +1 -0
  196. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js +75 -0
  197. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +1 -0
  198. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +12 -0
  199. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +99 -0
  200. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
  201. package/dist/bscPlugin/validation/BrsFileAfterValidator.d.ts +7 -0
  202. package/dist/bscPlugin/validation/BrsFileAfterValidator.js +18 -0
  203. package/dist/bscPlugin/validation/BrsFileAfterValidator.js.map +1 -0
  204. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +37 -0
  205. package/dist/bscPlugin/validation/BrsFileValidator.js +638 -0
  206. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  207. package/dist/bscPlugin/validation/BrsFileValidator.spec.d.ts +1 -0
  208. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +1517 -0
  209. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -0
  210. package/dist/bscPlugin/validation/ProgramValidator.d.ts +11 -0
  211. package/dist/bscPlugin/validation/ProgramValidator.js +33 -0
  212. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -0
  213. package/dist/bscPlugin/validation/ScopeValidator.d.ts +141 -0
  214. package/dist/bscPlugin/validation/ScopeValidator.js +1323 -0
  215. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  216. package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +1 -0
  217. package/dist/bscPlugin/validation/ScopeValidator.spec.js +6135 -0
  218. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -0
  219. package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
  220. package/dist/bscPlugin/validation/XmlFileValidator.js +36 -0
  221. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
  222. package/dist/cli.js +126 -27
  223. package/dist/cli.js.map +1 -1
  224. package/dist/common/Sequencer.d.ts +53 -0
  225. package/dist/common/Sequencer.js +233 -0
  226. package/dist/common/Sequencer.js.map +1 -0
  227. package/dist/common/Sequencer.spec.d.ts +1 -0
  228. package/dist/common/Sequencer.spec.js +75 -0
  229. package/dist/common/Sequencer.spec.js.map +1 -0
  230. package/dist/deferred.d.ts +5 -3
  231. package/dist/deferred.js +10 -0
  232. package/dist/deferred.js.map +1 -1
  233. package/dist/diagnosticUtils.d.ts +10 -3
  234. package/dist/diagnosticUtils.js +64 -25
  235. package/dist/diagnosticUtils.js.map +1 -1
  236. package/dist/examples/plugins/removePrint.d.ts +2 -2
  237. package/dist/examples/plugins/removePrint.js +8 -12
  238. package/dist/examples/plugins/removePrint.js.map +1 -1
  239. package/dist/files/AssetFile.d.ts +24 -0
  240. package/dist/files/AssetFile.js +25 -0
  241. package/dist/files/AssetFile.js.map +1 -0
  242. package/dist/files/BrsFile.Class.spec.js +1213 -259
  243. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  244. package/dist/files/BrsFile.d.ts +145 -87
  245. package/dist/files/BrsFile.js +836 -934
  246. package/dist/files/BrsFile.js.map +1 -1
  247. package/dist/files/BrsFile.spec.js +4226 -902
  248. package/dist/files/BrsFile.spec.js.map +1 -1
  249. package/dist/files/BscFile.d.ts +102 -0
  250. package/dist/files/BscFile.js +15 -0
  251. package/dist/files/BscFile.js.map +1 -0
  252. package/dist/files/Factory.d.ts +25 -0
  253. package/dist/files/Factory.js +22 -0
  254. package/dist/files/Factory.js.map +1 -0
  255. package/dist/files/LazyFileData.d.ts +21 -0
  256. package/dist/files/LazyFileData.js +54 -0
  257. package/dist/files/LazyFileData.js.map +1 -0
  258. package/dist/files/LazyFileData.spec.d.ts +1 -0
  259. package/dist/files/LazyFileData.spec.js +27 -0
  260. package/dist/files/LazyFileData.spec.js.map +1 -0
  261. package/dist/files/XmlFile.d.ts +80 -41
  262. package/dist/files/XmlFile.js +161 -137
  263. package/dist/files/XmlFile.js.map +1 -1
  264. package/dist/files/XmlFile.spec.js +444 -336
  265. package/dist/files/XmlFile.spec.js.map +1 -1
  266. package/dist/files/tests/imports.spec.js +62 -52
  267. package/dist/files/tests/imports.spec.js.map +1 -1
  268. package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
  269. package/dist/files/tests/optionalChaning.spec.js +152 -0
  270. package/dist/files/tests/optionalChaning.spec.js.map +1 -0
  271. package/dist/globalCallables.d.ts +3 -1
  272. package/dist/globalCallables.js +424 -184
  273. package/dist/globalCallables.js.map +1 -1
  274. package/dist/index.d.ts +32 -4
  275. package/dist/index.js +54 -7
  276. package/dist/index.js.map +1 -1
  277. package/dist/interfaces.d.ts +942 -125
  278. package/dist/interfaces.js +21 -0
  279. package/dist/interfaces.js.map +1 -1
  280. package/dist/lexer/Character.spec.js +5 -5
  281. package/dist/lexer/Character.spec.js.map +1 -1
  282. package/dist/lexer/Lexer.d.ts +51 -12
  283. package/dist/lexer/Lexer.js +215 -65
  284. package/dist/lexer/Lexer.js.map +1 -1
  285. package/dist/lexer/Lexer.spec.js +812 -568
  286. package/dist/lexer/Lexer.spec.js.map +1 -1
  287. package/dist/lexer/Token.d.ts +27 -11
  288. package/dist/lexer/Token.js +10 -2
  289. package/dist/lexer/Token.js.map +1 -1
  290. package/dist/lexer/TokenKind.d.ts +40 -2
  291. package/dist/lexer/TokenKind.js +147 -10
  292. package/dist/lexer/TokenKind.js.map +1 -1
  293. package/dist/logging.d.ts +14 -0
  294. package/dist/logging.js +29 -0
  295. package/dist/logging.js.map +1 -0
  296. package/dist/lsp/ActionQueue.d.ts +35 -0
  297. package/dist/lsp/ActionQueue.js +115 -0
  298. package/dist/lsp/ActionQueue.js.map +1 -0
  299. package/dist/lsp/ActionQueue.spec.d.ts +1 -0
  300. package/dist/lsp/ActionQueue.spec.js +80 -0
  301. package/dist/lsp/ActionQueue.spec.js.map +1 -0
  302. package/dist/lsp/DocumentManager.d.ts +63 -0
  303. package/dist/lsp/DocumentManager.js +122 -0
  304. package/dist/lsp/DocumentManager.js.map +1 -0
  305. package/dist/lsp/DocumentManager.spec.d.ts +1 -0
  306. package/dist/lsp/DocumentManager.spec.js +103 -0
  307. package/dist/lsp/DocumentManager.spec.js.map +1 -0
  308. package/dist/lsp/LspProject.d.ts +239 -0
  309. package/dist/lsp/LspProject.js +3 -0
  310. package/dist/lsp/LspProject.js.map +1 -0
  311. package/dist/lsp/PathFilterer.d.ts +75 -0
  312. package/dist/lsp/PathFilterer.js +196 -0
  313. package/dist/lsp/PathFilterer.js.map +1 -0
  314. package/dist/lsp/PathFilterer.spec.d.ts +1 -0
  315. package/dist/lsp/PathFilterer.spec.js +182 -0
  316. package/dist/lsp/PathFilterer.spec.js.map +1 -0
  317. package/dist/lsp/Project.d.ts +168 -0
  318. package/dist/lsp/Project.js +437 -0
  319. package/dist/lsp/Project.js.map +1 -0
  320. package/dist/lsp/Project.spec.d.ts +1 -0
  321. package/dist/lsp/Project.spec.js +267 -0
  322. package/dist/lsp/Project.spec.js.map +1 -0
  323. package/dist/lsp/ProjectManager.d.ts +242 -0
  324. package/dist/lsp/ProjectManager.js +824 -0
  325. package/dist/lsp/ProjectManager.js.map +1 -0
  326. package/dist/lsp/ProjectManager.spec.d.ts +1 -0
  327. package/dist/lsp/ProjectManager.spec.js +913 -0
  328. package/dist/lsp/ProjectManager.spec.js.map +1 -0
  329. package/dist/lsp/ReaderWriterManager.d.ts +21 -0
  330. package/dist/lsp/ReaderWriterManager.js +60 -0
  331. package/dist/lsp/ReaderWriterManager.js.map +1 -0
  332. package/dist/lsp/worker/MessageHandler.d.ts +99 -0
  333. package/dist/lsp/worker/MessageHandler.js +138 -0
  334. package/dist/lsp/worker/MessageHandler.js.map +1 -0
  335. package/dist/lsp/worker/MessageHandler.spec.d.ts +1 -0
  336. package/dist/lsp/worker/MessageHandler.spec.js +64 -0
  337. package/dist/lsp/worker/MessageHandler.spec.js.map +1 -0
  338. package/dist/lsp/worker/WorkerPool.d.ts +38 -0
  339. package/dist/lsp/worker/WorkerPool.js +78 -0
  340. package/dist/lsp/worker/WorkerPool.js.map +1 -0
  341. package/dist/lsp/worker/WorkerPool.spec.d.ts +1 -0
  342. package/dist/lsp/worker/WorkerPool.spec.js +59 -0
  343. package/dist/lsp/worker/WorkerPool.spec.js.map +1 -0
  344. package/dist/lsp/worker/WorkerThreadProject.d.ts +143 -0
  345. package/dist/lsp/worker/WorkerThreadProject.js +189 -0
  346. package/dist/lsp/worker/WorkerThreadProject.js.map +1 -0
  347. package/dist/lsp/worker/WorkerThreadProject.spec.d.ts +2 -0
  348. package/dist/lsp/worker/WorkerThreadProject.spec.js +71 -0
  349. package/dist/lsp/worker/WorkerThreadProject.spec.js.map +1 -0
  350. package/dist/lsp/worker/WorkerThreadProjectRunner.d.ts +15 -0
  351. package/dist/lsp/worker/WorkerThreadProjectRunner.js +58 -0
  352. package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -0
  353. package/dist/lsp/worker/run.d.ts +1 -0
  354. package/dist/lsp/worker/run.js +14 -0
  355. package/dist/lsp/worker/run.js.map +1 -0
  356. package/dist/parser/AstNode.d.ts +203 -0
  357. package/dist/parser/AstNode.js +303 -0
  358. package/dist/parser/AstNode.js.map +1 -0
  359. package/dist/parser/AstNode.spec.d.ts +1 -0
  360. package/dist/parser/AstNode.spec.js +1455 -0
  361. package/dist/parser/AstNode.spec.js.map +1 -0
  362. package/dist/parser/BrightScriptDocParser.d.ts +56 -0
  363. package/dist/parser/BrightScriptDocParser.js +294 -0
  364. package/dist/parser/BrightScriptDocParser.js.map +1 -0
  365. package/dist/parser/BrightScriptDocParser.spec.d.ts +1 -0
  366. package/dist/parser/BrightScriptDocParser.spec.js +310 -0
  367. package/dist/parser/BrightScriptDocParser.spec.js.map +1 -0
  368. package/dist/parser/BrsTranspileState.d.ts +22 -3
  369. package/dist/parser/BrsTranspileState.js +19 -0
  370. package/dist/parser/BrsTranspileState.js.map +1 -1
  371. package/dist/parser/Expression.d.ts +553 -221
  372. package/dist/parser/Expression.js +1414 -505
  373. package/dist/parser/Expression.js.map +1 -1
  374. package/dist/parser/Expression.spec.d.ts +1 -0
  375. package/dist/parser/Expression.spec.js +40 -0
  376. package/dist/parser/Expression.spec.js.map +1 -0
  377. package/dist/parser/Parser.Class.spec.js +255 -125
  378. package/dist/parser/Parser.Class.spec.js.map +1 -1
  379. package/dist/parser/Parser.d.ts +117 -124
  380. package/dist/parser/Parser.js +1669 -982
  381. package/dist/parser/Parser.js.map +1 -1
  382. package/dist/parser/Parser.spec.d.ts +3 -1
  383. package/dist/parser/Parser.spec.js +2111 -525
  384. package/dist/parser/Parser.spec.js.map +1 -1
  385. package/dist/parser/SGParser.d.ts +29 -13
  386. package/dist/parser/SGParser.js +85 -56
  387. package/dist/parser/SGParser.js.map +1 -1
  388. package/dist/parser/SGParser.spec.js +30 -45
  389. package/dist/parser/SGParser.spec.js.map +1 -1
  390. package/dist/parser/SGTypes.d.ts +134 -46
  391. package/dist/parser/SGTypes.js +206 -115
  392. package/dist/parser/SGTypes.js.map +1 -1
  393. package/dist/parser/Statement.d.ts +849 -267
  394. package/dist/parser/Statement.js +2412 -625
  395. package/dist/parser/Statement.js.map +1 -1
  396. package/dist/parser/Statement.spec.js +133 -36
  397. package/dist/parser/Statement.spec.js.map +1 -1
  398. package/dist/parser/TranspileState.d.ts +26 -12
  399. package/dist/parser/TranspileState.js +115 -24
  400. package/dist/parser/TranspileState.js.map +1 -1
  401. package/dist/parser/tests/Parser.spec.d.ts +3 -9
  402. package/dist/parser/tests/Parser.spec.js +7 -13
  403. package/dist/parser/tests/Parser.spec.js.map +1 -1
  404. package/dist/parser/tests/controlFlow/For.spec.js +83 -75
  405. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  406. package/dist/parser/tests/controlFlow/ForEach.spec.js +85 -51
  407. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  408. package/dist/parser/tests/controlFlow/If.spec.js +382 -239
  409. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  410. package/dist/parser/tests/controlFlow/While.spec.js +52 -45
  411. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  412. package/dist/parser/tests/expression/Additive.spec.js +51 -43
  413. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  414. package/dist/parser/tests/expression/ArrayLiterals.spec.js +192 -142
  415. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  416. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +236 -160
  417. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  418. package/dist/parser/tests/expression/Boolean.spec.js +41 -34
  419. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  420. package/dist/parser/tests/expression/Call.spec.js +173 -55
  421. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  422. package/dist/parser/tests/expression/Exponential.spec.js +20 -20
  423. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  424. package/dist/parser/tests/expression/Function.spec.js +291 -282
  425. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  426. package/dist/parser/tests/expression/Indexing.spec.js +193 -110
  427. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  428. package/dist/parser/tests/expression/Multiplicative.spec.js +42 -42
  429. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  430. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +260 -115
  431. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  432. package/dist/parser/tests/expression/PrefixUnary.spec.js +58 -52
  433. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  434. package/dist/parser/tests/expression/Primary.spec.js +76 -60
  435. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  436. package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
  437. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
  438. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
  439. package/dist/parser/tests/expression/Relational.spec.js +50 -50
  440. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  441. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +31 -31
  442. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  443. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +281 -94
  444. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  445. package/dist/parser/tests/expression/TernaryExpression.spec.js +747 -192
  446. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  447. package/dist/parser/tests/expression/TypeExpression.spec.d.ts +1 -0
  448. package/dist/parser/tests/expression/TypeExpression.spec.js +126 -0
  449. package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -0
  450. package/dist/parser/tests/expression/UnaryExpression.spec.d.ts +1 -0
  451. package/dist/parser/tests/expression/UnaryExpression.spec.js +52 -0
  452. package/dist/parser/tests/expression/UnaryExpression.spec.js.map +1 -0
  453. package/dist/parser/tests/statement/AssignmentOperators.spec.js +44 -44
  454. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  455. package/dist/parser/tests/statement/ConstStatement.spec.d.ts +1 -0
  456. package/dist/parser/tests/statement/ConstStatement.spec.js +500 -0
  457. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -0
  458. package/dist/parser/tests/statement/Continue.spec.d.ts +1 -0
  459. package/dist/parser/tests/statement/Continue.spec.js +119 -0
  460. package/dist/parser/tests/statement/Continue.spec.js.map +1 -0
  461. package/dist/parser/tests/statement/Declaration.spec.js +61 -55
  462. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  463. package/dist/parser/tests/statement/Dim.spec.js +29 -22
  464. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  465. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  466. package/dist/parser/tests/statement/Enum.spec.js +744 -0
  467. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  468. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  469. package/dist/parser/tests/statement/For.spec.js +45 -0
  470. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  471. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  472. package/dist/parser/tests/statement/ForEach.spec.js +36 -0
  473. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  474. package/dist/parser/tests/statement/Function.spec.js +226 -215
  475. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  476. package/dist/parser/tests/statement/Goto.spec.js +16 -15
  477. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  478. package/dist/parser/tests/statement/Increment.spec.js +64 -61
  479. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  480. package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
  481. package/dist/parser/tests/statement/InterfaceStatement.spec.js +110 -0
  482. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
  483. package/dist/parser/tests/statement/LibraryStatement.spec.js +22 -22
  484. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  485. package/dist/parser/tests/statement/Misc.spec.js +127 -168
  486. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  487. package/dist/parser/tests/statement/PrintStatement.spec.js +133 -114
  488. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  489. package/dist/parser/tests/statement/ReturnStatement.spec.js +57 -54
  490. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  491. package/dist/parser/tests/statement/Set.spec.js +131 -117
  492. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  493. package/dist/parser/tests/statement/Stop.spec.js +14 -13
  494. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  495. package/dist/parser/tests/statement/Throw.spec.js +11 -8
  496. package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
  497. package/dist/parser/tests/statement/TryCatch.spec.js +26 -15
  498. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  499. package/dist/preprocessor/Manifest.d.ts +6 -6
  500. package/dist/preprocessor/Manifest.js +17 -38
  501. package/dist/preprocessor/Manifest.js.map +1 -1
  502. package/dist/preprocessor/Manifest.spec.d.ts +1 -0
  503. package/dist/preprocessor/Manifest.spec.js +78 -103
  504. package/dist/preprocessor/Manifest.spec.js.map +1 -1
  505. package/dist/roku-types/data.json +20347 -0
  506. package/dist/roku-types/index.d.ts +5726 -0
  507. package/dist/roku-types/index.js +11 -0
  508. package/dist/roku-types/index.js.map +1 -0
  509. package/dist/types/ArrayType.d.ts +12 -5
  510. package/dist/types/ArrayType.js +89 -24
  511. package/dist/types/ArrayType.js.map +1 -1
  512. package/dist/types/ArrayType.spec.js +39 -11
  513. package/dist/types/ArrayType.spec.js.map +1 -1
  514. package/dist/types/AssociativeArrayType.d.ts +15 -0
  515. package/dist/types/AssociativeArrayType.js +64 -0
  516. package/dist/types/AssociativeArrayType.js.map +1 -0
  517. package/dist/types/BaseFunctionType.d.ts +10 -0
  518. package/dist/types/BaseFunctionType.js +26 -0
  519. package/dist/types/BaseFunctionType.js.map +1 -0
  520. package/dist/types/BooleanType.d.ts +9 -5
  521. package/dist/types/BooleanType.js +19 -8
  522. package/dist/types/BooleanType.js.map +1 -1
  523. package/dist/types/BooleanType.spec.js +10 -4
  524. package/dist/types/BooleanType.spec.js.map +1 -1
  525. package/dist/types/BscType.d.ts +41 -3
  526. package/dist/types/BscType.js +152 -0
  527. package/dist/types/BscType.js.map +1 -1
  528. package/dist/types/BscTypeKind.d.ts +28 -0
  529. package/dist/types/BscTypeKind.js +33 -0
  530. package/dist/types/BscTypeKind.js.map +1 -0
  531. package/dist/types/BuiltInInterfaceAdder.d.ts +28 -0
  532. package/dist/types/BuiltInInterfaceAdder.js +212 -0
  533. package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
  534. package/dist/types/BuiltInInterfaceAdder.spec.d.ts +1 -0
  535. package/dist/types/BuiltInInterfaceAdder.spec.js +115 -0
  536. package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -0
  537. package/dist/types/CallFuncableType.d.ts +24 -0
  538. package/dist/types/CallFuncableType.js +91 -0
  539. package/dist/types/CallFuncableType.js.map +1 -0
  540. package/dist/types/ClassType.d.ts +17 -0
  541. package/dist/types/ClassType.js +60 -0
  542. package/dist/types/ClassType.js.map +1 -0
  543. package/dist/types/ClassType.spec.d.ts +1 -0
  544. package/dist/types/ClassType.spec.js +76 -0
  545. package/dist/types/ClassType.spec.js.map +1 -0
  546. package/dist/types/ComponentType.d.ts +22 -0
  547. package/dist/types/ComponentType.js +107 -0
  548. package/dist/types/ComponentType.js.map +1 -0
  549. package/dist/types/DoubleType.d.ts +10 -5
  550. package/dist/types/DoubleType.js +21 -17
  551. package/dist/types/DoubleType.js.map +1 -1
  552. package/dist/types/DoubleType.spec.js +12 -4
  553. package/dist/types/DoubleType.spec.js.map +1 -1
  554. package/dist/types/DynamicType.d.ts +13 -5
  555. package/dist/types/DynamicType.js +26 -5
  556. package/dist/types/DynamicType.js.map +1 -1
  557. package/dist/types/DynamicType.spec.js +16 -5
  558. package/dist/types/DynamicType.spec.js.map +1 -1
  559. package/dist/types/EnumType.d.ts +42 -0
  560. package/dist/types/EnumType.js +98 -0
  561. package/dist/types/EnumType.js.map +1 -0
  562. package/dist/types/EnumType.spec.d.ts +1 -0
  563. package/dist/types/EnumType.spec.js +33 -0
  564. package/dist/types/EnumType.spec.js.map +1 -0
  565. package/dist/types/FloatType.d.ts +10 -5
  566. package/dist/types/FloatType.js +21 -17
  567. package/dist/types/FloatType.js.map +1 -1
  568. package/dist/types/FloatType.spec.js +4 -4
  569. package/dist/types/FloatType.spec.js.map +1 -1
  570. package/dist/types/FunctionType.d.ts +8 -22
  571. package/dist/types/FunctionType.js +25 -63
  572. package/dist/types/FunctionType.js.map +1 -1
  573. package/dist/types/InheritableType.d.ts +29 -0
  574. package/dist/types/InheritableType.js +173 -0
  575. package/dist/types/InheritableType.js.map +1 -0
  576. package/dist/types/InlineInterfaceType.d.ts +5 -0
  577. package/dist/types/InlineInterfaceType.js +17 -0
  578. package/dist/types/InlineInterfaceType.js.map +1 -0
  579. package/dist/types/IntegerType.d.ts +10 -5
  580. package/dist/types/IntegerType.js +21 -17
  581. package/dist/types/IntegerType.js.map +1 -1
  582. package/dist/types/IntegerType.spec.js +8 -4
  583. package/dist/types/IntegerType.spec.js.map +1 -1
  584. package/dist/types/InterfaceType.d.ts +14 -6
  585. package/dist/types/InterfaceType.js +30 -15
  586. package/dist/types/InterfaceType.js.map +1 -1
  587. package/dist/types/InterfaceType.spec.d.ts +1 -0
  588. package/dist/types/InterfaceType.spec.js +227 -0
  589. package/dist/types/InterfaceType.spec.js.map +1 -0
  590. package/dist/types/IntersectionType.d.ts +29 -0
  591. package/dist/types/IntersectionType.js +253 -0
  592. package/dist/types/IntersectionType.js.map +1 -0
  593. package/dist/types/IntersectionType.spec.d.ts +1 -0
  594. package/dist/types/IntersectionType.spec.js +150 -0
  595. package/dist/types/IntersectionType.spec.js.map +1 -0
  596. package/dist/types/InvalidType.d.ts +10 -5
  597. package/dist/types/InvalidType.js +21 -9
  598. package/dist/types/InvalidType.js.map +1 -1
  599. package/dist/types/InvalidType.spec.js +8 -4
  600. package/dist/types/InvalidType.spec.js.map +1 -1
  601. package/dist/types/LongIntegerType.d.ts +10 -5
  602. package/dist/types/LongIntegerType.js +21 -17
  603. package/dist/types/LongIntegerType.js.map +1 -1
  604. package/dist/types/LongIntegerType.spec.js +10 -4
  605. package/dist/types/LongIntegerType.spec.js.map +1 -1
  606. package/dist/types/NamespaceType.d.ts +12 -0
  607. package/dist/types/NamespaceType.js +28 -0
  608. package/dist/types/NamespaceType.js.map +1 -0
  609. package/dist/types/ObjectType.d.ts +12 -5
  610. package/dist/types/ObjectType.js +25 -8
  611. package/dist/types/ObjectType.js.map +1 -1
  612. package/dist/types/ObjectType.spec.js +3 -3
  613. package/dist/types/ObjectType.spec.js.map +1 -1
  614. package/dist/types/ReferenceType.d.ts +123 -0
  615. package/dist/types/ReferenceType.js +720 -0
  616. package/dist/types/ReferenceType.js.map +1 -0
  617. package/dist/types/ReferenceType.spec.d.ts +1 -0
  618. package/dist/types/ReferenceType.spec.js +151 -0
  619. package/dist/types/ReferenceType.spec.js.map +1 -0
  620. package/dist/types/StringType.d.ts +12 -5
  621. package/dist/types/StringType.js +23 -8
  622. package/dist/types/StringType.js.map +1 -1
  623. package/dist/types/StringType.spec.js +3 -3
  624. package/dist/types/StringType.spec.js.map +1 -1
  625. package/dist/types/TypeStatementType.d.ts +18 -0
  626. package/dist/types/TypeStatementType.js +45 -0
  627. package/dist/types/TypeStatementType.js.map +1 -0
  628. package/dist/types/TypedFunctionType.d.ts +34 -0
  629. package/dist/types/TypedFunctionType.js +147 -0
  630. package/dist/types/TypedFunctionType.js.map +1 -0
  631. package/dist/types/TypedFunctionType.spec.d.ts +1 -0
  632. package/dist/types/TypedFunctionType.spec.js +122 -0
  633. package/dist/types/TypedFunctionType.spec.js.map +1 -0
  634. package/dist/types/UninitializedType.d.ts +11 -6
  635. package/dist/types/UninitializedType.js +20 -11
  636. package/dist/types/UninitializedType.js.map +1 -1
  637. package/dist/types/UnionType.d.ts +27 -0
  638. package/dist/types/UnionType.js +193 -0
  639. package/dist/types/UnionType.js.map +1 -0
  640. package/dist/types/UnionType.spec.d.ts +1 -0
  641. package/dist/types/UnionType.spec.js +205 -0
  642. package/dist/types/UnionType.spec.js.map +1 -0
  643. package/dist/types/VoidType.d.ts +11 -5
  644. package/dist/types/VoidType.js +22 -8
  645. package/dist/types/VoidType.js.map +1 -1
  646. package/dist/types/VoidType.spec.js +3 -3
  647. package/dist/types/VoidType.spec.js.map +1 -1
  648. package/dist/types/helper.spec.d.ts +1 -0
  649. package/dist/types/helper.spec.js +174 -0
  650. package/dist/types/helper.spec.js.map +1 -0
  651. package/dist/types/helpers.d.ts +51 -0
  652. package/dist/types/helpers.js +323 -0
  653. package/dist/types/helpers.js.map +1 -0
  654. package/dist/types/index.d.ts +22 -0
  655. package/dist/types/index.js +39 -0
  656. package/dist/types/index.js.map +1 -0
  657. package/dist/types/roFunctionType.d.ts +11 -0
  658. package/dist/types/roFunctionType.js +37 -0
  659. package/dist/types/roFunctionType.js.map +1 -0
  660. package/dist/types/roFunctionType.spec.d.ts +1 -0
  661. package/dist/types/roFunctionType.spec.js +20 -0
  662. package/dist/types/roFunctionType.spec.js.map +1 -0
  663. package/dist/util.d.ts +288 -187
  664. package/dist/util.js +2018 -575
  665. package/dist/util.js.map +1 -1
  666. package/dist/validators/ClassValidator.d.ts +9 -15
  667. package/dist/validators/ClassValidator.js +93 -138
  668. package/dist/validators/ClassValidator.js.map +1 -1
  669. package/package.json +185 -138
  670. package/CHANGELOG.md +0 -1188
  671. package/dist/astUtils/index.d.ts +0 -7
  672. package/dist/astUtils/index.js +0 -26
  673. package/dist/astUtils/index.js.map +0 -1
  674. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.d.ts +0 -7
  675. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js +0 -63
  676. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.js.map +0 -1
  677. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js +0 -45
  678. package/dist/bscPlugin/semanticTokens/SemanticTokensProcessor.spec.js.map +0 -1
  679. package/dist/lexer/index.d.ts +0 -3
  680. package/dist/lexer/index.js +0 -17
  681. package/dist/lexer/index.js.map +0 -1
  682. package/dist/parser/SGTypes.spec.js +0 -351
  683. package/dist/parser/SGTypes.spec.js.map +0 -1
  684. package/dist/parser/index.d.ts +0 -3
  685. package/dist/parser/index.js +0 -16
  686. package/dist/parser/index.js.map +0 -1
  687. package/dist/preprocessor/Chunk.d.ts +0 -82
  688. package/dist/preprocessor/Chunk.js +0 -77
  689. package/dist/preprocessor/Chunk.js.map +0 -1
  690. package/dist/preprocessor/Preprocessor.d.ts +0 -60
  691. package/dist/preprocessor/Preprocessor.js +0 -156
  692. package/dist/preprocessor/Preprocessor.js.map +0 -1
  693. package/dist/preprocessor/Preprocessor.spec.js +0 -152
  694. package/dist/preprocessor/Preprocessor.spec.js.map +0 -1
  695. package/dist/preprocessor/PreprocessorParser.d.ts +0 -61
  696. package/dist/preprocessor/PreprocessorParser.js +0 -194
  697. package/dist/preprocessor/PreprocessorParser.js.map +0 -1
  698. package/dist/preprocessor/PreprocessorParser.spec.js +0 -116
  699. package/dist/preprocessor/PreprocessorParser.spec.js.map +0 -1
  700. package/dist/preprocessor/index.d.ts +0 -3
  701. package/dist/preprocessor/index.js +0 -16
  702. package/dist/preprocessor/index.js.map +0 -1
  703. package/dist/types/CustomType.d.ts +0 -10
  704. package/dist/types/CustomType.js +0 -35
  705. package/dist/types/CustomType.js.map +0 -1
  706. package/dist/types/FunctionType.spec.js +0 -29
  707. package/dist/types/FunctionType.spec.js.map +0 -1
  708. package/dist/types/LazyType.d.ts +0 -15
  709. package/dist/types/LazyType.js +0 -32
  710. package/dist/types/LazyType.js.map +0 -1
  711. /package/dist/{bscPlugin/semanticTokens/SemanticTokensProcessor.spec.d.ts → astUtils/CachedLookups.spec.d.ts} +0 -0
  712. /package/dist/{parser/SGTypes.spec.d.ts → astUtils/Editor.spec.d.ts} +0 -0
  713. /package/dist/{preprocessor/Preprocessor.spec.d.ts → bscPlugin/completions/CompletionsProcessor.spec.d.ts} +0 -0
  714. /package/dist/{preprocessor/PreprocessorParser.spec.d.ts → bscPlugin/definition/DefinitionProvider.spec.d.ts} +0 -0
  715. /package/dist/{types/FunctionType.spec.d.ts → bscPlugin/hover/HoverProcessor.spec.d.ts} +0 -0
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const sinonImport = require("sinon");
4
4
  const Program_1 = require("../Program");
5
- const chai_1 = require("chai");
5
+ const chai_config_spec_1 = require("../chai-config.spec");
6
6
  const DiagnosticMessages_1 = require("../DiagnosticMessages");
7
7
  const vscode_languageserver_1 = require("vscode-languageserver");
8
8
  const Parser_1 = require("../parser/Parser");
@@ -11,28 +11,29 @@ const util_1 = require("../util");
11
11
  const fsExtra = require("fs-extra");
12
12
  const BrsTranspileState_1 = require("../parser/BrsTranspileState");
13
13
  const assert_1 = require("assert");
14
+ const testHelpers_spec_2 = require("../testHelpers.spec");
15
+ const reflection_1 = require("../astUtils/reflection");
16
+ const visitors_1 = require("../astUtils/visitors");
14
17
  let sinon = sinonImport.createSandbox();
15
18
  describe('BrsFile BrighterScript classes', () => {
16
- let tmpPath = util_1.standardizePath `${process.cwd()}/.tmp`;
17
- let rootDir = util_1.standardizePath `${tmpPath}/rootDir`;
18
19
  let program;
19
- let testTranspile = testHelpers_spec_1.getTestTranspile(() => [program, rootDir]);
20
+ let testTranspile = (0, testHelpers_spec_1.getTestTranspile)(() => [program, testHelpers_spec_2.rootDir]);
20
21
  beforeEach(() => {
21
- fsExtra.ensureDirSync(rootDir);
22
- fsExtra.emptyDirSync(tmpPath);
23
- program = new Program_1.Program({ rootDir: rootDir });
22
+ fsExtra.ensureDirSync(testHelpers_spec_2.rootDir);
23
+ fsExtra.emptyDirSync(testHelpers_spec_2.tempDir);
24
+ program = new Program_1.Program({ rootDir: testHelpers_spec_2.rootDir, outDir: testHelpers_spec_2.outDir });
24
25
  });
25
26
  afterEach(() => {
26
27
  sinon.restore();
27
28
  program.dispose();
28
- fsExtra.ensureDirSync(tmpPath);
29
- fsExtra.emptyDirSync(tmpPath);
29
+ fsExtra.ensureDirSync(testHelpers_spec_2.tempDir);
30
+ fsExtra.emptyDirSync(testHelpers_spec_2.tempDir);
30
31
  });
31
32
  function addFile(relativePath, text) {
32
- return program.setFile({ src: `${rootDir}/${relativePath}`, dest: relativePath }, text);
33
+ return program.setFile({ src: `${testHelpers_spec_2.rootDir}/${relativePath}`, dest: relativePath }, text);
33
34
  }
34
35
  it('detects all classes after parse', () => {
35
- let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
36
+ let file = program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
36
37
  class Animal
37
38
  end class
38
39
  class Duck
@@ -40,18 +41,18 @@ describe('BrsFile BrighterScript classes', () => {
40
41
 
41
42
  end class
42
43
  `);
43
- chai_1.expect(file.parser.references.classStatements.map(x => x.getName(Parser_1.ParseMode.BrighterScript)).sort()).to.eql(['Animal', 'Duck']);
44
+ const classStatements = file.ast.findChildren(reflection_1.isClassStatement);
45
+ (0, chai_config_spec_1.expect)(classStatements.map(x => x.getName(Parser_1.ParseMode.BrighterScript)).sort()).to.eql(['Animal', 'Duck']);
44
46
  });
45
47
  it('does not cause errors with incomplete class statement', () => {
46
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
48
+ program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
47
49
  class
48
50
  `);
49
51
  program.validate();
50
52
  //if no exception was thrown, this test passes
51
53
  });
52
54
  it('catches child class missing super call in constructor', () => {
53
- var _a;
54
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
55
+ program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
55
56
  class Person
56
57
  sub new()
57
58
  end sub
@@ -62,11 +63,33 @@ describe('BrsFile BrighterScript classes', () => {
62
63
  end class
63
64
  `);
64
65
  program.validate();
65
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall().message);
66
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
67
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
68
+ ]);
69
+ });
70
+ it('allows class named `optional`', () => {
71
+ program.setFile('source/main.bs', `
72
+ class optional
73
+ thing = 1
74
+ end class
75
+ `);
76
+ program.validate();
77
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
78
+ });
79
+ it('supports optional fields', () => {
80
+ program.setFile('source/main.bs', `
81
+ class Movie
82
+ name as string
83
+ optional subtitles as string
84
+ public optional isRepeatEnabled as boolean
85
+ private optional wasPlayed
86
+ end class
87
+ `);
88
+ program.validate();
89
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
66
90
  });
67
91
  it('access modifier is option for override', () => {
68
- var _a;
69
- let file = program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
92
+ let file = program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
70
93
  class Animal
71
94
  sub move()
72
95
  end sub
@@ -78,14 +101,13 @@ describe('BrsFile BrighterScript classes', () => {
78
101
  end class
79
102
  `);
80
103
  program.validate();
81
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
82
- let duckClass = file.parser.references.classStatements.find(x => x.name.text.toLowerCase() === 'duck');
83
- chai_1.expect(duckClass).to.exist;
84
- chai_1.expect(duckClass.memberMap['move']).to.exist;
104
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
105
+ let duckClass = file.ast.findChildren(reflection_1.isClassStatement, { walkMode: visitors_1.WalkMode.visitStatements }).find(x => x.tokens.name.text.toLowerCase() === 'duck');
106
+ (0, chai_config_spec_1.expect)(duckClass).to.exist;
107
+ (0, chai_config_spec_1.expect)(duckClass.memberMap['move']).to.exist;
85
108
  });
86
109
  it('supports various namespace configurations', () => {
87
- var _a;
88
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
110
+ program.setFile({ src: `${testHelpers_spec_2.rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
89
111
  class Animal
90
112
  sub new()
91
113
  bigBird = new Birds.Bird()
@@ -105,11 +127,10 @@ describe('BrsFile BrighterScript classes', () => {
105
127
  end namespace
106
128
  `);
107
129
  program.validate();
108
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
130
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
109
131
  });
110
132
  describe('super', () => {
111
133
  it('always requires super call in child constructor', () => {
112
- var _a;
113
134
  program.setFile('source/main.bs', `
114
135
  class Bird
115
136
  end class
@@ -119,10 +140,11 @@ describe('BrsFile BrighterScript classes', () => {
119
140
  end class
120
141
  `);
121
142
  program.validate();
122
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.eql(DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall().message);
143
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
144
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
145
+ ]);
123
146
  });
124
147
  it('requires super call in child when parent has own `new` method', () => {
125
- var _a;
126
148
  program.setFile('source/main.bs', `
127
149
  class Bird
128
150
  sub new()
@@ -134,17 +156,18 @@ describe('BrsFile BrighterScript classes', () => {
134
156
  end class
135
157
  `);
136
158
  program.validate();
137
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.eql(DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall().message);
159
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
160
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
161
+ ]);
138
162
  });
139
163
  it('allows non-`m` expressions and statements before the super call', () => {
140
- var _a;
141
164
  program.setFile('source/main.bs', `
142
165
  class Bird
143
166
  sub new(name)
144
167
  end sub
145
168
  end class
146
169
  class Duck extends Bird
147
- sub new()
170
+ sub new(name)
148
171
  thing = { m: "m"}
149
172
  print thing.m
150
173
  name = "Donald" + "Duck"
@@ -153,54 +176,107 @@ describe('BrsFile BrighterScript classes', () => {
153
176
  end class
154
177
  `);
155
178
  program.validate();
156
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.be.undefined;
179
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
157
180
  });
158
181
  it('allows non-`m` expressions and statements before the super call', () => {
159
182
  program.setFile('source/main.bs', `
160
183
  class Bird
161
- sub new(name)
184
+ name as string
185
+ sub new(name as string)
186
+ m.name = name
162
187
  end sub
163
188
  end class
164
189
  class Duck extends Bird
165
190
  sub new()
166
191
  m.name = m.name + "Duck"
167
- super()
192
+ super("Flappy")
168
193
  end sub
169
194
  end class
170
195
  `);
171
196
  program.validate();
172
- chai_1.expect(program.getDiagnostics().map(x => ({ message: x.message, range: x.range }))).to.eql([{
173
- message: DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall().message,
174
- range: vscode_languageserver_1.Range.create(7, 24, 7, 25)
175
- }, {
176
- message: DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall().message,
177
- range: vscode_languageserver_1.Range.create(7, 33, 7, 34)
178
- }]);
197
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall()), { location: { range: vscode_languageserver_1.Range.create(9, 24, 9, 25) } }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall()), { location: { range: vscode_languageserver_1.Range.create(9, 33, 9, 34) } })]);
179
198
  });
180
199
  });
181
200
  describe('transpile', () => {
182
- it('follows correct sequence for property initializers', () => {
183
- testTranspile(`
201
+ it('does not mess with AST when injecting `super()` call', async () => {
202
+ const file = program.setFile('source/classes.bs', `
203
+ class Parent
204
+ end class
205
+
206
+ class Child extends parent
207
+ sub new()
208
+ super()
209
+ end sub
210
+ end class
211
+ `);
212
+ (0, chai_config_spec_1.expect)(file.ast.statements[1].body[0].func.body.statements[0].expression.callee.tokens.name.text).to.eql('super');
213
+ await program.getTranspiledFileContents(file.srcPath);
214
+ (0, chai_config_spec_1.expect)(file.ast.statements[1].body[0].func.body.statements[0].expression.callee.tokens.name.text).to.eql('super');
215
+ });
216
+ it('follows correct sequence for property initializers', async () => {
217
+ await testTranspile(`
184
218
  class Animal
185
219
  species1 = "Animal"
186
220
  sub new()
187
- print "From Animal: " + m.species
221
+ print "From Animal: " + m.species1
188
222
  end sub
189
223
  end class
190
224
  class Duck extends Animal
191
225
  species2 = "Duck"
192
226
  sub new()
193
227
  super()
194
- print "From Duck: " + m.species
228
+ print "From Duck: " + m.species2
195
229
  end sub
196
230
  end class
197
231
  `, `
232
+ sub __Animal_method_new()
233
+ m.species1 = "Animal"
234
+ print "From Animal: " + m.species1
235
+ end sub
198
236
  function __Animal_builder()
199
237
  instance = {}
200
- instance.new = sub()
201
- m.species1 = "Animal"
202
- print "From Animal: " + m.species
238
+ instance.new = __Animal_method_new
239
+ return instance
240
+ end function
241
+ function Animal()
242
+ instance = __Animal_builder()
243
+ instance.new()
244
+ return instance
245
+ end function
246
+ sub __Duck_method_new()
247
+ m.super0_new()
248
+ m.species2 = "Duck"
249
+ print "From Duck: " + m.species2
250
+ end sub
251
+ function __Duck_builder()
252
+ instance = __Animal_builder()
253
+ instance.super0_new = instance.new
254
+ instance.new = __Duck_method_new
255
+ return instance
256
+ end function
257
+ function Duck()
258
+ instance = __Duck_builder()
259
+ instance.new()
260
+ return instance
261
+ end function
262
+ `, 'trim', 'source/main.bs');
263
+ });
264
+ it('allows comments as first line of constructor', async () => {
265
+ await testTranspile(`
266
+ class Animal
267
+ end class
268
+ class Duck extends Animal
269
+ sub new()
270
+ 'comment should not cause double super call
271
+ super()
203
272
  end sub
273
+ end class
274
+ `, `
275
+ sub __Animal_method_new()
276
+ end sub
277
+ function __Animal_builder()
278
+ instance = {}
279
+ instance.new = __Animal_method_new
204
280
  return instance
205
281
  end function
206
282
  function Animal()
@@ -208,14 +284,54 @@ describe('BrsFile BrighterScript classes', () => {
208
284
  instance.new()
209
285
  return instance
210
286
  end function
287
+ sub __Duck_method_new()
288
+ 'comment should not cause double super call
289
+ m.super0_new()
290
+ end sub
211
291
  function __Duck_builder()
212
292
  instance = __Animal_builder()
213
293
  instance.super0_new = instance.new
214
- instance.new = sub()
215
- m.super0_new()
216
- m.species2 = "Duck"
217
- print "From Duck: " + m.species
294
+ instance.new = __Duck_method_new
295
+ return instance
296
+ end function
297
+ function Duck()
298
+ instance = __Duck_builder()
299
+ instance.new()
300
+ return instance
301
+ end function
302
+ `);
303
+ });
304
+ it('does not inject a call to super if one exists', async () => {
305
+ await testTranspile(`
306
+ class Animal
307
+ end class
308
+ class Duck extends Animal
309
+ sub new()
310
+ print "I am a statement which does not use m"
311
+ super()
218
312
  end sub
313
+ end class
314
+ `, `
315
+ sub __Animal_method_new()
316
+ end sub
317
+ function __Animal_builder()
318
+ instance = {}
319
+ instance.new = __Animal_method_new
320
+ return instance
321
+ end function
322
+ function Animal()
323
+ instance = __Animal_builder()
324
+ instance.new()
325
+ return instance
326
+ end function
327
+ sub __Duck_method_new()
328
+ print "I am a statement which does not use m"
329
+ m.super0_new()
330
+ end sub
331
+ function __Duck_builder()
332
+ instance = __Animal_builder()
333
+ instance.super0_new = instance.new
334
+ instance.new = __Duck_method_new
219
335
  return instance
220
336
  end function
221
337
  function Duck()
@@ -223,10 +339,10 @@ describe('BrsFile BrighterScript classes', () => {
223
339
  instance.new()
224
340
  return instance
225
341
  end function
226
- `, 'trim', 'source/main.bs');
342
+ `);
227
343
  });
228
- it('handles class inheritance inferred constructor calls', () => {
229
- testTranspile(`
344
+ it('handles class inheritance inferred constructor calls', async () => {
345
+ await testTranspile(`
230
346
  class Animal
231
347
  className1 = "Animal"
232
348
  end class
@@ -237,11 +353,12 @@ describe('BrsFile BrighterScript classes', () => {
237
353
  className3 = "BabyDuck"
238
354
  end class
239
355
  `, `
356
+ sub __Animal_method_new()
357
+ m.className1 = "Animal"
358
+ end sub
240
359
  function __Animal_builder()
241
360
  instance = {}
242
- instance.new = sub()
243
- m.className1 = "Animal"
244
- end sub
361
+ instance.new = __Animal_method_new
245
362
  return instance
246
363
  end function
247
364
  function Animal()
@@ -249,13 +366,14 @@ describe('BrsFile BrighterScript classes', () => {
249
366
  instance.new()
250
367
  return instance
251
368
  end function
369
+ sub __Duck_method_new()
370
+ m.super0_new()
371
+ m.className2 = "Duck"
372
+ end sub
252
373
  function __Duck_builder()
253
374
  instance = __Animal_builder()
254
375
  instance.super0_new = instance.new
255
- instance.new = sub()
256
- m.super0_new()
257
- m.className2 = "Duck"
258
- end sub
376
+ instance.new = __Duck_method_new
259
377
  return instance
260
378
  end function
261
379
  function Duck()
@@ -263,13 +381,14 @@ describe('BrsFile BrighterScript classes', () => {
263
381
  instance.new()
264
382
  return instance
265
383
  end function
384
+ sub __BabyDuck_method_new()
385
+ m.super1_new()
386
+ m.className3 = "BabyDuck"
387
+ end sub
266
388
  function __BabyDuck_builder()
267
389
  instance = __Duck_builder()
268
390
  instance.super1_new = instance.new
269
- instance.new = sub()
270
- m.super1_new()
271
- m.className3 = "BabyDuck"
272
- end sub
391
+ instance.new = __BabyDuck_method_new
273
392
  return instance
274
393
  end function
275
394
  function BabyDuck()
@@ -279,8 +398,8 @@ describe('BrsFile BrighterScript classes', () => {
279
398
  end function
280
399
  `, undefined, 'source/main.bs');
281
400
  });
282
- it('works with namespaces', () => {
283
- testTranspile(`
401
+ it('works with namespaces', async () => {
402
+ await testTranspile(`
284
403
  namespace Birds.WaterFowl
285
404
  class Duck
286
405
  end class
@@ -288,10 +407,11 @@ describe('BrsFile BrighterScript classes', () => {
288
407
  end class
289
408
  end namespace
290
409
  `, `
410
+ sub __Birds_WaterFowl_Duck_method_new()
411
+ end sub
291
412
  function __Birds_WaterFowl_Duck_builder()
292
413
  instance = {}
293
- instance.new = sub()
294
- end sub
414
+ instance.new = __Birds_WaterFowl_Duck_method_new
295
415
  return instance
296
416
  end function
297
417
  function Birds_WaterFowl_Duck()
@@ -299,12 +419,13 @@ describe('BrsFile BrighterScript classes', () => {
299
419
  instance.new()
300
420
  return instance
301
421
  end function
422
+ sub __Birds_WaterFowl_BabyDuck_method_new()
423
+ m.super0_new()
424
+ end sub
302
425
  function __Birds_WaterFowl_BabyDuck_builder()
303
426
  instance = __Birds_WaterFowl_Duck_builder()
304
427
  instance.super0_new = instance.new
305
- instance.new = sub()
306
- m.super0_new()
307
- end sub
428
+ instance.new = __Birds_WaterFowl_BabyDuck_method_new
308
429
  return instance
309
430
  end function
310
431
  function Birds_WaterFowl_BabyDuck()
@@ -314,15 +435,16 @@ describe('BrsFile BrighterScript classes', () => {
314
435
  end function
315
436
  `, undefined, 'source/main.bs');
316
437
  });
317
- it('works for simple class', () => {
318
- testTranspile(`
438
+ it('works for simple class', async () => {
439
+ await testTranspile(`
319
440
  class Duck
320
441
  end class
321
442
  `, `
443
+ sub __Duck_method_new()
444
+ end sub
322
445
  function __Duck_builder()
323
446
  instance = {}
324
- instance.new = sub()
325
- end sub
447
+ instance.new = __Duck_method_new
326
448
  return instance
327
449
  end function
328
450
  function Duck()
@@ -332,17 +454,94 @@ describe('BrsFile BrighterScript classes', () => {
332
454
  end function
333
455
  `, undefined, 'source/main.bs');
334
456
  });
335
- it('registers the constructor and properly handles its parameters', () => {
336
- testTranspile(`
457
+ it('inherits the parameters of the last known constructor', async () => {
458
+ await testTranspile(`
459
+ class Animal
460
+ sub new(p1)
461
+ end sub
462
+ end class
463
+ class Bird extends Animal
464
+ end class
465
+ class Duck extends Bird
466
+ sub new(p1, p2)
467
+ super(p1)
468
+ m.p2 = p2
469
+ end sub
470
+ private p2 as dynamic
471
+ end class
472
+ class BabyDuck extends Duck
473
+ end class
474
+ `, `
475
+ sub __Animal_method_new(p1)
476
+ end sub
477
+ function __Animal_builder()
478
+ instance = {}
479
+ instance.new = __Animal_method_new
480
+ return instance
481
+ end function
482
+ function Animal(p1)
483
+ instance = __Animal_builder()
484
+ instance.new(p1)
485
+ return instance
486
+ end function
487
+ sub __Bird_method_new(p1)
488
+ m.super0_new(p1)
489
+ end sub
490
+ function __Bird_builder()
491
+ instance = __Animal_builder()
492
+ instance.super0_new = instance.new
493
+ instance.new = __Bird_method_new
494
+ return instance
495
+ end function
496
+ function Bird(p1)
497
+ instance = __Bird_builder()
498
+ instance.new(p1)
499
+ return instance
500
+ end function
501
+ sub __Duck_method_new(p1, p2)
502
+ m.super1_new(p1)
503
+ m.p2 = invalid
504
+ m.p2 = p2
505
+ end sub
506
+ function __Duck_builder()
507
+ instance = __Bird_builder()
508
+ instance.super1_new = instance.new
509
+ instance.new = __Duck_method_new
510
+ return instance
511
+ end function
512
+ function Duck(p1, p2)
513
+ instance = __Duck_builder()
514
+ instance.new(p1, p2)
515
+ return instance
516
+ end function
517
+ sub __BabyDuck_method_new(p1, p2)
518
+ m.super2_new(p1, p2)
519
+ end sub
520
+ function __BabyDuck_builder()
521
+ instance = __Duck_builder()
522
+ instance.super2_new = instance.new
523
+ instance.new = __BabyDuck_method_new
524
+ return instance
525
+ end function
526
+ function BabyDuck(p1, p2)
527
+ instance = __BabyDuck_builder()
528
+ instance.new(p1, p2)
529
+ return instance
530
+ end function
531
+ `);
532
+ });
533
+ it('registers the constructor and properly handles its parameters', async () => {
534
+ await testTranspile(`
337
535
  class Duck
338
536
  sub new(name as string, age as integer)
339
537
  end sub
340
538
  end class
341
539
  `, `
540
+ sub __Duck_method_new(name as string, age as integer)
541
+ end sub
342
542
  function __Duck_builder()
343
543
  instance = {}
344
- instance.new = sub(name as string, age as integer)
345
- end sub
544
+ instance.new = __Duck_method_new
346
545
  return instance
347
546
  end function
348
547
  function Duck(name as string, age as integer)
@@ -352,11 +551,14 @@ describe('BrsFile BrighterScript classes', () => {
352
551
  end function
353
552
  `, undefined, 'source/main.bs');
354
553
  });
355
- it('properly handles child class constructor override and super calls', () => {
356
- testTranspile(`
554
+ it('properly handles child class constructor override and super calls', async () => {
555
+ await testTranspile(`
357
556
  class Animal
358
557
  sub new(name as string)
359
558
  end sub
559
+
560
+ sub DoSomething()
561
+ end sub
360
562
  end class
361
563
 
362
564
  class Duck extends Animal
@@ -366,10 +568,14 @@ describe('BrsFile BrighterScript classes', () => {
366
568
  end sub
367
569
  end class
368
570
  `, `
571
+ sub __Animal_method_new(name as string)
572
+ end sub
573
+ sub __Animal_method_DoSomething()
574
+ end sub
369
575
  function __Animal_builder()
370
576
  instance = {}
371
- instance.new = sub(name as string)
372
- end sub
577
+ instance.new = __Animal_method_new
578
+ instance.DoSomething = __Animal_method_DoSomething
373
579
  return instance
374
580
  end function
375
581
  function Animal(name as string)
@@ -377,13 +583,14 @@ describe('BrsFile BrighterScript classes', () => {
377
583
  instance.new(name)
378
584
  return instance
379
585
  end function
586
+ sub __Duck_method_new(name as string, age as integer)
587
+ m.super0_new(name)
588
+ m.super0_DoSomething()
589
+ end sub
380
590
  function __Duck_builder()
381
591
  instance = __Animal_builder()
382
592
  instance.super0_new = instance.new
383
- instance.new = sub(name as string, age as integer)
384
- m.super0_new(name)
385
- m.super0_DoSomething()
386
- end sub
593
+ instance.new = __Duck_method_new
387
594
  return instance
388
595
  end function
389
596
  function Duck(name as string, age as integer)
@@ -393,8 +600,8 @@ describe('BrsFile BrighterScript classes', () => {
393
600
  end function
394
601
  `, undefined, 'source/main.bs');
395
602
  });
396
- it('transpiles super in nested blocks', () => {
397
- testTranspile(`
603
+ it('transpiles super in nested blocks', async () => {
604
+ await testTranspile(`
398
605
  class Creature
399
606
  sub new(name as string)
400
607
  end sub
@@ -412,13 +619,15 @@ describe('BrsFile BrighterScript classes', () => {
412
619
  end function
413
620
  end class
414
621
  `, `
622
+ sub __Creature_method_new(name as string)
623
+ end sub
624
+ function __Creature_method_sayHello(text)
625
+ ? text
626
+ end function
415
627
  function __Creature_builder()
416
628
  instance = {}
417
- instance.new = sub(name as string)
418
- end sub
419
- instance.sayHello = function(text)
420
- ? text
421
- end function
629
+ instance.new = __Creature_method_new
630
+ instance.sayHello = __Creature_method_sayHello
422
631
  return instance
423
632
  end function
424
633
  function Creature(name as string)
@@ -426,29 +635,31 @@ describe('BrsFile BrighterScript classes', () => {
426
635
  instance.new(name)
427
636
  return instance
428
637
  end function
638
+ sub __Duck_method_new(name as string)
639
+ m.super0_new(name)
640
+ end sub
641
+ function __Duck_method_sayHello(text)
642
+ text = "The duck says " + text
643
+ if text <> invalid
644
+ m.super0_sayHello(text)
645
+ end if
646
+ end function
429
647
  function __Duck_builder()
430
648
  instance = __Creature_builder()
431
649
  instance.super0_new = instance.new
432
- instance.new = sub()
433
- m.super0_new()
434
- end sub
650
+ instance.new = __Duck_method_new
435
651
  instance.super0_sayHello = instance.sayHello
436
- instance.sayHello = function(text)
437
- text = "The duck says " + text
438
- if text <> invalid then
439
- m.super0_sayHello(text)
440
- end if
441
- end function
652
+ instance.sayHello = __Duck_method_sayHello
442
653
  return instance
443
654
  end function
444
- function Duck()
655
+ function Duck(name as string)
445
656
  instance = __Duck_builder()
446
- instance.new()
657
+ instance.new(name)
447
658
  return instance
448
659
  end function
449
660
  `, 'trim', 'source/main.bs');
450
661
  });
451
- it('properly transpiles classes from outside current namespace', () => {
662
+ it('properly transpiles classes from outside current namespace', async () => {
452
663
  addFile('source/Animals.bs', `
453
664
  namespace Animals
454
665
  class Duck
@@ -457,7 +668,7 @@ describe('BrsFile BrighterScript classes', () => {
457
668
  class Bird
458
669
  end class
459
670
  `);
460
- testTranspile(`
671
+ await testTranspile(`
461
672
  namespace Animals
462
673
  sub init()
463
674
  donaldDuck = new Duck()
@@ -473,8 +684,8 @@ describe('BrsFile BrighterScript classes', () => {
473
684
  end sub
474
685
  `, undefined, 'source/main.bs');
475
686
  });
476
- it('properly transpiles new statement for missing class ', () => {
477
- testTranspile(`
687
+ it('properly transpiles new statement for missing class ', async () => {
688
+ await testTranspile(`
478
689
  sub main()
479
690
  bob = new Human()
480
691
  end sub
@@ -484,14 +695,14 @@ describe('BrsFile BrighterScript classes', () => {
484
695
  end sub
485
696
  `, undefined, 'source/main.bs', false);
486
697
  });
487
- it('new keyword transpiles correctly', () => {
698
+ it('new keyword transpiles correctly', async () => {
488
699
  addFile('source/Animal.bs', `
489
700
  class Animal
490
701
  sub new(name as string)
491
702
  end sub
492
703
  end class
493
704
  `);
494
- testTranspile(`
705
+ await testTranspile(`
495
706
  sub main()
496
707
  a = new Animal("donald")
497
708
  end sub
@@ -501,8 +712,76 @@ describe('BrsFile BrighterScript classes', () => {
501
712
  end sub
502
713
  `, undefined, 'source/main.bs');
503
714
  });
504
- it('does not screw up local variable references', () => {
505
- testTranspile(`
715
+ it('calls super ', async () => {
716
+ const { file } = await testTranspile(`
717
+ class Parent
718
+ sub new()
719
+ end sub
720
+ end class
721
+ class Child extends Parent
722
+ sub new()
723
+ end sub
724
+ end class
725
+ `, `
726
+ sub __Parent_method_new()
727
+ end sub
728
+ function __Parent_builder()
729
+ instance = {}
730
+ instance.new = __Parent_method_new
731
+ return instance
732
+ end function
733
+ function Parent()
734
+ instance = __Parent_builder()
735
+ instance.new()
736
+ return instance
737
+ end function
738
+ sub __Child_method_new()
739
+ m.super0_new()
740
+ end sub
741
+ function __Child_builder()
742
+ instance = __Parent_builder()
743
+ instance.super0_new = instance.new
744
+ instance.new = __Child_method_new
745
+ return instance
746
+ end function
747
+ function Child()
748
+ instance = __Child_builder()
749
+ instance.new()
750
+ return instance
751
+ end function
752
+ `, undefined, undefined, false);
753
+ //the AST should not be permanently modified
754
+ const constructor = file.ast.statements[0].body[0];
755
+ (0, chai_config_spec_1.expect)(constructor.func.body.statements).to.be.lengthOf(0);
756
+ });
757
+ it('adds field initializers', async () => {
758
+ const { file } = await testTranspile(`
759
+ class Person
760
+ sub new()
761
+ end sub
762
+ name = "Bob"
763
+ end class
764
+ `, `
765
+ sub __Person_method_new()
766
+ m.name = "Bob"
767
+ end sub
768
+ function __Person_builder()
769
+ instance = {}
770
+ instance.new = __Person_method_new
771
+ return instance
772
+ end function
773
+ function Person()
774
+ instance = __Person_builder()
775
+ instance.new()
776
+ return instance
777
+ end function
778
+ `);
779
+ //the AST should not be permanently modified
780
+ const constructor = file.ast.statements[0].body[0];
781
+ (0, chai_config_spec_1.expect)(constructor.func.body.statements).to.be.lengthOf(0);
782
+ });
783
+ it('does not screw up local variable references', async () => {
784
+ await testTranspile(`
506
785
  class Animal
507
786
  sub new(name as string)
508
787
  m.name = name
@@ -543,15 +822,17 @@ describe('BrsFile BrighterScript classes', () => {
543
822
  '> Waddling...\\nDewey moved 2 meters\\nFell over...I'm new at this
544
823
  end sub
545
824
  `, `
825
+ sub __Animal_method_new(name as string)
826
+ m.name = invalid
827
+ m.name = name
828
+ end sub
829
+ sub __Animal_method_move(distanceInMeters as integer)
830
+ print m.name + " moved " + distanceInMeters.ToStr() + " meters"
831
+ end sub
546
832
  function __Animal_builder()
547
833
  instance = {}
548
- instance.new = sub(name as string)
549
- m.name = invalid
550
- m.name = name
551
- end sub
552
- instance.move = sub(distanceInMeters as integer)
553
- print m.name + " moved " + distanceInMeters.ToStr() + " meters"
554
- end sub
834
+ instance.new = __Animal_method_new
835
+ instance.move = __Animal_method_move
555
836
  return instance
556
837
  end function
557
838
  function Animal(name as string)
@@ -559,40 +840,44 @@ describe('BrsFile BrighterScript classes', () => {
559
840
  instance.new(name)
560
841
  return instance
561
842
  end function
843
+ sub __Duck_method_new(name as string)
844
+ m.super0_new(name)
845
+ end sub
846
+ sub __Duck_method_move(distanceInMeters as integer)
847
+ print "Waddling..."
848
+ m.super0_move(distanceInMeters)
849
+ end sub
562
850
  function __Duck_builder()
563
851
  instance = __Animal_builder()
564
852
  instance.super0_new = instance.new
565
- instance.new = sub()
566
- m.super0_new()
567
- end sub
853
+ instance.new = __Duck_method_new
568
854
  instance.super0_move = instance.move
569
- instance.move = sub(distanceInMeters as integer)
570
- print "Waddling..."
571
- m.super0_move(distanceInMeters)
572
- end sub
855
+ instance.move = __Duck_method_move
573
856
  return instance
574
857
  end function
575
- function Duck()
858
+ function Duck(name as string)
576
859
  instance = __Duck_builder()
577
- instance.new()
860
+ instance.new(name)
578
861
  return instance
579
862
  end function
863
+ sub __BabyDuck_method_new(name as string)
864
+ m.super1_new(name)
865
+ end sub
866
+ sub __BabyDuck_method_move(distanceInMeters as integer)
867
+ m.super1_move(distanceInMeters)
868
+ print "Fell over...I'm new at this"
869
+ end sub
580
870
  function __BabyDuck_builder()
581
871
  instance = __Duck_builder()
582
872
  instance.super1_new = instance.new
583
- instance.new = sub()
584
- m.super1_new()
585
- end sub
873
+ instance.new = __BabyDuck_method_new
586
874
  instance.super1_move = instance.move
587
- instance.move = sub(distanceInMeters as integer)
588
- m.super1_move(distanceInMeters)
589
- print "Fell over...I'm new at this"
590
- end sub
875
+ instance.move = __BabyDuck_method_move
591
876
  return instance
592
877
  end function
593
- function BabyDuck()
878
+ function BabyDuck(name as string)
594
879
  instance = __BabyDuck_builder()
595
- instance.new()
880
+ instance.new(name)
596
881
  return instance
597
882
  end function
598
883
 
@@ -600,17 +885,19 @@ describe('BrsFile BrighterScript classes', () => {
600
885
  smokey = Animal("Smokey")
601
886
  smokey.move(1)
602
887
  '> Bear moved 1 meters
888
+
603
889
  donald = Duck("Donald")
604
890
  donald.move(2)
605
891
  '> Waddling...\\nDonald moved 2 meters
892
+
606
893
  dewey = BabyDuck("Dewey")
607
894
  dewey.move(3)
608
895
  '> Waddling...\\nDewey moved 2 meters\\nFell over...I'm new at this
609
896
  end sub
610
897
  `, 'trim', 'source/main.bs');
611
898
  });
612
- it('calculates the proper super index', () => {
613
- testTranspile(`
899
+ it('calculates the proper super index', async () => {
900
+ await testTranspile(`
614
901
  class Duck
615
902
  public sub walk(meters as integer)
616
903
  print "Walked " + meters.ToStr() + " meters"
@@ -624,13 +911,15 @@ describe('BrsFile BrighterScript classes', () => {
624
911
  end sub
625
912
  end class
626
913
  `, `
914
+ sub __Duck_method_new()
915
+ end sub
916
+ sub __Duck_method_walk(meters as integer)
917
+ print "Walked " + meters.ToStr() + " meters"
918
+ end sub
627
919
  function __Duck_builder()
628
920
  instance = {}
629
- instance.new = sub()
630
- end sub
631
- instance.walk = sub(meters as integer)
632
- print "Walked " + meters.ToStr() + " meters"
633
- end sub
921
+ instance.new = __Duck_method_new
922
+ instance.walk = __Duck_method_walk
634
923
  return instance
635
924
  end function
636
925
  function Duck()
@@ -638,17 +927,19 @@ describe('BrsFile BrighterScript classes', () => {
638
927
  instance.new()
639
928
  return instance
640
929
  end function
930
+ sub __BabyDuck_method_new()
931
+ m.super0_new()
932
+ end sub
933
+ sub __BabyDuck_method_walk(meters as integer)
934
+ print "Tripped"
935
+ m.super0_walk(meters)
936
+ end sub
641
937
  function __BabyDuck_builder()
642
938
  instance = __Duck_builder()
643
939
  instance.super0_new = instance.new
644
- instance.new = sub()
645
- m.super0_new()
646
- end sub
940
+ instance.new = __BabyDuck_method_new
647
941
  instance.super0_walk = instance.walk
648
- instance.walk = sub(meters as integer)
649
- print "Tripped"
650
- m.super0_walk(meters)
651
- end sub
942
+ instance.walk = __BabyDuck_method_walk
652
943
  return instance
653
944
  end function
654
945
  function BabyDuck()
@@ -658,22 +949,391 @@ describe('BrsFile BrighterScript classes', () => {
658
949
  end function
659
950
  `, 'trim', 'source/main.bs');
660
951
  });
661
- });
662
- it('detects using `new` keyword on non-classes', () => {
663
- var _a;
664
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
665
- sub quack()
666
- end sub
667
- sub main()
668
- duck = new quack()
669
- end sub
670
- `);
671
- program.validate();
672
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('sub').message);
673
- });
674
- it('detects missing call to super', () => {
675
- var _a;
676
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
952
+ it('adds namespacing to constructors on field definitions', async () => {
953
+ await testTranspile(`
954
+ namespace MyNS
955
+ class KlassOne
956
+ other = new KlassTwo()
957
+ end class
958
+
959
+ class KlassTwo
960
+ end class
961
+ end namespace
962
+ `, `
963
+ sub __MyNS_KlassOne_method_new()
964
+ m.other = MyNS_KlassTwo()
965
+ end sub
966
+ function __MyNS_KlassOne_builder()
967
+ instance = {}
968
+ instance.new = __MyNS_KlassOne_method_new
969
+ return instance
970
+ end function
971
+ function MyNS_KlassOne()
972
+ instance = __MyNS_KlassOne_builder()
973
+ instance.new()
974
+ return instance
975
+ end function
976
+ sub __MyNS_KlassTwo_method_new()
977
+ end sub
978
+ function __MyNS_KlassTwo_builder()
979
+ instance = {}
980
+ instance.new = __MyNS_KlassTwo_method_new
981
+ return instance
982
+ end function
983
+ function MyNS_KlassTwo()
984
+ instance = __MyNS_KlassTwo_builder()
985
+ instance.new()
986
+ return instance
987
+ end function
988
+ `, 'trim', 'source/main.bs');
989
+ });
990
+ it('works with enums as field initial values inside a namespace', async () => {
991
+ await testTranspile(`
992
+ namespace MyNS
993
+ class HasEnumKlass
994
+ enumValue = MyEnum.A
995
+ end class
996
+ enum MyEnum
997
+ A = "A"
998
+ B = "B"
999
+ end enum
1000
+ end namespace
1001
+ `, `
1002
+ sub __MyNS_HasEnumKlass_method_new()
1003
+ m.enumValue = "A"
1004
+ end sub
1005
+ function __MyNS_HasEnumKlass_builder()
1006
+ instance = {}
1007
+ instance.new = __MyNS_HasEnumKlass_method_new
1008
+ return instance
1009
+ end function
1010
+ function MyNS_HasEnumKlass()
1011
+ instance = __MyNS_HasEnumKlass_builder()
1012
+ instance.new()
1013
+ return instance
1014
+ end function
1015
+ `, 'trim', 'source/main.bs');
1016
+ });
1017
+ it('allows enums as super args inside a namespace', async () => {
1018
+ await testTranspile(`
1019
+ namespace MyNS
1020
+ class SubKlass extends SuperKlass
1021
+ sub new()
1022
+ super(MyEnum.B)
1023
+ end sub
1024
+ end class
1025
+
1026
+ class SuperKlass
1027
+ sub new(enumVal as MyEnum)
1028
+ print enumVal
1029
+ end sub
1030
+ end class
1031
+
1032
+ enum MyEnum
1033
+ A = "A"
1034
+ B = "B"
1035
+ end enum
1036
+ end namespace
1037
+ `, `
1038
+ sub __MyNS_SubKlass_method_new()
1039
+ m.super0_new("B")
1040
+ end sub
1041
+ function __MyNS_SubKlass_builder()
1042
+ instance = __MyNS_SuperKlass_builder()
1043
+ instance.super0_new = instance.new
1044
+ instance.new = __MyNS_SubKlass_method_new
1045
+ return instance
1046
+ end function
1047
+ function MyNS_SubKlass()
1048
+ instance = __MyNS_SubKlass_builder()
1049
+ instance.new()
1050
+ return instance
1051
+ end function
1052
+ sub __MyNS_SuperKlass_method_new(enumVal as dynamic)
1053
+ print enumVal
1054
+ end sub
1055
+ function __MyNS_SuperKlass_builder()
1056
+ instance = {}
1057
+ instance.new = __MyNS_SuperKlass_method_new
1058
+ return instance
1059
+ end function
1060
+ function MyNS_SuperKlass(enumVal as dynamic)
1061
+ instance = __MyNS_SuperKlass_builder()
1062
+ instance.new(enumVal)
1063
+ return instance
1064
+ end function
1065
+ `, 'trim', 'source/main.bs');
1066
+ });
1067
+ it('works with enums as values referenced in a namespace directly', async () => {
1068
+ await testTranspile(`
1069
+ namespace MyNS
1070
+ class HasEnumKlass
1071
+ myArray = [true, true] as boolean[]
1072
+ sub new()
1073
+ m.myArray[MyEnum.A] = true
1074
+ m.myArray[MyEnum.B] = false
1075
+ end sub
1076
+ end class
1077
+ enum MyEnum
1078
+ A = 0
1079
+ B = 1
1080
+ end enum
1081
+ end namespace
1082
+ `, `
1083
+ sub __MyNS_HasEnumKlass_method_new()
1084
+ m.myArray = [
1085
+ true
1086
+ true
1087
+ ]
1088
+ m.myArray[0] = true
1089
+ m.myArray[1] = false
1090
+ end sub
1091
+ function __MyNS_HasEnumKlass_builder()
1092
+ instance = {}
1093
+ instance.new = __MyNS_HasEnumKlass_method_new
1094
+ return instance
1095
+ end function
1096
+ function MyNS_HasEnumKlass()
1097
+ instance = __MyNS_HasEnumKlass_builder()
1098
+ instance.new()
1099
+ return instance
1100
+ end function
1101
+ `, 'trim', 'source/main.bs');
1102
+ });
1103
+ it('works with enums as values referenced in a namespace with namespace', async () => {
1104
+ await testTranspile(`
1105
+ namespace MyNS
1106
+ class HasEnumKlass
1107
+ myArray = [true, true] as boolean[]
1108
+ sub new()
1109
+ m.myArray[MyNS.MyEnum.A] = true
1110
+ m.myArray[MyNS.MyEnum.B] = false
1111
+ end sub
1112
+ end class
1113
+ enum MyEnum
1114
+ A = 0
1115
+ B = 1
1116
+ end enum
1117
+ end namespace
1118
+ `, `
1119
+ sub __MyNS_HasEnumKlass_method_new()
1120
+ m.myArray = [
1121
+ true
1122
+ true
1123
+ ]
1124
+ m.myArray[0] = true
1125
+ m.myArray[1] = false
1126
+ end sub
1127
+ function __MyNS_HasEnumKlass_builder()
1128
+ instance = {}
1129
+ instance.new = __MyNS_HasEnumKlass_method_new
1130
+ return instance
1131
+ end function
1132
+ function MyNS_HasEnumKlass()
1133
+ instance = __MyNS_HasEnumKlass_builder()
1134
+ instance.new()
1135
+ return instance
1136
+ end function
1137
+ `, 'trim', 'source/main.bs');
1138
+ });
1139
+ it('allows namespaced class function as function parameters', async () => {
1140
+ await testTranspile(`
1141
+ namespace Alpha
1142
+ function foo()
1143
+ return 1
1144
+ end function
1145
+
1146
+ function callSomeFunc(f as function)
1147
+ return f()
1148
+ end function
1149
+
1150
+ sub callFoo()
1151
+ callSomeFunc(foo)
1152
+ end sub
1153
+ end namespace
1154
+ `, `
1155
+ function Alpha_foo()
1156
+ return 1
1157
+ end function
1158
+
1159
+ function Alpha_callSomeFunc(f as function)
1160
+ return f()
1161
+ end function
1162
+
1163
+ sub Alpha_callFoo()
1164
+ Alpha_callSomeFunc(Alpha_foo)
1165
+ end sub
1166
+ `, 'trim', 'source/main.bs');
1167
+ });
1168
+ it('allows namespaced class constructors as function parameters', async () => {
1169
+ await testTranspile(`
1170
+ namespace Alpha
1171
+ class Button
1172
+ end class
1173
+
1174
+ function callSomeFunc(f as function)
1175
+ return f()
1176
+ end function
1177
+
1178
+ sub makeButton()
1179
+ callSomeFunc(Button)
1180
+ end sub
1181
+ end namespace
1182
+ `, `
1183
+ sub __Alpha_Button_method_new()
1184
+ end sub
1185
+ function __Alpha_Button_builder()
1186
+ instance = {}
1187
+ instance.new = __Alpha_Button_method_new
1188
+ return instance
1189
+ end function
1190
+ function Alpha_Button()
1191
+ instance = __Alpha_Button_builder()
1192
+ instance.new()
1193
+ return instance
1194
+ end function
1195
+
1196
+ function Alpha_callSomeFunc(f as function)
1197
+ return f()
1198
+ end function
1199
+
1200
+ sub Alpha_makeButton()
1201
+ Alpha_callSomeFunc(Alpha_Button)
1202
+ end sub
1203
+ `, 'trim', 'source/main.bs');
1204
+ });
1205
+ it('allows class constructors as functions in array', async () => {
1206
+ await testTranspile(`
1207
+ namespace Alpha
1208
+ class Button
1209
+ end class
1210
+
1211
+ class ButtonContainer
1212
+ private button = new Alpha.Button()
1213
+
1214
+ sub new()
1215
+ m.init()
1216
+ end sub
1217
+
1218
+ sub init()
1219
+ button = new Alpha.Button()
1220
+ items = [m.button, button, Alpha.Button]
1221
+ end sub
1222
+ end class
1223
+ end namespace
1224
+ `, `
1225
+ sub __Alpha_Button_method_new()
1226
+ end sub
1227
+ function __Alpha_Button_builder()
1228
+ instance = {}
1229
+ instance.new = __Alpha_Button_method_new
1230
+ return instance
1231
+ end function
1232
+ function Alpha_Button()
1233
+ instance = __Alpha_Button_builder()
1234
+ instance.new()
1235
+ return instance
1236
+ end function
1237
+ sub __Alpha_ButtonContainer_method_new()
1238
+ m.button = Alpha_Button()
1239
+ m.init()
1240
+ end sub
1241
+ sub __Alpha_ButtonContainer_method_init()
1242
+ button = Alpha_Button()
1243
+ items = [
1244
+ m.button
1245
+ button
1246
+ Alpha_Button
1247
+ ]
1248
+ end sub
1249
+ function __Alpha_ButtonContainer_builder()
1250
+ instance = {}
1251
+ instance.new = __Alpha_ButtonContainer_method_new
1252
+ instance.init = __Alpha_ButtonContainer_method_init
1253
+ return instance
1254
+ end function
1255
+ function Alpha_ButtonContainer()
1256
+ instance = __Alpha_ButtonContainer_builder()
1257
+ instance.new()
1258
+ return instance
1259
+ end function
1260
+ `, 'trim', 'source/main.bs');
1261
+ });
1262
+ it('puts leading comments from methods in correct place', async () => {
1263
+ await testTranspile(`
1264
+ class Duck
1265
+ ' hatch from egg
1266
+ sub new()
1267
+ end sub
1268
+ ' it must be a duck
1269
+ sub quack()
1270
+ ' what does a duck say?
1271
+ print "quack"
1272
+ end sub
1273
+ end class
1274
+ `, `
1275
+ ' hatch from egg
1276
+ sub __Duck_method_new()
1277
+ end sub
1278
+ ' it must be a duck
1279
+ sub __Duck_method_quack()
1280
+ ' what does a duck say?
1281
+ print "quack"
1282
+ end sub
1283
+ function __Duck_builder()
1284
+ instance = {}
1285
+ ' hatch from egg
1286
+ instance.new = __Duck_method_new
1287
+ ' it must be a duck
1288
+ instance.quack = __Duck_method_quack
1289
+ return instance
1290
+ end function
1291
+ function Duck()
1292
+ instance = __Duck_builder()
1293
+ instance.new()
1294
+ return instance
1295
+ end function
1296
+ `, undefined, 'source/main.bs');
1297
+ });
1298
+ it('puts leading comments from fields in correct place', async () => {
1299
+ await testTranspile(`
1300
+ class Duck
1301
+ ' what kind of duck?
1302
+ type as string = "mallard"
1303
+ end class
1304
+ `, `
1305
+ sub __Duck_method_new()
1306
+ ' what kind of duck?
1307
+ m.type = "mallard"
1308
+ end sub
1309
+ function __Duck_builder()
1310
+ instance = {}
1311
+ instance.new = __Duck_method_new
1312
+ return instance
1313
+ end function
1314
+ function Duck()
1315
+ instance = __Duck_builder()
1316
+ instance.new()
1317
+ return instance
1318
+ end function
1319
+ `, undefined, 'source/main.bs');
1320
+ });
1321
+ });
1322
+ it('detects using `new` keyword on non-classes', () => {
1323
+ program.setFile('source/main.bs', `
1324
+ sub quack()
1325
+ end sub
1326
+ sub main()
1327
+ duck = new quack()
1328
+ end sub
1329
+ `);
1330
+ program.validate();
1331
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1332
+ DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('quack')
1333
+ ]);
1334
+ });
1335
+ it('detects missing call to super', () => {
1336
+ program.setFile('source/main.bs', `
677
1337
  class Animal
678
1338
  sub new()
679
1339
  end sub
@@ -684,22 +1344,100 @@ describe('BrsFile BrighterScript classes', () => {
684
1344
  end class
685
1345
  `);
686
1346
  program.validate();
687
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall().message);
1347
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1348
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
1349
+ ]);
688
1350
  });
689
- it.skip('detects calls to unknown m methods', () => {
690
- var _a;
691
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
692
- class Animal
693
- sub new()
694
- m.methodThatDoesNotExist()
695
- end sub
1351
+ it('detects direct circular extends', () => {
1352
+ //direct
1353
+ program.setFile('source/Direct.bs', `
1354
+ class Parent extends Child
1355
+ end class
1356
+
1357
+ class Child extends Parent
1358
+ end class
1359
+ `);
1360
+ program.validate();
1361
+ (0, chai_config_spec_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
1362
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Child', 'Parent', 'Child']).message,
1363
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Parent', 'Child', 'Parent']).message
1364
+ ]);
1365
+ });
1366
+ it('detects indirect circular extends', () => {
1367
+ //direct
1368
+ program.setFile('source/Indirect.bs', `
1369
+ class Parent extends Grandchild
1370
+ end class
1371
+
1372
+ class Child extends Parent
1373
+ end class
1374
+
1375
+ class Grandchild extends Child
696
1376
  end class
697
1377
  `);
698
1378
  program.validate();
699
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.methodDoesNotExistOnType('methodThatDoesNotExist', 'Animal'));
1379
+ (0, chai_config_spec_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
1380
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Child', 'Parent', 'Grandchild', 'Child']).message,
1381
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Grandchild', 'Child', 'Parent', 'Grandchild']).message,
1382
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Parent', 'Grandchild', 'Child', 'Parent']).message
1383
+ ]);
1384
+ });
1385
+ it('transpiles super method calls twice', async () => {
1386
+ program.setFile('source/lib.bs', `
1387
+ class Being
1388
+ function think()
1389
+ print "thinking..."
1390
+ end function
1391
+ end class
1392
+
1393
+ class Human extends Being
1394
+ function think()
1395
+ super.think()
1396
+ end function
1397
+ end class
1398
+ `);
1399
+ await program.build({ outDir: testHelpers_spec_2.outDir });
1400
+ fsExtra.emptyDirSync(testHelpers_spec_2.outDir);
1401
+ await program.build({ outDir: testHelpers_spec_2.outDir });
1402
+ (0, chai_config_spec_1.expect)(fsExtra.readFileSync((0, util_1.standardizePath) `${testHelpers_spec_2.outDir}/source/lib.brs`).toString().trimEnd()).to.eql((0, testHelpers_spec_1.trim) `
1403
+ sub __Being_method_new()
1404
+ end sub
1405
+ function __Being_method_think()
1406
+ print "thinking..."
1407
+ end function
1408
+ function __Being_builder()
1409
+ instance = {}
1410
+ instance.new = __Being_method_new
1411
+ instance.think = __Being_method_think
1412
+ return instance
1413
+ end function
1414
+ function Being()
1415
+ instance = __Being_builder()
1416
+ instance.new()
1417
+ return instance
1418
+ end function
1419
+ sub __Human_method_new()
1420
+ m.super0_new()
1421
+ end sub
1422
+ function __Human_method_think()
1423
+ m.super0_think()
1424
+ end function
1425
+ function __Human_builder()
1426
+ instance = __Being_builder()
1427
+ instance.super0_new = instance.new
1428
+ instance.new = __Human_method_new
1429
+ instance.think = __Human_method_think
1430
+ return instance
1431
+ end function
1432
+ function Human()
1433
+ instance = __Human_builder()
1434
+ instance.new()
1435
+ return instance
1436
+ end function
1437
+ `);
700
1438
  });
701
1439
  it('detects duplicate member names', () => {
702
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1440
+ program.setFile('source/main.bs', `
703
1441
  class Animal
704
1442
  public name
705
1443
  public name
@@ -713,32 +1451,26 @@ describe('BrsFile BrighterScript classes', () => {
713
1451
  end class
714
1452
  `);
715
1453
  program.validate();
716
- let diagnostics = program.getDiagnostics().map(x => {
717
- return {
718
- code: x.code,
719
- message: x.message,
720
- range: x.range,
721
- severity: vscode_languageserver_1.DiagnosticSeverity.Error
722
- };
723
- });
724
- chai_1.expect(diagnostics).to.eql([Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { range: vscode_languageserver_1.Range.create(3, 23, 3, 27) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { range: vscode_languageserver_1.Range.create(4, 27, 4, 31) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { range: vscode_languageserver_1.Range.create(8, 27, 8, 30) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { range: vscode_languageserver_1.Range.create(10, 23, 10, 26) })]);
1454
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { location: { range: vscode_languageserver_1.Range.create(3, 23, 3, 27) } }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('name')), { location: { range: vscode_languageserver_1.Range.create(4, 27, 4, 31) } }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { location: { range: vscode_languageserver_1.Range.create(8, 27, 8, 30) } }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.duplicateIdentifier('age')), { location: { range: vscode_languageserver_1.Range.create(10, 23, 10, 26) } })]);
725
1455
  });
726
1456
  it('detects mismatched member type in child class', () => {
727
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1457
+ program.setFile('source/main.bs', `
728
1458
  class Animal
729
1459
  public name
730
1460
  end class
731
1461
  class Duck extends Animal
732
- public function name()
1462
+ public override function name()
733
1463
  return "Donald"
734
1464
  end function
735
1465
  end class
736
1466
  `);
737
1467
  program.validate();
738
- chai_1.expect(program.getDiagnostics().map(x => x.message).sort()[0]).to.eql(DiagnosticMessages_1.DiagnosticMessages.classChildMemberDifferentMemberTypeThanAncestor('method', 'field', 'Animal').message);
1468
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1469
+ DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Animal', 'name', 'function name() as dynamic', 'dynamic')
1470
+ ]);
739
1471
  });
740
1472
  it('allows untyped overridden field in child class', () => {
741
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1473
+ program.setFile('source/main.bs', `
742
1474
  class Animal
743
1475
  public name
744
1476
  end class
@@ -747,7 +1479,7 @@ describe('BrsFile BrighterScript classes', () => {
747
1479
  end class
748
1480
  `);
749
1481
  program.validate();
750
- testHelpers_spec_1.expectZeroDiagnostics(program);
1482
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
751
1483
  });
752
1484
  it('allows overridden property name in child class', () => {
753
1485
  program.setFile('source/main.bs', `
@@ -759,7 +1491,7 @@ describe('BrsFile BrighterScript classes', () => {
759
1491
  end class
760
1492
  `);
761
1493
  program.validate();
762
- testHelpers_spec_1.expectZeroDiagnostics(program);
1494
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
763
1495
  });
764
1496
  it('flags incompatible child field type changes', () => {
765
1497
  program.setFile('source/main.bs', `
@@ -769,21 +1501,20 @@ describe('BrsFile BrighterScript classes', () => {
769
1501
  public owner as Person
770
1502
  end class
771
1503
  class Duck extends Bird
772
- public age = 12.2 'should be integer but is float
1504
+ public age = 12.2 'should be integer, but a float can be assigned to an int
773
1505
  public name = 12 'should be string but is integer
774
1506
  public owner as string
775
1507
  end class
776
1508
  `);
777
1509
  program.validate();
778
- chai_1.expect(program.getDiagnostics().map(x => x.message).sort()).to.eql([
779
- DiagnosticMessages_1.DiagnosticMessages.cannotFindType('Person').message,
780
- DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'age', 'float', 'integer').message,
781
- DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'name', 'integer', 'string').message,
782
- DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person').message
1510
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1511
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Person'),
1512
+ DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'name', 'integer', 'string'),
1513
+ DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person')
783
1514
  ]);
784
1515
  });
785
1516
  it('detects overridden methods without override keyword', () => {
786
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1517
+ program.setFile('source/main.bs', `
787
1518
  class Animal
788
1519
  sub speak()
789
1520
  end sub
@@ -794,10 +1525,12 @@ describe('BrsFile BrighterScript classes', () => {
794
1525
  end class
795
1526
  `);
796
1527
  program.validate();
797
- chai_1.expect(program.getDiagnostics()[0]).to.exist.and.to.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')));
1528
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1529
+ DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')
1530
+ ]);
798
1531
  });
799
1532
  it('detects overridden methods with different visibility', () => {
800
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1533
+ program.setFile('source/main.bs', `
801
1534
  class Animal
802
1535
  sub speakInPublic()
803
1536
  end sub
@@ -816,12 +1549,14 @@ describe('BrsFile BrighterScript classes', () => {
816
1549
  end class
817
1550
  `);
818
1551
  program.validate();
819
- chai_1.expect(program.getDiagnostics()[0]).to.exist.and.to.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakInPublic', 'private', 'public', 'Animal')));
820
- chai_1.expect(program.getDiagnostics()[1]).to.exist.and.to.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFriends', 'public', 'protected', 'Animal')));
821
- chai_1.expect(program.getDiagnostics()[2]).to.exist.and.to.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFamily', 'public', 'private', 'Animal')));
1552
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1553
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakInPublic', 'private', 'public', 'Animal'),
1554
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFriends', 'public', 'protected', 'Animal'),
1555
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFamily', 'public', 'private', 'Animal')
1556
+ ]);
822
1557
  });
823
1558
  it('allows overridden methods with matching visibility', () => {
824
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1559
+ program.setFile('source/main.bs', `
825
1560
  class Animal
826
1561
  sub speakInPublic()
827
1562
  end sub
@@ -840,20 +1575,93 @@ describe('BrsFile BrighterScript classes', () => {
840
1575
  end class
841
1576
  `);
842
1577
  program.validate();
843
- chai_1.expect(program.getDiagnostics()).to.be.empty;
1578
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
844
1579
  });
845
- it('detects extending unknown parent class', () => {
846
- program.setFile('source/main.brs', `
847
- class Duck extends Animal
848
- sub speak()
849
- end sub
850
- end class
851
- `);
852
- program.validate();
853
- chai_1.expect(program.getDiagnostics()[0]).to.exist.and.to.deep.include(Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Animal', 'source')), { range: vscode_languageserver_1.Range.create(1, 31, 1, 37) }));
1580
+ describe('detects unknown parent class', () => {
1581
+ it('non-namespaced parent from outside namespace', () => {
1582
+ program.setFile('source/main.bs', `
1583
+ class Duck extends Animal
1584
+ sub speak()
1585
+ end sub
1586
+ end class
1587
+
1588
+ namespace Vertibrates
1589
+ class Animal
1590
+ end class
1591
+ end namespace
1592
+ `);
1593
+ program.validate();
1594
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')), { location: { range: vscode_languageserver_1.Range.create(1, 35, 1, 41) } })]);
1595
+ });
1596
+ it('non-namespaced parent from within namespace', () => {
1597
+ program.setFile('source/main.bs', `
1598
+ namespace Vertibrates
1599
+ class Duck extends Animal
1600
+ sub speak()
1601
+ end sub
1602
+ end class
1603
+ end namespace
1604
+ `);
1605
+ program.validate();
1606
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1607
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')
1608
+ ]);
1609
+ });
1610
+ it('non-namespaced name from outside namespace alongside existing namespace', () => {
1611
+ program.setFile('source/main.bs', `
1612
+ namespace Vertibrates
1613
+ class Animal
1614
+ end class
1615
+ end namespace
1616
+
1617
+ class Duck extends Animal
1618
+ sub speak()
1619
+ end sub
1620
+ end class
1621
+ `);
1622
+ program.validate();
1623
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1624
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')
1625
+ ]);
1626
+ });
1627
+ it('namespaced parent class from outside namespace', () => {
1628
+ program.setFile('source/vertibrates.bs', `
1629
+ namespace Vertibrates
1630
+ class Bird
1631
+ end class
1632
+ end namespace
1633
+ `);
1634
+ program.setFile('source/Duck.bs', `
1635
+ class Duck extends Vertibrates.GroundedBird
1636
+ sub speak()
1637
+ end sub
1638
+ end class
1639
+ `);
1640
+ program.validate();
1641
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.cannotFindName('GroundedBird', 'Vertibrates.GroundedBird', 'Vertibrates', 'namespace'))]);
1642
+ });
1643
+ it('namespaced parent class from inside namespace', () => {
1644
+ program.setFile('source/vertibrates.bs', `
1645
+ namespace Vertibrates
1646
+ class Bird
1647
+ end class
1648
+ end namespace
1649
+ `);
1650
+ program.setFile('source/Duck.bs', `
1651
+ namespace Birdies
1652
+ class Duck extends Vertibrates.GroundedBird
1653
+ sub speak()
1654
+ end sub
1655
+ end class
1656
+ end namespace
1657
+ `);
1658
+ program.validate();
1659
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1660
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('GroundedBird', 'Vertibrates.GroundedBird', 'Vertibrates', 'namespace').message
1661
+ ]);
1662
+ });
854
1663
  });
855
1664
  it('catches newable class without namespace name', () => {
856
- var _a;
857
1665
  program.setFile('source/main.bs', `
858
1666
  namespace NameA.NameB
859
1667
  class Duck
@@ -865,11 +1673,13 @@ describe('BrsFile BrighterScript classes', () => {
865
1673
  end sub
866
1674
  `);
867
1675
  program.validate();
868
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Duck', 'source').message);
1676
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1677
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindFunction('Duck').message,
1678
+ DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('Duck')
1679
+ ]);
869
1680
  });
870
1681
  it('supports newable class namespace inference', () => {
871
- var _a;
872
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1682
+ program.setFile('source/main.bs', `
873
1683
  namespace NameA.NameB
874
1684
  class Duck
875
1685
  end class
@@ -879,24 +1689,24 @@ describe('BrsFile BrighterScript classes', () => {
879
1689
  end namespace
880
1690
  `);
881
1691
  program.validate();
882
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
1692
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
883
1693
  });
884
1694
  it('catches extending unknown namespaced class', () => {
885
- var _a;
886
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1695
+ program.setFile('source/main.bs', `
887
1696
  namespace NameA.NameB
888
1697
  class Animal
889
1698
  end class
890
- class Duck extends NameA.NameB.Animal1
1699
+ class Duck extends NameA.NameB.AnimalNotDefined
891
1700
  end class
892
1701
  end namespace
893
1702
  `);
894
1703
  program.validate();
895
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('NameA.NameB.Animal1', 'source').message);
1704
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1705
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('AnimalNotDefined', 'NameA.NameB.AnimalNotDefined', 'NameA.NameB', 'namespace')
1706
+ ]);
896
1707
  });
897
1708
  it('supports omitting namespace prefix for items in same namespace', () => {
898
- var _a;
899
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1709
+ program.setFile('source/main.bs', `
900
1710
  namespace NameA.NameB
901
1711
  class Animal
902
1712
  end class
@@ -905,45 +1715,54 @@ describe('BrsFile BrighterScript classes', () => {
905
1715
  end namespace
906
1716
  `);
907
1717
  program.validate();
908
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
1718
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
909
1719
  });
910
1720
  it('catches duplicate root-level class declarations', () => {
911
- var _a;
912
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1721
+ program.setFile('source/main.bs', `
913
1722
  class Animal
914
1723
  end class
915
1724
  class Animal
1725
+ end class
916
1726
  `);
917
1727
  program.validate();
918
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.duplicateClassDeclaration('source', 'Animal').message);
1728
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1729
+ DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Class', 'Animal')
1730
+ ]);
919
1731
  });
920
1732
  it('catches duplicate namespace-level class declarations', () => {
921
- var _a;
922
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1733
+ program.setFile('source/main.bs', `
923
1734
  namespace NameA.NameB
924
1735
  class Animal
925
1736
  end class
926
1737
  class Animal
1738
+ end class
927
1739
  end namespace
928
1740
  `);
929
1741
  program.validate();
930
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.duplicateClassDeclaration('source', 'NameA.NameB.Animal').message);
1742
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1743
+ DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Class', 'NameA.NameB.Animal').message
1744
+ ]);
931
1745
  });
932
- it('catches namespaced class name which is the same as a global class', () => {
933
- var _a;
934
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1746
+ it('allows namespaced class name which is the same as a global class', () => {
1747
+ program.setFile('source/main.bs', `
935
1748
  namespace NameA.NameB
936
1749
  class Animal
1750
+ name as string
937
1751
  end class
1752
+
1753
+ sub printThisAnimalName(ani as Animal) ' this refers to NameA.NameB.Animal
1754
+ print ani.name
1755
+ end sub
938
1756
  end namespace
1757
+
939
1758
  class Animal
1759
+ doesNotHaveName as string
940
1760
  end class
941
1761
  `);
942
1762
  program.validate();
943
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.namespacedClassCannotShareNamewithNonNamespacedClass('Animal').message);
1763
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
944
1764
  });
945
1765
  it('catches class with same name as function', () => {
946
- var _a;
947
1766
  program.setFile('source/main.bs', `
948
1767
  class Animal
949
1768
  end class
@@ -951,10 +1770,12 @@ describe('BrsFile BrighterScript classes', () => {
951
1770
  end sub
952
1771
  `);
953
1772
  program.validate();
954
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('Animal').message);
1773
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1774
+ DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Function', 'Animal').message,
1775
+ DiagnosticMessages_1.DiagnosticMessages.nameCollision('Function', 'Class', 'Animal').message
1776
+ ]);
955
1777
  });
956
1778
  it('catches class with same name (but different case) as function', () => {
957
- var _a;
958
1779
  program.setFile('source/main.bs', `
959
1780
  class ANIMAL
960
1781
  end class
@@ -962,10 +1783,12 @@ describe('BrsFile BrighterScript classes', () => {
962
1783
  end sub
963
1784
  `);
964
1785
  program.validate();
965
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('animal').message);
1786
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1787
+ DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Function', 'animal').message,
1788
+ DiagnosticMessages_1.DiagnosticMessages.nameCollision('Function', 'Class', 'ANIMAL').message
1789
+ ]);
966
1790
  });
967
1791
  it('catches variable with same name as class', () => {
968
- var _a;
969
1792
  program.setFile('source/main.bs', `
970
1793
  class Animal
971
1794
  end class
@@ -974,7 +1797,9 @@ describe('BrsFile BrighterScript classes', () => {
974
1797
  end sub
975
1798
  `);
976
1799
  program.validate();
977
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.equal(DiagnosticMessages_1.DiagnosticMessages.localVarSameNameAsClass('Animal').message);
1800
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1801
+ DiagnosticMessages_1.DiagnosticMessages.localVarShadowedByScopedFunction().message
1802
+ ]);
978
1803
  });
979
1804
  it('allows extending classes with more than one dot in the filename', () => {
980
1805
  program.setFile('source/testclass.bs', `
@@ -1002,9 +1827,9 @@ describe('BrsFile BrighterScript classes', () => {
1002
1827
  end class
1003
1828
  `);
1004
1829
  program.validate();
1005
- testHelpers_spec_1.expectZeroDiagnostics(program);
1830
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
1006
1831
  });
1007
- it('computes correct super index for grandchild class', () => {
1832
+ it('computes correct super index for grandchild class', async () => {
1008
1833
  program.setFile('source/main.bs', `
1009
1834
  sub Main()
1010
1835
  c = new App.ClassC()
@@ -1018,7 +1843,7 @@ describe('BrsFile BrighterScript classes', () => {
1018
1843
  end class
1019
1844
  end namespace
1020
1845
  `);
1021
- testTranspile(`
1846
+ await testTranspile(`
1022
1847
  namespace App
1023
1848
  class ClassC extends ClassB
1024
1849
  sub new()
@@ -1027,12 +1852,13 @@ describe('BrsFile BrighterScript classes', () => {
1027
1852
  end class
1028
1853
  end namespace
1029
1854
  `, `
1855
+ sub __App_ClassC_method_new()
1856
+ m.super1_new()
1857
+ end sub
1030
1858
  function __App_ClassC_builder()
1031
1859
  instance = __App_ClassB_builder()
1032
1860
  instance.super1_new = instance.new
1033
- instance.new = sub()
1034
- m.super1_new()
1035
- end sub
1861
+ instance.new = __App_ClassC_method_new
1036
1862
  return instance
1037
1863
  end function
1038
1864
  function App_ClassC()
@@ -1042,23 +1868,24 @@ describe('BrsFile BrighterScript classes', () => {
1042
1868
  end function
1043
1869
  `, 'trim', 'source/App.ClassC.bs');
1044
1870
  });
1045
- it('computes correct super index for namespaced child class and global parent class', () => {
1871
+ it('computes correct super index for namespaced child class and global parent class', async () => {
1046
1872
  program.setFile('source/ClassA.bs', `
1047
1873
  class ClassA
1048
1874
  end class
1049
1875
  `);
1050
- testTranspile(`
1876
+ await testTranspile(`
1051
1877
  namespace App
1052
1878
  class ClassB extends ClassA
1053
1879
  end class
1054
1880
  end namespace
1055
1881
  `, `
1882
+ sub __App_ClassB_method_new()
1883
+ m.super0_new()
1884
+ end sub
1056
1885
  function __App_ClassB_builder()
1057
1886
  instance = __ClassA_builder()
1058
1887
  instance.super0_new = instance.new
1059
- instance.new = sub()
1060
- m.super0_new()
1061
- end sub
1888
+ instance.new = __App_ClassB_method_new
1062
1889
  return instance
1063
1890
  end function
1064
1891
  function App_ClassB()
@@ -1073,9 +1900,136 @@ describe('BrsFile BrighterScript classes', () => {
1073
1900
  class ClassB extends ClassA
1074
1901
  end class
1075
1902
  `);
1076
- assert_1.doesNotThrow(() => {
1077
- file.parser.references.classStatements[0].getParentClassIndex(new BrsTranspileState_1.BrsTranspileState(file));
1903
+ (0, assert_1.doesNotThrow)(() => {
1904
+ const classStatements = file.ast.findChildren(reflection_1.isClassStatement);
1905
+ classStatements[0]['getParentClassIndex'](new BrsTranspileState_1.BrsTranspileState(file));
1078
1906
  });
1079
1907
  });
1908
+ it('does not crash when child has field with same name as sub in parent', () => {
1909
+ program.setFile('source/main.bs', `
1910
+ class Parent
1911
+ public function helloWorld()
1912
+ end function
1913
+ end class
1914
+ class Child extends Parent
1915
+ public helloWorld as string
1916
+ end class
1917
+ `);
1918
+ program.validate();
1919
+ });
1920
+ it('does not crash when child has method with same name as field in parent', () => {
1921
+ program.setFile('source/main.bs', `
1922
+ class Parent
1923
+ public helloWorld as string
1924
+ end class
1925
+ class Child extends Parent
1926
+ public function helloWorld()
1927
+ end function
1928
+ end class
1929
+ `);
1930
+ program.validate();
1931
+ });
1932
+ it('extending namespaced class transpiles properly', async () => {
1933
+ await testTranspile(`
1934
+ namespace App
1935
+ class CoreClass
1936
+ sub new()
1937
+ print "CoreClass.new()"
1938
+ end sub
1939
+ end class
1940
+ end namespace
1941
+ namespace App.Logic
1942
+ class FirstClass extends App.CoreClass
1943
+ end class
1944
+ class SecondClass extends FirstClass
1945
+ end class
1946
+ end namespace
1947
+ namespace App.OtherLogic
1948
+ class FinalClass extends App.Logic.SecondClass
1949
+ end class
1950
+ end namespace
1951
+ `, `
1952
+ sub __App_CoreClass_method_new()
1953
+ print "CoreClass.new()"
1954
+ end sub
1955
+ function __App_CoreClass_builder()
1956
+ instance = {}
1957
+ instance.new = __App_CoreClass_method_new
1958
+ return instance
1959
+ end function
1960
+ function App_CoreClass()
1961
+ instance = __App_CoreClass_builder()
1962
+ instance.new()
1963
+ return instance
1964
+ end function
1965
+ sub __App_Logic_FirstClass_method_new()
1966
+ m.super0_new()
1967
+ end sub
1968
+ function __App_Logic_FirstClass_builder()
1969
+ instance = __App_CoreClass_builder()
1970
+ instance.super0_new = instance.new
1971
+ instance.new = __App_Logic_FirstClass_method_new
1972
+ return instance
1973
+ end function
1974
+ function App_Logic_FirstClass()
1975
+ instance = __App_Logic_FirstClass_builder()
1976
+ instance.new()
1977
+ return instance
1978
+ end function
1979
+ sub __App_Logic_SecondClass_method_new()
1980
+ m.super1_new()
1981
+ end sub
1982
+ function __App_Logic_SecondClass_builder()
1983
+ instance = __App_Logic_FirstClass_builder()
1984
+ instance.super1_new = instance.new
1985
+ instance.new = __App_Logic_SecondClass_method_new
1986
+ return instance
1987
+ end function
1988
+ function App_Logic_SecondClass()
1989
+ instance = __App_Logic_SecondClass_builder()
1990
+ instance.new()
1991
+ return instance
1992
+ end function
1993
+ sub __App_OtherLogic_FinalClass_method_new()
1994
+ m.super2_new()
1995
+ end sub
1996
+ function __App_OtherLogic_FinalClass_builder()
1997
+ instance = __App_Logic_SecondClass_builder()
1998
+ instance.super2_new = instance.new
1999
+ instance.new = __App_OtherLogic_FinalClass_method_new
2000
+ return instance
2001
+ end function
2002
+ function App_OtherLogic_FinalClass()
2003
+ instance = __App_OtherLogic_FinalClass_builder()
2004
+ instance.new()
2005
+ return instance
2006
+ end function
2007
+ `);
2008
+ });
2009
+ it('detects calling class constructors with too many parameters', () => {
2010
+ program.setFile('source/main.bs', `
2011
+ class Parameterless
2012
+ sub new()
2013
+ end sub
2014
+ end class
2015
+
2016
+ class OneParam
2017
+ sub new(param1)
2018
+ end sub
2019
+ end class
2020
+
2021
+ sub main()
2022
+ c1 = new Parameterless(1)
2023
+ c2 = new OneParam(1, 2)
2024
+ c2 = new OneParam()
2025
+ end sub
2026
+ `);
2027
+ program.validate();
2028
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
2029
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(0, 1),
2030
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 2),
2031
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 0)
2032
+ ]);
2033
+ });
1080
2034
  });
1081
2035
  //# sourceMappingURL=BrsFile.Class.spec.js.map