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
@@ -161,26 +161,23 @@ export function parseErrorMessage(
161
161
  return new DiagnosticError(kind, rawMessage, { file: filePath, line: 1, col: 1 }, sourceLines)
162
162
  }
163
163
 
164
- export function formatError(error: Error | DiagnosticError, source?: string): string {
164
+ export function formatError(error: Error | DiagnosticError, source?: string, filePath?: string): string {
165
165
  if (error instanceof DiagnosticError) {
166
166
  const sourceLines = source?.split('\n') ?? error.sourceLines ?? []
167
167
  const { file, line, col } = error.location
168
- const locationPart = file
169
- ? ` in ${file} at line ${line}, col ${col}`
170
- : ` at line ${line}, col ${col}`
171
- const lines = [`Error${locationPart}:`]
168
+ const fileStr = file ?? filePath ?? '<input>'
169
+ const header = `${fileStr}:${line}:${col}: error: ${error.message}`
172
170
  const pointerLines = formatSourcePointer(sourceLines, line, col)
173
- if (pointerLines.length > 0) {
174
- lines.push(...pointerLines)
171
+ if (pointerLines.length === 0) {
172
+ return header
175
173
  }
176
- lines.push(error.message)
177
- return lines.join('\n')
174
+ return [header, ...pointerLines].join('\n')
178
175
  }
179
176
 
180
177
  if (!source) {
181
178
  return error.message
182
179
  }
183
180
 
184
- const parsed = parseErrorMessage('ParseError', error.message, source.split('\n'))
185
- return formatError(parsed, source)
181
+ const parsed = parseErrorMessage('ParseError', error.message, source.split('\n'), filePath)
182
+ return formatError(parsed, source, filePath)
186
183
  }
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Top-level compile function for the v2 pipeline.
3
+ *
4
+ * Pipeline: source → Lexer → Parser → TypeCheck → HIR → MIR → optimize → LIR → emit
5
+ */
6
+
7
+ import { Lexer } from '../lexer'
8
+ import { Parser } from '../parser'
9
+ import { preprocessSourceWithMetadata } from '../compile'
10
+ import { DiagnosticError, parseErrorMessage } from '../diagnostics'
11
+ import { lowerToHIR } from '../hir/lower'
12
+ import { monomorphize } from '../hir/monomorphize'
13
+ import { lowerToMIR } from '../mir/lower'
14
+ import { optimizeModule } from '../optimizer/pipeline'
15
+ import { lowerToLIR } from '../lir/lower'
16
+ import { lirOptimizeModule } from '../optimizer/lir/pipeline'
17
+ import { emit, type DatapackFile } from './index'
18
+ import { coroutineTransform, type CoroutineInfo } from '../optimizer/coroutine'
19
+ import { analyzeBudget } from '../lir/budget'
20
+ import { McVersion, DEFAULT_MC_VERSION } from '../types/mc-version'
21
+ import { TypeChecker } from '../typechecker'
22
+
23
+ export interface CompileOptions {
24
+ namespace?: string
25
+ filePath?: string
26
+ /** v1 compat: inline library sources (treated as `module library;` imports) */
27
+ librarySources?: string[]
28
+ /** When true, generate .sourcemap.json files alongside .mcfunction output */
29
+ generateSourceMap?: boolean
30
+ /** Target Minecraft version (default: 1.21). Affects which MC features are used. */
31
+ mcVersion?: McVersion
32
+ /**
33
+ * When true, type errors are reported as warnings instead of blocking compilation.
34
+ * Use for gradual migration or testing with existing codebases that have type errors.
35
+ */
36
+ lenient?: boolean
37
+ }
38
+
39
+ export interface CompileResult {
40
+ files: DatapackFile[]
41
+ warnings: string[]
42
+ /** Always true — v1 compat shim (compile() throws on error) */
43
+ readonly success: true
44
+ }
45
+
46
+ export function compile(source: string, options: CompileOptions = {}): CompileResult {
47
+ const { namespace = 'redscript', filePath, generateSourceMap = false, mcVersion = DEFAULT_MC_VERSION, lenient = false } = options
48
+ const warnings: string[] = []
49
+
50
+ // Preprocess: resolve import directives, merge imported sources
51
+ const preprocessed = preprocessSourceWithMetadata(source, { filePath })
52
+ const processedSource = preprocessed.source
53
+
54
+ // Stage 1: Lex + Parse → AST
55
+ const lexer = new Lexer(processedSource)
56
+ const tokens = lexer.tokenize()
57
+ const parser = new Parser(tokens, processedSource, filePath)
58
+ const ast = parser.parse(namespace)
59
+
60
+ // Merge library imports (files with `module library;`) into AST
61
+ for (const li of preprocessed.libraryImports ?? []) {
62
+ const libPreprocessed = preprocessSourceWithMetadata(li.source, { filePath: li.filePath })
63
+ const libTokens = new Lexer(libPreprocessed.source, li.filePath).tokenize()
64
+ const libAst = new Parser(libTokens, libPreprocessed.source, li.filePath).parse(namespace)
65
+ for (const fn of libAst.declarations) fn.isLibraryFn = true
66
+ ast.declarations.push(...libAst.declarations)
67
+ ast.structs.push(...libAst.structs)
68
+ ast.implBlocks.push(...libAst.implBlocks)
69
+ ast.enums.push(...libAst.enums)
70
+ ast.consts.push(...libAst.consts)
71
+ ast.globals.push(...libAst.globals)
72
+ }
73
+
74
+ // Merge librarySources (v1 compat: inline library strings) before HIR
75
+ if (options.librarySources) {
76
+ for (const libSrc of options.librarySources) {
77
+ const libTokens = new Lexer(libSrc).tokenize()
78
+ const libAst = new Parser(libTokens, libSrc).parse(namespace)
79
+ for (const fn of libAst.declarations) fn.isLibraryFn = true
80
+ ast.declarations.push(...libAst.declarations)
81
+ ast.structs.push(...libAst.structs)
82
+ ast.implBlocks.push(...libAst.implBlocks)
83
+ ast.enums.push(...libAst.enums)
84
+ ast.consts.push(...libAst.consts)
85
+ ast.globals.push(...libAst.globals)
86
+ }
87
+ }
88
+
89
+ // Stage 1b: Type checking
90
+ // Run TypeChecker on the merged AST. In error-mode (default), throw on first type error.
91
+ // In lenient mode, demote type errors to warnings.
92
+ {
93
+ const checker = new TypeChecker(processedSource, filePath)
94
+ const typeErrors = checker.check(ast)
95
+ if (typeErrors.length > 0) {
96
+ if (lenient) {
97
+ for (const e of typeErrors) {
98
+ warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`)
99
+ }
100
+ } else {
101
+ throw typeErrors[0]
102
+ }
103
+ }
104
+ }
105
+
106
+ // Stage 2–7: lower, optimize, emit
107
+ // Wrap non-DiagnosticError from later stages so CLI always gets structured errors.
108
+ try {
109
+ // Stage 2: AST → HIR
110
+ const hirRaw = lowerToHIR(ast)
111
+
112
+ // Stage 2b: Monomorphize generic functions
113
+ const hir = monomorphize(hirRaw)
114
+
115
+ // Extract @tick, @load, @coroutine, and @schedule functions from HIR (before decorator info is lost)
116
+ const tickFunctions: string[] = []
117
+ const loadFunctions: string[] = []
118
+ const coroutineInfos: CoroutineInfo[] = []
119
+ const scheduleFunctions: Array<{ name: string; ticks: number }> = []
120
+ for (const fn of hir.functions) {
121
+ for (const dec of fn.decorators) {
122
+ if (dec.name === 'tick') tickFunctions.push(fn.name)
123
+ if (dec.name === 'load') loadFunctions.push(fn.name)
124
+ if (dec.name === 'coroutine') {
125
+ coroutineInfos.push({
126
+ fnName: fn.name,
127
+ batch: dec.args?.batch ?? 10,
128
+ onDone: dec.args?.onDone,
129
+ })
130
+ }
131
+ if (dec.name === 'schedule') {
132
+ scheduleFunctions.push({ name: fn.name, ticks: dec.args?.ticks ?? 1 })
133
+ }
134
+ }
135
+ }
136
+
137
+ // Stage 3: HIR → MIR
138
+ const mir = lowerToMIR(hir, filePath)
139
+
140
+ // Stage 4: MIR optimization
141
+ const mirOpt = optimizeModule(mir)
142
+
143
+ // Stage 4b: Coroutine transform (opt-in, only for @coroutine functions)
144
+ const coroResult = coroutineTransform(mirOpt, coroutineInfos)
145
+ const mirFinal = coroResult.module
146
+ tickFunctions.push(...coroResult.generatedTickFunctions)
147
+
148
+ // Stage 5: MIR → LIR
149
+ const lir = lowerToLIR(mirFinal)
150
+
151
+ // Stage 6: LIR optimization
152
+ const lirOpt = lirOptimizeModule(lir)
153
+
154
+ // Static tick budget analysis
155
+ const coroutineNames = new Set(coroutineInfos.map(c => c.fnName))
156
+ const budgetDiags = analyzeBudget(lirOpt, coroutineNames)
157
+ for (const diag of budgetDiags) {
158
+ if (diag.level === 'error') {
159
+ throw new DiagnosticError(
160
+ 'LoweringError',
161
+ diag.message,
162
+ { line: 1, col: 1, file: filePath },
163
+ )
164
+ }
165
+ warnings.push(diag.message)
166
+ }
167
+
168
+ // Stage 7: LIR → .mcfunction
169
+ const files = emit(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions, generateSourceMap, mcVersion })
170
+
171
+ return { files, warnings, success: true as const }
172
+ } catch (err) {
173
+ if (err instanceof DiagnosticError) throw err
174
+ const sourceLines = processedSource.split('\n')
175
+ throw parseErrorMessage('LoweringError', (err as Error).message, sourceLines, filePath)
176
+ }
177
+ }
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Stage 7 — LIR → .mcfunction Emission
3
+ *
4
+ * Converts a LIRModule into DatapackFile[] representing a Minecraft datapack.
5
+ * Each LIRFunction becomes a .mcfunction file under data/<ns>/function/.
6
+ */
7
+
8
+ import type { LIRModule, LIRFunction, LIRInstr, Slot, CmpOp, ExecuteSubcmd } from '../lir/types'
9
+ import { SourceMapBuilder, serializeSourceMap, sourceMapPath } from './sourcemap'
10
+ import { McVersion, DEFAULT_MC_VERSION } from '../types/mc-version'
11
+
12
+ export interface DatapackFile {
13
+ path: string
14
+ content: string
15
+ }
16
+
17
+ export interface EmitOptions {
18
+ namespace: string
19
+ tickFunctions?: string[]
20
+ loadFunctions?: string[]
21
+ scheduleFunctions?: Array<{ name: string; ticks: number }>
22
+ /** When true, generate a .sourcemap.json sidecar file for each .mcfunction */
23
+ generateSourceMap?: boolean
24
+ /** Target Minecraft version; controls which MC features are used in codegen */
25
+ mcVersion?: McVersion
26
+ }
27
+
28
+ // ---------------------------------------------------------------------------
29
+ // Public API
30
+ // ---------------------------------------------------------------------------
31
+
32
+ export function emit(module: LIRModule, options: EmitOptions): DatapackFile[] {
33
+ const { namespace } = options
34
+ const tickFns = options.tickFunctions ?? []
35
+ const loadFns = options.loadFunctions ?? []
36
+ const scheduleFns = options.scheduleFunctions ?? []
37
+ const objective = module.objective
38
+ const genSourceMap = options.generateSourceMap ?? false
39
+ const mcVersion = options.mcVersion ?? DEFAULT_MC_VERSION
40
+ const files: DatapackFile[] = []
41
+
42
+ // pack.mcmeta
43
+ files.push({
44
+ path: 'pack.mcmeta',
45
+ content: JSON.stringify({
46
+ pack: { pack_format: 26, description: `RedScript datapack: ${namespace}` },
47
+ }, null, 2) + '\n',
48
+ })
49
+
50
+ // load.mcfunction — creates the scoreboard objective
51
+ const loadCmds = [`scoreboard objectives add ${objective} dummy`]
52
+ files.push({
53
+ path: `data/${namespace}/function/load.mcfunction`,
54
+ content: loadCmds.join('\n') + '\n',
55
+ })
56
+
57
+ // Each LIR function → .mcfunction file
58
+ for (const fn of module.functions) {
59
+ const fnPath = fnNameToPath(fn.name, namespace)
60
+ if (genSourceMap) {
61
+ const builder = new SourceMapBuilder(fnPath)
62
+ const lines = emitFunctionWithSourceMap(fn, namespace, objective, builder, mcVersion)
63
+ files.push({ path: fnPath, content: lines.join('\n') + '\n' })
64
+ const map = builder.build()
65
+ if (map) {
66
+ files.push({ path: sourceMapPath(fnPath), content: serializeSourceMap(map) })
67
+ }
68
+ } else {
69
+ const lines = emitFunction(fn, namespace, objective, mcVersion)
70
+ files.push({ path: fnPath, content: lines.join('\n') + '\n' })
71
+ }
72
+ }
73
+
74
+ // @schedule wrapper functions: _schedule_xxx → schedule function ns:xxx Nt
75
+ for (const { name, ticks } of scheduleFns) {
76
+ files.push({
77
+ path: `data/${namespace}/function/_schedule_${name}.mcfunction`,
78
+ content: `schedule function ${namespace}:${name} ${ticks}t\n`,
79
+ })
80
+ }
81
+
82
+ // Tag files for tick/load
83
+ if (loadFns.length > 0 || true) {
84
+ // Always include load.json — it must reference the load.mcfunction
85
+ const loadValues = [`${namespace}:load`, ...loadFns.map(fn => `${namespace}:${fn}`)]
86
+ files.push({
87
+ path: 'data/minecraft/tags/function/load.json',
88
+ content: JSON.stringify({ values: loadValues }, null, 2) + '\n',
89
+ })
90
+ }
91
+
92
+ if (tickFns.length > 0) {
93
+ const tickValues = tickFns.map(fn => `${namespace}:${fn}`)
94
+ files.push({
95
+ path: 'data/minecraft/tags/function/tick.json',
96
+ content: JSON.stringify({ values: tickValues }, null, 2) + '\n',
97
+ })
98
+ }
99
+
100
+ return files
101
+ }
102
+
103
+ // ---------------------------------------------------------------------------
104
+ // Function emission
105
+ // ---------------------------------------------------------------------------
106
+
107
+ function emitFunction(fn: LIRFunction, namespace: string, objective: string, mcVersion: McVersion): string[] {
108
+ const lines: string[] = []
109
+ for (const instr of fn.instructions) {
110
+ lines.push(emitInstr(instr, namespace, objective, mcVersion))
111
+ }
112
+ return lines
113
+ }
114
+
115
+ function emitFunctionWithSourceMap(
116
+ fn: LIRFunction,
117
+ namespace: string,
118
+ objective: string,
119
+ builder: SourceMapBuilder,
120
+ mcVersion: McVersion,
121
+ ): string[] {
122
+ const lines: string[] = []
123
+ for (const instr of fn.instructions) {
124
+ lines.push(emitInstr(instr, namespace, objective, mcVersion))
125
+ builder.addLine(instr.sourceLoc)
126
+ }
127
+ return lines
128
+ }
129
+
130
+ function fnNameToPath(name: string, namespace: string): string {
131
+ // LIR function names may contain :: for methods — convert to /
132
+ const mcName = name.replace(/::/g, '/').toLowerCase()
133
+ return `data/${namespace}/function/${mcName}.mcfunction`
134
+ }
135
+
136
+ // ---------------------------------------------------------------------------
137
+ // Instruction emission
138
+ // ---------------------------------------------------------------------------
139
+
140
+ function emitInstr(instr: LIRInstr, ns: string, obj: string, mcVersion: McVersion): string {
141
+ switch (instr.kind) {
142
+ case 'score_set':
143
+ return `scoreboard players set ${slot(instr.dst)} ${instr.value}`
144
+
145
+ case 'score_copy':
146
+ return `scoreboard players operation ${slot(instr.dst)} = ${slot(instr.src)}`
147
+
148
+ case 'score_add':
149
+ return `scoreboard players operation ${slot(instr.dst)} += ${slot(instr.src)}`
150
+
151
+ case 'score_sub':
152
+ return `scoreboard players operation ${slot(instr.dst)} -= ${slot(instr.src)}`
153
+
154
+ case 'score_mul':
155
+ return `scoreboard players operation ${slot(instr.dst)} *= ${slot(instr.src)}`
156
+
157
+ case 'score_div':
158
+ return `scoreboard players operation ${slot(instr.dst)} /= ${slot(instr.src)}`
159
+
160
+ case 'score_mod':
161
+ return `scoreboard players operation ${slot(instr.dst)} %= ${slot(instr.src)}`
162
+
163
+ case 'score_min':
164
+ return `scoreboard players operation ${slot(instr.dst)} < ${slot(instr.src)}`
165
+
166
+ case 'score_max':
167
+ return `scoreboard players operation ${slot(instr.dst)} > ${slot(instr.src)}`
168
+
169
+ case 'score_swap':
170
+ return `scoreboard players operation ${slot(instr.a)} >< ${slot(instr.b)}`
171
+
172
+ case 'store_cmd_to_score':
173
+ return `execute store result score ${slot(instr.dst)} run ${emitInstr(instr.cmd, ns, obj, mcVersion)}`
174
+
175
+ case 'store_score_to_nbt':
176
+ return `execute store result storage ${instr.ns} ${instr.path} ${instr.type} ${instr.scale} run scoreboard players get ${slot(instr.src)}`
177
+
178
+ case 'store_nbt_to_score':
179
+ return `execute store result score ${slot(instr.dst)} run data get storage ${instr.ns} ${instr.path} ${instr.scale}`
180
+
181
+ case 'nbt_set_literal':
182
+ return `data modify storage ${instr.ns} ${instr.path} set value ${instr.value}`
183
+
184
+ case 'nbt_copy':
185
+ return `data modify storage ${instr.dstNs} ${instr.dstPath} set from storage ${instr.srcNs} ${instr.srcPath}`
186
+
187
+ case 'call':
188
+ return `function ${instr.fn}`
189
+
190
+ case 'call_macro':
191
+ if (mcVersion >= McVersion.v1_20_2) {
192
+ return `function ${instr.fn} with storage ${instr.storage}`
193
+ }
194
+ // Pre-1.20.2: macros not supported; call function directly (args in storage are ignored)
195
+ return `function ${instr.fn}`
196
+
197
+ case 'call_if_matches':
198
+ return `execute if score ${slot(instr.slot)} matches ${instr.range} run function ${instr.fn}`
199
+
200
+ case 'call_unless_matches':
201
+ return `execute unless score ${slot(instr.slot)} matches ${instr.range} run function ${instr.fn}`
202
+
203
+ case 'call_if_score':
204
+ return `execute if score ${slot(instr.a)} ${cmpToMC(instr.op)} ${slot(instr.b)} run function ${instr.fn}`
205
+
206
+ case 'call_unless_score':
207
+ return `execute unless score ${slot(instr.a)} ${cmpToMC(instr.op)} ${slot(instr.b)} run function ${instr.fn}`
208
+
209
+ case 'call_context': {
210
+ const subcmds = instr.subcommands.map(emitSubcmd).join(' ')
211
+ return `execute ${subcmds} run function ${instr.fn}`
212
+ }
213
+
214
+ case 'return_value':
215
+ return `scoreboard players operation $ret ${instr.slot.obj} = ${slot(instr.slot)}`
216
+
217
+ case 'macro_line':
218
+ if (mcVersion >= McVersion.v1_20_2) {
219
+ return `$${instr.template}`
220
+ }
221
+ // Pre-1.20.2: function macros not available. Emit as a plain command with
222
+ // $(param) placeholders replaced by storage reads via data get (best-effort
223
+ // compat for string/id params; numeric coords will not be dynamic).
224
+ return macroLineCompat(instr.template)
225
+
226
+ case 'raw':
227
+ return instr.cmd
228
+ }
229
+ }
230
+
231
+ // ---------------------------------------------------------------------------
232
+ // Helpers
233
+ // ---------------------------------------------------------------------------
234
+
235
+ function slot(s: Slot): string {
236
+ return `${s.player} ${s.obj}`
237
+ }
238
+
239
+ function cmpToMC(op: CmpOp): string {
240
+ switch (op) {
241
+ case 'eq': return '='
242
+ case 'ne': return '=' // ne uses "unless" form, but when used in if score context
243
+ case 'lt': return '<'
244
+ case 'le': return '<='
245
+ case 'gt': return '>'
246
+ case 'ge': return '>='
247
+ }
248
+ }
249
+
250
+ /**
251
+ * Pre-1.20.2 compat: emit a macro template as a plain command.
252
+ * $(param) placeholders are replaced with `storage rs:macro_args <param>` data-get
253
+ * expressions for string/id values, or left as literal "0" for coordinates.
254
+ * This is best-effort — dynamic numeric positions cannot be truly emulated.
255
+ */
256
+ function macroLineCompat(template: string): string {
257
+ // Replace $(param) with data-get-style substitution marker
258
+ return template.replace(/\$\((\w+)\)/g, (_m, p) => `{storage:rs:macro_args,path:${p}}`)
259
+ }
260
+
261
+ function emitSubcmd(sub: ExecuteSubcmd): string {
262
+ switch (sub.kind) {
263
+ case 'as':
264
+ return `as ${sub.selector}`
265
+ case 'at':
266
+ return `at ${sub.selector}`
267
+ case 'at_self':
268
+ return 'at @s'
269
+ case 'positioned':
270
+ return `positioned ${sub.x} ${sub.y} ${sub.z}`
271
+ case 'rotated':
272
+ return `rotated ${sub.yaw} ${sub.pitch}`
273
+ case 'in':
274
+ return `in ${sub.dimension}`
275
+ case 'anchored':
276
+ return `anchored ${sub.anchor}`
277
+ case 'if_score':
278
+ return `if score ${sub.a} ${cmpToMC(sub.op)} ${sub.b}`
279
+ case 'unless_score':
280
+ return `unless score ${sub.a} ${cmpToMC(sub.op)} ${sub.b}`
281
+ case 'if_matches':
282
+ return `if score ${sub.score} matches ${sub.range}`
283
+ case 'unless_matches':
284
+ return `unless score ${sub.score} matches ${sub.range}`
285
+ }
286
+ }