redscript-mc 2.0.0 → 2.1.1

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 (643) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +48 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +321 -0
  22. package/dist/src/__tests__/mc-syntax.test.js +1 -6
  23. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  24. package/dist/src/__tests__/mc-version.test.js +154 -0
  25. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  26. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  27. package/dist/src/__tests__/modules.test.d.ts +7 -0
  28. package/dist/src/__tests__/modules.test.js +333 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  30. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  31. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  32. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  33. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  34. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  35. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  36. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  37. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  38. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  39. package/dist/src/__tests__/option.test.d.ts +14 -0
  40. package/dist/src/__tests__/option.test.js +275 -0
  41. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  42. package/dist/src/__tests__/schedule.test.js +98 -0
  43. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  44. package/dist/src/__tests__/sourcemap.test.js +227 -0
  45. package/dist/src/__tests__/stdlib-include.test.js +86 -0
  46. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  47. package/dist/src/__tests__/tuple.test.js +202 -0
  48. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  49. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  50. package/dist/src/ast/types.d.ts +56 -2
  51. package/dist/src/cache/deps.d.ts +41 -0
  52. package/dist/src/cache/deps.js +158 -0
  53. package/dist/src/cache/incremental.d.ts +35 -0
  54. package/dist/src/cache/incremental.js +165 -0
  55. package/dist/src/cache/index.d.ts +37 -0
  56. package/dist/src/cache/index.js +152 -0
  57. package/dist/src/cli.js +83 -45
  58. package/dist/src/compile.d.ts +3 -2
  59. package/dist/src/compile.js +34 -11
  60. package/dist/src/diagnostics/index.d.ts +1 -1
  61. package/dist/src/diagnostics/index.js +8 -11
  62. package/dist/src/emit/compile.d.ts +31 -0
  63. package/dist/src/emit/compile.js +143 -0
  64. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  65. package/dist/{src2 → src}/emit/index.js +59 -8
  66. package/dist/src/emit/modules.d.ts +29 -0
  67. package/dist/src/emit/modules.js +492 -0
  68. package/dist/src/emit/sourcemap.d.ts +53 -0
  69. package/dist/src/emit/sourcemap.js +73 -0
  70. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  71. package/dist/{src2 → src}/hir/lower.js +22 -1
  72. package/dist/src/hir/monomorphize.d.ts +22 -0
  73. package/dist/src/hir/monomorphize.js +379 -0
  74. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  75. package/dist/src/index.d.ts +19 -2
  76. package/dist/src/index.js +36 -14
  77. package/dist/src/lexer/index.d.ts +1 -1
  78. package/dist/src/lexer/index.js +1 -0
  79. package/dist/src/lir/budget.d.ts +37 -0
  80. package/dist/src/lir/budget.js +280 -0
  81. package/dist/{src2 → src}/lir/lower.js +19 -0
  82. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  83. package/dist/src/lsp/main.d.ts +8 -0
  84. package/dist/src/lsp/main.js +11 -0
  85. package/dist/src/lsp/server.d.ts +11 -0
  86. package/dist/src/lsp/server.js +403 -0
  87. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  88. package/dist/{src2 → src}/mir/lower.js +244 -10
  89. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  90. package/dist/src/optimizer/coroutine.d.ts +34 -0
  91. package/dist/src/optimizer/coroutine.js +789 -0
  92. package/dist/src/optimizer/dce.d.ts +8 -34
  93. package/dist/src/optimizer/dce.js +146 -629
  94. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  95. package/dist/src/optimizer/interprocedural.js +186 -0
  96. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  97. package/dist/src/optimizer/lir/const_imm.js +139 -0
  98. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  99. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  100. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  101. package/dist/src/optimizer/lir/peephole.js +52 -0
  102. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  103. package/dist/src/optimizer/lir/pipeline.js +34 -0
  104. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  105. package/dist/src/optimizer/nbt-batch.js +51 -0
  106. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  107. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  108. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  109. package/dist/src/optimizer/selector-cache.js +100 -0
  110. package/dist/src/optimizer/unroll.d.ts +32 -0
  111. package/dist/src/optimizer/unroll.js +348 -0
  112. package/dist/src/parser/index.d.ts +8 -0
  113. package/dist/src/parser/index.js +204 -14
  114. package/dist/src/repl.d.ts +1 -1
  115. package/dist/src/typechecker/index.d.ts +4 -0
  116. package/dist/src/typechecker/index.js +198 -13
  117. package/dist/src/types/mc-version.d.ts +24 -0
  118. package/dist/src/types/mc-version.js +49 -0
  119. package/docs/ROADMAP.md +395 -0
  120. package/docs/compiler-pipeline-redesign.md +27 -10
  121. package/editors/vscode/out/extension.js +25176 -8000
  122. package/editors/vscode/package-lock.json +90 -6
  123. package/editors/vscode/package.json +3 -2
  124. package/editors/vscode/src/extension.ts +97 -67
  125. package/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
  126. package/examples/coroutine-demo.mcrs +50 -0
  127. package/examples/enum-demo.mcrs +95 -0
  128. package/examples/scheduler-demo.mcrs +59 -0
  129. package/examples/showcase.mcrs +3 -3
  130. package/jest.config.js +1 -1
  131. package/package.json +9 -3
  132. package/src/__tests__/budget.test.ts +297 -0
  133. package/src/__tests__/diagnostics.test.ts +2 -3
  134. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  135. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  136. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  137. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  138. package/src/__tests__/enum.test.ts +425 -0
  139. package/src/__tests__/generics.test.ts +390 -0
  140. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  141. package/src/__tests__/incremental.test.ts +337 -0
  142. package/src/__tests__/lsp.test.ts +359 -0
  143. package/src/__tests__/mc-syntax.test.ts +1 -7
  144. package/src/__tests__/mc-version.test.ts +178 -0
  145. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  146. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  147. package/src/__tests__/modules.test.ts +365 -0
  148. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  149. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  150. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  151. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  152. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  153. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  154. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  155. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  156. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  157. package/src/__tests__/option.test.ts +299 -0
  158. package/src/__tests__/schedule.test.ts +105 -0
  159. package/src/__tests__/sourcemap.test.ts +254 -0
  160. package/src/__tests__/stdlib-include.test.ts +61 -0
  161. package/src/__tests__/tuple.test.ts +220 -0
  162. package/src/__tests__/typechecker-strict.test.ts +216 -0
  163. package/src/ast/types.ts +33 -2
  164. package/src/cache/deps.ts +132 -0
  165. package/src/cache/incremental.ts +173 -0
  166. package/src/cache/index.ts +135 -0
  167. package/src/cli.ts +96 -45
  168. package/src/compile.ts +46 -17
  169. package/src/diagnostics/index.ts +8 -11
  170. package/src/emit/compile.ts +179 -0
  171. package/{src2 → src}/emit/index.ts +72 -8
  172. package/src/emit/modules.ts +581 -0
  173. package/src/emit/sourcemap.ts +101 -0
  174. package/{src2 → src}/hir/lower.ts +29 -2
  175. package/src/hir/monomorphize.ts +416 -0
  176. package/{src2 → src}/hir/types.ts +15 -3
  177. package/src/index.ts +29 -10
  178. package/src/lexer/index.ts +2 -1
  179. package/src/lir/budget.ts +321 -0
  180. package/{src2 → src}/lir/lower.ts +32 -1
  181. package/{src2 → src}/lir/types.ts +7 -3
  182. package/src/lsp/main.ts +9 -0
  183. package/src/lsp/server.ts +469 -0
  184. package/{src2 → src}/mir/lower.ts +251 -8
  185. package/{src2 → src}/mir/types.ts +12 -1
  186. package/src/optimizer/coroutine.ts +996 -0
  187. package/{src2 → src}/optimizer/dce.ts +2 -1
  188. package/src/optimizer/interprocedural.ts +177 -0
  189. package/src/optimizer/lir/const_imm.ts +143 -0
  190. package/src/optimizer/lir/dead_slot.ts +123 -0
  191. package/src/optimizer/lir/peephole.ts +57 -0
  192. package/src/optimizer/lir/pipeline.ts +37 -0
  193. package/src/optimizer/nbt-batch.ts +50 -0
  194. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  195. package/src/optimizer/selector-cache.ts +103 -0
  196. package/src/optimizer/unroll.ts +386 -0
  197. package/src/parser/index.ts +212 -15
  198. package/src/repl.ts +1 -1
  199. package/src/stdlib/math.mcrs +4 -4
  200. package/src/templates/quest.mcrs +4 -4
  201. package/src/typechecker/index.ts +215 -15
  202. package/src/types/mc-version.ts +46 -0
  203. package/tsconfig.json +1 -1
  204. package/.claude/commands/build-test.md +0 -10
  205. package/.claude/commands/deploy-demo.md +0 -12
  206. package/.claude/commands/stage-status.md +0 -13
  207. package/.claude/settings.json +0 -12
  208. package/CLAUDE.md +0 -231
  209. package/dist/__tests__/cli.test.js +0 -278
  210. package/dist/__tests__/codegen.test.js +0 -152
  211. package/dist/__tests__/compile-all.test.d.ts +0 -10
  212. package/dist/__tests__/compile-all.test.js +0 -108
  213. package/dist/__tests__/dce.test.js +0 -138
  214. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  215. package/dist/__tests__/diagnostics.test.js +0 -149
  216. package/dist/__tests__/e2e.test.d.ts +0 -6
  217. package/dist/__tests__/e2e.test.js +0 -1847
  218. package/dist/__tests__/entity-types.test.js +0 -203
  219. package/dist/__tests__/formatter.test.js +0 -40
  220. package/dist/__tests__/lexer.test.js +0 -343
  221. package/dist/__tests__/lowering.test.js +0 -1015
  222. package/dist/__tests__/macro.test.d.ts +0 -8
  223. package/dist/__tests__/macro.test.js +0 -305
  224. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  225. package/dist/__tests__/mc-integration.test.js +0 -819
  226. package/dist/__tests__/mc-syntax.test.js +0 -124
  227. package/dist/__tests__/nbt.test.js +0 -82
  228. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  229. package/dist/__tests__/optimizer.test.js +0 -149
  230. package/dist/__tests__/parser.test.d.ts +0 -1
  231. package/dist/__tests__/parser.test.js +0 -807
  232. package/dist/__tests__/repl.test.d.ts +0 -1
  233. package/dist/__tests__/repl.test.js +0 -27
  234. package/dist/__tests__/runtime.test.d.ts +0 -1
  235. package/dist/__tests__/runtime.test.js +0 -289
  236. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  237. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  238. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  239. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  240. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  241. package/dist/__tests__/stdlib-math.test.js +0 -352
  242. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  243. package/dist/__tests__/stdlib-vec.test.js +0 -264
  244. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  245. package/dist/__tests__/structure-optimizer.test.js +0 -33
  246. package/dist/__tests__/typechecker.test.d.ts +0 -1
  247. package/dist/__tests__/typechecker.test.js +0 -552
  248. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  249. package/dist/__tests__/var-allocator.test.js +0 -69
  250. package/dist/ast/types.d.ts +0 -514
  251. package/dist/ast/types.js +0 -9
  252. package/dist/builtins/metadata.d.ts +0 -36
  253. package/dist/builtins/metadata.js +0 -1014
  254. package/dist/cli.d.ts +0 -11
  255. package/dist/codegen/cmdblock/index.d.ts +0 -26
  256. package/dist/codegen/cmdblock/index.js +0 -45
  257. package/dist/codegen/mcfunction/index.d.ts +0 -40
  258. package/dist/codegen/mcfunction/index.js +0 -606
  259. package/dist/codegen/structure/index.d.ts +0 -24
  260. package/dist/codegen/structure/index.js +0 -279
  261. package/dist/codegen/var-allocator.d.ts +0 -45
  262. package/dist/codegen/var-allocator.js +0 -104
  263. package/dist/compile.d.ts +0 -68
  264. package/dist/data/arena/function/__load.mcfunction +0 -6
  265. package/dist/data/arena/function/__tick.mcfunction +0 -2
  266. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  267. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  268. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  269. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  270. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  271. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  272. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  273. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  274. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  275. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  276. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  277. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  278. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  279. package/dist/data/counter/function/__load.mcfunction +0 -5
  280. package/dist/data/counter/function/__tick.mcfunction +0 -2
  281. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  282. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  283. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  284. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  285. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  286. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  287. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  288. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  289. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  290. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  291. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  292. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  293. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  294. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  295. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  296. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  297. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  298. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  299. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  300. package/dist/data/gcd3/function/test.mcfunction +0 -7
  301. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  302. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  303. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  304. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  305. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  306. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  307. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  308. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  309. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  310. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  311. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  312. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  313. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  314. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  315. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  316. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  317. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  318. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  319. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  320. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  321. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  322. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  323. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  324. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  325. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  326. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  327. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  328. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  329. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  330. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  331. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  332. package/dist/data/mathtest/function/test.mcfunction +0 -5
  333. package/dist/data/minecraft/tags/function/load.json +0 -5
  334. package/dist/data/minecraft/tags/function/tick.json +0 -5
  335. package/dist/data/mypack/function/__load.mcfunction +0 -13
  336. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  337. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  338. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  339. package/dist/data/mypack/function/abs.mcfunction +0 -6
  340. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  341. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  342. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  343. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  346. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  347. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  348. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  352. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  353. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  354. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  357. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  358. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  359. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  360. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  361. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  365. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  366. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  367. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  368. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  369. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  370. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  371. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  372. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  373. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  374. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  375. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  376. package/dist/data/quiz/function/__load.mcfunction +0 -16
  377. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  378. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  379. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  380. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  381. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  382. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  383. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  384. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  386. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  387. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  388. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  389. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  390. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  391. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  392. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  393. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  394. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  395. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  396. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  397. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  398. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  399. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  400. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  402. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  403. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  404. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  405. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  406. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  407. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  408. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  409. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  410. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  411. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  412. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  413. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  414. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  415. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  416. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  417. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  418. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  419. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  420. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  421. package/dist/data/runtime/function/__load.mcfunction +0 -5
  422. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  423. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  424. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  425. package/dist/data/shop/function/__load.mcfunction +0 -7
  426. package/dist/data/shop/function/__tick.mcfunction +0 -3
  427. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  429. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  430. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  431. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  432. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  433. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  434. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  435. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  436. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  437. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  438. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  439. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  440. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  441. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  442. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  443. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  444. package/dist/data/turret/function/__load.mcfunction +0 -5
  445. package/dist/data/turret/function/__tick.mcfunction +0 -4
  446. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  447. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  448. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  449. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  450. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  451. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  452. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  453. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  454. package/dist/diagnostics/index.d.ts +0 -44
  455. package/dist/diagnostics/index.js +0 -140
  456. package/dist/events/types.d.ts +0 -35
  457. package/dist/events/types.js +0 -59
  458. package/dist/formatter/index.d.ts +0 -1
  459. package/dist/formatter/index.js +0 -26
  460. package/dist/gcd2.map.json +0 -15
  461. package/dist/gcd3.map.json +0 -17
  462. package/dist/gcd_test.map.json +0 -15
  463. package/dist/index.d.ts +0 -62
  464. package/dist/ir/builder.d.ts +0 -33
  465. package/dist/ir/builder.js +0 -99
  466. package/dist/ir/types.d.ts +0 -132
  467. package/dist/ir/types.js +0 -15
  468. package/dist/isqrttest.map.json +0 -15
  469. package/dist/lexer/index.d.ts +0 -37
  470. package/dist/lexer/index.js +0 -569
  471. package/dist/lowering/index.d.ts +0 -188
  472. package/dist/lowering/index.js +0 -3405
  473. package/dist/mathtest.map.json +0 -6
  474. package/dist/mc-test/client.d.ts +0 -128
  475. package/dist/mc-test/client.js +0 -174
  476. package/dist/mc-test/runner.d.ts +0 -28
  477. package/dist/mc-test/runner.js +0 -150
  478. package/dist/mc-test/setup.d.ts +0 -11
  479. package/dist/mc-test/setup.js +0 -98
  480. package/dist/mc-validator/index.d.ts +0 -17
  481. package/dist/mc-validator/index.js +0 -322
  482. package/dist/mypack.map.json +0 -27
  483. package/dist/nbt/index.d.ts +0 -86
  484. package/dist/nbt/index.js +0 -250
  485. package/dist/optimizer/commands.d.ts +0 -38
  486. package/dist/optimizer/commands.js +0 -451
  487. package/dist/optimizer/dce.d.ts +0 -34
  488. package/dist/optimizer/dce.js +0 -639
  489. package/dist/optimizer/passes.d.ts +0 -34
  490. package/dist/optimizer/passes.js +0 -243
  491. package/dist/optimizer/structure.d.ts +0 -9
  492. package/dist/optimizer/structure.js +0 -356
  493. package/dist/pack.mcmeta +0 -6
  494. package/dist/parser/index.d.ts +0 -93
  495. package/dist/parser/index.js +0 -1687
  496. package/dist/repl.d.ts +0 -16
  497. package/dist/repl.js +0 -165
  498. package/dist/reqtest.map.json +0 -4
  499. package/dist/reqtest2.map.json +0 -4
  500. package/dist/runtime/index.d.ts +0 -107
  501. package/dist/runtime/index.js +0 -1409
  502. package/dist/runtime.map.json +0 -7
  503. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  504. package/dist/src/__tests__/codegen.test.js +0 -152
  505. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  506. package/dist/src/__tests__/e2e.test.js +0 -1789
  507. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  508. package/dist/src/__tests__/entity-types.test.js +0 -203
  509. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  510. package/dist/src/__tests__/lowering.test.js +0 -1015
  511. package/dist/src/__tests__/macro.test.d.ts +0 -8
  512. package/dist/src/__tests__/macro.test.js +0 -306
  513. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  514. package/dist/src/__tests__/nbt.test.js +0 -82
  515. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  516. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  517. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  518. package/dist/src/__tests__/optimizer.test.js +0 -149
  519. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  520. package/dist/src/__tests__/runtime.test.js +0 -289
  521. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  522. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  523. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  524. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  525. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  526. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  527. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  528. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  529. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  530. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  531. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  532. package/dist/src/__tests__/var-allocator.test.js +0 -69
  533. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  534. package/dist/src/codegen/cmdblock/index.js +0 -45
  535. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  536. package/dist/src/codegen/mcfunction/index.js +0 -606
  537. package/dist/src/codegen/structure/index.d.ts +0 -24
  538. package/dist/src/codegen/structure/index.js +0 -279
  539. package/dist/src/codegen/var-allocator.d.ts +0 -45
  540. package/dist/src/codegen/var-allocator.js +0 -104
  541. package/dist/src/ir/builder.d.ts +0 -33
  542. package/dist/src/ir/builder.js +0 -99
  543. package/dist/src/ir/types.d.ts +0 -132
  544. package/dist/src/ir/types.js +0 -15
  545. package/dist/src/lowering/index.d.ts +0 -188
  546. package/dist/src/lowering/index.js +0 -3405
  547. package/dist/src/optimizer/commands.d.ts +0 -38
  548. package/dist/src/optimizer/commands.js +0 -451
  549. package/dist/src/optimizer/passes.d.ts +0 -34
  550. package/dist/src/optimizer/passes.js +0 -243
  551. package/dist/src/optimizer/structure.d.ts +0 -9
  552. package/dist/src/optimizer/structure.js +0 -356
  553. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  554. package/dist/src2/emit/compile.d.ts +0 -19
  555. package/dist/src2/emit/compile.js +0 -80
  556. package/dist/src2/optimizer/dce.d.ts +0 -8
  557. package/dist/src2/optimizer/dce.js +0 -155
  558. package/dist/swap_test.map.json +0 -14
  559. package/dist/tsconfig.tsbuildinfo +0 -1
  560. package/dist/typechecker/index.d.ts +0 -61
  561. package/dist/typechecker/index.js +0 -1034
  562. package/dist/types/entity-hierarchy.d.ts +0 -29
  563. package/dist/types/entity-hierarchy.js +0 -107
  564. package/examples/spiral.mcrs +0 -43
  565. package/src/examples/arena.mcrs +0 -44
  566. package/src/examples/counter.mcrs +0 -12
  567. package/src/examples/new_features_demo.mcrs +0 -193
  568. package/src/examples/rpg.mcrs +0 -13
  569. package/src/examples/stdlib_demo.mcrs +0 -181
  570. package/src2/emit/compile.ts +0 -99
  571. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  572. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  576. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  578. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  579. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  580. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  581. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  582. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  583. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  584. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  585. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  586. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  587. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  588. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  589. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  590. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  592. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  593. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  594. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  595. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  596. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  597. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  598. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  599. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  600. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  601. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  602. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  603. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  604. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  605. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  606. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  607. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
  608. /package/dist/{src2 → src}/hir/types.js +0 -0
  609. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  610. /package/dist/{src2 → src}/lir/types.js +0 -0
  611. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  612. /package/dist/{src2 → src}/lir/verify.js +0 -0
  613. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  614. /package/dist/{src2 → src}/mir/macro.js +0 -0
  615. /package/dist/{src2 → src}/mir/types.js +0 -0
  616. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  617. /package/dist/{src2 → src}/mir/verify.js +0 -0
  618. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  619. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  620. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  621. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  622. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  623. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  624. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  625. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  626. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  627. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  628. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  629. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  630. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  631. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  632. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  633. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  634. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  635. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  636. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  637. /package/{src2 → src}/lir/verify.ts +0 -0
  638. /package/{src2 → src}/mir/macro.ts +0 -0
  639. /package/{src2 → src}/mir/verify.ts +0 -0
  640. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  641. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  642. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  643. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -1,807 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const lexer_1 = require("../lexer");
4
- const parser_1 = require("../parser");
5
- function parse(source, namespace = 'test') {
6
- const tokens = new lexer_1.Lexer(source).tokenize();
7
- return new parser_1.Parser(tokens).parse(namespace);
8
- }
9
- function parseExpr(source) {
10
- const program = parse(`fn _test() { ${source}; }`);
11
- const stmt = program.declarations[0].body[0];
12
- if (stmt.kind !== 'expr')
13
- throw new Error('Expected expr stmt');
14
- return stmt.expr;
15
- }
16
- function parseStmt(source) {
17
- const program = parse(`fn _test() { ${source} }`);
18
- return program.declarations[0].body[0];
19
- }
20
- describe('Parser', () => {
21
- describe('program structure', () => {
22
- it('parses empty program', () => {
23
- const program = parse('');
24
- expect(program.namespace).toBe('test');
25
- expect(program.declarations).toEqual([]);
26
- expect(program.implBlocks).toEqual([]);
27
- expect(program.enums).toEqual([]);
28
- expect(program.consts).toEqual([]);
29
- });
30
- it('parses namespace declaration', () => {
31
- const program = parse('namespace mypack;', 'default');
32
- expect(program.namespace).toBe('mypack');
33
- });
34
- it('parses function declaration', () => {
35
- const program = parse('fn foo() {}');
36
- expect(program.declarations).toHaveLength(1);
37
- expect(program.declarations[0].name).toBe('foo');
38
- });
39
- it('parses top-level const declarations', () => {
40
- const program = parse('const MAX_HP: int = 100\nconst NAME: string = "Arena"');
41
- expect(program.consts).toEqual([
42
- { name: 'MAX_HP', type: { kind: 'named', name: 'int' }, value: { kind: 'int_lit', value: 100 } },
43
- { name: 'NAME', type: { kind: 'named', name: 'string' }, value: { kind: 'str_lit', value: 'Arena' } },
44
- ]);
45
- });
46
- });
47
- describe('function declarations', () => {
48
- it('parses function with no params', () => {
49
- const program = parse('fn hello() {}');
50
- const fn = program.declarations[0];
51
- expect(fn.name).toBe('hello');
52
- expect(fn.params).toEqual([]);
53
- expect(fn.returnType).toEqual({ kind: 'named', name: 'void' });
54
- });
55
- it('parses function with params', () => {
56
- const program = parse('fn add(a: int, b: int) -> int { return a + b; }');
57
- const fn = program.declarations[0];
58
- expect(fn.name).toBe('add');
59
- expect(fn.params).toEqual([
60
- { name: 'a', type: { kind: 'named', name: 'int' }, default: undefined },
61
- { name: 'b', type: { kind: 'named', name: 'int' }, default: undefined },
62
- ]);
63
- expect(fn.returnType).toEqual({ kind: 'named', name: 'int' });
64
- });
65
- it('parses function params with defaults', () => {
66
- const program = parse('fn greet(name: string, formal: bool = false) {}');
67
- expect(program.declarations[0].params).toEqual([
68
- { name: 'name', type: { kind: 'named', name: 'string' }, default: undefined },
69
- { name: 'formal', type: { kind: 'named', name: 'bool' }, default: { kind: 'bool_lit', value: false } },
70
- ]);
71
- });
72
- it('parses function with decorators', () => {
73
- const program = parse('@tick\nfn game_loop() {}');
74
- const fn = program.declarations[0];
75
- expect(fn.decorators).toEqual([{ name: 'tick' }]);
76
- });
77
- it('parses decorator with args', () => {
78
- const program = parse('@tick(rate=20)\nfn slow_loop() {}');
79
- const fn = program.declarations[0];
80
- expect(fn.decorators).toEqual([{ name: 'tick', args: { rate: 20 } }]);
81
- });
82
- it('parses multiple decorators', () => {
83
- const program = parse('@tick\n@on_trigger\nfn both() {}');
84
- const fn = program.declarations[0];
85
- expect(fn.decorators).toHaveLength(2);
86
- });
87
- it('parses advancement and death decorators', () => {
88
- const program = parse('@on_advancement("story/mine_diamond")\n@on_death\nfn handler() {}');
89
- expect(program.declarations[0].decorators).toEqual([
90
- { name: 'on_advancement', args: { advancement: 'story/mine_diamond' } },
91
- { name: 'on_death' },
92
- ]);
93
- });
94
- it('parses @on event decorators', () => {
95
- const program = parse('@on(PlayerDeath)\nfn handle_death(player: Player) {}');
96
- expect(program.declarations[0].decorators).toEqual([
97
- { name: 'on', args: { eventType: 'PlayerDeath' } },
98
- ]);
99
- });
100
- });
101
- describe('types', () => {
102
- it('parses primitive types', () => {
103
- const program = parse('fn f(a: int, b: bool, c: float, d: string) {}');
104
- const params = program.declarations[0].params;
105
- expect(params.map(p => p.type)).toEqual([
106
- { kind: 'named', name: 'int' },
107
- { kind: 'named', name: 'bool' },
108
- { kind: 'named', name: 'float' },
109
- { kind: 'named', name: 'string' },
110
- ]);
111
- });
112
- it('parses array types', () => {
113
- const program = parse('fn f(a: int[]) {}');
114
- const param = program.declarations[0].params[0];
115
- expect(param.type).toEqual({ kind: 'array', elem: { kind: 'named', name: 'int' } });
116
- });
117
- it('parses BlockPos types', () => {
118
- const program = parse('fn f(pos: BlockPos) {}');
119
- const param = program.declarations[0].params[0];
120
- expect(param.type).toEqual({ kind: 'named', name: 'BlockPos' });
121
- });
122
- it('parses function types', () => {
123
- const program = parse('fn apply(val: int, cb: (int) -> int) -> int { return cb(val); }');
124
- expect(program.declarations[0].params[1].type).toEqual({
125
- kind: 'function_type',
126
- params: [{ kind: 'named', name: 'int' }],
127
- return: { kind: 'named', name: 'int' },
128
- });
129
- });
130
- it('parses enum declarations', () => {
131
- const program = parse('enum Direction { North, South = 3, East, West }');
132
- expect(program.enums).toEqual([
133
- {
134
- name: 'Direction',
135
- variants: [
136
- { name: 'North', value: 0 },
137
- { name: 'South', value: 3 },
138
- { name: 'East', value: 4 },
139
- { name: 'West', value: 5 },
140
- ],
141
- },
142
- ]);
143
- });
144
- it('parses impl blocks', () => {
145
- const program = parse(`
146
- struct Timer { duration: int }
147
-
148
- impl Timer {
149
- fn new(duration: int): Timer {
150
- return { duration: duration };
151
- }
152
-
153
- fn start(self) {}
154
- }
155
- `);
156
- expect(program.implBlocks).toHaveLength(1);
157
- expect(program.implBlocks[0].typeName).toBe('Timer');
158
- expect(program.implBlocks[0].methods.map(method => method.name)).toEqual(['new', 'start']);
159
- expect(program.implBlocks[0].methods[1].params[0]).toEqual({
160
- name: 'self',
161
- type: { kind: 'struct', name: 'Timer' },
162
- default: undefined,
163
- });
164
- });
165
- it('parses impl blocks with static and instance methods', () => {
166
- const program = parse(`
167
- struct Point { x: int, y: int }
168
-
169
- impl Point {
170
- fn new(x: int, y: int) -> Point {
171
- return { x: x, y: y };
172
- }
173
-
174
- fn distance(self) -> int {
175
- return self.x + self.y;
176
- }
177
- }
178
- `);
179
- expect(program.implBlocks).toHaveLength(1);
180
- expect(program.implBlocks[0].typeName).toBe('Point');
181
- expect(program.implBlocks[0].methods[0].params.map(param => param.name)).toEqual(['x', 'y']);
182
- expect(program.implBlocks[0].methods[1].params[0]).toEqual({
183
- name: 'self',
184
- type: { kind: 'struct', name: 'Point' },
185
- default: undefined,
186
- });
187
- });
188
- });
189
- describe('statements', () => {
190
- it('parses let statement', () => {
191
- const stmt = parseStmt('let x: int = 5;');
192
- expect(stmt).toEqual({
193
- kind: 'let',
194
- name: 'x',
195
- type: { kind: 'named', name: 'int' },
196
- init: { kind: 'int_lit', value: 5 },
197
- });
198
- });
199
- it('parses let without type annotation', () => {
200
- const stmt = parseStmt('let x = 5;');
201
- expect(stmt.kind).toBe('let');
202
- expect(stmt.type).toBeUndefined();
203
- });
204
- it('parses return statement', () => {
205
- const stmt = parseStmt('return 42;');
206
- expect(stmt).toEqual({
207
- kind: 'return',
208
- value: { kind: 'int_lit', value: 42 },
209
- });
210
- });
211
- it('parses empty return', () => {
212
- const stmt = parseStmt('return;');
213
- expect(stmt).toEqual({ kind: 'return', value: undefined });
214
- });
215
- it('parses if statement', () => {
216
- const stmt = parseStmt('if (x > 0) { y = 1; }');
217
- expect(stmt.kind).toBe('if');
218
- expect(stmt.cond.kind).toBe('binary');
219
- expect(stmt.then).toHaveLength(1);
220
- expect(stmt.else_).toBeUndefined();
221
- });
222
- it('parses if-else statement', () => {
223
- const stmt = parseStmt('if (x > 0) { y = 1; } else { y = 2; }');
224
- expect(stmt.kind).toBe('if');
225
- expect(stmt.else_).toHaveLength(1);
226
- });
227
- it('parses entity is-checks in if conditions', () => {
228
- const stmt = parseStmt('if (e is Player) { kill(@s); }');
229
- expect(stmt.kind).toBe('if');
230
- expect(stmt.cond).toEqual({
231
- kind: 'is_check',
232
- expr: { kind: 'ident', name: 'e' },
233
- entityType: 'Player',
234
- });
235
- });
236
- it('parses entity is-checks inside foreach bodies', () => {
237
- const stmt = parseStmt('foreach (e in @e) { if (e is Zombie) { kill(e); } }');
238
- expect(stmt.kind).toBe('foreach');
239
- const innerIf = stmt.body[0];
240
- expect(innerIf.kind).toBe('if');
241
- expect(innerIf.cond).toEqual({
242
- kind: 'is_check',
243
- expr: { kind: 'ident', name: 'e' },
244
- entityType: 'Zombie',
245
- });
246
- });
247
- it('parses while statement', () => {
248
- const stmt = parseStmt('while (i > 0) { i = i - 1; }');
249
- expect(stmt.kind).toBe('while');
250
- expect(stmt.cond.kind).toBe('binary');
251
- expect(stmt.body).toHaveLength(1);
252
- });
253
- it('parses for statement', () => {
254
- const stmt = parseStmt('for (let i: int = 0; i < 10; i = i + 1) { say("loop"); }');
255
- expect(stmt.kind).toBe('for');
256
- expect(stmt.init.kind).toBe('let');
257
- expect(stmt.init.name).toBe('i');
258
- expect(stmt.cond.kind).toBe('binary');
259
- expect(stmt.cond.op).toBe('<');
260
- expect(stmt.step.kind).toBe('assign');
261
- expect(stmt.body).toHaveLength(1);
262
- });
263
- it('parses for statement without init', () => {
264
- const stmt = parseStmt('for (; i < 10; i = i + 1) { say("loop"); }');
265
- expect(stmt.kind).toBe('for');
266
- expect(stmt.init).toBeUndefined();
267
- expect(stmt.cond.kind).toBe('binary');
268
- });
269
- it('parses foreach statement', () => {
270
- const stmt = parseStmt('foreach (z in @e[type=zombie]) { kill(z); }');
271
- expect(stmt.kind).toBe('foreach');
272
- expect(stmt.binding).toBe('z');
273
- expect(stmt.iterable.kind).toBe('selector');
274
- expect(stmt.iterable.sel.kind).toBe('@e');
275
- });
276
- it('parses match statement', () => {
277
- const stmt = parseStmt('match (choice) { 1 => { say("one"); } 2 => { say("two"); } _ => { say("other"); } }');
278
- expect(stmt.kind).toBe('match');
279
- expect(stmt.expr).toEqual({ kind: 'ident', name: 'choice' });
280
- expect(stmt.arms).toEqual([
281
- { pattern: { kind: 'int_lit', value: 1 }, body: [{ kind: 'expr', expr: { kind: 'call', fn: 'say', args: [{ kind: 'str_lit', value: 'one' }] } }] },
282
- { pattern: { kind: 'int_lit', value: 2 }, body: [{ kind: 'expr', expr: { kind: 'call', fn: 'say', args: [{ kind: 'str_lit', value: 'two' }] } }] },
283
- { pattern: null, body: [{ kind: 'expr', expr: { kind: 'call', fn: 'say', args: [{ kind: 'str_lit', value: 'other' }] } }] },
284
- ]);
285
- });
286
- it('parses as block', () => {
287
- const stmt = parseStmt('as @a { say("hello"); }');
288
- expect(stmt.kind).toBe('as_block');
289
- expect(stmt.selector.kind).toBe('@a');
290
- });
291
- it('parses at block', () => {
292
- const stmt = parseStmt('at @s { summon("zombie"); }');
293
- expect(stmt.kind).toBe('at_block');
294
- expect(stmt.selector.kind).toBe('@s');
295
- });
296
- it('parses as at combined', () => {
297
- const stmt = parseStmt('as @a at @s { particle("flame"); }');
298
- expect(stmt.kind).toBe('as_at');
299
- expect(stmt.as_sel.kind).toBe('@a');
300
- expect(stmt.at_sel.kind).toBe('@s');
301
- });
302
- it('parses raw command', () => {
303
- const stmt = parseStmt('raw("say hello");');
304
- expect(stmt).toEqual({ kind: 'raw', cmd: 'say hello' });
305
- });
306
- it('parses execute as run block', () => {
307
- const stmt = parseStmt('execute as @a run { say("hello"); }');
308
- expect(stmt.kind).toBe('execute');
309
- expect(stmt.subcommands).toHaveLength(1);
310
- expect(stmt.subcommands[0]).toEqual({ kind: 'as', selector: { kind: '@a' } });
311
- expect(stmt.body).toHaveLength(1);
312
- });
313
- it('parses execute as at run block', () => {
314
- const stmt = parseStmt('execute as @a at @s run { particle("flame"); }');
315
- expect(stmt.kind).toBe('execute');
316
- expect(stmt.subcommands).toHaveLength(2);
317
- expect(stmt.subcommands[0]).toEqual({ kind: 'as', selector: { kind: '@a' } });
318
- expect(stmt.subcommands[1]).toEqual({ kind: 'at', selector: { kind: '@s' } });
319
- });
320
- it('parses execute with if entity condition', () => {
321
- const stmt = parseStmt('execute as @a if entity @s[tag=admin] run { give(@s, "diamond", 1); }');
322
- expect(stmt.kind).toBe('execute');
323
- expect(stmt.subcommands).toHaveLength(2);
324
- expect(stmt.subcommands[1].kind).toBe('if_entity');
325
- expect(stmt.subcommands[1].selector.filters.tag).toEqual(['admin']);
326
- });
327
- it('parses execute with unless entity condition', () => {
328
- const stmt = parseStmt('execute as @a unless entity @s[tag=dead] run { effect(@s, "regeneration", 5); }');
329
- expect(stmt.kind).toBe('execute');
330
- expect(stmt.subcommands).toHaveLength(2);
331
- expect(stmt.subcommands[1].kind).toBe('unless_entity');
332
- });
333
- it('parses execute with in dimension', () => {
334
- const stmt = parseStmt('execute in the_nether run { say("in nether"); }');
335
- expect(stmt.kind).toBe('execute');
336
- expect(stmt.subcommands).toHaveLength(1);
337
- expect(stmt.subcommands[0]).toEqual({ kind: 'in', dimension: 'the_nether' });
338
- });
339
- it('parses complex execute chain', () => {
340
- const stmt = parseStmt('execute as @a at @s if entity @s[tag=vip] in overworld run { particle("heart"); }');
341
- expect(stmt.kind).toBe('execute');
342
- expect(stmt.subcommands).toHaveLength(4);
343
- });
344
- });
345
- describe('lambda expressions', () => {
346
- it('parses expression-body lambdas', () => {
347
- const stmt = parseStmt('let double = (x: int) => x * 2;');
348
- expect(stmt.kind).toBe('let');
349
- expect(stmt.init).toEqual({
350
- kind: 'lambda',
351
- params: [{ name: 'x', type: { kind: 'named', name: 'int' } }],
352
- returnType: undefined,
353
- body: {
354
- kind: 'binary',
355
- op: '*',
356
- left: { kind: 'ident', name: 'x' },
357
- right: { kind: 'int_lit', value: 2 },
358
- },
359
- });
360
- });
361
- it('parses block-body lambdas', () => {
362
- const stmt = parseStmt('let process: (int) -> int = (x: int) => { let doubled: int = x * 2; return doubled + 1; };');
363
- expect(stmt.kind).toBe('let');
364
- expect(stmt.init.kind).toBe('lambda');
365
- expect(Array.isArray(stmt.init.body)).toBe(true);
366
- });
367
- it('parses single-parameter lambdas without parens', () => {
368
- const stmt = parseStmt('let double: (int) -> int = x => x * 2;');
369
- expect(stmt.kind).toBe('let');
370
- expect(stmt.init).toEqual({
371
- kind: 'lambda',
372
- params: [{ name: 'x' }],
373
- returnType: undefined,
374
- body: {
375
- kind: 'binary',
376
- op: '*',
377
- left: { kind: 'ident', name: 'x' },
378
- right: { kind: 'int_lit', value: 2 },
379
- },
380
- });
381
- });
382
- it('parses immediately-invoked lambdas', () => {
383
- const expr = parseExpr('((x: int) => x * 2)(5)');
384
- expect(expr).toEqual({
385
- kind: 'invoke',
386
- callee: {
387
- kind: 'lambda',
388
- params: [{ name: 'x', type: { kind: 'named', name: 'int' } }],
389
- returnType: undefined,
390
- body: {
391
- kind: 'binary',
392
- op: '*',
393
- left: { kind: 'ident', name: 'x' },
394
- right: { kind: 'int_lit', value: 2 },
395
- },
396
- },
397
- args: [{ kind: 'int_lit', value: 5 }],
398
- });
399
- });
400
- });
401
- describe('expressions', () => {
402
- describe('literals', () => {
403
- it('parses integer literal', () => {
404
- const expr = parseExpr('42');
405
- expect(expr).toEqual({ kind: 'int_lit', value: 42 });
406
- });
407
- it('parses float literal', () => {
408
- const expr = parseExpr('3.14');
409
- expect(expr).toEqual({ kind: 'float_lit', value: 3.14 });
410
- });
411
- it('parses string literal', () => {
412
- const expr = parseExpr('"hello"');
413
- expect(expr).toEqual({ kind: 'str_lit', value: 'hello' });
414
- });
415
- it('parses interpolated string literal', () => {
416
- const expr = parseExpr('"Hello ${name}, score is ${score + 1}"');
417
- expect(expr).toEqual({
418
- kind: 'str_interp',
419
- parts: [
420
- 'Hello ',
421
- { kind: 'ident', name: 'name' },
422
- ', score is ',
423
- {
424
- kind: 'binary',
425
- op: '+',
426
- left: { kind: 'ident', name: 'score' },
427
- right: { kind: 'int_lit', value: 1 },
428
- },
429
- ],
430
- });
431
- });
432
- it('parses f-string literal', () => {
433
- const expr = parseExpr('f"Score: {x}"');
434
- expect(expr).toEqual({
435
- kind: 'f_string',
436
- parts: [
437
- { kind: 'text', value: 'Score: ' },
438
- { kind: 'expr', expr: { kind: 'ident', name: 'x' } },
439
- ],
440
- });
441
- });
442
- it('parses boolean literals', () => {
443
- expect(parseExpr('true')).toEqual({ kind: 'bool_lit', value: true });
444
- expect(parseExpr('false')).toEqual({ kind: 'bool_lit', value: false });
445
- });
446
- it('parses range literals', () => {
447
- expect(parseExpr('..5')).toEqual({ kind: 'range_lit', range: { max: 5 } });
448
- expect(parseExpr('1..')).toEqual({ kind: 'range_lit', range: { min: 1 } });
449
- expect(parseExpr('1..10')).toEqual({ kind: 'range_lit', range: { min: 1, max: 10 } });
450
- });
451
- it('parses absolute block positions', () => {
452
- expect(parseExpr('(0, 64, 0)')).toEqual({
453
- kind: 'blockpos',
454
- x: { kind: 'absolute', value: 0 },
455
- y: { kind: 'absolute', value: 64 },
456
- z: { kind: 'absolute', value: 0 },
457
- });
458
- });
459
- it('parses relative block positions', () => {
460
- expect(parseExpr('(~1, ~0, ~-1)')).toEqual({
461
- kind: 'blockpos',
462
- x: { kind: 'relative', offset: 1 },
463
- y: { kind: 'relative', offset: 0 },
464
- z: { kind: 'relative', offset: -1 },
465
- });
466
- });
467
- it('parses local block positions', () => {
468
- expect(parseExpr('(^0, ^1, ^0)')).toEqual({
469
- kind: 'blockpos',
470
- x: { kind: 'local', offset: 0 },
471
- y: { kind: 'local', offset: 1 },
472
- z: { kind: 'local', offset: 0 },
473
- });
474
- });
475
- it('parses mixed block positions', () => {
476
- expect(parseExpr('(~0, 64, ~0)')).toEqual({
477
- kind: 'blockpos',
478
- x: { kind: 'relative', offset: 0 },
479
- y: { kind: 'absolute', value: 64 },
480
- z: { kind: 'relative', offset: 0 },
481
- });
482
- });
483
- });
484
- describe('identifiers and calls', () => {
485
- it('parses identifier', () => {
486
- const expr = parseExpr('foo');
487
- expect(expr).toEqual({ kind: 'ident', name: 'foo' });
488
- });
489
- it('parses function call', () => {
490
- const expr = parseExpr('foo(1, 2)');
491
- expect(expr).toEqual({
492
- kind: 'call',
493
- fn: 'foo',
494
- args: [
495
- { kind: 'int_lit', value: 1 },
496
- { kind: 'int_lit', value: 2 },
497
- ],
498
- });
499
- });
500
- it('parses no-arg call', () => {
501
- const expr = parseExpr('foo()');
502
- expect(expr).toEqual({ kind: 'call', fn: 'foo', args: [] });
503
- });
504
- it('parses enum variant member access', () => {
505
- const expr = parseExpr('Direction.North');
506
- expect(expr).toEqual({
507
- kind: 'member',
508
- obj: { kind: 'ident', name: 'Direction' },
509
- field: 'North',
510
- });
511
- });
512
- });
513
- it('parses static method calls', () => {
514
- const expr = parseExpr('Timer::new(100)');
515
- expect(expr).toEqual({
516
- kind: 'static_call',
517
- type: 'Timer',
518
- method: 'new',
519
- args: [{ kind: 'int_lit', value: 100 }],
520
- });
521
- });
522
- describe('binary operators', () => {
523
- it('parses arithmetic', () => {
524
- const expr = parseExpr('1 + 2');
525
- expect(expr).toEqual({
526
- kind: 'binary',
527
- op: '+',
528
- left: { kind: 'int_lit', value: 1 },
529
- right: { kind: 'int_lit', value: 2 },
530
- });
531
- });
532
- it('respects precedence (mul before add)', () => {
533
- const expr = parseExpr('1 + 2 * 3');
534
- expect(expr.kind).toBe('binary');
535
- expect(expr.op).toBe('+');
536
- expect(expr.right.op).toBe('*');
537
- });
538
- it('respects precedence (compare before logical)', () => {
539
- const expr = parseExpr('a < b && c > d');
540
- expect(expr.kind).toBe('binary');
541
- expect(expr.op).toBe('&&');
542
- expect(expr.left.op).toBe('<');
543
- expect(expr.right.op).toBe('>');
544
- });
545
- it('is left associative', () => {
546
- const expr = parseExpr('1 - 2 - 3');
547
- // Should be (1 - 2) - 3
548
- expect(expr.kind).toBe('binary');
549
- expect(expr.op).toBe('-');
550
- expect(expr.left.kind).toBe('binary');
551
- expect(expr.right.kind).toBe('int_lit');
552
- });
553
- });
554
- describe('unary operators', () => {
555
- it('parses negation', () => {
556
- const expr = parseExpr('-5');
557
- expect(expr).toEqual({
558
- kind: 'unary',
559
- op: '-',
560
- operand: { kind: 'int_lit', value: 5 },
561
- });
562
- });
563
- it('parses logical not', () => {
564
- const expr = parseExpr('!flag');
565
- expect(expr).toEqual({
566
- kind: 'unary',
567
- op: '!',
568
- operand: { kind: 'ident', name: 'flag' },
569
- });
570
- });
571
- });
572
- describe('assignment', () => {
573
- it('parses simple assignment', () => {
574
- const expr = parseExpr('x = 5');
575
- expect(expr).toEqual({
576
- kind: 'assign',
577
- target: 'x',
578
- op: '=',
579
- value: { kind: 'int_lit', value: 5 },
580
- });
581
- });
582
- it('parses compound assignment', () => {
583
- const expr = parseExpr('x += 1');
584
- expect(expr).toEqual({
585
- kind: 'assign',
586
- target: 'x',
587
- op: '+=',
588
- value: { kind: 'int_lit', value: 1 },
589
- });
590
- });
591
- });
592
- describe('selectors', () => {
593
- it('parses simple selector', () => {
594
- const expr = parseExpr('@a');
595
- expect(expr).toEqual({
596
- kind: 'selector',
597
- raw: '@a',
598
- isSingle: false,
599
- sel: { kind: '@a' },
600
- });
601
- });
602
- it('marks single-entity selectors', () => {
603
- expect(parseExpr('@p')).toEqual({
604
- kind: 'selector',
605
- raw: '@p',
606
- isSingle: true,
607
- sel: { kind: '@p' },
608
- });
609
- expect(parseExpr('@e[limit=1, tag=target]')).toEqual({
610
- kind: 'selector',
611
- raw: '@e[limit=1, tag=target]',
612
- isSingle: true,
613
- sel: {
614
- kind: '@e',
615
- filters: { limit: 1, tag: ['target'] },
616
- },
617
- });
618
- });
619
- it('parses selector with type filter', () => {
620
- const expr = parseExpr('@e[type=zombie]');
621
- expect(expr).toEqual({
622
- kind: 'selector',
623
- raw: '@e[type=zombie]',
624
- isSingle: false,
625
- sel: {
626
- kind: '@e',
627
- filters: { type: 'zombie' },
628
- },
629
- });
630
- });
631
- it('parses selector with distance filter', () => {
632
- const expr = parseExpr('@e[distance=..5]');
633
- expect(expr.sel.filters.distance).toEqual({ max: 5 });
634
- });
635
- it('parses selector with tag filter', () => {
636
- const expr = parseExpr('@e[tag=boss, tag=!excluded]');
637
- expect(expr.sel.filters.tag).toEqual(['boss']);
638
- expect(expr.sel.filters.notTag).toEqual(['excluded']);
639
- });
640
- it('parses selector with limit and sort', () => {
641
- const expr = parseExpr('@e[limit=1, sort=nearest]');
642
- expect(expr.sel.filters.limit).toBe(1);
643
- expect(expr.sel.filters.sort).toBe('nearest');
644
- });
645
- it('parses selector with scores', () => {
646
- const expr = parseExpr('@a[scores={kills=1..}]');
647
- expect(expr.sel.filters.scores).toEqual({
648
- kills: { min: 1 },
649
- });
650
- });
651
- });
652
- describe('member access', () => {
653
- it('parses member access', () => {
654
- const expr = parseExpr('entity.health');
655
- expect(expr).toEqual({
656
- kind: 'member',
657
- obj: { kind: 'ident', name: 'entity' },
658
- field: 'health',
659
- });
660
- });
661
- it('parses array len property', () => {
662
- const expr = parseExpr('arr.len');
663
- expect(expr).toEqual({
664
- kind: 'member',
665
- obj: { kind: 'ident', name: 'arr' },
666
- field: 'len',
667
- });
668
- });
669
- });
670
- describe('arrays', () => {
671
- it('parses array literal', () => {
672
- expect(parseExpr('[1, 2, 3]')).toEqual({
673
- kind: 'array_lit',
674
- elements: [
675
- { kind: 'int_lit', value: 1 },
676
- { kind: 'int_lit', value: 2 },
677
- { kind: 'int_lit', value: 3 },
678
- ],
679
- });
680
- });
681
- it('parses array index access', () => {
682
- expect(parseExpr('arr[i]')).toEqual({
683
- kind: 'index',
684
- obj: { kind: 'ident', name: 'arr' },
685
- index: { kind: 'ident', name: 'i' },
686
- });
687
- });
688
- it('parses array push call', () => {
689
- expect(parseExpr('arr.push(4)')).toEqual({
690
- kind: 'call',
691
- fn: '__array_push',
692
- args: [
693
- { kind: 'ident', name: 'arr' },
694
- { kind: 'int_lit', value: 4 },
695
- ],
696
- });
697
- });
698
- it('parses array pop call', () => {
699
- expect(parseExpr('arr.pop()')).toEqual({
700
- kind: 'call',
701
- fn: '__array_pop',
702
- args: [
703
- { kind: 'ident', name: 'arr' },
704
- ],
705
- });
706
- });
707
- });
708
- describe('grouping', () => {
709
- it('parses parenthesized expression', () => {
710
- const expr = parseExpr('(1 + 2) * 3');
711
- expect(expr.kind).toBe('binary');
712
- expect(expr.op).toBe('*');
713
- expect(expr.left.kind).toBe('binary');
714
- });
715
- });
716
- });
717
- describe('complex programs', () => {
718
- it('parses add function', () => {
719
- const source = `
720
- fn add(a: int, b: int) -> int {
721
- return a + b;
722
- }
723
- `;
724
- const program = parse(source);
725
- expect(program.declarations).toHaveLength(1);
726
- const fn = program.declarations[0];
727
- expect(fn.name).toBe('add');
728
- expect(fn.body).toHaveLength(1);
729
- expect(fn.body[0].kind).toBe('return');
730
- });
731
- it('parses abs function with if/else', () => {
732
- const source = `
733
- fn abs(x: int) -> int {
734
- if (x < 0) {
735
- return -x;
736
- } else {
737
- return x;
738
- }
739
- }
740
- `;
741
- const program = parse(source);
742
- const fn = program.declarations[0];
743
- expect(fn.body).toHaveLength(1);
744
- const ifStmt = fn.body[0];
745
- expect(ifStmt.kind).toBe('if');
746
- });
747
- it('parses tick function', () => {
748
- const source = `
749
- @tick(rate=20)
750
- fn heartbeat() {
751
- say("still alive");
752
- }
753
- `;
754
- const program = parse(source);
755
- const fn = program.declarations[0];
756
- expect(fn.decorators).toEqual([{ name: 'tick', args: { rate: 20 } }]);
757
- expect(fn.body).toHaveLength(1);
758
- });
759
- it('parses foreach with kill', () => {
760
- const source = `
761
- fn kill_zombies() {
762
- foreach (z in @e[type=zombie, distance=..10]) {
763
- kill(z);
764
- }
765
- }
766
- `;
767
- const program = parse(source);
768
- const fn = program.declarations[0];
769
- const stmt = fn.body[0];
770
- expect(stmt.kind).toBe('foreach');
771
- expect(stmt.binding).toBe('z');
772
- expect(stmt.iterable.sel.filters.type).toBe('zombie');
773
- expect(stmt.iterable.sel.filters.distance).toEqual({ max: 10 });
774
- });
775
- it('parses foreach over array', () => {
776
- const source = `
777
- fn walk() {
778
- let arr: int[] = [1, 2, 3];
779
- foreach (x in arr) {
780
- say("tick");
781
- }
782
- }
783
- `;
784
- const program = parse(source);
785
- const stmt = program.declarations[0].body[1];
786
- expect(stmt.kind).toBe('foreach');
787
- expect(stmt.binding).toBe('x');
788
- expect(stmt.iterable).toEqual({ kind: 'ident', name: 'arr' });
789
- });
790
- it('parses while loop', () => {
791
- const source = `
792
- fn count_down() {
793
- let i: int = 10;
794
- while (i > 0) {
795
- i = i - 1;
796
- }
797
- }
798
- `;
799
- const program = parse(source);
800
- const fn = program.declarations[0];
801
- expect(fn.body).toHaveLength(2);
802
- expect(fn.body[0].kind).toBe('let');
803
- expect(fn.body[1].kind).toBe('while');
804
- });
805
- });
806
- });
807
- //# sourceMappingURL=parser.test.js.map