brighterscript 1.0.0-alpha.3 → 1.0.0-alpha.30

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 (605) hide show
  1. package/CHANGELOG.md +1230 -285
  2. package/README.md +61 -131
  3. package/bsconfig.schema.json +68 -2
  4. package/dist/ActionPipeline.d.ts +10 -0
  5. package/dist/ActionPipeline.js +40 -0
  6. package/dist/ActionPipeline.js.map +1 -0
  7. package/dist/AstValidationSegmenter.d.ts +35 -0
  8. package/dist/AstValidationSegmenter.js +209 -0
  9. package/dist/AstValidationSegmenter.js.map +1 -0
  10. package/dist/BsConfig.d.ts +51 -6
  11. package/dist/BusyStatusTracker.d.ts +31 -0
  12. package/dist/BusyStatusTracker.js +83 -0
  13. package/dist/BusyStatusTracker.js.map +1 -0
  14. package/dist/Cache.d.ts +5 -6
  15. package/dist/Cache.js +12 -11
  16. package/dist/Cache.js.map +1 -1
  17. package/dist/CacheVerifier.d.ts +7 -0
  18. package/dist/CacheVerifier.js +20 -0
  19. package/dist/CacheVerifier.js.map +1 -0
  20. package/dist/CodeActionUtil.d.ts +11 -2
  21. package/dist/CodeActionUtil.js +17 -3
  22. package/dist/CodeActionUtil.js.map +1 -1
  23. package/dist/CommentFlagProcessor.d.ts +7 -6
  24. package/dist/CommentFlagProcessor.js +10 -7
  25. package/dist/CommentFlagProcessor.js.map +1 -1
  26. package/dist/DependencyGraph.d.ts +8 -3
  27. package/dist/DependencyGraph.js +49 -16
  28. package/dist/DependencyGraph.js.map +1 -1
  29. package/dist/DiagnosticCollection.d.ts +5 -3
  30. package/dist/DiagnosticCollection.js +18 -16
  31. package/dist/DiagnosticCollection.js.map +1 -1
  32. package/dist/DiagnosticFilterer.d.ts +8 -4
  33. package/dist/DiagnosticFilterer.js +77 -44
  34. package/dist/DiagnosticFilterer.js.map +1 -1
  35. package/dist/DiagnosticManager.d.ts +55 -0
  36. package/dist/DiagnosticManager.js +214 -0
  37. package/dist/DiagnosticManager.js.map +1 -0
  38. package/dist/DiagnosticMessages.d.ts +184 -17
  39. package/dist/DiagnosticMessages.js +242 -24
  40. package/dist/DiagnosticMessages.js.map +1 -1
  41. package/dist/DiagnosticSeverityAdjuster.d.ts +7 -0
  42. package/dist/DiagnosticSeverityAdjuster.js +41 -0
  43. package/dist/DiagnosticSeverityAdjuster.js.map +1 -0
  44. package/dist/FunctionScope.d.ts +28 -0
  45. package/dist/FunctionScope.js +52 -0
  46. package/dist/FunctionScope.js.map +1 -0
  47. package/dist/KeyedThrottler.d.ts +3 -3
  48. package/dist/KeyedThrottler.js +3 -3
  49. package/dist/KeyedThrottler.js.map +1 -1
  50. package/dist/LanguageServer.d.ts +72 -47
  51. package/dist/LanguageServer.js +544 -312
  52. package/dist/LanguageServer.js.map +1 -1
  53. package/dist/Logger.d.ts +9 -10
  54. package/dist/Logger.js +36 -30
  55. package/dist/Logger.js.map +1 -1
  56. package/dist/PluginInterface.d.ts +29 -7
  57. package/dist/PluginInterface.js +90 -7
  58. package/dist/PluginInterface.js.map +1 -1
  59. package/dist/Program.d.ts +204 -99
  60. package/dist/Program.js +1060 -699
  61. package/dist/Program.js.map +1 -1
  62. package/dist/ProgramBuilder.d.ts +29 -18
  63. package/dist/ProgramBuilder.js +170 -132
  64. package/dist/ProgramBuilder.js.map +1 -1
  65. package/dist/Scope.d.ts +144 -109
  66. package/dist/Scope.js +538 -551
  67. package/dist/Scope.js.map +1 -1
  68. package/dist/SemanticTokenUtils.d.ts +14 -0
  69. package/dist/SemanticTokenUtils.js +81 -0
  70. package/dist/SemanticTokenUtils.js.map +1 -0
  71. package/dist/Stopwatch.d.ts +4 -0
  72. package/dist/Stopwatch.js +8 -1
  73. package/dist/Stopwatch.js.map +1 -1
  74. package/dist/SymbolTable.d.ts +91 -24
  75. package/dist/SymbolTable.js +286 -63
  76. package/dist/SymbolTable.js.map +1 -1
  77. package/dist/SymbolTypeFlag.d.ts +8 -0
  78. package/dist/SymbolTypeFlag.js +13 -0
  79. package/dist/SymbolTypeFlag.js.map +1 -0
  80. package/dist/Throttler.d.ts +12 -0
  81. package/dist/Throttler.js +39 -0
  82. package/dist/Throttler.js.map +1 -1
  83. package/dist/Watcher.d.ts +0 -3
  84. package/dist/Watcher.js +0 -3
  85. package/dist/Watcher.js.map +1 -1
  86. package/dist/XmlScope.d.ts +5 -15
  87. package/dist/XmlScope.js +35 -87
  88. package/dist/XmlScope.js.map +1 -1
  89. package/dist/astUtils/CachedLookups.d.ts +49 -0
  90. package/dist/astUtils/CachedLookups.js +324 -0
  91. package/dist/astUtils/CachedLookups.js.map +1 -0
  92. package/dist/astUtils/Editor.d.ts +69 -0
  93. package/dist/astUtils/Editor.js +245 -0
  94. package/dist/astUtils/Editor.js.map +1 -0
  95. package/dist/astUtils/Editor.spec.js +258 -0
  96. package/dist/astUtils/Editor.spec.js.map +1 -0
  97. package/dist/astUtils/creators.d.ts +33 -10
  98. package/dist/astUtils/creators.js +224 -30
  99. package/dist/astUtils/creators.js.map +1 -1
  100. package/dist/astUtils/creators.spec.js +5 -5
  101. package/dist/astUtils/creators.spec.js.map +1 -1
  102. package/dist/astUtils/reflection.d.ts +145 -82
  103. package/dist/astUtils/reflection.js +304 -132
  104. package/dist/astUtils/reflection.js.map +1 -1
  105. package/dist/astUtils/reflection.spec.js +267 -162
  106. package/dist/astUtils/reflection.spec.js.map +1 -1
  107. package/dist/astUtils/stackedVisitor.js.map +1 -1
  108. package/dist/astUtils/stackedVisitor.spec.js +14 -14
  109. package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
  110. package/dist/astUtils/visitors.d.ts +114 -53
  111. package/dist/astUtils/visitors.js +70 -13
  112. package/dist/astUtils/visitors.js.map +1 -1
  113. package/dist/astUtils/visitors.spec.js +465 -51
  114. package/dist/astUtils/visitors.spec.js.map +1 -1
  115. package/dist/astUtils/xml.d.ts +9 -8
  116. package/dist/astUtils/xml.js +10 -5
  117. package/dist/astUtils/xml.js.map +1 -1
  118. package/dist/bscPlugin/BscPlugin.d.ts +22 -1
  119. package/dist/bscPlugin/BscPlugin.js +88 -0
  120. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  121. package/dist/bscPlugin/CallExpressionInfo.d.ts +36 -0
  122. package/dist/bscPlugin/CallExpressionInfo.js +131 -0
  123. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -0
  124. package/dist/bscPlugin/FileWriter.d.ts +6 -0
  125. package/dist/bscPlugin/FileWriter.js +24 -0
  126. package/dist/bscPlugin/FileWriter.js.map +1 -0
  127. package/dist/bscPlugin/SignatureHelpUtil.d.ts +10 -0
  128. package/dist/bscPlugin/SignatureHelpUtil.js +137 -0
  129. package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -0
  130. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +1 -1
  131. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +26 -17
  132. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  133. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +94 -20
  134. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  135. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +60 -0
  136. package/dist/bscPlugin/completions/CompletionsProcessor.js +601 -0
  137. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -0
  138. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +2139 -0
  139. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -0
  140. package/dist/bscPlugin/definition/DefinitionProvider.d.ts +13 -0
  141. package/dist/bscPlugin/definition/DefinitionProvider.js +210 -0
  142. package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -0
  143. package/dist/bscPlugin/definition/DefinitionProvider.spec.js +88 -0
  144. package/dist/bscPlugin/definition/DefinitionProvider.spec.js.map +1 -0
  145. package/dist/bscPlugin/fileProviders/FileProvider.d.ts +9 -0
  146. package/dist/bscPlugin/fileProviders/FileProvider.js +51 -0
  147. package/dist/bscPlugin/fileProviders/FileProvider.js.map +1 -0
  148. package/dist/bscPlugin/hover/HoverProcessor.d.ts +18 -0
  149. package/dist/bscPlugin/hover/HoverProcessor.js +218 -0
  150. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -0
  151. package/dist/bscPlugin/hover/HoverProcessor.spec.d.ts +1 -0
  152. package/dist/bscPlugin/hover/HoverProcessor.spec.js +737 -0
  153. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -0
  154. package/dist/bscPlugin/references/ReferencesProvider.d.ts +12 -0
  155. package/dist/bscPlugin/references/ReferencesProvider.js +56 -0
  156. package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -0
  157. package/dist/bscPlugin/references/ReferencesProvider.spec.d.ts +1 -0
  158. package/dist/bscPlugin/references/ReferencesProvider.spec.js +51 -0
  159. package/dist/bscPlugin/references/ReferencesProvider.spec.js.map +1 -0
  160. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +14 -0
  161. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +138 -0
  162. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  163. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
  164. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +491 -0
  165. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  166. package/dist/bscPlugin/serialize/BslibInjector.spec.d.ts +1 -0
  167. package/dist/bscPlugin/serialize/BslibInjector.spec.js +19 -0
  168. package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +1 -0
  169. package/dist/bscPlugin/serialize/BslibManager.d.ts +9 -0
  170. package/dist/bscPlugin/serialize/BslibManager.js +40 -0
  171. package/dist/bscPlugin/serialize/BslibManager.js.map +1 -0
  172. package/dist/bscPlugin/serialize/FileSerializer.d.ts +9 -0
  173. package/dist/bscPlugin/serialize/FileSerializer.js +72 -0
  174. package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -0
  175. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.d.ts +7 -0
  176. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js +22 -0
  177. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.js.map +1 -0
  178. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.d.ts +1 -0
  179. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js +291 -0
  180. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js.map +1 -0
  181. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.d.ts +7 -0
  182. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js +26 -0
  183. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.js.map +1 -0
  184. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.d.ts +1 -0
  185. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js +245 -0
  186. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js.map +1 -0
  187. package/dist/bscPlugin/symbols/symbolUtils.d.ts +5 -0
  188. package/dist/bscPlugin/symbols/symbolUtils.js +140 -0
  189. package/dist/bscPlugin/symbols/symbolUtils.js.map +1 -0
  190. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +21 -0
  191. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +202 -0
  192. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -0
  193. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.d.ts +1 -0
  194. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js +41 -0
  195. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +1 -0
  196. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.d.ts +12 -0
  197. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js +99 -0
  198. package/dist/bscPlugin/transpile/XmlFilePreTranspileProcessor.js.map +1 -0
  199. package/dist/bscPlugin/validation/BrsFileAfterValidatior.d.ts +7 -0
  200. package/dist/bscPlugin/validation/BrsFileAfterValidatior.js +18 -0
  201. package/dist/bscPlugin/validation/BrsFileAfterValidatior.js.map +1 -0
  202. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +34 -0
  203. package/dist/bscPlugin/validation/BrsFileValidator.js +462 -0
  204. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  205. package/dist/bscPlugin/validation/BrsFileValidator.spec.d.ts +1 -0
  206. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +758 -0
  207. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -0
  208. package/dist/bscPlugin/validation/ProgramValidator.d.ts +11 -0
  209. package/dist/bscPlugin/validation/ProgramValidator.js +33 -0
  210. package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -0
  211. package/dist/bscPlugin/validation/ScopeValidator.d.ts +131 -0
  212. package/dist/bscPlugin/validation/ScopeValidator.js +1097 -0
  213. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  214. package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +1 -0
  215. package/dist/bscPlugin/validation/ScopeValidator.spec.js +2796 -0
  216. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -0
  217. package/dist/bscPlugin/validation/XmlFileValidator.d.ts +8 -0
  218. package/dist/bscPlugin/validation/XmlFileValidator.js +44 -0
  219. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -0
  220. package/dist/cli.js +117 -11
  221. package/dist/cli.js.map +1 -1
  222. package/dist/deferred.d.ts +3 -3
  223. package/dist/deferred.js.map +1 -1
  224. package/dist/diagnosticUtils.d.ts +10 -3
  225. package/dist/diagnosticUtils.js +58 -21
  226. package/dist/diagnosticUtils.js.map +1 -1
  227. package/dist/examples/plugins/removePrint.js +8 -12
  228. package/dist/examples/plugins/removePrint.js.map +1 -1
  229. package/dist/files/AssetFile.d.ts +24 -0
  230. package/dist/files/AssetFile.js +25 -0
  231. package/dist/files/AssetFile.js.map +1 -0
  232. package/dist/files/BrsFile.Class.spec.js +858 -153
  233. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  234. package/dist/files/BrsFile.d.ts +144 -82
  235. package/dist/files/BrsFile.js +847 -911
  236. package/dist/files/BrsFile.js.map +1 -1
  237. package/dist/files/BrsFile.spec.js +2928 -834
  238. package/dist/files/BrsFile.spec.js.map +1 -1
  239. package/dist/files/BscFile.d.ts +101 -0
  240. package/dist/files/BscFile.js +15 -0
  241. package/dist/files/BscFile.js.map +1 -0
  242. package/dist/files/Factory.d.ts +25 -0
  243. package/dist/files/Factory.js +22 -0
  244. package/dist/files/Factory.js.map +1 -0
  245. package/dist/files/LazyFileData.d.ts +20 -0
  246. package/dist/files/LazyFileData.js +54 -0
  247. package/dist/files/LazyFileData.js.map +1 -0
  248. package/dist/files/LazyFileData.spec.d.ts +1 -0
  249. package/dist/files/LazyFileData.spec.js +27 -0
  250. package/dist/files/LazyFileData.spec.js.map +1 -0
  251. package/dist/files/XmlFile.d.ts +73 -41
  252. package/dist/files/XmlFile.js +126 -138
  253. package/dist/files/XmlFile.js.map +1 -1
  254. package/dist/files/XmlFile.spec.js +450 -318
  255. package/dist/files/XmlFile.spec.js.map +1 -1
  256. package/dist/files/tests/imports.spec.js +62 -52
  257. package/dist/files/tests/imports.spec.js.map +1 -1
  258. package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
  259. package/dist/files/tests/optionalChaning.spec.js +152 -0
  260. package/dist/files/tests/optionalChaning.spec.js.map +1 -0
  261. package/dist/globalCallables.d.ts +3 -1
  262. package/dist/globalCallables.js +416 -162
  263. package/dist/globalCallables.js.map +1 -1
  264. package/dist/index.d.ts +25 -3
  265. package/dist/index.js +42 -5
  266. package/dist/index.js.map +1 -1
  267. package/dist/interfaces.d.ts +722 -119
  268. package/dist/interfaces.js +31 -0
  269. package/dist/interfaces.js.map +1 -1
  270. package/dist/lexer/Character.spec.js +5 -5
  271. package/dist/lexer/Character.spec.js.map +1 -1
  272. package/dist/lexer/Lexer.d.ts +40 -9
  273. package/dist/lexer/Lexer.js +191 -49
  274. package/dist/lexer/Lexer.js.map +1 -1
  275. package/dist/lexer/Lexer.spec.js +775 -563
  276. package/dist/lexer/Lexer.spec.js.map +1 -1
  277. package/dist/lexer/Token.d.ts +11 -3
  278. package/dist/lexer/Token.js +10 -2
  279. package/dist/lexer/Token.js.map +1 -1
  280. package/dist/lexer/TokenKind.d.ts +27 -1
  281. package/dist/lexer/TokenKind.js +112 -5
  282. package/dist/lexer/TokenKind.js.map +1 -1
  283. package/dist/logging.d.ts +9 -0
  284. package/dist/logging.js +16 -0
  285. package/dist/logging.js.map +1 -0
  286. package/dist/parser/AstNode.d.ts +180 -0
  287. package/dist/parser/AstNode.js +245 -0
  288. package/dist/parser/AstNode.js.map +1 -0
  289. package/dist/parser/AstNode.spec.d.ts +1 -0
  290. package/dist/parser/AstNode.spec.js +165 -0
  291. package/dist/parser/AstNode.spec.js.map +1 -0
  292. package/dist/parser/BrsTranspileState.d.ts +12 -2
  293. package/dist/parser/BrsTranspileState.js +6 -0
  294. package/dist/parser/BrsTranspileState.js.map +1 -1
  295. package/dist/parser/Expression.d.ts +454 -210
  296. package/dist/parser/Expression.js +953 -498
  297. package/dist/parser/Expression.js.map +1 -1
  298. package/dist/parser/Parser.Class.spec.js +200 -95
  299. package/dist/parser/Parser.Class.spec.js.map +1 -1
  300. package/dist/parser/Parser.d.ts +105 -120
  301. package/dist/parser/Parser.js +1406 -912
  302. package/dist/parser/Parser.js.map +1 -1
  303. package/dist/parser/Parser.spec.d.ts +3 -1
  304. package/dist/parser/Parser.spec.js +1383 -456
  305. package/dist/parser/Parser.spec.js.map +1 -1
  306. package/dist/parser/SGParser.d.ts +44 -6
  307. package/dist/parser/SGParser.js +212 -185
  308. package/dist/parser/SGParser.js.map +1 -1
  309. package/dist/parser/SGParser.spec.js +30 -28
  310. package/dist/parser/SGParser.spec.js.map +1 -1
  311. package/dist/parser/SGTypes.d.ts +293 -50
  312. package/dist/parser/SGTypes.js +540 -187
  313. package/dist/parser/SGTypes.js.map +1 -1
  314. package/dist/parser/Statement.d.ts +734 -244
  315. package/dist/parser/Statement.js +1758 -611
  316. package/dist/parser/Statement.js.map +1 -1
  317. package/dist/parser/Statement.spec.js +45 -34
  318. package/dist/parser/Statement.spec.js.map +1 -1
  319. package/dist/parser/TranspileState.d.ts +17 -8
  320. package/dist/parser/TranspileState.js +73 -11
  321. package/dist/parser/TranspileState.js.map +1 -1
  322. package/dist/parser/tests/Parser.spec.d.ts +10 -9
  323. package/dist/parser/tests/Parser.spec.js +18 -14
  324. package/dist/parser/tests/Parser.spec.js.map +1 -1
  325. package/dist/parser/tests/controlFlow/For.spec.js +79 -69
  326. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  327. package/dist/parser/tests/controlFlow/ForEach.spec.js +53 -47
  328. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  329. package/dist/parser/tests/controlFlow/If.spec.js +217 -196
  330. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  331. package/dist/parser/tests/controlFlow/While.spec.js +48 -42
  332. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  333. package/dist/parser/tests/expression/Additive.spec.js +31 -31
  334. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  335. package/dist/parser/tests/expression/ArrayLiterals.spec.js +157 -120
  336. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  337. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +202 -139
  338. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  339. package/dist/parser/tests/expression/Boolean.spec.js +25 -25
  340. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  341. package/dist/parser/tests/expression/Call.spec.js +150 -41
  342. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  343. package/dist/parser/tests/expression/Exponential.spec.js +18 -18
  344. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  345. package/dist/parser/tests/expression/Function.spec.js +257 -257
  346. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  347. package/dist/parser/tests/expression/Indexing.spec.js +160 -90
  348. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  349. package/dist/parser/tests/expression/Multiplicative.spec.js +38 -38
  350. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  351. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +196 -98
  352. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  353. package/dist/parser/tests/expression/PrefixUnary.spec.js +42 -42
  354. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  355. package/dist/parser/tests/expression/Primary.spec.js +42 -42
  356. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  357. package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
  358. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
  359. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
  360. package/dist/parser/tests/expression/Relational.spec.js +44 -44
  361. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  362. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +31 -31
  363. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  364. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +230 -90
  365. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  366. package/dist/parser/tests/expression/TernaryExpression.spec.js +377 -148
  367. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  368. package/dist/parser/tests/expression/TypeExpression.spec.d.ts +1 -0
  369. package/dist/parser/tests/expression/TypeExpression.spec.js +126 -0
  370. package/dist/parser/tests/expression/TypeExpression.spec.js.map +1 -0
  371. package/dist/parser/tests/expression/UnaryExpression.spec.d.ts +1 -0
  372. package/dist/parser/tests/expression/UnaryExpression.spec.js +52 -0
  373. package/dist/parser/tests/expression/UnaryExpression.spec.js.map +1 -0
  374. package/dist/parser/tests/statement/AssignmentOperators.spec.js +37 -37
  375. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  376. package/dist/parser/tests/statement/ConstStatement.spec.d.ts +1 -0
  377. package/dist/parser/tests/statement/ConstStatement.spec.js +262 -0
  378. package/dist/parser/tests/statement/ConstStatement.spec.js.map +1 -0
  379. package/dist/parser/tests/statement/Continue.spec.d.ts +1 -0
  380. package/dist/parser/tests/statement/Continue.spec.js +119 -0
  381. package/dist/parser/tests/statement/Continue.spec.js.map +1 -0
  382. package/dist/parser/tests/statement/Declaration.spec.js +45 -45
  383. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  384. package/dist/parser/tests/statement/Dim.spec.js +22 -22
  385. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  386. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  387. package/dist/parser/tests/statement/Enum.spec.js +684 -0
  388. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  389. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  390. package/dist/parser/tests/statement/For.spec.js +45 -0
  391. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  392. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  393. package/dist/parser/tests/statement/ForEach.spec.js +36 -0
  394. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  395. package/dist/parser/tests/statement/Function.spec.js +208 -198
  396. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  397. package/dist/parser/tests/statement/Goto.spec.js +16 -15
  398. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  399. package/dist/parser/tests/statement/Increment.spec.js +51 -51
  400. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  401. package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
  402. package/dist/parser/tests/statement/InterfaceStatement.spec.js +109 -0
  403. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
  404. package/dist/parser/tests/statement/LibraryStatement.spec.js +18 -18
  405. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  406. package/dist/parser/tests/statement/Misc.spec.js +123 -163
  407. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  408. package/dist/parser/tests/statement/PrintStatement.spec.js +125 -108
  409. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  410. package/dist/parser/tests/statement/ReturnStatement.spec.js +51 -49
  411. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  412. package/dist/parser/tests/statement/Set.spec.js +110 -97
  413. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  414. package/dist/parser/tests/statement/Stop.spec.js +13 -12
  415. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  416. package/dist/parser/tests/statement/Throw.spec.js +6 -6
  417. package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
  418. package/dist/parser/tests/statement/TryCatch.spec.js +26 -15
  419. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  420. package/dist/preprocessor/Manifest.d.ts +6 -6
  421. package/dist/preprocessor/Manifest.js +17 -38
  422. package/dist/preprocessor/Manifest.js.map +1 -1
  423. package/dist/preprocessor/Manifest.spec.d.ts +1 -0
  424. package/dist/preprocessor/Manifest.spec.js +78 -103
  425. package/dist/preprocessor/Manifest.spec.js.map +1 -1
  426. package/dist/roku-types/data.json +19351 -0
  427. package/dist/roku-types/index.d.ts +5483 -0
  428. package/dist/roku-types/index.js +11 -0
  429. package/dist/roku-types/index.js.map +1 -0
  430. package/dist/types/ArrayType.d.ts +9 -5
  431. package/dist/types/ArrayType.js +68 -24
  432. package/dist/types/ArrayType.js.map +1 -1
  433. package/dist/types/ArrayType.spec.js +39 -11
  434. package/dist/types/ArrayType.spec.js.map +1 -1
  435. package/dist/types/AssociativeArrayType.d.ts +14 -0
  436. package/dist/types/AssociativeArrayType.js +60 -0
  437. package/dist/types/AssociativeArrayType.js.map +1 -0
  438. package/dist/types/BaseFunctionType.d.ts +9 -0
  439. package/dist/types/BaseFunctionType.js +25 -0
  440. package/dist/types/BaseFunctionType.js.map +1 -0
  441. package/dist/types/BooleanType.d.ts +10 -5
  442. package/dist/types/BooleanType.js +21 -9
  443. package/dist/types/BooleanType.js.map +1 -1
  444. package/dist/types/BooleanType.spec.js +10 -4
  445. package/dist/types/BooleanType.spec.js.map +1 -1
  446. package/dist/types/BscType.d.ts +29 -3
  447. package/dist/types/BscType.js +121 -0
  448. package/dist/types/BscType.js.map +1 -1
  449. package/dist/types/BscTypeKind.d.ts +25 -0
  450. package/dist/types/BscTypeKind.js +30 -0
  451. package/dist/types/BscTypeKind.js.map +1 -0
  452. package/dist/types/BuiltInInterfaceAdder.d.ts +23 -0
  453. package/dist/types/BuiltInInterfaceAdder.js +174 -0
  454. package/dist/types/BuiltInInterfaceAdder.js.map +1 -0
  455. package/dist/types/BuiltInInterfaceAdder.spec.d.ts +1 -0
  456. package/dist/types/BuiltInInterfaceAdder.spec.js +115 -0
  457. package/dist/types/BuiltInInterfaceAdder.spec.js.map +1 -0
  458. package/dist/types/ClassType.d.ts +17 -0
  459. package/dist/types/ClassType.js +58 -0
  460. package/dist/types/ClassType.js.map +1 -0
  461. package/dist/types/ClassType.spec.d.ts +1 -0
  462. package/dist/types/ClassType.spec.js +76 -0
  463. package/dist/types/ClassType.spec.js.map +1 -0
  464. package/dist/types/ComponentType.d.ts +27 -0
  465. package/dist/types/ComponentType.js +83 -0
  466. package/dist/types/ComponentType.js.map +1 -0
  467. package/dist/types/DoubleType.d.ts +10 -5
  468. package/dist/types/DoubleType.js +25 -18
  469. package/dist/types/DoubleType.js.map +1 -1
  470. package/dist/types/DoubleType.spec.js +12 -4
  471. package/dist/types/DoubleType.spec.js.map +1 -1
  472. package/dist/types/DynamicType.d.ts +12 -5
  473. package/dist/types/DynamicType.js +22 -6
  474. package/dist/types/DynamicType.js.map +1 -1
  475. package/dist/types/DynamicType.spec.js +16 -5
  476. package/dist/types/DynamicType.spec.js.map +1 -1
  477. package/dist/types/EnumType.d.ts +40 -0
  478. package/dist/types/EnumType.js +80 -0
  479. package/dist/types/EnumType.js.map +1 -0
  480. package/dist/types/EnumType.spec.d.ts +1 -0
  481. package/dist/types/EnumType.spec.js +33 -0
  482. package/dist/types/EnumType.spec.js.map +1 -0
  483. package/dist/types/FloatType.d.ts +10 -5
  484. package/dist/types/FloatType.js +25 -18
  485. package/dist/types/FloatType.js.map +1 -1
  486. package/dist/types/FloatType.spec.js +4 -4
  487. package/dist/types/FloatType.spec.js.map +1 -1
  488. package/dist/types/FunctionType.d.ts +10 -22
  489. package/dist/types/FunctionType.js +26 -63
  490. package/dist/types/FunctionType.js.map +1 -1
  491. package/dist/types/InheritableType.d.ts +28 -0
  492. package/dist/types/InheritableType.js +157 -0
  493. package/dist/types/InheritableType.js.map +1 -0
  494. package/dist/types/IntegerType.d.ts +10 -5
  495. package/dist/types/IntegerType.js +25 -18
  496. package/dist/types/IntegerType.js.map +1 -1
  497. package/dist/types/IntegerType.spec.js +8 -4
  498. package/dist/types/IntegerType.spec.js.map +1 -1
  499. package/dist/types/InterfaceType.d.ts +14 -6
  500. package/dist/types/InterfaceType.js +26 -15
  501. package/dist/types/InterfaceType.js.map +1 -1
  502. package/dist/types/InterfaceType.spec.d.ts +1 -0
  503. package/dist/types/InterfaceType.spec.js +227 -0
  504. package/dist/types/InterfaceType.spec.js.map +1 -0
  505. package/dist/types/InvalidType.d.ts +9 -5
  506. package/dist/types/InvalidType.js +20 -9
  507. package/dist/types/InvalidType.js.map +1 -1
  508. package/dist/types/InvalidType.spec.js +8 -4
  509. package/dist/types/InvalidType.spec.js.map +1 -1
  510. package/dist/types/LongIntegerType.d.ts +10 -5
  511. package/dist/types/LongIntegerType.js +25 -18
  512. package/dist/types/LongIntegerType.js.map +1 -1
  513. package/dist/types/LongIntegerType.spec.js +10 -4
  514. package/dist/types/LongIntegerType.spec.js.map +1 -1
  515. package/dist/types/NamespaceType.d.ts +12 -0
  516. package/dist/types/NamespaceType.js +28 -0
  517. package/dist/types/NamespaceType.js.map +1 -0
  518. package/dist/types/ObjectType.d.ts +10 -5
  519. package/dist/types/ObjectType.js +23 -9
  520. package/dist/types/ObjectType.js.map +1 -1
  521. package/dist/types/ObjectType.spec.js +3 -3
  522. package/dist/types/ObjectType.spec.js.map +1 -1
  523. package/dist/types/ReferenceType.d.ts +71 -0
  524. package/dist/types/ReferenceType.js +467 -0
  525. package/dist/types/ReferenceType.js.map +1 -0
  526. package/dist/types/ReferenceType.spec.d.ts +1 -0
  527. package/dist/types/ReferenceType.spec.js +151 -0
  528. package/dist/types/ReferenceType.spec.js.map +1 -0
  529. package/dist/types/StringType.d.ts +13 -5
  530. package/dist/types/StringType.js +25 -9
  531. package/dist/types/StringType.js.map +1 -1
  532. package/dist/types/StringType.spec.js +3 -3
  533. package/dist/types/StringType.spec.js.map +1 -1
  534. package/dist/types/TypedFunctionType.d.ts +33 -0
  535. package/dist/types/TypedFunctionType.js +106 -0
  536. package/dist/types/TypedFunctionType.js.map +1 -0
  537. package/dist/types/TypedFunctionType.spec.d.ts +1 -0
  538. package/dist/types/TypedFunctionType.spec.js +122 -0
  539. package/dist/types/TypedFunctionType.spec.js.map +1 -0
  540. package/dist/types/UninitializedType.d.ts +8 -6
  541. package/dist/types/UninitializedType.js +15 -9
  542. package/dist/types/UninitializedType.js.map +1 -1
  543. package/dist/types/UnionType.d.ts +20 -0
  544. package/dist/types/UnionType.js +127 -0
  545. package/dist/types/UnionType.js.map +1 -0
  546. package/dist/types/UnionType.spec.d.ts +1 -0
  547. package/dist/types/UnionType.spec.js +129 -0
  548. package/dist/types/UnionType.spec.js.map +1 -0
  549. package/dist/types/VoidType.d.ts +10 -5
  550. package/dist/types/VoidType.js +20 -9
  551. package/dist/types/VoidType.js.map +1 -1
  552. package/dist/types/VoidType.spec.js +3 -3
  553. package/dist/types/VoidType.spec.js.map +1 -1
  554. package/dist/types/helper.spec.d.ts +1 -0
  555. package/dist/types/helper.spec.js +144 -0
  556. package/dist/types/helper.spec.js.map +1 -0
  557. package/dist/types/helpers.d.ts +24 -0
  558. package/dist/types/helpers.js +178 -0
  559. package/dist/types/helpers.js.map +1 -0
  560. package/dist/types/index.d.ts +22 -0
  561. package/dist/types/index.js +39 -0
  562. package/dist/types/index.js.map +1 -0
  563. package/dist/util.d.ts +216 -106
  564. package/dist/util.js +1289 -319
  565. package/dist/util.js.map +1 -1
  566. package/dist/validators/ClassValidator.d.ts +9 -15
  567. package/dist/validators/ClassValidator.js +81 -134
  568. package/dist/validators/ClassValidator.js.map +1 -1
  569. package/package.json +169 -138
  570. package/dist/astUtils/index.d.ts +0 -7
  571. package/dist/astUtils/index.js +0 -26
  572. package/dist/astUtils/index.js.map +0 -1
  573. package/dist/lexer/index.d.ts +0 -3
  574. package/dist/lexer/index.js +0 -17
  575. package/dist/lexer/index.js.map +0 -1
  576. package/dist/parser/index.d.ts +0 -3
  577. package/dist/parser/index.js +0 -16
  578. package/dist/parser/index.js.map +0 -1
  579. package/dist/preprocessor/Chunk.d.ts +0 -82
  580. package/dist/preprocessor/Chunk.js +0 -77
  581. package/dist/preprocessor/Chunk.js.map +0 -1
  582. package/dist/preprocessor/Preprocessor.d.ts +0 -60
  583. package/dist/preprocessor/Preprocessor.js +0 -156
  584. package/dist/preprocessor/Preprocessor.js.map +0 -1
  585. package/dist/preprocessor/Preprocessor.spec.js +0 -152
  586. package/dist/preprocessor/Preprocessor.spec.js.map +0 -1
  587. package/dist/preprocessor/PreprocessorParser.d.ts +0 -61
  588. package/dist/preprocessor/PreprocessorParser.js +0 -194
  589. package/dist/preprocessor/PreprocessorParser.js.map +0 -1
  590. package/dist/preprocessor/PreprocessorParser.spec.js +0 -116
  591. package/dist/preprocessor/PreprocessorParser.spec.js.map +0 -1
  592. package/dist/preprocessor/index.d.ts +0 -3
  593. package/dist/preprocessor/index.js +0 -16
  594. package/dist/preprocessor/index.js.map +0 -1
  595. package/dist/types/CustomType.d.ts +0 -10
  596. package/dist/types/CustomType.js +0 -35
  597. package/dist/types/CustomType.js.map +0 -1
  598. package/dist/types/FunctionType.spec.js +0 -29
  599. package/dist/types/FunctionType.spec.js.map +0 -1
  600. package/dist/types/LazyType.d.ts +0 -15
  601. package/dist/types/LazyType.js +0 -32
  602. package/dist/types/LazyType.js.map +0 -1
  603. /package/dist/{preprocessor/Preprocessor.spec.d.ts → astUtils/Editor.spec.d.ts} +0 -0
  604. /package/dist/{preprocessor/PreprocessorParser.spec.d.ts → bscPlugin/completions/CompletionsProcessor.spec.d.ts} +0 -0
  605. /package/dist/{types/FunctionType.spec.d.ts → bscPlugin/definition/DefinitionProvider.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, stagingDir: testHelpers_spec_2.stagingDir });
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,45 +176,56 @@ 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()), { range: vscode_languageserver_1.Range.create(9, 24, 9, 25) }), Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classConstructorIllegalUseOfMBeforeSuperCall()), { 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
  `, `
@@ -199,7 +233,7 @@ describe('BrsFile BrighterScript classes', () => {
199
233
  instance = {}
200
234
  instance.new = sub()
201
235
  m.species1 = "Animal"
202
- print "From Animal: " + m.species
236
+ print "From Animal: " + m.species1
203
237
  end sub
204
238
  return instance
205
239
  end function
@@ -214,7 +248,7 @@ describe('BrsFile BrighterScript classes', () => {
214
248
  instance.new = sub()
215
249
  m.super0_new()
216
250
  m.species2 = "Duck"
217
- print "From Duck: " + m.species
251
+ print "From Duck: " + m.species2
218
252
  end sub
219
253
  return instance
220
254
  end function
@@ -225,8 +259,84 @@ describe('BrsFile BrighterScript classes', () => {
225
259
  end function
226
260
  `, 'trim', 'source/main.bs');
227
261
  });
228
- it('handles class inheritance inferred constructor calls', () => {
229
- testTranspile(`
262
+ it('allows comments as first line of constructor', async () => {
263
+ await testTranspile(`
264
+ class Animal
265
+ end class
266
+ class Duck extends Animal
267
+ sub new()
268
+ 'comment should not cause double super call
269
+ super()
270
+ end sub
271
+ end class
272
+ `, `
273
+ function __Animal_builder()
274
+ instance = {}
275
+ instance.new = sub()
276
+ end sub
277
+ return instance
278
+ end function
279
+ function Animal()
280
+ instance = __Animal_builder()
281
+ instance.new()
282
+ return instance
283
+ end function
284
+ function __Duck_builder()
285
+ instance = __Animal_builder()
286
+ instance.super0_new = instance.new
287
+ instance.new = sub()
288
+ 'comment should not cause double super call
289
+ m.super0_new()
290
+ end sub
291
+ return instance
292
+ end function
293
+ function Duck()
294
+ instance = __Duck_builder()
295
+ instance.new()
296
+ return instance
297
+ end function
298
+ `);
299
+ });
300
+ it('does not inject a call to super if one exists', async () => {
301
+ await testTranspile(`
302
+ class Animal
303
+ end class
304
+ class Duck extends Animal
305
+ sub new()
306
+ print "I am a statement which does not use m"
307
+ super()
308
+ end sub
309
+ end class
310
+ `, `
311
+ function __Animal_builder()
312
+ instance = {}
313
+ instance.new = sub()
314
+ end sub
315
+ return instance
316
+ end function
317
+ function Animal()
318
+ instance = __Animal_builder()
319
+ instance.new()
320
+ return instance
321
+ end function
322
+ function __Duck_builder()
323
+ instance = __Animal_builder()
324
+ instance.super0_new = instance.new
325
+ instance.new = sub()
326
+ print "I am a statement which does not use m"
327
+ m.super0_new()
328
+ end sub
329
+ return instance
330
+ end function
331
+ function Duck()
332
+ instance = __Duck_builder()
333
+ instance.new()
334
+ return instance
335
+ end function
336
+ `);
337
+ });
338
+ it('handles class inheritance inferred constructor calls', async () => {
339
+ await testTranspile(`
230
340
  class Animal
231
341
  className1 = "Animal"
232
342
  end class
@@ -279,8 +389,8 @@ describe('BrsFile BrighterScript classes', () => {
279
389
  end function
280
390
  `, undefined, 'source/main.bs');
281
391
  });
282
- it('works with namespaces', () => {
283
- testTranspile(`
392
+ it('works with namespaces', async () => {
393
+ await testTranspile(`
284
394
  namespace Birds.WaterFowl
285
395
  class Duck
286
396
  end class
@@ -314,8 +424,8 @@ describe('BrsFile BrighterScript classes', () => {
314
424
  end function
315
425
  `, undefined, 'source/main.bs');
316
426
  });
317
- it('works for simple class', () => {
318
- testTranspile(`
427
+ it('works for simple class', async () => {
428
+ await testTranspile(`
319
429
  class Duck
320
430
  end class
321
431
  `, `
@@ -332,8 +442,8 @@ describe('BrsFile BrighterScript classes', () => {
332
442
  end function
333
443
  `, undefined, 'source/main.bs');
334
444
  });
335
- it('registers the constructor and properly handles its parameters', () => {
336
- testTranspile(`
445
+ it('registers the constructor and properly handles its parameters', async () => {
446
+ await testTranspile(`
337
447
  class Duck
338
448
  sub new(name as string, age as integer)
339
449
  end sub
@@ -352,11 +462,14 @@ describe('BrsFile BrighterScript classes', () => {
352
462
  end function
353
463
  `, undefined, 'source/main.bs');
354
464
  });
355
- it('properly handles child class constructor override and super calls', () => {
356
- testTranspile(`
465
+ it('properly handles child class constructor override and super calls', async () => {
466
+ await testTranspile(`
357
467
  class Animal
358
468
  sub new(name as string)
359
469
  end sub
470
+
471
+ sub DoSomething()
472
+ end sub
360
473
  end class
361
474
 
362
475
  class Duck extends Animal
@@ -370,6 +483,8 @@ describe('BrsFile BrighterScript classes', () => {
370
483
  instance = {}
371
484
  instance.new = sub(name as string)
372
485
  end sub
486
+ instance.DoSomething = sub()
487
+ end sub
373
488
  return instance
374
489
  end function
375
490
  function Animal(name as string)
@@ -393,8 +508,8 @@ describe('BrsFile BrighterScript classes', () => {
393
508
  end function
394
509
  `, undefined, 'source/main.bs');
395
510
  });
396
- it('transpiles super in nested blocks', () => {
397
- testTranspile(`
511
+ it('transpiles super in nested blocks', async () => {
512
+ await testTranspile(`
398
513
  class Creature
399
514
  sub new(name as string)
400
515
  end sub
@@ -435,7 +550,7 @@ describe('BrsFile BrighterScript classes', () => {
435
550
  instance.super0_sayHello = instance.sayHello
436
551
  instance.sayHello = function(text)
437
552
  text = "The duck says " + text
438
- if text <> invalid then
553
+ if text <> invalid
439
554
  m.super0_sayHello(text)
440
555
  end if
441
556
  end function
@@ -448,7 +563,7 @@ describe('BrsFile BrighterScript classes', () => {
448
563
  end function
449
564
  `, 'trim', 'source/main.bs');
450
565
  });
451
- it('properly transpiles classes from outside current namespace', () => {
566
+ it('properly transpiles classes from outside current namespace', async () => {
452
567
  addFile('source/Animals.bs', `
453
568
  namespace Animals
454
569
  class Duck
@@ -457,7 +572,7 @@ describe('BrsFile BrighterScript classes', () => {
457
572
  class Bird
458
573
  end class
459
574
  `);
460
- testTranspile(`
575
+ await testTranspile(`
461
576
  namespace Animals
462
577
  sub init()
463
578
  donaldDuck = new Duck()
@@ -473,8 +588,8 @@ describe('BrsFile BrighterScript classes', () => {
473
588
  end sub
474
589
  `, undefined, 'source/main.bs');
475
590
  });
476
- it('properly transpiles new statement for missing class ', () => {
477
- testTranspile(`
591
+ it('properly transpiles new statement for missing class ', async () => {
592
+ await testTranspile(`
478
593
  sub main()
479
594
  bob = new Human()
480
595
  end sub
@@ -484,14 +599,14 @@ describe('BrsFile BrighterScript classes', () => {
484
599
  end sub
485
600
  `, undefined, 'source/main.bs', false);
486
601
  });
487
- it('new keyword transpiles correctly', () => {
602
+ it('new keyword transpiles correctly', async () => {
488
603
  addFile('source/Animal.bs', `
489
604
  class Animal
490
605
  sub new(name as string)
491
606
  end sub
492
607
  end class
493
608
  `);
494
- testTranspile(`
609
+ await testTranspile(`
495
610
  sub main()
496
611
  a = new Animal("donald")
497
612
  end sub
@@ -501,8 +616,73 @@ describe('BrsFile BrighterScript classes', () => {
501
616
  end sub
502
617
  `, undefined, 'source/main.bs');
503
618
  });
504
- it('does not screw up local variable references', () => {
505
- testTranspile(`
619
+ it('calls super ', async () => {
620
+ const { file } = await testTranspile(`
621
+ class Parent
622
+ sub new()
623
+ end sub
624
+ end class
625
+ class Child extends Parent
626
+ sub new()
627
+ end sub
628
+ end class
629
+ `, `
630
+ function __Parent_builder()
631
+ instance = {}
632
+ instance.new = sub()
633
+ end sub
634
+ return instance
635
+ end function
636
+ function Parent()
637
+ instance = __Parent_builder()
638
+ instance.new()
639
+ return instance
640
+ end function
641
+ function __Child_builder()
642
+ instance = __Parent_builder()
643
+ instance.super0_new = instance.new
644
+ instance.new = sub()
645
+ m.super0_new()
646
+ end sub
647
+ return instance
648
+ end function
649
+ function Child()
650
+ instance = __Child_builder()
651
+ instance.new()
652
+ return instance
653
+ end function
654
+ `, undefined, undefined, false);
655
+ //the AST should not be permanently modified
656
+ const constructor = file.ast.statements[0].body[0];
657
+ (0, chai_config_spec_1.expect)(constructor.func.body.statements).to.be.lengthOf(0);
658
+ });
659
+ it('adds field initializers', async () => {
660
+ const { file } = await testTranspile(`
661
+ class Person
662
+ sub new()
663
+ end sub
664
+ name = "Bob"
665
+ end class
666
+ `, `
667
+ function __Person_builder()
668
+ instance = {}
669
+ instance.new = sub()
670
+ m.name = "Bob"
671
+ end sub
672
+ return instance
673
+ end function
674
+ function Person()
675
+ instance = __Person_builder()
676
+ instance.new()
677
+ return instance
678
+ end function
679
+ `);
680
+ //the AST should not be permanently modified
681
+ const constructor = file.ast.statements[0].body[0];
682
+ (0, chai_config_spec_1.expect)(constructor.func.body.statements).to.be.lengthOf(0);
683
+ });
684
+ it('does not screw up local variable references', async () => {
685
+ await testTranspile(`
506
686
  class Animal
507
687
  sub new(name as string)
508
688
  m.name = name
@@ -600,17 +780,19 @@ describe('BrsFile BrighterScript classes', () => {
600
780
  smokey = Animal("Smokey")
601
781
  smokey.move(1)
602
782
  '> Bear moved 1 meters
783
+
603
784
  donald = Duck("Donald")
604
785
  donald.move(2)
605
786
  '> Waddling...\\nDonald moved 2 meters
787
+
606
788
  dewey = BabyDuck("Dewey")
607
789
  dewey.move(3)
608
790
  '> Waddling...\\nDewey moved 2 meters\\nFell over...I'm new at this
609
791
  end sub
610
792
  `, 'trim', 'source/main.bs');
611
793
  });
612
- it('calculates the proper super index', () => {
613
- testTranspile(`
794
+ it('calculates the proper super index', async () => {
795
+ await testTranspile(`
614
796
  class Duck
615
797
  public sub walk(meters as integer)
616
798
  print "Walked " + meters.ToStr() + " meters"
@@ -658,10 +840,308 @@ describe('BrsFile BrighterScript classes', () => {
658
840
  end function
659
841
  `, 'trim', 'source/main.bs');
660
842
  });
843
+ it('adds namespacing to constructors on field definitions', async () => {
844
+ await testTranspile(`
845
+ namespace MyNS
846
+ class KlassOne
847
+ other = new KlassTwo()
848
+ end class
849
+
850
+ class KlassTwo
851
+ end class
852
+ end namespace
853
+ `, `
854
+ function __MyNS_KlassOne_builder()
855
+ instance = {}
856
+ instance.new = sub()
857
+ m.other = MyNS_KlassTwo()
858
+ end sub
859
+ return instance
860
+ end function
861
+ function MyNS_KlassOne()
862
+ instance = __MyNS_KlassOne_builder()
863
+ instance.new()
864
+ return instance
865
+ end function
866
+ function __MyNS_KlassTwo_builder()
867
+ instance = {}
868
+ instance.new = sub()
869
+ end sub
870
+ return instance
871
+ end function
872
+ function MyNS_KlassTwo()
873
+ instance = __MyNS_KlassTwo_builder()
874
+ instance.new()
875
+ return instance
876
+ end function
877
+ `, 'trim', 'source/main.bs');
878
+ });
879
+ it('works with enums as field initial values inside a namespace', async () => {
880
+ await testTranspile(`
881
+ namespace MyNS
882
+ class HasEnumKlass
883
+ enumValue = MyEnum.A
884
+ end class
885
+ enum MyEnum
886
+ A = "A"
887
+ B = "B"
888
+ end enum
889
+ end namespace
890
+ `, `
891
+ function __MyNS_HasEnumKlass_builder()
892
+ instance = {}
893
+ instance.new = sub()
894
+ m.enumValue = "A"
895
+ end sub
896
+ return instance
897
+ end function
898
+ function MyNS_HasEnumKlass()
899
+ instance = __MyNS_HasEnumKlass_builder()
900
+ instance.new()
901
+ return instance
902
+ end function
903
+ `, 'trim', 'source/main.bs');
904
+ });
905
+ it('allows enums as super args inside a namespace', async () => {
906
+ await testTranspile(`
907
+ namespace MyNS
908
+ class SubKlass extends SuperKlass
909
+ sub new()
910
+ super(MyEnum.B)
911
+ end sub
912
+ end class
913
+
914
+ class SuperKlass
915
+ sub new(enumVal as MyEnum)
916
+ print enumVal
917
+ end sub
918
+ end class
919
+
920
+ enum MyEnum
921
+ A = "A"
922
+ B = "B"
923
+ end enum
924
+ end namespace
925
+ `, `
926
+ function __MyNS_SubKlass_builder()
927
+ instance = __MyNS_SuperKlass_builder()
928
+ instance.super0_new = instance.new
929
+ instance.new = sub()
930
+ m.super0_new("B")
931
+ end sub
932
+ return instance
933
+ end function
934
+ function MyNS_SubKlass()
935
+ instance = __MyNS_SubKlass_builder()
936
+ instance.new()
937
+ return instance
938
+ end function
939
+ function __MyNS_SuperKlass_builder()
940
+ instance = {}
941
+ instance.new = sub(enumVal as dynamic)
942
+ print enumVal
943
+ end sub
944
+ return instance
945
+ end function
946
+ function MyNS_SuperKlass(enumVal as dynamic)
947
+ instance = __MyNS_SuperKlass_builder()
948
+ instance.new(enumVal)
949
+ return instance
950
+ end function
951
+ `, 'trim', 'source/main.bs');
952
+ });
953
+ it('works with enums as values referenced in a namespace directly', async () => {
954
+ await testTranspile(`
955
+ namespace MyNS
956
+ class HasEnumKlass
957
+ myArray = [true, true] as boolean[]
958
+ sub new()
959
+ m.myArray[MyEnum.A] = true
960
+ m.myArray[MyEnum.B] = false
961
+ end sub
962
+ end class
963
+ enum MyEnum
964
+ A = 0
965
+ B = 1
966
+ end enum
967
+ end namespace
968
+ `, `
969
+ function __MyNS_HasEnumKlass_builder()
970
+ instance = {}
971
+ instance.new = sub()
972
+ m.myArray = [
973
+ true
974
+ true
975
+ ]
976
+ m.myArray[0] = true
977
+ m.myArray[1] = false
978
+ end sub
979
+ return instance
980
+ end function
981
+ function MyNS_HasEnumKlass()
982
+ instance = __MyNS_HasEnumKlass_builder()
983
+ instance.new()
984
+ return instance
985
+ end function
986
+ `, 'trim', 'source/main.bs');
987
+ });
988
+ it('works with enums as values referenced in a namespace with namespace', async () => {
989
+ await testTranspile(`
990
+ namespace MyNS
991
+ class HasEnumKlass
992
+ myArray = [true, true] as boolean[]
993
+ sub new()
994
+ m.myArray[MyNS.MyEnum.A] = true
995
+ m.myArray[MyNS.MyEnum.B] = false
996
+ end sub
997
+ end class
998
+ enum MyEnum
999
+ A = 0
1000
+ B = 1
1001
+ end enum
1002
+ end namespace
1003
+ `, `
1004
+ function __MyNS_HasEnumKlass_builder()
1005
+ instance = {}
1006
+ instance.new = sub()
1007
+ m.myArray = [
1008
+ true
1009
+ true
1010
+ ]
1011
+ m.myArray[0] = true
1012
+ m.myArray[1] = false
1013
+ end sub
1014
+ return instance
1015
+ end function
1016
+ function MyNS_HasEnumKlass()
1017
+ instance = __MyNS_HasEnumKlass_builder()
1018
+ instance.new()
1019
+ return instance
1020
+ end function
1021
+ `, 'trim', 'source/main.bs');
1022
+ });
1023
+ it('allows namespaced class function as function parameters', async () => {
1024
+ await testTranspile(`
1025
+ namespace Alpha
1026
+ function foo()
1027
+ return 1
1028
+ end function
1029
+
1030
+ function callSomeFunc(f as function)
1031
+ return f()
1032
+ end function
1033
+
1034
+ sub callFoo()
1035
+ callSomeFunc(foo)
1036
+ end sub
1037
+ end namespace
1038
+ `, `
1039
+ function Alpha_foo()
1040
+ return 1
1041
+ end function
1042
+
1043
+ function Alpha_callSomeFunc(f as function)
1044
+ return f()
1045
+ end function
1046
+
1047
+ sub Alpha_callFoo()
1048
+ Alpha_callSomeFunc(Alpha_foo)
1049
+ end sub
1050
+ `, 'trim', 'source/main.bs');
1051
+ });
1052
+ it('allows namespaced class constructors as function parameters', async () => {
1053
+ await testTranspile(`
1054
+ namespace Alpha
1055
+ class Button
1056
+ end class
1057
+
1058
+ function callSomeFunc(f as function)
1059
+ return f()
1060
+ end function
1061
+
1062
+ sub makeButton()
1063
+ callSomeFunc(Button)
1064
+ end sub
1065
+ end namespace
1066
+ `, `
1067
+ function __Alpha_Button_builder()
1068
+ instance = {}
1069
+ instance.new = sub()
1070
+ end sub
1071
+ return instance
1072
+ end function
1073
+ function Alpha_Button()
1074
+ instance = __Alpha_Button_builder()
1075
+ instance.new()
1076
+ return instance
1077
+ end function
1078
+
1079
+ function Alpha_callSomeFunc(f as function)
1080
+ return f()
1081
+ end function
1082
+
1083
+ sub Alpha_makeButton()
1084
+ Alpha_callSomeFunc(Alpha_Button)
1085
+ end sub
1086
+ `, 'trim', 'source/main.bs');
1087
+ });
1088
+ it('allows class constructors as functions in array', async () => {
1089
+ await testTranspile(`
1090
+ namespace Alpha
1091
+ class Button
1092
+ end class
1093
+
1094
+ class ButtonContainer
1095
+ private button = new Alpha.Button()
1096
+
1097
+ sub new()
1098
+ m.init()
1099
+ end sub
1100
+
1101
+ sub init()
1102
+ button = new Alpha.Button()
1103
+ items = [m.button, button, Alpha.Button]
1104
+ end sub
1105
+ end class
1106
+ end namespace
1107
+ `, `
1108
+ function __Alpha_Button_builder()
1109
+ instance = {}
1110
+ instance.new = sub()
1111
+ end sub
1112
+ return instance
1113
+ end function
1114
+ function Alpha_Button()
1115
+ instance = __Alpha_Button_builder()
1116
+ instance.new()
1117
+ return instance
1118
+ end function
1119
+ function __Alpha_ButtonContainer_builder()
1120
+ instance = {}
1121
+ instance.new = sub()
1122
+ m.button = Alpha_Button()
1123
+ m.init()
1124
+ end sub
1125
+ instance.init = sub()
1126
+ button = Alpha_Button()
1127
+ items = [
1128
+ m.button
1129
+ Alpha_button
1130
+ Alpha_Button
1131
+ ]
1132
+ end sub
1133
+ return instance
1134
+ end function
1135
+ function Alpha_ButtonContainer()
1136
+ instance = __Alpha_ButtonContainer_builder()
1137
+ instance.new()
1138
+ return instance
1139
+ end function
1140
+ `, 'trim', 'source/main.bs');
1141
+ });
661
1142
  });
662
1143
  it('detects using `new` keyword on non-classes', () => {
663
- var _a;
664
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1144
+ program.setFile('source/main.bs', `
665
1145
  sub quack()
666
1146
  end sub
667
1147
  sub main()
@@ -669,11 +1149,12 @@ describe('BrsFile BrighterScript classes', () => {
669
1149
  end sub
670
1150
  `);
671
1151
  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);
1152
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1153
+ DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('quack')
1154
+ ]);
673
1155
  });
674
1156
  it('detects missing call to super', () => {
675
- var _a;
676
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1157
+ program.setFile('source/main.bs', `
677
1158
  class Animal
678
1159
  sub new()
679
1160
  end sub
@@ -684,11 +1165,12 @@ describe('BrsFile BrighterScript classes', () => {
684
1165
  end class
685
1166
  `);
686
1167
  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);
1168
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1169
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
1170
+ ]);
688
1171
  });
689
1172
  it.skip('detects calls to unknown m methods', () => {
690
- var _a;
691
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1173
+ program.setFile('source/main.bs', `
692
1174
  class Animal
693
1175
  sub new()
694
1176
  m.methodThatDoesNotExist()
@@ -696,10 +1178,96 @@ describe('BrsFile BrighterScript classes', () => {
696
1178
  end class
697
1179
  `);
698
1180
  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'));
1181
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1182
+ DiagnosticMessages_1.DiagnosticMessages.methodDoesNotExistOnType('methodThatDoesNotExist', 'Animal')
1183
+ ]);
1184
+ });
1185
+ it('detects direct circular extends', () => {
1186
+ //direct
1187
+ program.setFile('source/Direct.bs', `
1188
+ class Parent extends Child
1189
+ end class
1190
+
1191
+ class Child extends Parent
1192
+ end class
1193
+ `);
1194
+ program.validate();
1195
+ (0, chai_config_spec_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
1196
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Child', 'Parent', 'Child'], 'source').message,
1197
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Parent', 'Child', 'Parent'], 'source').message
1198
+ ]);
1199
+ });
1200
+ it('detects indirect circular extends', () => {
1201
+ //direct
1202
+ program.setFile('source/Indirect.bs', `
1203
+ class Parent extends Grandchild
1204
+ end class
1205
+
1206
+ class Child extends Parent
1207
+ end class
1208
+
1209
+ class Grandchild extends Child
1210
+ end class
1211
+ `);
1212
+ program.validate();
1213
+ (0, chai_config_spec_1.expect)(program.getDiagnostics().map(x => x.message).sort()).to.eql([
1214
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Child', 'Parent', 'Grandchild', 'Child'], 'source').message,
1215
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Grandchild', 'Child', 'Parent', 'Grandchild'], 'source').message,
1216
+ DiagnosticMessages_1.DiagnosticMessages.circularReferenceDetected(['Parent', 'Grandchild', 'Child', 'Parent'], 'source').message
1217
+ ]);
1218
+ });
1219
+ it('transpiles super method calls twice', async () => {
1220
+ program.setFile('source/lib.bs', `
1221
+ class Being
1222
+ function think()
1223
+ print "thinking..."
1224
+ end function
1225
+ end class
1226
+
1227
+ class Human extends Being
1228
+ function think()
1229
+ super.think()
1230
+ end function
1231
+ end class
1232
+ `);
1233
+ await program.build({ stagingDir: testHelpers_spec_2.stagingDir });
1234
+ fsExtra.emptyDirSync(testHelpers_spec_2.stagingDir);
1235
+ await program.build({ stagingDir: testHelpers_spec_2.stagingDir });
1236
+ (0, chai_config_spec_1.expect)(fsExtra.readFileSync((0, util_1.standardizePath) `${testHelpers_spec_2.stagingDir}/source/lib.brs`).toString().trimEnd()).to.eql((0, testHelpers_spec_1.trim) `
1237
+ function __Being_builder()
1238
+ instance = {}
1239
+ instance.new = sub()
1240
+ end sub
1241
+ instance.think = function()
1242
+ print "thinking..."
1243
+ end function
1244
+ return instance
1245
+ end function
1246
+ function Being()
1247
+ instance = __Being_builder()
1248
+ instance.new()
1249
+ return instance
1250
+ end function
1251
+ function __Human_builder()
1252
+ instance = __Being_builder()
1253
+ instance.super0_new = instance.new
1254
+ instance.new = sub()
1255
+ m.super0_new()
1256
+ end sub
1257
+ instance.think = function()
1258
+ m.super0_think()
1259
+ end function
1260
+ return instance
1261
+ end function
1262
+ function Human()
1263
+ instance = __Human_builder()
1264
+ instance.new()
1265
+ return instance
1266
+ end function
1267
+ `);
700
1268
  });
701
1269
  it('detects duplicate member names', () => {
702
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1270
+ program.setFile('source/main.bs', `
703
1271
  class Animal
704
1272
  public name
705
1273
  public name
@@ -713,32 +1281,26 @@ describe('BrsFile BrighterScript classes', () => {
713
1281
  end class
714
1282
  `);
715
1283
  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) })]);
1284
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [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) })]);
725
1285
  });
726
1286
  it('detects mismatched member type in child class', () => {
727
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1287
+ program.setFile('source/main.bs', `
728
1288
  class Animal
729
1289
  public name
730
1290
  end class
731
1291
  class Duck extends Animal
732
- public function name()
1292
+ public override function name()
733
1293
  return "Donald"
734
1294
  end function
735
1295
  end class
736
1296
  `);
737
1297
  program.validate();
738
- chai_1.expect(program.getDiagnostics().map(x => x.message).sort()[0]).to.eql(DiagnosticMessages_1.DiagnosticMessages.classChildMemberDifferentMemberTypeThanAncestor('method', 'field', 'Animal').message);
1298
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1299
+ DiagnosticMessages_1.DiagnosticMessages.classChildMemberDifferentMemberTypeThanAncestor('method', 'field', 'Animal')
1300
+ ]);
739
1301
  });
740
1302
  it('allows untyped overridden field in child class', () => {
741
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1303
+ program.setFile('source/main.bs', `
742
1304
  class Animal
743
1305
  public name
744
1306
  end class
@@ -747,7 +1309,7 @@ describe('BrsFile BrighterScript classes', () => {
747
1309
  end class
748
1310
  `);
749
1311
  program.validate();
750
- testHelpers_spec_1.expectZeroDiagnostics(program);
1312
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
751
1313
  });
752
1314
  it('allows overridden property name in child class', () => {
753
1315
  program.setFile('source/main.bs', `
@@ -759,7 +1321,7 @@ describe('BrsFile BrighterScript classes', () => {
759
1321
  end class
760
1322
  `);
761
1323
  program.validate();
762
- testHelpers_spec_1.expectZeroDiagnostics(program);
1324
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
763
1325
  });
764
1326
  it('flags incompatible child field type changes', () => {
765
1327
  program.setFile('source/main.bs', `
@@ -769,21 +1331,20 @@ describe('BrsFile BrighterScript classes', () => {
769
1331
  public owner as Person
770
1332
  end class
771
1333
  class Duck extends Bird
772
- public age = 12.2 'should be integer but is float
1334
+ public age = 12.2 'should be integer, but a float can be assigned to an int
773
1335
  public name = 12 'should be string but is integer
774
1336
  public owner as string
775
1337
  end class
776
1338
  `);
777
1339
  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
1340
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1341
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Person'),
1342
+ DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'name', 'integer', 'string'),
1343
+ DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person')
783
1344
  ]);
784
1345
  });
785
1346
  it('detects overridden methods without override keyword', () => {
786
- program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
1347
+ program.setFile('source/main.bs', `
787
1348
  class Animal
788
1349
  sub speak()
789
1350
  end sub
@@ -794,10 +1355,12 @@ describe('BrsFile BrighterScript classes', () => {
794
1355
  end class
795
1356
  `);
796
1357
  program.validate();
797
- chai_1.expect(program.getDiagnostics()[0]).to.exist.and.to.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')));
1358
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1359
+ DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')
1360
+ ]);
798
1361
  });
799
1362
  it('detects overridden methods with different visibility', () => {
800
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1363
+ program.setFile('source/main.bs', `
801
1364
  class Animal
802
1365
  sub speakInPublic()
803
1366
  end sub
@@ -816,12 +1379,14 @@ describe('BrsFile BrighterScript classes', () => {
816
1379
  end class
817
1380
  `);
818
1381
  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')));
1382
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1383
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakInPublic', 'private', 'public', 'Animal'),
1384
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFriends', 'public', 'protected', 'Animal'),
1385
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFamily', 'public', 'private', 'Animal')
1386
+ ]);
822
1387
  });
823
1388
  it('allows overridden methods with matching visibility', () => {
824
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1389
+ program.setFile('source/main.bs', `
825
1390
  class Animal
826
1391
  sub speakInPublic()
827
1392
  end sub
@@ -840,20 +1405,95 @@ describe('BrsFile BrighterScript classes', () => {
840
1405
  end class
841
1406
  `);
842
1407
  program.validate();
843
- chai_1.expect(program.getDiagnostics()).to.be.empty;
1408
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
844
1409
  });
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) }));
1410
+ describe('detects unknown parent class', () => {
1411
+ it('non-namespaced parent from outside namespace', () => {
1412
+ program.setFile('source/main.bs', `
1413
+ class Duck extends Animal
1414
+ sub speak()
1415
+ end sub
1416
+ end class
1417
+
1418
+ namespace Vertibrates
1419
+ class Animal
1420
+ end class
1421
+ end namespace
1422
+ `);
1423
+ program.validate();
1424
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')), { range: vscode_languageserver_1.Range.create(1, 35, 1, 41) })]);
1425
+ });
1426
+ it('non-namespaced parent from within namespace', () => {
1427
+ program.setFile('source/main.bs', `
1428
+ namespace Vertibrates
1429
+ class Duck extends Animal
1430
+ sub speak()
1431
+ end sub
1432
+ end class
1433
+ end namespace
1434
+ `);
1435
+ program.validate();
1436
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1437
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')
1438
+ ]);
1439
+ });
1440
+ it('non-namespaced name from outside namespace alongside existing namespace', () => {
1441
+ program.setFile('source/main.bs', `
1442
+ namespace Vertibrates
1443
+ class Animal
1444
+ end class
1445
+ end namespace
1446
+
1447
+ class Duck extends Animal
1448
+ sub speak()
1449
+ end sub
1450
+ end class
1451
+ `);
1452
+ program.validate();
1453
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1454
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('Animal')
1455
+ ]);
1456
+ });
1457
+ it('namespaced parent class from outside namespace', () => {
1458
+ program.setFile('source/vertibrates.bs', `
1459
+ namespace Vertibrates
1460
+ class Bird
1461
+ end class
1462
+ end namespace
1463
+ `);
1464
+ program.setFile('source/Duck.bs', `
1465
+ class Duck extends Vertibrates.GroundedBird
1466
+ sub speak()
1467
+ end sub
1468
+ end class
1469
+ `);
1470
+ program.validate();
1471
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.cannotFindName('GroundedBird', 'Vertibrates.GroundedBird', 'Vertibrates', 'namespace')), { relatedInformation: [{
1472
+ message: `In scope 'source'`
1473
+ }] })]);
1474
+ });
1475
+ it('namespaced parent class from inside namespace', () => {
1476
+ program.setFile('source/vertibrates.bs', `
1477
+ namespace Vertibrates
1478
+ class Bird
1479
+ end class
1480
+ end namespace
1481
+ `);
1482
+ program.setFile('source/Duck.bs', `
1483
+ namespace Birdies
1484
+ class Duck extends Vertibrates.GroundedBird
1485
+ sub speak()
1486
+ end sub
1487
+ end class
1488
+ end namespace
1489
+ `);
1490
+ program.validate();
1491
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1492
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('GroundedBird', 'Vertibrates.GroundedBird', 'Vertibrates', 'namespace').message
1493
+ ]);
1494
+ });
854
1495
  });
855
1496
  it('catches newable class without namespace name', () => {
856
- var _a;
857
1497
  program.setFile('source/main.bs', `
858
1498
  namespace NameA.NameB
859
1499
  class Duck
@@ -865,11 +1505,13 @@ describe('BrsFile BrighterScript classes', () => {
865
1505
  end sub
866
1506
  `);
867
1507
  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);
1508
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1509
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindFunction('Duck').message,
1510
+ DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('Duck')
1511
+ ]);
869
1512
  });
870
1513
  it('supports newable class namespace inference', () => {
871
- var _a;
872
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1514
+ program.setFile('source/main.bs', `
873
1515
  namespace NameA.NameB
874
1516
  class Duck
875
1517
  end class
@@ -879,24 +1521,24 @@ describe('BrsFile BrighterScript classes', () => {
879
1521
  end namespace
880
1522
  `);
881
1523
  program.validate();
882
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
1524
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
883
1525
  });
884
1526
  it('catches extending unknown namespaced class', () => {
885
- var _a;
886
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1527
+ program.setFile('source/main.bs', `
887
1528
  namespace NameA.NameB
888
1529
  class Animal
889
1530
  end class
890
- class Duck extends NameA.NameB.Animal1
1531
+ class Duck extends NameA.NameB.AnimalNotDefined
891
1532
  end class
892
1533
  end namespace
893
1534
  `);
894
1535
  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);
1536
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1537
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('AnimalNotDefined', 'NameA.NameB.AnimalNotDefined', 'NameA.NameB', 'namespace')
1538
+ ]);
896
1539
  });
897
1540
  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' }, `
1541
+ program.setFile('source/main.bs', `
900
1542
  namespace NameA.NameB
901
1543
  class Animal
902
1544
  end class
@@ -905,45 +1547,54 @@ describe('BrsFile BrighterScript classes', () => {
905
1547
  end namespace
906
1548
  `);
907
1549
  program.validate();
908
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
1550
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
909
1551
  });
910
1552
  it('catches duplicate root-level class declarations', () => {
911
- var _a;
912
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1553
+ program.setFile('source/main.bs', `
913
1554
  class Animal
914
1555
  end class
915
1556
  class Animal
1557
+ end class
916
1558
  `);
917
1559
  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);
1560
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1561
+ DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Class', 'Animal')
1562
+ ]);
919
1563
  });
920
1564
  it('catches duplicate namespace-level class declarations', () => {
921
- var _a;
922
- program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1565
+ program.setFile('source/main.bs', `
923
1566
  namespace NameA.NameB
924
1567
  class Animal
925
1568
  end class
926
1569
  class Animal
1570
+ end class
927
1571
  end namespace
928
1572
  `);
929
1573
  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);
1574
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1575
+ DiagnosticMessages_1.DiagnosticMessages.nameCollision('Class', 'Class', 'Animal').message
1576
+ ]);
931
1577
  });
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' }, `
1578
+ it('allows namespaced class name which is the same as a global class', () => {
1579
+ program.setFile('source/main.bs', `
935
1580
  namespace NameA.NameB
936
1581
  class Animal
1582
+ name as string
937
1583
  end class
1584
+
1585
+ sub printThisAnimalName(ani as Animal) ' this refers to NameA.NameB.Animal
1586
+ print ani.name
1587
+ end sub
938
1588
  end namespace
1589
+
939
1590
  class Animal
1591
+ doesNotHaveName as string
940
1592
  end class
941
1593
  `);
942
1594
  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);
1595
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
944
1596
  });
945
1597
  it('catches class with same name as function', () => {
946
- var _a;
947
1598
  program.setFile('source/main.bs', `
948
1599
  class Animal
949
1600
  end class
@@ -951,10 +1602,11 @@ describe('BrsFile BrighterScript classes', () => {
951
1602
  end sub
952
1603
  `);
953
1604
  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);
1605
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1606
+ DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('Animal').message
1607
+ ]);
955
1608
  });
956
1609
  it('catches class with same name (but different case) as function', () => {
957
- var _a;
958
1610
  program.setFile('source/main.bs', `
959
1611
  class ANIMAL
960
1612
  end class
@@ -962,10 +1614,11 @@ describe('BrsFile BrighterScript classes', () => {
962
1614
  end sub
963
1615
  `);
964
1616
  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);
1617
+ (0, testHelpers_spec_1.expectDiagnosticsIncludes)(program, [
1618
+ DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('animal').message
1619
+ ]);
966
1620
  });
967
1621
  it('catches variable with same name as class', () => {
968
- var _a;
969
1622
  program.setFile('source/main.bs', `
970
1623
  class Animal
971
1624
  end class
@@ -974,7 +1627,9 @@ describe('BrsFile BrighterScript classes', () => {
974
1627
  end sub
975
1628
  `);
976
1629
  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);
1630
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1631
+ DiagnosticMessages_1.DiagnosticMessages.localVarSameNameAsClass('Animal').message
1632
+ ]);
978
1633
  });
979
1634
  it('allows extending classes with more than one dot in the filename', () => {
980
1635
  program.setFile('source/testclass.bs', `
@@ -1002,9 +1657,9 @@ describe('BrsFile BrighterScript classes', () => {
1002
1657
  end class
1003
1658
  `);
1004
1659
  program.validate();
1005
- testHelpers_spec_1.expectZeroDiagnostics(program);
1660
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
1006
1661
  });
1007
- it('computes correct super index for grandchild class', () => {
1662
+ it('computes correct super index for grandchild class', async () => {
1008
1663
  program.setFile('source/main.bs', `
1009
1664
  sub Main()
1010
1665
  c = new App.ClassC()
@@ -1018,7 +1673,7 @@ describe('BrsFile BrighterScript classes', () => {
1018
1673
  end class
1019
1674
  end namespace
1020
1675
  `);
1021
- testTranspile(`
1676
+ await testTranspile(`
1022
1677
  namespace App
1023
1678
  class ClassC extends ClassB
1024
1679
  sub new()
@@ -1042,12 +1697,12 @@ describe('BrsFile BrighterScript classes', () => {
1042
1697
  end function
1043
1698
  `, 'trim', 'source/App.ClassC.bs');
1044
1699
  });
1045
- it('computes correct super index for namespaced child class and global parent class', () => {
1700
+ it('computes correct super index for namespaced child class and global parent class', async () => {
1046
1701
  program.setFile('source/ClassA.bs', `
1047
1702
  class ClassA
1048
1703
  end class
1049
1704
  `);
1050
- testTranspile(`
1705
+ await testTranspile(`
1051
1706
  namespace App
1052
1707
  class ClassB extends ClassA
1053
1708
  end class
@@ -1073,9 +1728,59 @@ describe('BrsFile BrighterScript classes', () => {
1073
1728
  class ClassB extends ClassA
1074
1729
  end class
1075
1730
  `);
1076
- assert_1.doesNotThrow(() => {
1077
- file.parser.references.classStatements[0].getParentClassIndex(new BrsTranspileState_1.BrsTranspileState(file));
1731
+ (0, assert_1.doesNotThrow)(() => {
1732
+ const classStatements = file.ast.findChildren(reflection_1.isClassStatement);
1733
+ classStatements[0]['getParentClassIndex'](new BrsTranspileState_1.BrsTranspileState(file));
1078
1734
  });
1079
1735
  });
1736
+ it('does not crash when child has field with same name as sub in parent', () => {
1737
+ program.setFile('source/main.bs', `
1738
+ class Parent
1739
+ public function helloWorld()
1740
+ end function
1741
+ end class
1742
+ class Child extends Parent
1743
+ public helloWorld as string
1744
+ end class
1745
+ `);
1746
+ program.validate();
1747
+ });
1748
+ it('does not crash when child has method with same name as field in parent', () => {
1749
+ program.setFile('source/main.bs', `
1750
+ class Parent
1751
+ public helloWorld as string
1752
+ end class
1753
+ class Child extends Parent
1754
+ public function helloWorld()
1755
+ end function
1756
+ end class
1757
+ `);
1758
+ program.validate();
1759
+ });
1760
+ it('detects calling class constructors with too many parameters', () => {
1761
+ program.setFile('source/main.bs', `
1762
+ class Parameterless
1763
+ sub new()
1764
+ end sub
1765
+ end class
1766
+
1767
+ class OneParam
1768
+ sub new(param1)
1769
+ end sub
1770
+ end class
1771
+
1772
+ sub main()
1773
+ c1 = new Parameterless(1)
1774
+ c2 = new OneParam(1, 2)
1775
+ c2 = new OneParam()
1776
+ end sub
1777
+ `);
1778
+ program.validate();
1779
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1780
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(0, 1),
1781
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 2),
1782
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 0)
1783
+ ]);
1784
+ });
1080
1785
  });
1081
1786
  //# sourceMappingURL=BrsFile.Class.spec.js.map