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
package/src/cli.ts CHANGED
@@ -1,21 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * RedScript CLI
4
- *
4
+ *
5
5
  * Usage:
6
- * redscript compile <file> [-o <out>] [--output-nbt <file>] [--namespace <ns>]
6
+ * redscript compile <file> [-o <out>] [--namespace <ns>]
7
7
  * redscript check <file>
8
8
  * redscript repl
9
9
  * redscript version
10
10
  */
11
11
 
12
- import { compile, check } from './index'
13
- import { generateCommandBlocks } from './codegen/cmdblock'
14
- import { compileToStructure } from './codegen/structure'
12
+ import { compile, checkWithWarnings } from './index'
15
13
  import { formatError } from './diagnostics'
14
+ import { parseMcVersion, DEFAULT_MC_VERSION } from './types/mc-version'
16
15
  import { startRepl } from './repl'
17
16
  import { generateDts } from './builtins/metadata'
18
- import type { OptimizationStats } from './optimizer/commands'
17
+ import { FileCache } from './cache/index'
18
+ import { DependencyGraph } from './cache/deps'
19
+ import { compileIncremental } from './cache/incremental'
19
20
  import * as fs from 'fs'
20
21
  import * as path from 'path'
21
22
  import * as https from 'https'
@@ -26,10 +27,10 @@ const args = process.argv.slice(2)
26
27
 
27
28
  function printUsage(): void {
28
29
  console.log(`
29
- RedScript Compiler
30
+ RedScript Compiler v2
30
31
 
31
32
  Usage:
32
- redscript compile <file> [-o <out>] [--output-nbt <file>] [--namespace <ns>] [--scoreboard <obj>] [--target <target>] [--no-dce]
33
+ redscript compile <file> [-o <out>] [--namespace <ns>]
33
34
  redscript watch <dir> [-o <outdir>] [--namespace <ns>] [--hot-reload <url>]
34
35
  redscript check <file>
35
36
  redscript fmt <file.mcrs> [file2.mcrs ...]
@@ -48,24 +49,15 @@ Commands:
48
49
  upgrade Upgrade to the latest version (npm install -g redscript-mc@latest)
49
50
 
50
51
  Options:
51
- -o, --output <path> Output directory or file path, depending on target
52
- --output-nbt <file> Output .nbt file path for structure target
52
+ -o, --output <path> Output directory or file path
53
53
  --namespace <ns> Datapack namespace (default: derived from filename)
54
- --target <target> Output target: datapack (default), cmdblock, or structure
55
- --no-dce Disable AST dead code elimination
56
- --no-mangle Disable variable name mangling (use readable names)
57
- --scoreboard <obj> Scoreboard objective for variables (default: namespace).
58
- Each datapack automatically uses its namespace as the objective
59
- so multiple datapacks can coexist without collisions.
60
- --stats Print optimizer statistics
61
54
  --hot-reload <url> After each successful compile, POST to <url>/reload
62
55
  (use with redscript-testharness; e.g. http://localhost:25561)
56
+ --source-map Generate .sourcemap.json files alongside .mcfunction output
57
+ --mc-version <ver> Target Minecraft version (default: 1.21). Affects codegen features.
58
+ e.g. --mc-version 1.20.2, --mc-version 1.19
59
+ --lenient Treat type errors as warnings instead of blocking compilation
63
60
  -h, --help Show this help message
64
-
65
- Targets:
66
- datapack Generate a full Minecraft datapack (default)
67
- cmdblock Generate JSON structure for command block placement
68
- structure Generate a Minecraft structure .nbt file with command blocks
69
61
  `)
70
62
  }
71
63
 
@@ -163,17 +155,14 @@ function parseArgs(args: string[]): {
163
155
  command?: string
164
156
  file?: string
165
157
  output?: string
166
- outputNbt?: string
167
158
  namespace?: string
168
- target?: string
169
- stats?: boolean
170
159
  help?: boolean
171
160
  hotReload?: string
172
- dce?: boolean
173
- mangle?: boolean
174
- scoreboardObjective?: string
161
+ sourceMap?: boolean
162
+ mcVersionStr?: string
163
+ lenient?: boolean
175
164
  } {
176
- const result: ReturnType<typeof parseArgs> = { dce: true, mangle: true }
165
+ const result: ReturnType<typeof parseArgs> = {}
177
166
  let i = 0
178
167
 
179
168
  while (i < args.length) {
@@ -185,29 +174,20 @@ function parseArgs(args: string[]): {
185
174
  } else if (arg === '-o' || arg === '--output') {
186
175
  result.output = args[++i]
187
176
  i++
188
- } else if (arg === '--output-nbt') {
189
- result.outputNbt = args[++i]
190
- i++
191
177
  } else if (arg === '--namespace') {
192
178
  result.namespace = args[++i]
193
179
  i++
194
- } else if (arg === '--target') {
195
- result.target = args[++i]
196
- i++
197
- } else if (arg === '--stats') {
198
- result.stats = true
180
+ } else if (arg === '--hot-reload') {
181
+ result.hotReload = args[++i]
199
182
  i++
200
- } else if (arg === '--no-dce') {
201
- result.dce = false
183
+ } else if (arg === '--source-map') {
184
+ result.sourceMap = true
202
185
  i++
203
- } else if (arg === '--no-mangle') {
204
- result.mangle = false
186
+ } else if (arg === '--mc-version') {
187
+ result.mcVersionStr = args[++i]
205
188
  i++
206
- } else if (arg === '--scoreboard') {
207
- result.scoreboardObjective = args[++i]
208
- i++
209
- } else if (arg === '--hot-reload') {
210
- result.hotReload = args[++i]
189
+ } else if (arg === '--lenient') {
190
+ result.lenient = true
211
191
  i++
212
192
  } else if (!result.command) {
213
193
  result.command = arg
@@ -229,48 +209,13 @@ function deriveNamespace(filePath: string): string {
229
209
  return basename.toLowerCase().replace(/[^a-z0-9]/g, '_')
230
210
  }
231
211
 
232
- function printWarnings(warnings: Array<{ code: string; message: string; line?: number; col?: number; filePath?: string }> | undefined): void {
233
- if (!warnings || warnings.length === 0) {
234
- return
235
- }
236
-
237
- for (const warning of warnings) {
238
- const loc = warning.filePath
239
- ? `${warning.filePath}:${warning.line ?? '?'}`
240
- : warning.line != null
241
- ? `line ${warning.line}`
242
- : null
243
- const locStr = loc ? ` (${loc})` : ''
244
- console.error(`Warning [${warning.code}]: ${warning.message}${locStr}`)
245
- }
246
- }
247
-
248
- function formatReduction(before: number, after: number): string {
249
- if (before === 0) return '0%'
250
- return `${Math.round(((before - after) / before) * 100)}%`
251
- }
252
-
253
- function printOptimizationStats(stats: OptimizationStats | undefined): void {
254
- if (!stats) return
255
-
256
- console.log('Optimizations applied:')
257
- console.log(` LICM: ${stats.licmHoists} reads hoisted from ${stats.licmLoopBodies} loop bodies`)
258
- console.log(` CSE: ${stats.cseRedundantReads + stats.cseArithmetic} expressions eliminated`)
259
- console.log(` setblock batching: ${stats.setblockMergedCommands} setblocks -> ${stats.setblockFillCommands} fills (saved ${stats.setblockSavedCommands} commands)`)
260
- console.log(` dead code: ${stats.deadCodeRemoved} commands removed`)
261
- console.log(` constant folding: ${stats.constantFolds} constants folded`)
262
- console.log(` Total mcfunction commands: ${stats.totalCommandsBefore} -> ${stats.totalCommandsAfter} (${formatReduction(stats.totalCommandsBefore, stats.totalCommandsAfter)} reduction)`)
263
- }
264
-
265
212
  function compileCommand(
266
213
  file: string,
267
214
  output: string,
268
215
  namespace: string,
269
- target: string = 'datapack',
270
- showStats = false,
271
- dce = true,
272
- mangle = true,
273
- scoreboardObjective: string | undefined = undefined
216
+ sourceMap = false,
217
+ mcVersionStr?: string,
218
+ lenient = false,
274
219
  ): void {
275
220
  // Read source file
276
221
  if (!fs.existsSync(file)) {
@@ -278,78 +223,46 @@ function compileCommand(
278
223
  process.exit(1)
279
224
  }
280
225
 
226
+ let mcVersion = DEFAULT_MC_VERSION
227
+ if (mcVersionStr) {
228
+ try {
229
+ mcVersion = parseMcVersion(mcVersionStr)
230
+ } catch (e) {
231
+ console.error(`Error: ${(e as Error).message}`)
232
+ process.exit(1)
233
+ }
234
+ }
235
+
281
236
  const source = fs.readFileSync(file, 'utf-8')
282
237
 
283
238
  try {
284
- if (target === 'cmdblock') {
285
- const result = compile(source, { namespace, filePath: file, dce, mangle, scoreboardObjective })
286
- printWarnings(result.warnings)
287
-
288
- // Generate command block JSON
289
- const hasTick = result.files.some(f => f.path.includes('__tick.mcfunction'))
290
- const hasLoad = result.files.some(f => f.path.includes('__load.mcfunction'))
291
- const cmdBlocks = generateCommandBlocks(namespace, hasTick, hasLoad)
292
-
293
- // Write command block JSON
294
- fs.mkdirSync(output, { recursive: true })
295
- const outputFile = path.join(output, `${namespace}_cmdblocks.json`)
296
- fs.writeFileSync(outputFile, JSON.stringify(cmdBlocks, null, 2))
297
-
298
- console.log(`✓ Generated command blocks for ${file}`)
299
- console.log(` Output: ${outputFile}`)
300
- console.log(` Blocks: ${cmdBlocks.blocks.length}`)
301
- if (showStats) {
302
- printOptimizationStats(result.stats)
303
- }
304
- } else if (target === 'structure') {
305
- const structure = compileToStructure(source, namespace, file, { dce, mangle })
306
- fs.mkdirSync(path.dirname(output), { recursive: true })
307
- fs.writeFileSync(output, structure.buffer)
308
-
309
- console.log(`✓ Generated structure for ${file}`)
310
- console.log(` Output: ${output}`)
311
- console.log(` Blocks: ${structure.blockCount}`)
312
- if (showStats) {
313
- printOptimizationStats(structure.stats)
314
- }
315
- } else {
316
- const result = compile(source, { namespace, filePath: file, dce, mangle, scoreboardObjective })
317
- printWarnings(result.warnings)
318
-
319
- // Default: generate datapack
320
- // Create output directory
321
- fs.mkdirSync(output, { recursive: true })
322
-
323
- // Write all files
324
- for (const dataFile of result.files) {
325
- const filePath = path.join(output, dataFile.path)
326
- const dir = path.dirname(filePath)
327
- fs.mkdirSync(dir, { recursive: true })
328
- fs.writeFileSync(filePath, dataFile.content)
329
- }
239
+ const result = compile(source, { namespace, filePath: file, generateSourceMap: sourceMap, mcVersion, lenient })
330
240
 
331
- // Write sourcemap alongside datapack when mangle mode is active
332
- if (mangle && result.sourceMap && Object.keys(result.sourceMap).length > 0) {
333
- const mapPath = path.join(output, `${namespace}.map.json`)
334
- fs.writeFileSync(mapPath, JSON.stringify(result.sourceMap, null, 2))
335
- console.log(` Sourcemap: ${mapPath}`)
336
- }
241
+ for (const w of result.warnings) {
242
+ console.error(`Warning: ${w}`)
243
+ }
337
244
 
338
- console.log(`✓ Compiled ${file} to ${output}/`)
339
- console.log(` Namespace: ${namespace}`)
340
- console.log(` Functions: ${result.ir.functions.length}`)
341
- console.log(` Files: ${result.files.length}`)
342
- if (showStats) {
343
- printOptimizationStats(result.stats)
344
- }
245
+ // Create output directory
246
+ fs.mkdirSync(output, { recursive: true })
247
+
248
+ // Write all files
249
+ for (const dataFile of result.files) {
250
+ const filePath = path.join(output, dataFile.path)
251
+ const dir = path.dirname(filePath)
252
+ fs.mkdirSync(dir, { recursive: true })
253
+ fs.writeFileSync(filePath, dataFile.content)
345
254
  }
255
+
256
+ console.log(`✓ Compiled ${file} to ${output}/`)
257
+ console.log(` Namespace: ${namespace}`)
258
+ console.log(` Files: ${result.files.length}`)
346
259
  } catch (err) {
347
- console.error(formatError(err as Error, source))
260
+ console.error(formatError(err as Error, source, file))
348
261
  process.exit(1)
349
262
  }
350
263
  }
351
264
 
352
- function checkCommand(file: string): void {
265
+ function checkCommand(file: string, namespace?: string): void {
353
266
  // Read source file
354
267
  if (!fs.existsSync(file)) {
355
268
  console.error(`Error: File not found: ${file}`)
@@ -358,13 +271,19 @@ function checkCommand(file: string): void {
358
271
 
359
272
  const source = fs.readFileSync(file, 'utf-8')
360
273
 
361
- const error = check(source, 'redscript', file)
362
- if (error) {
363
- console.error(formatError(error, source))
274
+ const ns = namespace ?? deriveNamespace(file)
275
+ const result = checkWithWarnings(source, ns, file)
276
+
277
+ for (const w of result.warnings) {
278
+ console.error(`Warning: ${w}`)
279
+ }
280
+
281
+ if (result.error) {
282
+ console.error(formatError(result.error, source, file))
364
283
  process.exit(1)
365
284
  }
366
285
 
367
- console.log(`✓ ${file} is valid`)
286
+ console.log(`✓ No errors found`)
368
287
  }
369
288
 
370
289
  async function hotReload(url: string): Promise<void> {
@@ -380,7 +299,7 @@ async function hotReload(url: string): Promise<void> {
380
299
  }
381
300
  }
382
301
 
383
- function watchCommand(dir: string, output: string, namespace?: string, hotReloadUrl?: string, dce = true): void {
302
+ function watchCommand(dir: string, output: string, namespace?: string, hotReloadUrl?: string): void {
384
303
  // Check if directory exists
385
304
  if (!fs.existsSync(dir)) {
386
305
  console.error(`Error: Directory not found: ${dir}`)
@@ -396,52 +315,55 @@ function watchCommand(dir: string, output: string, namespace?: string, hotReload
396
315
  console.log(`👁 Watching ${dir} for .mcrs file changes...`)
397
316
  console.log(` Output: ${output}`)
398
317
  if (hotReloadUrl) console.log(` Hot reload: ${hotReloadUrl}`)
318
+ console.log(` Incremental compilation enabled`)
399
319
  console.log(` Press Ctrl+C to stop\n`)
400
320
 
321
+ // Set up incremental compilation infrastructure
322
+ const cacheDir = path.join(dir, '.redscript-cache')
323
+ const cache = new FileCache(cacheDir)
324
+ cache.load()
325
+ const depGraph = new DependencyGraph()
326
+
401
327
  // Debounce timer
402
328
  let debounceTimer: NodeJS.Timeout | null = null
403
329
 
404
- // Compile all .mcrs files in directory
405
- async function compileAll(): Promise<void> {
330
+ // Compile all .mcrs files in directory (incrementally)
331
+ async function compileAllIncremental(): Promise<void> {
406
332
  const files = findRsFiles(dir)
407
333
  if (files.length === 0) {
408
334
  console.log(`⚠ No .mcrs files found in ${dir}`)
409
335
  return
410
336
  }
411
337
 
412
- let hasErrors = false
413
- for (const file of files) {
414
- let source = ''
415
- try {
416
- source = fs.readFileSync(file, 'utf-8')
417
- const ns = namespace ?? deriveNamespace(file)
418
- const result = compile(source, { namespace: ns, filePath: file, dce })
419
- printWarnings(result.warnings)
420
-
421
- // Create output directory
422
- fs.mkdirSync(output, { recursive: true })
423
-
424
- // Write all files
425
- for (const dataFile of result.files) {
426
- const filePath = path.join(output, dataFile.path)
427
- const fileDir = path.dirname(filePath)
428
- fs.mkdirSync(fileDir, { recursive: true })
429
- fs.writeFileSync(filePath, dataFile.content)
430
- }
431
-
432
- const timestamp = new Date().toLocaleTimeString()
433
- console.log(`✓ [${timestamp}] Compiled ${file} (${result.files.length} files)`)
434
- } catch (err) {
435
- hasErrors = true
436
- const timestamp = new Date().toLocaleTimeString()
437
- console.error(`✗ [${timestamp}] ${formatError(err as Error, source)}`)
338
+ const incResult = compileIncremental(files, cache, depGraph, {
339
+ namespace,
340
+ output,
341
+ })
342
+
343
+ const timestamp = new Date().toLocaleTimeString()
344
+
345
+ // Print warnings from recompiled files
346
+ for (const [file, compileResult] of incResult.results) {
347
+ for (const w of compileResult.warnings) {
348
+ console.error(`Warning: ${w}`)
438
349
  }
350
+ console.log(`✓ [${timestamp}] Compiled ${path.relative(dir, file)} (${compileResult.files.length} files)`)
351
+ }
352
+
353
+ if (incResult.cached > 0) {
354
+ console.log(` [${timestamp}] ${incResult.cached} file(s) unchanged (cached)`)
439
355
  }
440
356
 
441
- if (!hasErrors) {
442
- if (hotReloadUrl) await hotReload(hotReloadUrl)
443
- console.log('')
357
+ // Print errors
358
+ for (const [file, errMsg] of incResult.errors) {
359
+ console.error(`✗ [${timestamp}] ${path.relative(dir, file)}: ${errMsg}`)
444
360
  }
361
+
362
+ // Persist cache
363
+ cache.save()
364
+
365
+ if (incResult.errors.size === 0 && hotReloadUrl) await hotReload(hotReloadUrl)
366
+ console.log('')
445
367
  }
446
368
 
447
369
  // Find all .mcrs files recursively
@@ -451,7 +373,7 @@ function watchCommand(dir: string, output: string, namespace?: string, hotReload
451
373
 
452
374
  for (const entry of entries) {
453
375
  const fullPath = path.join(directory, entry.name)
454
- if (entry.isDirectory()) {
376
+ if (entry.isDirectory() && entry.name !== '.redscript-cache') {
455
377
  results.push(...findRsFiles(fullPath))
456
378
  } else if (entry.isFile() && entry.name.endsWith('.mcrs')) {
457
379
  results.push(fullPath)
@@ -462,7 +384,7 @@ function watchCommand(dir: string, output: string, namespace?: string, hotReload
462
384
  }
463
385
 
464
386
  // Initial compile
465
- void compileAll()
387
+ void compileAllIncremental()
466
388
 
467
389
  // Watch for changes
468
390
  fs.watch(dir, { recursive: true }, (eventType, filename) => {
@@ -473,7 +395,7 @@ function watchCommand(dir: string, output: string, namespace?: string, hotReload
473
395
  }
474
396
  debounceTimer = setTimeout(() => {
475
397
  console.log(`📝 Change detected: ${filename}`)
476
- void compileAll()
398
+ void compileAllIncremental()
477
399
  }, 100)
478
400
  }
479
401
  })
@@ -504,20 +426,15 @@ async function main(): Promise<void> {
504
426
  }
505
427
  {
506
428
  const namespace = parsed.namespace ?? deriveNamespace(parsed.file)
507
- const target = parsed.target ?? 'datapack'
508
- const output = target === 'structure'
509
- ? (parsed.outputNbt ?? parsed.output ?? `./${namespace}.nbt`)
510
- : (parsed.output ?? './dist')
429
+ const output = parsed.output ?? './dist'
511
430
 
512
431
  compileCommand(
513
432
  parsed.file,
514
433
  output,
515
434
  namespace,
516
- target,
517
- parsed.stats,
518
- parsed.dce,
519
- parsed.mangle,
520
- parsed.scoreboardObjective // undefined = derive from namespace in compile()
435
+ parsed.sourceMap,
436
+ parsed.mcVersionStr,
437
+ parsed.lenient,
521
438
  )
522
439
  }
523
440
  break
@@ -533,7 +450,6 @@ async function main(): Promise<void> {
533
450
  parsed.output ?? './dist',
534
451
  parsed.namespace,
535
452
  parsed.hotReload,
536
- parsed.dce
537
453
  )
538
454
  break
539
455
 
@@ -543,7 +459,7 @@ async function main(): Promise<void> {
543
459
  printUsage()
544
460
  process.exit(1)
545
461
  }
546
- checkCommand(parsed.file)
462
+ checkCommand(parsed.file, parsed.namespace)
547
463
  break
548
464
 
549
465
  case 'fmt':
package/src/compile.ts CHANGED
@@ -1,58 +1,25 @@
1
1
  /**
2
2
  * RedScript Compile API
3
3
  *
4
- * Main compile function with proper error handling and diagnostics.
4
+ * Preprocessing utilities and v2 compile re-export.
5
5
  */
6
6
 
7
7
  import * as fs from 'fs'
8
8
  import * as path from 'path'
9
9
 
10
- import { Lexer } from './lexer'
11
- import { Parser } from './parser'
12
- import { Lowering, setScoreboardObjective } from './lowering'
13
- import { optimize } from './optimizer/passes'
14
- import { eliminateDeadCode } from './optimizer/dce'
15
- import { generateDatapackWithStats, DatapackFile } from './codegen/mcfunction'
16
- import { DiagnosticError, formatError, parseErrorMessage } from './diagnostics'
17
- import type { IRModule } from './ir/types'
18
- import type { Program } from './ast/types'
10
+ import { DiagnosticError } from './diagnostics'
19
11
 
20
12
  // ---------------------------------------------------------------------------
21
- // Compile Options
13
+ // Re-export v2 compile
22
14
  // ---------------------------------------------------------------------------
23
15
 
24
- export interface CompileOptions {
25
- namespace?: string
26
- filePath?: string
27
- optimize?: boolean
28
- dce?: boolean
29
- mangle?: boolean
30
- /** Scoreboard objective used for all variable slots.
31
- * Defaults to '__<namespace>' (e.g. '__mathshow') — the double-underscore
32
- * prefix signals compiler-internal and avoids occupying the user's namespace.
33
- * Each datapack gets a unique objective automatically; no manual setup needed. */
34
- scoreboardObjective?: string
35
- /** Additional source files that should be treated as *library* code.
36
- * Functions in these files are DCE-eligible: they are only compiled into
37
- * the datapack when actually called from user code. Each string is parsed
38
- * independently (as if it had `module library;` at the top), so library
39
- * mode never bleeds into the main `source`. */
40
- librarySources?: string[]
41
- }
16
+ export { compile, CompileOptions, CompileResult } from './emit/compile'
17
+ export type { DatapackFile } from './emit/index'
42
18
 
43
19
  // ---------------------------------------------------------------------------
44
- // Compile Result
20
+ // Source Range / Preprocessing
45
21
  // ---------------------------------------------------------------------------
46
22
 
47
- export interface CompileResult {
48
- success: boolean
49
- files?: DatapackFile[]
50
- advancements?: DatapackFile[]
51
- ast?: Program
52
- ir?: IRModule
53
- error?: DiagnosticError
54
- }
55
-
56
23
  export interface SourceRange {
57
24
  startLine: number
58
25
  endLine: number
@@ -215,126 +182,3 @@ export function preprocessSourceWithMetadata(source: string, options: Preprocess
215
182
  export function preprocessSource(source: string, options: PreprocessOptions = {}): string {
216
183
  return preprocessSourceWithMetadata(source, options).source
217
184
  }
218
-
219
- // ---------------------------------------------------------------------------
220
- // Main Compile Function
221
- // ---------------------------------------------------------------------------
222
-
223
- export function compile(source: string, options: CompileOptions = {}): CompileResult {
224
- const { namespace = 'redscript', filePath, optimize: shouldOptimize = true } = options
225
- const shouldRunDce = options.dce ?? shouldOptimize
226
- let sourceLines = source.split('\n')
227
-
228
- try {
229
- const preprocessed = preprocessSourceWithMetadata(source, { filePath })
230
- const preprocessedSource = preprocessed.source
231
- sourceLines = preprocessedSource.split('\n')
232
-
233
- // Lexing
234
- const tokens = new Lexer(preprocessedSource, filePath).tokenize()
235
-
236
- // Parsing — user source
237
- const parsedAst = new Parser(tokens, preprocessedSource, filePath).parse(namespace)
238
-
239
- // Collect all library sources: explicit `librarySources` option +
240
- // auto-detected imports (files with `module library;` pulled out by the
241
- // preprocessor rather than concatenated).
242
- const allLibrarySources: Array<{ src: string; fp?: string }> = []
243
- for (const libSrc of options.librarySources ?? []) {
244
- allLibrarySources.push({ src: libSrc })
245
- }
246
- for (const li of preprocessed.libraryImports ?? []) {
247
- allLibrarySources.push({ src: li.source, fp: li.filePath })
248
- }
249
-
250
- // Parse library sources independently (fresh Parser per source) so that
251
- // `inLibraryMode` never bleeds into user code. All resulting functions get
252
- // isLibraryFn=true (either via `module library;` in the source, or forced below).
253
- for (const { src, fp } of allLibrarySources) {
254
- const libPreprocessed = preprocessSourceWithMetadata(src, fp ? { filePath: fp } : {})
255
- const libTokens = new Lexer(libPreprocessed.source, fp).tokenize()
256
- const libAst = new Parser(libTokens, libPreprocessed.source, fp).parse(namespace)
257
- // Force all functions to library mode (even if source lacks `module library;`)
258
- for (const fn of libAst.declarations) fn.isLibraryFn = true
259
- // Merge into main AST
260
- parsedAst.declarations.push(...libAst.declarations)
261
- parsedAst.structs.push(...libAst.structs)
262
- parsedAst.implBlocks.push(...libAst.implBlocks)
263
- parsedAst.enums.push(...libAst.enums)
264
- parsedAst.consts.push(...libAst.consts)
265
- parsedAst.globals.push(...libAst.globals)
266
- }
267
- const dceResult = shouldRunDce ? eliminateDeadCode(parsedAst) : { program: parsedAst, warnings: [] }
268
- const ast = dceResult.program
269
-
270
- // Configure scoreboard objective for this compilation.
271
- // Default: use the datapack namespace so each datapack gets its own objective
272
- // automatically, preventing variable collisions when multiple datapacks coexist.
273
- const scoreboardObj = options.scoreboardObjective ?? `__${namespace}`
274
- setScoreboardObjective(scoreboardObj)
275
-
276
- // Lowering
277
- const ir = new Lowering(namespace, preprocessed.ranges).lower(ast)
278
-
279
- // Optimization
280
- const optimized: IRModule = shouldOptimize
281
- ? { ...ir, functions: ir.functions.map(fn => optimize(fn)) }
282
- : ir
283
-
284
- // Code generation — mangle=true by default to prevent cross-function
285
- // scoreboard variable collisions in the global MC scoreboard namespace.
286
- const generated = generateDatapackWithStats(optimized, {
287
- mangle: options.mangle ?? true,
288
- scoreboardObjective: scoreboardObj,
289
- })
290
-
291
- return {
292
- success: true,
293
- files: [...generated.files, ...generated.advancements],
294
- advancements: generated.advancements,
295
- ast,
296
- ir: optimized,
297
- }
298
- } catch (err) {
299
- // Already a DiagnosticError
300
- if (err instanceof DiagnosticError) {
301
- return { success: false, error: err }
302
- }
303
-
304
- // Try to parse the error message for line/col info
305
- if (err instanceof Error) {
306
- const diagnostic = parseErrorMessage(
307
- 'ParseError',
308
- err.message,
309
- sourceLines,
310
- filePath
311
- )
312
- return { success: false, error: diagnostic }
313
- }
314
-
315
- // Unknown error
316
- return {
317
- success: false,
318
- error: new DiagnosticError(
319
- 'ParseError',
320
- String(err),
321
- { file: filePath, line: 1, col: 1 },
322
- sourceLines
323
- )
324
- }
325
- }
326
- }
327
-
328
- // ---------------------------------------------------------------------------
329
- // Format Compile Error
330
- // ---------------------------------------------------------------------------
331
-
332
- export function formatCompileError(result: CompileResult): string {
333
- if (result.success) {
334
- return 'Compilation successful'
335
- }
336
- if (result.error) {
337
- return formatError(result.error, result.error.sourceLines?.join('\n'))
338
- }
339
- return 'Unknown error'
340
- }