brighterscript 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (381) hide show
  1. package/CHANGELOG.md +542 -253
  2. package/README.md +30 -9
  3. package/bsconfig.schema.json +13 -1
  4. package/dist/BsConfig.d.ts +4 -0
  5. package/dist/Cache.d.ts +3 -8
  6. package/dist/Cache.js +9 -14
  7. package/dist/Cache.js.map +1 -1
  8. package/dist/CodeActionUtil.d.ts +11 -2
  9. package/dist/CodeActionUtil.js +17 -3
  10. package/dist/CodeActionUtil.js.map +1 -1
  11. package/dist/CommentFlagProcessor.d.ts +4 -4
  12. package/dist/CommentFlagProcessor.js +5 -3
  13. package/dist/CommentFlagProcessor.js.map +1 -1
  14. package/dist/DependencyGraph.js +5 -4
  15. package/dist/DependencyGraph.js.map +1 -1
  16. package/dist/DiagnosticFilterer.js +1 -1
  17. package/dist/DiagnosticFilterer.js.map +1 -1
  18. package/dist/DiagnosticMessages.d.ts +59 -4
  19. package/dist/DiagnosticMessages.js +65 -7
  20. package/dist/DiagnosticMessages.js.map +1 -1
  21. package/dist/LanguageServer.d.ts +4 -14
  22. package/dist/LanguageServer.js +40 -26
  23. package/dist/LanguageServer.js.map +1 -1
  24. package/dist/Logger.d.ts +2 -0
  25. package/dist/Logger.js +10 -8
  26. package/dist/Logger.js.map +1 -1
  27. package/dist/PluginInterface.d.ts +7 -3
  28. package/dist/PluginInterface.js +9 -0
  29. package/dist/PluginInterface.js.map +1 -1
  30. package/dist/Program.d.ts +43 -25
  31. package/dist/Program.js +180 -82
  32. package/dist/Program.js.map +1 -1
  33. package/dist/ProgramBuilder.d.ts +4 -0
  34. package/dist/ProgramBuilder.js +30 -14
  35. package/dist/ProgramBuilder.js.map +1 -1
  36. package/dist/Scope.d.ts +100 -28
  37. package/dist/Scope.js +382 -154
  38. package/dist/Scope.js.map +1 -1
  39. package/dist/SemanticTokenUtils.d.ts +14 -0
  40. package/dist/SemanticTokenUtils.js +81 -0
  41. package/dist/SemanticTokenUtils.js.map +1 -0
  42. package/dist/SymbolTable.d.ts +10 -4
  43. package/dist/SymbolTable.js +40 -13
  44. package/dist/SymbolTable.js.map +1 -1
  45. package/dist/XmlScope.d.ts +8 -3
  46. package/dist/XmlScope.js +65 -27
  47. package/dist/XmlScope.js.map +1 -1
  48. package/dist/astUtils/AstEditor.d.ts +33 -0
  49. package/dist/astUtils/AstEditor.js +107 -0
  50. package/dist/astUtils/AstEditor.js.map +1 -0
  51. package/dist/{types/FunctionType.spec.d.ts → astUtils/AstEditor.spec.d.ts} +0 -0
  52. package/dist/astUtils/AstEditor.spec.js +170 -0
  53. package/dist/astUtils/AstEditor.spec.js.map +1 -0
  54. package/dist/astUtils/creators.d.ts +24 -6
  55. package/dist/astUtils/creators.js +130 -19
  56. package/dist/astUtils/creators.js.map +1 -1
  57. package/dist/astUtils/creators.spec.js +14 -4
  58. package/dist/astUtils/creators.spec.js.map +1 -1
  59. package/dist/astUtils/reflection.d.ts +27 -8
  60. package/dist/astUtils/reflection.js +66 -1
  61. package/dist/astUtils/reflection.js.map +1 -1
  62. package/dist/astUtils/reflection.spec.js +130 -119
  63. package/dist/astUtils/reflection.spec.js.map +1 -1
  64. package/dist/astUtils/stackedVisitor.js.map +1 -1
  65. package/dist/astUtils/stackedVisitor.spec.js +13 -13
  66. package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
  67. package/dist/astUtils/visitors.d.ts +17 -2
  68. package/dist/astUtils/visitors.js +2 -2
  69. package/dist/astUtils/visitors.js.map +1 -1
  70. package/dist/astUtils/visitors.spec.js +31 -29
  71. package/dist/astUtils/visitors.spec.js.map +1 -1
  72. package/dist/astUtils/xml.d.ts +4 -3
  73. package/dist/astUtils/xml.js +8 -3
  74. package/dist/astUtils/xml.js.map +1 -1
  75. package/dist/bscPlugin/BscPlugin.d.ts +7 -1
  76. package/dist/bscPlugin/BscPlugin.js +28 -0
  77. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  78. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +4 -4
  79. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  80. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +26 -26
  81. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  82. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
  83. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +97 -0
  84. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  85. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
  86. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +73 -0
  87. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  88. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
  89. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +52 -0
  90. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
  91. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts +1 -0
  92. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
  93. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -0
  94. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
  95. package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
  96. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  97. package/dist/bscPlugin/validation/ScopeValidator.d.ts +29 -0
  98. package/dist/bscPlugin/validation/ScopeValidator.js +183 -0
  99. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  100. package/dist/cli.js +9 -3
  101. package/dist/cli.js.map +1 -1
  102. package/dist/diagnosticUtils.d.ts +1 -0
  103. package/dist/diagnosticUtils.js +15 -8
  104. package/dist/diagnosticUtils.js.map +1 -1
  105. package/dist/examples/plugins/removePrint.js +12 -14
  106. package/dist/examples/plugins/removePrint.js.map +1 -1
  107. package/dist/files/BrsFile.Class.spec.js +634 -145
  108. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  109. package/dist/files/BrsFile.d.ts +62 -30
  110. package/dist/files/BrsFile.js +683 -335
  111. package/dist/files/BrsFile.js.map +1 -1
  112. package/dist/files/BrsFile.spec.js +1055 -449
  113. package/dist/files/BrsFile.spec.js.map +1 -1
  114. package/dist/files/XmlFile.d.ts +11 -10
  115. package/dist/files/XmlFile.js +33 -26
  116. package/dist/files/XmlFile.js.map +1 -1
  117. package/dist/files/XmlFile.spec.js +302 -237
  118. package/dist/files/XmlFile.spec.js.map +1 -1
  119. package/dist/files/tests/imports.spec.js +44 -42
  120. package/dist/files/tests/imports.spec.js.map +1 -1
  121. package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
  122. package/dist/files/tests/optionalChaning.spec.js +88 -0
  123. package/dist/files/tests/optionalChaning.spec.js.map +1 -0
  124. package/dist/globalCallables.d.ts +3 -1
  125. package/dist/globalCallables.js +424 -152
  126. package/dist/globalCallables.js.map +1 -1
  127. package/dist/index.d.ts +13 -3
  128. package/dist/index.js +23 -4
  129. package/dist/index.js.map +1 -1
  130. package/dist/interfaces.d.ts +129 -16
  131. package/dist/lexer/Lexer.d.ts +19 -1
  132. package/dist/lexer/Lexer.js +127 -21
  133. package/dist/lexer/Lexer.js.map +1 -1
  134. package/dist/lexer/Lexer.spec.js +657 -536
  135. package/dist/lexer/Lexer.spec.js.map +1 -1
  136. package/dist/lexer/Token.d.ts +2 -2
  137. package/dist/lexer/TokenKind.d.ts +13 -1
  138. package/dist/lexer/TokenKind.js +60 -3
  139. package/dist/lexer/TokenKind.js.map +1 -1
  140. package/dist/parser/BrsTranspileState.d.ts +7 -0
  141. package/dist/parser/BrsTranspileState.js +9 -0
  142. package/dist/parser/BrsTranspileState.js.map +1 -1
  143. package/dist/parser/Expression.d.ts +150 -34
  144. package/dist/parser/Expression.js +337 -150
  145. package/dist/parser/Expression.js.map +1 -1
  146. package/dist/parser/Parser.Class.spec.js +189 -89
  147. package/dist/parser/Parser.Class.spec.js.map +1 -1
  148. package/dist/parser/Parser.d.ts +152 -29
  149. package/dist/parser/Parser.js +1095 -501
  150. package/dist/parser/Parser.js.map +1 -1
  151. package/dist/parser/Parser.spec.js +687 -266
  152. package/dist/parser/Parser.spec.js.map +1 -1
  153. package/dist/parser/SGParser.d.ts +41 -4
  154. package/dist/parser/SGParser.js +186 -175
  155. package/dist/parser/SGParser.js.map +1 -1
  156. package/dist/parser/SGParser.spec.js +35 -22
  157. package/dist/parser/SGParser.spec.js.map +1 -1
  158. package/dist/parser/SGTypes.d.ts +206 -38
  159. package/dist/parser/SGTypes.js +470 -161
  160. package/dist/parser/SGTypes.js.map +1 -1
  161. package/dist/parser/SGTypes.spec.d.ts +1 -0
  162. package/dist/parser/SGTypes.spec.js +351 -0
  163. package/dist/parser/SGTypes.spec.js.map +1 -0
  164. package/dist/parser/Statement.d.ts +194 -40
  165. package/dist/parser/Statement.js +597 -160
  166. package/dist/parser/Statement.js.map +1 -1
  167. package/dist/parser/Statement.spec.js +11 -11
  168. package/dist/parser/Statement.spec.js.map +1 -1
  169. package/dist/parser/TranspileState.d.ts +1 -1
  170. package/dist/parser/TranspileState.js +15 -7
  171. package/dist/parser/TranspileState.js.map +1 -1
  172. package/dist/parser/tests/Parser.spec.d.ts +10 -9
  173. package/dist/parser/tests/Parser.spec.js +15 -11
  174. package/dist/parser/tests/Parser.spec.js.map +1 -1
  175. package/dist/parser/tests/controlFlow/For.spec.js +60 -60
  176. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  177. package/dist/parser/tests/controlFlow/ForEach.spec.js +40 -39
  178. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  179. package/dist/parser/tests/controlFlow/If.spec.js +213 -194
  180. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  181. package/dist/parser/tests/controlFlow/While.spec.js +37 -37
  182. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  183. package/dist/parser/tests/expression/Additive.spec.js +30 -30
  184. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  185. package/dist/parser/tests/expression/ArrayLiterals.spec.js +119 -119
  186. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  187. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +162 -138
  188. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  189. package/dist/parser/tests/expression/Boolean.spec.js +24 -24
  190. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  191. package/dist/parser/tests/expression/Call.spec.js +41 -40
  192. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  193. package/dist/parser/tests/expression/Exponential.spec.js +17 -17
  194. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  195. package/dist/parser/tests/expression/Function.spec.js +256 -256
  196. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  197. package/dist/parser/tests/expression/Indexing.spec.js +87 -87
  198. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  199. package/dist/parser/tests/expression/Multiplicative.spec.js +37 -37
  200. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  201. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +75 -63
  202. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  203. package/dist/parser/tests/expression/PrefixUnary.spec.js +41 -41
  204. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  205. package/dist/parser/tests/expression/Primary.spec.js +41 -41
  206. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  207. package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
  208. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
  209. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
  210. package/dist/parser/tests/expression/Relational.spec.js +43 -43
  211. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  212. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +9 -9
  213. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  214. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +28 -28
  215. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  216. package/dist/parser/tests/expression/TernaryExpression.spec.js +102 -102
  217. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  218. package/dist/parser/tests/statement/AssignmentOperators.spec.js +36 -36
  219. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  220. package/dist/parser/tests/statement/Declaration.spec.js +44 -44
  221. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  222. package/dist/parser/tests/statement/Dim.spec.js +21 -21
  223. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  224. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  225. package/dist/parser/tests/statement/Enum.spec.js +840 -0
  226. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  227. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  228. package/dist/parser/tests/statement/For.spec.js +46 -0
  229. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  230. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  231. package/dist/parser/tests/statement/ForEach.spec.js +37 -0
  232. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  233. package/dist/parser/tests/statement/Function.spec.js +198 -197
  234. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  235. package/dist/parser/tests/statement/Goto.spec.js +15 -14
  236. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  237. package/dist/parser/tests/statement/Increment.spec.js +50 -50
  238. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  239. package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
  240. package/dist/parser/tests/statement/InterfaceStatement.spec.js +254 -0
  241. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
  242. package/dist/parser/tests/statement/LibraryStatement.spec.js +17 -17
  243. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  244. package/dist/parser/tests/statement/Misc.spec.js +108 -106
  245. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  246. package/dist/parser/tests/statement/PrintStatement.spec.js +40 -40
  247. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  248. package/dist/parser/tests/statement/ReturnStatement.spec.js +46 -46
  249. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  250. package/dist/parser/tests/statement/Set.spec.js +83 -83
  251. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  252. package/dist/parser/tests/statement/Stop.spec.js +12 -11
  253. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  254. package/dist/parser/tests/statement/Throw.spec.js +5 -5
  255. package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
  256. package/dist/parser/tests/statement/TryCatch.spec.js +15 -13
  257. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  258. package/dist/preprocessor/Chunk.d.ts +1 -1
  259. package/dist/preprocessor/Chunk.js.map +1 -1
  260. package/dist/preprocessor/Manifest.d.ts +5 -5
  261. package/dist/preprocessor/Manifest.js +14 -35
  262. package/dist/preprocessor/Manifest.js.map +1 -1
  263. package/dist/preprocessor/Manifest.spec.d.ts +1 -0
  264. package/dist/preprocessor/Manifest.spec.js +78 -103
  265. package/dist/preprocessor/Manifest.spec.js.map +1 -1
  266. package/dist/preprocessor/Preprocessor.d.ts +1 -1
  267. package/dist/preprocessor/Preprocessor.js +8 -8
  268. package/dist/preprocessor/Preprocessor.js.map +1 -1
  269. package/dist/preprocessor/Preprocessor.spec.js +49 -49
  270. package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
  271. package/dist/preprocessor/PreprocessorParser.spec.js +72 -72
  272. package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
  273. package/dist/roku-types/data.json +21891 -0
  274. package/dist/roku-types/index.d.ts +6776 -0
  275. package/dist/roku-types/index.js +11 -0
  276. package/dist/roku-types/index.js.map +1 -0
  277. package/dist/types/ArrayType.d.ts +8 -5
  278. package/dist/types/ArrayType.js +52 -12
  279. package/dist/types/ArrayType.js.map +1 -1
  280. package/dist/types/ArrayType.spec.js +72 -11
  281. package/dist/types/ArrayType.spec.js.map +1 -1
  282. package/dist/types/BooleanType.d.ts +4 -2
  283. package/dist/types/BooleanType.js +9 -4
  284. package/dist/types/BooleanType.js.map +1 -1
  285. package/dist/types/BooleanType.spec.js +5 -3
  286. package/dist/types/BooleanType.spec.js.map +1 -1
  287. package/dist/types/BscType.d.ts +20 -5
  288. package/dist/types/BscType.js +24 -0
  289. package/dist/types/BscType.js.map +1 -1
  290. package/dist/types/CustomType.d.ts +8 -6
  291. package/dist/types/CustomType.js +20 -11
  292. package/dist/types/CustomType.js.map +1 -1
  293. package/dist/types/DoubleType.d.ts +2 -0
  294. package/dist/types/DoubleType.js +14 -9
  295. package/dist/types/DoubleType.js.map +1 -1
  296. package/dist/types/DoubleType.spec.js +5 -3
  297. package/dist/types/DoubleType.spec.js.map +1 -1
  298. package/dist/types/DynamicType.d.ts +2 -0
  299. package/dist/types/DynamicType.js +6 -2
  300. package/dist/types/DynamicType.js.map +1 -1
  301. package/dist/types/DynamicType.spec.js +2 -2
  302. package/dist/types/DynamicType.spec.js.map +1 -1
  303. package/dist/types/FloatType.d.ts +2 -0
  304. package/dist/types/FloatType.js +14 -9
  305. package/dist/types/FloatType.js.map +1 -1
  306. package/dist/types/FloatType.spec.js +4 -2
  307. package/dist/types/FloatType.spec.js.map +1 -1
  308. package/dist/types/FunctionType.d.ts +7 -31
  309. package/dist/types/FunctionType.js +11 -57
  310. package/dist/types/FunctionType.js.map +1 -1
  311. package/dist/types/IntegerType.d.ts +2 -0
  312. package/dist/types/IntegerType.js +14 -9
  313. package/dist/types/IntegerType.js.map +1 -1
  314. package/dist/types/IntegerType.spec.js +5 -3
  315. package/dist/types/IntegerType.spec.js.map +1 -1
  316. package/dist/types/InterfaceType.d.ts +13 -4
  317. package/dist/types/InterfaceType.js +48 -8
  318. package/dist/types/InterfaceType.js.map +1 -1
  319. package/dist/types/InterfaceType.spec.d.ts +1 -0
  320. package/dist/types/InterfaceType.spec.js +194 -0
  321. package/dist/types/InterfaceType.spec.js.map +1 -0
  322. package/dist/types/InvalidType.d.ts +4 -2
  323. package/dist/types/InvalidType.js +10 -5
  324. package/dist/types/InvalidType.js.map +1 -1
  325. package/dist/types/InvalidType.spec.js +4 -2
  326. package/dist/types/InvalidType.spec.js.map +1 -1
  327. package/dist/types/LazyType.d.ts +8 -7
  328. package/dist/types/LazyType.js +22 -10
  329. package/dist/types/LazyType.js.map +1 -1
  330. package/dist/types/LongIntegerType.d.ts +2 -0
  331. package/dist/types/LongIntegerType.js +14 -9
  332. package/dist/types/LongIntegerType.js.map +1 -1
  333. package/dist/types/LongIntegerType.spec.js +4 -2
  334. package/dist/types/LongIntegerType.spec.js.map +1 -1
  335. package/dist/types/ObjectType.d.ts +8 -4
  336. package/dist/types/ObjectType.js +9 -4
  337. package/dist/types/ObjectType.js.map +1 -1
  338. package/dist/types/ObjectType.spec.js +2 -2
  339. package/dist/types/ObjectType.spec.js.map +1 -1
  340. package/dist/types/StringType.d.ts +4 -2
  341. package/dist/types/StringType.js +9 -4
  342. package/dist/types/StringType.js.map +1 -1
  343. package/dist/types/StringType.spec.js +4 -2
  344. package/dist/types/StringType.spec.js.map +1 -1
  345. package/dist/types/TypedFunctionType.d.ts +28 -0
  346. package/dist/types/TypedFunctionType.js +88 -0
  347. package/dist/types/TypedFunctionType.js.map +1 -0
  348. package/dist/types/TypedFunctionType.spec.d.ts +1 -0
  349. package/dist/types/TypedFunctionType.spec.js +37 -0
  350. package/dist/types/TypedFunctionType.spec.js.map +1 -0
  351. package/dist/types/UninitializedType.js +3 -3
  352. package/dist/types/UninitializedType.js.map +1 -1
  353. package/dist/types/VoidType.d.ts +4 -2
  354. package/dist/types/VoidType.js +8 -4
  355. package/dist/types/VoidType.js.map +1 -1
  356. package/dist/types/VoidType.spec.js +2 -2
  357. package/dist/types/VoidType.spec.js.map +1 -1
  358. package/dist/types/helpers.d.ts +42 -0
  359. package/dist/types/helpers.js +118 -0
  360. package/dist/types/helpers.js.map +1 -0
  361. package/dist/util.d.ts +87 -16
  362. package/dist/util.js +339 -94
  363. package/dist/util.js.map +1 -1
  364. package/dist/validators/ClassValidator.d.ts +19 -2
  365. package/dist/validators/ClassValidator.js +163 -102
  366. package/dist/validators/ClassValidator.js.map +1 -1
  367. package/package.json +26 -15
  368. package/dist/astUtils/index.d.ts +0 -7
  369. package/dist/astUtils/index.js +0 -26
  370. package/dist/astUtils/index.js.map +0 -1
  371. package/dist/lexer/index.d.ts +0 -3
  372. package/dist/lexer/index.js +0 -17
  373. package/dist/lexer/index.js.map +0 -1
  374. package/dist/parser/index.d.ts +0 -3
  375. package/dist/parser/index.js +0 -16
  376. package/dist/parser/index.js.map +0 -1
  377. package/dist/preprocessor/index.d.ts +0 -3
  378. package/dist/preprocessor/index.js +0 -16
  379. package/dist/preprocessor/index.js.map +0 -1
  380. package/dist/types/FunctionType.spec.js +0 -23
  381. package/dist/types/FunctionType.spec.js.map +0 -1
@@ -11,12 +11,13 @@ 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 reflection_1 = require("../astUtils/reflection");
14
15
  let sinon = sinonImport.createSandbox();
15
16
  describe('BrsFile BrighterScript classes', () => {
16
- let tmpPath = util_1.standardizePath `${process.cwd()}/.tmp`;
17
- let rootDir = util_1.standardizePath `${tmpPath}/rootDir`;
17
+ let tmpPath = (0, util_1.standardizePath) `${process.cwd()}/.tmp`;
18
+ let rootDir = (0, 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, rootDir]);
20
21
  beforeEach(() => {
21
22
  fsExtra.ensureDirSync(rootDir);
22
23
  fsExtra.emptyDirSync(tmpPath);
@@ -29,10 +30,10 @@ describe('BrsFile BrighterScript classes', () => {
29
30
  fsExtra.emptyDirSync(tmpPath);
30
31
  });
31
32
  function addFile(relativePath, text) {
32
- return program.addOrReplaceFile({ src: `${rootDir}/${relativePath}`, dest: relativePath }, text);
33
+ return program.setFile({ src: `${rootDir}/${relativePath}`, dest: relativePath }, text);
33
34
  }
34
35
  it('detects all classes after parse', () => {
35
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
36
+ let file = program.setFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
36
37
  class Animal
37
38
  end class
38
39
  class Duck
@@ -40,18 +41,17 @@ 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
+ (0, chai_1.expect)(file.parser.references.classStatements.map(x => x.getName(Parser_1.ParseMode.BrighterScript)).sort()).to.eql(['Animal', 'Duck']);
44
45
  });
45
46
  it('does not cause errors with incomplete class statement', () => {
46
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
47
+ program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
47
48
  class
48
49
  `);
49
50
  program.validate();
50
51
  //if no exception was thrown, this test passes
51
52
  });
52
53
  it('catches child class missing super call in constructor', () => {
53
- var _a;
54
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
54
+ program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
55
55
  class Person
56
56
  sub new()
57
57
  end sub
@@ -62,11 +62,12 @@ describe('BrsFile BrighterScript classes', () => {
62
62
  end class
63
63
  `);
64
64
  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);
65
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
66
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
67
+ ]);
66
68
  });
67
69
  it('access modifier is option for override', () => {
68
- var _a;
69
- let file = program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
70
+ let file = program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
70
71
  class Animal
71
72
  sub move()
72
73
  end sub
@@ -78,14 +79,13 @@ describe('BrsFile BrighterScript classes', () => {
78
79
  end class
79
80
  `);
80
81
  program.validate();
81
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
82
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
82
83
  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;
84
+ (0, chai_1.expect)(duckClass).to.exist;
85
+ (0, chai_1.expect)(duckClass.memberMap['move']).to.exist;
85
86
  });
86
87
  it('supports various namespace configurations', () => {
87
- var _a;
88
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
88
+ program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
89
89
  class Animal
90
90
  sub new()
91
91
  bigBird = new Birds.Bird()
@@ -105,12 +105,11 @@ describe('BrsFile BrighterScript classes', () => {
105
105
  end namespace
106
106
  `);
107
107
  program.validate();
108
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
108
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
109
109
  });
110
110
  describe('super', () => {
111
111
  it('always requires super call in child constructor', () => {
112
- var _a;
113
- program.addOrReplaceFile('source/main.bs', `
112
+ program.setFile('source/main.bs', `
114
113
  class Bird
115
114
  end class
116
115
  class Duck extends Bird
@@ -119,11 +118,12 @@ describe('BrsFile BrighterScript classes', () => {
119
118
  end class
120
119
  `);
121
120
  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);
121
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
122
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
123
+ ]);
123
124
  });
124
125
  it('requires super call in child when parent has own `new` method', () => {
125
- var _a;
126
- program.addOrReplaceFile('source/main.bs', `
126
+ program.setFile('source/main.bs', `
127
127
  class Bird
128
128
  sub new()
129
129
  end sub
@@ -134,11 +134,12 @@ describe('BrsFile BrighterScript classes', () => {
134
134
  end class
135
135
  `);
136
136
  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);
137
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
138
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
139
+ ]);
138
140
  });
139
141
  it('allows non-`m` expressions and statements before the super call', () => {
140
- var _a;
141
- program.addOrReplaceFile('source/main.bs', `
142
+ program.setFile('source/main.bs', `
142
143
  class Bird
143
144
  sub new(name)
144
145
  end sub
@@ -153,10 +154,10 @@ describe('BrsFile BrighterScript classes', () => {
153
154
  end class
154
155
  `);
155
156
  program.validate();
156
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).to.be.undefined;
157
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
157
158
  });
158
159
  it('allows non-`m` expressions and statements before the super call', () => {
159
- program.addOrReplaceFile('source/main.bs', `
160
+ program.setFile('source/main.bs', `
160
161
  class Bird
161
162
  sub new(name)
162
163
  end sub
@@ -164,18 +165,12 @@ describe('BrsFile BrighterScript classes', () => {
164
165
  class Duck extends Bird
165
166
  sub new()
166
167
  m.name = m.name + "Duck"
167
- super()
168
+ super(m.name)
168
169
  end sub
169
170
  end class
170
171
  `);
171
172
  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
- }]);
173
+ (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) })]);
179
174
  });
180
175
  });
181
176
  describe('transpile', () => {
@@ -357,6 +352,9 @@ describe('BrsFile BrighterScript classes', () => {
357
352
  class Animal
358
353
  sub new(name as string)
359
354
  end sub
355
+
356
+ sub DoSomething()
357
+ end sub
360
358
  end class
361
359
 
362
360
  class Duck extends Animal
@@ -370,6 +368,8 @@ describe('BrsFile BrighterScript classes', () => {
370
368
  instance = {}
371
369
  instance.new = sub(name as string)
372
370
  end sub
371
+ instance.DoSomething = sub()
372
+ end sub
373
373
  return instance
374
374
  end function
375
375
  function Animal(name as string)
@@ -435,7 +435,7 @@ describe('BrsFile BrighterScript classes', () => {
435
435
  instance.super0_sayHello = instance.sayHello
436
436
  instance.sayHello = function(text)
437
437
  text = "The duck says " + text
438
- if text <> invalid then
438
+ if text <> invalid
439
439
  m.super0_sayHello(text)
440
440
  end if
441
441
  end function
@@ -660,8 +660,7 @@ describe('BrsFile BrighterScript classes', () => {
660
660
  });
661
661
  });
662
662
  it('detects using `new` keyword on non-classes', () => {
663
- var _a;
664
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
663
+ program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.brs' }, `
665
664
  sub quack()
666
665
  end sub
667
666
  sub main()
@@ -669,37 +668,41 @@ describe('BrsFile BrighterScript classes', () => {
669
668
  end sub
670
669
  `);
671
670
  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);
671
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
672
+ DiagnosticMessages_1.DiagnosticMessages.expressionIsNotConstructable('sub')
673
+ ]);
673
674
  });
674
675
  it('detects missing call to super', () => {
675
- var _a;
676
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
676
+ program.setFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.brs' }, `
677
677
  class Animal
678
- sub new()
678
+ sub new ()
679
679
  end sub
680
680
  end class
681
681
  class Duck extends Animal
682
- sub new()
682
+ sub new ()
683
683
  end sub
684
684
  end class
685
685
  `);
686
686
  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);
687
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
688
+ DiagnosticMessages_1.DiagnosticMessages.classConstructorMissingSuperCall()
689
+ ]);
688
690
  });
689
691
  it.skip('detects calls to unknown m methods', () => {
690
- var _a;
691
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
692
+ program.setFile('source/main.brs', `
692
693
  class Animal
693
- sub new()
694
+ sub new ()
694
695
  m.methodThatDoesNotExist()
695
696
  end sub
696
697
  end class
697
698
  `);
698
699
  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'));
700
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
701
+ DiagnosticMessages_1.DiagnosticMessages.methodDoesNotExistOnType('methodThatDoesNotExist', 'Animal')
702
+ ]);
700
703
  });
701
704
  it('detects duplicate member names', () => {
702
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
705
+ program.setFile('source/main.bs', `
703
706
  class Animal
704
707
  public name
705
708
  public name
@@ -713,32 +716,26 @@ describe('BrsFile BrighterScript classes', () => {
713
716
  end class
714
717
  `);
715
718
  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) })]);
719
+ (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
720
  });
726
721
  it('detects mismatched member type in child class', () => {
727
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
722
+ program.setFile('source/main.bs', `
728
723
  class Animal
729
724
  public name
730
725
  end class
731
726
  class Duck extends Animal
732
- public function name()
727
+ public override function name()
733
728
  return "Donald"
734
729
  end function
735
730
  end class
736
731
  `);
737
732
  program.validate();
738
- chai_1.expect(program.getDiagnostics().map(x => x.message).sort()[0]).to.eql(DiagnosticMessages_1.DiagnosticMessages.classChildMemberDifferentMemberTypeThanAncestor('method', 'field', 'Animal').message);
733
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
734
+ DiagnosticMessages_1.DiagnosticMessages.classChildMemberDifferentMemberTypeThanAncestor('method', 'field', 'Animal')
735
+ ]);
739
736
  });
740
737
  it('allows untyped overridden field in child class', () => {
741
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
738
+ program.setFile('source/main.bs', `
742
739
  class Animal
743
740
  public name
744
741
  end class
@@ -747,10 +744,10 @@ describe('BrsFile BrighterScript classes', () => {
747
744
  end class
748
745
  `);
749
746
  program.validate();
750
- testHelpers_spec_1.expectZeroDiagnostics(program);
747
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
751
748
  });
752
749
  it('allows overridden property name in child class', () => {
753
- program.addOrReplaceFile('source/main.bs', `
750
+ program.setFile('source/main.bs', `
754
751
  class Bird
755
752
  public name = "bird"
756
753
  end class
@@ -759,10 +756,10 @@ describe('BrsFile BrighterScript classes', () => {
759
756
  end class
760
757
  `);
761
758
  program.validate();
762
- testHelpers_spec_1.expectZeroDiagnostics(program);
759
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
763
760
  });
764
761
  it('flags incompatible child field type changes', () => {
765
- program.addOrReplaceFile('source/main.bs', `
762
+ program.setFile('source/main.bs', `
766
763
  class Bird
767
764
  public age = 12
768
765
  public name = "bird"
@@ -775,15 +772,15 @@ describe('BrsFile BrighterScript classes', () => {
775
772
  end class
776
773
  `);
777
774
  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
775
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
776
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindType('Person'),
777
+ DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'age', 'float', 'integer'),
778
+ DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'name', 'integer', 'string'),
779
+ DiagnosticMessages_1.DiagnosticMessages.childFieldTypeNotAssignableToBaseProperty('Duck', 'Bird', 'owner', 'string', 'Person')
783
780
  ]);
784
781
  });
785
782
  it('detects overridden methods without override keyword', () => {
786
- program.addOrReplaceFile({ src: `${rootDir}/source/main.brs`, dest: 'source/main.brs' }, `
783
+ program.setFile('source/main.bs', `
787
784
  class Animal
788
785
  sub speak()
789
786
  end sub
@@ -794,10 +791,12 @@ describe('BrsFile BrighterScript classes', () => {
794
791
  end class
795
792
  `);
796
793
  program.validate();
797
- chai_1.expect(program.getDiagnostics()[0]).to.exist.and.to.include(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')));
794
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
795
+ DiagnosticMessages_1.DiagnosticMessages.missingOverrideKeyword('Animal')
796
+ ]);
798
797
  });
799
798
  it('detects overridden methods with different visibility', () => {
800
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
799
+ program.setFile('source/main.bs', `
801
800
  class Animal
802
801
  sub speakInPublic()
803
802
  end sub
@@ -816,12 +815,14 @@ describe('BrsFile BrighterScript classes', () => {
816
815
  end class
817
816
  `);
818
817
  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')));
818
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
819
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakInPublic', 'private', 'public', 'Animal'),
820
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFriends', 'public', 'protected', 'Animal'),
821
+ DiagnosticMessages_1.DiagnosticMessages.mismatchedOverriddenMemberVisibility('Duck', 'speakWithFamily', 'public', 'private', 'Animal')
822
+ ]);
822
823
  });
823
824
  it('allows overridden methods with matching visibility', () => {
824
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
825
+ program.setFile('source/main.bs', `
825
826
  class Animal
826
827
  sub speakInPublic()
827
828
  end sub
@@ -840,50 +841,123 @@ describe('BrsFile BrighterScript classes', () => {
840
841
  end class
841
842
  `);
842
843
  program.validate();
843
- chai_1.expect(program.getDiagnostics()).to.be.empty;
844
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
844
845
  });
845
- it('detects extending unknown parent class', () => {
846
- program.addOrReplaceFile('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) }));
846
+ describe('detects unknown parent class', () => {
847
+ it('non-namespaced parent from outside namespace', () => {
848
+ program.setFile('source/main.bs', `
849
+ class Duck extends Animal
850
+ sub speak()
851
+ end sub
852
+ end class
853
+
854
+ namespace Vertibrates
855
+ class Animal
856
+ end class
857
+ end namespace
858
+ `);
859
+ program.validate();
860
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [Object.assign(Object.assign({}, DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Animal', 'source')), { range: vscode_languageserver_1.Range.create(1, 35, 1, 41) })]);
861
+ });
862
+ it('non-namespaced parent from within namespace', () => {
863
+ program.setFile('source/main.bs', `
864
+ namespace Vertibrates
865
+ class Duck extends Animal
866
+ sub speak()
867
+ end sub
868
+ end class
869
+ end namespace
870
+ `);
871
+ program.validate();
872
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
873
+ DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Animal', 'source')
874
+ ]);
875
+ });
876
+ it('non-namespaced name from outside namespace alongside existing namespace', () => {
877
+ program.setFile('source/main.bs', `
878
+ namespace Vertibrates
879
+ class Animal
880
+ end class
881
+ end namespace
882
+
883
+ class Duck extends Animal
884
+ sub speak()
885
+ end sub
886
+ end class
887
+ `);
888
+ program.validate();
889
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
890
+ DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Animal', 'source')
891
+ ]);
892
+ });
893
+ it('namespaced parent class from outside namespace', () => {
894
+ program.setFile('source/vertibrates.bs', `
895
+ namespace Vertibrates
896
+ class Bird
897
+ end class
898
+ end namespace
899
+ `);
900
+ program.setFile('source/Duck.bs', `
901
+ class Duck extends Vertibrates.GroundedBird
902
+ sub speak()
903
+ end sub
904
+ end class
905
+ `);
906
+ program.validate();
907
+ //TODO replace this with `expectDiagnostics` once we fix the duplicate diagnostic one-per-file for missing base classes issue
908
+ (0, chai_1.expect)(program.getDiagnostics()[0].message).to.eql(DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Vertibrates.GroundedBird', 'source').message);
909
+ });
910
+ it('namespaced parent class from inside namespace', () => {
911
+ program.setFile('source/vertibrates.bs', `
912
+ namespace Vertibrates
913
+ class Bird
914
+ end class
915
+ end namespace
916
+ `);
917
+ program.setFile('source/Duck.bs', `
918
+ namespace Birdies
919
+ class Duck extends Vertibrates.GroundedBird
920
+ sub speak()
921
+ end sub
922
+ end class
923
+ end namespace
924
+ `);
925
+ program.validate();
926
+ //TODO replace this with `expectDiagnostics` once we fix the duplicate diagnostic one-per-file for missing base classes issue
927
+ (0, chai_1.expect)(program.getDiagnostics()[0].message).to.eql(DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Vertibrates.GroundedBird', 'source').message);
928
+ });
854
929
  });
855
930
  it('catches newable class without namespace name', () => {
856
- var _a;
857
- program.addOrReplaceFile('source/main.bs', `
931
+ program.setFile('source/main.bs', `
858
932
  namespace NameA.NameB
859
933
  class Duck
860
934
  end class
861
- end namespace
935
+ end namespace
862
936
  sub main()
863
937
  ' this should be an error because the proper name is NameA.NameB.Duck"
864
938
  d = new Duck()
865
939
  end sub
866
- `);
940
+ `);
867
941
  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);
942
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
943
+ DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('Duck', 'source')
944
+ ]);
869
945
  });
870
946
  it('supports newable class namespace inference', () => {
871
- var _a;
872
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
947
+ program.setFile('source/main.bs', `
873
948
  namespace NameA.NameB
874
949
  class Duck
875
950
  end class
876
- sub main()
951
+ sub main()
877
952
  d = new Duck()
878
953
  end sub
879
954
  end namespace
880
- `);
955
+ `);
881
956
  program.validate();
882
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
957
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
883
958
  });
884
959
  it('catches extending unknown namespaced class', () => {
885
- var _a;
886
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
960
+ program.setFile('source/main.bs', `
887
961
  namespace NameA.NameB
888
962
  class Animal
889
963
  end class
@@ -892,120 +966,129 @@ describe('BrsFile BrighterScript classes', () => {
892
966
  end namespace
893
967
  `);
894
968
  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);
969
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
970
+ DiagnosticMessages_1.DiagnosticMessages.classCouldNotBeFound('NameA.NameB.Animal1', 'source')
971
+ ]);
896
972
  });
897
973
  it('supports omitting namespace prefix for items in same namespace', () => {
898
- var _a;
899
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
974
+ program.setFile('source/main.bs', `
900
975
  namespace NameA.NameB
901
976
  class Animal
902
977
  end class
903
978
  class Duck extends Animal
904
979
  end class
905
- end namespace
906
- `);
980
+ end namespace
981
+ `);
907
982
  program.validate();
908
- chai_1.expect((_a = program.getDiagnostics()[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
983
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
909
984
  });
910
985
  it('catches duplicate root-level class declarations', () => {
911
- var _a;
912
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
986
+ program.setFile('source/main.bs', `
913
987
  class Animal
914
988
  end class
915
989
  class Animal
990
+ end class
916
991
  `);
917
992
  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);
993
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
994
+ DiagnosticMessages_1.DiagnosticMessages.duplicateClassDeclaration('source', 'Animal')
995
+ ]);
919
996
  });
920
997
  it('catches duplicate namespace-level class declarations', () => {
921
- var _a;
922
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
998
+ program.setFile('source/main.bs', `
923
999
  namespace NameA.NameB
924
1000
  class Animal
925
1001
  end class
926
1002
  class Animal
1003
+ end class
927
1004
  end namespace
928
1005
  `);
929
1006
  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);
1007
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1008
+ DiagnosticMessages_1.DiagnosticMessages.duplicateClassDeclaration('source', 'NameA.NameB.Animal')
1009
+ ]);
931
1010
  });
932
1011
  it('catches namespaced class name which is the same as a global class', () => {
933
- var _a;
934
- program.addOrReplaceFile({ src: `${rootDir}/source/main.bs`, dest: 'source/main.bs' }, `
1012
+ program.setFile('source/main.bs', `
935
1013
  namespace NameA.NameB
936
1014
  class Animal
937
1015
  end class
938
- end namespace
1016
+ end namespace
939
1017
  class Animal
940
1018
  end class
941
1019
  `);
942
1020
  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);
1021
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1022
+ DiagnosticMessages_1.DiagnosticMessages.namespacedClassCannotShareNamewithNonNamespacedClass('Animal').message
1023
+ ]);
944
1024
  });
945
1025
  it('catches class with same name as function', () => {
946
- var _a;
947
- program.addOrReplaceFile('source/main.bs', `
1026
+ program.setFile('source/main.bs', `
948
1027
  class Animal
949
1028
  end class
950
- sub Animal()
1029
+ sub Animal()
951
1030
  end sub
952
- `);
1031
+ `);
953
1032
  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);
1033
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1034
+ DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('Animal').message
1035
+ ]);
955
1036
  });
956
1037
  it('catches class with same name (but different case) as function', () => {
957
- var _a;
958
- program.addOrReplaceFile('source/main.bs', `
1038
+ program.setFile('source/main.bs', `
959
1039
  class ANIMAL
960
1040
  end class
961
- sub animal()
1041
+ sub animal()
962
1042
  end sub
963
- `);
1043
+ `);
964
1044
  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);
1045
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1046
+ DiagnosticMessages_1.DiagnosticMessages.functionCannotHaveSameNameAsClass('animal').message
1047
+ ]);
966
1048
  });
967
1049
  it('catches variable with same name as class', () => {
968
- var _a;
969
- program.addOrReplaceFile('source/main.bs', `
1050
+ program.setFile('source/main.bs', `
970
1051
  class Animal
971
1052
  end class
972
- sub main()
1053
+ sub main()
973
1054
  animal = new Animal()
974
1055
  end sub
975
- `);
1056
+ `);
976
1057
  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);
1058
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1059
+ DiagnosticMessages_1.DiagnosticMessages.localVarSameNameAsClass('Animal').message
1060
+ ]);
978
1061
  });
979
1062
  it('allows extending classes with more than one dot in the filename', () => {
980
- program.addOrReplaceFile('source/testclass.bs', `
1063
+ program.setFile('source/testclass.bs', `
981
1064
  class Foo
982
1065
  end class
983
1066
 
984
1067
  class Bar extends Foo
985
- sub new()
1068
+ sub new ()
986
1069
  super()
987
1070
  end sub
988
1071
  end class
989
1072
  `);
990
- program.addOrReplaceFile('source/testclass_no_testdot.bs', `
1073
+ program.setFile('source/testclass_no_testdot.bs', `
991
1074
  class BarNoDot extends Foo
992
- sub new()
1075
+ sub new ()
993
1076
  super()
994
1077
  end sub
995
1078
  end class
996
1079
  `);
997
- program.addOrReplaceFile('source/testclass.dot.bs', `
1080
+ program.setFile('source/testclass.dot.bs', `
998
1081
  class BarDot extends Foo
999
- sub new()
1082
+ sub new ()
1000
1083
  super()
1001
1084
  end sub
1002
1085
  end class
1003
1086
  `);
1004
1087
  program.validate();
1005
- testHelpers_spec_1.expectZeroDiagnostics(program);
1088
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
1006
1089
  });
1007
1090
  it('computes correct super index for grandchild class', () => {
1008
- program.addOrReplaceFile('source/main.bs', `
1091
+ program.setFile('source/main.bs', `
1009
1092
  sub Main()
1010
1093
  c = new App.ClassC()
1011
1094
  end sub
@@ -1021,7 +1104,7 @@ describe('BrsFile BrighterScript classes', () => {
1021
1104
  testTranspile(`
1022
1105
  namespace App
1023
1106
  class ClassC extends ClassB
1024
- sub new()
1107
+ sub new ()
1025
1108
  super()
1026
1109
  end sub
1027
1110
  end class
@@ -1043,7 +1126,7 @@ describe('BrsFile BrighterScript classes', () => {
1043
1126
  `, 'trim', 'source/App.ClassC.bs');
1044
1127
  });
1045
1128
  it('computes correct super index for namespaced child class and global parent class', () => {
1046
- program.addOrReplaceFile('source/ClassA.bs', `
1129
+ program.setFile('source/ClassA.bs', `
1047
1130
  class ClassA
1048
1131
  end class
1049
1132
  `);
@@ -1052,7 +1135,7 @@ describe('BrsFile BrighterScript classes', () => {
1052
1135
  class ClassB extends ClassA
1053
1136
  end class
1054
1137
  end namespace
1055
- `, `
1138
+ `, `
1056
1139
  function __App_ClassB_builder()
1057
1140
  instance = __ClassA_builder()
1058
1141
  instance.super0_new = instance.new
@@ -1069,13 +1152,419 @@ describe('BrsFile BrighterScript classes', () => {
1069
1152
  `, 'trim', 'source/App.ClassB.bs');
1070
1153
  });
1071
1154
  it('does not crash when parent class is missing', () => {
1072
- const file = program.addOrReplaceFile('source/ClassB.bs', `
1155
+ const file = program.setFile('source/ClassB.bs', `
1073
1156
  class ClassB extends ClassA
1074
1157
  end class
1075
1158
  `);
1076
- assert_1.doesNotThrow(() => {
1159
+ (0, assert_1.doesNotThrow)(() => {
1077
1160
  file.parser.references.classStatements[0].getParentClassIndex(new BrsTranspileState_1.BrsTranspileState(file));
1078
1161
  });
1079
1162
  });
1163
+ describe('getHover', () => {
1164
+ const animalClassCode = `
1165
+ class Animal
1166
+ kind as string
1167
+ isHungry as boolean
1168
+
1169
+ sub new (kind as string)
1170
+ m.kind = kind
1171
+ m.isHungry = true ' born hungry
1172
+ end sub
1173
+
1174
+ sub eat(foodAmount as integer)
1175
+ if foodAmount > 100
1176
+ m.isHungry = false
1177
+ end if
1178
+ end sub
1179
+
1180
+ sub sleep()
1181
+ m.isHungry = false
1182
+ end sub
1183
+
1184
+ end class
1185
+
1186
+ class Dog extends Animal
1187
+ breed as string
1188
+ sub new (breed as string)
1189
+ super("Dog")
1190
+ m.breed = breed
1191
+ end sub
1192
+
1193
+ sub snooze()
1194
+ m.sleep()
1195
+ end sub
1196
+ end class
1197
+
1198
+ class DogHouse
1199
+ puppy as Dog
1200
+ sub new (pup as Dog)
1201
+ m.puppy = pup
1202
+ end sub
1203
+ end class
1204
+
1205
+ sub main()
1206
+ snoopy = new Dog("Beagle")
1207
+ biplane = new DogHouse(snoopy)
1208
+ print snoopy.kind ' Dog
1209
+ print snoopy.breed ' Beagle
1210
+ print snoopy.isHungry ' true
1211
+ feedAnimal(biplane.puppy)
1212
+ print snoopy.isHungry ' false
1213
+ end sub
1214
+
1215
+ sub feedAnimal(beast as Animal)
1216
+ beast.eat(100)
1217
+ end sub
1218
+ `;
1219
+ it('correctly parses the file', () => {
1220
+ program.setFile('source/animal.bs', animalClassCode);
1221
+ program.validate();
1222
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
1223
+ });
1224
+ it('gets the correct text for m', () => {
1225
+ let animalCode = program.setFile('source/animal.bs', animalClassCode);
1226
+ program.validate();
1227
+ let hover = animalCode.getHover(vscode_languageserver_1.Position.create(6, 21));
1228
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1229
+ '```brightscript',
1230
+ 'm as Animal',
1231
+ '```'
1232
+ ].join('\n'));
1233
+ hover = animalCode.getHover(vscode_languageserver_1.Position.create(26, 20));
1234
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1235
+ '```brightscript',
1236
+ 'm as Dog',
1237
+ '```'
1238
+ ].join('\n'));
1239
+ });
1240
+ it('gets the correct text for m.field', () => {
1241
+ let animalCode = program.setFile('source/animal.bs', animalClassCode);
1242
+ program.validate();
1243
+ let hover = animalCode.getHover(vscode_languageserver_1.Position.create(6, 26));
1244
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1245
+ '```brightscript',
1246
+ 'Animal.kind as string',
1247
+ '```'
1248
+ ].join('\n'));
1249
+ hover = animalCode.getHover(vscode_languageserver_1.Position.create(26, 25));
1250
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1251
+ '```brightscript',
1252
+ 'Dog.breed as string',
1253
+ '```'
1254
+ ].join('\n'));
1255
+ });
1256
+ it('gets the correct text for m.method', () => {
1257
+ let animalCode = program.setFile('source/animal.bs', animalClassCode);
1258
+ program.validate();
1259
+ let hover = animalCode.getHover(vscode_languageserver_1.Position.create(30, 25));
1260
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1261
+ '```brightscript',
1262
+ 'sub Animal.sleep() as void',
1263
+ '```'
1264
+ ].join('\n'));
1265
+ });
1266
+ it('gets the correct text for obj.field', () => {
1267
+ let animalCode = program.setFile('source/animal.brs', animalClassCode);
1268
+ program.validate();
1269
+ let hover = animalCode.getHover(vscode_languageserver_1.Position.create(46, 33));
1270
+ (0, chai_1.expect)(hover).to.exist;
1271
+ //TODO TYPES: This should probably say 'Animal.isHungry ...' because that field is defined in Animal
1272
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1273
+ '```brightscript',
1274
+ 'Dog.isHungry as boolean',
1275
+ '```'
1276
+ ].join('\n'));
1277
+ });
1278
+ it('gets the correct text for obj.method', () => {
1279
+ let animalCode = program.setFile('source/animal.bs', `
1280
+ sub feedAnimal(beast as Animal)
1281
+ beast.eat(100)
1282
+ end sub
1283
+ class Animal
1284
+ sub eat(foodAmount as integer)
1285
+ end sub
1286
+ end class
1287
+ `);
1288
+ program.validate();
1289
+ let hover = animalCode.getHover(vscode_languageserver_1.Position.create(2, 29));
1290
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1291
+ '```brightscript',
1292
+ 'sub Animal.eat(foodAmount as integer) as void',
1293
+ '```'
1294
+ ].join('\n'));
1295
+ });
1296
+ });
1297
+ describe('getHover class members', () => {
1298
+ const testCode = `
1299
+ class Foo
1300
+ sub new (name as string)
1301
+ end sub
1302
+ end class
1303
+
1304
+ class Bar
1305
+ sub doSomething()
1306
+ myFoo = new Foo()
1307
+ end sub
1308
+
1309
+ function getInt() as integer
1310
+ return 1
1311
+ end function
1312
+ end class
1313
+
1314
+ class Buz
1315
+ myInt as integer
1316
+ sub new (i as integer)
1317
+ myInt = i
1318
+ end sub
1319
+ end class
1320
+
1321
+ class Bee extends Buz
1322
+ sub new (i as integer)
1323
+ super(i)
1324
+ end sub
1325
+
1326
+ sub varSameNameAsMember()
1327
+ myInt = 4567
1328
+ print myInt ' should not print m.myInt
1329
+ end sub
1330
+ end class`;
1331
+ it('correctly parses the file', () => {
1332
+ program.setFile('source/fooBar.bs', testCode);
1333
+ program.validate();
1334
+ (0, chai_1.expect)(program.getDiagnostics().length).to.equal(0);
1335
+ });
1336
+ it('gets the correct text for new Class()', () => {
1337
+ let file = program.setFile('source/fooBar.bs', testCode);
1338
+ program.validate();
1339
+ let hover = file.getHover(vscode_languageserver_1.Position.create(8, 34)); // new Foo("hello")
1340
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1341
+ '```brightscript',
1342
+ 'new Foo(name as string)',
1343
+ '```'
1344
+ ].join('\n'));
1345
+ });
1346
+ it('gets the correct text for created object', () => {
1347
+ let file = program.setFile('source/fooBar.bs', testCode);
1348
+ program.validate();
1349
+ let hover = file.getHover(vscode_languageserver_1.Position.create(8, 23)); // myFoo
1350
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1351
+ '```brightscript',
1352
+ 'myFoo as Foo',
1353
+ '```'
1354
+ ].join('\n'));
1355
+ });
1356
+ it('gets the correct text for class declaration', () => {
1357
+ let file = program.setFile('source/fooBar.bs', testCode);
1358
+ program.validate();
1359
+ let hover = file.getHover(vscode_languageserver_1.Position.create(6, 21)); // class Bar
1360
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1361
+ '```brightscript',
1362
+ 'class Bar',
1363
+ '```'
1364
+ ].join('\n'));
1365
+ });
1366
+ it('gets the correct text for class method declaration', () => {
1367
+ let file = program.setFile('source/fooBar.bs', testCode);
1368
+ program.validate();
1369
+ let hover = file.getHover(vscode_languageserver_1.Position.create(11, 29)); // getInt
1370
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1371
+ '```brightscript',
1372
+ 'function Bar.getInt() as integer',
1373
+ '```'
1374
+ ].join('\n'));
1375
+ });
1376
+ it('gets the correct text for class field declaration', () => {
1377
+ let file = program.setFile('source/fooBar.bs', testCode);
1378
+ program.validate();
1379
+ let hover = file.getHover(vscode_languageserver_1.Position.create(17, 20)); // myInt
1380
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1381
+ '```brightscript',
1382
+ 'Buz.myInt as integer',
1383
+ '```'
1384
+ ].join('\n'));
1385
+ });
1386
+ it('gets the correct text for super() call', () => {
1387
+ let file = program.setFile('source/fooBar.bs', testCode);
1388
+ program.validate();
1389
+ let hover = file.getHover(vscode_languageserver_1.Position.create(25, 23)); // super() in Bee.new
1390
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1391
+ '```brightscript',
1392
+ 'new Buz(i as integer)',
1393
+ '```'
1394
+ ].join('\n'));
1395
+ });
1396
+ it('gets the correct text for variable with same name as a member', () => {
1397
+ let file = program.setFile('source/fooBar.bs', testCode);
1398
+ program.validate();
1399
+ let hover = file.getHover(vscode_languageserver_1.Position.create(29, 23)); // myInt in Bee.varSameNameAsMember
1400
+ (0, chai_1.expect)(hover === null || hover === void 0 ? void 0 : hover.contents).to.equal([
1401
+ '```brightscript',
1402
+ 'myInt as integer',
1403
+ '```'
1404
+ ].join('\n'));
1405
+ });
1406
+ });
1407
+ describe('getSymbolTypeFromToken', () => {
1408
+ const testClassCode = `
1409
+ sub main()
1410
+ c = new KlassC()
1411
+ a = c.b.getA()
1412
+ num = c.b.getA().getInt()
1413
+ c.b.getA().printInt(num)
1414
+ end sub
1415
+ class KlassA
1416
+ function getInt() as integer
1417
+ return 1
1418
+ end function
1419
+
1420
+ sub printInt(i as integer)
1421
+ print i
1422
+ end sub
1423
+ end class
1424
+
1425
+ class KlassB
1426
+
1427
+ function getA() as KlassA
1428
+ return new KlassA()
1429
+ end function
1430
+ end class
1431
+
1432
+ class KlassC
1433
+ public b as KlassB
1434
+
1435
+ sub new ()
1436
+ m.b = new KlassB()
1437
+ end sub
1438
+ end class
1439
+ `;
1440
+ it('correctly parses the file', () => {
1441
+ program.setFile('source/klassTest.bs', testClassCode);
1442
+ program.validate();
1443
+ (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
1444
+ });
1445
+ describe('finding tokens', () => {
1446
+ let klassCode;
1447
+ let mainScope;
1448
+ beforeEach(() => {
1449
+ klassCode = program.setFile('source/klassTest.bs', testClassCode);
1450
+ const scopes = program.getScopesForFile(klassCode);
1451
+ (0, chai_1.expect)(scopes.length).to.eql(1);
1452
+ mainScope = scopes[0];
1453
+ mainScope.linkSymbolTable();
1454
+ });
1455
+ afterEach(() => {
1456
+ mainScope.unlinkSymbolTable();
1457
+ });
1458
+ it('gets correct class for m', () => {
1459
+ var _a;
1460
+ const position = vscode_languageserver_1.Position.create(28, 20); // 'm' from m.b = new KlassB()
1461
+ const token = klassCode.parser.getTokenAt(position);
1462
+ (0, chai_1.expect)(token.text).to.equal('m');
1463
+ const func = klassCode.getFunctionExpressionAtPosition(position);
1464
+ let klass = (_a = klassCode.getClassFromToken(token, func, mainScope)) === null || _a === void 0 ? void 0 : _a.item;
1465
+ (0, chai_1.expect)(klass).to.exist;
1466
+ (0, chai_1.expect)(klass.getName(Parser_1.ParseMode.BrighterScript)).to.equal('KlassC');
1467
+ });
1468
+ it('gets correct class for fieldMember', () => {
1469
+ var _a;
1470
+ const position = vscode_languageserver_1.Position.create(28, 23); // 'b' from m.b = new KlassB()
1471
+ const token = klassCode.parser.getTokenAt(position);
1472
+ (0, chai_1.expect)(token.text).to.equal('b');
1473
+ const func = klassCode.getFunctionExpressionAtPosition(position);
1474
+ let klass = (_a = klassCode.getClassFromToken(token, func, mainScope)) === null || _a === void 0 ? void 0 : _a.item;
1475
+ (0, chai_1.expect)(klass).to.exist;
1476
+ (0, chai_1.expect)(klass.getName(Parser_1.ParseMode.BrighterScript)).to.equal('KlassB');
1477
+ });
1478
+ it('gets correct class for variable', () => {
1479
+ var _a;
1480
+ const position = vscode_languageserver_1.Position.create(4, 22); // 'c' from c.b.getA().getInt()
1481
+ const token = klassCode.parser.getTokenAt(position);
1482
+ (0, chai_1.expect)(token.text).to.equal('c');
1483
+ const func = klassCode.getFunctionExpressionAtPosition(position);
1484
+ let klass = (_a = klassCode.getClassFromToken(token, func, mainScope)) === null || _a === void 0 ? void 0 : _a.item;
1485
+ (0, chai_1.expect)(klass).to.exist;
1486
+ (0, chai_1.expect)(klass.getName(Parser_1.ParseMode.BrighterScript)).to.equal('KlassC');
1487
+ });
1488
+ it('gets correct class for variable field', () => {
1489
+ var _a;
1490
+ const position = vscode_languageserver_1.Position.create(3, 23); // 'b' from c.b.getA()
1491
+ const token = klassCode.parser.getTokenAt(position);
1492
+ (0, chai_1.expect)(token.text).to.equal('b');
1493
+ const func = klassCode.getFunctionExpressionAtPosition(position);
1494
+ let klass = (_a = klassCode.getClassFromToken(token, func, mainScope)) === null || _a === void 0 ? void 0 : _a.item;
1495
+ (0, chai_1.expect)(klass).to.exist;
1496
+ (0, chai_1.expect)(klass.getName(Parser_1.ParseMode.BrighterScript)).to.equal('KlassB');
1497
+ });
1498
+ it('gets type and return class for variable function field', () => {
1499
+ const position = vscode_languageserver_1.Position.create(3, 28); // 'getA' from c.b.getA()
1500
+ const token = klassCode.parser.getTokenAt(position);
1501
+ (0, chai_1.expect)(token.text).to.equal('getA');
1502
+ const func = klassCode.getFunctionExpressionAtPosition(position);
1503
+ let { type, symbolContainer } = klassCode.getSymbolTypeFromToken(token, func, mainScope);
1504
+ (0, chai_1.expect)((0, reflection_1.isTypedFunctionType)(type)).to.be.true;
1505
+ (0, chai_1.expect)((0, reflection_1.isCustomType)(symbolContainer)).to.be.true;
1506
+ (0, chai_1.expect)(symbolContainer.name).to.equal('KlassA');
1507
+ });
1508
+ it('gets type and class for field from return value of function', () => {
1509
+ const position = vscode_languageserver_1.Position.create(4, 37); // 'getInt' from c.b.getA().getInt()
1510
+ const token = klassCode.parser.getTokenAt(position);
1511
+ (0, chai_1.expect)(token.text).to.equal('getInt');
1512
+ const func = klassCode.getFunctionExpressionAtPosition(position);
1513
+ let { type, symbolContainer } = klassCode.getSymbolTypeFromToken(token, func, mainScope);
1514
+ (0, chai_1.expect)(type).to.exist;
1515
+ (0, chai_1.expect)((0, reflection_1.isTypedFunctionType)(type)).to.be.true;
1516
+ (0, chai_1.expect)(symbolContainer).to.be.undefined; // getInt() returns integer - no class reference at this point
1517
+ });
1518
+ });
1519
+ });
1520
+ it('does not crash when child has field with same name as sub in parent', () => {
1521
+ program.setFile('source/main.bs', `
1522
+ class Parent
1523
+ public function helloWorld()
1524
+ end function
1525
+ end class
1526
+ class Child extends Parent
1527
+ public helloWorld as string
1528
+ end class
1529
+ `);
1530
+ program.validate();
1531
+ });
1532
+ it('does not crash when child has method with same name as field in parent', () => {
1533
+ program.setFile('source/main.bs', `
1534
+ class Parent
1535
+ public helloWorld as string
1536
+ end class
1537
+ class Child extends Parent
1538
+ public function helloWorld()
1539
+ end function
1540
+ end class
1541
+ `);
1542
+ program.validate();
1543
+ });
1544
+ it.skip('detects calling class constructors with too many parameters', () => {
1545
+ program.setFile('source/main.bs', `
1546
+ class Parameterless
1547
+ sub new ()
1548
+ end sub
1549
+ end class
1550
+
1551
+ class OneParam
1552
+ sub new (param1)
1553
+ end sub
1554
+ end class
1555
+
1556
+ sub main()
1557
+ c1 = new Parameterless(1)
1558
+ c2 = new OneParam(1, 2)
1559
+ c2 = new OneParam()
1560
+ end sub
1561
+ `);
1562
+ program.validate();
1563
+ (0, testHelpers_spec_1.expectDiagnostics)(program, [
1564
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(0, 1),
1565
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 2),
1566
+ DiagnosticMessages_1.DiagnosticMessages.mismatchArgumentCount(1, 0)
1567
+ ]);
1568
+ });
1080
1569
  });
1081
1570
  //# sourceMappingURL=BrsFile.Class.spec.js.map