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
@@ -0,0 +1,492 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 5b — Multi-Module Compilation
4
+ *
5
+ * Compiles multiple .mcrs files that use `module <name>;` / `import <mod>::<sym>;`
6
+ * into a single datapack with namespace-isolated scoreboards and correct cross-module
7
+ * function paths.
8
+ *
9
+ * Design:
10
+ * - Each module gets its own scoreboard objective: `__${namespace}_${moduleName}`
11
+ * - Cross-module function calls are emitted as `${namespace}:${moduleName}/${fnName}`
12
+ * - DCE: exported-but-never-imported functions are stripped from the output
13
+ * - Circular imports are detected and rejected
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.compileModules = compileModules;
17
+ const lexer_1 = require("../lexer");
18
+ const parser_1 = require("../parser");
19
+ const diagnostics_1 = require("../diagnostics");
20
+ const lower_1 = require("../hir/lower");
21
+ const monomorphize_1 = require("../hir/monomorphize");
22
+ const lower_2 = require("../mir/lower");
23
+ const pipeline_1 = require("../optimizer/pipeline");
24
+ const lower_3 = require("../lir/lower");
25
+ const pipeline_2 = require("../optimizer/lir/pipeline");
26
+ const index_1 = require("./index");
27
+ const coroutine_1 = require("../optimizer/coroutine");
28
+ function compileModules(modules, options = {}) {
29
+ const namespace = options.namespace ?? 'redscript';
30
+ const warnings = [];
31
+ if (modules.length === 0) {
32
+ throw new diagnostics_1.DiagnosticError('LoweringError', 'No modules provided', { line: 1, col: 1 });
33
+ }
34
+ // -------------------------------------------------------------------------
35
+ // Step 1: Parse all modules
36
+ // -------------------------------------------------------------------------
37
+ const parsedModules = new Map(); // moduleName → AST
38
+ for (const mod of modules) {
39
+ const lexer = new lexer_1.Lexer(mod.source, mod.filePath);
40
+ const tokens = lexer.tokenize();
41
+ const parser = new parser_1.Parser(tokens, mod.source, mod.filePath);
42
+ const ast = parser.parse(namespace);
43
+ // Verify declared module name matches provided name
44
+ const declaredName = ast.moduleName;
45
+ if (declaredName && declaredName !== mod.name) {
46
+ throw new diagnostics_1.DiagnosticError('LoweringError', `Module declares name '${declaredName}' but was registered as '${mod.name}'`, { file: mod.filePath, line: 1, col: 1 });
47
+ }
48
+ parsedModules.set(mod.name, ast);
49
+ }
50
+ // -------------------------------------------------------------------------
51
+ // Step 2: Build export tables and validate imports
52
+ // -------------------------------------------------------------------------
53
+ // moduleName → set of exported function names
54
+ const exportTable = new Map();
55
+ for (const [modName, ast] of parsedModules) {
56
+ const exports = new Set();
57
+ for (const fn of ast.declarations) {
58
+ if (fn.isExported)
59
+ exports.add(fn.name);
60
+ }
61
+ exportTable.set(modName, exports);
62
+ }
63
+ // -------------------------------------------------------------------------
64
+ // Step 3: Circular import detection
65
+ // -------------------------------------------------------------------------
66
+ detectCircularImports(parsedModules);
67
+ // -------------------------------------------------------------------------
68
+ // Step 4: Build import resolution table per module
69
+ // importMap: moduleName → { symbolName → qualifiedName (e.g. "math/sin") }
70
+ // -------------------------------------------------------------------------
71
+ const importMap = new Map();
72
+ for (const [modName, ast] of parsedModules) {
73
+ const resolved = new Map();
74
+ for (const imp of ast.imports) {
75
+ const sourceExports = exportTable.get(imp.moduleName);
76
+ if (!sourceExports) {
77
+ throw new diagnostics_1.DiagnosticError('LoweringError', `Module '${imp.moduleName}' not found (imported in '${modName}')`, { file: ast.namespace, line: 1, col: 1 });
78
+ }
79
+ if (imp.symbol === '*') {
80
+ // Wildcard: import all exports
81
+ for (const sym of sourceExports) {
82
+ resolved.set(sym, `${imp.moduleName}/${sym}`);
83
+ }
84
+ }
85
+ else {
86
+ if (!sourceExports.has(imp.symbol)) {
87
+ throw new diagnostics_1.DiagnosticError('LoweringError', `Module '${imp.moduleName}' does not export '${imp.symbol}'`, { line: 1, col: 1 });
88
+ }
89
+ resolved.set(imp.symbol, `${imp.moduleName}/${imp.symbol}`);
90
+ }
91
+ }
92
+ importMap.set(modName, resolved);
93
+ }
94
+ // -------------------------------------------------------------------------
95
+ // Step 5: Compute which exported symbols are actually used (for cross-module DCE)
96
+ // usedExports: moduleName → set of exported fn names that are imported somewhere
97
+ // -------------------------------------------------------------------------
98
+ const usedExports = new Map();
99
+ for (const modName of parsedModules.keys()) {
100
+ usedExports.set(modName, new Set());
101
+ }
102
+ for (const ast of parsedModules.values()) {
103
+ for (const imp of ast.imports) {
104
+ const used = usedExports.get(imp.moduleName);
105
+ if (!used)
106
+ continue;
107
+ if (imp.symbol === '*') {
108
+ const exports = exportTable.get(imp.moduleName);
109
+ if (exports)
110
+ for (const s of exports)
111
+ used.add(s);
112
+ }
113
+ else {
114
+ used.add(imp.symbol);
115
+ }
116
+ }
117
+ }
118
+ // -------------------------------------------------------------------------
119
+ // Step 6: Compile each module
120
+ // -------------------------------------------------------------------------
121
+ const allFiles = [];
122
+ // Track library-eligible file paths for cross-module DCE
123
+ const libraryFilePaths = new Set();
124
+ let packMetaEmitted = false;
125
+ for (const mod of modules) {
126
+ const ast = parsedModules.get(mod.name);
127
+ const symbolMap = importMap.get(mod.name) ?? new Map();
128
+ const isNamed = !!ast.moduleName;
129
+ // Rewrite call sites in AST: imported symbol names → qualified names
130
+ if (symbolMap.size > 0) {
131
+ rewriteCallsInProgram(ast, symbolMap);
132
+ }
133
+ // For named modules: prefix all function definitions with `${moduleName}/`
134
+ // so they emit to `${namespace}:${moduleName}/${fnName}.mcfunction`
135
+ // Track which exported functions are not imported anywhere (for cross-module DCE)
136
+ const unusedExportedFns = new Set();
137
+ if (isNamed) {
138
+ const used = usedExports.get(mod.name) ?? new Set();
139
+ for (const fn of ast.declarations) {
140
+ // Prefix function name
141
+ fn.name = `${mod.name}/${fn.name}`;
142
+ // Functions not imported by anyone are library-eligible (DCE)
143
+ const baseName = fn.name.split('/').pop();
144
+ if (fn.isExported && !used.has(baseName)) {
145
+ unusedExportedFns.add(fn.name);
146
+ }
147
+ }
148
+ }
149
+ // Determine scoreboard objective
150
+ // Named module: `__${namespace}_${moduleName}`, anonymous: `__${namespace}`
151
+ const objective = isNamed ? `__${namespace}_${mod.name}` : `__${namespace}`;
152
+ // Run the pipeline
153
+ const modFiles = compileSingleModule(ast, namespace, objective, isNamed ? mod.name : undefined, mod.filePath);
154
+ warnings.push(...modFiles.warnings);
155
+ // Record library-eligible file paths (only if there are multiple modules — single module = library author)
156
+ if (modules.length > 1) {
157
+ for (const fnName of unusedExportedFns) {
158
+ // fnName is like "math/unused" → file path "data/<ns>/function/math/unused.mcfunction"
159
+ libraryFilePaths.add(`data/${namespace}/function/${fnName}.mcfunction`);
160
+ }
161
+ }
162
+ // Merge files, emitting pack.mcmeta only once
163
+ for (const file of modFiles.files) {
164
+ if (file.path === 'pack.mcmeta') {
165
+ if (!packMetaEmitted) {
166
+ allFiles.push(file);
167
+ packMetaEmitted = true;
168
+ }
169
+ continue;
170
+ }
171
+ // Merge load.json tag values
172
+ if (file.path === 'data/minecraft/tags/function/load.json') {
173
+ mergeTagFile(allFiles, file);
174
+ continue;
175
+ }
176
+ // Merge tick.json tag values
177
+ if (file.path === 'data/minecraft/tags/function/tick.json') {
178
+ mergeTagFile(allFiles, file);
179
+ continue;
180
+ }
181
+ allFiles.push(file);
182
+ }
183
+ }
184
+ // -------------------------------------------------------------------------
185
+ // Step 7: Cross-module DCE — remove unreachable library-eligible functions
186
+ // -------------------------------------------------------------------------
187
+ const finalFiles = crossModuleDCE(allFiles, libraryFilePaths, namespace);
188
+ return { files: finalFiles, warnings };
189
+ }
190
+ /**
191
+ * File-level cross-module DCE.
192
+ *
193
+ * After all module files are emitted, prune .mcfunction files that:
194
+ * 1. Correspond to exported-but-unimported functions (tracked in `libraryPaths`)
195
+ * 2. Are not reachable (directly or transitively) from any non-library entry file
196
+ *
197
+ * The reachability is computed by scanning `function <ns>:<path>` calls in
198
+ * every .mcfunction file.
199
+ */
200
+ function crossModuleDCE(files, libraryPaths, // file paths (e.g. "data/ns/function/math/unused.mcfunction")
201
+ namespace) {
202
+ if (libraryPaths.size === 0)
203
+ return files;
204
+ // Build a map: fnPath (e.g. "ns:math/add") → file path
205
+ const fnPathToFilePath = new Map();
206
+ for (const file of files) {
207
+ const m = file.path.match(/^data\/([^/]+)\/function\/(.+)\.mcfunction$/);
208
+ if (m) {
209
+ fnPathToFilePath.set(`${m[1]}:${m[2]}`, file.path);
210
+ }
211
+ }
212
+ // Build call graph: filePath → set of called fnPaths (namespace:path)
213
+ const callGraph = new Map();
214
+ const callPattern = /\bfunction\s+([\w\-]+:[\w\-./]+)/g;
215
+ for (const file of files) {
216
+ if (!file.path.endsWith('.mcfunction'))
217
+ continue;
218
+ const called = new Set();
219
+ let match;
220
+ callPattern.lastIndex = 0;
221
+ while ((match = callPattern.exec(file.content)) !== null) {
222
+ called.add(match[1]);
223
+ }
224
+ callGraph.set(file.path, called);
225
+ }
226
+ // BFS from non-library entry files
227
+ const reachableFiles = new Set();
228
+ const queue = [];
229
+ for (const file of files) {
230
+ if (!file.path.endsWith('.mcfunction'))
231
+ continue;
232
+ if (!libraryPaths.has(file.path)) {
233
+ // Non-library file: it's an entry point
234
+ queue.push(file.path);
235
+ reachableFiles.add(file.path);
236
+ }
237
+ }
238
+ while (queue.length > 0) {
239
+ const current = queue.shift();
240
+ const called = callGraph.get(current) ?? new Set();
241
+ for (const fnPath of called) {
242
+ const filePath = fnPathToFilePath.get(fnPath);
243
+ if (filePath && !reachableFiles.has(filePath)) {
244
+ reachableFiles.add(filePath);
245
+ queue.push(filePath);
246
+ }
247
+ }
248
+ }
249
+ // Filter out unreachable library files
250
+ return files.filter(file => {
251
+ if (!libraryPaths.has(file.path))
252
+ return true; // non-library: always keep
253
+ return reachableFiles.has(file.path); // library: keep only if reachable
254
+ });
255
+ }
256
+ function compileSingleModule(ast, namespace, objective, moduleName, filePath) {
257
+ const warnings = [];
258
+ try {
259
+ const hirRaw = (0, lower_1.lowerToHIR)(ast);
260
+ const hir = (0, monomorphize_1.monomorphize)(hirRaw);
261
+ // Extract decorator metadata
262
+ const tickFunctions = [];
263
+ const loadFunctions = [];
264
+ const coroutineInfos = [];
265
+ const scheduleFunctions = [];
266
+ for (const fn of hir.functions) {
267
+ for (const dec of fn.decorators) {
268
+ if (dec.name === 'tick')
269
+ tickFunctions.push(fn.name);
270
+ if (dec.name === 'load')
271
+ loadFunctions.push(fn.name);
272
+ if (dec.name === 'coroutine') {
273
+ coroutineInfos.push({ fnName: fn.name, batch: dec.args?.batch ?? 10, onDone: dec.args?.onDone });
274
+ }
275
+ if (dec.name === 'schedule') {
276
+ scheduleFunctions.push({ name: fn.name, ticks: dec.args?.ticks ?? 1 });
277
+ }
278
+ }
279
+ }
280
+ // Patch the MIR module objective (lowerToMIR computes `__${namespace}` by default)
281
+ const mir = (0, lower_2.lowerToMIR)(hir, filePath);
282
+ mir.objective = objective;
283
+ const mirOpt = (0, pipeline_1.optimizeModule)(mir);
284
+ const coroResult = (0, coroutine_1.coroutineTransform)(mirOpt, coroutineInfos);
285
+ const mirFinal = coroResult.module;
286
+ tickFunctions.push(...coroResult.generatedTickFunctions);
287
+ const lir = (0, lower_3.lowerToLIR)(mirFinal);
288
+ lir.objective = objective;
289
+ const lirOpt = (0, pipeline_2.lirOptimizeModule)(lir);
290
+ const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions });
291
+ // For named modules: rename the load.mcfunction to avoid path collision.
292
+ // Rename `data/${ns}/function/load.mcfunction` → `data/${ns}/function/${modName}/_load.mcfunction`
293
+ // and update the load tag reference accordingly.
294
+ if (moduleName) {
295
+ const loadPath = `data/${namespace}/function/load.mcfunction`;
296
+ const newLoadPath = `data/${namespace}/function/${moduleName}/_load.mcfunction`;
297
+ const loadTagPath = 'data/minecraft/tags/function/load.json';
298
+ for (const file of files) {
299
+ if (file.path === loadPath) {
300
+ file.path = newLoadPath;
301
+ }
302
+ else if (file.path === loadTagPath) {
303
+ const tag = JSON.parse(file.content);
304
+ tag.values = tag.values.map(v => v === `${namespace}:load` ? `${namespace}:${moduleName}/_load` : v);
305
+ file.content = JSON.stringify(tag, null, 2) + '\n';
306
+ }
307
+ }
308
+ }
309
+ return { files, warnings };
310
+ }
311
+ catch (err) {
312
+ if (err instanceof diagnostics_1.DiagnosticError)
313
+ throw err;
314
+ throw err;
315
+ }
316
+ }
317
+ /** Merge a tag file (load.json / tick.json) values into existing files array. */
318
+ function mergeTagFile(files, newFile) {
319
+ const existing = files.find(f => f.path === newFile.path);
320
+ if (!existing) {
321
+ files.push(newFile);
322
+ return;
323
+ }
324
+ const existingJson = JSON.parse(existing.content);
325
+ const newJson = JSON.parse(newFile.content);
326
+ existingJson.values.push(...newJson.values);
327
+ existing.content = JSON.stringify(existingJson, null, 2) + '\n';
328
+ }
329
+ /** Detect circular imports using DFS. Throws if a cycle is found. */
330
+ function detectCircularImports(parsedModules) {
331
+ const visited = new Set();
332
+ const inStack = new Set();
333
+ function dfs(modName, stack) {
334
+ if (inStack.has(modName)) {
335
+ const cycle = [...stack.slice(stack.indexOf(modName)), modName];
336
+ throw new diagnostics_1.DiagnosticError('LoweringError', `Circular import detected: ${cycle.join(' → ')}`, { line: 1, col: 1 });
337
+ }
338
+ if (visited.has(modName))
339
+ return;
340
+ visited.add(modName);
341
+ inStack.add(modName);
342
+ const ast = parsedModules.get(modName);
343
+ if (ast) {
344
+ for (const imp of ast.imports) {
345
+ dfs(imp.moduleName, [...stack, modName]);
346
+ }
347
+ }
348
+ inStack.delete(modName);
349
+ }
350
+ for (const modName of parsedModules.keys()) {
351
+ dfs(modName, []);
352
+ }
353
+ }
354
+ // ---------------------------------------------------------------------------
355
+ // AST rewriting: remap imported symbol calls to qualified names
356
+ // ---------------------------------------------------------------------------
357
+ /** Rewrite call expressions in the program AST.
358
+ * symbolMap: localName → qualifiedName (e.g. "sin" → "math/sin") */
359
+ function rewriteCallsInProgram(program, symbolMap) {
360
+ for (const fn of program.declarations) {
361
+ rewriteBlock(fn.body, symbolMap);
362
+ }
363
+ for (const ib of program.implBlocks) {
364
+ for (const m of ib.methods) {
365
+ rewriteBlock(m.body, symbolMap);
366
+ }
367
+ }
368
+ }
369
+ function rewriteBlock(block, symbolMap) {
370
+ for (const stmt of block) {
371
+ rewriteStmt(stmt, symbolMap);
372
+ }
373
+ }
374
+ function rewriteStmt(stmt, symbolMap) {
375
+ switch (stmt.kind) {
376
+ case 'let':
377
+ case 'expr':
378
+ rewriteExpr(stmt.kind === 'let' ? stmt.init : stmt.expr, symbolMap);
379
+ break;
380
+ case 'return':
381
+ if (stmt.value)
382
+ rewriteExpr(stmt.value, symbolMap);
383
+ break;
384
+ case 'if':
385
+ rewriteExpr(stmt.cond, symbolMap);
386
+ rewriteBlock(stmt.then, symbolMap);
387
+ if (stmt.else_)
388
+ rewriteBlock(stmt.else_, symbolMap);
389
+ break;
390
+ case 'while':
391
+ rewriteExpr(stmt.cond, symbolMap);
392
+ rewriteBlock(stmt.body, symbolMap);
393
+ break;
394
+ case 'for':
395
+ if (stmt.init)
396
+ rewriteStmt(stmt.init, symbolMap);
397
+ rewriteExpr(stmt.cond, symbolMap);
398
+ rewriteExpr(stmt.step, symbolMap);
399
+ rewriteBlock(stmt.body, symbolMap);
400
+ break;
401
+ case 'for_range':
402
+ rewriteExpr(stmt.start, symbolMap);
403
+ rewriteExpr(stmt.end, symbolMap);
404
+ rewriteBlock(stmt.body, symbolMap);
405
+ break;
406
+ case 'foreach':
407
+ rewriteExpr(stmt.iterable, symbolMap);
408
+ rewriteBlock(stmt.body, symbolMap);
409
+ break;
410
+ case 'match':
411
+ rewriteExpr(stmt.expr, symbolMap);
412
+ for (const arm of stmt.arms) {
413
+ if (arm.pattern)
414
+ rewriteExpr(arm.pattern, symbolMap);
415
+ rewriteBlock(arm.body, symbolMap);
416
+ }
417
+ break;
418
+ case 'as_block':
419
+ case 'at_block':
420
+ rewriteBlock(stmt.body, symbolMap);
421
+ break;
422
+ case 'as_at':
423
+ rewriteBlock(stmt.body, symbolMap);
424
+ break;
425
+ case 'execute':
426
+ rewriteBlock(stmt.body, symbolMap);
427
+ break;
428
+ case 'let_destruct':
429
+ rewriteExpr(stmt.init, symbolMap);
430
+ break;
431
+ // break, continue, raw: nothing to rewrite
432
+ }
433
+ }
434
+ function rewriteExpr(expr, symbolMap) {
435
+ switch (expr.kind) {
436
+ case 'call': {
437
+ // Remap the function name if it's an imported symbol
438
+ const remapped = symbolMap.get(expr.fn);
439
+ if (remapped) {
440
+ ;
441
+ expr.fn = remapped;
442
+ }
443
+ for (const arg of expr.args)
444
+ rewriteExpr(arg, symbolMap);
445
+ break;
446
+ }
447
+ case 'assign':
448
+ rewriteExpr(expr.value, symbolMap);
449
+ break;
450
+ case 'binary':
451
+ rewriteExpr(expr.left, symbolMap);
452
+ rewriteExpr(expr.right, symbolMap);
453
+ break;
454
+ case 'unary':
455
+ rewriteExpr(expr.operand, symbolMap);
456
+ break;
457
+ case 'member':
458
+ rewriteExpr(expr.obj, symbolMap);
459
+ break;
460
+ case 'member_assign':
461
+ rewriteExpr(expr.obj, symbolMap);
462
+ rewriteExpr(expr.value, symbolMap);
463
+ break;
464
+ case 'index':
465
+ rewriteExpr(expr.obj, symbolMap);
466
+ rewriteExpr(expr.index, symbolMap);
467
+ break;
468
+ case 'array_lit':
469
+ for (const el of expr.elements)
470
+ rewriteExpr(el, symbolMap);
471
+ break;
472
+ case 'struct_lit':
473
+ for (const f of expr.fields)
474
+ rewriteExpr(f.value, symbolMap);
475
+ break;
476
+ case 'invoke':
477
+ rewriteExpr(expr.callee, symbolMap);
478
+ for (const arg of expr.args)
479
+ rewriteExpr(arg, symbolMap);
480
+ break;
481
+ case 'tuple_lit':
482
+ for (const el of expr.elements)
483
+ rewriteExpr(el, symbolMap);
484
+ break;
485
+ case 'static_call':
486
+ for (const arg of expr.args)
487
+ rewriteExpr(arg, symbolMap);
488
+ break;
489
+ // Literals, ident, selector, path_expr, f_string, etc: nothing to rewrite
490
+ }
491
+ }
492
+ //# sourceMappingURL=modules.js.map
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Source Map Generation — Stage 7 auxiliary output.
3
+ *
4
+ * For each generated .mcfunction file, produces a parallel sourcemap.json
5
+ * that maps output line numbers back to .mcrs source locations.
6
+ *
7
+ * Format:
8
+ * {
9
+ * "version": 1,
10
+ * "generatedFile": "data/ns/function/main.mcfunction",
11
+ * "sources": ["src/main.mcrs"],
12
+ * "mappings": [
13
+ * { "line": 1, "source": 0, "sourceLine": 5, "sourceCol": 2 },
14
+ * ...
15
+ * ]
16
+ * }
17
+ */
18
+ import type { SourceLoc } from '../lir/types';
19
+ export interface SourceMapEntry {
20
+ /** 1-based output line number in the .mcfunction file */
21
+ line: number;
22
+ /** Index into the `sources` array */
23
+ source: number;
24
+ /** 1-based line in the source .mcrs file */
25
+ sourceLine: number;
26
+ /** 1-based column in the source .mcrs file */
27
+ sourceCol: number;
28
+ }
29
+ export interface SourceMap {
30
+ version: 1;
31
+ /** Relative path to the generated .mcfunction file */
32
+ generatedFile: string;
33
+ /** List of source file paths referenced by mappings */
34
+ sources: string[];
35
+ /** One entry per mapped output line */
36
+ mappings: SourceMapEntry[];
37
+ }
38
+ export declare class SourceMapBuilder {
39
+ private readonly generatedFile;
40
+ private readonly sourceIndex;
41
+ private readonly sources;
42
+ private readonly mappings;
43
+ private lineNumber;
44
+ constructor(generatedFile: string);
45
+ /** Record the source location for the next output line. */
46
+ addLine(sourceLoc: SourceLoc | undefined): void;
47
+ /** Return the completed SourceMap, or null if there are no mappings. */
48
+ build(): SourceMap | null;
49
+ }
50
+ /** Serialize a SourceMap to JSON string (pretty-printed). */
51
+ export declare function serializeSourceMap(map: SourceMap): string;
52
+ /** Given a .mcfunction path, return the path for the sidecar sourcemap.json. */
53
+ export declare function sourceMapPath(mcfunctionPath: string): string;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ /**
3
+ * Source Map Generation — Stage 7 auxiliary output.
4
+ *
5
+ * For each generated .mcfunction file, produces a parallel sourcemap.json
6
+ * that maps output line numbers back to .mcrs source locations.
7
+ *
8
+ * Format:
9
+ * {
10
+ * "version": 1,
11
+ * "generatedFile": "data/ns/function/main.mcfunction",
12
+ * "sources": ["src/main.mcrs"],
13
+ * "mappings": [
14
+ * { "line": 1, "source": 0, "sourceLine": 5, "sourceCol": 2 },
15
+ * ...
16
+ * ]
17
+ * }
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.SourceMapBuilder = void 0;
21
+ exports.serializeSourceMap = serializeSourceMap;
22
+ exports.sourceMapPath = sourceMapPath;
23
+ // ---------------------------------------------------------------------------
24
+ // Builder — accumulates mappings as lines are emitted
25
+ // ---------------------------------------------------------------------------
26
+ class SourceMapBuilder {
27
+ constructor(generatedFile) {
28
+ this.sourceIndex = new Map();
29
+ this.sources = [];
30
+ this.mappings = [];
31
+ this.lineNumber = 0;
32
+ this.generatedFile = generatedFile;
33
+ }
34
+ /** Record the source location for the next output line. */
35
+ addLine(sourceLoc) {
36
+ this.lineNumber++;
37
+ if (!sourceLoc)
38
+ return;
39
+ let idx = this.sourceIndex.get(sourceLoc.file);
40
+ if (idx === undefined) {
41
+ idx = this.sources.length;
42
+ this.sources.push(sourceLoc.file);
43
+ this.sourceIndex.set(sourceLoc.file, idx);
44
+ }
45
+ this.mappings.push({
46
+ line: this.lineNumber,
47
+ source: idx,
48
+ sourceLine: sourceLoc.line,
49
+ sourceCol: sourceLoc.col,
50
+ });
51
+ }
52
+ /** Return the completed SourceMap, or null if there are no mappings. */
53
+ build() {
54
+ if (this.mappings.length === 0)
55
+ return null;
56
+ return {
57
+ version: 1,
58
+ generatedFile: this.generatedFile,
59
+ sources: [...this.sources],
60
+ mappings: [...this.mappings],
61
+ };
62
+ }
63
+ }
64
+ exports.SourceMapBuilder = SourceMapBuilder;
65
+ /** Serialize a SourceMap to JSON string (pretty-printed). */
66
+ function serializeSourceMap(map) {
67
+ return JSON.stringify(map, null, 2) + '\n';
68
+ }
69
+ /** Given a .mcfunction path, return the path for the sidecar sourcemap.json. */
70
+ function sourceMapPath(mcfunctionPath) {
71
+ return mcfunctionPath.replace(/\.mcfunction$/, '.sourcemap.json');
72
+ }
73
+ //# sourceMappingURL=sourcemap.js.map
@@ -0,0 +1,15 @@
1
+ /**
2
+ * AST → HIR Lowering — Stage 2 of the RedScript compiler pipeline.
3
+ *
4
+ * Desugaring transforms:
5
+ * - for(init;cond;step) → block { init; while(cond) { body; step } }
6
+ * - for_range(v,start,end) → block { let v = start; while(v < end) { body; v = v + 1 } }
7
+ * - a += b / -= / *= / /= / %= → a = a OP b
8
+ * - a && b → if(a) { b } else { false }
9
+ * - a || b → if(a) { true } else { b }
10
+ * - as_block / at_block / as_at → unified execute with subcommands
11
+ * - All other nodes pass through with field-wise recursion
12
+ */
13
+ import type { Program } from '../ast/types';
14
+ import type { HIRModule } from './types';
15
+ export declare function lowerToHIR(program: Program): HIRModule;