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