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
@@ -1,243 +0,0 @@
1
- "use strict";
2
- /**
3
- * Optimization passes over IR.
4
- *
5
- * Each pass: IRFunction → IRFunction (pure transformation)
6
- *
7
- * Pipeline order:
8
- * 1. constantFolding — evaluate constant expressions at compile time
9
- * 2. copyPropagation — eliminate redundant copies
10
- * 3. deadCodeElimination — remove unused assignments
11
- * 4. commandMerging — MC-specific: merge chained execute conditions
12
- */
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.defaultPipeline = void 0;
15
- exports.constantFolding = constantFolding;
16
- exports.constantFoldingWithStats = constantFoldingWithStats;
17
- exports.copyPropagation = copyPropagation;
18
- exports.deadCodeElimination = deadCodeElimination;
19
- exports.deadCodeEliminationWithStats = deadCodeEliminationWithStats;
20
- exports.optimize = optimize;
21
- exports.optimizeWithStats = optimizeWithStats;
22
- const commands_1 = require("./commands");
23
- // ---------------------------------------------------------------------------
24
- // Helpers
25
- // ---------------------------------------------------------------------------
26
- function isConst(op) {
27
- return op.kind === 'const';
28
- }
29
- function evalBinop(lhs, bop, rhs) {
30
- switch (bop) {
31
- case '+': return lhs + rhs;
32
- case '-': return lhs - rhs;
33
- case '*': return lhs * rhs;
34
- case '/': return rhs === 0 ? null : Math.trunc(lhs / rhs); // MC uses truncated int division
35
- case '%': return rhs === 0 ? null : lhs % rhs;
36
- default: return null;
37
- }
38
- }
39
- function evalCmp(lhs, cop, rhs) {
40
- switch (cop) {
41
- case '==': return lhs === rhs ? 1 : 0;
42
- case '!=': return lhs !== rhs ? 1 : 0;
43
- case '<': return lhs < rhs ? 1 : 0;
44
- case '<=': return lhs <= rhs ? 1 : 0;
45
- case '>': return lhs > rhs ? 1 : 0;
46
- case '>=': return lhs >= rhs ? 1 : 0;
47
- default: return 0;
48
- }
49
- }
50
- // ---------------------------------------------------------------------------
51
- // Pass 1: Constant Folding
52
- // Evaluates expressions with all-constant operands at compile time.
53
- // ---------------------------------------------------------------------------
54
- function constantFolding(fn) {
55
- return constantFoldingWithStats(fn).fn;
56
- }
57
- function constantFoldingWithStats(fn) {
58
- let folded = 0;
59
- const newBlocks = fn.blocks.map(block => {
60
- const newInstrs = [];
61
- for (const instr of block.instrs) {
62
- if (instr.op === 'binop' && isConst(instr.lhs) && isConst(instr.rhs)) {
63
- const result = evalBinop(instr.lhs.value, instr.bop, instr.rhs.value);
64
- if (result !== null) {
65
- folded++;
66
- newInstrs.push({ op: 'assign', dst: instr.dst, src: { kind: 'const', value: result } });
67
- continue;
68
- }
69
- }
70
- if (instr.op === 'cmp' && isConst(instr.lhs) && isConst(instr.rhs)) {
71
- const result = evalCmp(instr.lhs.value, instr.cop, instr.rhs.value);
72
- folded++;
73
- newInstrs.push({ op: 'assign', dst: instr.dst, src: { kind: 'const', value: result } });
74
- continue;
75
- }
76
- newInstrs.push(instr);
77
- }
78
- return { ...block, instrs: newInstrs };
79
- });
80
- return { fn: { ...fn, blocks: newBlocks }, stats: { constantFolds: folded } };
81
- }
82
- // ---------------------------------------------------------------------------
83
- // Pass 2: Copy Propagation
84
- // Replaces uses of variables that are just copies with their source.
85
- // e.g. t0 = x; y = t0 + 1 → y = x + 1
86
- // ---------------------------------------------------------------------------
87
- function copyPropagation(fn) {
88
- // Build copy map within each block (single-block analysis for simplicity)
89
- const newBlocks = fn.blocks.map(block => {
90
- const copies = new Map(); // var → its source if it's a copy
91
- function resolve(op) {
92
- if (op.kind !== 'var')
93
- return op;
94
- return copies.get(op.name) ?? op;
95
- }
96
- /**
97
- * Invalidate all copies that became stale because `written` was modified.
98
- * When $y is overwritten, any mapping copies[$tmp] = $y is now stale:
99
- * reading $tmp would return the OLD $y value via the copy, but $y now holds
100
- * a different value. Remove both the direct entry (copies[$y]) and every
101
- * reverse entry that points at $y.
102
- */
103
- function invalidate(written) {
104
- copies.delete(written);
105
- for (const [k, v] of copies) {
106
- if (v.kind === 'var' && v.name === written)
107
- copies.delete(k);
108
- }
109
- }
110
- const newInstrs = [];
111
- for (const instr of block.instrs) {
112
- switch (instr.op) {
113
- case 'assign': {
114
- const src = resolve(instr.src);
115
- invalidate(instr.dst);
116
- // Only propagate scalars (var or const), not storage
117
- if (src.kind === 'var' || src.kind === 'const') {
118
- copies.set(instr.dst, src);
119
- }
120
- newInstrs.push({ ...instr, src });
121
- break;
122
- }
123
- case 'binop':
124
- invalidate(instr.dst);
125
- newInstrs.push({ ...instr, lhs: resolve(instr.lhs), rhs: resolve(instr.rhs) });
126
- break;
127
- case 'cmp':
128
- invalidate(instr.dst);
129
- newInstrs.push({ ...instr, lhs: resolve(instr.lhs), rhs: resolve(instr.rhs) });
130
- break;
131
- case 'call':
132
- if (instr.dst)
133
- invalidate(instr.dst);
134
- newInstrs.push({ ...instr, args: instr.args.map(resolve) });
135
- break;
136
- default:
137
- newInstrs.push(instr);
138
- }
139
- }
140
- return { ...block, instrs: newInstrs };
141
- });
142
- return { ...fn, blocks: newBlocks };
143
- }
144
- // ---------------------------------------------------------------------------
145
- // Pass 3: Dead Code Elimination
146
- // Removes assignments to variables that are never read afterward.
147
- // ---------------------------------------------------------------------------
148
- function deadCodeElimination(fn) {
149
- return deadCodeEliminationWithStats(fn).fn;
150
- }
151
- function deadCodeEliminationWithStats(fn) {
152
- // Collect all reads across all blocks
153
- const readVars = new Set();
154
- function markRead(op) {
155
- if (op.kind === 'var')
156
- readVars.add(op.name);
157
- }
158
- function markRawReads(cmd) {
159
- for (const match of cmd.matchAll(/\$[A-Za-z0-9_]+/g)) {
160
- readVars.add(match[0]);
161
- }
162
- }
163
- for (const block of fn.blocks) {
164
- for (const instr of block.instrs) {
165
- if (instr.op === 'binop') {
166
- markRead(instr.lhs);
167
- markRead(instr.rhs);
168
- }
169
- if (instr.op === 'cmp') {
170
- markRead(instr.lhs);
171
- markRead(instr.rhs);
172
- }
173
- if (instr.op === 'call') {
174
- instr.args.forEach(markRead);
175
- }
176
- if (instr.op === 'assign') {
177
- markRead(instr.src);
178
- }
179
- if (instr.op === 'raw') {
180
- markRawReads(instr.cmd);
181
- }
182
- }
183
- // Terminator reads
184
- const t = block.term;
185
- if (t.op === 'jump_if' || t.op === 'jump_unless')
186
- readVars.add(t.cond);
187
- if (t.op === 'return' && t.value)
188
- markRead(t.value);
189
- if (t.op === 'tick_yield') { /* no reads */ }
190
- }
191
- // Also keep params and globals
192
- fn.params.forEach(p => readVars.add(p));
193
- let removed = 0;
194
- const newBlocks = fn.blocks.map(block => ({
195
- ...block,
196
- instrs: block.instrs.filter(instr => {
197
- // Only assignments/binops/cmps with an unused dst are candidates for removal
198
- if (instr.op === 'assign' || instr.op === 'binop' || instr.op === 'cmp') {
199
- // Always keep assignments to global variables (they may be read by other functions)
200
- // Temps are $t0, $t1, ...; params are $p0, $p1, ...; locals are $_0, $_1, ...
201
- // Everything else is a potential global
202
- const isTemp = /^\$t\d+$/.test(instr.dst) || /^\$p\d+$/.test(instr.dst) || /^\$_\d+$/.test(instr.dst);
203
- const keep = !isTemp || readVars.has(instr.dst);
204
- if (!keep)
205
- removed++;
206
- return keep;
207
- }
208
- // calls may have side effects — keep them always
209
- return true;
210
- }),
211
- }));
212
- return { fn: { ...fn, blocks: newBlocks }, stats: { deadCodeRemoved: removed } };
213
- }
214
- exports.defaultPipeline = [
215
- { name: 'constant-folding', run: constantFolding },
216
- { name: 'copy-propagation', run: copyPropagation },
217
- { name: 'dead-code-elimination', run: deadCodeElimination },
218
- // commandMerging is applied during codegen (MC-specific)
219
- ];
220
- function optimize(fn, passes = exports.defaultPipeline) {
221
- return optimizeWithStats(fn, passes).fn;
222
- }
223
- function optimizeWithStats(fn, passes = exports.defaultPipeline) {
224
- let current = fn;
225
- const stats = (0, commands_1.createEmptyOptimizationStats)();
226
- for (const pass of passes) {
227
- if (pass.name === 'constant-folding') {
228
- const result = constantFoldingWithStats(current);
229
- current = result.fn;
230
- (0, commands_1.mergeOptimizationStats)(stats, result.stats);
231
- continue;
232
- }
233
- if (pass.name === 'dead-code-elimination') {
234
- const result = deadCodeEliminationWithStats(current);
235
- current = result.fn;
236
- (0, commands_1.mergeOptimizationStats)(stats, result.stats);
237
- continue;
238
- }
239
- current = pass.run(current);
240
- }
241
- return { fn: current, stats };
242
- }
243
- //# sourceMappingURL=passes.js.map
@@ -1,9 +0,0 @@
1
- import type { IRCommand, IRFunction } from '../ir/types';
2
- import { type OptimizationStats } from './commands';
3
- export declare function setStructureObjective(obj: string): void;
4
- export declare function optimizeFunctionForStructure(fn: IRFunction, functions: Map<string, IRFunction>, namespace: string): IRCommand[];
5
- export declare function optimizeForStructure(functions: IRFunction[], namespace?: string): IRFunction[];
6
- export declare function optimizeForStructureWithStats(functions: IRFunction[], namespace?: string): {
7
- functions: IRFunction[];
8
- stats: OptimizationStats;
9
- };
@@ -1,356 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setStructureObjective = setStructureObjective;
4
- exports.optimizeFunctionForStructure = optimizeFunctionForStructure;
5
- exports.optimizeForStructure = optimizeForStructure;
6
- exports.optimizeForStructureWithStats = optimizeForStructureWithStats;
7
- const commands_1 = require("./commands");
8
- let OBJ = 'rs';
9
- function setStructureObjective(obj) {
10
- OBJ = obj;
11
- (0, commands_1.setOptimizerObjective)(obj);
12
- }
13
- const INLINE_THRESHOLD = 8;
14
- const BOP_OP = {
15
- '+': '+=',
16
- '-': '-=',
17
- '*': '*=',
18
- '/': '/=',
19
- '%': '%=',
20
- };
21
- function varRef(name) {
22
- return name.startsWith('$') ? name : `$${name}`;
23
- }
24
- function operandToScore(op) {
25
- if (op.kind === 'var')
26
- return `${varRef(op.name)} ${OBJ}`;
27
- if (op.kind === 'const')
28
- return `$const_${op.value} ${OBJ}`;
29
- if (op.kind === 'param')
30
- return `$p${op.index} ${OBJ}`;
31
- throw new Error(`Cannot convert storage operand to score: ${op.path}`);
32
- }
33
- function emitInstr(instr, namespace) {
34
- const commands = [];
35
- switch (instr.op) {
36
- case 'assign':
37
- if (instr.src.kind === 'const') {
38
- commands.push({ cmd: `scoreboard players set ${varRef(instr.dst)} ${OBJ} ${instr.src.value}` });
39
- }
40
- else if (instr.src.kind === 'var') {
41
- commands.push({
42
- cmd: `scoreboard players operation ${varRef(instr.dst)} ${OBJ} = ${varRef(instr.src.name)} ${OBJ}`,
43
- });
44
- }
45
- else if (instr.src.kind === 'param') {
46
- commands.push({
47
- cmd: `scoreboard players operation ${varRef(instr.dst)} ${OBJ} = $p${instr.src.index} ${OBJ}`,
48
- });
49
- }
50
- else {
51
- commands.push({
52
- cmd: `execute store result score ${varRef(instr.dst)} ${OBJ} run data get storage ${instr.src.path}`,
53
- });
54
- }
55
- break;
56
- case 'binop':
57
- commands.push(...emitInstr({ op: 'assign', dst: instr.dst, src: instr.lhs }, namespace));
58
- commands.push({
59
- cmd: `scoreboard players operation ${varRef(instr.dst)} ${OBJ} ${BOP_OP[instr.bop]} ${operandToScore(instr.rhs)}`,
60
- });
61
- break;
62
- case 'cmp': {
63
- const dst = varRef(instr.dst);
64
- const lhs = operandToScore(instr.lhs);
65
- const rhs = operandToScore(instr.rhs);
66
- commands.push({ cmd: `scoreboard players set ${dst} ${OBJ} 0` });
67
- const op = instr.cop === '==' ? 'if score' :
68
- instr.cop === '!=' ? 'unless score' :
69
- instr.cop === '<' ? 'if score' :
70
- instr.cop === '<=' ? 'if score' :
71
- instr.cop === '>' ? 'if score' :
72
- 'if score';
73
- const cmp = instr.cop === '==' || instr.cop === '!=' ? '=' :
74
- instr.cop;
75
- commands.push({
76
- cmd: `execute ${op} ${lhs} ${cmp} ${rhs} run scoreboard players set ${dst} ${OBJ} 1`,
77
- });
78
- break;
79
- }
80
- case 'call':
81
- for (let i = 0; i < instr.args.length; i++) {
82
- commands.push(...emitInstr({ op: 'assign', dst: `$p${i}`, src: instr.args[i] }, namespace));
83
- }
84
- commands.push({ cmd: `function ${namespace}:${instr.fn}` });
85
- if (instr.dst) {
86
- commands.push({
87
- cmd: `scoreboard players operation ${varRef(instr.dst)} ${OBJ} = $ret ${OBJ}`,
88
- });
89
- }
90
- break;
91
- case 'raw':
92
- commands.push({ cmd: instr.cmd });
93
- break;
94
- }
95
- return commands;
96
- }
97
- function emitReturn(term) {
98
- const commands = [];
99
- if (term.value) {
100
- commands.push(...emitInstr({ op: 'assign', dst: '$ret', src: term.value }, ''));
101
- }
102
- if (term.value?.kind === 'const') {
103
- commands.push({ cmd: `return ${term.value.value}` });
104
- }
105
- else if (term.value?.kind === 'var') {
106
- commands.push({ cmd: `return run scoreboard players get ${varRef(term.value.name)} ${OBJ}` });
107
- }
108
- return commands;
109
- }
110
- function markConditional(commands) {
111
- return commands.map(command => ({
112
- ...command,
113
- conditional: true,
114
- }));
115
- }
116
- function cloneVisited(visited) {
117
- return new Set(visited);
118
- }
119
- function isRecursiveCommand(command, currentFn, namespace) {
120
- return command.includes(`function ${namespace}:${currentFn}`);
121
- }
122
- function getInlineableBlock(block, currentFn, namespace) {
123
- if (!block)
124
- return null;
125
- if (block.term.op === 'jump_if' || block.term.op === 'jump_unless' || block.term.op === 'tick_yield') {
126
- return null;
127
- }
128
- const commands = block.instrs.flatMap(instr => emitInstr(instr, namespace));
129
- if (commands.some(command => isRecursiveCommand(command.cmd, currentFn, namespace))) {
130
- return null;
131
- }
132
- if (block.term.op === 'return') {
133
- commands.push(...emitReturn(block.term));
134
- }
135
- if (commands.length > INLINE_THRESHOLD) {
136
- return null;
137
- }
138
- return {
139
- commands,
140
- continuation: block.term.op === 'jump' ? block.term.target : undefined,
141
- };
142
- }
143
- function flattenBlock(fn, label, namespace, visited) {
144
- const blockMap = new Map(fn.blocks.map(block => [block.label, block]));
145
- const block = blockMap.get(label);
146
- if (!block) {
147
- return [];
148
- }
149
- if (visited.has(label)) {
150
- return [{ cmd: `function ${namespace}:${fn.name}/${label}`, label }];
151
- }
152
- visited.add(label);
153
- const commands = [];
154
- if (label === fn.blocks[0]?.label) {
155
- for (let i = 0; i < fn.params.length; i++) {
156
- commands.push({
157
- cmd: `scoreboard players operation ${varRef(fn.params[i])} ${OBJ} = $p${i} ${OBJ}`,
158
- });
159
- }
160
- }
161
- commands.push(...block.instrs.flatMap(instr => emitInstr(instr, namespace)));
162
- const term = block.term;
163
- switch (term.op) {
164
- case 'jump':
165
- commands.push(...flattenBlock(fn, term.target, namespace, visited));
166
- return commands;
167
- case 'jump_if':
168
- case 'jump_unless': {
169
- const trueLabel = term.op === 'jump_if' ? term.then : term.else_;
170
- const falseLabel = term.op === 'jump_if' ? term.else_ : term.then;
171
- const trueRange = term.op === 'jump_if' ? '1..' : '..0';
172
- const falseRange = term.op === 'jump_if' ? '..0' : '1..';
173
- const trueBlock = getInlineableBlock(blockMap.get(trueLabel), fn.name, namespace);
174
- const falseBlock = getInlineableBlock(blockMap.get(falseLabel), fn.name, namespace);
175
- if (trueBlock && falseBlock) {
176
- if (trueBlock.commands.length > 0) {
177
- commands.push({ cmd: `execute if score ${varRef(term.cond)} ${OBJ} matches ${trueRange}`, label: trueLabel });
178
- commands.push(...markConditional(trueBlock.commands));
179
- }
180
- if (falseBlock.commands.length > 0) {
181
- commands.push({ cmd: `execute if score ${varRef(term.cond)} ${OBJ} matches ${falseRange}`, label: falseLabel });
182
- commands.push(...markConditional(falseBlock.commands));
183
- }
184
- const continuation = trueBlock.continuation && trueBlock.continuation === falseBlock.continuation
185
- ? trueBlock.continuation
186
- : undefined;
187
- if (continuation) {
188
- commands.push(...flattenBlock(fn, continuation, namespace, cloneVisited(visited)));
189
- }
190
- return commands;
191
- }
192
- commands.push({ cmd: `execute if score ${varRef(term.cond)} ${OBJ} matches ${trueRange} run function ${namespace}:${fn.name}/${trueLabel}` });
193
- commands.push({ cmd: `execute if score ${varRef(term.cond)} ${OBJ} matches ${falseRange} run function ${namespace}:${fn.name}/${falseLabel}` });
194
- return commands;
195
- }
196
- case 'return':
197
- commands.push(...emitReturn(term));
198
- return commands;
199
- case 'tick_yield':
200
- commands.push({ cmd: `schedule function ${namespace}:${fn.name}/${term.continuation} 1t replace` });
201
- return commands;
202
- }
203
- }
204
- function findVars(command) {
205
- return Array.from(command.matchAll(/\$[A-Za-z0-9_]+/g), match => match[0]);
206
- }
207
- function parsePureWrite(command) {
208
- let match = command.match(/^scoreboard players set (\$[A-Za-z0-9_]+) rs -?\d+$/);
209
- if (match) {
210
- return { dst: match[1], reads: [] };
211
- }
212
- match = command.match(/^scoreboard players operation (\$[A-Za-z0-9_]+) rs = (\$[A-Za-z0-9_]+) rs$/);
213
- if (match) {
214
- return { dst: match[1], reads: [match[2]] };
215
- }
216
- match = command.match(/^execute .* run scoreboard players set (\$[A-Za-z0-9_]+) rs -?\d+$/);
217
- if (match) {
218
- return {
219
- dst: match[1],
220
- reads: findVars(command).filter(name => name !== match[1]),
221
- };
222
- }
223
- return null;
224
- }
225
- function deadStoreEliminate(commands) {
226
- const live = new Set();
227
- const kept = [];
228
- for (let i = commands.length - 1; i >= 0; i--) {
229
- const command = commands[i];
230
- const pureWrite = parsePureWrite(command.cmd);
231
- if (pureWrite) {
232
- pureWrite.reads.forEach(name => live.add(name));
233
- if (!live.has(pureWrite.dst)) {
234
- continue;
235
- }
236
- live.delete(pureWrite.dst);
237
- kept.push(command);
238
- continue;
239
- }
240
- findVars(command.cmd).forEach(name => live.add(name));
241
- kept.push(command);
242
- }
243
- return kept.reverse();
244
- }
245
- function isInlineableFunction(fn, currentFn, namespace) {
246
- if (!fn?.commands || fn.name === currentFn || fn.commands.length > INLINE_THRESHOLD) {
247
- return false;
248
- }
249
- return !fn.commands.some(command => isRecursiveCommand(command.cmd, currentFn, namespace) ||
250
- isRecursiveCommand(command.cmd, fn.name, namespace));
251
- }
252
- function inlineConditionalCalls(commands, functions, currentFn, namespace) {
253
- const optimized = [];
254
- for (const command of commands) {
255
- const match = command.cmd.match(/^(execute .+) run function ([^:]+):(.+)$/);
256
- if (!match || match[2] !== namespace) {
257
- optimized.push(command);
258
- continue;
259
- }
260
- const target = functions.get(match[3]);
261
- if (!isInlineableFunction(target, currentFn, namespace)) {
262
- optimized.push(command);
263
- continue;
264
- }
265
- optimized.push({ cmd: match[1], label: command.label });
266
- optimized.push(...markConditional(target.commands));
267
- }
268
- return optimized;
269
- }
270
- function invertExecuteCondition(command) {
271
- if (command.startsWith('execute if ')) {
272
- return command.replace(/^execute if /, 'execute unless ');
273
- }
274
- if (command.startsWith('execute unless ')) {
275
- return command.replace(/^execute unless /, 'execute if ');
276
- }
277
- return null;
278
- }
279
- function eliminateBranchVariables(commands, functions, currentFn, namespace) {
280
- const optimized = [];
281
- for (let i = 0; i < commands.length; i++) {
282
- const init = commands[i];
283
- const set = commands[i + 1];
284
- const thenCmd = commands[i + 2];
285
- const elseCmd = commands[i + 3];
286
- const initMatch = init?.cmd.match(/^scoreboard players set (\$[A-Za-z0-9_]+) rs 0$/);
287
- const setMatch = set?.cmd.match(/^((?:execute if|execute unless) .+) run scoreboard players set (\$[A-Za-z0-9_]+) rs 1$/);
288
- const thenMatch = thenCmd?.cmd.match(/^execute if score (\$[A-Za-z0-9_]+) rs matches 1\.\. run function [^:]+:(.+)$/);
289
- const elseMatch = elseCmd?.cmd.match(/^execute if score (\$[A-Za-z0-9_]+) rs matches ..0 run function [^:]+:(.+)$/) ??
290
- elseCmd?.cmd.match(/^execute unless score (\$[A-Za-z0-9_]+) rs matches 1\.\. run function [^:]+:(.+)$/);
291
- if (!initMatch || !setMatch || !thenMatch || !elseMatch) {
292
- optimized.push(init);
293
- continue;
294
- }
295
- const branchVar = initMatch[1];
296
- if (setMatch[2] !== branchVar || thenMatch[1] !== branchVar || elseMatch[1] !== branchVar) {
297
- optimized.push(init);
298
- continue;
299
- }
300
- const thenFn = functions.get(thenMatch[2]);
301
- const elseFn = functions.get(elseMatch[2]);
302
- if (!isInlineableFunction(thenFn, currentFn, namespace) || !isInlineableFunction(elseFn, currentFn, namespace)) {
303
- optimized.push(init);
304
- continue;
305
- }
306
- const thenCondition = setMatch[1];
307
- const elseCondition = invertExecuteCondition(thenCondition);
308
- if (!elseCondition) {
309
- optimized.push(init);
310
- continue;
311
- }
312
- optimized.push({ cmd: thenCondition });
313
- optimized.push(...markConditional(thenFn.commands));
314
- if (elseFn.commands.length > 0) {
315
- optimized.push({ cmd: elseCondition });
316
- optimized.push(...markConditional(elseFn.commands));
317
- }
318
- i += 3;
319
- }
320
- return optimized;
321
- }
322
- function optimizeFunctionForStructure(fn, functions, namespace) {
323
- if (fn.blocks.length === 0) {
324
- return [];
325
- }
326
- const linear = flattenBlock(fn, fn.blocks[0].label, namespace, new Set());
327
- const branchEliminated = eliminateBranchVariables(linear, functions, fn.name, namespace);
328
- const inlined = inlineConditionalCalls(branchEliminated, functions, fn.name, namespace);
329
- return deadStoreEliminate(inlined);
330
- }
331
- function optimizeForStructure(functions, namespace = 'redscript') {
332
- return optimizeForStructureWithStats(functions, namespace).functions;
333
- }
334
- function optimizeForStructureWithStats(functions, namespace = 'redscript') {
335
- const staged = new Map(functions.map(fn => [fn.name, { ...fn }]));
336
- for (const fn of staged.values()) {
337
- fn.commands = flattenBlock(fn, fn.blocks[0]?.label ?? 'entry', namespace, new Set());
338
- }
339
- for (const fn of staged.values()) {
340
- fn.commands = optimizeFunctionForStructure(fn, staged, namespace);
341
- }
342
- const optimizedCommands = (0, commands_1.optimizeCommandFunctions)(Array.from(staged.values()).map(fn => ({
343
- name: fn.name,
344
- commands: fn.commands ?? [],
345
- })));
346
- const stats = (0, commands_1.createEmptyOptimizationStats)();
347
- (0, commands_1.mergeOptimizationStats)(stats, optimizedCommands.stats);
348
- return {
349
- functions: Array.from(staged.values()).map(fn => ({
350
- ...fn,
351
- commands: optimizedCommands.functions.find(candidate => candidate.name === fn.name)?.commands ?? fn.commands,
352
- })),
353
- stats,
354
- };
355
- }
356
- //# sourceMappingURL=structure.js.map
@@ -1 +0,0 @@
1
- export {};
@@ -1,19 +0,0 @@
1
- /**
2
- * Top-level compile function for the v2 pipeline.
3
- *
4
- * Pipeline: source → Lexer → Parser → HIR → MIR → optimize → LIR → emit
5
- */
6
- import { type DatapackFile } from './index';
7
- export interface CompileOptions {
8
- namespace?: string;
9
- filePath?: string;
10
- /** v1 compat: inline library sources (treated as `module library;` imports) */
11
- librarySources?: string[];
12
- }
13
- export interface CompileResult {
14
- files: DatapackFile[];
15
- warnings: string[];
16
- /** Always true — v1 compat shim (compile() throws on error) */
17
- readonly success: true;
18
- }
19
- export declare function compile(source: string, options?: CompileOptions): CompileResult;