brighterscript 1.0.0-alpha.50 → 1.0.0-alpha.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. package/README.md +3 -0
  2. package/bsconfig.schema.json +75 -0
  3. package/dist/BsConfig.d.ts +90 -5
  4. package/dist/CodeActionUtil.d.ts +17 -0
  5. package/dist/CodeActionUtil.js.map +1 -1
  6. package/dist/CommentFlagProcessor.d.ts +16 -12
  7. package/dist/CommentFlagProcessor.js +141 -59
  8. package/dist/CommentFlagProcessor.js.map +1 -1
  9. package/dist/CrossScopeValidator.js +13 -5
  10. package/dist/CrossScopeValidator.js.map +1 -1
  11. package/dist/DiagnosticManager.d.ts +1 -0
  12. package/dist/DiagnosticManager.js +25 -9
  13. package/dist/DiagnosticManager.js.map +1 -1
  14. package/dist/DiagnosticMessages.d.ts +61 -17
  15. package/dist/DiagnosticMessages.js +78 -24
  16. package/dist/DiagnosticMessages.js.map +1 -1
  17. package/dist/LanguageServer.d.ts +39 -2
  18. package/dist/LanguageServer.js +142 -5
  19. package/dist/LanguageServer.js.map +1 -1
  20. package/dist/Program.d.ts +62 -1
  21. package/dist/Program.js +185 -13
  22. package/dist/Program.js.map +1 -1
  23. package/dist/ProgramBuilder.d.ts +1 -8
  24. package/dist/ProgramBuilder.js +31 -11
  25. package/dist/ProgramBuilder.js.map +1 -1
  26. package/dist/Scope.d.ts +87 -6
  27. package/dist/Scope.js +76 -31
  28. package/dist/Scope.js.map +1 -1
  29. package/dist/ScopeNamespaceLookup.d.ts +73 -0
  30. package/dist/ScopeNamespaceLookup.js +242 -0
  31. package/dist/ScopeNamespaceLookup.js.map +1 -0
  32. package/dist/SymbolTable.d.ts +9 -2
  33. package/dist/SymbolTable.js +24 -14
  34. package/dist/SymbolTable.js.map +1 -1
  35. package/dist/astUtils/CachedLookups.js +3 -0
  36. package/dist/astUtils/CachedLookups.js.map +1 -1
  37. package/dist/astUtils/reflection.d.ts +4 -1
  38. package/dist/astUtils/reflection.js +24 -4
  39. package/dist/astUtils/reflection.js.map +1 -1
  40. package/dist/astUtils/visitors.d.ts +2 -1
  41. package/dist/astUtils/visitors.js.map +1 -1
  42. package/dist/bscPlugin/BscPlugin.d.ts +4 -2
  43. package/dist/bscPlugin/BscPlugin.js +10 -2
  44. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  45. package/dist/bscPlugin/CallExpressionInfo.d.ts +1 -1
  46. package/dist/bscPlugin/CallExpressionInfo.js +1 -2
  47. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -1
  48. package/dist/bscPlugin/FileWriter.d.ts +13 -0
  49. package/dist/bscPlugin/FileWriter.js +56 -1
  50. package/dist/bscPlugin/FileWriter.js.map +1 -1
  51. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +106 -5
  52. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +630 -126
  53. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  54. package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.d.ts +17 -0
  55. package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.js +66 -0
  56. package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.js.map +1 -0
  57. package/dist/bscPlugin/codeActions/codeActionHelpers.d.ts +18 -0
  58. package/dist/bscPlugin/codeActions/codeActionHelpers.js +31 -0
  59. package/dist/bscPlugin/codeActions/codeActionHelpers.js.map +1 -0
  60. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +1 -1
  61. package/dist/bscPlugin/completions/CompletionsProcessor.js +5 -5
  62. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
  63. package/dist/bscPlugin/definition/DefinitionProvider.js +8 -0
  64. package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -1
  65. package/dist/bscPlugin/hover/HoverProcessor.js +11 -3
  66. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  67. package/dist/bscPlugin/selectionRanges/SelectionRangesProcessor.d.ts +7 -0
  68. package/dist/bscPlugin/selectionRanges/SelectionRangesProcessor.js +77 -0
  69. package/dist/bscPlugin/selectionRanges/SelectionRangesProcessor.js.map +1 -0
  70. package/dist/bscPlugin/serialize/FileSerializer.d.ts +1 -1
  71. package/dist/bscPlugin/serialize/FileSerializer.js +12 -7
  72. package/dist/bscPlugin/serialize/FileSerializer.js.map +1 -1
  73. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.d.ts +7 -0
  74. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js +87 -1
  75. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.js.map +1 -1
  76. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +14 -0
  77. package/dist/bscPlugin/validation/BrsFileValidator.js +97 -21
  78. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  79. package/dist/bscPlugin/validation/ScopeValidator.d.ts +17 -0
  80. package/dist/bscPlugin/validation/ScopeValidator.js +162 -4
  81. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  82. package/dist/bscPlugin/validation/XmlFileValidator.js +14 -0
  83. package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -1
  84. package/dist/cli.js +13 -0
  85. package/dist/cli.js.map +1 -1
  86. package/dist/diagnosticUtils.d.ts +51 -1
  87. package/dist/diagnosticUtils.js +222 -1
  88. package/dist/diagnosticUtils.js.map +1 -1
  89. package/dist/files/BrsFile.d.ts +18 -2
  90. package/dist/files/BrsFile.js +87 -6
  91. package/dist/files/BrsFile.js.map +1 -1
  92. package/dist/files/XmlFile.js +2 -1
  93. package/dist/files/XmlFile.js.map +1 -1
  94. package/dist/interfaces.d.ts +68 -23
  95. package/dist/interfaces.js.map +1 -1
  96. package/dist/lexer/Lexer.js +4 -5
  97. package/dist/lexer/Lexer.js.map +1 -1
  98. package/dist/lexer/Token.d.ts +1 -1
  99. package/dist/lexer/TokenKind.d.ts +8 -0
  100. package/dist/lexer/TokenKind.js +21 -1
  101. package/dist/lexer/TokenKind.js.map +1 -1
  102. package/dist/lsp/LspProject.d.ts +49 -1
  103. package/dist/lsp/Project.d.ts +33 -1
  104. package/dist/lsp/Project.js +129 -4
  105. package/dist/lsp/Project.js.map +1 -1
  106. package/dist/lsp/ProjectManager.d.ts +48 -2
  107. package/dist/lsp/ProjectManager.js +152 -9
  108. package/dist/lsp/ProjectManager.js.map +1 -1
  109. package/dist/lsp/worker/WorkerThreadProject.d.ts +27 -2
  110. package/dist/lsp/worker/WorkerThreadProject.js +16 -0
  111. package/dist/lsp/worker/WorkerThreadProject.js.map +1 -1
  112. package/dist/parser/AstNode.d.ts +3 -1
  113. package/dist/parser/AstNode.js +2 -0
  114. package/dist/parser/AstNode.js.map +1 -1
  115. package/dist/parser/Expression.d.ts +54 -5
  116. package/dist/parser/Expression.js +112 -7
  117. package/dist/parser/Expression.js.map +1 -1
  118. package/dist/parser/Parser.d.ts +24 -1
  119. package/dist/parser/Parser.js +180 -41
  120. package/dist/parser/Parser.js.map +1 -1
  121. package/dist/parser/SGParser.d.ts +1 -0
  122. package/dist/parser/SGParser.js +9 -0
  123. package/dist/parser/SGParser.js.map +1 -1
  124. package/dist/parser/Statement.d.ts +6 -1
  125. package/dist/parser/Statement.js +22 -14
  126. package/dist/parser/Statement.js.map +1 -1
  127. package/dist/parser/TranspileState.d.ts +4 -2
  128. package/dist/parser/TranspileState.js +10 -4
  129. package/dist/parser/TranspileState.js.map +1 -1
  130. package/dist/roku-types/data.json +210 -3
  131. package/dist/types/ArrayType.js +6 -1
  132. package/dist/types/ArrayType.js.map +1 -1
  133. package/dist/types/BooleanType.js +1 -1
  134. package/dist/types/BooleanType.js.map +1 -1
  135. package/dist/types/CallFuncableType.d.ts +1 -1
  136. package/dist/types/ClassType.js +3 -0
  137. package/dist/types/ClassType.js.map +1 -1
  138. package/dist/types/ComponentType.js +3 -0
  139. package/dist/types/ComponentType.js.map +1 -1
  140. package/dist/types/EnumType.js +3 -0
  141. package/dist/types/EnumType.js.map +1 -1
  142. package/dist/types/IntersectionType.js +3 -0
  143. package/dist/types/IntersectionType.js.map +1 -1
  144. package/dist/types/ReferenceType.js +6 -0
  145. package/dist/types/ReferenceType.js.map +1 -1
  146. package/dist/types/TypeStatementType.d.ts +1 -0
  147. package/dist/types/TypeStatementType.js +12 -1
  148. package/dist/types/TypeStatementType.js.map +1 -1
  149. package/dist/types/TypedFunctionType.js +20 -10
  150. package/dist/types/TypedFunctionType.js.map +1 -1
  151. package/dist/types/UnionType.js +3 -0
  152. package/dist/types/UnionType.js.map +1 -1
  153. package/dist/types/helpers.js +6 -0
  154. package/dist/types/helpers.js.map +1 -1
  155. package/dist/util.d.ts +42 -3
  156. package/dist/util.js +131 -7
  157. package/dist/util.js.map +1 -1
  158. package/package.json +24 -26
  159. package/dist/astUtils/CachedLookups.spec.d.ts +0 -1
  160. package/dist/astUtils/CachedLookups.spec.js +0 -39
  161. package/dist/astUtils/CachedLookups.spec.js.map +0 -1
  162. package/dist/astUtils/Editor.spec.d.ts +0 -1
  163. package/dist/astUtils/Editor.spec.js +0 -258
  164. package/dist/astUtils/Editor.spec.js.map +0 -1
  165. package/dist/astUtils/creators.spec.d.ts +0 -1
  166. package/dist/astUtils/creators.spec.js +0 -21
  167. package/dist/astUtils/creators.spec.js.map +0 -1
  168. package/dist/astUtils/reflection.spec.d.ts +0 -1
  169. package/dist/astUtils/reflection.spec.js +0 -392
  170. package/dist/astUtils/reflection.spec.js.map +0 -1
  171. package/dist/astUtils/stackedVisitor.spec.d.ts +0 -1
  172. package/dist/astUtils/stackedVisitor.spec.js +0 -79
  173. package/dist/astUtils/stackedVisitor.spec.js.map +0 -1
  174. package/dist/astUtils/visitors.spec.d.ts +0 -1
  175. package/dist/astUtils/visitors.spec.js +0 -1432
  176. package/dist/astUtils/visitors.spec.js.map +0 -1
  177. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.d.ts +0 -1
  178. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +0 -311
  179. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +0 -1
  180. package/dist/bscPlugin/completions/CompletionsProcessor.spec.d.ts +0 -1
  181. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +0 -2512
  182. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +0 -1
  183. package/dist/bscPlugin/definition/DefinitionProvider.spec.d.ts +0 -1
  184. package/dist/bscPlugin/definition/DefinitionProvider.spec.js +0 -87
  185. package/dist/bscPlugin/definition/DefinitionProvider.spec.js.map +0 -1
  186. package/dist/bscPlugin/hover/HoverProcessor.spec.d.ts +0 -1
  187. package/dist/bscPlugin/hover/HoverProcessor.spec.js +0 -991
  188. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +0 -1
  189. package/dist/bscPlugin/references/ReferencesProvider.spec.d.ts +0 -1
  190. package/dist/bscPlugin/references/ReferencesProvider.spec.js +0 -51
  191. package/dist/bscPlugin/references/ReferencesProvider.spec.js.map +0 -1
  192. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +0 -1
  193. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +0 -564
  194. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +0 -1
  195. package/dist/bscPlugin/serialize/BslibInjector.spec.d.ts +0 -1
  196. package/dist/bscPlugin/serialize/BslibInjector.spec.js +0 -33
  197. package/dist/bscPlugin/serialize/BslibInjector.spec.js.map +0 -1
  198. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.d.ts +0 -1
  199. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js +0 -291
  200. package/dist/bscPlugin/symbols/DocumentSymbolProcessor.spec.js.map +0 -1
  201. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.d.ts +0 -1
  202. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js +0 -245
  203. package/dist/bscPlugin/symbols/WorkspaceSymbolProcessor.spec.js.map +0 -1
  204. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.d.ts +0 -1
  205. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js +0 -75
  206. package/dist/bscPlugin/transpile/BrsFileTranspileProcessor.spec.js.map +0 -1
  207. package/dist/bscPlugin/validation/BrsFileValidator.spec.d.ts +0 -1
  208. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +0 -1517
  209. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +0 -1
  210. package/dist/bscPlugin/validation/ScopeValidator.spec.d.ts +0 -1
  211. package/dist/bscPlugin/validation/ScopeValidator.spec.js +0 -6135
  212. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +0 -1
  213. package/dist/common/Sequencer.spec.d.ts +0 -1
  214. package/dist/common/Sequencer.spec.js +0 -75
  215. package/dist/common/Sequencer.spec.js.map +0 -1
  216. package/dist/files/BrsFile.Class.spec.d.ts +0 -1
  217. package/dist/files/BrsFile.Class.spec.js +0 -2035
  218. package/dist/files/BrsFile.Class.spec.js.map +0 -1
  219. package/dist/files/BrsFile.spec.d.ts +0 -1
  220. package/dist/files/BrsFile.spec.js +0 -5848
  221. package/dist/files/BrsFile.spec.js.map +0 -1
  222. package/dist/files/LazyFileData.spec.d.ts +0 -1
  223. package/dist/files/LazyFileData.spec.js +0 -27
  224. package/dist/files/LazyFileData.spec.js.map +0 -1
  225. package/dist/files/XmlFile.spec.d.ts +0 -1
  226. package/dist/files/XmlFile.spec.js +0 -1173
  227. package/dist/files/XmlFile.spec.js.map +0 -1
  228. package/dist/files/tests/imports.spec.d.ts +0 -1
  229. package/dist/files/tests/imports.spec.js +0 -251
  230. package/dist/files/tests/imports.spec.js.map +0 -1
  231. package/dist/files/tests/optionalChaning.spec.d.ts +0 -1
  232. package/dist/files/tests/optionalChaning.spec.js +0 -152
  233. package/dist/files/tests/optionalChaning.spec.js.map +0 -1
  234. package/dist/lexer/Character.spec.d.ts +0 -1
  235. package/dist/lexer/Character.spec.js +0 -27
  236. package/dist/lexer/Character.spec.js.map +0 -1
  237. package/dist/lexer/Lexer.spec.d.ts +0 -1
  238. package/dist/lexer/Lexer.spec.js +0 -1345
  239. package/dist/lexer/Lexer.spec.js.map +0 -1
  240. package/dist/lsp/ActionQueue.spec.d.ts +0 -1
  241. package/dist/lsp/ActionQueue.spec.js +0 -80
  242. package/dist/lsp/ActionQueue.spec.js.map +0 -1
  243. package/dist/lsp/DocumentManager.spec.d.ts +0 -1
  244. package/dist/lsp/DocumentManager.spec.js +0 -103
  245. package/dist/lsp/DocumentManager.spec.js.map +0 -1
  246. package/dist/lsp/PathFilterer.spec.d.ts +0 -1
  247. package/dist/lsp/PathFilterer.spec.js +0 -182
  248. package/dist/lsp/PathFilterer.spec.js.map +0 -1
  249. package/dist/lsp/Project.spec.d.ts +0 -1
  250. package/dist/lsp/Project.spec.js +0 -267
  251. package/dist/lsp/Project.spec.js.map +0 -1
  252. package/dist/lsp/ProjectManager.spec.d.ts +0 -1
  253. package/dist/lsp/ProjectManager.spec.js +0 -913
  254. package/dist/lsp/ProjectManager.spec.js.map +0 -1
  255. package/dist/lsp/worker/MessageHandler.spec.d.ts +0 -1
  256. package/dist/lsp/worker/MessageHandler.spec.js +0 -64
  257. package/dist/lsp/worker/MessageHandler.spec.js.map +0 -1
  258. package/dist/lsp/worker/WorkerPool.spec.d.ts +0 -1
  259. package/dist/lsp/worker/WorkerPool.spec.js +0 -59
  260. package/dist/lsp/worker/WorkerPool.spec.js.map +0 -1
  261. package/dist/lsp/worker/WorkerThreadProject.spec.d.ts +0 -2
  262. package/dist/lsp/worker/WorkerThreadProject.spec.js +0 -71
  263. package/dist/lsp/worker/WorkerThreadProject.spec.js.map +0 -1
  264. package/dist/parser/AstNode.spec.d.ts +0 -1
  265. package/dist/parser/AstNode.spec.js +0 -1455
  266. package/dist/parser/AstNode.spec.js.map +0 -1
  267. package/dist/parser/BrightScriptDocParser.spec.d.ts +0 -1
  268. package/dist/parser/BrightScriptDocParser.spec.js +0 -310
  269. package/dist/parser/BrightScriptDocParser.spec.js.map +0 -1
  270. package/dist/parser/Expression.spec.d.ts +0 -1
  271. package/dist/parser/Expression.spec.js +0 -40
  272. package/dist/parser/Expression.spec.js.map +0 -1
  273. package/dist/parser/Parser.Class.spec.d.ts +0 -1
  274. package/dist/parser/Parser.Class.spec.js +0 -520
  275. package/dist/parser/Parser.Class.spec.js.map +0 -1
  276. package/dist/parser/Parser.spec.d.ts +0 -6
  277. package/dist/parser/Parser.spec.js +0 -2802
  278. package/dist/parser/Parser.spec.js.map +0 -1
  279. package/dist/parser/SGParser.spec.d.ts +0 -1
  280. package/dist/parser/SGParser.spec.js +0 -130
  281. package/dist/parser/SGParser.spec.js.map +0 -1
  282. package/dist/parser/Statement.spec.d.ts +0 -1
  283. package/dist/parser/Statement.spec.js +0 -191
  284. package/dist/parser/Statement.spec.js.map +0 -1
  285. package/dist/parser/tests/Parser.spec.d.ts +0 -12
  286. package/dist/parser/tests/Parser.spec.js +0 -29
  287. package/dist/parser/tests/Parser.spec.js.map +0 -1
  288. package/dist/parser/tests/controlFlow/For.spec.d.ts +0 -1
  289. package/dist/parser/tests/controlFlow/For.spec.js +0 -169
  290. package/dist/parser/tests/controlFlow/For.spec.js.map +0 -1
  291. package/dist/parser/tests/controlFlow/ForEach.spec.d.ts +0 -1
  292. package/dist/parser/tests/controlFlow/ForEach.spec.js +0 -140
  293. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +0 -1
  294. package/dist/parser/tests/controlFlow/If.spec.d.ts +0 -1
  295. package/dist/parser/tests/controlFlow/If.spec.js +0 -694
  296. package/dist/parser/tests/controlFlow/If.spec.js.map +0 -1
  297. package/dist/parser/tests/controlFlow/While.spec.d.ts +0 -1
  298. package/dist/parser/tests/controlFlow/While.spec.js +0 -114
  299. package/dist/parser/tests/controlFlow/While.spec.js.map +0 -1
  300. package/dist/parser/tests/expression/Additive.spec.d.ts +0 -1
  301. package/dist/parser/tests/expression/Additive.spec.js +0 -107
  302. package/dist/parser/tests/expression/Additive.spec.js.map +0 -1
  303. package/dist/parser/tests/expression/ArrayLiterals.spec.d.ts +0 -1
  304. package/dist/parser/tests/expression/ArrayLiterals.spec.js +0 -304
  305. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +0 -1
  306. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.d.ts +0 -1
  307. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +0 -342
  308. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +0 -1
  309. package/dist/parser/tests/expression/Boolean.spec.d.ts +0 -1
  310. package/dist/parser/tests/expression/Boolean.spec.js +0 -90
  311. package/dist/parser/tests/expression/Boolean.spec.js.map +0 -1
  312. package/dist/parser/tests/expression/Call.spec.d.ts +0 -1
  313. package/dist/parser/tests/expression/Call.spec.js +0 -252
  314. package/dist/parser/tests/expression/Call.spec.js.map +0 -1
  315. package/dist/parser/tests/expression/Exponential.spec.d.ts +0 -1
  316. package/dist/parser/tests/expression/Exponential.spec.js +0 -37
  317. package/dist/parser/tests/expression/Exponential.spec.js.map +0 -1
  318. package/dist/parser/tests/expression/Function.spec.d.ts +0 -1
  319. package/dist/parser/tests/expression/Function.spec.js +0 -412
  320. package/dist/parser/tests/expression/Function.spec.js.map +0 -1
  321. package/dist/parser/tests/expression/Indexing.spec.d.ts +0 -1
  322. package/dist/parser/tests/expression/Indexing.spec.js +0 -302
  323. package/dist/parser/tests/expression/Indexing.spec.js.map +0 -1
  324. package/dist/parser/tests/expression/Multiplicative.spec.d.ts +0 -1
  325. package/dist/parser/tests/expression/Multiplicative.spec.js +0 -67
  326. package/dist/parser/tests/expression/Multiplicative.spec.js.map +0 -1
  327. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.d.ts +0 -1
  328. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +0 -346
  329. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +0 -1
  330. package/dist/parser/tests/expression/PrefixUnary.spec.d.ts +0 -1
  331. package/dist/parser/tests/expression/PrefixUnary.spec.js +0 -111
  332. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +0 -1
  333. package/dist/parser/tests/expression/Primary.spec.d.ts +0 -1
  334. package/dist/parser/tests/expression/Primary.spec.js +0 -165
  335. package/dist/parser/tests/expression/Primary.spec.js.map +0 -1
  336. package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +0 -1
  337. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +0 -171
  338. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +0 -1
  339. package/dist/parser/tests/expression/Relational.spec.d.ts +0 -1
  340. package/dist/parser/tests/expression/Relational.spec.js +0 -83
  341. package/dist/parser/tests/expression/Relational.spec.js.map +0 -1
  342. package/dist/parser/tests/expression/SourceLiteralExpression.spec.d.ts +0 -1
  343. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +0 -201
  344. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +0 -1
  345. package/dist/parser/tests/expression/TemplateStringExpression.spec.d.ts +0 -1
  346. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +0 -389
  347. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +0 -1
  348. package/dist/parser/tests/expression/TernaryExpression.spec.d.ts +0 -1
  349. package/dist/parser/tests/expression/TernaryExpression.spec.js +0 -878
  350. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +0 -1
  351. package/dist/parser/tests/expression/TypeExpression.spec.d.ts +0 -1
  352. package/dist/parser/tests/expression/TypeExpression.spec.js +0 -126
  353. package/dist/parser/tests/expression/TypeExpression.spec.js.map +0 -1
  354. package/dist/parser/tests/expression/UnaryExpression.spec.d.ts +0 -1
  355. package/dist/parser/tests/expression/UnaryExpression.spec.js +0 -52
  356. package/dist/parser/tests/expression/UnaryExpression.spec.js.map +0 -1
  357. package/dist/parser/tests/statement/AssignmentOperators.spec.d.ts +0 -1
  358. package/dist/parser/tests/statement/AssignmentOperators.spec.js +0 -79
  359. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +0 -1
  360. package/dist/parser/tests/statement/ConstStatement.spec.d.ts +0 -1
  361. package/dist/parser/tests/statement/ConstStatement.spec.js +0 -500
  362. package/dist/parser/tests/statement/ConstStatement.spec.js.map +0 -1
  363. package/dist/parser/tests/statement/Continue.spec.d.ts +0 -1
  364. package/dist/parser/tests/statement/Continue.spec.js +0 -119
  365. package/dist/parser/tests/statement/Continue.spec.js.map +0 -1
  366. package/dist/parser/tests/statement/Declaration.spec.d.ts +0 -1
  367. package/dist/parser/tests/statement/Declaration.spec.js +0 -114
  368. package/dist/parser/tests/statement/Declaration.spec.js.map +0 -1
  369. package/dist/parser/tests/statement/Dim.spec.d.ts +0 -1
  370. package/dist/parser/tests/statement/Dim.spec.js +0 -80
  371. package/dist/parser/tests/statement/Dim.spec.js.map +0 -1
  372. package/dist/parser/tests/statement/Enum.spec.d.ts +0 -1
  373. package/dist/parser/tests/statement/Enum.spec.js +0 -744
  374. package/dist/parser/tests/statement/Enum.spec.js.map +0 -1
  375. package/dist/parser/tests/statement/For.spec.d.ts +0 -1
  376. package/dist/parser/tests/statement/For.spec.js +0 -45
  377. package/dist/parser/tests/statement/For.spec.js.map +0 -1
  378. package/dist/parser/tests/statement/ForEach.spec.d.ts +0 -1
  379. package/dist/parser/tests/statement/ForEach.spec.js +0 -36
  380. package/dist/parser/tests/statement/ForEach.spec.js.map +0 -1
  381. package/dist/parser/tests/statement/Function.spec.d.ts +0 -1
  382. package/dist/parser/tests/statement/Function.spec.js +0 -343
  383. package/dist/parser/tests/statement/Function.spec.js.map +0 -1
  384. package/dist/parser/tests/statement/Goto.spec.d.ts +0 -1
  385. package/dist/parser/tests/statement/Goto.spec.js +0 -51
  386. package/dist/parser/tests/statement/Goto.spec.js.map +0 -1
  387. package/dist/parser/tests/statement/Increment.spec.d.ts +0 -1
  388. package/dist/parser/tests/statement/Increment.spec.js +0 -120
  389. package/dist/parser/tests/statement/Increment.spec.js.map +0 -1
  390. package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +0 -1
  391. package/dist/parser/tests/statement/InterfaceStatement.spec.js +0 -110
  392. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +0 -1
  393. package/dist/parser/tests/statement/LibraryStatement.spec.d.ts +0 -1
  394. package/dist/parser/tests/statement/LibraryStatement.spec.js +0 -74
  395. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +0 -1
  396. package/dist/parser/tests/statement/Misc.spec.d.ts +0 -1
  397. package/dist/parser/tests/statement/Misc.spec.js +0 -292
  398. package/dist/parser/tests/statement/Misc.spec.js.map +0 -1
  399. package/dist/parser/tests/statement/PrintStatement.spec.d.ts +0 -1
  400. package/dist/parser/tests/statement/PrintStatement.spec.js +0 -200
  401. package/dist/parser/tests/statement/PrintStatement.spec.js.map +0 -1
  402. package/dist/parser/tests/statement/ReturnStatement.spec.d.ts +0 -1
  403. package/dist/parser/tests/statement/ReturnStatement.spec.js +0 -97
  404. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +0 -1
  405. package/dist/parser/tests/statement/Set.spec.d.ts +0 -1
  406. package/dist/parser/tests/statement/Set.spec.js +0 -232
  407. package/dist/parser/tests/statement/Set.spec.js.map +0 -1
  408. package/dist/parser/tests/statement/Stop.spec.d.ts +0 -1
  409. package/dist/parser/tests/statement/Stop.spec.js +0 -38
  410. package/dist/parser/tests/statement/Stop.spec.js.map +0 -1
  411. package/dist/parser/tests/statement/Throw.spec.d.ts +0 -1
  412. package/dist/parser/tests/statement/Throw.spec.js +0 -38
  413. package/dist/parser/tests/statement/Throw.spec.js.map +0 -1
  414. package/dist/parser/tests/statement/TryCatch.spec.d.ts +0 -1
  415. package/dist/parser/tests/statement/TryCatch.spec.js +0 -151
  416. package/dist/parser/tests/statement/TryCatch.spec.js.map +0 -1
  417. package/dist/preprocessor/Manifest.spec.d.ts +0 -1
  418. package/dist/preprocessor/Manifest.spec.js +0 -80
  419. package/dist/preprocessor/Manifest.spec.js.map +0 -1
  420. package/dist/types/ArrayType.spec.d.ts +0 -1
  421. package/dist/types/ArrayType.spec.js +0 -58
  422. package/dist/types/ArrayType.spec.js.map +0 -1
  423. package/dist/types/BooleanType.spec.d.ts +0 -1
  424. package/dist/types/BooleanType.spec.js +0 -18
  425. package/dist/types/BooleanType.spec.js.map +0 -1
  426. package/dist/types/BuiltInInterfaceAdder.spec.d.ts +0 -1
  427. package/dist/types/BuiltInInterfaceAdder.spec.js +0 -115
  428. package/dist/types/BuiltInInterfaceAdder.spec.js.map +0 -1
  429. package/dist/types/ClassType.spec.d.ts +0 -1
  430. package/dist/types/ClassType.spec.js +0 -76
  431. package/dist/types/ClassType.spec.js.map +0 -1
  432. package/dist/types/DoubleType.spec.d.ts +0 -1
  433. package/dist/types/DoubleType.spec.js +0 -20
  434. package/dist/types/DoubleType.spec.js.map +0 -1
  435. package/dist/types/DynamicType.spec.d.ts +0 -1
  436. package/dist/types/DynamicType.spec.js +0 -23
  437. package/dist/types/DynamicType.spec.js.map +0 -1
  438. package/dist/types/EnumType.spec.d.ts +0 -1
  439. package/dist/types/EnumType.spec.js +0 -33
  440. package/dist/types/EnumType.spec.js.map +0 -1
  441. package/dist/types/FloatType.spec.d.ts +0 -1
  442. package/dist/types/FloatType.spec.js +0 -12
  443. package/dist/types/FloatType.spec.js.map +0 -1
  444. package/dist/types/IntegerType.spec.d.ts +0 -1
  445. package/dist/types/IntegerType.spec.js +0 -16
  446. package/dist/types/IntegerType.spec.js.map +0 -1
  447. package/dist/types/InterfaceType.spec.d.ts +0 -1
  448. package/dist/types/InterfaceType.spec.js +0 -227
  449. package/dist/types/InterfaceType.spec.js.map +0 -1
  450. package/dist/types/IntersectionType.spec.d.ts +0 -1
  451. package/dist/types/IntersectionType.spec.js +0 -150
  452. package/dist/types/IntersectionType.spec.js.map +0 -1
  453. package/dist/types/InvalidType.spec.d.ts +0 -1
  454. package/dist/types/InvalidType.spec.js +0 -16
  455. package/dist/types/InvalidType.spec.js.map +0 -1
  456. package/dist/types/LongIntegerType.spec.d.ts +0 -1
  457. package/dist/types/LongIntegerType.spec.js +0 -18
  458. package/dist/types/LongIntegerType.spec.js.map +0 -1
  459. package/dist/types/ObjectType.spec.d.ts +0 -1
  460. package/dist/types/ObjectType.spec.js +0 -12
  461. package/dist/types/ObjectType.spec.js.map +0 -1
  462. package/dist/types/ReferenceType.spec.d.ts +0 -1
  463. package/dist/types/ReferenceType.spec.js +0 -151
  464. package/dist/types/ReferenceType.spec.js.map +0 -1
  465. package/dist/types/StringType.spec.d.ts +0 -1
  466. package/dist/types/StringType.spec.js +0 -12
  467. package/dist/types/StringType.spec.js.map +0 -1
  468. package/dist/types/TypedFunctionType.spec.d.ts +0 -1
  469. package/dist/types/TypedFunctionType.spec.js +0 -122
  470. package/dist/types/TypedFunctionType.spec.js.map +0 -1
  471. package/dist/types/UnionType.spec.d.ts +0 -1
  472. package/dist/types/UnionType.spec.js +0 -205
  473. package/dist/types/UnionType.spec.js.map +0 -1
  474. package/dist/types/VoidType.spec.d.ts +0 -1
  475. package/dist/types/VoidType.spec.js +0 -12
  476. package/dist/types/VoidType.spec.js.map +0 -1
  477. package/dist/types/helper.spec.d.ts +0 -1
  478. package/dist/types/helper.spec.js +0 -174
  479. package/dist/types/helper.spec.js.map +0 -1
  480. package/dist/types/roFunctionType.spec.d.ts +0 -1
  481. package/dist/types/roFunctionType.spec.js +0 -20
  482. package/dist/types/roFunctionType.spec.js.map +0 -1
@@ -1,1432 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vscode_languageserver_1 = require("vscode-languageserver");
4
- const chai_config_spec_1 = require("../chai-config.spec");
5
- const sinon = require("sinon");
6
- const Program_1 = require("../Program");
7
- const Statement_1 = require("../parser/Statement");
8
- const TokenKind_1 = require("../lexer/TokenKind");
9
- const visitors_1 = require("./visitors");
10
- const reflection_1 = require("./reflection");
11
- const creators_1 = require("./creators");
12
- const stackedVisitor_1 = require("./stackedVisitor");
13
- const Editor_1 = require("./Editor");
14
- const Parser_1 = require("../parser/Parser");
15
- const testHelpers_spec_1 = require("../testHelpers.spec");
16
- const Expression_1 = require("../parser/Expression");
17
- describe('astUtils visitors', () => {
18
- const rootDir = process.cwd();
19
- let program;
20
- const PRINTS_SRC = `
21
- sub Main()
22
- print 1
23
- print 2
24
-
25
- function exec(s)
26
- s()
27
- end function
28
-
29
- exec(sub()
30
- print 8
31
- end sub)
32
-
33
- if a = 1
34
- print 3
35
- else if a = 2
36
- print 4
37
- else
38
- print 5
39
- end if
40
-
41
- while a <> invalid
42
- print 6
43
- end while
44
-
45
- for a = 1 to 10
46
- print 7
47
- end for
48
- end sub
49
- `;
50
- const EXPRESSIONS_SRC = `
51
- sub Main()
52
- 'comment
53
- print "msg"; 3
54
- print \`expand \${var}\`
55
- a = "a"
56
- b = "b" + c
57
- m.global.x = "x"
58
- aa[10] = "aa"
59
- exec("e", some())
60
- for i = 1 to 10
61
- end for
62
- for each n in aa
63
- end for
64
- while i < 10
65
- i++
66
- end while
67
- if j > 0
68
- else if j < -10
69
- end if
70
- return invalid
71
- end sub
72
- `;
73
- beforeEach(() => {
74
- program = new Program_1.Program({ rootDir: rootDir });
75
- });
76
- afterEach(() => {
77
- program.dispose();
78
- });
79
- function functionsWalker(visitor, cancel) {
80
- return (file) => {
81
- const funcExpressions = file.ast.findChildren(reflection_1.isFunctionExpression, { walkMode: visitors_1.WalkMode.visitExpressionsRecursive });
82
- funcExpressions.some(functionExpression => {
83
- visitor(functionExpression.body, undefined);
84
- (0, visitors_1.walkStatements)(functionExpression.body, (statement, parent) => visitor(statement, parent), cancel);
85
- return cancel === null || cancel === void 0 ? void 0 : cancel.isCancellationRequested;
86
- });
87
- };
88
- }
89
- describe('createVisitor', () => {
90
- it(`calls the 'AstNode' event for every node`, () => {
91
- const file = program.setFile('source/main.brs', `
92
- sub Main()
93
- print "Hello"
94
- end sub
95
- `);
96
- const nodes = [];
97
- function track(node) {
98
- nodes.push(node);
99
- }
100
- const visitor = (0, visitors_1.createVisitor)({
101
- AstNode: track,
102
- FunctionStatement: track,
103
- FunctionExpression: track,
104
- PrintStatement: track,
105
- Block: track,
106
- LiteralExpression: track
107
- });
108
- file.ast.walk(visitor, { walkMode: visitors_1.WalkMode.visitAllRecursive });
109
- (0, chai_config_spec_1.expect)(nodes.map(x => x.constructor.name)).to.eql([
110
- 'FunctionStatement',
111
- 'FunctionStatement',
112
- 'FunctionExpression',
113
- 'FunctionExpression',
114
- 'Block',
115
- 'Block',
116
- 'PrintStatement',
117
- 'PrintStatement',
118
- 'LiteralExpression',
119
- 'LiteralExpression'
120
- ]);
121
- });
122
- });
123
- describe('Statements', () => {
124
- it('Walks through all the statements with depth', () => {
125
- const actual = [];
126
- const visitor = (0, stackedVisitor_1.createStackedVisitor)((s, stack) => {
127
- const d = stack.length;
128
- actual.push(`${s.constructor.name}:${d}`);
129
- });
130
- const walker = functionsWalker(visitor);
131
- program.plugins.add({
132
- name: 'walker',
133
- afterProvideFile: event => walker(event.files[0])
134
- });
135
- program.setFile('source/main.brs', PRINTS_SRC);
136
- (0, chai_config_spec_1.expect)(actual).to.deep.equal([
137
- 'Block:0',
138
- 'PrintStatement:1',
139
- 'PrintStatement:1',
140
- 'FunctionStatement:1',
141
- 'ExpressionStatement:1',
142
- 'IfStatement:1',
143
- 'Block:2',
144
- 'PrintStatement:3',
145
- 'IfStatement:2',
146
- 'Block:3',
147
- 'PrintStatement:4',
148
- 'Block:3',
149
- 'PrintStatement:4',
150
- 'WhileStatement:1',
151
- 'Block:2',
152
- 'PrintStatement:3',
153
- 'ForStatement:1',
154
- 'AssignmentStatement:2',
155
- 'Block:2',
156
- 'PrintStatement:3',
157
- 'Block:0',
158
- 'ExpressionStatement:1',
159
- 'Block:0',
160
- 'PrintStatement:1' // print 8
161
- ]);
162
- });
163
- it('Walks through all the statements with token not cancelled', () => {
164
- const cancel = new vscode_languageserver_1.CancellationTokenSource();
165
- const actual = [];
166
- const walker = functionsWalker(s => actual.push(s.constructor.name), cancel.token);
167
- program.plugins.add({
168
- name: 'walker',
169
- afterProvideFile: event => walker(event.files[0])
170
- });
171
- program.setFile('source/main.brs', PRINTS_SRC);
172
- (0, chai_config_spec_1.expect)(actual).to.deep.equal([
173
- 'Block',
174
- 'PrintStatement',
175
- 'PrintStatement',
176
- 'FunctionStatement',
177
- 'ExpressionStatement',
178
- 'IfStatement',
179
- 'Block',
180
- 'PrintStatement',
181
- 'IfStatement',
182
- 'Block',
183
- 'PrintStatement',
184
- 'Block',
185
- 'PrintStatement',
186
- 'WhileStatement',
187
- 'Block',
188
- 'PrintStatement',
189
- 'ForStatement',
190
- 'AssignmentStatement',
191
- 'Block',
192
- 'PrintStatement',
193
- 'Block',
194
- 'ExpressionStatement',
195
- 'Block',
196
- 'PrintStatement' // print 8
197
- ]);
198
- });
199
- it('Stops walking when requested', () => {
200
- const cancel = new vscode_languageserver_1.CancellationTokenSource();
201
- const actual = [];
202
- let count = 0;
203
- const walker = functionsWalker(s => {
204
- actual.push(s.constructor.name);
205
- if ((0, reflection_1.isPrintStatement)(s)) {
206
- if (++count === 4) {
207
- cancel.cancel();
208
- }
209
- }
210
- }, cancel.token);
211
- program.plugins.add({
212
- name: 'walker',
213
- afterProvideFile: event => walker(event.files[0])
214
- });
215
- program.setFile('source/main.brs', PRINTS_SRC);
216
- (0, chai_config_spec_1.expect)(actual).to.deep.equal([
217
- 'Block',
218
- 'PrintStatement',
219
- 'PrintStatement',
220
- 'FunctionStatement',
221
- 'ExpressionStatement',
222
- 'IfStatement',
223
- 'Block',
224
- 'PrintStatement',
225
- 'IfStatement',
226
- 'Block',
227
- 'PrintStatement' // print 4
228
- ]);
229
- });
230
- });
231
- describe('Statement visitor', () => {
232
- it('Maps statements to individual handlers', () => {
233
- const printHandler = sinon.spy();
234
- const blockHandler = sinon.spy();
235
- const visitor = (0, visitors_1.createVisitor)({
236
- PrintStatement: printHandler,
237
- Block: blockHandler
238
- });
239
- const printStatement = new Statement_1.PrintStatement({
240
- print: (0, creators_1.createToken)(TokenKind_1.TokenKind.Print),
241
- expressions: []
242
- });
243
- const blockStatement = new Statement_1.Block({ statements: [] });
244
- visitor(printStatement, undefined);
245
- visitor(blockStatement, undefined);
246
- (0, chai_config_spec_1.expect)(printHandler.callCount).to.equal(1);
247
- (0, chai_config_spec_1.expect)(printHandler.calledWith(printStatement)).to.be.true;
248
- (0, chai_config_spec_1.expect)(blockHandler.callCount).to.equal(1);
249
- (0, chai_config_spec_1.expect)(blockHandler.calledWith(blockStatement)).to.be.true;
250
- });
251
- });
252
- describe('Statement editor', () => {
253
- it('allows replacing statements', () => {
254
- const printStatement1 = new Statement_1.PrintStatement({
255
- print: (0, creators_1.createToken)(TokenKind_1.TokenKind.Print),
256
- expressions: []
257
- });
258
- const printStatement2 = new Statement_1.PrintStatement({
259
- print: (0, creators_1.createToken)(TokenKind_1.TokenKind.Print),
260
- expressions: []
261
- });
262
- const block = new Statement_1.Block({
263
- statements: [
264
- printStatement1,
265
- new Statement_1.ReturnStatement({ return: (0, creators_1.createToken)(TokenKind_1.TokenKind.Return) })
266
- ]
267
- });
268
- const visitor = (0, visitors_1.createVisitor)({
269
- PrintStatement: () => printStatement2
270
- });
271
- (0, visitors_1.walkStatements)(block, visitor);
272
- (0, chai_config_spec_1.expect)(block.statements[0]).to.equal(printStatement2);
273
- });
274
- it('uses the Editor for replacement when provided', () => {
275
- const editor = new Editor_1.Editor();
276
- const printStatement1 = new Statement_1.PrintStatement({
277
- print: (0, creators_1.createToken)(TokenKind_1.TokenKind.Print),
278
- expressions: []
279
- });
280
- const printStatement2 = new Statement_1.PrintStatement({
281
- print: (0, creators_1.createToken)(TokenKind_1.TokenKind.Print),
282
- expressions: []
283
- });
284
- const block = new Statement_1.Block({
285
- statements: [printStatement1]
286
- });
287
- block.walk((0, visitors_1.createVisitor)({
288
- PrintStatement: () => printStatement2
289
- }), {
290
- walkMode: visitors_1.WalkMode.visitAll,
291
- editor: editor
292
- });
293
- (0, chai_config_spec_1.expect)(block.statements[0]).to.equal(printStatement2);
294
- editor.undoAll();
295
- (0, chai_config_spec_1.expect)(block.statements[0]).to.equal(printStatement1);
296
- });
297
- });
298
- describe('Expressions', () => {
299
- it('Walks through all expressions', () => {
300
- const actual = [];
301
- let curr;
302
- const statementVisitor = (0, stackedVisitor_1.createStackedVisitor)((statement, stack) => {
303
- curr = { statement: statement, depth: stack.length };
304
- });
305
- function expressionVisitor(expression, _) {
306
- const { statement, depth } = curr;
307
- actual.push(`${statement.constructor.name}:${depth}:${expression.constructor.name}`);
308
- }
309
- const walker = functionsWalker((statement, parentStatement) => {
310
- statementVisitor(statement, parentStatement);
311
- statement.walk(expressionVisitor, {
312
- walkMode: visitors_1.WalkMode.visitLocalExpressions
313
- });
314
- });
315
- program.plugins.add({
316
- name: 'walker',
317
- afterProvideFile: (event) => walker(event.files[0])
318
- });
319
- program.setFile('source/main.brs', EXPRESSIONS_SRC);
320
- (0, chai_config_spec_1.expect)(actual).to.deep.equal([
321
- 'PrintStatement:1:LiteralExpression',
322
- 'PrintStatement:1:PrintSeparatorExpression',
323
- 'PrintStatement:1:LiteralExpression',
324
- 'PrintStatement:1:TemplateStringExpression',
325
- 'PrintStatement:1:TemplateStringQuasiExpression',
326
- 'PrintStatement:1:LiteralExpression',
327
- 'PrintStatement:1:VariableExpression',
328
- 'PrintStatement:1:TemplateStringQuasiExpression',
329
- 'PrintStatement:1:LiteralExpression',
330
- 'AssignmentStatement:1:LiteralExpression',
331
- 'AssignmentStatement:1:BinaryExpression',
332
- 'AssignmentStatement:1:LiteralExpression',
333
- 'AssignmentStatement:1:VariableExpression',
334
- 'DottedSetStatement:1:DottedGetExpression',
335
- 'DottedSetStatement:1:VariableExpression',
336
- 'DottedSetStatement:1:LiteralExpression',
337
- 'IndexedSetStatement:1:VariableExpression',
338
- 'IndexedSetStatement:1:LiteralExpression',
339
- 'IndexedSetStatement:1:LiteralExpression',
340
- 'ExpressionStatement:1:CallExpression',
341
- 'ExpressionStatement:1:VariableExpression',
342
- 'ExpressionStatement:1:LiteralExpression',
343
- 'ExpressionStatement:1:CallExpression',
344
- 'ExpressionStatement:1:VariableExpression',
345
- 'ForStatement:1:LiteralExpression',
346
- 'AssignmentStatement:2:LiteralExpression',
347
- 'ForEachStatement:1:VariableExpression',
348
- 'WhileStatement:1:BinaryExpression',
349
- 'WhileStatement:1:VariableExpression',
350
- 'WhileStatement:1:LiteralExpression',
351
- 'IncrementStatement:3:VariableExpression',
352
- 'IfStatement:1:BinaryExpression',
353
- 'IfStatement:1:VariableExpression',
354
- 'IfStatement:1:LiteralExpression',
355
- 'IfStatement:2:BinaryExpression',
356
- 'IfStatement:2:VariableExpression',
357
- 'IfStatement:2:UnaryExpression',
358
- 'IfStatement:2:LiteralExpression',
359
- 'ReturnStatement:1:LiteralExpression' // return <invalid>
360
- ]);
361
- });
362
- });
363
- describe('walk', () => {
364
- function testWalk(text, expectedConstructors, walkMode = visitors_1.WalkMode.visitAllRecursive) {
365
- const file = program.setFile('source/main.bs', text);
366
- const items = [];
367
- let index = 1;
368
- file.ast.walk((element) => {
369
- element._testId = index++;
370
- items.push(element);
371
- }, {
372
- walkMode: walkMode
373
- });
374
- index = 1;
375
- (0, chai_config_spec_1.expect)(items.map(x => `${x.constructor.name}:${x._testId}`)).to.eql(expectedConstructors.map(x => `${x}:${index++}`));
376
- }
377
- it('links every ast node to its parent when walked', () => {
378
- const { ast } = program.setFile('source/main.bs', `
379
- library "v30/bslCore.brs"
380
- import "source/main.bs"
381
- namespace alpha
382
- namespace beta
383
- sub charlie()
384
- delta = 1
385
- delta++
386
- delta = sub()
387
- 'do some printing
388
- print "hello"
389
- end sub
390
- delta()
391
- for i = 0 to 10 step 1
392
- exit for
393
- end for
394
- while false
395
- exit while
396
- end while
397
- if true or false then
398
- print 1.2
399
- else
400
- print 123123123123
401
- end if
402
- dim arr[1, 2]
403
- goto theLabel
404
- theLabel:
405
- return false
406
- end
407
- stop
408
- for each item in [1, 2, 3]
409
- continue for
410
- end for
411
- obj = { name: "bob"}
412
- obj.name = obj.name
413
- obj["name"] = obj["name"]
414
- obj.name = obj@firstName
415
- print (true or false)
416
- print \`true\${false}\\n\`
417
- print not true
418
- print FUNCTION_NAME
419
- print new Person()
420
- print tag\`stuff\${1}\`
421
- print true ? true : false
422
- print true ?? false
423
- print /search stuff/g
424
- try
425
- obj.bob = "carl"
426
- throw "e"
427
- catch e
428
- obj["name"] = "dale"
429
- print e
430
- end try
431
- obj@.doCallfunc(1, 2)
432
- end sub
433
- end namespace
434
- end namespace
435
- @SomeAnnotation(1, "two")
436
- interface IPerson
437
- name as string
438
- function doSomething() as string
439
- end interface
440
- class Person
441
- name as string = "bob"
442
- function doSomething(value = true) as string
443
- end function
444
- end class
445
- enum Direction
446
- up = "up"
447
- end enum
448
- enum Logical
449
- yes = 1
450
- no = 0
451
- end enum
452
- const CONST_VALUE = 1.2
453
- `);
454
- (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
455
- const nodes = [];
456
- //get every expression and statement in the file
457
- ast.walk((node) => {
458
- nodes.push(node);
459
- }, { walkMode: visitors_1.WalkMode.visitAllRecursive });
460
- for (let i = 0; i < nodes.length; i++) {
461
- const node = nodes[i];
462
- //find the top-most ast node
463
- let top = node;
464
- while (top.parent) {
465
- top = top.parent;
466
- }
467
- //should be the same instance. If it doesn't then something is wrong with the .parent linking
468
- (0, chai_config_spec_1.expect)(top === ast || node === ast, `Node ${node.constructor.name} (index ${i}) has broken parent link`).to.be.true;
469
- }
470
- });
471
- it('Walks through all expressions until cancelled', () => {
472
- const file = program.setFile('source/main.bs', `
473
- sub logger(message = "nil" as string)
474
- innerLog = sub(message = "nil" as string)
475
- print message
476
- end sub
477
- innerLog(message)
478
- end sub
479
- `);
480
- const cancel = new vscode_languageserver_1.CancellationTokenSource();
481
- let count = 0;
482
- const stopIndex = 5;
483
- file.ast.walk((statement, parent) => {
484
- count++;
485
- if (count === stopIndex) {
486
- cancel.cancel();
487
- }
488
- }, {
489
- walkMode: visitors_1.WalkMode.visitAllRecursive,
490
- cancel: cancel.token
491
- });
492
- (0, chai_config_spec_1.expect)(count).to.equal(stopIndex);
493
- });
494
- it('walks if statement', () => {
495
- testWalk(`
496
- sub main()
497
- if true then
498
- print "true"
499
- else if true then
500
- print "true"
501
- else
502
- print "true"
503
- end if
504
- end sub
505
- `, [
506
- 'FunctionStatement',
507
- 'FunctionExpression',
508
- 'Block',
509
- //if
510
- 'IfStatement',
511
- 'LiteralExpression',
512
- 'Block',
513
- 'PrintStatement',
514
- 'LiteralExpression',
515
- //else if
516
- 'IfStatement',
517
- 'LiteralExpression',
518
- 'Block',
519
- 'PrintStatement',
520
- 'LiteralExpression',
521
- //else
522
- 'Block',
523
- 'PrintStatement',
524
- 'LiteralExpression'
525
- ]);
526
- });
527
- it('walks if statement without else', () => {
528
- testWalk(`
529
- sub main()
530
- if true then
531
- print "true"
532
- end if
533
- end sub
534
- `, [
535
- 'FunctionStatement',
536
- 'FunctionExpression',
537
- 'Block',
538
- 'IfStatement',
539
- 'LiteralExpression',
540
- 'Block',
541
- 'PrintStatement',
542
- 'LiteralExpression'
543
- ]);
544
- });
545
- it('walks increment statement', () => {
546
- testWalk(`
547
- sub main()
548
- age = 12
549
- age++
550
- end sub
551
- `, [
552
- 'FunctionStatement',
553
- 'FunctionExpression',
554
- 'Block',
555
- 'AssignmentStatement',
556
- 'LiteralExpression',
557
- 'IncrementStatement',
558
- 'VariableExpression'
559
- ]);
560
- });
561
- it('walks ForStatement', () => {
562
- testWalk(`
563
- sub main()
564
- for i = 0 to 10 step 1
565
- print i
566
- end for
567
- end sub
568
- `, [
569
- 'FunctionStatement',
570
- 'FunctionExpression',
571
- 'Block',
572
- 'ForStatement',
573
- 'AssignmentStatement',
574
- 'LiteralExpression',
575
- 'LiteralExpression',
576
- 'LiteralExpression',
577
- 'Block',
578
- 'PrintStatement',
579
- 'VariableExpression'
580
- ]);
581
- });
582
- it('walks ForEachStatement', () => {
583
- testWalk(`
584
- sub main()
585
- for each item in [1,2,3]
586
- print item
587
- end for
588
- end sub
589
- `, [
590
- 'FunctionStatement',
591
- 'FunctionExpression',
592
- 'Block',
593
- 'ForEachStatement',
594
- 'ArrayLiteralExpression',
595
- 'LiteralExpression',
596
- 'LiteralExpression',
597
- 'LiteralExpression',
598
- 'Block',
599
- 'PrintStatement',
600
- 'VariableExpression'
601
- ]);
602
- });
603
- it('walks dotted and indexed set statements', () => {
604
- testWalk(`
605
- sub main()
606
- person = {}
607
- person.name = "person"
608
- person["age"] = 12
609
- end sub
610
- `, [
611
- 'FunctionStatement',
612
- 'FunctionExpression',
613
- 'Block',
614
- 'AssignmentStatement',
615
- 'AALiteralExpression',
616
- 'DottedSetStatement',
617
- 'VariableExpression',
618
- 'LiteralExpression',
619
- 'IndexedSetStatement',
620
- 'VariableExpression',
621
- 'LiteralExpression',
622
- 'LiteralExpression'
623
- ]);
624
- });
625
- it('walks while loop', () => {
626
- testWalk(`
627
- sub main()
628
- while 1 + 1 = 2
629
- print "infinite"
630
- end while
631
- end sub
632
- `, [
633
- 'FunctionStatement',
634
- 'FunctionExpression',
635
- 'Block',
636
- 'WhileStatement',
637
- 'BinaryExpression',
638
- 'BinaryExpression',
639
- 'LiteralExpression',
640
- 'LiteralExpression',
641
- 'LiteralExpression',
642
- 'Block',
643
- 'PrintStatement',
644
- 'LiteralExpression'
645
- ]);
646
- });
647
- it('walks namespace', () => {
648
- testWalk(`
649
- namespace NameA.NameB
650
- end namespace
651
- `, [
652
- 'NamespaceStatement',
653
- 'DottedGetExpression',
654
- 'VariableExpression'
655
- ]);
656
- });
657
- it('walks nested functions', () => {
658
- testWalk(`
659
- sub main()
660
- print "main"
661
- inner1 = sub()
662
- print "inner1"
663
- inner2 = sub()
664
- print "inner2"
665
- inner3 = sub()
666
- print "inner3"
667
- end sub
668
- end sub
669
- end sub
670
- end sub
671
- `, [
672
- //sub main()
673
- 'FunctionStatement',
674
- 'FunctionExpression',
675
- 'Block',
676
- 'PrintStatement',
677
- 'LiteralExpression',
678
- //inner1 = sub()
679
- 'AssignmentStatement',
680
- 'FunctionExpression',
681
- 'Block',
682
- 'PrintStatement',
683
- 'LiteralExpression',
684
- //inner2 = sub()
685
- 'AssignmentStatement',
686
- 'FunctionExpression',
687
- 'Block',
688
- 'PrintStatement',
689
- 'LiteralExpression',
690
- //inner3 = sub
691
- 'AssignmentStatement',
692
- 'FunctionExpression',
693
- 'Block',
694
- 'PrintStatement',
695
- 'LiteralExpression'
696
- ]);
697
- });
698
- it('walks CallExpression', () => {
699
- testWalk(`
700
- sub main()
701
- Sleep(123)
702
- end sub
703
- `, [
704
- 'FunctionStatement',
705
- 'FunctionExpression',
706
- 'Block',
707
- 'ExpressionStatement',
708
- 'CallExpression',
709
- 'VariableExpression',
710
- 'LiteralExpression'
711
- ]);
712
- });
713
- it('walks function parameters', () => {
714
- testWalk(`
715
- sub main(arg1)
716
- speak = sub(arg1, arg2)
717
- end sub
718
- end sub
719
- `, [
720
- 'FunctionStatement',
721
- 'FunctionExpression',
722
- 'FunctionParameterExpression',
723
- 'Block',
724
- 'AssignmentStatement',
725
- 'FunctionExpression',
726
- 'FunctionParameterExpression',
727
- 'FunctionParameterExpression',
728
- 'Block'
729
- ]);
730
- });
731
- it('walks DottedGetExpression', () => {
732
- testWalk(`
733
- sub main()
734
- print person.name
735
- end sub
736
- `, [
737
- 'FunctionStatement',
738
- 'FunctionExpression',
739
- 'Block',
740
- 'PrintStatement',
741
- 'DottedGetExpression',
742
- 'VariableExpression'
743
- ]);
744
- });
745
- it('walks XmlAttributeGetExpression', () => {
746
- testWalk(`
747
- sub main()
748
- print person@name
749
- end sub
750
- `, [
751
- 'FunctionStatement',
752
- 'FunctionExpression',
753
- 'Block',
754
- 'PrintStatement',
755
- 'XmlAttributeGetExpression',
756
- 'VariableExpression'
757
- ]);
758
- });
759
- it('walks IndexedGetExpression', () => {
760
- testWalk(`
761
- sub main()
762
- print person["name"]
763
- end sub
764
- `, [
765
- 'FunctionStatement',
766
- 'FunctionExpression',
767
- 'Block',
768
- 'PrintStatement',
769
- 'IndexedGetExpression',
770
- 'VariableExpression',
771
- 'LiteralExpression'
772
- ]);
773
- });
774
- it('walks GroupingExpression', () => {
775
- testWalk(`
776
- sub main()
777
- print 1 + ( 1 + 2 )
778
- end sub
779
- `, [
780
- 'FunctionStatement',
781
- 'FunctionExpression',
782
- 'Block',
783
- 'PrintStatement',
784
- 'BinaryExpression',
785
- 'LiteralExpression',
786
- 'GroupingExpression',
787
- 'BinaryExpression',
788
- 'LiteralExpression',
789
- 'LiteralExpression'
790
- ]);
791
- });
792
- it('walks AALiteralExpression', () => {
793
- testWalk(`
794
- sub main()
795
- person = {
796
- 'comment
797
- "name": "John Doe"
798
- }
799
- end sub
800
- `, [
801
- 'FunctionStatement',
802
- 'FunctionExpression',
803
- 'Block',
804
- 'AssignmentStatement',
805
- 'AALiteralExpression',
806
- 'AAMemberExpression',
807
- 'LiteralExpression'
808
- ]);
809
- });
810
- it('walks UnaryExpression', () => {
811
- testWalk(`
812
- sub main()
813
- isAlive = not isDead
814
- end sub
815
- `, [
816
- 'FunctionStatement',
817
- 'FunctionExpression',
818
- 'Block',
819
- 'AssignmentStatement',
820
- 'UnaryExpression',
821
- 'VariableExpression'
822
- ]);
823
- });
824
- it('walks TemplateStringExpression', () => {
825
- testWalk(`
826
- sub main()
827
- print \`Hello \${worldVar}\`
828
- end sub
829
- `, [
830
- 'FunctionStatement',
831
- 'FunctionExpression',
832
- 'Block',
833
- 'PrintStatement',
834
- 'TemplateStringExpression',
835
- 'TemplateStringQuasiExpression',
836
- 'LiteralExpression',
837
- 'VariableExpression',
838
- 'TemplateStringQuasiExpression',
839
- 'LiteralExpression'
840
- ]);
841
- });
842
- it('walks ReturnStatement with or without value', () => {
843
- testWalk(`
844
- sub main()
845
- a = 0
846
- if a = 0 then
847
- return
848
- else if a > 0 then
849
- return 1
850
- else
851
- return 'nothing
852
- end if
853
- end sub
854
- `, [
855
- 'FunctionStatement',
856
- 'FunctionExpression',
857
- 'Block',
858
- 'AssignmentStatement',
859
- 'LiteralExpression',
860
- //if
861
- 'IfStatement',
862
- 'BinaryExpression',
863
- 'VariableExpression',
864
- 'LiteralExpression',
865
- 'Block',
866
- 'ReturnStatement',
867
- //else if
868
- 'IfStatement',
869
- 'BinaryExpression',
870
- 'VariableExpression',
871
- 'LiteralExpression',
872
- 'Block',
873
- 'ReturnStatement',
874
- 'LiteralExpression',
875
- //else
876
- 'Block',
877
- 'ReturnStatement'
878
- ]);
879
- });
880
- it('walks TaggedTemplateStringExpression', () => {
881
- testWalk(`
882
- sub main()
883
- print tag\`Hello \${worldVar}\`
884
- end sub
885
- `, [
886
- 'FunctionStatement',
887
- 'FunctionExpression',
888
- 'Block',
889
- 'PrintStatement',
890
- 'TaggedTemplateStringExpression',
891
- 'TemplateStringQuasiExpression',
892
- 'LiteralExpression',
893
- 'VariableExpression',
894
- 'TemplateStringQuasiExpression',
895
- 'LiteralExpression'
896
- ]);
897
- });
898
- it('walks CharCodeLiteral expression within TemplateLiteralExpression', () => {
899
- testWalk(`
900
- sub main()
901
- print \`\\n\`
902
- end sub
903
- `, [
904
- 'FunctionStatement',
905
- 'FunctionExpression',
906
- 'Block',
907
- 'PrintStatement',
908
- 'TemplateStringExpression',
909
- 'TemplateStringQuasiExpression',
910
- 'LiteralExpression',
911
- 'EscapedCharCodeLiteralExpression',
912
- 'LiteralExpression'
913
- ]);
914
- });
915
- it('walks NewExpression', () => {
916
- testWalk(`
917
- sub main()
918
- person = new Person()
919
- end sub
920
- `, [
921
- 'FunctionStatement',
922
- 'FunctionExpression',
923
- 'Block',
924
- 'AssignmentStatement',
925
- 'NewExpression',
926
- 'CallExpression',
927
- 'VariableExpression'
928
- ]);
929
- });
930
- it('walks CallfuncExpression', () => {
931
- testWalk(`
932
- sub main()
933
- person@.doSomething("arg1")
934
- end sub
935
- `, [
936
- 'FunctionStatement',
937
- 'FunctionExpression',
938
- 'Block',
939
- 'ExpressionStatement',
940
- 'CallfuncExpression',
941
- 'VariableExpression',
942
- 'LiteralExpression'
943
- ]);
944
- });
945
- it('walks ClassStatement', () => {
946
- testWalk(`
947
- class Person
948
- name as string
949
- age as integer = 1
950
- function getName()
951
- return m.name
952
- end function
953
- end class
954
- `, [
955
- 'ClassStatement',
956
- 'FieldStatement',
957
- 'TypeExpression',
958
- 'VariableExpression',
959
- 'FieldStatement',
960
- 'TypeExpression',
961
- 'VariableExpression',
962
- 'LiteralExpression',
963
- 'MethodStatement',
964
- 'FunctionExpression',
965
- 'Block',
966
- 'ReturnStatement',
967
- 'DottedGetExpression',
968
- 'VariableExpression'
969
- ]);
970
- });
971
- it('visits all statements and no expressions', () => {
972
- testWalk(`
973
- sub main()
974
- log = sub(message)
975
- print "hello " + message
976
- end sub
977
- log("hello" + " world")
978
- end sub
979
- `, [
980
- 'FunctionStatement',
981
- 'Block',
982
- 'AssignmentStatement',
983
- 'Block',
984
- 'PrintStatement',
985
- 'ExpressionStatement'
986
- ], visitors_1.WalkMode.visitStatementsRecursive);
987
- });
988
- it('visits all expressions and no statement', () => {
989
- testWalk(`
990
- sub main()
991
- log = sub(message)
992
- print "hello " + message
993
- end sub
994
- log("hello" + " world")
995
- end sub
996
- `, [
997
- 'FunctionExpression',
998
- 'FunctionExpression',
999
- 'FunctionParameterExpression',
1000
- 'BinaryExpression',
1001
- 'LiteralExpression',
1002
- 'VariableExpression',
1003
- 'CallExpression',
1004
- 'VariableExpression',
1005
- 'BinaryExpression',
1006
- 'LiteralExpression',
1007
- 'LiteralExpression'
1008
- ], visitors_1.WalkMode.visitExpressionsRecursive);
1009
- });
1010
- it('provides owner and key', () => {
1011
- const items = [];
1012
- const { ast } = Parser_1.Parser.parse(`
1013
- sub main()
1014
- log = sub(message)
1015
- print "hello " + message
1016
- end sub
1017
- log("hello" + " world")
1018
- end sub
1019
- `);
1020
- ast.walk((astNode, parent, owner, key) => {
1021
- items.push(astNode);
1022
- (0, chai_config_spec_1.expect)(owner[key]).to.equal(astNode);
1023
- }, {
1024
- walkMode: visitors_1.WalkMode.visitAllRecursive
1025
- });
1026
- (0, chai_config_spec_1.expect)(items).to.be.length(17);
1027
- });
1028
- it('can be used to delete statements', () => {
1029
- const { ast } = Parser_1.Parser.parse(`
1030
- sub main()
1031
- print 1
1032
- print 2
1033
- print 3
1034
- end sub
1035
- `);
1036
- let callCount = 0;
1037
- ast.walk((astNode, parent, owner, key) => {
1038
- if ((0, reflection_1.isPrintStatement)(astNode)) {
1039
- callCount++;
1040
- //delete the print statement (we know owner is an array based on this specific test)
1041
- owner.splice(key, 1);
1042
- }
1043
- }, {
1044
- walkMode: visitors_1.WalkMode.visitAllRecursive
1045
- });
1046
- //the visitor should have been called for every statement
1047
- (0, chai_config_spec_1.expect)(callCount).to.eql(3);
1048
- (0, chai_config_spec_1.expect)(ast.statements[0].func.body.statements).to.be.lengthOf(0);
1049
- });
1050
- it('walks everything when the first element is replaced', () => {
1051
- const { ast } = Parser_1.Parser.parse(`
1052
- sub main()
1053
- print 1
1054
- print 2
1055
- print 3
1056
- end sub
1057
- `);
1058
- const target = ast.findChild(reflection_1.isBlock).statements[0];
1059
- let callCount = 0;
1060
- ast.walk((astNode, parent, owner, key) => {
1061
- if ((0, reflection_1.isPrintStatement)(astNode)) {
1062
- callCount++;
1063
- }
1064
- if (astNode === target) {
1065
- owner.splice(key, 1);
1066
- }
1067
- }, {
1068
- walkMode: visitors_1.WalkMode.visitAllRecursive
1069
- });
1070
- //the visitor should have been called for every statement
1071
- (0, chai_config_spec_1.expect)(callCount).to.eql(3);
1072
- (0, chai_config_spec_1.expect)(ast.statements[0].func.body.statements).not.to.include(target);
1073
- });
1074
- it('walks everything when the middle element is replaced', () => {
1075
- const { ast } = Parser_1.Parser.parse(`
1076
- sub main()
1077
- print 1
1078
- print 2
1079
- print 3
1080
- end sub
1081
- `);
1082
- const target = ast.findChild(reflection_1.isBlock).statements[1];
1083
- let callCount = 0;
1084
- ast.walk((astNode, parent, owner, key) => {
1085
- if ((0, reflection_1.isPrintStatement)(astNode)) {
1086
- callCount++;
1087
- }
1088
- if (astNode === target) {
1089
- owner.splice(key, 1);
1090
- }
1091
- }, {
1092
- walkMode: visitors_1.WalkMode.visitAllRecursive
1093
- });
1094
- //the visitor should have been called for every statement
1095
- (0, chai_config_spec_1.expect)(callCount).to.eql(3);
1096
- (0, chai_config_spec_1.expect)(ast.statements[0].func.body.statements).not.to.include(target);
1097
- });
1098
- it('walks everything when the end element is replaced', () => {
1099
- const { ast } = Parser_1.Parser.parse(`
1100
- sub main()
1101
- print 1
1102
- print 2
1103
- print 3
1104
- end sub
1105
- `);
1106
- const target = ast.findChild(reflection_1.isBlock).statements[2];
1107
- let callCount = 0;
1108
- ast.walk((astNode, parent, owner, key) => {
1109
- if ((0, reflection_1.isPrintStatement)(astNode)) {
1110
- callCount++;
1111
- }
1112
- if (astNode === target) {
1113
- owner.splice(key, 1);
1114
- }
1115
- }, {
1116
- walkMode: visitors_1.WalkMode.visitAllRecursive
1117
- });
1118
- //the visitor should have been called for every statement
1119
- (0, chai_config_spec_1.expect)(callCount).to.eql(3);
1120
- (0, chai_config_spec_1.expect)(ast.statements[0].func.body.statements).not.to.include(target);
1121
- });
1122
- it('can be used to insert statements', () => {
1123
- const { ast } = Parser_1.Parser.parse(`
1124
- sub main()
1125
- print 1
1126
- print 2
1127
- print 3
1128
- end sub
1129
- `);
1130
- let printStatementCount = 0;
1131
- let callExpressionCount = 0;
1132
- const calls = [];
1133
- ast.walk((0, visitors_1.createVisitor)({
1134
- PrintStatement: (astNode, parent, owner, key) => {
1135
- printStatementCount++;
1136
- //add another expression to the list every time. This should result in 1 the first time, 2 the second, 3 the third.
1137
- calls.push(new Statement_1.ExpressionStatement({
1138
- expression: (0, creators_1.createCall)((0, creators_1.createVariableExpression)('doSomethingBeforePrint'), [
1139
- (0, creators_1.createIntegerLiteral)(callExpressionCount.toString())
1140
- ])
1141
- }));
1142
- owner.splice(key + 1, 0, ...calls.map(x => x.clone()));
1143
- },
1144
- CallExpression: (call) => {
1145
- callExpressionCount++;
1146
- console.log('call visitor for', call.args[0].tokens.value.text);
1147
- }
1148
- }), {
1149
- walkMode: visitors_1.WalkMode.visitAllRecursive
1150
- });
1151
- //the visitor should have been called for every statement
1152
- (0, chai_config_spec_1.expect)(printStatementCount).to.eql(3);
1153
- //since the calls were injected after each print statement, we should have 1 call for the first print, 2 for the second, and 3 for the third
1154
- (0, chai_config_spec_1.expect)(callExpressionCount).to.eql(6);
1155
- (0, chai_config_spec_1.expect)(ast.statements[0].func.body.statements).to.be.lengthOf(9);
1156
- });
1157
- it('skips children when requested', () => {
1158
- const file = program.setFile('source/main.bs', `
1159
- sub test()
1160
- print 1 + 1
1161
- print "hello"
1162
- end sub
1163
-
1164
- sub test2()
1165
- i = 2
1166
- while i > 0
1167
- print createObject("roDateTime").ToISOString()
1168
- i--
1169
- end while
1170
- end sub
1171
- `);
1172
- const actual = new Array();
1173
- program.validate();
1174
- (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
1175
- // do not walk into print statements
1176
- const skipper = new visitors_1.ChildrenSkipper();
1177
- file.ast.walk((node) => {
1178
- actual.push(node.kind);
1179
- if ((0, reflection_1.isPrintStatement)(node)) {
1180
- skipper.skip();
1181
- }
1182
- }, {
1183
- walkMode: visitors_1.WalkMode.visitAllRecursive,
1184
- skipChildren: skipper
1185
- });
1186
- // Does not walk into print statements
1187
- (0, chai_config_spec_1.expect)(actual).to.deep.equal([
1188
- 'FunctionStatement',
1189
- 'FunctionExpression',
1190
- 'Block',
1191
- 'PrintStatement',
1192
- 'PrintStatement',
1193
- 'FunctionStatement',
1194
- 'FunctionExpression',
1195
- 'Block',
1196
- 'AssignmentStatement',
1197
- 'LiteralExpression',
1198
- 'WhileStatement',
1199
- 'BinaryExpression',
1200
- 'VariableExpression',
1201
- 'LiteralExpression',
1202
- 'Block',
1203
- 'PrintStatement',
1204
- 'IncrementStatement',
1205
- 'VariableExpression'
1206
- ]);
1207
- });
1208
- it('can get end trivia of any kind of block type node', () => {
1209
- const file = program.setFile('source/main.bs', `
1210
- sub test()
1211
- x = {
1212
- val: [123],
1213
- count: 4
1214
- ' end comment in literal AA 1
1215
- }
1216
- for each y in x.val
1217
- print y
1218
- ' end comment in for 2
1219
- end for
1220
-
1221
- if x.count > 2
1222
- print "hi"
1223
- ' end comment in if 3
1224
- end if
1225
-
1226
- while x.count > 3
1227
- x.count--
1228
- ' end comment in while 4
1229
- end while
1230
-
1231
- try
1232
- print "in try"
1233
- catch e
1234
- ' end comment in try 5
1235
- end try
1236
-
1237
- array = [
1238
- 1,
1239
- 2,
1240
- ' end comment in array 6
1241
- ]
1242
-
1243
- ' end comment in function 7
1244
- end sub
1245
- `);
1246
- const comments = [];
1247
- program.validate();
1248
- (0, testHelpers_spec_1.expectZeroDiagnostics)(program);
1249
- file.ast.walk((0, visitors_1.createVisitor)({
1250
- AstNode: (node) => {
1251
- const endNodeComments = node.endTrivia.filter(t => t.kind === TokenKind_1.TokenKind.Comment);
1252
- comments.push(...endNodeComments);
1253
- }
1254
- }), {
1255
- walkMode: visitors_1.WalkMode.visitAllRecursive
1256
- });
1257
- });
1258
- it('walks a new child when returned from a visitor', () => {
1259
- let walkedLiterals = [];
1260
- Parser_1.Parser.parse(`
1261
- sub main()
1262
- print 1 + 2
1263
- end sub
1264
- `).ast.walk((0, visitors_1.createVisitor)({
1265
- BinaryExpression: (node, parent, owner, key) => {
1266
- //replace the `1 + 2` binary expression with a new binary expression
1267
- if ((0, reflection_1.isLiteralExpression)(node.left) && node.left.tokens.value.text === '1') {
1268
- return new Expression_1.BinaryExpression({
1269
- left: (0, creators_1.createIntegerLiteral)('3'),
1270
- operator: (0, creators_1.createToken)(TokenKind_1.TokenKind.Plus),
1271
- right: (0, creators_1.createIntegerLiteral)('4')
1272
- });
1273
- }
1274
- },
1275
- LiteralExpression: (node) => {
1276
- walkedLiterals.push(node.tokens.value.text);
1277
- }
1278
- }), {
1279
- walkMode: visitors_1.WalkMode.visitAllRecursive
1280
- });
1281
- (0, chai_config_spec_1.expect)(walkedLiterals).to.eql(['3', '4']);
1282
- });
1283
- it('can set bsConst in walk', () => {
1284
- const { ast } = program.setFile('source/main.brs', `
1285
- #if DEBUG
1286
- sub main()
1287
- end sub
1288
- #end if
1289
- `);
1290
- const bsConsts = new Map();
1291
- let foundMainFunc = false;
1292
- const visitor = (0, visitors_1.createVisitor)({
1293
- FunctionStatement: (func) => {
1294
- foundMainFunc || (foundMainFunc = func.getName(Parser_1.ParseMode.BrighterScript) === 'main');
1295
- }
1296
- });
1297
- ast.walk(visitor, {
1298
- walkMode: visitors_1.WalkMode.visitStatements,
1299
- bsConsts: bsConsts
1300
- });
1301
- // did not walk false block
1302
- (0, chai_config_spec_1.expect)(foundMainFunc).to.be.false;
1303
- bsConsts.set('debug', true);
1304
- ast.walk(visitor, {
1305
- walkMode: visitors_1.WalkMode.visitStatements,
1306
- bsConsts: bsConsts
1307
- });
1308
- // debug is true, so it did walk block
1309
- (0, chai_config_spec_1.expect)(foundMainFunc).to.be.true;
1310
- });
1311
- it('can walk false cc blocks', () => {
1312
- const { ast } = program.setFile('source/main.brs', `
1313
- #if false
1314
- sub main()
1315
- end sub
1316
- #end if
1317
- `);
1318
- const bsConsts = new Map();
1319
- let foundMainFunc = false;
1320
- const visitor = (0, visitors_1.createVisitor)({
1321
- FunctionStatement: (func) => {
1322
- foundMainFunc || (foundMainFunc = func.getName(Parser_1.ParseMode.BrighterScript) === 'main');
1323
- }
1324
- });
1325
- ast.walk(visitor, {
1326
- walkMode: visitors_1.WalkMode.visitStatements,
1327
- bsConsts: bsConsts
1328
- });
1329
- // did not walk false block
1330
- (0, chai_config_spec_1.expect)(foundMainFunc).to.be.false;
1331
- ast.walk(visitor, {
1332
- // eslint-disable-next-line no-bitwise
1333
- walkMode: visitors_1.WalkMode.visitStatements | visitors_1.InternalWalkMode.visitFalseConditionalCompilationBlocks,
1334
- bsConsts: bsConsts
1335
- });
1336
- // did walk false block
1337
- (0, chai_config_spec_1.expect)(foundMainFunc).to.be.true;
1338
- });
1339
- it('will correctly walk `not condition` cc blocks', () => {
1340
- const { ast } = program.setFile('source/main.brs', `
1341
- #const DEBUG = false
1342
- #if not DEBUG
1343
- sub notDebug()
1344
- end sub
1345
- #end if
1346
- #if not false
1347
- sub notFalse()
1348
- end sub
1349
- #end if
1350
- `);
1351
- const bsConsts = new Map();
1352
- let functionsFound = new Set();
1353
- const visitor = (0, visitors_1.createVisitor)({
1354
- FunctionStatement: (func) => {
1355
- functionsFound.add(func.getName(Parser_1.ParseMode.BrighterScript));
1356
- }
1357
- });
1358
- ast.walk(visitor, {
1359
- walkMode: visitors_1.WalkMode.visitStatements,
1360
- bsConsts: bsConsts
1361
- });
1362
- // did walk 'not' block
1363
- (0, chai_config_spec_1.expect)(functionsFound.has('notDebug')).to.be.true;
1364
- (0, chai_config_spec_1.expect)(functionsFound.has('notFalse')).to.be.true;
1365
- });
1366
- it('walks a new child when returned from a visitor and using an AstEditor', () => {
1367
- let walkedLiterals = [];
1368
- Parser_1.Parser.parse(`
1369
- sub main()
1370
- print 1 + 2
1371
- end sub
1372
- `).ast.walk((0, visitors_1.createVisitor)({
1373
- BinaryExpression: (node, parent, owner, key) => {
1374
- //replace the `1 + 2` binary expression with a new binary expression
1375
- if ((0, reflection_1.isLiteralExpression)(node.left) && node.left.tokens.value.text === '1') {
1376
- return new Expression_1.BinaryExpression({
1377
- left: (0, creators_1.createIntegerLiteral)('3'),
1378
- operator: (0, creators_1.createToken)(TokenKind_1.TokenKind.Plus),
1379
- right: (0, creators_1.createIntegerLiteral)('4')
1380
- });
1381
- }
1382
- },
1383
- LiteralExpression: (node) => {
1384
- walkedLiterals.push(node.tokens.value.text);
1385
- }
1386
- }), {
1387
- walkMode: visitors_1.WalkMode.visitAllRecursive,
1388
- editor: new Editor_1.Editor()
1389
- });
1390
- (0, chai_config_spec_1.expect)(walkedLiterals).to.eql(['3', '4']);
1391
- });
1392
- });
1393
- describe('walkArray', () => {
1394
- const one = (0, creators_1.createVariableExpression)('one');
1395
- const two = (0, creators_1.createVariableExpression)('two');
1396
- const three = (0, creators_1.createVariableExpression)('three');
1397
- const four = (0, creators_1.createVariableExpression)('four');
1398
- const five = (0, creators_1.createVariableExpression)('five');
1399
- function doTest(startingArray, expected, visitor) {
1400
- const visitedItems = [];
1401
- (0, visitors_1.walkArray)(startingArray, (item, parent, owner, key) => {
1402
- visitedItems.push(item);
1403
- return visitor === null || visitor === void 0 ? void 0 : visitor(item, parent, owner, key);
1404
- }, { walkMode: visitors_1.WalkMode.visitAllRecursive });
1405
- (0, chai_config_spec_1.expect)(visitedItems.map(x => x.tokens.name.text)).to.eql(expected.map(x => x.tokens.name.text));
1406
- }
1407
- it('walks every element in the array', () => {
1408
- doTest([one, two, three, four, five], [one, two, three, four, five]);
1409
- });
1410
- it('walks new items added to the array', () => {
1411
- doTest([one, two], [one, three, two, four], (item, parent, owner, key) => {
1412
- //insert a value after one
1413
- if (item === one) {
1414
- owner.splice(key + 1, 0, three);
1415
- //insert a value after one
1416
- }
1417
- else if (item === two) {
1418
- owner.splice(key + 1, 0, four);
1419
- }
1420
- });
1421
- });
1422
- it('triggers on nodes that were skiped due to insertions', () => {
1423
- doTest([one, two, three], [one, two, four, three], (item, parent, owner, key) => {
1424
- //insert a value after one
1425
- if (item === two) {
1426
- owner.splice(key, 0, four);
1427
- }
1428
- });
1429
- });
1430
- });
1431
- });
1432
- //# sourceMappingURL=visitors.spec.js.map