brighterscript 0.72.0 → 0.72.2

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