brighterscript 1.0.0-alpha.2 → 1.0.0-alpha.22

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 (388) hide show
  1. package/CHANGELOG.md +643 -253
  2. package/README.md +33 -9
  3. package/bsconfig.schema.json +22 -2
  4. package/dist/BsConfig.d.ts +9 -0
  5. package/dist/Cache.d.ts +5 -6
  6. package/dist/Cache.js +12 -11
  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.d.ts +2 -2
  15. package/dist/DependencyGraph.js +20 -7
  16. package/dist/DependencyGraph.js.map +1 -1
  17. package/dist/DiagnosticCollection.d.ts +3 -3
  18. package/dist/DiagnosticCollection.js +11 -11
  19. package/dist/DiagnosticCollection.js.map +1 -1
  20. package/dist/DiagnosticFilterer.js +5 -4
  21. package/dist/DiagnosticFilterer.js.map +1 -1
  22. package/dist/DiagnosticMessages.d.ts +59 -4
  23. package/dist/DiagnosticMessages.js +65 -7
  24. package/dist/DiagnosticMessages.js.map +1 -1
  25. package/dist/LanguageServer.d.ts +51 -39
  26. package/dist/LanguageServer.js +316 -232
  27. package/dist/LanguageServer.js.map +1 -1
  28. package/dist/Logger.d.ts +2 -0
  29. package/dist/Logger.js +10 -8
  30. package/dist/Logger.js.map +1 -1
  31. package/dist/PluginInterface.d.ts +7 -3
  32. package/dist/PluginInterface.js +9 -0
  33. package/dist/PluginInterface.js.map +1 -1
  34. package/dist/Program.d.ts +43 -25
  35. package/dist/Program.js +212 -95
  36. package/dist/Program.js.map +1 -1
  37. package/dist/ProgramBuilder.d.ts +4 -0
  38. package/dist/ProgramBuilder.js +36 -20
  39. package/dist/ProgramBuilder.js.map +1 -1
  40. package/dist/Scope.d.ts +126 -29
  41. package/dist/Scope.js +433 -156
  42. package/dist/Scope.js.map +1 -1
  43. package/dist/SemanticTokenUtils.d.ts +14 -0
  44. package/dist/SemanticTokenUtils.js +81 -0
  45. package/dist/SemanticTokenUtils.js.map +1 -0
  46. package/dist/SymbolTable.d.ts +10 -4
  47. package/dist/SymbolTable.js +55 -13
  48. package/dist/SymbolTable.js.map +1 -1
  49. package/dist/XmlScope.d.ts +7 -2
  50. package/dist/XmlScope.js +65 -27
  51. package/dist/XmlScope.js.map +1 -1
  52. package/dist/astUtils/AstEditor.d.ts +65 -0
  53. package/dist/astUtils/AstEditor.js +239 -0
  54. package/dist/astUtils/AstEditor.js.map +1 -0
  55. package/dist/{types/FunctionType.spec.d.ts → astUtils/AstEditor.spec.d.ts} +0 -0
  56. package/dist/astUtils/AstEditor.spec.js +254 -0
  57. package/dist/astUtils/AstEditor.spec.js.map +1 -0
  58. package/dist/astUtils/creators.d.ts +28 -6
  59. package/dist/astUtils/creators.js +137 -19
  60. package/dist/astUtils/creators.js.map +1 -1
  61. package/dist/astUtils/creators.spec.js +14 -4
  62. package/dist/astUtils/creators.spec.js.map +1 -1
  63. package/dist/astUtils/reflection.d.ts +32 -10
  64. package/dist/astUtils/reflection.js +82 -7
  65. package/dist/astUtils/reflection.js.map +1 -1
  66. package/dist/astUtils/reflection.spec.js +130 -119
  67. package/dist/astUtils/reflection.spec.js.map +1 -1
  68. package/dist/astUtils/stackedVisitor.js.map +1 -1
  69. package/dist/astUtils/stackedVisitor.spec.js +13 -13
  70. package/dist/astUtils/stackedVisitor.spec.js.map +1 -1
  71. package/dist/astUtils/visitors.d.ts +76 -51
  72. package/dist/astUtils/visitors.js +31 -11
  73. package/dist/astUtils/visitors.js.map +1 -1
  74. package/dist/astUtils/visitors.spec.js +126 -32
  75. package/dist/astUtils/visitors.spec.js.map +1 -1
  76. package/dist/astUtils/xml.d.ts +4 -3
  77. package/dist/astUtils/xml.js +8 -3
  78. package/dist/astUtils/xml.js.map +1 -1
  79. package/dist/bscPlugin/BscPlugin.d.ts +7 -1
  80. package/dist/bscPlugin/BscPlugin.js +28 -0
  81. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  82. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +4 -4
  83. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  84. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +26 -26
  85. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  86. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.d.ts +9 -0
  87. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +108 -0
  88. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -0
  89. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.d.ts +1 -0
  90. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +130 -0
  91. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -0
  92. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.d.ts +8 -0
  93. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js +52 -0
  94. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.js.map +1 -0
  95. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.d.ts +1 -0
  96. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js +32 -0
  97. package/dist/bscPlugin/transpile/BrsFilePreTranspileProcessor.spec.js.map +1 -0
  98. package/dist/bscPlugin/validation/BrsFileValidator.d.ts +9 -0
  99. package/dist/bscPlugin/validation/BrsFileValidator.js +66 -0
  100. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -0
  101. package/dist/bscPlugin/validation/ScopeValidator.d.ts +29 -0
  102. package/dist/bscPlugin/validation/ScopeValidator.js +183 -0
  103. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -0
  104. package/dist/cli.js +10 -3
  105. package/dist/cli.js.map +1 -1
  106. package/dist/diagnosticUtils.d.ts +1 -0
  107. package/dist/diagnosticUtils.js +15 -8
  108. package/dist/diagnosticUtils.js.map +1 -1
  109. package/dist/examples/plugins/removePrint.js +12 -14
  110. package/dist/examples/plugins/removePrint.js.map +1 -1
  111. package/dist/files/BrsFile.Class.spec.js +717 -147
  112. package/dist/files/BrsFile.Class.spec.js.map +1 -1
  113. package/dist/files/BrsFile.d.ts +70 -30
  114. package/dist/files/BrsFile.js +719 -353
  115. package/dist/files/BrsFile.js.map +1 -1
  116. package/dist/files/BrsFile.spec.js +1238 -449
  117. package/dist/files/BrsFile.spec.js.map +1 -1
  118. package/dist/files/XmlFile.d.ts +6 -5
  119. package/dist/files/XmlFile.js +38 -30
  120. package/dist/files/XmlFile.js.map +1 -1
  121. package/dist/files/XmlFile.spec.js +302 -237
  122. package/dist/files/XmlFile.spec.js.map +1 -1
  123. package/dist/files/tests/imports.spec.js +44 -42
  124. package/dist/files/tests/imports.spec.js.map +1 -1
  125. package/dist/files/tests/optionalChaning.spec.d.ts +1 -0
  126. package/dist/files/tests/optionalChaning.spec.js +88 -0
  127. package/dist/files/tests/optionalChaning.spec.js.map +1 -0
  128. package/dist/globalCallables.d.ts +3 -1
  129. package/dist/globalCallables.js +424 -152
  130. package/dist/globalCallables.js.map +1 -1
  131. package/dist/index.d.ts +13 -3
  132. package/dist/index.js +28 -5
  133. package/dist/index.js.map +1 -1
  134. package/dist/interfaces.d.ts +133 -16
  135. package/dist/lexer/Lexer.d.ts +19 -1
  136. package/dist/lexer/Lexer.js +127 -21
  137. package/dist/lexer/Lexer.js.map +1 -1
  138. package/dist/lexer/Lexer.spec.js +657 -536
  139. package/dist/lexer/Lexer.spec.js.map +1 -1
  140. package/dist/lexer/Token.d.ts +2 -2
  141. package/dist/lexer/TokenKind.d.ts +13 -1
  142. package/dist/lexer/TokenKind.js +60 -3
  143. package/dist/lexer/TokenKind.js.map +1 -1
  144. package/dist/parser/BrsTranspileState.d.ts +9 -0
  145. package/dist/parser/BrsTranspileState.js +14 -0
  146. package/dist/parser/BrsTranspileState.js.map +1 -1
  147. package/dist/parser/Expression.d.ts +150 -34
  148. package/dist/parser/Expression.js +335 -165
  149. package/dist/parser/Expression.js.map +1 -1
  150. package/dist/parser/Parser.Class.spec.js +189 -89
  151. package/dist/parser/Parser.Class.spec.js.map +1 -1
  152. package/dist/parser/Parser.d.ts +153 -30
  153. package/dist/parser/Parser.js +1100 -503
  154. package/dist/parser/Parser.js.map +1 -1
  155. package/dist/parser/Parser.spec.js +687 -266
  156. package/dist/parser/Parser.spec.js.map +1 -1
  157. package/dist/parser/SGParser.d.ts +41 -4
  158. package/dist/parser/SGParser.js +186 -175
  159. package/dist/parser/SGParser.js.map +1 -1
  160. package/dist/parser/SGParser.spec.js +35 -22
  161. package/dist/parser/SGParser.spec.js.map +1 -1
  162. package/dist/parser/SGTypes.d.ts +206 -38
  163. package/dist/parser/SGTypes.js +470 -161
  164. package/dist/parser/SGTypes.js.map +1 -1
  165. package/dist/parser/SGTypes.spec.d.ts +1 -0
  166. package/dist/parser/SGTypes.spec.js +351 -0
  167. package/dist/parser/SGTypes.spec.js.map +1 -0
  168. package/dist/parser/Statement.d.ts +202 -48
  169. package/dist/parser/Statement.js +648 -193
  170. package/dist/parser/Statement.js.map +1 -1
  171. package/dist/parser/Statement.spec.js +11 -11
  172. package/dist/parser/Statement.spec.js.map +1 -1
  173. package/dist/parser/TranspileState.d.ts +1 -1
  174. package/dist/parser/TranspileState.js +15 -7
  175. package/dist/parser/TranspileState.js.map +1 -1
  176. package/dist/parser/tests/Parser.spec.d.ts +10 -9
  177. package/dist/parser/tests/Parser.spec.js +15 -11
  178. package/dist/parser/tests/Parser.spec.js.map +1 -1
  179. package/dist/parser/tests/controlFlow/For.spec.js +60 -60
  180. package/dist/parser/tests/controlFlow/For.spec.js.map +1 -1
  181. package/dist/parser/tests/controlFlow/ForEach.spec.js +40 -39
  182. package/dist/parser/tests/controlFlow/ForEach.spec.js.map +1 -1
  183. package/dist/parser/tests/controlFlow/If.spec.js +213 -194
  184. package/dist/parser/tests/controlFlow/If.spec.js.map +1 -1
  185. package/dist/parser/tests/controlFlow/While.spec.js +37 -37
  186. package/dist/parser/tests/controlFlow/While.spec.js.map +1 -1
  187. package/dist/parser/tests/expression/Additive.spec.js +30 -30
  188. package/dist/parser/tests/expression/Additive.spec.js.map +1 -1
  189. package/dist/parser/tests/expression/ArrayLiterals.spec.js +119 -119
  190. package/dist/parser/tests/expression/ArrayLiterals.spec.js.map +1 -1
  191. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js +162 -138
  192. package/dist/parser/tests/expression/AssociativeArrayLiterals.spec.js.map +1 -1
  193. package/dist/parser/tests/expression/Boolean.spec.js +24 -24
  194. package/dist/parser/tests/expression/Boolean.spec.js.map +1 -1
  195. package/dist/parser/tests/expression/Call.spec.js +41 -40
  196. package/dist/parser/tests/expression/Call.spec.js.map +1 -1
  197. package/dist/parser/tests/expression/Exponential.spec.js +17 -17
  198. package/dist/parser/tests/expression/Exponential.spec.js.map +1 -1
  199. package/dist/parser/tests/expression/Function.spec.js +256 -256
  200. package/dist/parser/tests/expression/Function.spec.js.map +1 -1
  201. package/dist/parser/tests/expression/Indexing.spec.js +87 -87
  202. package/dist/parser/tests/expression/Indexing.spec.js.map +1 -1
  203. package/dist/parser/tests/expression/Multiplicative.spec.js +37 -37
  204. package/dist/parser/tests/expression/Multiplicative.spec.js.map +1 -1
  205. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +75 -63
  206. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  207. package/dist/parser/tests/expression/PrefixUnary.spec.js +41 -41
  208. package/dist/parser/tests/expression/PrefixUnary.spec.js.map +1 -1
  209. package/dist/parser/tests/expression/Primary.spec.js +41 -41
  210. package/dist/parser/tests/expression/Primary.spec.js.map +1 -1
  211. package/dist/parser/tests/expression/RegexLiteralExpression.spec.d.ts +1 -0
  212. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js +171 -0
  213. package/dist/parser/tests/expression/RegexLiteralExpression.spec.js.map +1 -0
  214. package/dist/parser/tests/expression/Relational.spec.js +43 -43
  215. package/dist/parser/tests/expression/Relational.spec.js.map +1 -1
  216. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js +9 -9
  217. package/dist/parser/tests/expression/SourceLiteralExpression.spec.js.map +1 -1
  218. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +28 -28
  219. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  220. package/dist/parser/tests/expression/TernaryExpression.spec.js +102 -102
  221. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  222. package/dist/parser/tests/statement/AssignmentOperators.spec.js +36 -36
  223. package/dist/parser/tests/statement/AssignmentOperators.spec.js.map +1 -1
  224. package/dist/parser/tests/statement/Declaration.spec.js +44 -44
  225. package/dist/parser/tests/statement/Declaration.spec.js.map +1 -1
  226. package/dist/parser/tests/statement/Dim.spec.js +21 -21
  227. package/dist/parser/tests/statement/Dim.spec.js.map +1 -1
  228. package/dist/parser/tests/statement/Enum.spec.d.ts +1 -0
  229. package/dist/parser/tests/statement/Enum.spec.js +840 -0
  230. package/dist/parser/tests/statement/Enum.spec.js.map +1 -0
  231. package/dist/parser/tests/statement/For.spec.d.ts +1 -0
  232. package/dist/parser/tests/statement/For.spec.js +46 -0
  233. package/dist/parser/tests/statement/For.spec.js.map +1 -0
  234. package/dist/parser/tests/statement/ForEach.spec.d.ts +1 -0
  235. package/dist/parser/tests/statement/ForEach.spec.js +37 -0
  236. package/dist/parser/tests/statement/ForEach.spec.js.map +1 -0
  237. package/dist/parser/tests/statement/Function.spec.js +198 -197
  238. package/dist/parser/tests/statement/Function.spec.js.map +1 -1
  239. package/dist/parser/tests/statement/Goto.spec.js +15 -14
  240. package/dist/parser/tests/statement/Goto.spec.js.map +1 -1
  241. package/dist/parser/tests/statement/Increment.spec.js +50 -50
  242. package/dist/parser/tests/statement/Increment.spec.js.map +1 -1
  243. package/dist/parser/tests/statement/InterfaceStatement.spec.d.ts +1 -0
  244. package/dist/parser/tests/statement/InterfaceStatement.spec.js +254 -0
  245. package/dist/parser/tests/statement/InterfaceStatement.spec.js.map +1 -0
  246. package/dist/parser/tests/statement/LibraryStatement.spec.js +17 -17
  247. package/dist/parser/tests/statement/LibraryStatement.spec.js.map +1 -1
  248. package/dist/parser/tests/statement/Misc.spec.js +108 -106
  249. package/dist/parser/tests/statement/Misc.spec.js.map +1 -1
  250. package/dist/parser/tests/statement/PrintStatement.spec.js +40 -40
  251. package/dist/parser/tests/statement/PrintStatement.spec.js.map +1 -1
  252. package/dist/parser/tests/statement/ReturnStatement.spec.js +46 -46
  253. package/dist/parser/tests/statement/ReturnStatement.spec.js.map +1 -1
  254. package/dist/parser/tests/statement/Set.spec.js +83 -83
  255. package/dist/parser/tests/statement/Set.spec.js.map +1 -1
  256. package/dist/parser/tests/statement/Stop.spec.js +12 -11
  257. package/dist/parser/tests/statement/Stop.spec.js.map +1 -1
  258. package/dist/parser/tests/statement/Throw.spec.js +5 -5
  259. package/dist/parser/tests/statement/Throw.spec.js.map +1 -1
  260. package/dist/parser/tests/statement/TryCatch.spec.js +15 -13
  261. package/dist/parser/tests/statement/TryCatch.spec.js.map +1 -1
  262. package/dist/preprocessor/Chunk.d.ts +1 -1
  263. package/dist/preprocessor/Chunk.js.map +1 -1
  264. package/dist/preprocessor/Manifest.d.ts +5 -5
  265. package/dist/preprocessor/Manifest.js +14 -35
  266. package/dist/preprocessor/Manifest.js.map +1 -1
  267. package/dist/preprocessor/Manifest.spec.d.ts +1 -0
  268. package/dist/preprocessor/Manifest.spec.js +78 -103
  269. package/dist/preprocessor/Manifest.spec.js.map +1 -1
  270. package/dist/preprocessor/Preprocessor.d.ts +1 -1
  271. package/dist/preprocessor/Preprocessor.js +8 -8
  272. package/dist/preprocessor/Preprocessor.js.map +1 -1
  273. package/dist/preprocessor/Preprocessor.spec.js +49 -49
  274. package/dist/preprocessor/Preprocessor.spec.js.map +1 -1
  275. package/dist/preprocessor/PreprocessorParser.spec.js +72 -72
  276. package/dist/preprocessor/PreprocessorParser.spec.js.map +1 -1
  277. package/dist/roku-types/data.json +21891 -0
  278. package/dist/roku-types/index.d.ts +6776 -0
  279. package/dist/roku-types/index.js +11 -0
  280. package/dist/roku-types/index.js.map +1 -0
  281. package/dist/types/ArrayType.d.ts +8 -5
  282. package/dist/types/ArrayType.js +52 -12
  283. package/dist/types/ArrayType.js.map +1 -1
  284. package/dist/types/ArrayType.spec.js +72 -11
  285. package/dist/types/ArrayType.spec.js.map +1 -1
  286. package/dist/types/BooleanType.d.ts +4 -2
  287. package/dist/types/BooleanType.js +9 -4
  288. package/dist/types/BooleanType.js.map +1 -1
  289. package/dist/types/BooleanType.spec.js +5 -3
  290. package/dist/types/BooleanType.spec.js.map +1 -1
  291. package/dist/types/BscType.d.ts +20 -5
  292. package/dist/types/BscType.js +24 -0
  293. package/dist/types/BscType.js.map +1 -1
  294. package/dist/types/CustomType.d.ts +8 -6
  295. package/dist/types/CustomType.js +20 -11
  296. package/dist/types/CustomType.js.map +1 -1
  297. package/dist/types/DoubleType.d.ts +2 -0
  298. package/dist/types/DoubleType.js +14 -9
  299. package/dist/types/DoubleType.js.map +1 -1
  300. package/dist/types/DoubleType.spec.js +5 -3
  301. package/dist/types/DoubleType.spec.js.map +1 -1
  302. package/dist/types/DynamicType.d.ts +2 -0
  303. package/dist/types/DynamicType.js +6 -2
  304. package/dist/types/DynamicType.js.map +1 -1
  305. package/dist/types/DynamicType.spec.js +2 -2
  306. package/dist/types/DynamicType.spec.js.map +1 -1
  307. package/dist/types/EnumType.d.ts +22 -0
  308. package/dist/types/EnumType.js +55 -0
  309. package/dist/types/EnumType.js.map +1 -0
  310. package/dist/types/FloatType.d.ts +2 -0
  311. package/dist/types/FloatType.js +14 -9
  312. package/dist/types/FloatType.js.map +1 -1
  313. package/dist/types/FloatType.spec.js +4 -2
  314. package/dist/types/FloatType.spec.js.map +1 -1
  315. package/dist/types/FunctionType.d.ts +7 -31
  316. package/dist/types/FunctionType.js +11 -57
  317. package/dist/types/FunctionType.js.map +1 -1
  318. package/dist/types/IntegerType.d.ts +2 -0
  319. package/dist/types/IntegerType.js +14 -9
  320. package/dist/types/IntegerType.js.map +1 -1
  321. package/dist/types/IntegerType.spec.js +5 -3
  322. package/dist/types/IntegerType.spec.js.map +1 -1
  323. package/dist/types/InterfaceType.d.ts +13 -4
  324. package/dist/types/InterfaceType.js +48 -8
  325. package/dist/types/InterfaceType.js.map +1 -1
  326. package/dist/types/InterfaceType.spec.d.ts +1 -0
  327. package/dist/types/InterfaceType.spec.js +194 -0
  328. package/dist/types/InterfaceType.spec.js.map +1 -0
  329. package/dist/types/InvalidType.d.ts +4 -2
  330. package/dist/types/InvalidType.js +10 -5
  331. package/dist/types/InvalidType.js.map +1 -1
  332. package/dist/types/InvalidType.spec.js +4 -2
  333. package/dist/types/InvalidType.spec.js.map +1 -1
  334. package/dist/types/LazyType.d.ts +8 -7
  335. package/dist/types/LazyType.js +22 -10
  336. package/dist/types/LazyType.js.map +1 -1
  337. package/dist/types/LongIntegerType.d.ts +2 -0
  338. package/dist/types/LongIntegerType.js +14 -9
  339. package/dist/types/LongIntegerType.js.map +1 -1
  340. package/dist/types/LongIntegerType.spec.js +4 -2
  341. package/dist/types/LongIntegerType.spec.js.map +1 -1
  342. package/dist/types/ObjectType.d.ts +8 -4
  343. package/dist/types/ObjectType.js +9 -4
  344. package/dist/types/ObjectType.js.map +1 -1
  345. package/dist/types/ObjectType.spec.js +2 -2
  346. package/dist/types/ObjectType.spec.js.map +1 -1
  347. package/dist/types/StringType.d.ts +4 -2
  348. package/dist/types/StringType.js +9 -4
  349. package/dist/types/StringType.js.map +1 -1
  350. package/dist/types/StringType.spec.js +4 -2
  351. package/dist/types/StringType.spec.js.map +1 -1
  352. package/dist/types/TypedFunctionType.d.ts +28 -0
  353. package/dist/types/TypedFunctionType.js +88 -0
  354. package/dist/types/TypedFunctionType.js.map +1 -0
  355. package/dist/types/TypedFunctionType.spec.d.ts +1 -0
  356. package/dist/types/TypedFunctionType.spec.js +37 -0
  357. package/dist/types/TypedFunctionType.spec.js.map +1 -0
  358. package/dist/types/UninitializedType.js +3 -3
  359. package/dist/types/UninitializedType.js.map +1 -1
  360. package/dist/types/VoidType.d.ts +4 -2
  361. package/dist/types/VoidType.js +8 -4
  362. package/dist/types/VoidType.js.map +1 -1
  363. package/dist/types/VoidType.spec.js +2 -2
  364. package/dist/types/VoidType.spec.js.map +1 -1
  365. package/dist/types/helpers.d.ts +42 -0
  366. package/dist/types/helpers.js +118 -0
  367. package/dist/types/helpers.js.map +1 -0
  368. package/dist/util.d.ts +91 -21
  369. package/dist/util.js +364 -114
  370. package/dist/util.js.map +1 -1
  371. package/dist/validators/ClassValidator.d.ts +19 -2
  372. package/dist/validators/ClassValidator.js +164 -103
  373. package/dist/validators/ClassValidator.js.map +1 -1
  374. package/package.json +30 -19
  375. package/dist/astUtils/index.d.ts +0 -7
  376. package/dist/astUtils/index.js +0 -26
  377. package/dist/astUtils/index.js.map +0 -1
  378. package/dist/lexer/index.d.ts +0 -3
  379. package/dist/lexer/index.js +0 -17
  380. package/dist/lexer/index.js.map +0 -1
  381. package/dist/parser/index.d.ts +0 -3
  382. package/dist/parser/index.js +0 -16
  383. package/dist/parser/index.js.map +0 -1
  384. package/dist/preprocessor/index.d.ts +0 -3
  385. package/dist/preprocessor/index.js +0 -16
  386. package/dist/preprocessor/index.js.map +0 -1
  387. package/dist/types/FunctionType.spec.js +0 -23
  388. package/dist/types/FunctionType.spec.js.map +0 -1
@@ -3,13 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const chai_1 = require("chai");
4
4
  const assert = require("assert");
5
5
  const Parser_1 = require("../../Parser");
6
- const lexer_1 = require("../../../lexer");
6
+ const Lexer_1 = require("../../../lexer/Lexer");
7
+ const TokenKind_1 = require("../../../lexer/TokenKind");
7
8
  const Parser_spec_1 = require("../Parser.spec");
8
- const astUtils_1 = require("../../../astUtils");
9
+ const reflection_1 = require("../../../astUtils/reflection");
9
10
  describe('parser if statements', () => {
10
11
  it('allows empty if blocks', () => {
11
12
  var _a;
12
- let { tokens } = lexer_1.Lexer.scan(`
13
+ let { tokens } = Lexer_1.Lexer.scan(`
13
14
  if true then
14
15
 
15
16
  else if true then
@@ -19,12 +20,12 @@ describe('parser if statements', () => {
19
20
  end if
20
21
  `);
21
22
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
22
- chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
23
- chai_1.expect(statements).to.be.length.greaterThan(0);
23
+ (0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
24
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
24
25
  });
25
26
  it('allows empty elseif blocks', () => {
26
27
  var _a;
27
- let { tokens } = lexer_1.Lexer.scan(`
28
+ let { tokens } = Lexer_1.Lexer.scan(`
28
29
  if true then
29
30
  stop
30
31
  else if true then
@@ -34,12 +35,12 @@ describe('parser if statements', () => {
34
35
  end if
35
36
  `);
36
37
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
37
- chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
38
- chai_1.expect(statements).to.be.length.greaterThan(0);
38
+ (0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
39
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
39
40
  });
40
41
  it('allows empty else blocks', () => {
41
42
  var _a;
42
- let { tokens } = lexer_1.Lexer.scan(`
43
+ let { tokens } = Lexer_1.Lexer.scan(`
43
44
  if true then
44
45
  stop
45
46
  else if true then
@@ -49,12 +50,12 @@ describe('parser if statements', () => {
49
50
  end if
50
51
  `);
51
52
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
52
- chai_1.expect((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
53
- chai_1.expect(statements).to.be.length.greaterThan(0);
53
+ (0, chai_1.expect)((_a = diagnostics[0]) === null || _a === void 0 ? void 0 : _a.message).not.to.exist;
54
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
54
55
  });
55
56
  it('single-line if next to else or endif', () => {
56
57
  var _a;
57
- let { tokens } = lexer_1.Lexer.scan(`
58
+ let { tokens } = Lexer_1.Lexer.scan(`
58
59
  if type(component.TextAttrs.font) = "roString"
59
60
  font = m.fonts.Lookup(component.TextAttrs.font)
60
61
  if font = invalid then font = m.fonts.medium
@@ -65,20 +66,20 @@ describe('parser if statements', () => {
65
66
  end if
66
67
  `);
67
68
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
68
- chai_1.expect(diagnostics).to.be.lengthOf(0);
69
- chai_1.expect(statements).to.be.length.greaterThan(0);
69
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
70
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
70
71
  let ifs = statements[0];
71
- if (!astUtils_1.isIfStatement(ifs) || !astUtils_1.isIfStatement((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[1])) {
72
+ if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[1])) {
72
73
  assert.fail('Missing single-line if inside if-then');
73
74
  }
74
- if (!astUtils_1.isIfStatement(ifs.elseBranch)) {
75
+ if (!(0, reflection_1.isIfStatement)(ifs.elseBranch)) {
75
76
  assert.fail('Missing chained else-if statement');
76
77
  }
77
- chai_1.expect(ifs.elseBranch.elseBranch).to.exist;
78
+ (0, chai_1.expect)(ifs.elseBranch.elseBranch).to.exist;
78
79
  });
79
80
  it('single-line if inside multi-line if', () => {
80
81
  var _a;
81
- let { tokens } = lexer_1.Lexer.scan(`
82
+ let { tokens } = Lexer_1.Lexer.scan(`
82
83
  if true
83
84
  if true then t = 1
84
85
  else
@@ -86,121 +87,121 @@ describe('parser if statements', () => {
86
87
  end if
87
88
  `);
88
89
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
89
- chai_1.expect(diagnostics).to.be.lengthOf(0);
90
- chai_1.expect(statements).to.be.length.greaterThan(0);
90
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
91
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
91
92
  let ifs = statements[0];
92
- if (!astUtils_1.isIfStatement(ifs) || !astUtils_1.isIfStatement((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[0])) {
93
+ if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)((_a = ifs.thenBranch) === null || _a === void 0 ? void 0 : _a.statements[0])) {
93
94
  assert.fail('Missing single-line if inside if-then');
94
95
  }
95
- chai_1.expect(ifs.elseBranch).to.exist;
96
- if (!astUtils_1.isBlock(ifs.elseBranch) || !astUtils_1.isCommentStatement(ifs.elseBranch.statements[0])) {
96
+ (0, chai_1.expect)(ifs.elseBranch).to.exist;
97
+ if (!(0, reflection_1.isBlock)(ifs.elseBranch) || !(0, reflection_1.isCommentStatement)(ifs.elseBranch.statements[0])) {
97
98
  assert.fail('Missing comment inside else branch');
98
99
  }
99
100
  });
100
101
  it('dotted set in else block', () => {
101
- let { tokens } = lexer_1.Lexer.scan(`
102
+ let { tokens } = Lexer_1.Lexer.scan(`
102
103
  if true then m.top.visible = true else m.top.visible = false
103
104
  `);
104
105
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
105
106
  if (diagnostics.length > 0) {
106
107
  console.log(diagnostics);
107
108
  }
108
- chai_1.expect(diagnostics).to.be.lengthOf(0);
109
- chai_1.expect(statements).to.be.length.greaterThan(0);
109
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
110
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
110
111
  });
111
112
  describe('single-line if', () => {
112
113
  it('parses if only', () => {
113
114
  let { statements, diagnostics } = Parser_1.Parser.parse([
114
- Parser_spec_1.token(lexer_1.TokenKind.If, 'if'),
115
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '1'),
116
- Parser_spec_1.token(lexer_1.TokenKind.Less, '<'),
117
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '2'),
118
- Parser_spec_1.token(lexer_1.TokenKind.Then, 'then'),
119
- Parser_spec_1.identifier('foo'),
120
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
121
- Parser_spec_1.token(lexer_1.TokenKind.True, 'true'),
122
- Parser_spec_1.token(lexer_1.TokenKind.Newline, '\n'),
115
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
116
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
117
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
118
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
119
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
120
+ (0, Parser_spec_1.identifier)('foo'),
121
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
122
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
123
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
123
124
  Parser_spec_1.EOF
124
125
  ]);
125
- chai_1.expect(diagnostics).to.be.lengthOf(0);
126
- chai_1.expect(statements).to.be.length.greaterThan(0);
126
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
127
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
127
128
  });
128
129
  it('parses if-else', () => {
129
130
  let { statements, diagnostics } = Parser_1.Parser.parse([
130
- Parser_spec_1.token(lexer_1.TokenKind.If, 'if'),
131
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '1'),
132
- Parser_spec_1.token(lexer_1.TokenKind.Less, '<'),
133
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '2'),
134
- Parser_spec_1.token(lexer_1.TokenKind.Then, 'then'),
135
- Parser_spec_1.identifier('foo'),
136
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
137
- Parser_spec_1.token(lexer_1.TokenKind.True, 'true'),
138
- Parser_spec_1.token(lexer_1.TokenKind.Else, 'else'),
139
- Parser_spec_1.identifier('foo'),
140
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
141
- Parser_spec_1.token(lexer_1.TokenKind.False, 'true'),
142
- Parser_spec_1.token(lexer_1.TokenKind.Newline, '\n'),
131
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
132
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
133
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
134
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
135
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
136
+ (0, Parser_spec_1.identifier)('foo'),
137
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
138
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
139
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
140
+ (0, Parser_spec_1.identifier)('foo'),
141
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
142
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.False, 'true'),
143
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
143
144
  Parser_spec_1.EOF
144
145
  ]);
145
- chai_1.expect(diagnostics).to.be.lengthOf(0);
146
- chai_1.expect(statements).to.be.length.greaterThan(0);
146
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
147
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
147
148
  });
148
149
  it('parses if-elseif-else', () => {
149
150
  let { statements, diagnostics } = Parser_1.Parser.parse([
150
- Parser_spec_1.token(lexer_1.TokenKind.If, 'if'),
151
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '1'),
152
- Parser_spec_1.token(lexer_1.TokenKind.Less, '<'),
153
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '2'),
154
- Parser_spec_1.token(lexer_1.TokenKind.Then, 'then'),
155
- Parser_spec_1.identifier('foo'),
156
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
157
- Parser_spec_1.token(lexer_1.TokenKind.True, 'true'),
158
- Parser_spec_1.token(lexer_1.TokenKind.Else, 'else'),
159
- Parser_spec_1.token(lexer_1.TokenKind.If, 'if'),
160
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '1'),
161
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
162
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '2'),
163
- Parser_spec_1.token(lexer_1.TokenKind.Then, 'then'),
164
- Parser_spec_1.identifier('same'),
165
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
166
- Parser_spec_1.token(lexer_1.TokenKind.True, 'true'),
167
- Parser_spec_1.token(lexer_1.TokenKind.Else, 'else'),
168
- Parser_spec_1.identifier('foo'),
169
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
170
- Parser_spec_1.token(lexer_1.TokenKind.True, 'true'),
171
- Parser_spec_1.token(lexer_1.TokenKind.Newline, '\n'),
151
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
152
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
153
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
154
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
155
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
156
+ (0, Parser_spec_1.identifier)('foo'),
157
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
158
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
159
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
160
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
161
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
162
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
163
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
164
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Then, 'then'),
165
+ (0, Parser_spec_1.identifier)('same'),
166
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
167
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
168
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
169
+ (0, Parser_spec_1.identifier)('foo'),
170
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
171
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
172
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
172
173
  Parser_spec_1.EOF
173
174
  ]);
174
- chai_1.expect(diagnostics).to.be.lengthOf(0);
175
- chai_1.expect(statements).to.be.length.greaterThan(0);
175
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
176
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
176
177
  });
177
178
  it('allows \'then\' to be skipped', () => {
178
179
  // if 1 < 2 foo = true else if 1 = 2 same = true
179
180
  let { statements, diagnostics } = Parser_1.Parser.parse([
180
- Parser_spec_1.token(lexer_1.TokenKind.If, 'if'),
181
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '1'),
182
- Parser_spec_1.token(lexer_1.TokenKind.Less, '<'),
183
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '2'),
184
- Parser_spec_1.identifier('foo'),
185
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
186
- Parser_spec_1.token(lexer_1.TokenKind.True, 'true'),
187
- Parser_spec_1.token(lexer_1.TokenKind.Else, 'else'),
188
- Parser_spec_1.token(lexer_1.TokenKind.If, 'if'),
189
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '1'),
190
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
191
- Parser_spec_1.token(lexer_1.TokenKind.IntegerLiteral, '2'),
192
- Parser_spec_1.identifier('same'),
193
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
194
- Parser_spec_1.token(lexer_1.TokenKind.True, 'true'),
195
- Parser_spec_1.token(lexer_1.TokenKind.Else, 'else'),
196
- Parser_spec_1.identifier('foo'),
197
- Parser_spec_1.token(lexer_1.TokenKind.Equal, '='),
198
- Parser_spec_1.token(lexer_1.TokenKind.False, 'false'),
199
- Parser_spec_1.token(lexer_1.TokenKind.Newline, '\n'),
181
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
182
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
183
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Less, '<'),
184
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
185
+ (0, Parser_spec_1.identifier)('foo'),
186
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
187
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
188
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
189
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.If, 'if'),
190
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '1'),
191
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
192
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.IntegerLiteral, '2'),
193
+ (0, Parser_spec_1.identifier)('same'),
194
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
195
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.True, 'true'),
196
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Else, 'else'),
197
+ (0, Parser_spec_1.identifier)('foo'),
198
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Equal, '='),
199
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.False, 'false'),
200
+ (0, Parser_spec_1.token)(TokenKind_1.TokenKind.Newline, '\n'),
200
201
  Parser_spec_1.EOF
201
202
  ]);
202
- chai_1.expect(diagnostics).to.be.lengthOf(0);
203
- chai_1.expect(statements).to.be.length.greaterThan(0);
203
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
204
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
204
205
  });
205
206
  it('parses special statements in inline block', () => {
206
207
  const { statements, diagnostics } = Parser_1.Parser.parse(`
@@ -212,26 +213,26 @@ describe('parser if statements', () => {
212
213
  if true return else print 1
213
214
  if true then return else print 1
214
215
  `);
215
- chai_1.expect(diagnostics).to.be.lengthOf(0);
216
- chai_1.expect(statements).to.be.length.greaterThan(0);
216
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
217
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
217
218
  });
218
219
  });
219
220
  describe('block if', () => {
220
221
  it('parses if only', () => {
221
222
  //because the parser depends on line numbers for certain if statements, this needs to be location-aware
222
- let { tokens } = lexer_1.Lexer.scan(`
223
+ let { tokens } = Lexer_1.Lexer.scan(`
223
224
  if 1 < 2 THEN
224
225
  foo = true
225
226
  bar = true
226
227
  end if
227
228
  `);
228
229
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
229
- chai_1.expect(diagnostics).to.be.lengthOf(0);
230
- chai_1.expect(statements).to.be.length.greaterThan(0);
230
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
231
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
231
232
  });
232
233
  it('parses if-else', () => {
233
234
  //this test requires token locations, so use the lexer
234
- let { tokens } = lexer_1.Lexer.scan(`
235
+ let { tokens } = Lexer_1.Lexer.scan(`
235
236
  if 1 < 2 then
236
237
  foo = true
237
238
  else
@@ -240,12 +241,12 @@ describe('parser if statements', () => {
240
241
  end if
241
242
  `);
242
243
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
243
- chai_1.expect(diagnostics).to.be.lengthOf(0);
244
- chai_1.expect(statements).to.be.length.greaterThan(0);
244
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
245
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
245
246
  });
246
247
  it('parses if-elseif-else', () => {
247
248
  //this test requires token locations, so use the lexer
248
- let { tokens } = lexer_1.Lexer.scan(`
249
+ let { tokens } = Lexer_1.Lexer.scan(`
249
250
  if 1 < 2 then
250
251
  foo = true
251
252
  else if 1 > 2 then
@@ -256,12 +257,12 @@ describe('parser if statements', () => {
256
257
  end if
257
258
  `);
258
259
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
259
- chai_1.expect(diagnostics).to.be.lengthOf(0);
260
- chai_1.expect(statements).to.be.length.greaterThan(0);
260
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
261
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
261
262
  });
262
263
  it('allows \'then\' to be skipped', () => {
263
264
  //this test requires token locations, so use the lexer
264
- let { tokens } = lexer_1.Lexer.scan(`
265
+ let { tokens } = Lexer_1.Lexer.scan(`
265
266
  if 1 < 2
266
267
  foo = true
267
268
  else if 1 > 2
@@ -272,12 +273,12 @@ describe('parser if statements', () => {
272
273
  end if
273
274
  `);
274
275
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
275
- chai_1.expect(diagnostics).to.be.lengthOf(0);
276
- chai_1.expect(statements).to.be.length.greaterThan(0);
276
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
277
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
277
278
  });
278
279
  it('sets endif token properly', () => {
279
280
  //this test requires token locations, so use the lexer
280
- let { tokens } = lexer_1.Lexer.scan(`
281
+ let { tokens } = Lexer_1.Lexer.scan(`
281
282
  sub a()
282
283
  if true then
283
284
  print false
@@ -289,19 +290,19 @@ describe('parser if statements', () => {
289
290
  end sub
290
291
  `);
291
292
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
292
- chai_1.expect(diagnostics).to.be.lengthOf(0);
293
- chai_1.expect(statements).to.be.length.greaterThan(0);
293
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
294
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
294
295
  //the endif token should be set
295
296
  let ifs = statements[0].func.body.statements[0];
296
- if (!astUtils_1.isIfStatement(ifs) || !astUtils_1.isIfStatement(ifs.elseBranch)) {
297
+ if (!(0, reflection_1.isIfStatement)(ifs) || !(0, reflection_1.isIfStatement)(ifs.elseBranch)) {
297
298
  assert.fail('Unexpected statement found');
298
299
  }
299
- chai_1.expect(ifs.tokens.endIf).to.not.exist;
300
- chai_1.expect(ifs.elseBranch.tokens.endIf).to.exist;
300
+ (0, chai_1.expect)(ifs.tokens.endIf).to.not.exist;
301
+ (0, chai_1.expect)(ifs.elseBranch.tokens.endIf).to.exist;
301
302
  });
302
303
  });
303
304
  it('supports trailing colons after conditional statements', () => {
304
- let { tokens } = lexer_1.Lexer.scan(`
305
+ let { tokens } = Lexer_1.Lexer.scan(`
305
306
  sub main()
306
307
  if 1 > 0:
307
308
  print "positive!"
@@ -313,125 +314,125 @@ describe('parser if statements', () => {
313
314
  end sub
314
315
  `);
315
316
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
316
- chai_1.expect(diagnostics).to.be.lengthOf(0);
317
- chai_1.expect(statements).to.be.length.greaterThan(0);
317
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
318
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
318
319
  });
319
320
  it('supports trailing colons for one-line if statements', () => {
320
- let { tokens } = lexer_1.Lexer.scan(`
321
+ let { tokens } = Lexer_1.Lexer.scan(`
321
322
  if 1 < 2: return true: end if
322
323
  `);
323
324
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
324
- chai_1.expect(diagnostics).to.be.lengthOf(0);
325
- chai_1.expect(statements).to.be.length.greaterThan(0);
325
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
326
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
326
327
  });
327
328
  it('catches one-line if statement missing first colon', () => {
328
329
  //missing colon after 2
329
- let { tokens } = lexer_1.Lexer.scan(`
330
+ let { tokens } = Lexer_1.Lexer.scan(`
330
331
  if 1 < 2 return true : end if
331
332
  `);
332
333
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
333
- chai_1.expect(diagnostics).to.be.length.greaterThan(0);
334
- chai_1.expect(statements).to.be.length.greaterThan(0);
334
+ (0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
335
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
335
336
  });
336
337
  it('catches one-line if statement with multiple statements missing first colon', () => {
337
338
  //missing colon after 2
338
- let { tokens } = lexer_1.Lexer.scan(`
339
+ let { tokens } = Lexer_1.Lexer.scan(`
339
340
  if 1 < 2 print "ok" : return true : end if
340
341
  `);
341
342
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
342
- chai_1.expect(diagnostics).to.be.length.greaterThan(0);
343
- chai_1.expect(statements).to.be.length.greaterThan(0);
343
+ (0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
344
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
344
345
  });
345
346
  it('catches one-line if statement missing second colon', () => {
346
347
  //missing colon after `2`
347
- let { tokens } = lexer_1.Lexer.scan(`
348
+ let { tokens } = Lexer_1.Lexer.scan(`
348
349
  if 1 < 2 : return true end if
349
350
  `);
350
351
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
351
- chai_1.expect(diagnostics).to.be.length.greaterThan(0);
352
- chai_1.expect(statements).to.be.length.greaterThan(0);
352
+ (0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
353
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
353
354
  });
354
355
  it('catches one-line if statement with else missing colons', () => {
355
356
  //missing colon after `2`
356
- let { tokens } = lexer_1.Lexer.scan(`
357
+ let { tokens } = Lexer_1.Lexer.scan(`
357
358
  if 1 < 2 : return true: else return false end if
358
359
  `);
359
360
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
360
- chai_1.expect(diagnostics).to.be.length.greaterThan(0);
361
- chai_1.expect(statements).to.be.length.greaterThan(0);
361
+ (0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
362
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
362
363
  });
363
364
  it('catches one-line if statement with colon and missing end if', () => {
364
365
  //missing colon after `2`
365
- let { tokens } = lexer_1.Lexer.scan(`
366
+ let { tokens } = Lexer_1.Lexer.scan(`
366
367
  if 1 < 2: return true
367
368
  `);
368
369
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
369
- chai_1.expect(diagnostics).to.be.length.greaterThan(0);
370
- chai_1.expect(statements).to.be.lengthOf(0);
370
+ (0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
371
+ (0, chai_1.expect)(statements).to.be.lengthOf(0);
371
372
  });
372
373
  it('catches one-line if multi-statement with colon and missing end if', () => {
373
374
  //missing colon after `2`
374
- let { tokens } = lexer_1.Lexer.scan(`
375
+ let { tokens } = Lexer_1.Lexer.scan(`
375
376
  if 1 < 2: print "ok": return true
376
377
  `);
377
378
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
378
- chai_1.expect(diagnostics).to.be.length.greaterThan(0);
379
- chai_1.expect(statements).to.be.lengthOf(0);
379
+ (0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
380
+ (0, chai_1.expect)(statements).to.be.lengthOf(0);
380
381
  });
381
382
  it('catches one-line if statement with colon and missing endif inside a function', () => {
382
383
  //missing 'end if'
383
- let { tokens } = lexer_1.Lexer.scan(`
384
+ let { tokens } = Lexer_1.Lexer.scan(`
384
385
  function missingendif()
385
386
  if true : return true
386
387
  end function
387
388
  `);
388
389
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
389
- chai_1.expect(diagnostics).to.be.lengthOf(2);
390
- chai_1.expect(statements).to.be.length.greaterThan(0);
390
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(2);
391
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
391
392
  });
392
393
  it('catches extraneous colon at the end of one-line if-else', () => {
393
394
  //colon at the end not allowed
394
- let { tokens } = lexer_1.Lexer.scan(`
395
+ let { tokens } = Lexer_1.Lexer.scan(`
395
396
  if 1 < 2 then return true else return false:
396
397
  `);
397
398
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
398
- chai_1.expect(diagnostics).to.be.lengthOf(1);
399
- chai_1.expect(statements).to.be.length.greaterThan(0);
399
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
400
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
400
401
  });
401
402
  it('catches colon before if, unless there is `then` before', () => {
402
403
  //colon before if isn't allowed
403
- let { tokens } = lexer_1.Lexer.scan(`
404
+ let { tokens } = Lexer_1.Lexer.scan(`
404
405
  if 1 < 2 then: if 2<3: return false: end if
405
406
  : if 1 < 2: return true: end if
406
407
  end if
407
408
  `);
408
409
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
409
- chai_1.expect(diagnostics).to.be.lengthOf(1);
410
- chai_1.expect(statements).to.be.length.greaterThan(0);
410
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
411
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
411
412
  });
412
413
  it('catches extraneous colon+end if at the end of one-line if-else', () => {
413
414
  //expected newline + unexpected endif
414
- let { tokens } = lexer_1.Lexer.scan(`
415
+ let { tokens } = Lexer_1.Lexer.scan(`
415
416
  if 1 < 2 then return true else return false: end if
416
417
  `);
417
418
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
418
- chai_1.expect(diagnostics).to.be.lengthOf(2);
419
- chai_1.expect(statements).to.be.length.greaterThan(0);
419
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(2);
420
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
420
421
  });
421
422
  it('recovers from extraneous endif at the end of one-line if-else', () => {
422
423
  //unexpected endif
423
- let { tokens } = lexer_1.Lexer.scan(`
424
+ let { tokens } = Lexer_1.Lexer.scan(`
424
425
  function test1()
425
426
  if 1 < 2: return true: else return false end if
426
427
  end function
427
428
  `);
428
429
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
429
- chai_1.expect(diagnostics).to.be.lengthOf(2);
430
- chai_1.expect(statements).to.be.length.greaterThan(0);
430
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(2);
431
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
431
432
  });
432
433
  it('recovers from missing end-if', () => {
433
434
  //unexpected endif
434
- let { tokens } = lexer_1.Lexer.scan(`
435
+ let { tokens } = Lexer_1.Lexer.scan(`
435
436
  function test1()
436
437
  if 1 < 2 then if 1 < 3
437
438
  return true
@@ -440,112 +441,130 @@ describe('parser if statements', () => {
440
441
  end function
441
442
  `);
442
443
  let { statements, diagnostics, references } = Parser_1.Parser.parse(tokens);
443
- chai_1.expect(diagnostics).to.be.length.greaterThan(0);
444
- chai_1.expect(statements).to.be.lengthOf(2);
445
- chai_1.expect(references.functionStatements).to.be.lengthOf(2);
444
+ (0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
445
+ (0, chai_1.expect)(statements).to.be.lengthOf(2);
446
+ (0, chai_1.expect)(references.functionStatements).to.be.lengthOf(2);
446
447
  });
447
448
  it('catches extraneous colon at the end of one-line if', () => {
448
449
  //colon at the end not allowed
449
- let { tokens } = lexer_1.Lexer.scan(`
450
+ let { tokens } = Lexer_1.Lexer.scan(`
450
451
  if 1 < 2 then return true:
451
452
  `);
452
453
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
453
- chai_1.expect(diagnostics).to.be.lengthOf(1);
454
- chai_1.expect(statements).to.be.length.greaterThan(0);
454
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
455
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
455
456
  });
456
457
  it('catches multi-line if inside a one-line if branch', () => {
457
458
  //second if should be inline
458
- let { tokens } = lexer_1.Lexer.scan(`
459
+ let { tokens } = Lexer_1.Lexer.scan(`
459
460
  if 1 < 2 then if 1 < 3
460
461
  return true
461
462
  end if
462
463
  `);
463
464
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
464
- chai_1.expect(diagnostics).to.be.lengthOf(1);
465
- chai_1.expect(statements).to.be.length.greaterThan(0);
465
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
466
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
466
467
  });
467
468
  it('supports multiple statements in one-line if statements', () => {
468
469
  //second if should be inline
469
- let { tokens } = lexer_1.Lexer.scan(`
470
+ let { tokens } = Lexer_1.Lexer.scan(`
470
471
  if 1 < 2 then ok = true : m.ok = true : print "ok" : ook() else if 1 < 3
471
472
  return true
472
473
  end if
473
474
  `);
474
475
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
475
- chai_1.expect(diagnostics).to.be.lengthOf(1);
476
- chai_1.expect(statements).to.be.length.greaterThan(0);
476
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
477
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
477
478
  });
478
479
  it('catches multi-line if inside a one-line if else branch', () => {
479
480
  //second if should be inline
480
- let { tokens } = lexer_1.Lexer.scan(`
481
+ let { tokens } = Lexer_1.Lexer.scan(`
481
482
  if 1 < 2 then return false else if 1 < 3
482
483
  return true
483
484
  end if
484
485
  `);
485
486
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
486
- chai_1.expect(diagnostics).to.be.lengthOf(1);
487
- chai_1.expect(statements).to.be.length.greaterThan(0);
487
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(1);
488
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
488
489
  });
489
490
  it('catches else statement missing colon', () => {
490
491
  //missing colon before `end if`
491
- let { tokens } = lexer_1.Lexer.scan(`
492
+ let { tokens } = Lexer_1.Lexer.scan(`
492
493
  if 1 < 2
493
494
  return true
494
495
  else return false end if
495
496
  `);
496
497
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
497
- chai_1.expect(diagnostics).to.be.length.greaterThan(0);
498
- chai_1.expect(statements).to.be.lengthOf(1);
498
+ (0, chai_1.expect)(diagnostics).to.be.length.greaterThan(0);
499
+ (0, chai_1.expect)(statements).to.be.lengthOf(1);
499
500
  });
500
501
  it('supports if statement with condition and action on one line, but end if on separate line', () => {
501
- let { tokens } = lexer_1.Lexer.scan(`
502
+ let { tokens } = Lexer_1.Lexer.scan(`
502
503
  if 1 < 2: return true
503
504
  end if
504
505
  `);
505
506
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
506
- chai_1.expect(diagnostics).to.be.lengthOf(0);
507
- chai_1.expect(statements).to.be.length.greaterThan(0);
507
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
508
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
508
509
  });
509
510
  it('supports colon after return in single-line if statement', () => {
510
- let { tokens } = lexer_1.Lexer.scan(`
511
+ let { tokens } = Lexer_1.Lexer.scan(`
511
512
  if false : print "true" : end if
512
513
  `);
513
514
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
514
- chai_1.expect(diagnostics).to.be.lengthOf(0);
515
- chai_1.expect(statements).to.be.length.greaterThan(0);
515
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
516
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
516
517
  });
517
518
  it('supports if elseif endif single line', () => {
518
- let { tokens } = lexer_1.Lexer.scan(`
519
+ let { tokens } = Lexer_1.Lexer.scan(`
519
520
  if true: print "8 worked": else if true: print "not run": else: print "not run": end if
520
521
  `);
521
522
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
522
- chai_1.expect(diagnostics).to.be.lengthOf(0);
523
- chai_1.expect(statements).to.be.length.greaterThan(0);
523
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
524
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
524
525
  });
525
526
  it('supports comment at the end of one-line if', () => {
526
- let { tokens } = lexer_1.Lexer.scan(`
527
+ let { tokens } = Lexer_1.Lexer.scan(`
527
528
  if 1 > 2 then return true 'OK
528
529
  `);
529
530
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
530
- chai_1.expect(diagnostics).to.be.lengthOf(0);
531
- chai_1.expect(statements).to.be.length.greaterThan(0);
531
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
532
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
532
533
  });
533
534
  it('supports colon at the beginning of a line', () => {
534
- let { tokens } = lexer_1.Lexer.scan(`
535
+ let { tokens } = Lexer_1.Lexer.scan(`
535
536
  if 1 < 2 then: if 1 < 4 then return false
536
537
  : end if
537
538
  `);
538
539
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
539
- chai_1.expect(diagnostics).to.be.lengthOf(0);
540
- chai_1.expect(statements).to.be.length.greaterThan(0);
540
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
541
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
541
542
  });
542
543
  it('supports one-line functions inside of one-line if statement', () => {
543
- let { tokens } = lexer_1.Lexer.scan(`
544
+ let { tokens } = Lexer_1.Lexer.scan(`
544
545
  if true then : test = sub() : print "yes" : end sub : end if
545
546
  `);
546
547
  let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
547
- chai_1.expect(diagnostics).to.be.lengthOf(0);
548
- chai_1.expect(statements).to.be.length.greaterThan(0);
548
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
549
+ (0, chai_1.expect)(statements).to.be.length.greaterThan(0);
550
+ });
551
+ it('single-line if block statements have correct range', () => {
552
+ let { tokens } = Lexer_1.Lexer.scan(`
553
+ if false then print "true"
554
+ if false then print "true": a = 10
555
+ if false then print "true" else print "false"
556
+ if false then print "true" else print "false": a = 20
557
+ `);
558
+ let { statements, diagnostics } = Parser_1.Parser.parse(tokens);
559
+ (0, chai_1.expect)(diagnostics).to.be.lengthOf(0);
560
+ const then1 = statements[0].thenBranch;
561
+ (0, chai_1.expect)((0, Parser_spec_1.rangeMatch)(then1.range, then1.statements)).to.be.true;
562
+ const then2 = statements[1].thenBranch;
563
+ (0, chai_1.expect)((0, Parser_spec_1.rangeMatch)(then2.range, then2.statements)).to.be.true;
564
+ const else1 = statements[2].elseBranch;
565
+ (0, chai_1.expect)((0, Parser_spec_1.rangeMatch)(else1.range, else1.statements)).to.be.true;
566
+ const else2 = statements[3].elseBranch;
567
+ (0, chai_1.expect)((0, Parser_spec_1.rangeMatch)(else2.range, else2.statements)).to.be.true;
549
568
  });
550
569
  });
551
570
  //# sourceMappingURL=If.spec.js.map