redscript-mc 1.2.30 → 2.1.0

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 (593) hide show
  1. package/.claudeignore +21 -0
  2. package/.github/workflows/ci.yml +1 -0
  3. package/README.md +12 -16
  4. package/README.zh.md +2 -2
  5. package/demo.gif +0 -0
  6. package/dist/cli.js +2 -554
  7. package/dist/compile.js +2 -266
  8. package/dist/index.js +2 -159
  9. package/dist/src/__tests__/budget.test.js +261 -0
  10. package/dist/src/__tests__/cli.test.js +104 -0
  11. package/dist/{__tests__ → src/__tests__}/dce.test.js +11 -47
  12. package/dist/{__tests__ → src/__tests__}/diagnostics.test.js +67 -40
  13. package/dist/src/__tests__/e2e/basic.test.d.ts +8 -0
  14. package/dist/src/__tests__/e2e/basic.test.js +140 -0
  15. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  16. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  17. package/dist/src/__tests__/e2e/macros.test.d.ts +9 -0
  18. package/dist/src/__tests__/e2e/macros.test.js +182 -0
  19. package/dist/src/__tests__/e2e/migrate.test.d.ts +13 -0
  20. package/dist/src/__tests__/e2e/migrate.test.js +2739 -0
  21. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  22. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  23. package/dist/src/__tests__/enum.test.d.ts +10 -0
  24. package/dist/src/__tests__/enum.test.js +389 -0
  25. package/dist/src/__tests__/generics.test.d.ts +14 -0
  26. package/dist/src/__tests__/generics.test.js +367 -0
  27. package/dist/src/__tests__/hir/desugar.test.js +234 -0
  28. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  29. package/dist/src/__tests__/incremental.test.js +308 -0
  30. package/dist/src/__tests__/lir/lower.test.js +559 -0
  31. package/dist/src/__tests__/lir/types.test.js +185 -0
  32. package/dist/src/__tests__/lir/verify.test.js +221 -0
  33. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  34. package/dist/src/__tests__/lsp.test.js +245 -0
  35. package/dist/{__tests__ → src/__tests__}/mc-integration.test.js +1 -3
  36. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  37. package/dist/src/__tests__/mc-version.test.js +154 -0
  38. package/dist/src/__tests__/mir/arithmetic.test.js +130 -0
  39. package/dist/src/__tests__/mir/control-flow.test.js +205 -0
  40. package/dist/src/__tests__/mir/verify.test.js +223 -0
  41. package/dist/src/__tests__/modules.test.d.ts +7 -0
  42. package/dist/src/__tests__/modules.test.js +333 -0
  43. package/dist/src/__tests__/optimizer/block_merge.test.js +78 -0
  44. package/dist/src/__tests__/optimizer/branch_simplify.test.js +58 -0
  45. package/dist/src/__tests__/optimizer/constant_fold.test.js +131 -0
  46. package/dist/src/__tests__/optimizer/copy_prop.test.js +91 -0
  47. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  48. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  49. package/dist/src/__tests__/optimizer/dce.test.d.ts +1 -0
  50. package/dist/src/__tests__/optimizer/dce.test.js +76 -0
  51. package/dist/src/__tests__/optimizer/interprocedural.test.d.ts +1 -0
  52. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  53. package/dist/src/__tests__/optimizer/lir/const_imm.test.d.ts +1 -0
  54. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  55. package/dist/src/__tests__/optimizer/lir/dead_slot.test.d.ts +1 -0
  56. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  57. package/dist/src/__tests__/optimizer/lir/peephole.test.d.ts +1 -0
  58. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  59. package/dist/src/__tests__/optimizer/lir/pipeline.test.d.ts +1 -0
  60. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  61. package/dist/src/__tests__/optimizer/nbt-batch.test.d.ts +1 -0
  62. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  63. package/dist/src/__tests__/optimizer/pipeline.test.d.ts +1 -0
  64. package/dist/src/__tests__/optimizer/pipeline.test.js +102 -0
  65. package/dist/src/__tests__/optimizer/selector-cache.test.d.ts +1 -0
  66. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  67. package/dist/src/__tests__/optimizer/unroll.test.d.ts +1 -0
  68. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  69. package/dist/src/__tests__/option.test.d.ts +14 -0
  70. package/dist/src/__tests__/option.test.js +275 -0
  71. package/dist/src/__tests__/parser.test.d.ts +1 -0
  72. package/dist/src/__tests__/repl.test.d.ts +1 -0
  73. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  74. package/dist/src/__tests__/schedule.test.js +98 -0
  75. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  76. package/dist/src/__tests__/sourcemap.test.js +227 -0
  77. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  78. package/dist/src/__tests__/tuple.test.js +202 -0
  79. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  80. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  81. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  82. package/dist/{ast → src/ast}/types.d.ts +58 -3
  83. package/dist/src/cache/deps.d.ts +41 -0
  84. package/dist/src/cache/deps.js +158 -0
  85. package/dist/src/cache/incremental.d.ts +35 -0
  86. package/dist/src/cache/incremental.js +165 -0
  87. package/dist/src/cache/index.d.ts +37 -0
  88. package/dist/src/cache/index.js +152 -0
  89. package/dist/{cli.d.ts → src/cli.d.ts} +1 -1
  90. package/dist/src/cli.js +474 -0
  91. package/dist/src/compile.d.ts +37 -0
  92. package/dist/src/compile.js +165 -0
  93. package/dist/{diagnostics → src/diagnostics}/index.d.ts +1 -1
  94. package/dist/{diagnostics → src/diagnostics}/index.js +8 -11
  95. package/dist/src/emit/compile.d.ts +29 -0
  96. package/dist/src/emit/compile.js +143 -0
  97. package/dist/src/emit/index.d.ts +26 -0
  98. package/dist/src/emit/index.js +223 -0
  99. package/dist/src/emit/modules.d.ts +29 -0
  100. package/dist/src/emit/modules.js +492 -0
  101. package/dist/src/emit/sourcemap.d.ts +53 -0
  102. package/dist/src/emit/sourcemap.js +73 -0
  103. package/dist/src/hir/lower.d.ts +15 -0
  104. package/dist/src/hir/lower.js +399 -0
  105. package/dist/src/hir/monomorphize.d.ts +22 -0
  106. package/dist/src/hir/monomorphize.js +379 -0
  107. package/dist/src/hir/types.d.ts +406 -0
  108. package/dist/src/hir/types.js +16 -0
  109. package/dist/src/index.d.ts +39 -0
  110. package/dist/src/index.js +67 -0
  111. package/dist/{lexer → src/lexer}/index.d.ts +1 -1
  112. package/dist/{lexer → src/lexer}/index.js +1 -0
  113. package/dist/src/lir/budget.d.ts +37 -0
  114. package/dist/src/lir/budget.js +280 -0
  115. package/dist/src/lir/lower.d.ts +15 -0
  116. package/dist/src/lir/lower.js +472 -0
  117. package/dist/src/lir/types.d.ts +139 -0
  118. package/dist/src/lir/types.js +11 -0
  119. package/dist/src/lir/verify.d.ts +14 -0
  120. package/dist/src/lir/verify.js +113 -0
  121. package/dist/src/lsp/main.d.ts +8 -0
  122. package/dist/src/lsp/main.js +11 -0
  123. package/dist/src/lsp/server.d.ts +11 -0
  124. package/dist/src/lsp/server.js +352 -0
  125. package/dist/{mc-test → src/mc-test}/runner.js +4 -3
  126. package/dist/src/mir/lower.d.ts +9 -0
  127. package/dist/src/mir/lower.js +1264 -0
  128. package/dist/src/mir/macro.d.ts +22 -0
  129. package/dist/src/mir/macro.js +168 -0
  130. package/dist/src/mir/types.d.ts +191 -0
  131. package/dist/src/mir/types.js +11 -0
  132. package/dist/src/mir/verify.d.ts +16 -0
  133. package/dist/src/mir/verify.js +216 -0
  134. package/dist/src/optimizer/block_merge.d.ts +12 -0
  135. package/dist/src/optimizer/block_merge.js +84 -0
  136. package/dist/src/optimizer/branch_simplify.d.ts +9 -0
  137. package/dist/src/optimizer/branch_simplify.js +28 -0
  138. package/dist/src/optimizer/constant_fold.d.ts +10 -0
  139. package/dist/src/optimizer/constant_fold.js +85 -0
  140. package/dist/src/optimizer/copy_prop.d.ts +9 -0
  141. package/dist/src/optimizer/copy_prop.js +113 -0
  142. package/dist/src/optimizer/coroutine.d.ts +34 -0
  143. package/dist/src/optimizer/coroutine.js +789 -0
  144. package/dist/src/optimizer/dce.d.ts +8 -0
  145. package/dist/src/optimizer/dce.js +156 -0
  146. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  147. package/dist/src/optimizer/interprocedural.js +186 -0
  148. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  149. package/dist/src/optimizer/lir/const_imm.js +139 -0
  150. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  151. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  152. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  153. package/dist/src/optimizer/lir/peephole.js +52 -0
  154. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  155. package/dist/src/optimizer/lir/pipeline.js +34 -0
  156. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  157. package/dist/src/optimizer/nbt-batch.js +51 -0
  158. package/dist/src/optimizer/pipeline.d.ts +14 -0
  159. package/dist/src/optimizer/pipeline.js +58 -0
  160. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  161. package/dist/src/optimizer/selector-cache.js +100 -0
  162. package/dist/src/optimizer/unroll.d.ts +32 -0
  163. package/dist/src/optimizer/unroll.js +348 -0
  164. package/dist/{parser → src/parser}/index.d.ts +8 -0
  165. package/dist/{parser → src/parser}/index.js +204 -14
  166. package/dist/{repl.d.ts → src/repl.d.ts} +1 -1
  167. package/dist/{runtime → src/runtime}/index.js +1 -1
  168. package/dist/{typechecker → src/typechecker}/index.d.ts +4 -0
  169. package/dist/{typechecker → src/typechecker}/index.js +198 -13
  170. package/dist/src/types/mc-version.d.ts +24 -0
  171. package/dist/src/types/mc-version.js +49 -0
  172. package/docs/ROADMAP.md +395 -0
  173. package/docs/compiler-pipeline-redesign.md +2260 -0
  174. package/docs/optimization-ideas.md +1076 -0
  175. package/editors/vscode/out/extension.js +25176 -8000
  176. package/editors/vscode/package-lock.json +90 -6
  177. package/editors/vscode/package.json +3 -2
  178. package/editors/vscode/src/extension.ts +97 -67
  179. package/examples/showcase.mcrs +3 -3
  180. package/package.json +13 -6
  181. package/scripts/postbuild.js +15 -0
  182. package/src/__tests__/budget.test.ts +297 -0
  183. package/src/__tests__/cli.test.ts +8 -220
  184. package/src/__tests__/dce.test.ts +11 -56
  185. package/src/__tests__/diagnostics.test.ts +61 -41
  186. package/src/__tests__/e2e/basic.test.ts +154 -0
  187. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  188. package/src/__tests__/e2e/macros.test.ts +199 -0
  189. package/src/__tests__/e2e/migrate.test.ts +3008 -0
  190. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  191. package/src/__tests__/enum.test.ts +425 -0
  192. package/src/__tests__/generics.test.ts +390 -0
  193. package/src/__tests__/hir/desugar.test.ts +263 -0
  194. package/src/__tests__/incremental.test.ts +337 -0
  195. package/src/__tests__/lir/lower.test.ts +619 -0
  196. package/src/__tests__/lir/types.test.ts +207 -0
  197. package/src/__tests__/lir/verify.test.ts +249 -0
  198. package/src/__tests__/lsp.test.ts +270 -0
  199. package/src/__tests__/mc-integration.test.ts +1 -2
  200. package/src/__tests__/mc-version.test.ts +178 -0
  201. package/src/__tests__/mir/arithmetic.test.ts +156 -0
  202. package/src/__tests__/mir/control-flow.test.ts +242 -0
  203. package/src/__tests__/mir/verify.test.ts +254 -0
  204. package/src/__tests__/modules.test.ts +365 -0
  205. package/src/__tests__/optimizer/block_merge.test.ts +84 -0
  206. package/src/__tests__/optimizer/branch_simplify.test.ts +64 -0
  207. package/src/__tests__/optimizer/constant_fold.test.ts +145 -0
  208. package/src/__tests__/optimizer/copy_prop.test.ts +99 -0
  209. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  210. package/src/__tests__/optimizer/dce.test.ts +83 -0
  211. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  212. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  213. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  214. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  215. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  216. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  217. package/src/__tests__/optimizer/pipeline.test.ts +116 -0
  218. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  219. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  220. package/src/__tests__/option.test.ts +299 -0
  221. package/src/__tests__/schedule.test.ts +105 -0
  222. package/src/__tests__/sourcemap.test.ts +254 -0
  223. package/src/__tests__/tuple.test.ts +220 -0
  224. package/src/__tests__/typechecker-strict.test.ts +216 -0
  225. package/src/ast/types.ts +39 -3
  226. package/src/cache/deps.ts +132 -0
  227. package/src/cache/incremental.ts +173 -0
  228. package/src/cache/index.ts +135 -0
  229. package/src/cli.ts +111 -195
  230. package/src/compile.ts +6 -162
  231. package/src/diagnostics/index.ts +8 -11
  232. package/src/emit/compile.ts +177 -0
  233. package/src/emit/index.ts +286 -0
  234. package/src/emit/modules.ts +581 -0
  235. package/src/emit/sourcemap.ts +101 -0
  236. package/src/hir/lower.ts +455 -0
  237. package/src/hir/monomorphize.ts +416 -0
  238. package/src/hir/types.ts +228 -0
  239. package/src/index.ts +37 -182
  240. package/src/lexer/index.ts +2 -1
  241. package/src/lir/budget.ts +321 -0
  242. package/src/lir/lower.ts +587 -0
  243. package/src/lir/types.ts +113 -0
  244. package/src/lir/verify.ts +129 -0
  245. package/src/lsp/main.ts +9 -0
  246. package/src/lsp/server.ts +414 -0
  247. package/src/mc-test/runner.ts +4 -3
  248. package/src/mir/lower.ts +1403 -0
  249. package/src/mir/macro.ts +167 -0
  250. package/src/mir/types.ts +117 -0
  251. package/src/mir/verify.ts +218 -0
  252. package/src/optimizer/block_merge.ts +93 -0
  253. package/src/optimizer/branch_simplify.ts +27 -0
  254. package/src/optimizer/constant_fold.ts +88 -0
  255. package/src/optimizer/copy_prop.ts +106 -0
  256. package/src/optimizer/coroutine.ts +996 -0
  257. package/src/optimizer/dce.ts +108 -653
  258. package/src/optimizer/interprocedural.ts +177 -0
  259. package/src/optimizer/lir/const_imm.ts +143 -0
  260. package/src/optimizer/lir/dead_slot.ts +123 -0
  261. package/src/optimizer/lir/peephole.ts +57 -0
  262. package/src/optimizer/lir/pipeline.ts +37 -0
  263. package/src/optimizer/nbt-batch.ts +50 -0
  264. package/src/optimizer/pipeline.ts +59 -0
  265. package/src/optimizer/selector-cache.ts +103 -0
  266. package/src/optimizer/unroll.ts +386 -0
  267. package/src/parser/index.ts +213 -16
  268. package/src/repl.ts +1 -1
  269. package/src/runtime/index.ts +1 -1
  270. package/src/stdlib/math.mcrs +4 -4
  271. package/src/templates/quest.mcrs +4 -4
  272. package/src/typechecker/index.ts +215 -15
  273. package/src/types/mc-version.ts +46 -0
  274. package/tsconfig.json +1 -1
  275. package/dist/__tests__/cli.test.js +0 -278
  276. package/dist/__tests__/codegen.test.js +0 -152
  277. package/dist/__tests__/e2e.test.d.ts +0 -6
  278. package/dist/__tests__/e2e.test.js +0 -1847
  279. package/dist/__tests__/entity-types.test.js +0 -203
  280. package/dist/__tests__/lowering.test.js +0 -1015
  281. package/dist/__tests__/macro.test.d.ts +0 -8
  282. package/dist/__tests__/macro.test.js +0 -305
  283. package/dist/__tests__/nbt.test.js +0 -82
  284. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  285. package/dist/__tests__/optimizer.test.js +0 -149
  286. package/dist/__tests__/runtime.test.js +0 -289
  287. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  288. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  289. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  290. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  291. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  292. package/dist/__tests__/stdlib-math.test.js +0 -352
  293. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  294. package/dist/__tests__/stdlib-vec.test.js +0 -264
  295. package/dist/__tests__/structure-optimizer.test.js +0 -33
  296. package/dist/__tests__/var-allocator.test.js +0 -69
  297. package/dist/codegen/cmdblock/index.d.ts +0 -26
  298. package/dist/codegen/cmdblock/index.js +0 -45
  299. package/dist/codegen/mcfunction/index.d.ts +0 -40
  300. package/dist/codegen/mcfunction/index.js +0 -606
  301. package/dist/codegen/structure/index.d.ts +0 -24
  302. package/dist/codegen/structure/index.js +0 -279
  303. package/dist/codegen/var-allocator.d.ts +0 -45
  304. package/dist/codegen/var-allocator.js +0 -104
  305. package/dist/compile.d.ts +0 -68
  306. package/dist/data/arena/function/__load.mcfunction +0 -6
  307. package/dist/data/arena/function/__tick.mcfunction +0 -2
  308. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  309. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  310. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  311. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  312. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  313. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  314. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  315. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  316. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  317. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  318. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  319. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  320. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  321. package/dist/data/counter/function/__load.mcfunction +0 -5
  322. package/dist/data/counter/function/__tick.mcfunction +0 -2
  323. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  324. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  325. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  326. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  327. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  328. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  329. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  330. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  331. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  332. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  333. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  334. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  335. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  336. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  337. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  338. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  339. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  340. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  341. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  342. package/dist/data/gcd3/function/test.mcfunction +0 -7
  343. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  344. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  345. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  346. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  347. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  348. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  349. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  350. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  351. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  352. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  353. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  354. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  355. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  356. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  357. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  358. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  359. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  360. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  361. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  362. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  363. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  364. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  365. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  366. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  367. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  368. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  369. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  370. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  371. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  372. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  373. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  374. package/dist/data/mathtest/function/test.mcfunction +0 -5
  375. package/dist/data/minecraft/tags/function/load.json +0 -5
  376. package/dist/data/minecraft/tags/function/tick.json +0 -5
  377. package/dist/data/mypack/function/__load.mcfunction +0 -13
  378. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  379. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  380. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  381. package/dist/data/mypack/function/abs.mcfunction +0 -6
  382. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  383. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  384. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  385. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  386. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  387. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  388. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  389. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  390. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  391. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  392. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  393. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  394. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  395. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  396. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  397. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  398. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  399. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  400. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  401. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  402. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  403. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  404. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  405. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  406. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  407. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  408. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  409. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  410. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  411. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  412. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  413. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  414. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  415. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  416. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  417. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  418. package/dist/data/quiz/function/__load.mcfunction +0 -16
  419. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  420. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  421. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  422. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  423. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  424. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  425. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  426. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  427. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  428. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  429. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  430. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  431. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  432. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  433. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  434. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  435. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  436. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  437. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  438. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  439. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  440. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  441. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  442. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  443. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  444. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  445. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  446. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  447. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  448. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  449. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  450. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  451. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  452. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  453. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  454. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  455. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  456. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  457. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  458. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  459. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  460. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  461. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  462. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  463. package/dist/data/runtime/function/__load.mcfunction +0 -5
  464. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  465. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  466. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  467. package/dist/data/shop/function/__load.mcfunction +0 -7
  468. package/dist/data/shop/function/__tick.mcfunction +0 -3
  469. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  470. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  471. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  472. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  473. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  474. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  475. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  476. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  477. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  478. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  479. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  480. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  481. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  482. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  483. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  484. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  485. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  486. package/dist/data/turret/function/__load.mcfunction +0 -5
  487. package/dist/data/turret/function/__tick.mcfunction +0 -4
  488. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  489. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  490. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  491. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  492. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  493. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  494. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  495. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  496. package/dist/gcd2.map.json +0 -15
  497. package/dist/gcd3.map.json +0 -17
  498. package/dist/gcd_test.map.json +0 -15
  499. package/dist/index.d.ts +0 -62
  500. package/dist/ir/builder.d.ts +0 -33
  501. package/dist/ir/builder.js +0 -99
  502. package/dist/ir/types.d.ts +0 -132
  503. package/dist/ir/types.js +0 -15
  504. package/dist/isqrttest.map.json +0 -15
  505. package/dist/lowering/index.d.ts +0 -188
  506. package/dist/lowering/index.js +0 -3403
  507. package/dist/mathtest.map.json +0 -6
  508. package/dist/mypack.map.json +0 -27
  509. package/dist/optimizer/commands.d.ts +0 -38
  510. package/dist/optimizer/commands.js +0 -451
  511. package/dist/optimizer/dce.d.ts +0 -34
  512. package/dist/optimizer/dce.js +0 -639
  513. package/dist/optimizer/passes.d.ts +0 -34
  514. package/dist/optimizer/passes.js +0 -243
  515. package/dist/optimizer/structure.d.ts +0 -9
  516. package/dist/optimizer/structure.js +0 -356
  517. package/dist/pack.mcmeta +0 -6
  518. package/dist/reqtest.map.json +0 -4
  519. package/dist/reqtest2.map.json +0 -4
  520. package/dist/runtime.map.json +0 -7
  521. package/dist/swap_test.map.json +0 -14
  522. package/src/__tests__/codegen.test.ts +0 -161
  523. package/src/__tests__/e2e.test.ts +0 -2039
  524. package/src/__tests__/entity-types.test.ts +0 -236
  525. package/src/__tests__/lowering.test.ts +0 -1185
  526. package/src/__tests__/macro.test.ts +0 -343
  527. package/src/__tests__/nbt.test.ts +0 -58
  528. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  529. package/src/__tests__/optimizer.test.ts +0 -162
  530. package/src/__tests__/runtime.test.ts +0 -305
  531. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  532. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  533. package/src/__tests__/stdlib-math.test.ts +0 -374
  534. package/src/__tests__/stdlib-vec.test.ts +0 -259
  535. package/src/__tests__/structure-optimizer.test.ts +0 -38
  536. package/src/__tests__/var-allocator.test.ts +0 -75
  537. package/src/codegen/cmdblock/index.ts +0 -63
  538. package/src/codegen/mcfunction/index.ts +0 -662
  539. package/src/codegen/structure/index.ts +0 -346
  540. package/src/codegen/var-allocator.ts +0 -104
  541. package/src/ir/builder.ts +0 -116
  542. package/src/ir/types.ts +0 -134
  543. package/src/lowering/index.ts +0 -3876
  544. package/src/optimizer/commands.ts +0 -534
  545. package/src/optimizer/passes.ts +0 -250
  546. package/src/optimizer/structure.ts +0 -450
  547. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  548. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/cli.test.d.ts} +0 -0
  549. /package/dist/{__tests__ → src/__tests__}/compile-all.test.d.ts +0 -0
  550. /package/dist/{__tests__ → src/__tests__}/compile-all.test.js +0 -0
  551. /package/dist/{__tests__ → src/__tests__}/dce.test.d.ts +0 -0
  552. /package/dist/{__tests__ → src/__tests__}/diagnostics.test.d.ts +0 -0
  553. /package/dist/{__tests__ → src/__tests__}/formatter.test.d.ts +0 -0
  554. /package/dist/{__tests__ → src/__tests__}/formatter.test.js +0 -0
  555. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/hir/desugar.test.d.ts} +0 -0
  556. /package/dist/{__tests__ → src/__tests__}/lexer.test.d.ts +0 -0
  557. /package/dist/{__tests__ → src/__tests__}/lexer.test.js +0 -0
  558. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/lir/lower.test.d.ts} +0 -0
  559. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/lir/types.test.d.ts} +0 -0
  560. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/lir/verify.test.d.ts} +0 -0
  561. /package/dist/{__tests__ → src/__tests__}/mc-integration.test.d.ts +0 -0
  562. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/mc-syntax.test.d.ts} +0 -0
  563. /package/dist/{__tests__ → src/__tests__}/mc-syntax.test.js +0 -0
  564. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/mir/arithmetic.test.d.ts} +0 -0
  565. /package/dist/{__tests__/parser.test.d.ts → src/__tests__/mir/control-flow.test.d.ts} +0 -0
  566. /package/dist/{__tests__/repl.test.d.ts → src/__tests__/mir/verify.test.d.ts} +0 -0
  567. /package/dist/{__tests__/runtime.test.d.ts → src/__tests__/optimizer/block_merge.test.d.ts} +0 -0
  568. /package/dist/{__tests__/structure-optimizer.test.d.ts → src/__tests__/optimizer/branch_simplify.test.d.ts} +0 -0
  569. /package/dist/{__tests__/typechecker.test.d.ts → src/__tests__/optimizer/constant_fold.test.d.ts} +0 -0
  570. /package/dist/{__tests__/var-allocator.test.d.ts → src/__tests__/optimizer/copy_prop.test.d.ts} +0 -0
  571. /package/dist/{__tests__ → src/__tests__}/parser.test.js +0 -0
  572. /package/dist/{__tests__ → src/__tests__}/repl.test.js +0 -0
  573. /package/dist/{__tests__ → src/__tests__}/typechecker.test.js +0 -0
  574. /package/dist/{ast → src/ast}/types.js +0 -0
  575. /package/dist/{builtins → src/builtins}/metadata.d.ts +0 -0
  576. /package/dist/{builtins → src/builtins}/metadata.js +0 -0
  577. /package/dist/{events → src/events}/types.d.ts +0 -0
  578. /package/dist/{events → src/events}/types.js +0 -0
  579. /package/dist/{formatter → src/formatter}/index.d.ts +0 -0
  580. /package/dist/{formatter → src/formatter}/index.js +0 -0
  581. /package/dist/{mc-test → src/mc-test}/client.d.ts +0 -0
  582. /package/dist/{mc-test → src/mc-test}/client.js +0 -0
  583. /package/dist/{mc-test → src/mc-test}/runner.d.ts +0 -0
  584. /package/dist/{mc-test → src/mc-test}/setup.d.ts +0 -0
  585. /package/dist/{mc-test → src/mc-test}/setup.js +0 -0
  586. /package/dist/{mc-validator → src/mc-validator}/index.d.ts +0 -0
  587. /package/dist/{mc-validator → src/mc-validator}/index.js +0 -0
  588. /package/dist/{nbt → src/nbt}/index.d.ts +0 -0
  589. /package/dist/{nbt → src/nbt}/index.js +0 -0
  590. /package/dist/{repl.js → src/repl.js} +0 -0
  591. /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
  592. /package/dist/{types → src/types}/entity-hierarchy.d.ts +0 -0
  593. /package/dist/{types → src/types}/entity-hierarchy.js +0 -0
@@ -1,606 +0,0 @@
1
- "use strict";
2
- /**
3
- * Code generator: IR → mcfunction datapack
4
- *
5
- * Output structure:
6
- * <namespace>/
7
- * functions/
8
- * <fn_name>.mcfunction
9
- * <fn_name>/<block_label>.mcfunction (for control-flow continuations)
10
- * load.mcfunction (objective setup)
11
- *
12
- * Variable mapping:
13
- * scoreboard objective: "rs"
14
- * fake player: "$<varname>"
15
- * temporaries: "$_0", "$_1", ...
16
- * return value: "$ret"
17
- * parameters: "$p0", "$p1", ...
18
- */
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.countMcfunctionCommands = countMcfunctionCommands;
21
- exports.generateDatapackWithStats = generateDatapackWithStats;
22
- exports.generateDatapack = generateDatapack;
23
- const commands_1 = require("../../optimizer/commands");
24
- const types_1 = require("../../events/types");
25
- const var_allocator_1 = require("../var-allocator");
26
- // ---------------------------------------------------------------------------
27
- // Utilities
28
- // ---------------------------------------------------------------------------
29
- // Default scoreboard objective — overridden per-compilation via DatapackGenerationOptions.scoreboardObjective
30
- let OBJ = 'rs';
31
- function operandToScore(op, alloc) {
32
- if (op.kind === 'var')
33
- return `${alloc.alloc(op.name)} ${OBJ}`;
34
- if (op.kind === 'const')
35
- return `${alloc.constant(op.value)} ${OBJ}`;
36
- if (op.kind === 'param')
37
- return `${alloc.internal(`p${op.index}`)} ${OBJ}`;
38
- throw new Error(`Cannot convert storage operand to score: ${op.path}`);
39
- }
40
- // Collect all constants used in a function for pre-setup
41
- function collectConsts(fn) {
42
- const consts = new Set();
43
- for (const block of fn.blocks) {
44
- for (const instr of block.instrs) {
45
- if (instr.op === 'assign' && instr.src.kind === 'const')
46
- consts.add(instr.src.value);
47
- if (instr.op === 'binop') {
48
- if (instr.lhs.kind === 'const')
49
- consts.add(instr.lhs.value);
50
- if (instr.rhs.kind === 'const')
51
- consts.add(instr.rhs.value);
52
- }
53
- if (instr.op === 'cmp') {
54
- if (instr.lhs.kind === 'const')
55
- consts.add(instr.lhs.value);
56
- if (instr.rhs.kind === 'const')
57
- consts.add(instr.rhs.value);
58
- }
59
- }
60
- const t = block.term;
61
- if (t.op === 'return' && t.value?.kind === 'const')
62
- consts.add(t.value.value);
63
- }
64
- return consts;
65
- }
66
- // MC scoreboard operation suffix
67
- const BOP_OP = {
68
- '+': '+=', '-': '-=', '*': '*=', '/': '/=', '%': '%=',
69
- };
70
- // ---------------------------------------------------------------------------
71
- // Instruction codegen
72
- // ---------------------------------------------------------------------------
73
- function emitInstr(instr, ns, alloc) {
74
- const lines = [];
75
- switch (instr.op) {
76
- case 'assign': {
77
- const dst = alloc.alloc(instr.dst);
78
- const src = instr.src;
79
- if (src.kind === 'const') {
80
- lines.push(`scoreboard players set ${dst} ${OBJ} ${src.value}`);
81
- }
82
- else if (src.kind === 'var') {
83
- lines.push(`scoreboard players operation ${dst} ${OBJ} = ${alloc.alloc(src.name)} ${OBJ}`);
84
- }
85
- else if (src.kind === 'param') {
86
- lines.push(`scoreboard players operation ${dst} ${OBJ} = ${alloc.internal(`p${src.index}`)} ${OBJ}`);
87
- }
88
- else {
89
- lines.push(`execute store result score ${dst} ${OBJ} run data get storage ${src.path}`);
90
- }
91
- break;
92
- }
93
- case 'binop': {
94
- const dst = alloc.alloc(instr.dst);
95
- const bop = BOP_OP[instr.bop] ?? '+=';
96
- // Copy lhs → dst, then apply op with rhs
97
- lines.push(...emitInstr({ op: 'assign', dst: instr.dst, src: instr.lhs }, ns, alloc));
98
- lines.push(`scoreboard players operation ${dst} ${OBJ} ${bop} ${operandToScore(instr.rhs, alloc)}`);
99
- break;
100
- }
101
- case 'cmp': {
102
- // MC doesn't have a direct compare-to-register; use execute store
103
- const dst = alloc.alloc(instr.dst);
104
- const lhsScore = operandToScore(instr.lhs, alloc);
105
- const rhsScore = operandToScore(instr.rhs, alloc);
106
- lines.push(`scoreboard players set ${dst} ${OBJ} 0`);
107
- switch (instr.cop) {
108
- case '==':
109
- lines.push(`execute if score ${lhsScore} = ${rhsScore} run scoreboard players set ${dst} ${OBJ} 1`);
110
- break;
111
- case '!=':
112
- lines.push(`execute unless score ${lhsScore} = ${rhsScore} run scoreboard players set ${dst} ${OBJ} 1`);
113
- break;
114
- case '<':
115
- lines.push(`execute if score ${lhsScore} < ${rhsScore} run scoreboard players set ${dst} ${OBJ} 1`);
116
- break;
117
- case '<=':
118
- lines.push(`execute if score ${lhsScore} <= ${rhsScore} run scoreboard players set ${dst} ${OBJ} 1`);
119
- break;
120
- case '>':
121
- lines.push(`execute if score ${lhsScore} > ${rhsScore} run scoreboard players set ${dst} ${OBJ} 1`);
122
- break;
123
- case '>=':
124
- lines.push(`execute if score ${lhsScore} >= ${rhsScore} run scoreboard players set ${dst} ${OBJ} 1`);
125
- break;
126
- }
127
- break;
128
- }
129
- case 'call': {
130
- // Push args into the internal parameter slots ($p0, $p1, ...).
131
- // We emit the copy commands directly (not via emitInstr/alloc.alloc) to
132
- // ensure the destination resolves to alloc.internal('p{i}') rather than
133
- // alloc.alloc('p{i}') which would create a *different* user-var slot.
134
- for (let i = 0; i < instr.args.length; i++) {
135
- const paramSlot = alloc.internal(`p${i}`);
136
- const arg = instr.args[i];
137
- if (arg.kind === 'const') {
138
- lines.push(`scoreboard players set ${paramSlot} ${OBJ} ${arg.value}`);
139
- }
140
- else if (arg.kind === 'var') {
141
- lines.push(`scoreboard players operation ${paramSlot} ${OBJ} = ${alloc.alloc(arg.name)} ${OBJ}`);
142
- }
143
- else if (arg.kind === 'param') {
144
- lines.push(`scoreboard players operation ${paramSlot} ${OBJ} = ${alloc.internal(`p${arg.index}`)} ${OBJ}`);
145
- }
146
- // storage args are rare for call sites; fall through to no-op
147
- }
148
- lines.push(`function ${ns}:${instr.fn}`);
149
- if (instr.dst) {
150
- const retSlot = alloc.internal('ret');
151
- lines.push(`scoreboard players operation ${alloc.alloc(instr.dst)} ${OBJ} = ${retSlot} ${OBJ}`);
152
- }
153
- break;
154
- }
155
- case 'raw': {
156
- // resolveRaw rewrites $var tokens that are registered in the allocator
157
- // so that mangle=true mode produces correct mangled names instead of
158
- // the raw IR names embedded by the lowering phase.
159
- // \x01 is a sentinel for the MC macro line-start '$' (used by
160
- // storage_get_int sub-functions). Replace it last, after resolveRaw,
161
- // so '$execute' is never treated as a variable reference.
162
- const rawResolved = alloc.resolveRaw(instr.cmd).replace(/^\x01/, '$');
163
- lines.push(rawResolved);
164
- break;
165
- }
166
- }
167
- return lines;
168
- }
169
- // ---------------------------------------------------------------------------
170
- // Terminator codegen
171
- // ---------------------------------------------------------------------------
172
- function emitTerm(term, ns, fnName, alloc) {
173
- const lines = [];
174
- switch (term.op) {
175
- case 'jump':
176
- lines.push(`function ${ns}:${fnName}/${term.target}`);
177
- break;
178
- case 'jump_if':
179
- lines.push(`execute if score ${alloc.alloc(term.cond)} ${OBJ} matches 1.. run function ${ns}:${fnName}/${term.then}`);
180
- lines.push(`execute if score ${alloc.alloc(term.cond)} ${OBJ} matches ..0 run function ${ns}:${fnName}/${term.else_}`);
181
- break;
182
- case 'jump_unless':
183
- lines.push(`execute if score ${alloc.alloc(term.cond)} ${OBJ} matches ..0 run function ${ns}:${fnName}/${term.then}`);
184
- lines.push(`execute if score ${alloc.alloc(term.cond)} ${OBJ} matches 1.. run function ${ns}:${fnName}/${term.else_}`);
185
- break;
186
- case 'return': {
187
- // Emit the copy to the shared return slot directly — do NOT go through
188
- // emitInstr/alloc.alloc(retSlot) which would allocate a *user* var slot
189
- // (different from the internal slot) and break mangle mode.
190
- const retSlot = alloc.internal('ret');
191
- if (term.value) {
192
- if (term.value.kind === 'const') {
193
- lines.push(`scoreboard players set ${retSlot} ${OBJ} ${term.value.value}`);
194
- }
195
- else if (term.value.kind === 'var') {
196
- lines.push(`scoreboard players operation ${retSlot} ${OBJ} = ${alloc.alloc(term.value.name)} ${OBJ}`);
197
- }
198
- else if (term.value.kind === 'param') {
199
- lines.push(`scoreboard players operation ${retSlot} ${OBJ} = ${alloc.internal(`p${term.value.index}`)} ${OBJ}`);
200
- }
201
- }
202
- // MC 1.20+: use `return` to propagate the value back to the caller's
203
- // `execute store result … run function …` without an extra scoreboard read.
204
- if (term.value?.kind === 'const') {
205
- lines.push(`return ${term.value.value}`);
206
- }
207
- else if (term.value?.kind === 'var') {
208
- lines.push(`return run scoreboard players get ${alloc.alloc(term.value.name)} ${OBJ}`);
209
- }
210
- else if (term.value?.kind === 'param') {
211
- lines.push(`return run scoreboard players get ${alloc.internal(`p${term.value.index}`)} ${OBJ}`);
212
- }
213
- break;
214
- }
215
- case 'tick_yield':
216
- lines.push(`schedule function ${ns}:${fnName}/${term.continuation} 1t replace`);
217
- break;
218
- }
219
- return lines;
220
- }
221
- function toFunctionName(file) {
222
- const match = file.path.match(/^data\/[^/]+\/function\/(.+)\.mcfunction$/);
223
- return match?.[1] ?? null;
224
- }
225
- function applyFunctionOptimization(files) {
226
- const functionFiles = files
227
- .map(file => {
228
- const functionName = toFunctionName(file);
229
- if (!functionName)
230
- return null;
231
- const commands = file.content
232
- .split('\n')
233
- .map(line => line.trim())
234
- .filter(line => line !== '' && !line.startsWith('#'))
235
- .map(cmd => ({ cmd }));
236
- return { file, functionName, commands };
237
- })
238
- .filter((entry) => entry !== null);
239
- const optimized = (0, commands_1.optimizeCommandFunctions)(functionFiles.map(entry => ({
240
- name: entry.functionName,
241
- commands: entry.commands,
242
- })));
243
- const commandMap = new Map(optimized.functions.map(fn => [fn.name, fn.commands]));
244
- // Filter out files for functions that were removed (inlined trivial functions)
245
- const optimizedNames = new Set(optimized.functions.map(fn => fn.name));
246
- return {
247
- files: files
248
- .filter(file => {
249
- const functionName = toFunctionName(file);
250
- // Keep non-function files and functions that weren't removed
251
- return !functionName || optimizedNames.has(functionName);
252
- })
253
- .map(file => {
254
- const functionName = toFunctionName(file);
255
- if (!functionName)
256
- return file;
257
- const commands = commandMap.get(functionName);
258
- if (!commands)
259
- return file;
260
- const lines = file.content.split('\n');
261
- const header = lines.filter(line => line.trim().startsWith('#'));
262
- return {
263
- ...file,
264
- content: [...header, ...commands.map(command => command.cmd)].join('\n'),
265
- };
266
- }),
267
- stats: optimized.stats,
268
- };
269
- }
270
- function countMcfunctionCommands(files) {
271
- return files.reduce((sum, file) => {
272
- if (!toFunctionName(file)) {
273
- return sum;
274
- }
275
- return sum + file.content
276
- .split('\n')
277
- .map(line => line.trim())
278
- .filter(line => line !== '' && !line.startsWith('#'))
279
- .length;
280
- }, 0);
281
- }
282
- // ---------------------------------------------------------------------------
283
- // Pre-allocation helpers for the two-pass mangle strategy
284
- // ---------------------------------------------------------------------------
285
- /** Register every variable referenced in an instruction with the allocator. */
286
- function preAllocInstr(instr, alloc) {
287
- switch (instr.op) {
288
- case 'assign':
289
- alloc.alloc(instr.dst);
290
- if (instr.src.kind === 'var')
291
- alloc.alloc(instr.src.name);
292
- break;
293
- case 'binop':
294
- alloc.alloc(instr.dst);
295
- if (instr.lhs.kind === 'var')
296
- alloc.alloc(instr.lhs.name);
297
- if (instr.rhs.kind === 'var')
298
- alloc.alloc(instr.rhs.name);
299
- break;
300
- case 'cmp':
301
- alloc.alloc(instr.dst);
302
- if (instr.lhs.kind === 'var')
303
- alloc.alloc(instr.lhs.name);
304
- if (instr.rhs.kind === 'var')
305
- alloc.alloc(instr.rhs.name);
306
- break;
307
- case 'call':
308
- for (const arg of instr.args) {
309
- if (arg.kind === 'var')
310
- alloc.alloc(arg.name);
311
- }
312
- if (instr.dst)
313
- alloc.alloc(instr.dst);
314
- break;
315
- case 'raw':
316
- // Scan for $varname tokens and pre-register each one
317
- ;
318
- instr.cmd.replace(/\$[A-Za-z_][A-Za-z0-9_]*/g, (tok) => {
319
- alloc.alloc(tok);
320
- return tok;
321
- });
322
- break;
323
- }
324
- }
325
- /** Register every variable referenced in a terminator with the allocator. */
326
- function preAllocTerm(term, alloc) {
327
- switch (term.op) {
328
- case 'jump_if':
329
- case 'jump_unless':
330
- alloc.alloc(term.cond);
331
- break;
332
- case 'return':
333
- if (term.value?.kind === 'var')
334
- alloc.alloc(term.value.name);
335
- break;
336
- }
337
- }
338
- function generateDatapackWithStats(module, options = {}) {
339
- const { optimizeCommands = true, mangle = false, scoreboardObjective = 'rs' } = options;
340
- // Set module-level OBJ so all helper functions in this module use the correct objective.
341
- // This is safe because compilation is synchronous.
342
- OBJ = scoreboardObjective;
343
- (0, commands_1.setOptimizerObjective)(scoreboardObjective);
344
- const alloc = new var_allocator_1.VarAllocator(mangle);
345
- const files = [];
346
- const advancements = [];
347
- const ns = module.namespace;
348
- // Collect all trigger handlers
349
- const triggerHandlers = module.functions.filter(fn => fn.isTriggerHandler && fn.triggerName);
350
- const triggerNames = new Set(triggerHandlers.map(fn => fn.triggerName));
351
- const eventHandlers = module.functions.filter((fn) => !!fn.eventHandler && (0, types_1.isEventTypeName)(fn.eventHandler.eventType));
352
- const eventTypes = new Set(eventHandlers.map(fn => fn.eventHandler.eventType));
353
- // Collect all tick functions
354
- const tickFunctionNames = [];
355
- for (const fn of module.functions) {
356
- if (fn.isTickLoop) {
357
- tickFunctionNames.push(fn.name);
358
- }
359
- }
360
- // pack.mcmeta
361
- files.push({
362
- path: 'pack.mcmeta',
363
- content: JSON.stringify({
364
- pack: { pack_format: 26, description: `${ns} datapack — compiled by redscript` }
365
- }, null, 2),
366
- });
367
- // __load.mcfunction — create scoreboard objective + trigger registrations
368
- const loadLines = [
369
- `# RedScript runtime init`,
370
- `scoreboard objectives add ${OBJ} dummy`,
371
- ];
372
- for (const g of module.globals) {
373
- loadLines.push(`scoreboard players set ${alloc.alloc(g.name)} ${OBJ} ${g.init}`);
374
- }
375
- // Add trigger objectives
376
- for (const triggerName of triggerNames) {
377
- loadLines.push(`scoreboard objectives add ${triggerName} trigger`);
378
- loadLines.push(`scoreboard players enable @a ${triggerName}`);
379
- }
380
- for (const eventType of eventTypes) {
381
- const detection = types_1.EVENT_TYPES[eventType].detection;
382
- if (eventType === 'PlayerDeath') {
383
- loadLines.push(`scoreboard objectives add ${OBJ}.deaths deathCount`);
384
- }
385
- else if (eventType === 'EntityKill') {
386
- loadLines.push(`scoreboard objectives add ${OBJ}.kills totalKillCount`);
387
- }
388
- else if (eventType === 'ItemUse') {
389
- loadLines.push('# ItemUse detection requires a project-specific objective/tag setup');
390
- }
391
- else if (detection === 'tag' || detection === 'advancement') {
392
- loadLines.push(`# ${eventType} detection expects tag ${types_1.EVENT_TYPES[eventType].tag} to be set externally`);
393
- }
394
- }
395
- // Generate trigger dispatch functions
396
- for (const triggerName of triggerNames) {
397
- const handlers = triggerHandlers.filter(fn => fn.triggerName === triggerName);
398
- // __trigger_{name}_dispatch.mcfunction
399
- const dispatchLines = [
400
- `# Trigger dispatch for ${triggerName}`,
401
- ];
402
- for (const handler of handlers) {
403
- dispatchLines.push(`function ${ns}:${handler.name}`);
404
- }
405
- dispatchLines.push(`scoreboard players set @s ${triggerName} 0`);
406
- dispatchLines.push(`scoreboard players enable @s ${triggerName}`);
407
- files.push({
408
- path: `data/${ns}/function/__trigger_${triggerName}_dispatch.mcfunction`,
409
- content: dispatchLines.join('\n'),
410
- });
411
- }
412
- // Collect all constants across all functions first (deduplicated)
413
- const allConsts = new Set();
414
- for (const fn of module.functions) {
415
- for (const c of collectConsts(fn))
416
- allConsts.add(c);
417
- }
418
- if (allConsts.size > 0) {
419
- loadLines.push(...Array.from(allConsts).sort((a, b) => a - b).map(value => `scoreboard players set ${alloc.constant(value)} ${OBJ} ${value}`));
420
- }
421
- // ─────────────────────────────────────────────────────────────────────────
422
- // Pre-allocation pass (mangle mode only)
423
- //
424
- // When mangle=true, the codegen assigns sequential names ($a, $b, …) the
425
- // FIRST time alloc.alloc() is called for a given variable. Raw IR commands
426
- // embed variable names (e.g. "$_0") as plain strings; resolveRaw() can only
427
- // substitute them if the name was already registered in the allocator.
428
- //
429
- // Problem: a freshTemp ($\_0) used in a `raw` instruction and then in the
430
- // immediately following `assign` gets registered by the `assign` AFTER the
431
- // `raw` has already been emitted — so resolveRaw sees an unknown name and
432
- // passes it through verbatim ($\_0), while the assign emits a different
433
- // mangled slot ($e). The two slots never meet and the value is lost.
434
- //
435
- // Fix: walk every instruction (and terminator) of every function in order
436
- // and call alloc.alloc() for each variable reference. This registers all
437
- // names — with the same sequential order the main emit pass will encounter
438
- // them — so that resolveRaw() can always find the correct mangled name.
439
- // ─────────────────────────────────────────────────────────────────────────
440
- if (mangle) {
441
- for (const fn of module.functions) {
442
- // Register internals used by the calling convention
443
- for (let i = 0; i < fn.params.length; i++)
444
- alloc.internal(`p${i}`);
445
- alloc.internal('ret');
446
- for (const block of fn.blocks) {
447
- for (const instr of block.instrs) {
448
- preAllocInstr(instr, alloc);
449
- }
450
- preAllocTerm(block.term, alloc);
451
- }
452
- }
453
- }
454
- // Generate each function
455
- for (const fn of module.functions) {
456
- // Entry block → <fn_name>.mcfunction
457
- // Continuation blocks → <fn_name>/<label>.mcfunction
458
- for (let i = 0; i < fn.blocks.length; i++) {
459
- const block = fn.blocks[i];
460
- const lines = [`# block: ${block.label}`];
461
- // Param setup is now handled by the lowering IR itself via { kind: 'param' }
462
- // operands, so we no longer need a separate codegen param-copy loop here.
463
- // (Removing it prevents the double-assignment that caused mangle-mode collisions.)
464
- for (const instr of block.instrs) {
465
- lines.push(...emitInstr(instr, ns, alloc));
466
- }
467
- lines.push(...emitTerm(block.term, ns, fn.name, alloc));
468
- const filePath = i === 0
469
- ? `data/${ns}/function/${fn.name}.mcfunction`
470
- : `data/${ns}/function/${fn.name}/${block.label}.mcfunction`;
471
- // Skip empty continuation blocks (only contain the block comment, no real commands)
472
- // Entry block (i === 0) is always emitted so the function file exists
473
- const hasRealContent = lines.some(l => !l.startsWith('#') && l.trim() !== '');
474
- if (i !== 0 && !hasRealContent)
475
- continue;
476
- files.push({ path: filePath, content: lines.join('\n') });
477
- }
478
- }
479
- // Call @load functions and @requires-referenced load helpers from __load.
480
- // We collect them in a set to deduplicate (multiple fns might @requires the same dep).
481
- const loadCalls = new Set();
482
- for (const fn of module.functions) {
483
- if (fn.isLoadInit) {
484
- loadCalls.add(fn.name);
485
- }
486
- // @requires: if this fn is compiled in, its required load-helpers must also run
487
- for (const dep of fn.requiredLoads ?? []) {
488
- loadCalls.add(dep);
489
- }
490
- }
491
- for (const name of loadCalls) {
492
- loadLines.push(`function ${ns}:${name}`);
493
- }
494
- // Write __load.mcfunction
495
- files.push({
496
- path: `data/${ns}/function/__load.mcfunction`,
497
- content: loadLines.join('\n'),
498
- });
499
- // minecraft:load tag pointing to __load
500
- files.push({
501
- path: `data/minecraft/tags/function/load.json`,
502
- content: JSON.stringify({ values: [`${ns}:__load`] }, null, 2),
503
- });
504
- // __tick.mcfunction — calls all @tick functions + trigger check
505
- const tickLines = ['# RedScript tick dispatcher'];
506
- // Call all @tick functions
507
- for (const fnName of tickFunctionNames) {
508
- tickLines.push(`function ${ns}:${fnName}`);
509
- }
510
- // Call trigger check if there are triggers
511
- if (triggerNames.size > 0) {
512
- tickLines.push(`# Trigger checks`);
513
- for (const triggerName of triggerNames) {
514
- tickLines.push(`execute as @a[scores={${triggerName}=1..}] run function ${ns}:__trigger_${triggerName}_dispatch`);
515
- }
516
- }
517
- if (eventHandlers.length > 0) {
518
- tickLines.push('# Event checks');
519
- for (const eventType of eventTypes) {
520
- const tag = types_1.EVENT_TYPES[eventType].tag;
521
- const handlers = eventHandlers.filter(fn => fn.eventHandler?.eventType === eventType);
522
- for (const handler of handlers) {
523
- tickLines.push(`execute as @a[tag=${tag}] run function ${ns}:${handler.name}`);
524
- }
525
- tickLines.push(`tag @a[tag=${tag}] remove ${tag}`);
526
- }
527
- }
528
- // Only generate __tick if there's something to run
529
- if (tickFunctionNames.length > 0 || triggerNames.size > 0 || eventHandlers.length > 0) {
530
- files.push({
531
- path: `data/${ns}/function/__tick.mcfunction`,
532
- content: tickLines.join('\n'),
533
- });
534
- // minecraft:tick tag pointing to __tick
535
- files.push({
536
- path: `data/minecraft/tags/function/tick.json`,
537
- content: JSON.stringify({ values: [`${ns}:__tick`] }, null, 2),
538
- });
539
- }
540
- for (const fn of module.functions) {
541
- const eventTrigger = fn.eventTrigger;
542
- if (!eventTrigger) {
543
- continue;
544
- }
545
- let path = '';
546
- let criteria = {};
547
- switch (eventTrigger.kind) {
548
- case 'advancement':
549
- path = `data/${ns}/advancements/on_advancement_${fn.name}.json`;
550
- criteria = {
551
- trigger: {
552
- trigger: `minecraft:${eventTrigger.value}`,
553
- },
554
- };
555
- break;
556
- case 'craft':
557
- path = `data/${ns}/advancements/on_craft_${fn.name}.json`;
558
- criteria = {
559
- crafted: {
560
- trigger: 'minecraft:inventory_changed',
561
- conditions: {
562
- items: [
563
- {
564
- items: [eventTrigger.value],
565
- },
566
- ],
567
- },
568
- },
569
- };
570
- break;
571
- case 'death':
572
- path = `data/${ns}/advancements/on_death_${fn.name}.json`;
573
- criteria = {
574
- death: {
575
- trigger: 'minecraft:entity_killed_player',
576
- },
577
- };
578
- break;
579
- case 'login':
580
- case 'join_team':
581
- continue;
582
- }
583
- advancements.push({
584
- path,
585
- content: JSON.stringify({
586
- criteria,
587
- rewards: {
588
- function: `${ns}:${fn.name}`,
589
- },
590
- }, null, 2),
591
- });
592
- }
593
- const stats = (0, commands_1.createEmptyOptimizationStats)();
594
- const sourceMap = mangle ? alloc.toSourceMap() : undefined;
595
- if (!optimizeCommands) {
596
- return { files, advancements, stats, sourceMap };
597
- }
598
- const optimized = applyFunctionOptimization(files);
599
- (0, commands_1.mergeOptimizationStats)(stats, optimized.stats);
600
- return { files: optimized.files, advancements, stats, sourceMap };
601
- }
602
- function generateDatapack(module) {
603
- const generated = generateDatapackWithStats(module);
604
- return [...generated.files, ...generated.advancements];
605
- }
606
- //# sourceMappingURL=index.js.map
@@ -1,24 +0,0 @@
1
- import { type OptimizationStats } from '../../optimizer/commands';
2
- import type { IRModule } from '../../ir/types';
3
- import type { DatapackFile } from '../mcfunction';
4
- export interface StructureBlockInfo {
5
- command: string;
6
- conditional: boolean;
7
- state: number;
8
- functionName: string;
9
- lineNumber: number;
10
- }
11
- export interface StructureCompileResult {
12
- buffer: Buffer;
13
- blockCount: number;
14
- blocks: StructureBlockInfo[];
15
- stats?: OptimizationStats;
16
- }
17
- export interface StructureCompileOptions {
18
- dce?: boolean;
19
- mangle?: boolean;
20
- }
21
- export declare function generateStructure(input: IRModule | DatapackFile[], options?: {
22
- mangle?: boolean;
23
- }): StructureCompileResult;
24
- export declare function compileToStructure(source: string, namespace: string, filePath?: string, options?: StructureCompileOptions): StructureCompileResult;