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,8 +0,0 @@
1
- /**
2
- * Tests for MC 1.20.2+ macro function support
3
- *
4
- * When a function uses runtime parameters in positions that require literal
5
- * values in MC commands (coordinates, entity types, etc.), RedScript should
6
- * automatically compile it as a macro function using $-prefixed syntax.
7
- */
8
- export {};
@@ -1,306 +0,0 @@
1
- "use strict";
2
- /**
3
- * Tests for MC 1.20.2+ macro function support
4
- *
5
- * When a function uses runtime parameters in positions that require literal
6
- * values in MC commands (coordinates, entity types, etc.), RedScript should
7
- * automatically compile it as a macro function using $-prefixed syntax.
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- const lexer_1 = require("../lexer");
11
- const parser_1 = require("../parser");
12
- const lowering_1 = require("../lowering");
13
- const mcfunction_1 = require("../codegen/mcfunction");
14
- function compile(source, namespace = 'test') {
15
- const tokens = new lexer_1.Lexer(source).tokenize();
16
- const ast = new parser_1.Parser(tokens).parse(namespace);
17
- const lowering = new lowering_1.Lowering(namespace);
18
- return lowering.lower(ast);
19
- }
20
- function getFunction(module, name) {
21
- return module.functions.find(f => f.name === name);
22
- }
23
- function getRawCommands(fn) {
24
- return fn.blocks
25
- .flatMap(b => b.instrs)
26
- .filter((i) => i.op === 'raw')
27
- // \x01 is the sentinel for the MC macro line-start '$'; normalize for test assertions
28
- .map(i => i.cmd.replace(/^\x01/, '$'));
29
- }
30
- function getGeneratedContent(module, fnName) {
31
- const files = (0, mcfunction_1.generateDatapack)(module);
32
- const file = files.find(f => f.path.includes(`/${fnName}.mcfunction`));
33
- return file?.content;
34
- }
35
- // ---------------------------------------------------------------------------
36
- // Macro function detection
37
- // ---------------------------------------------------------------------------
38
- describe('MC macro function detection', () => {
39
- it('marks function as macro when int param used in summon coordinates', () => {
40
- const ir = compile(`
41
- fn spawn_zombie(x: int, y: int, z: int) {
42
- summon("minecraft:zombie", x, y, z);
43
- }
44
- `);
45
- const fn = getFunction(ir, 'spawn_zombie');
46
- expect(fn).toBeDefined();
47
- expect(fn.isMacroFunction).toBe(true);
48
- expect(fn.macroParamNames).toEqual(expect.arrayContaining(['x', 'y', 'z']));
49
- });
50
- it('does NOT mark function as macro when all summon args are constants', () => {
51
- const ir = compile(`
52
- fn spawn_fixed() {
53
- summon("minecraft:zombie", 100, 64, 200);
54
- }
55
- `);
56
- const fn = getFunction(ir, 'spawn_fixed');
57
- expect(fn).toBeDefined();
58
- expect(fn.isMacroFunction).toBeFalsy();
59
- });
60
- it('marks function as macro when int param used in particle coordinates', () => {
61
- const ir = compile(`
62
- fn show_particle(x: int, y: int, z: int) {
63
- particle("minecraft:flame", x, y, z);
64
- }
65
- `);
66
- const fn = getFunction(ir, 'show_particle');
67
- expect(fn).toBeDefined();
68
- expect(fn.isMacroFunction).toBe(true);
69
- });
70
- it('marks function as macro when int param used in setblock coordinates', () => {
71
- const ir = compile(`
72
- fn place_block(x: int, y: int, z: int) {
73
- setblock(x, y, z, "minecraft:stone");
74
- }
75
- `);
76
- const fn = getFunction(ir, 'place_block');
77
- expect(fn).toBeDefined();
78
- expect(fn.isMacroFunction).toBe(true);
79
- expect(fn.macroParamNames).toEqual(expect.arrayContaining(['x', 'y', 'z']));
80
- });
81
- it('identifies only the params used in macro positions', () => {
82
- const ir = compile(`
83
- fn do_stuff(count: int, x: int, y: int, z: int) {
84
- summon("minecraft:zombie", x, y, z);
85
- // count is not used in a macro position
86
- }
87
- `);
88
- const fn = getFunction(ir, 'do_stuff');
89
- expect(fn).toBeDefined();
90
- expect(fn.isMacroFunction).toBe(true);
91
- // x, y, z should be macro params; count should NOT be
92
- expect(fn.macroParamNames).toEqual(expect.arrayContaining(['x', 'y', 'z']));
93
- expect(fn.macroParamNames).not.toContain('count');
94
- });
95
- });
96
- // ---------------------------------------------------------------------------
97
- // Macro command generation in function body
98
- // ---------------------------------------------------------------------------
99
- describe('MC macro command generation', () => {
100
- it('generates $-prefixed summon command with $(param) for macro params', () => {
101
- const ir = compile(`
102
- fn spawn_zombie(x: int, y: int, z: int) {
103
- summon("minecraft:zombie", x, y, z);
104
- }
105
- `);
106
- const fn = getFunction(ir, 'spawn_zombie');
107
- const cmds = getRawCommands(fn);
108
- // Should have a macro command for summon
109
- const macroCmd = cmds.find(c => c.startsWith('$summon'));
110
- expect(macroCmd).toBeDefined();
111
- expect(macroCmd).toContain('$(x)');
112
- expect(macroCmd).toContain('$(y)');
113
- expect(macroCmd).toContain('$(z)');
114
- expect(macroCmd).toBe('$summon minecraft:zombie $(x) $(y) $(z)');
115
- });
116
- it('generates non-prefixed command when args are literals', () => {
117
- const ir = compile(`
118
- fn spawn_fixed() {
119
- summon("minecraft:zombie", 100, 64, 200);
120
- }
121
- `);
122
- const fn = getFunction(ir, 'spawn_fixed');
123
- const cmds = getRawCommands(fn);
124
- const summonCmd = cmds.find(c => c.includes('summon'));
125
- expect(summonCmd).toBeDefined();
126
- expect(summonCmd.startsWith('$')).toBe(false);
127
- expect(summonCmd).toContain('100');
128
- expect(summonCmd).toContain('64');
129
- expect(summonCmd).toContain('200');
130
- });
131
- it('generates $-prefixed particle command with $(param)', () => {
132
- const ir = compile(`
133
- fn show_particle(x: int, y: int, z: int) {
134
- particle("minecraft:flame", x, y, z);
135
- }
136
- `);
137
- const fn = getFunction(ir, 'show_particle');
138
- const cmds = getRawCommands(fn);
139
- const macroCmd = cmds.find(c => c.startsWith('$particle'));
140
- expect(macroCmd).toBeDefined();
141
- expect(macroCmd).toContain('$(x)');
142
- });
143
- it('generates $-prefixed setblock command with $(param)', () => {
144
- const ir = compile(`
145
- fn place_block(x: int, y: int, z: int) {
146
- setblock(x, y, z, "minecraft:stone");
147
- }
148
- `);
149
- const fn = getFunction(ir, 'place_block');
150
- const cmds = getRawCommands(fn);
151
- const macroCmd = cmds.find(c => c.startsWith('$setblock'));
152
- expect(macroCmd).toBeDefined();
153
- expect(macroCmd).toContain('$(x)');
154
- expect(macroCmd).toContain('$(y)');
155
- expect(macroCmd).toContain('$(z)');
156
- expect(macroCmd).toContain('minecraft:stone');
157
- });
158
- });
159
- // ---------------------------------------------------------------------------
160
- // Call site code generation
161
- // ---------------------------------------------------------------------------
162
- describe('MC macro call site generation', () => {
163
- it('emits NBT setup + with-storage call for variable args', () => {
164
- const ir = compile(`
165
- fn spawn_zombie(x: int, y: int, z: int) {
166
- summon("minecraft:zombie", x, y, z);
167
- }
168
-
169
- fn caller(px: int, pz: int) {
170
- spawn_zombie(px, 64, pz);
171
- }
172
- `);
173
- const callerFn = getFunction(ir, 'caller');
174
- const cmds = getRawCommands(callerFn);
175
- // Should have NBT setup for variable params (px → x, pz → z)
176
- const xSetup = cmds.find(c => c.includes('macro_args') && c.includes(' x '));
177
- const zSetup = cmds.find(c => c.includes('macro_args') && c.includes(' z '));
178
- expect(xSetup).toBeDefined();
179
- expect(zSetup).toBeDefined();
180
- // Should have 'function test:spawn_zombie with storage rs:macro_args'
181
- const callCmd = cmds.find(c => c.includes('spawn_zombie') && c.includes('with storage'));
182
- expect(callCmd).toBeDefined();
183
- expect(callCmd).toContain('rs:macro_args');
184
- });
185
- it('emits NBT setup for constant args too', () => {
186
- const ir = compile(`
187
- fn spawn_zombie(x: int, y: int, z: int) {
188
- summon("minecraft:zombie", x, y, z);
189
- }
190
-
191
- fn caller_const() {
192
- spawn_zombie(100, 64, 200);
193
- }
194
- `);
195
- const callerFn = getFunction(ir, 'caller_const');
196
- const cmds = getRawCommands(callerFn);
197
- // Should have NBT setup for all macro params
198
- const nbtCmds = cmds.filter(c => c.includes('macro_args'));
199
- expect(nbtCmds.length).toBeGreaterThan(0);
200
- // Should call with storage
201
- const callCmd = cmds.find(c => c.includes('spawn_zombie') && c.includes('with storage'));
202
- expect(callCmd).toBeDefined();
203
- });
204
- it('correctly sets up int variable args into NBT storage', () => {
205
- const ir = compile(`
206
- fn spawn_zombie(x: int, y: int, z: int) {
207
- summon("minecraft:zombie", x, y, z);
208
- }
209
-
210
- fn caller(my_x: int) {
211
- spawn_zombie(my_x, 64, 0);
212
- }
213
- `);
214
- const callerFn = getFunction(ir, 'caller');
215
- const cmds = getRawCommands(callerFn);
216
- // For variable arg my_x → x: should use execute store result
217
- const varSetup = cmds.find(c => c.includes('execute store result storage rs:macro_args x') &&
218
- c.includes('scoreboard players get'));
219
- expect(varSetup).toBeDefined();
220
- // For constant 64 → y: should use data modify ... set value
221
- const constSetup = cmds.find(c => c.includes('data modify storage rs:macro_args y set value 64'));
222
- expect(constSetup).toBeDefined();
223
- });
224
- });
225
- // ---------------------------------------------------------------------------
226
- // Codegen output (mcfunction file content)
227
- // ---------------------------------------------------------------------------
228
- describe('MC macro function codegen output', () => {
229
- it('generates $-prefixed lines in the macro function mcfunction file', () => {
230
- const ir = compile(`
231
- fn spawn_zombie(x: int, y: int, z: int) {
232
- summon("minecraft:zombie", x, y, z);
233
- }
234
- `);
235
- const content = getGeneratedContent(ir, 'spawn_zombie');
236
- expect(content).toBeDefined();
237
- expect(content).toContain('$summon minecraft:zombie $(x) $(y) $(z)');
238
- });
239
- it('generates correct call site in caller mcfunction file', () => {
240
- const ir = compile(`
241
- fn spawn_zombie(x: int, y: int, z: int) {
242
- summon("minecraft:zombie", x, y, z);
243
- }
244
-
245
- fn caller(px: int, pz: int) {
246
- spawn_zombie(px, 64, pz);
247
- }
248
- `);
249
- const content = getGeneratedContent(ir, 'caller');
250
- expect(content).toBeDefined();
251
- expect(content).toContain('with storage rs:macro_args');
252
- expect(content).toContain('spawn_zombie');
253
- });
254
- });
255
- // ---------------------------------------------------------------------------
256
- // Edge cases
257
- // ---------------------------------------------------------------------------
258
- describe('MC macro edge cases', () => {
259
- it('handles mixed literal and variable args correctly', () => {
260
- const ir = compile(`
261
- fn teleport_y(y: int) {
262
- summon("minecraft:zombie", 100, y, 200);
263
- }
264
- `);
265
- const fn = getFunction(ir, 'teleport_y');
266
- expect(fn.isMacroFunction).toBe(true);
267
- expect(fn.macroParamNames).toContain('y');
268
- expect(fn.macroParamNames).not.toContain('x');
269
- const cmds = getRawCommands(fn);
270
- const macroCmd = cmds.find(c => c.startsWith('$summon'));
271
- expect(macroCmd).toBeDefined();
272
- // x and z are literals, y is macro
273
- expect(macroCmd).toContain('100');
274
- expect(macroCmd).toContain('$(y)');
275
- expect(macroCmd).toContain('200');
276
- });
277
- it('non-macro functions still work normally', () => {
278
- const ir = compile(`
279
- fn greet() {
280
- say("hello world");
281
- }
282
- `);
283
- const fn = getFunction(ir, 'greet');
284
- expect(fn.isMacroFunction).toBeFalsy();
285
- const cmds = getRawCommands(fn);
286
- const sayCmd = cmds.find(c => c.includes('say') || c.includes('tellraw'));
287
- expect(sayCmd).toBeDefined();
288
- expect(sayCmd.startsWith('$')).toBe(false);
289
- });
290
- it('macro function with params used in arithmetic still works', () => {
291
- const ir = compile(`
292
- fn spawn_offset(x: int, y: int, z: int) {
293
- summon("minecraft:zombie", x, y, z);
294
- // params are also used in the macro commands
295
- }
296
- `);
297
- const fn = getFunction(ir, 'spawn_offset');
298
- expect(fn.isMacroFunction).toBe(true);
299
- // The macro commands should use $(param) syntax
300
- const cmds = getRawCommands(fn);
301
- const macroCmd = cmds.find(c => c.startsWith('$summon'));
302
- expect(macroCmd).toBeDefined();
303
- expect(macroCmd).toContain('$(x)');
304
- });
305
- });
306
- //# sourceMappingURL=macro.test.js.map
@@ -1 +0,0 @@
1
- export {};
@@ -1,82 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const fs = __importStar(require("fs"));
37
- const structure_1 = require("../codegen/structure");
38
- const nbt_1 = require("../nbt");
39
- describe('NBT codec', () => {
40
- test('round-trips a compound tag', () => {
41
- const tag = nbt_1.nbt.compound({ x: nbt_1.nbt.int(42), name: nbt_1.nbt.string('test') });
42
- const buf = (0, nbt_1.writeNbt)(tag, 'root');
43
- const parsed = (0, nbt_1.readNbt)(buf);
44
- expect(parsed.name).toBe('root');
45
- expect(parsed.tag).toEqual(tag);
46
- });
47
- test('round-trips nested lists and arrays', () => {
48
- const tag = nbt_1.nbt.compound({
49
- nested: nbt_1.nbt.list(10 /* TagType.Compound */, [
50
- nbt_1.nbt.compound({ values: nbt_1.nbt.intArray([1, 2, 3]) }),
51
- nbt_1.nbt.compound({ bytes: nbt_1.nbt.byteArray([-1, 0, 1]) }),
52
- ]),
53
- longs: { type: 12 /* TagType.LongArray */, value: BigInt64Array.from([1n, 2n, 3n]) },
54
- });
55
- const buf = (0, nbt_1.writeNbt)(tag, 'root');
56
- const parsed = (0, nbt_1.readNbt)(buf);
57
- expect(parsed.tag).toEqual(tag);
58
- });
59
- test('handles longs correctly', () => {
60
- const tag = nbt_1.nbt.compound({ ts: nbt_1.nbt.long(9007199254740993n) });
61
- const buf = (0, nbt_1.writeNbt)(tag, '');
62
- const parsed = (0, nbt_1.readNbt)(buf);
63
- const root = parsed.tag;
64
- expect(root.entries.get('ts')).toEqual(nbt_1.nbt.long(9007199254740993n));
65
- expect(root.entries.get('ts').value).toBe(9007199254740993n);
66
- });
67
- });
68
- describe('Structure generator', () => {
69
- test('compiles counter.mcrs to a non-empty structure', () => {
70
- const filePath = 'src/examples/counter.mcrs';
71
- const src = fs.readFileSync(filePath, 'utf-8');
72
- const { buffer, blockCount } = (0, structure_1.compileToStructure)(src, 'counter', filePath);
73
- expect(buffer.length).toBeGreaterThan(100);
74
- expect(blockCount).toBeGreaterThan(0);
75
- const parsed = (0, nbt_1.readNbt)(buffer);
76
- const root = parsed.tag;
77
- const blocks = root.entries.get('blocks');
78
- expect(parsed.name).toBe('');
79
- expect(blocks?.type).toBe(9 /* TagType.List */);
80
- });
81
- });
82
- //# sourceMappingURL=nbt.test.js.map
@@ -1 +0,0 @@
1
- export {};
@@ -1,124 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const index_1 = require("../index");
4
- const structure_1 = require("../codegen/structure");
5
- function getFileContent(files, suffix) {
6
- const file = files.find(candidate => candidate.path.endsWith(suffix));
7
- if (!file) {
8
- throw new Error(`Missing file: ${suffix}`);
9
- }
10
- return file.content;
11
- }
12
- describe('LICM', () => {
13
- test('hoists loop-invariant scoreboard read out of foreach', () => {
14
- const source = `
15
- fn turret_tick() {
16
- foreach (turret in @e[tag=turret]) {
17
- let range: int = scoreboard_get("config", "turret_range");
18
- if (range > 0) {
19
- if (range > -1) {
20
- say("ready");
21
- }
22
- }
23
- }
24
- }
25
- `;
26
- const result = (0, index_1.compile)(source, { namespace: 'test' });
27
- const parent = getFileContent(result.files, 'data/test/function/turret_tick.mcfunction');
28
- const loopBody = getFileContent(result.files, 'data/test/function/turret_tick/foreach_0.mcfunction');
29
- const hoistedRead = 'execute store result score $_0 __test run scoreboard players get config test.turret_range';
30
- const executeCall = 'execute as @e[tag=turret] run function test:turret_tick/foreach_0';
31
- expect(parent).toContain(hoistedRead);
32
- expect(parent.indexOf(hoistedRead)).toBeLessThan(parent.indexOf(executeCall));
33
- expect(loopBody).not.toContain('scoreboard players get config test.turret_range');
34
- });
35
- });
36
- describe('CSE', () => {
37
- test('eliminates duplicate scoreboard reads', () => {
38
- const source = `
39
- fn read_twice() {
40
- let a: int = scoreboard_get(@s, "coins");
41
- let b: int = scoreboard_get(@s, "coins");
42
- if (a == b) {
43
- say("same");
44
- }
45
- }
46
- `;
47
- const result = (0, index_1.compile)(source, { namespace: 'test' });
48
- const fn = getFileContent(result.files, 'data/test/function/read_twice.mcfunction');
49
- const readMatches = fn.match(/scoreboard players get @s test\.coins/g) ?? [];
50
- expect(readMatches).toHaveLength(1);
51
- expect(fn).toContain('scoreboard players operation $_1 __test = $_0 __test');
52
- });
53
- test('reuses duplicate arithmetic sequences', () => {
54
- const source = `
55
- fn math() {
56
- let base: int = 4;
57
- let a: int = base + 2;
58
- let b: int = base + 2;
59
- if (a == b) {
60
- say("same");
61
- }
62
- }
63
- `;
64
- const result = (0, index_1.compile)(source, { namespace: 'test' });
65
- const fn = getFileContent(result.files, 'data/test/function/math.mcfunction');
66
- const addMatches = fn.match(/\+= \$const_2 __test/g) ?? [];
67
- expect(addMatches).toHaveLength(1);
68
- expect(fn).toContain('scoreboard players operation $_1 __test = $_0 __test');
69
- });
70
- });
71
- describe('setblock batching', () => {
72
- test('merges 4 consecutive setblocks into fill', () => {
73
- const source = `
74
- fn build() {
75
- setblock((0, 64, 0), "minecraft:stone");
76
- setblock((1, 64, 0), "minecraft:stone");
77
- setblock((2, 64, 0), "minecraft:stone");
78
- setblock((3, 64, 0), "minecraft:stone");
79
- }
80
- `;
81
- const result = (0, index_1.compile)(source, { namespace: 'test' });
82
- const fn = getFileContent(result.files, 'data/test/function/build.mcfunction');
83
- expect(fn).toContain('fill 0 64 0 3 64 0 minecraft:stone');
84
- expect(fn).not.toContain('setblock 1 64 0 minecraft:stone');
85
- });
86
- test('does not merge setblocks with different blocks', () => {
87
- const source = `
88
- fn build() {
89
- setblock((0, 64, 0), "minecraft:stone");
90
- setblock((1, 64, 0), "minecraft:dirt");
91
- }
92
- `;
93
- const result = (0, index_1.compile)(source, { namespace: 'test' });
94
- const fn = getFileContent(result.files, 'data/test/function/build.mcfunction');
95
- expect(fn).toContain('setblock 0 64 0 minecraft:stone');
96
- expect(fn).toContain('setblock 1 64 0 minecraft:dirt');
97
- expect(fn).not.toContain('fill 0 64 0 1 64 0');
98
- });
99
- test('does not merge non-adjacent setblocks', () => {
100
- const source = `
101
- fn build() {
102
- setblock((0, 64, 0), "minecraft:stone");
103
- setblock((2, 64, 0), "minecraft:stone");
104
- }
105
- `;
106
- const result = (0, index_1.compile)(source, { namespace: 'test' });
107
- const fn = getFileContent(result.files, 'data/test/function/build.mcfunction');
108
- expect(fn).toContain('setblock 0 64 0 minecraft:stone');
109
- expect(fn).toContain('setblock 2 64 0 minecraft:stone');
110
- expect(fn).not.toContain('fill 0 64 0 2 64 0');
111
- });
112
- test('applies batching to structure target output too', () => {
113
- const source = `
114
- fn build() {
115
- setblock((0, 64, 0), "minecraft:stone");
116
- setblock((1, 64, 0), "minecraft:stone");
117
- setblock((2, 64, 0), "minecraft:stone");
118
- }
119
- `;
120
- const result = (0, structure_1.compileToStructure)(source, 'test');
121
- expect(result.blocks.some(block => block.command === 'fill 0 64 0 2 64 0 minecraft:stone')).toBe(true);
122
- });
123
- });
124
- //# sourceMappingURL=optimizer-advanced.test.js.map
@@ -1 +0,0 @@
1
- export {};
@@ -1,149 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const passes_1 = require("../optimizer/passes");
4
- function makeFn(instrs, term = { op: 'return' }) {
5
- return {
6
- name: 'test',
7
- params: [],
8
- locals: [],
9
- blocks: [{ label: 'entry', instrs, term }],
10
- };
11
- }
12
- describe('constantFolding', () => {
13
- it('folds 2 + 3 → 5', () => {
14
- const fn = makeFn([
15
- { op: 'binop', dst: '$x', lhs: { kind: 'const', value: 2 }, bop: '+', rhs: { kind: 'const', value: 3 } },
16
- ]);
17
- const opt = (0, passes_1.constantFolding)(fn);
18
- expect(opt.blocks[0].instrs[0]).toEqual({
19
- op: 'assign', dst: '$x', src: { kind: 'const', value: 5 },
20
- });
21
- });
22
- it('folds 10 / 3 → 3 (truncated int division)', () => {
23
- const fn = makeFn([
24
- { op: 'binop', dst: '$x', lhs: { kind: 'const', value: 10 }, bop: '/', rhs: { kind: 'const', value: 3 } },
25
- ]);
26
- const opt = (0, passes_1.constantFolding)(fn);
27
- expect(opt.blocks[0].instrs[0].src.value).toBe(3);
28
- });
29
- it('folds cmp 5 == 5 → 1', () => {
30
- const fn = makeFn([
31
- { op: 'cmp', dst: '$r', lhs: { kind: 'const', value: 5 }, cop: '==', rhs: { kind: 'const', value: 5 } },
32
- ]);
33
- const opt = (0, passes_1.constantFolding)(fn);
34
- expect(opt.blocks[0].instrs[0].src.value).toBe(1);
35
- });
36
- it('folds cmp 5 > 10 → 0', () => {
37
- const fn = makeFn([
38
- { op: 'cmp', dst: '$r', lhs: { kind: 'const', value: 5 }, cop: '>', rhs: { kind: 'const', value: 10 } },
39
- ]);
40
- const opt = (0, passes_1.constantFolding)(fn);
41
- expect(opt.blocks[0].instrs[0].src.value).toBe(0);
42
- });
43
- it('does not fold division by zero', () => {
44
- const fn = makeFn([
45
- { op: 'binop', dst: '$x', lhs: { kind: 'const', value: 5 }, bop: '/', rhs: { kind: 'const', value: 0 } },
46
- ]);
47
- const opt = (0, passes_1.constantFolding)(fn);
48
- expect(opt.blocks[0].instrs[0].op).toBe('binop');
49
- });
50
- });
51
- describe('copyPropagation', () => {
52
- it('propagates simple copy', () => {
53
- const fn = makeFn([
54
- { op: 'assign', dst: '$t0', src: { kind: 'var', name: '$x' } },
55
- { op: 'binop', dst: '$y', lhs: { kind: 'var', name: '$t0' }, bop: '+', rhs: { kind: 'const', value: 1 } },
56
- ]);
57
- const opt = (0, passes_1.copyPropagation)(fn);
58
- const binop = opt.blocks[0].instrs[1];
59
- expect(binop.lhs).toEqual({ kind: 'var', name: '$x' });
60
- });
61
- it('propagates constant copies', () => {
62
- const fn = makeFn([
63
- { op: 'assign', dst: '$t0', src: { kind: 'const', value: 42 } },
64
- { op: 'assign', dst: '$y', src: { kind: 'var', name: '$t0' } },
65
- ]);
66
- const opt = (0, passes_1.copyPropagation)(fn);
67
- const second = opt.blocks[0].instrs[1];
68
- expect(second.src).toEqual({ kind: 'const', value: 42 });
69
- });
70
- });
71
- describe('deadCodeElimination', () => {
72
- it('removes unused assignment', () => {
73
- const fn = makeFn([
74
- { op: 'assign', dst: '$t0', src: { kind: 'const', value: 99 } }, // unused temp
75
- { op: 'assign', dst: '$t1', src: { kind: 'const', value: 1 } }, // used temp
76
- ], { op: 'return', value: { kind: 'var', name: '$t1' } });
77
- const opt = (0, passes_1.deadCodeElimination)(fn);
78
- expect(opt.blocks[0].instrs).toHaveLength(1);
79
- expect(opt.blocks[0].instrs[0].dst).toBe('$t1');
80
- });
81
- it('keeps call even if return value unused (side effects)', () => {
82
- const fn = makeFn([
83
- { op: 'call', fn: 'foo', args: [], dst: '$unused' },
84
- ]);
85
- const opt = (0, passes_1.deadCodeElimination)(fn);
86
- expect(opt.blocks[0].instrs).toHaveLength(1);
87
- });
88
- it('keeps assignments referenced by raw commands', () => {
89
- const fn = makeFn([
90
- { op: 'assign', dst: '$used_by_raw', src: { kind: 'const', value: 7 } },
91
- { op: 'raw', cmd: 'execute store result score player obj run scoreboard players get $used_by_raw rs' },
92
- ]);
93
- const opt = (0, passes_1.deadCodeElimination)(fn);
94
- expect(opt.blocks[0].instrs).toHaveLength(2);
95
- expect(opt.blocks[0].instrs[0].dst).toBe('$used_by_raw');
96
- });
97
- });
98
- describe('copyPropagation – stale alias invalidation', () => {
99
- it('does not propagate $tmp = $y after $y is overwritten (swap pattern)', () => {
100
- // Simulates: let tmp = y; y = x % y; x = tmp
101
- // The copy $tmp = $y must be invalidated when $y is reassigned.
102
- // Before fix: x = tmp was propagated to x = y (new y, wrong value).
103
- const fn = makeFn([
104
- { op: 'assign', dst: '$tmp', src: { kind: 'var', name: '$y' } }, // tmp = y
105
- { op: 'binop', dst: '$r', lhs: { kind: 'var', name: '$x' }, bop: '%', rhs: { kind: 'var', name: '$y' } }, // r = x%y
106
- { op: 'assign', dst: '$y', src: { kind: 'var', name: '$r' } }, // y = r ← stale: tmp still points to OLD y
107
- { op: 'assign', dst: '$x', src: { kind: 'var', name: '$tmp' } }, // x = tmp (should NOT be x = y)
108
- ]);
109
- const opt = (0, passes_1.copyPropagation)(fn);
110
- const instrs = opt.blocks[0].instrs;
111
- const xAssign = instrs.find((i) => i.dst === '$x');
112
- // x = tmp must NOT be optimised to x = $y (stale) or x = $r (new y).
113
- // It should stay as x = $tmp (the original copy).
114
- expect(xAssign.src).toEqual({ kind: 'var', name: '$tmp' });
115
- });
116
- it('still propagates simple non-conflicting copies', () => {
117
- // a = 5; b = a; c = b → after propagation b and c should both be const 5
118
- const fn = makeFn([
119
- { op: 'assign', dst: '$a', src: { kind: 'const', value: 5 } },
120
- { op: 'assign', dst: '$b', src: { kind: 'var', name: '$a' } },
121
- { op: 'assign', dst: '$c', src: { kind: 'var', name: '$b' } },
122
- ]);
123
- const opt = (0, passes_1.copyPropagation)(fn);
124
- const instrs = opt.blocks[0].instrs;
125
- const cAssign = instrs.find((i) => i.dst === '$c');
126
- expect(cAssign.src).toEqual({ kind: 'const', value: 5 });
127
- });
128
- });
129
- describe('optimize pipeline', () => {
130
- it('combines all passes', () => {
131
- // t0 = 2 + 3 (→ constant fold → t0 = 5)
132
- // x = t0 (→ copy prop → x = 5)
133
- // unused = 0 (→ DCE → removed)
134
- // return x
135
- const fn = makeFn([
136
- { op: 'binop', dst: '$t0', lhs: { kind: 'const', value: 2 }, bop: '+', rhs: { kind: 'const', value: 3 } },
137
- { op: 'assign', dst: '$x', src: { kind: 'var', name: '$t0' } },
138
- { op: 'assign', dst: '$t1', src: { kind: 'const', value: 0 } }, // unused temp, should be removed
139
- ], { op: 'return', value: { kind: 'var', name: '$x' } });
140
- const opt = (0, passes_1.optimize)(fn);
141
- const instrs = opt.blocks[0].instrs;
142
- // $t1 (unused temp) should be gone
143
- expect(instrs.some((i) => i.dst === '$t1')).toBe(false);
144
- // $x should be const 5 (after folding + propagation)
145
- const xInstr = instrs.find((i) => i.dst === '$x');
146
- expect(xInstr?.src).toEqual({ kind: 'const', value: 5 });
147
- });
148
- });
149
- //# sourceMappingURL=optimizer.test.js.map