redscript-mc 2.0.0 → 2.1.1

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 (643) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +48 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +321 -0
  22. package/dist/src/__tests__/mc-syntax.test.js +1 -6
  23. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  24. package/dist/src/__tests__/mc-version.test.js +154 -0
  25. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  26. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  27. package/dist/src/__tests__/modules.test.d.ts +7 -0
  28. package/dist/src/__tests__/modules.test.js +333 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  30. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  31. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  32. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  33. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  34. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  35. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  36. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  37. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  38. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  39. package/dist/src/__tests__/option.test.d.ts +14 -0
  40. package/dist/src/__tests__/option.test.js +275 -0
  41. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  42. package/dist/src/__tests__/schedule.test.js +98 -0
  43. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  44. package/dist/src/__tests__/sourcemap.test.js +227 -0
  45. package/dist/src/__tests__/stdlib-include.test.js +86 -0
  46. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  47. package/dist/src/__tests__/tuple.test.js +202 -0
  48. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  49. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  50. package/dist/src/ast/types.d.ts +56 -2
  51. package/dist/src/cache/deps.d.ts +41 -0
  52. package/dist/src/cache/deps.js +158 -0
  53. package/dist/src/cache/incremental.d.ts +35 -0
  54. package/dist/src/cache/incremental.js +165 -0
  55. package/dist/src/cache/index.d.ts +37 -0
  56. package/dist/src/cache/index.js +152 -0
  57. package/dist/src/cli.js +83 -45
  58. package/dist/src/compile.d.ts +3 -2
  59. package/dist/src/compile.js +34 -11
  60. package/dist/src/diagnostics/index.d.ts +1 -1
  61. package/dist/src/diagnostics/index.js +8 -11
  62. package/dist/src/emit/compile.d.ts +31 -0
  63. package/dist/src/emit/compile.js +143 -0
  64. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  65. package/dist/{src2 → src}/emit/index.js +59 -8
  66. package/dist/src/emit/modules.d.ts +29 -0
  67. package/dist/src/emit/modules.js +492 -0
  68. package/dist/src/emit/sourcemap.d.ts +53 -0
  69. package/dist/src/emit/sourcemap.js +73 -0
  70. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  71. package/dist/{src2 → src}/hir/lower.js +22 -1
  72. package/dist/src/hir/monomorphize.d.ts +22 -0
  73. package/dist/src/hir/monomorphize.js +379 -0
  74. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  75. package/dist/src/index.d.ts +19 -2
  76. package/dist/src/index.js +36 -14
  77. package/dist/src/lexer/index.d.ts +1 -1
  78. package/dist/src/lexer/index.js +1 -0
  79. package/dist/src/lir/budget.d.ts +37 -0
  80. package/dist/src/lir/budget.js +280 -0
  81. package/dist/{src2 → src}/lir/lower.js +19 -0
  82. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  83. package/dist/src/lsp/main.d.ts +8 -0
  84. package/dist/src/lsp/main.js +11 -0
  85. package/dist/src/lsp/server.d.ts +11 -0
  86. package/dist/src/lsp/server.js +403 -0
  87. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  88. package/dist/{src2 → src}/mir/lower.js +244 -10
  89. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  90. package/dist/src/optimizer/coroutine.d.ts +34 -0
  91. package/dist/src/optimizer/coroutine.js +789 -0
  92. package/dist/src/optimizer/dce.d.ts +8 -34
  93. package/dist/src/optimizer/dce.js +146 -629
  94. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  95. package/dist/src/optimizer/interprocedural.js +186 -0
  96. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  97. package/dist/src/optimizer/lir/const_imm.js +139 -0
  98. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  99. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  100. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  101. package/dist/src/optimizer/lir/peephole.js +52 -0
  102. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  103. package/dist/src/optimizer/lir/pipeline.js +34 -0
  104. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  105. package/dist/src/optimizer/nbt-batch.js +51 -0
  106. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  107. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  108. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  109. package/dist/src/optimizer/selector-cache.js +100 -0
  110. package/dist/src/optimizer/unroll.d.ts +32 -0
  111. package/dist/src/optimizer/unroll.js +348 -0
  112. package/dist/src/parser/index.d.ts +8 -0
  113. package/dist/src/parser/index.js +204 -14
  114. package/dist/src/repl.d.ts +1 -1
  115. package/dist/src/typechecker/index.d.ts +4 -0
  116. package/dist/src/typechecker/index.js +198 -13
  117. package/dist/src/types/mc-version.d.ts +24 -0
  118. package/dist/src/types/mc-version.js +49 -0
  119. package/docs/ROADMAP.md +395 -0
  120. package/docs/compiler-pipeline-redesign.md +27 -10
  121. package/editors/vscode/out/extension.js +25176 -8000
  122. package/editors/vscode/package-lock.json +90 -6
  123. package/editors/vscode/package.json +3 -2
  124. package/editors/vscode/src/extension.ts +97 -67
  125. package/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
  126. package/examples/coroutine-demo.mcrs +50 -0
  127. package/examples/enum-demo.mcrs +95 -0
  128. package/examples/scheduler-demo.mcrs +59 -0
  129. package/examples/showcase.mcrs +3 -3
  130. package/jest.config.js +1 -1
  131. package/package.json +9 -3
  132. package/src/__tests__/budget.test.ts +297 -0
  133. package/src/__tests__/diagnostics.test.ts +2 -3
  134. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  135. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  136. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  137. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  138. package/src/__tests__/enum.test.ts +425 -0
  139. package/src/__tests__/generics.test.ts +390 -0
  140. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  141. package/src/__tests__/incremental.test.ts +337 -0
  142. package/src/__tests__/lsp.test.ts +359 -0
  143. package/src/__tests__/mc-syntax.test.ts +1 -7
  144. package/src/__tests__/mc-version.test.ts +178 -0
  145. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  146. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  147. package/src/__tests__/modules.test.ts +365 -0
  148. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  149. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  150. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  151. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  152. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  153. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  154. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  155. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  156. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  157. package/src/__tests__/option.test.ts +299 -0
  158. package/src/__tests__/schedule.test.ts +105 -0
  159. package/src/__tests__/sourcemap.test.ts +254 -0
  160. package/src/__tests__/stdlib-include.test.ts +61 -0
  161. package/src/__tests__/tuple.test.ts +220 -0
  162. package/src/__tests__/typechecker-strict.test.ts +216 -0
  163. package/src/ast/types.ts +33 -2
  164. package/src/cache/deps.ts +132 -0
  165. package/src/cache/incremental.ts +173 -0
  166. package/src/cache/index.ts +135 -0
  167. package/src/cli.ts +96 -45
  168. package/src/compile.ts +46 -17
  169. package/src/diagnostics/index.ts +8 -11
  170. package/src/emit/compile.ts +179 -0
  171. package/{src2 → src}/emit/index.ts +72 -8
  172. package/src/emit/modules.ts +581 -0
  173. package/src/emit/sourcemap.ts +101 -0
  174. package/{src2 → src}/hir/lower.ts +29 -2
  175. package/src/hir/monomorphize.ts +416 -0
  176. package/{src2 → src}/hir/types.ts +15 -3
  177. package/src/index.ts +29 -10
  178. package/src/lexer/index.ts +2 -1
  179. package/src/lir/budget.ts +321 -0
  180. package/{src2 → src}/lir/lower.ts +32 -1
  181. package/{src2 → src}/lir/types.ts +7 -3
  182. package/src/lsp/main.ts +9 -0
  183. package/src/lsp/server.ts +469 -0
  184. package/{src2 → src}/mir/lower.ts +251 -8
  185. package/{src2 → src}/mir/types.ts +12 -1
  186. package/src/optimizer/coroutine.ts +996 -0
  187. package/{src2 → src}/optimizer/dce.ts +2 -1
  188. package/src/optimizer/interprocedural.ts +177 -0
  189. package/src/optimizer/lir/const_imm.ts +143 -0
  190. package/src/optimizer/lir/dead_slot.ts +123 -0
  191. package/src/optimizer/lir/peephole.ts +57 -0
  192. package/src/optimizer/lir/pipeline.ts +37 -0
  193. package/src/optimizer/nbt-batch.ts +50 -0
  194. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  195. package/src/optimizer/selector-cache.ts +103 -0
  196. package/src/optimizer/unroll.ts +386 -0
  197. package/src/parser/index.ts +212 -15
  198. package/src/repl.ts +1 -1
  199. package/src/stdlib/math.mcrs +4 -4
  200. package/src/templates/quest.mcrs +4 -4
  201. package/src/typechecker/index.ts +215 -15
  202. package/src/types/mc-version.ts +46 -0
  203. package/tsconfig.json +1 -1
  204. package/.claude/commands/build-test.md +0 -10
  205. package/.claude/commands/deploy-demo.md +0 -12
  206. package/.claude/commands/stage-status.md +0 -13
  207. package/.claude/settings.json +0 -12
  208. package/CLAUDE.md +0 -231
  209. package/dist/__tests__/cli.test.js +0 -278
  210. package/dist/__tests__/codegen.test.js +0 -152
  211. package/dist/__tests__/compile-all.test.d.ts +0 -10
  212. package/dist/__tests__/compile-all.test.js +0 -108
  213. package/dist/__tests__/dce.test.js +0 -138
  214. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  215. package/dist/__tests__/diagnostics.test.js +0 -149
  216. package/dist/__tests__/e2e.test.d.ts +0 -6
  217. package/dist/__tests__/e2e.test.js +0 -1847
  218. package/dist/__tests__/entity-types.test.js +0 -203
  219. package/dist/__tests__/formatter.test.js +0 -40
  220. package/dist/__tests__/lexer.test.js +0 -343
  221. package/dist/__tests__/lowering.test.js +0 -1015
  222. package/dist/__tests__/macro.test.d.ts +0 -8
  223. package/dist/__tests__/macro.test.js +0 -305
  224. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  225. package/dist/__tests__/mc-integration.test.js +0 -819
  226. package/dist/__tests__/mc-syntax.test.js +0 -124
  227. package/dist/__tests__/nbt.test.js +0 -82
  228. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  229. package/dist/__tests__/optimizer.test.js +0 -149
  230. package/dist/__tests__/parser.test.d.ts +0 -1
  231. package/dist/__tests__/parser.test.js +0 -807
  232. package/dist/__tests__/repl.test.d.ts +0 -1
  233. package/dist/__tests__/repl.test.js +0 -27
  234. package/dist/__tests__/runtime.test.d.ts +0 -1
  235. package/dist/__tests__/runtime.test.js +0 -289
  236. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  237. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  238. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  239. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  240. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  241. package/dist/__tests__/stdlib-math.test.js +0 -352
  242. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  243. package/dist/__tests__/stdlib-vec.test.js +0 -264
  244. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  245. package/dist/__tests__/structure-optimizer.test.js +0 -33
  246. package/dist/__tests__/typechecker.test.d.ts +0 -1
  247. package/dist/__tests__/typechecker.test.js +0 -552
  248. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  249. package/dist/__tests__/var-allocator.test.js +0 -69
  250. package/dist/ast/types.d.ts +0 -514
  251. package/dist/ast/types.js +0 -9
  252. package/dist/builtins/metadata.d.ts +0 -36
  253. package/dist/builtins/metadata.js +0 -1014
  254. package/dist/cli.d.ts +0 -11
  255. package/dist/codegen/cmdblock/index.d.ts +0 -26
  256. package/dist/codegen/cmdblock/index.js +0 -45
  257. package/dist/codegen/mcfunction/index.d.ts +0 -40
  258. package/dist/codegen/mcfunction/index.js +0 -606
  259. package/dist/codegen/structure/index.d.ts +0 -24
  260. package/dist/codegen/structure/index.js +0 -279
  261. package/dist/codegen/var-allocator.d.ts +0 -45
  262. package/dist/codegen/var-allocator.js +0 -104
  263. package/dist/compile.d.ts +0 -68
  264. package/dist/data/arena/function/__load.mcfunction +0 -6
  265. package/dist/data/arena/function/__tick.mcfunction +0 -2
  266. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  267. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  268. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  269. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  270. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  271. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  272. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  273. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  274. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  275. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  276. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  277. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  278. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  279. package/dist/data/counter/function/__load.mcfunction +0 -5
  280. package/dist/data/counter/function/__tick.mcfunction +0 -2
  281. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  282. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  283. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  284. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  285. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  286. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  287. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  288. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  289. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  290. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  291. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  292. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  293. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  294. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  295. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  296. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  297. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  298. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  299. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  300. package/dist/data/gcd3/function/test.mcfunction +0 -7
  301. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  302. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  303. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  304. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  305. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  306. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  307. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  308. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  309. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  310. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  311. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  312. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  313. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  314. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  315. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  316. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  317. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  318. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  319. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  320. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  321. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  322. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  323. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  324. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  325. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  326. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  327. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  328. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  329. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  330. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  331. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  332. package/dist/data/mathtest/function/test.mcfunction +0 -5
  333. package/dist/data/minecraft/tags/function/load.json +0 -5
  334. package/dist/data/minecraft/tags/function/tick.json +0 -5
  335. package/dist/data/mypack/function/__load.mcfunction +0 -13
  336. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  337. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  338. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  339. package/dist/data/mypack/function/abs.mcfunction +0 -6
  340. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  341. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  342. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  343. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  346. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  347. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  348. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  352. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  353. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  354. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  357. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  358. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  359. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  360. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  361. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  365. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  366. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  367. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  368. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  369. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  370. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  371. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  372. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  373. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  374. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  375. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  376. package/dist/data/quiz/function/__load.mcfunction +0 -16
  377. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  378. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  379. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  380. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  381. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  382. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  383. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  384. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  386. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  387. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  388. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  389. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  390. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  391. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  392. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  393. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  394. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  395. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  396. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  397. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  398. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  399. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  400. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  402. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  403. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  404. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  405. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  406. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  407. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  408. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  409. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  410. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  411. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  412. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  413. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  414. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  415. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  416. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  417. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  418. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  419. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  420. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  421. package/dist/data/runtime/function/__load.mcfunction +0 -5
  422. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  423. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  424. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  425. package/dist/data/shop/function/__load.mcfunction +0 -7
  426. package/dist/data/shop/function/__tick.mcfunction +0 -3
  427. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  429. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  430. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  431. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  432. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  433. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  434. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  435. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  436. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  437. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  438. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  439. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  440. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  441. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  442. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  443. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  444. package/dist/data/turret/function/__load.mcfunction +0 -5
  445. package/dist/data/turret/function/__tick.mcfunction +0 -4
  446. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  447. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  448. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  449. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  450. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  451. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  452. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  453. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  454. package/dist/diagnostics/index.d.ts +0 -44
  455. package/dist/diagnostics/index.js +0 -140
  456. package/dist/events/types.d.ts +0 -35
  457. package/dist/events/types.js +0 -59
  458. package/dist/formatter/index.d.ts +0 -1
  459. package/dist/formatter/index.js +0 -26
  460. package/dist/gcd2.map.json +0 -15
  461. package/dist/gcd3.map.json +0 -17
  462. package/dist/gcd_test.map.json +0 -15
  463. package/dist/index.d.ts +0 -62
  464. package/dist/ir/builder.d.ts +0 -33
  465. package/dist/ir/builder.js +0 -99
  466. package/dist/ir/types.d.ts +0 -132
  467. package/dist/ir/types.js +0 -15
  468. package/dist/isqrttest.map.json +0 -15
  469. package/dist/lexer/index.d.ts +0 -37
  470. package/dist/lexer/index.js +0 -569
  471. package/dist/lowering/index.d.ts +0 -188
  472. package/dist/lowering/index.js +0 -3405
  473. package/dist/mathtest.map.json +0 -6
  474. package/dist/mc-test/client.d.ts +0 -128
  475. package/dist/mc-test/client.js +0 -174
  476. package/dist/mc-test/runner.d.ts +0 -28
  477. package/dist/mc-test/runner.js +0 -150
  478. package/dist/mc-test/setup.d.ts +0 -11
  479. package/dist/mc-test/setup.js +0 -98
  480. package/dist/mc-validator/index.d.ts +0 -17
  481. package/dist/mc-validator/index.js +0 -322
  482. package/dist/mypack.map.json +0 -27
  483. package/dist/nbt/index.d.ts +0 -86
  484. package/dist/nbt/index.js +0 -250
  485. package/dist/optimizer/commands.d.ts +0 -38
  486. package/dist/optimizer/commands.js +0 -451
  487. package/dist/optimizer/dce.d.ts +0 -34
  488. package/dist/optimizer/dce.js +0 -639
  489. package/dist/optimizer/passes.d.ts +0 -34
  490. package/dist/optimizer/passes.js +0 -243
  491. package/dist/optimizer/structure.d.ts +0 -9
  492. package/dist/optimizer/structure.js +0 -356
  493. package/dist/pack.mcmeta +0 -6
  494. package/dist/parser/index.d.ts +0 -93
  495. package/dist/parser/index.js +0 -1687
  496. package/dist/repl.d.ts +0 -16
  497. package/dist/repl.js +0 -165
  498. package/dist/reqtest.map.json +0 -4
  499. package/dist/reqtest2.map.json +0 -4
  500. package/dist/runtime/index.d.ts +0 -107
  501. package/dist/runtime/index.js +0 -1409
  502. package/dist/runtime.map.json +0 -7
  503. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  504. package/dist/src/__tests__/codegen.test.js +0 -152
  505. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  506. package/dist/src/__tests__/e2e.test.js +0 -1789
  507. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  508. package/dist/src/__tests__/entity-types.test.js +0 -203
  509. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  510. package/dist/src/__tests__/lowering.test.js +0 -1015
  511. package/dist/src/__tests__/macro.test.d.ts +0 -8
  512. package/dist/src/__tests__/macro.test.js +0 -306
  513. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  514. package/dist/src/__tests__/nbt.test.js +0 -82
  515. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  516. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  517. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  518. package/dist/src/__tests__/optimizer.test.js +0 -149
  519. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  520. package/dist/src/__tests__/runtime.test.js +0 -289
  521. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  522. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  523. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  524. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  525. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  526. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  527. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  528. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  529. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  530. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  531. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  532. package/dist/src/__tests__/var-allocator.test.js +0 -69
  533. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  534. package/dist/src/codegen/cmdblock/index.js +0 -45
  535. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  536. package/dist/src/codegen/mcfunction/index.js +0 -606
  537. package/dist/src/codegen/structure/index.d.ts +0 -24
  538. package/dist/src/codegen/structure/index.js +0 -279
  539. package/dist/src/codegen/var-allocator.d.ts +0 -45
  540. package/dist/src/codegen/var-allocator.js +0 -104
  541. package/dist/src/ir/builder.d.ts +0 -33
  542. package/dist/src/ir/builder.js +0 -99
  543. package/dist/src/ir/types.d.ts +0 -132
  544. package/dist/src/ir/types.js +0 -15
  545. package/dist/src/lowering/index.d.ts +0 -188
  546. package/dist/src/lowering/index.js +0 -3405
  547. package/dist/src/optimizer/commands.d.ts +0 -38
  548. package/dist/src/optimizer/commands.js +0 -451
  549. package/dist/src/optimizer/passes.d.ts +0 -34
  550. package/dist/src/optimizer/passes.js +0 -243
  551. package/dist/src/optimizer/structure.d.ts +0 -9
  552. package/dist/src/optimizer/structure.js +0 -356
  553. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  554. package/dist/src2/emit/compile.d.ts +0 -19
  555. package/dist/src2/emit/compile.js +0 -80
  556. package/dist/src2/optimizer/dce.d.ts +0 -8
  557. package/dist/src2/optimizer/dce.js +0 -155
  558. package/dist/swap_test.map.json +0 -14
  559. package/dist/tsconfig.tsbuildinfo +0 -1
  560. package/dist/typechecker/index.d.ts +0 -61
  561. package/dist/typechecker/index.js +0 -1034
  562. package/dist/types/entity-hierarchy.d.ts +0 -29
  563. package/dist/types/entity-hierarchy.js +0 -107
  564. package/examples/spiral.mcrs +0 -43
  565. package/src/examples/arena.mcrs +0 -44
  566. package/src/examples/counter.mcrs +0 -12
  567. package/src/examples/new_features_demo.mcrs +0 -193
  568. package/src/examples/rpg.mcrs +0 -13
  569. package/src/examples/stdlib_demo.mcrs +0 -181
  570. package/src2/emit/compile.ts +0 -99
  571. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  572. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  576. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  578. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  579. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  580. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  581. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  582. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  583. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  584. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  585. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  586. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  587. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  588. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  589. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  590. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  592. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  593. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  594. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  595. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  596. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  597. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  598. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  599. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  600. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  601. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  602. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  603. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  604. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  605. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  606. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  607. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
  608. /package/dist/{src2 → src}/hir/types.js +0 -0
  609. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  610. /package/dist/{src2 → src}/lir/types.js +0 -0
  611. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  612. /package/dist/{src2 → src}/lir/verify.js +0 -0
  613. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  614. /package/dist/{src2 → src}/mir/macro.js +0 -0
  615. /package/dist/{src2 → src}/mir/types.js +0 -0
  616. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  617. /package/dist/{src2 → src}/mir/verify.js +0 -0
  618. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  619. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  620. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  621. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  622. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  623. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  624. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  625. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  626. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  627. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  628. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  629. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  630. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  631. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  632. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  633. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  634. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  635. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  636. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  637. /package/{src2 → src}/lir/verify.ts +0 -0
  638. /package/{src2 → src}/mir/macro.ts +0 -0
  639. /package/{src2 → src}/mir/verify.ts +0 -0
  640. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  641. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  642. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  643. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -0,0 +1,395 @@
1
+ # RedScript Roadmap
2
+
3
+ > 生成于 2026-03-16 · 按依赖关系排序的完整改进计划
4
+
5
+ ---
6
+
7
+ ## 执行顺序总览
8
+
9
+ ```
10
+ Phase 1 — 编译器基础设施 (并行进行,无依赖)
11
+ 1a. 静态命令预算分析
12
+ 1b. 增量编译
13
+
14
+ Phase 2 — 语言核心扩展 (依赖 Phase 1 基础)
15
+ 2a. 枚举 + 模式匹配
16
+ 2b. 多返回值 / 元组
17
+ 2c. 泛型(单态化)
18
+
19
+ Phase 3 — 优化 pass (依赖 MIR/LIR 管道稳定)
20
+ 3a. execute store peephole pass
21
+ 3b. NBT 批量读取
22
+ 3c. Selector 缓存
23
+ 3d. 小常量循环展开
24
+ 3e. 跨函数常量传播
25
+
26
+ Phase 4 — 工具链 (依赖语言稳定)
27
+ 4a. Source map
28
+ 4b. LSP (Language Server Protocol)
29
+
30
+ Phase 5 — MC 生态 (依赖语言稳定)
31
+ 5a. 多版本目标 (--mc-version)
32
+ 5b. 模块系统 + Namespace 隔离
33
+ 5c. @schedule 装饰器
34
+
35
+ Phase 6 — 类型系统完善 (最后,改动最大)
36
+ 6a. Null safety / Option<T>
37
+ 6b. 可选类型 + 完整的 TypeChecker
38
+ ```
39
+
40
+ ---
41
+
42
+ ## Phase 1 — 编译器基础设施
43
+
44
+ ### 1a. 静态命令预算分析
45
+
46
+ **目标:** 静态估算每个循环体的 MC 命令数,超过 `maxCommandChainLength`(默认 65536)时发出警告。
47
+
48
+ **实现:**
49
+ - 在 LIR 层加 `estimateCommandCount(fn)` 函数,遍历 LIR 指令估算命令数
50
+ - 对每个循环:估算循环体命令数 × 最大迭代次数(如果上界可知)
51
+ - 超过阈值(建议警告线:32768,错误线:65536)时:
52
+ - Warning:`loop may exceed tick budget (~N commands), consider @coroutine`
53
+ - 与 `@coroutine` 联动:标注了 `@coroutine` 的函数跳过此警告
54
+
55
+ **为什么先做:** 和已实现的 `@coroutine` 形成闭环,让用户知道什么时候该用它。
56
+
57
+ ---
58
+
59
+ ### 1b. 增量编译
60
+
61
+ **目标:** watch mode 下只重新编译有改动的文件及其依赖,而非全量。
62
+
63
+ **实现:**
64
+ - 在 HIR 层加内容哈希缓存:`Map<filename, { hash: string, hir: HIRModule }>`
65
+ - 建立依赖图:每个文件导入哪些其他文件
66
+ - watch 时:只对 hash 变化的文件重新跑 AST→HIR,依赖不变的文件复用缓存的 HIR
67
+ - 接着只对脏文件往下跑 HIR→MIR→LIR→codegen
68
+
69
+ **为什么先做:** 不影响语言语义,纯工程优化。大项目编译时间痛点。
70
+
71
+ ---
72
+
73
+ ## Phase 2 — 语言核心扩展
74
+
75
+ ### 2a. 枚举 + 模式匹配
76
+
77
+ **目标:** 支持代数枚举类型,扩展 `match` 支持枚举变体。
78
+
79
+ **语法:**
80
+ ```redscript
81
+ enum Phase { Idle, Moving, Attacking }
82
+
83
+ let phase: Phase = Phase::Idle;
84
+
85
+ match phase {
86
+ Phase::Idle => start_idle(),
87
+ Phase::Moving => update_movement(),
88
+ Phase::Attacking => do_attack(),
89
+ }
90
+ ```
91
+
92
+ **编译策略:**
93
+ - 每个枚举变体映射到一个整数常量(`Idle=0, Moving=1, ...`)
94
+ - 枚举变量编译成普通 scoreboard int slot
95
+ - `match` 编译成 `execute if score ... matches N` 链
96
+ - 零运行时开销
97
+
98
+ **实现范围:**
99
+ - Lexer/Parser:`enum` 关键字、`::` 路径操作符
100
+ - TypeChecker:枚举类型声明、变体作用域
101
+ - HIR:`EnumDecl`、`PathExpr`(`Phase::Idle`)
102
+ - MIR→LIR:枚举变量 → int slot,`match` → 条件跳转链
103
+
104
+ **为什么先做:** 游戏状态机极其常见,这是最高频的语言痛点。
105
+
106
+ ---
107
+
108
+ ### 2b. 多返回值 / 元组
109
+
110
+ **目标:** 函数可以返回多个值,调用方可解构。
111
+
112
+ **语法:**
113
+ ```redscript
114
+ fn divmod(a: int, b: int): (int, int) {
115
+ return (a / b, a % b);
116
+ }
117
+
118
+ let (q, r) = divmod(10, 3);
119
+ ```
120
+
121
+ **编译策略:**
122
+ - 元组编译成多个独立 scoreboard slots(`$divmod_ret0`, `$divmod_ret1`)
123
+ - 调用方解构 = 分别读取对应 slot
124
+ - 最多支持 N=8 个元素(超过建议用 struct)
125
+
126
+ **实现范围:**
127
+ - Parser:元组类型 `(T, T)`、元组字面量 `(a, b)`、解构 `let (a, b) = ...`
128
+ - TypeChecker:元组类型推断
129
+ - HIR/MIR:`TupleExpr`、`DestructureStmt`
130
+ - LIR:多 slot 分配
131
+
132
+ ---
133
+
134
+ ### 2c. 泛型(单态化)
135
+
136
+ **目标:** 支持基础泛型函数,编译期单态化展开。
137
+
138
+ **语法:**
139
+ ```redscript
140
+ fn max<T>(a: T, b: T): T {
141
+ if a > b { return a; }
142
+ return b;
143
+ }
144
+
145
+ fn clamp<T>(val: T, lo: T, hi: T): T {
146
+ return max(min(val, hi), lo);
147
+ }
148
+ ```
149
+
150
+ **编译策略:**
151
+ - 泛型函数在调用时单态化(monomorphize):`max<int>` 生成一份 int 专用函数
152
+ - 函数名 mangle:`max_int`, `max_float`
153
+ - 不支持泛型 struct(v1,后续可加)
154
+
155
+ **为什么这里做:** 消掉 stdlib 里 `math.mcrs` 中大量重复代码(`min_int`/`min_float` 等)。
156
+
157
+ ---
158
+
159
+ ## Phase 3 — 优化 Pass
160
+
161
+ ### 3a. `execute store` Peephole Pass
162
+
163
+ **目标:** 将 `scoreboard operation set` + `execute ... run` 合并为 `execute store result score`。
164
+
165
+ **示例:**
166
+ ```mcfunction
167
+ # 现在生成的
168
+ execute as @s run function ns:_fn
169
+ scoreboard players set $result __ns 1
170
+
171
+ # 优化后
172
+ execute store result score $result __ns as @s run function ns:_fn
173
+ ```
174
+
175
+ **实现:** LIR 层 peephole pass,识别 `StoreTmp + ExecCmd` 模式 → 合并。
176
+
177
+ ---
178
+
179
+ ### 3b. NBT 批量读取
180
+
181
+ **目标:** 同函数内多次访问同一 entity 不同字段 → 合并成一次 `data get`。
182
+
183
+ **实现:**
184
+ - MIR 层分析:收集同一 entity selector 的所有字段读取
185
+ - 如果 ≥2 次读取且中间没有写操作 → 合并为一次 `data get`,结果存临时 NBT storage
186
+ - 后续读取从 storage 里取
187
+
188
+ ---
189
+
190
+ ### 3c. Selector 缓存
191
+
192
+ **目标:** 同 tick 函数内相同 selector 多次出现 → 第一次用 `tag` 标记,后续用标记查询。
193
+
194
+ **实现:**
195
+ - HIR 层分析:收集同函数内重复使用的 selector
196
+ - 第一次查询后:`tag @e[...] add __cached_sel_N`
197
+ - 后续查询替换为:`@e[tag=__cached_sel_N]`
198
+ - 函数退出时清理标记
199
+
200
+ ---
201
+
202
+ ### 3d. 小常量循环展开
203
+
204
+ **目标:** 循环次数是编译期常量且 ≤8 时,直接展开。
205
+
206
+ **实现:**
207
+ - MIR pass:检测 `for (let i=0; i<N; i++)` 且 N 是常量
208
+ - N ≤ 8:展开 N 份循环体(替换 `i` 为字面量)
209
+ - 消掉 loop header、pc slot、条件跳转
210
+
211
+ ---
212
+
213
+ ### 3e. 跨函数常量传播
214
+
215
+ **目标:** 调用方传入常量参数时,被调函数内可继续折叠。
216
+
217
+ **实现:**
218
+ - Call graph 构建
219
+ - 对每个 callsite:如果参数全是常量 → clone 函数体,将参数替换为常量,再跑常量折叠
220
+ - 类似 inline + fold,但不需要完全内联
221
+
222
+ ---
223
+
224
+ ## Phase 4 — 工具链
225
+
226
+ ### 4a. Source Map
227
+
228
+ **目标:** 生成的 `.mcfunction` 每行对应源文件哪行,用于调试。
229
+
230
+ **格式:** 在每个生成的 `.mcfunction` 目录下放 `sourcemap.json`:
231
+ ```json
232
+ {
233
+ "version": 1,
234
+ "sources": ["src/main.mcrs"],
235
+ "mappings": [
236
+ { "line": 1, "source": 0, "sourceLine": 12, "sourceCol": 4 },
237
+ ...
238
+ ]
239
+ }
240
+ ```
241
+
242
+ **实现:**
243
+ - AST 节点已有 line/col 信息
244
+ - HIR/MIR/LIR 节点透传 source location
245
+ - Codegen 在 emit 每条命令时附加 source location → 写入 sourcemap
246
+
247
+ ---
248
+
249
+ ### 4b. LSP (Language Server Protocol)
250
+
251
+ **目标:** 一份实现,覆盖 VSCode、Neovim、Zed 等所有 LSP 编辑器。
252
+
253
+ **功能(按优先级):**
254
+ 1. **Diagnostics** — 实时显示类型错误、未定义变量
255
+ 2. **Hover** — 鼠标悬停显示类型信息
256
+ 3. **Go-to-definition** — 跳转到函数/变量定义
257
+ 4. **Completion** — 自动补全函数名、字段、关键字
258
+ 5. **Rename** — 重命名变量/函数,自动更新所有引用
259
+ 6. **Find references** — 查找所有引用
260
+
261
+ **实现:**
262
+ - `src/lsp/server.ts` — LSP server(基于 `vscode-languageserver` 或手写)
263
+ - 复用现有 Parser + TypeChecker(需要先完善 TypeChecker 为 error-mode)
264
+ - `bin/redscript-lsp` 入口
265
+ - VSCode 插件更新:从 grammar-only 升级为 LSP client
266
+
267
+ **为什么在这里做:** 依赖 TypeChecker 稳定(Phase 6 完善之前,LSP 已经能提供基本功能)。
268
+
269
+ ---
270
+
271
+ ## Phase 5 — MC 生态
272
+
273
+ ### 5a. 多版本目标
274
+
275
+ **目标:** `--mc-version 1.20.2` flag,codegen 根据目标版本决定使用哪些 MC 特性。
276
+
277
+ **版本差异表:**
278
+ | 特性 | 引入版本 |
279
+ |---|---|
280
+ | Function macros (`$var`) | 1.20.2 |
281
+ | `execute if function` | 1.20.2 |
282
+ | Scoreboard `display` 改动 | 1.21 |
283
+
284
+ **实现:**
285
+ - `McVersion` enum + 比较函数
286
+ - Codegen 各处加 `if (version >= McVersion.v1_20_2)` 分支
287
+ - 老版本降级策略(macro → 用 storage 模拟)
288
+
289
+ ---
290
+
291
+ ### 5b. 模块系统 + Namespace 隔离
292
+
293
+ **目标:** 每个 `.mcrs` 文件是一个模块,有独立作用域,多 datapack 共存不冲突。
294
+
295
+ **语法:**
296
+ ```redscript
297
+ // in math.mcrs
298
+ module math;
299
+ export fn sin(x: int): int { ... }
300
+
301
+ // in main.mcrs
302
+ import math::sin;
303
+ // or
304
+ import math::*;
305
+ ```
306
+
307
+ **编译策略:**
308
+ - 每个模块的 scoreboard objective:`__${namespace}_${module}`
309
+ - 跨模块调用生成正确的 function path
310
+ - DCE 跨模块工作(未被 import 的 export 函数可被裁剪)
311
+
312
+ ---
313
+
314
+ ### 5c. `@schedule` 装饰器
315
+
316
+ **目标:** 语言层暴露 MC `schedule function` 命令。
317
+
318
+ **语法:**
319
+ ```redscript
320
+ @schedule(ticks=20)
321
+ fn after_one_second() {
322
+ tellraw(@a, "One second passed!");
323
+ }
324
+
325
+ // 调用:
326
+ schedule_after_one_second(); // 生成: schedule function ns:after_one_second 20t
327
+ ```
328
+
329
+ **实现:**
330
+ - Parser:`@schedule(ticks=N)` 装饰器
331
+ - Codegen:为被装饰函数生成包装调用函数,emit `schedule function ... Nt`
332
+
333
+ ---
334
+
335
+ ## Phase 6 — 类型系统完善
336
+
337
+ ### 6a. Null safety / Option<T>
338
+
339
+ **目标:** `@p`(最近玩家)可能没有玩家,应返回 `Option<selector<player>>`。
340
+
341
+ **语法:**
342
+ ```redscript
343
+ let p: Option<selector<player>> = get_nearest_player();
344
+ if let Some(player) = p {
345
+ give(player, "minecraft:diamond");
346
+ }
347
+ ```
348
+
349
+ **编译策略:**
350
+ - `Option<T>` 编译为两个 slot:`has_value: bool` + `value: T`
351
+ - `if let Some(x) = opt` → 检查 `has_value` slot,true 则绑定 `value`
352
+ - selector 相关的内置函数返回值改为 `Option<selector<...>>`
353
+
354
+ ---
355
+
356
+ ### 6b. TypeChecker 完善(error mode)
357
+
358
+ **目标:** TypeChecker 从 warn-mode 升级到 error-mode,类型错误阻止编译。
359
+
360
+ **当前问题:**
361
+ - TypeChecker 存在但只 warn
362
+ - `redscript check` 硬编码 namespace
363
+ - 很多隐式转换没有检查
364
+
365
+ **实现:**
366
+ - TypeChecker 改为抛 `DiagnosticError`(而非 `DiagnosticWarning`)
367
+ - `compile()` 在 TypeChecker 有错误时提前返回
368
+ - 修复 `redscript check` 使用编译时 namespace
369
+ - 加强隐式数值转换检查(int ↔ float)
370
+
371
+ ---
372
+
373
+ ## 工作量估算
374
+
375
+ | Phase | 内容 | 估算 |
376
+ |---|---|---|
377
+ | 1a | 静态预算分析 | 2-3天 |
378
+ | 1b | 增量编译 | 1周 |
379
+ | 2a | 枚举 + match | 2周 |
380
+ | 2b | 多返回值 / 元组 | 1周 |
381
+ | 2c | 泛型 | 2-3周 |
382
+ | 3a-3e | 优化 passes | 2-3周(可并行) |
383
+ | 4a | Source map | 3-4天 |
384
+ | 4b | LSP | 3-4周 |
385
+ | 5a | 多版本目标 | 1周 |
386
+ | 5b | 模块系统 | 2-3周 |
387
+ | 5c | @schedule | 2-3天 |
388
+ | 6a | Option<T> | 2周 |
389
+ | 6b | TypeChecker error-mode | 1周 |
390
+
391
+ **总计:约 20-25 周**(AI agent 加速下可大幅压缩)
392
+
393
+ ---
394
+
395
+ *此文档由奇尔沙治生成 · 2026-03-16*
@@ -1,7 +1,7 @@
1
1
  # RedScript Compiler Pipeline Redesign
2
2
 
3
- > Status: **planned** target next major refactor cycle
4
- > Written: 2026-03-15
3
+ > Status: **implemented** in `redscript-mc@2.0.0`
4
+ > Written: 2026-03-15 · Updated: 2026-03-15
5
5
 
6
6
  ---
7
7
 
@@ -1224,10 +1224,14 @@ apply to `async/await`, Python applies to `yield`, and C# applies to
1224
1224
  #### Usage (proposed syntax)
1225
1225
 
1226
1226
  ```redscript
1227
- @coroutine(batch=10) fn process_all() {
1227
+ @coroutine(batch=10, onDone=after_process_all)
1228
+ fn process_all() {
1228
1229
  for (let i: int = 0; i < 1000; i++) {
1229
1230
  do_work(i); // heavy per-iteration work
1230
1231
  }
1232
+ }
1233
+
1234
+ fn after_process_all() {
1231
1235
  finish();
1232
1236
  }
1233
1237
  ```
@@ -1236,6 +1240,11 @@ apply to `async/await`, Python applies to `yield`, and C# applies to
1236
1240
  each tick advances at most N iterations". If `batch` is omitted, the compiler
1237
1241
  estimates it from the loop body's command count.
1238
1242
 
1243
+ `onDone=<fn>` is an optional completion callback. When the coroutine reaches
1244
+ `pc = -1` (done), the runtime schedules `onDone` once on the next tick.
1245
+ This covers most "await-like" workflows without introducing `await` syntax
1246
+ or Promise/Future semantics into the language.
1247
+
1239
1248
  #### How the transform works
1240
1249
 
1241
1250
  **Step 1: Find yield points**
@@ -1325,9 +1334,17 @@ It is not run by default — only on functions annotated `@coroutine`. The
1325
1334
  compiler will warn if a non-annotated loop is estimated to exceed the tick
1326
1335
  budget, suggesting the user add `@coroutine`.
1327
1336
 
1337
+ #### Why no `await` in v1 coroutine
1338
+
1339
+ This feature is for **tick-slicing** (budget control), not asynchronous IO.
1340
+ Minecraft execution is single-threaded and tick-driven, so a state-machine +
1341
+ `onDone` callback model is enough for most needs while keeping language
1342
+ complexity low. If needed later, `join()` / `is_done()` / `get_result()` can be
1343
+ added on top without changing the core transform.
1344
+
1328
1345
  #### What the transform does NOT do
1329
1346
 
1330
- - Does not handle `return` with a value from inside a coroutine (complex; deferred).
1347
+ - Does not propagate coroutine return values in v1; completion is signaled via `onDone` callback (no value payload yet).
1331
1348
  - Does not support nested coroutines (a `@coroutine` calling another `@coroutine`).
1332
1349
  - Does not handle exceptions (RedScript has none, so this is fine).
1333
1350
  - Does not parallelize — MC is single-threaded; `@tick` runs one coroutine step per tick.
@@ -1666,7 +1683,7 @@ it passes 920/920 tests, then merge and delete the old code.
1666
1683
 
1667
1684
  ```
1668
1685
  src/ (current compiler — untouched during refactor)
1669
- src2/ (new compiler — staged implementation)
1686
+ src/ (new compiler — staged implementation)
1670
1687
  parser/ → copy of existing src/parser/ (Stage 1, keep as-is)
1671
1688
  lexer/ → copy of existing src/lexer/ (Stage 1, keep as-is)
1672
1689
  ast/ → copy of existing src/ast/ types
@@ -1711,7 +1728,7 @@ Add **IR-level unit tests** for stages 2–6 independently:
1711
1728
  - Optimizer tests: input MIR → expected output MIR for each pass
1712
1729
  - LIR tests: check MIR→LIR lowering of specific instruction patterns
1713
1730
 
1714
- These new tests live in `src2/__tests__/`.
1731
+ These new tests live in `src/__tests__/`.
1715
1732
 
1716
1733
  ### What to tell Claude
1717
1734
 
@@ -1975,10 +1992,10 @@ Known breaking changes:
1975
1992
  - Update test fixtures as part of Stage 7 (when the full pipeline is wired up and tests are being migrated)
1976
1993
  - The old compiler in `src/` still exists until the refactor is complete — old tests can still run against it at any time
1977
1994
 
1978
- ### Test structure for the new compiler (`src2/__tests__/`)
1995
+ ### Test structure for the new compiler (`src/__tests__/`)
1979
1996
 
1980
1997
  ```
1981
- src2/__tests__/
1998
+ src/__tests__/
1982
1999
  hir/
1983
2000
  desugar.test.ts for → while transforms, ternary expansion, etc.
1984
2001
  execute-blocks.test.ts execute context block lowering to helper fns
@@ -2110,10 +2127,10 @@ compute the safe batch, insert it.
2110
2127
 
2111
2128
  ### Placement
2112
2129
 
2113
- Profiling mode lives in `src2/runtime/index.ts` (or `src/runtime/` now).
2130
+ Profiling mode lives in `src/runtime/index.ts` (or `src/runtime/` now).
2114
2131
  It is off by default and adds zero overhead to the 920 e2e tests.
2115
2132
 
2116
- New test file: `src2/__tests__/profiler/stdlib-accuracy.test.ts`
2133
+ New test file: `src/__tests__/profiler/stdlib-accuracy.test.ts`
2117
2134
  Runs the error analysis for all math functions and asserts max error < threshold.
2118
2135
  This becomes a regression test: if a stdlib change degrades accuracy, the test fails.
2119
2136