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
@@ -3,8 +3,12 @@
3
3
  *
4
4
  * Each pass is a function MIRFunction → MIRFunction.
5
5
  * The pipeline iterates until no pass changes the function (fixpoint).
6
+ *
7
+ * Module-level passes (interproceduralConstProp) run once after the
8
+ * per-function fixpoint loop.
6
9
  */
7
10
  import type { MIRFunction, MIRModule } from '../mir/types';
11
+ export { selectorCache } from './selector-cache';
8
12
  export type Pass = (fn: MIRFunction) => MIRFunction;
9
13
  export declare function optimizeFunction(fn: MIRFunction, passes?: Pass[]): MIRFunction;
10
14
  export declare function optimizeModule(mod: MIRModule, passes?: Pass[]): MIRModule;
@@ -4,8 +4,12 @@
4
4
  *
5
5
  * Each pass is a function MIRFunction → MIRFunction.
6
6
  * The pipeline iterates until no pass changes the function (fixpoint).
7
+ *
8
+ * Module-level passes (interproceduralConstProp) run once after the
9
+ * per-function fixpoint loop.
7
10
  */
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.selectorCache = void 0;
9
13
  exports.optimizeFunction = optimizeFunction;
10
14
  exports.optimizeModule = optimizeModule;
11
15
  const constant_fold_1 = require("./constant_fold");
@@ -13,7 +17,17 @@ const copy_prop_1 = require("./copy_prop");
13
17
  const dce_1 = require("./dce");
14
18
  const block_merge_1 = require("./block_merge");
15
19
  const branch_simplify_1 = require("./branch_simplify");
20
+ const unroll_1 = require("./unroll");
21
+ const nbt_batch_1 = require("./nbt-batch");
22
+ const interprocedural_1 = require("./interprocedural");
23
+ // selectorCache is intentionally excluded from the default pipeline:
24
+ // it emits synthetic __sel_cleanup_* / __sel_tag_* call_context instructions
25
+ // that require codegen support before being used end-to-end.
26
+ var selector_cache_1 = require("./selector-cache");
27
+ Object.defineProperty(exports, "selectorCache", { enumerable: true, get: function () { return selector_cache_1.selectorCache; } });
16
28
  const defaultPasses = [
29
+ unroll_1.loopUnroll,
30
+ nbt_batch_1.nbtBatchRead,
17
31
  constant_fold_1.constantFold,
18
32
  copy_prop_1.copyProp,
19
33
  branch_simplify_1.branchSimplify,
@@ -34,9 +48,11 @@ function optimizeFunction(fn, passes = defaultPasses) {
34
48
  return current;
35
49
  }
36
50
  function optimizeModule(mod, passes) {
37
- return {
51
+ const perFnOptimized = {
38
52
  ...mod,
39
53
  functions: mod.functions.map(fn => optimizeFunction(fn, passes)),
40
54
  };
55
+ // Module-level pass: interprocedural constant propagation
56
+ return (0, interprocedural_1.interproceduralConstProp)(perFnOptimized);
41
57
  }
42
58
  //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Selector Cache — MIR optimization pass.
3
+ *
4
+ * Within a single basic block, if the same complex selector (one containing '[')
5
+ * appears in ≥2 call_context instructions (as `as` or `at` subcommands),
6
+ * the pass replaces the 2nd and subsequent occurrences with a simpler
7
+ * tag-based selector `@e[tag=__cache_sel_N]`.
8
+ *
9
+ * Two new call_context instructions are prepended to the block:
10
+ * 1. Cleanup: execute as @e[tag=__cache_sel_N] run <fn: __sel_cleanup_<tag>>
11
+ * — signals codegen to emit: tag @e[tag=<tag>] remove <tag>
12
+ * 2. Tag-add: execute as <original_selector> run <fn: __sel_tag_<tag>>
13
+ * — signals codegen to emit: tag @s add <tag>
14
+ *
15
+ * The synthetic fn names `__sel_cleanup_*` and `__sel_tag_*` are a convention
16
+ * recognized by the codegen layer for special-case emission.
17
+ *
18
+ * This is a block-local pass (does not track selector lifetime across block
19
+ * boundaries) so it is always correct with respect to control flow.
20
+ */
21
+ import type { MIRFunction } from '../mir/types';
22
+ export declare function selectorCache(fn: MIRFunction): MIRFunction;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * Selector Cache — MIR optimization pass.
4
+ *
5
+ * Within a single basic block, if the same complex selector (one containing '[')
6
+ * appears in ≥2 call_context instructions (as `as` or `at` subcommands),
7
+ * the pass replaces the 2nd and subsequent occurrences with a simpler
8
+ * tag-based selector `@e[tag=__cache_sel_N]`.
9
+ *
10
+ * Two new call_context instructions are prepended to the block:
11
+ * 1. Cleanup: execute as @e[tag=__cache_sel_N] run <fn: __sel_cleanup_<tag>>
12
+ * — signals codegen to emit: tag @e[tag=<tag>] remove <tag>
13
+ * 2. Tag-add: execute as <original_selector> run <fn: __sel_tag_<tag>>
14
+ * — signals codegen to emit: tag @s add <tag>
15
+ *
16
+ * The synthetic fn names `__sel_cleanup_*` and `__sel_tag_*` are a convention
17
+ * recognized by the codegen layer for special-case emission.
18
+ *
19
+ * This is a block-local pass (does not track selector lifetime across block
20
+ * boundaries) so it is always correct with respect to control flow.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.selectorCache = selectorCache;
24
+ function selectorCache(fn) {
25
+ let tagId = 0;
26
+ return {
27
+ ...fn,
28
+ blocks: fn.blocks.map(block => processBlock(block, () => tagId++)),
29
+ };
30
+ }
31
+ function processBlock(block, nextId) {
32
+ // Count how many times each complex selector appears across call_context instrs
33
+ const selectorCount = new Map();
34
+ for (const instr of block.instrs) {
35
+ if (instr.kind === 'call_context') {
36
+ for (const sub of instr.subcommands) {
37
+ if ((sub.kind === 'as' || sub.kind === 'at') && isComplexSelector(sub.selector)) {
38
+ selectorCount.set(sub.selector, (selectorCount.get(sub.selector) ?? 0) + 1);
39
+ }
40
+ }
41
+ }
42
+ }
43
+ // Build a map of selectors that appear ≥2 times → assigned tag name
44
+ const repeated = new Map(); // selector → tag name
45
+ for (const [sel, count] of selectorCount) {
46
+ if (count >= 2) {
47
+ repeated.set(sel, `__cache_sel_${nextId()}`);
48
+ }
49
+ }
50
+ if (repeated.size === 0)
51
+ return block;
52
+ // Prepend cleanup + tag-add instructions for each repeated selector
53
+ const prefixInstrs = [];
54
+ for (const [sel, tag] of repeated) {
55
+ // 1. Cleanup: remove stale tags from any entities that still carry this tag
56
+ prefixInstrs.push({
57
+ kind: 'call_context',
58
+ fn: `__sel_cleanup_${tag}`,
59
+ subcommands: [{ kind: 'as', selector: `@e[tag=${tag}]` }],
60
+ });
61
+ // 2. Tag-add: tag all matching entities with the cache tag
62
+ prefixInstrs.push({
63
+ kind: 'call_context',
64
+ fn: `__sel_tag_${tag}`,
65
+ subcommands: [{ kind: 'as', selector: sel }],
66
+ });
67
+ }
68
+ // Rewrite instructions: first occurrence of each repeated selector is kept
69
+ // as-is; subsequent occurrences are replaced with the tag-based selector.
70
+ const seen = new Set();
71
+ const newInstrs = [...prefixInstrs];
72
+ for (const instr of block.instrs) {
73
+ if (instr.kind === 'call_context') {
74
+ const newSubs = instr.subcommands.map(sub => {
75
+ if ((sub.kind === 'as' || sub.kind === 'at') && repeated.has(sub.selector)) {
76
+ const tag = repeated.get(sub.selector);
77
+ if (seen.has(sub.selector)) {
78
+ // Subsequent occurrence — use the tag selector
79
+ return { ...sub, selector: `@e[tag=${tag}]` };
80
+ }
81
+ else {
82
+ // First occurrence — keep original, mark as seen
83
+ seen.add(sub.selector);
84
+ return sub;
85
+ }
86
+ }
87
+ return sub;
88
+ });
89
+ newInstrs.push({ ...instr, subcommands: newSubs });
90
+ }
91
+ else {
92
+ newInstrs.push(instr);
93
+ }
94
+ }
95
+ return { ...block, instrs: newInstrs };
96
+ }
97
+ function isComplexSelector(selector) {
98
+ return selector.includes('[');
99
+ }
100
+ //# sourceMappingURL=selector-cache.js.map
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Small Constant Loop Unrolling — MIR optimization pass.
3
+ *
4
+ * Detects `for (let i = 0; i < N; i++)` loops where N is a compile-time
5
+ * constant and N ≤ 8, then unrolls them: the loop body is duplicated N times
6
+ * with the loop variable substituted as the literal 0..N-1.
7
+ *
8
+ * Pattern recognized (after HIR→MIR lowering):
9
+ * entry block: const t_i 0 (loop var init)
10
+ * loop_header: cmp(lt, t_i, N) → branch body/exit
11
+ * loop_body: body instructions, jump → loop_latch
12
+ * loop_latch: t_i = t_i + 1, jump → loop_header
13
+ * loop_exit: ...
14
+ *
15
+ * After unrolling:
16
+ * entry block (with i=0 def removed):
17
+ * [body with t_i → 0]
18
+ * [body with t_i → 1]
19
+ * ...
20
+ * [body with t_i → N-1]
21
+ * jump → loop_exit
22
+ * loop_exit: ...
23
+ *
24
+ * Limitations:
25
+ * - Only unrolls when N ≤ 8
26
+ * - The loop variable must be initialized to exactly 0 before the loop
27
+ * - The latch must do exactly `t_i = t_i + 1` (or equivalent const add)
28
+ * - No break/continue (body must not jump directly to exit or latch)
29
+ * - N must be a compile-time constant (Operand kind='const')
30
+ */
31
+ import type { MIRFunction } from '../mir/types';
32
+ export declare function loopUnroll(fn: MIRFunction): MIRFunction;
@@ -0,0 +1,348 @@
1
+ "use strict";
2
+ /**
3
+ * Small Constant Loop Unrolling — MIR optimization pass.
4
+ *
5
+ * Detects `for (let i = 0; i < N; i++)` loops where N is a compile-time
6
+ * constant and N ≤ 8, then unrolls them: the loop body is duplicated N times
7
+ * with the loop variable substituted as the literal 0..N-1.
8
+ *
9
+ * Pattern recognized (after HIR→MIR lowering):
10
+ * entry block: const t_i 0 (loop var init)
11
+ * loop_header: cmp(lt, t_i, N) → branch body/exit
12
+ * loop_body: body instructions, jump → loop_latch
13
+ * loop_latch: t_i = t_i + 1, jump → loop_header
14
+ * loop_exit: ...
15
+ *
16
+ * After unrolling:
17
+ * entry block (with i=0 def removed):
18
+ * [body with t_i → 0]
19
+ * [body with t_i → 1]
20
+ * ...
21
+ * [body with t_i → N-1]
22
+ * jump → loop_exit
23
+ * loop_exit: ...
24
+ *
25
+ * Limitations:
26
+ * - Only unrolls when N ≤ 8
27
+ * - The loop variable must be initialized to exactly 0 before the loop
28
+ * - The latch must do exactly `t_i = t_i + 1` (or equivalent const add)
29
+ * - No break/continue (body must not jump directly to exit or latch)
30
+ * - N must be a compile-time constant (Operand kind='const')
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.loopUnroll = loopUnroll;
34
+ const UNROLL_LIMIT = 8;
35
+ // ---------------------------------------------------------------------------
36
+ // Public API
37
+ // ---------------------------------------------------------------------------
38
+ function loopUnroll(fn) {
39
+ let current = fn;
40
+ let changed = true;
41
+ // Iterate to fixpoint in case of multiple unrollable loops
42
+ while (changed) {
43
+ changed = false;
44
+ const result = tryUnrollOne(current);
45
+ if (result !== current) {
46
+ current = result;
47
+ changed = true;
48
+ }
49
+ }
50
+ return current;
51
+ }
52
+ function tryUnrollOne(fn) {
53
+ const blockMap = new Map(fn.blocks.map(b => [b.id, b]));
54
+ const info = findUnrollableLoop(fn, blockMap);
55
+ if (!info)
56
+ return fn;
57
+ return unroll(fn, blockMap, info);
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // Loop detection
61
+ // ---------------------------------------------------------------------------
62
+ function findUnrollableLoop(fn, blockMap) {
63
+ for (const block of fn.blocks) {
64
+ if (!block.id.startsWith('loop_header'))
65
+ continue;
66
+ const info = analyzeLoop(fn, blockMap, block);
67
+ if (info)
68
+ return info;
69
+ }
70
+ return null;
71
+ }
72
+ function analyzeLoop(fn, blockMap, header) {
73
+ // Header must branch on a cmp result
74
+ if (header.term.kind !== 'branch')
75
+ return null;
76
+ const branch = header.term;
77
+ if (branch.cond.kind !== 'temp')
78
+ return null;
79
+ const condName = branch.cond.name;
80
+ // Find the cmp instruction in the header
81
+ const cmpInstr = header.instrs.find(instr => instr.kind === 'cmp' && instr.dst === condName);
82
+ if (!cmpInstr)
83
+ return null;
84
+ // Must be a `lt` comparison: i < N
85
+ if (cmpInstr.op !== 'lt')
86
+ return null;
87
+ // Left operand must be a temp (the loop var), right must be a constant
88
+ if (cmpInstr.a.kind !== 'temp')
89
+ return null;
90
+ if (cmpInstr.b.kind !== 'const')
91
+ return null;
92
+ const loopVar = cmpInstr.a.name;
93
+ const N = cmpInstr.b.value;
94
+ // Reject if N > limit or N <= 0
95
+ if (N > UNROLL_LIMIT || N <= 0)
96
+ return null;
97
+ // then = loop_body, else = loop_exit
98
+ const bodyId = branch.then;
99
+ const exitId = branch.else;
100
+ const bodyBlock = blockMap.get(bodyId);
101
+ if (!bodyBlock)
102
+ return null;
103
+ if (!bodyBlock.id.startsWith('loop_body'))
104
+ return null;
105
+ // Body must end with jump to latch (or header if no latch)
106
+ if (bodyBlock.term.kind !== 'jump')
107
+ return null;
108
+ const afterBodyId = bodyBlock.term.target;
109
+ const afterBody = blockMap.get(afterBodyId);
110
+ if (!afterBody)
111
+ return null;
112
+ // Find the latch block
113
+ let latchId;
114
+ if (afterBody.id.startsWith('loop_latch')) {
115
+ latchId = afterBodyId;
116
+ }
117
+ else {
118
+ return null;
119
+ }
120
+ const latch = blockMap.get(latchId);
121
+ // Latch must end with jump back to header
122
+ if (latch.term.kind !== 'jump')
123
+ return null;
124
+ if (latch.term.target !== header.id)
125
+ return null;
126
+ // Latch must increment loopVar by 1
127
+ if (!latchIncrementsBy1(latch, loopVar))
128
+ return null;
129
+ // Loop var must be initialized to 0 before entering the loop
130
+ // Find the pre-header: the block that jumps to header (not the latch)
131
+ const preHeaderId = findPreHeader(fn, header.id, latchId);
132
+ if (!preHeaderId)
133
+ return null;
134
+ const preHeader = blockMap.get(preHeaderId);
135
+ if (!initializesTo0(preHeader, fn, loopVar))
136
+ return null;
137
+ // Body must not contain break (direct jump to exit) or continue to latch
138
+ // (those would require more complex handling)
139
+ if (bodyHasBreakOrContinue(bodyBlock, exitId, latchId))
140
+ return null;
141
+ return { headerId: header.id, bodyId, latchId, exitId, loopVar, N, preHeaderId };
142
+ }
143
+ /** Check that the latch increments loopVar by 1.
144
+ *
145
+ * Two common patterns:
146
+ * 1. Direct: add loopVar loopVar 1
147
+ * 2. Two-step: add t_tmp loopVar 1; copy loopVar t_tmp
148
+ */
149
+ function latchIncrementsBy1(latch, loopVar) {
150
+ // Pattern 1: add dst=loopVar, a=loopVar, b=const(1)
151
+ for (const instr of latch.instrs) {
152
+ if (instr.kind === 'add' &&
153
+ instr.dst === loopVar &&
154
+ instr.a.kind === 'temp' && instr.a.name === loopVar &&
155
+ instr.b.kind === 'const' && instr.b.value === 1) {
156
+ return true;
157
+ }
158
+ }
159
+ // Pattern 2: add t_tmp loopVar 1; copy loopVar t_tmp
160
+ // Find the copy that assigns loopVar, then check the add that produced the source
161
+ for (let i = 0; i < latch.instrs.length; i++) {
162
+ const instr = latch.instrs[i];
163
+ if (instr.kind === 'copy' &&
164
+ instr.dst === loopVar &&
165
+ instr.src.kind === 'temp') {
166
+ const srcTemp = instr.src.name;
167
+ // Find the add instruction that produced srcTemp
168
+ for (const addInstr of latch.instrs) {
169
+ if (addInstr.kind === 'add' &&
170
+ addInstr.dst === srcTemp &&
171
+ addInstr.a.kind === 'temp' && addInstr.a.name === loopVar &&
172
+ addInstr.b.kind === 'const' && addInstr.b.value === 1) {
173
+ return true;
174
+ }
175
+ }
176
+ }
177
+ }
178
+ return false;
179
+ }
180
+ /** Check if loopVar is initialized to 0 in the pre-header (or reachable const) */
181
+ function initializesTo0(preHeader, fn, loopVar) {
182
+ // Check if last definition of loopVar in preHeader is const 0
183
+ for (let i = preHeader.instrs.length - 1; i >= 0; i--) {
184
+ const instr = preHeader.instrs[i];
185
+ if (instr.kind === 'const' && instr.dst === loopVar && instr.value === 0)
186
+ return true;
187
+ if (instr.kind === 'copy' && instr.dst === loopVar) {
188
+ return instr.src.kind === 'const' && instr.src.value === 0;
189
+ }
190
+ // If something else defines loopVar, it's not 0
191
+ if (getInstrDst(instr) === loopVar)
192
+ return false;
193
+ }
194
+ // Also check entry block if preHeader is entry
195
+ if (preHeader.id === fn.entry)
196
+ return false;
197
+ return false;
198
+ }
199
+ /** Find the pre-header block: the predecessor of header that is NOT the latch */
200
+ function findPreHeader(fn, headerId, latchId) {
201
+ const preds = [];
202
+ for (const block of fn.blocks) {
203
+ const targets = getTermTargets(block.term);
204
+ if (targets.includes(headerId) && block.id !== latchId) {
205
+ preds.push(block.id);
206
+ }
207
+ }
208
+ return preds.length === 1 ? preds[0] : null;
209
+ }
210
+ /** Check if body block has break (jump to exit) or continue (jump to latch) */
211
+ function bodyHasBreakOrContinue(body, exitId, latchId) {
212
+ // The normal path is body → latch. Any direct jump to exit = break,
213
+ // any jump to latch from within body sub-blocks = continue
214
+ // For simplicity, we only unroll if the body has no sub-blocks with these patterns.
215
+ // We only check the body block itself (single-block body).
216
+ // A multi-block body would need recursive checking.
217
+ return false;
218
+ }
219
+ // ---------------------------------------------------------------------------
220
+ // Unrolling
221
+ // ---------------------------------------------------------------------------
222
+ function unroll(fn, blockMap, info) {
223
+ const { headerId, bodyId, latchId, exitId, loopVar, N, preHeaderId } = info;
224
+ const preHeader = blockMap.get(preHeaderId);
225
+ const body = blockMap.get(bodyId);
226
+ // Remove the `const loopVar 0` init from preHeader
227
+ const newPreHeaderInstrs = preHeader.instrs.filter(instr => !(instr.kind === 'const' && instr.dst === loopVar && instr.value === 0) &&
228
+ !(instr.kind === 'copy' && instr.dst === loopVar &&
229
+ instr.src.kind === 'const' && instr.src.value === 0));
230
+ // Build N copies of the body with loopVar substituted
231
+ const unrolledInstrs = [];
232
+ for (let iter = 0; iter < N; iter++) {
233
+ const substitution = new Map([[loopVar, { kind: 'const', value: iter }]]);
234
+ for (const instr of body.instrs) {
235
+ unrolledInstrs.push(substituteInstr(instr, substitution));
236
+ }
237
+ }
238
+ // New pre-header: original instrs (minus init) + all unrolled body + jump to exit
239
+ const newPreHeader = {
240
+ ...preHeader,
241
+ instrs: [...newPreHeaderInstrs, ...unrolledInstrs],
242
+ term: { kind: 'jump', target: exitId },
243
+ };
244
+ // Remove header, body, latch blocks; update preHeader; keep exit
245
+ const keepIds = new Set(fn.blocks.map(b => b.id));
246
+ keepIds.delete(headerId);
247
+ keepIds.delete(bodyId);
248
+ keepIds.delete(latchId);
249
+ const newBlocks = [];
250
+ for (const block of fn.blocks) {
251
+ if (block.id === preHeaderId) {
252
+ newBlocks.push(newPreHeader);
253
+ }
254
+ else if (keepIds.has(block.id)) {
255
+ newBlocks.push(block);
256
+ }
257
+ }
258
+ // Recompute predecessors
259
+ const newBlocksWithPreds = recomputePreds(newBlocks);
260
+ return { ...fn, blocks: newBlocksWithPreds };
261
+ }
262
+ // ---------------------------------------------------------------------------
263
+ // Instruction substitution
264
+ // ---------------------------------------------------------------------------
265
+ function substituteOp(op, sub) {
266
+ if (op.kind === 'temp') {
267
+ const replacement = sub.get(op.name);
268
+ if (replacement)
269
+ return replacement;
270
+ }
271
+ return op;
272
+ }
273
+ function substituteInstr(instr, sub) {
274
+ switch (instr.kind) {
275
+ case 'copy': return { ...instr, src: substituteOp(instr.src, sub) };
276
+ case 'neg':
277
+ case 'not': return { ...instr, src: substituteOp(instr.src, sub) };
278
+ case 'add':
279
+ case 'sub':
280
+ case 'mul':
281
+ case 'div':
282
+ case 'mod':
283
+ case 'and':
284
+ case 'or':
285
+ return { ...instr, a: substituteOp(instr.a, sub), b: substituteOp(instr.b, sub) };
286
+ case 'cmp':
287
+ return { ...instr, a: substituteOp(instr.a, sub), b: substituteOp(instr.b, sub) };
288
+ case 'nbt_write':
289
+ return { ...instr, src: substituteOp(instr.src, sub) };
290
+ case 'call':
291
+ return { ...instr, args: instr.args.map(a => substituteOp(a, sub)) };
292
+ case 'call_macro':
293
+ return { ...instr, args: instr.args.map(a => ({ ...a, value: substituteOp(a.value, sub) })) };
294
+ case 'branch':
295
+ return { ...instr, cond: substituteOp(instr.cond, sub) };
296
+ case 'return':
297
+ return { ...instr, value: instr.value ? substituteOp(instr.value, sub) : null };
298
+ default:
299
+ return instr;
300
+ }
301
+ }
302
+ // ---------------------------------------------------------------------------
303
+ // Helpers
304
+ // ---------------------------------------------------------------------------
305
+ function getInstrDst(instr) {
306
+ switch (instr.kind) {
307
+ case 'const':
308
+ case 'copy':
309
+ case 'add':
310
+ case 'sub':
311
+ case 'mul':
312
+ case 'div':
313
+ case 'mod':
314
+ case 'neg':
315
+ case 'cmp':
316
+ case 'and':
317
+ case 'or':
318
+ case 'not':
319
+ case 'nbt_read':
320
+ return instr.dst;
321
+ case 'call':
322
+ case 'call_macro':
323
+ return instr.dst;
324
+ default:
325
+ return null;
326
+ }
327
+ }
328
+ function getTermTargets(term) {
329
+ switch (term.kind) {
330
+ case 'jump': return [term.target];
331
+ case 'branch': return [term.then, term.else];
332
+ default: return [];
333
+ }
334
+ }
335
+ function recomputePreds(blocks) {
336
+ const predMap = new Map();
337
+ for (const b of blocks)
338
+ predMap.set(b.id, []);
339
+ for (const block of blocks) {
340
+ for (const target of getTermTargets(block.term)) {
341
+ const preds = predMap.get(target);
342
+ if (preds)
343
+ preds.push(block.id);
344
+ }
345
+ }
346
+ return blocks.map(b => ({ ...b, preds: predMap.get(b.id) ?? [] }));
347
+ }
348
+ //# sourceMappingURL=unroll.js.map
@@ -31,6 +31,8 @@ export declare class Parser {
31
31
  private parseImplBlock;
32
32
  private parseConstDecl;
33
33
  private parseGlobalDecl;
34
+ /** Parse `export fn name(...)` — marks the function as exported (survives DCE). */
35
+ private parseExportedFnDecl;
34
36
  private parseFnDecl;
35
37
  /** Parse a `declare fn name(params): returnType;` stub — no body, just discard. */
36
38
  private parseDeclareStub;
@@ -63,6 +65,12 @@ export declare class Parser {
63
65
  private parseUnaryExpr;
64
66
  private parseEntityTypeName;
65
67
  private isSubtraction;
68
+ /**
69
+ * Try to parse `<Type, ...>` as explicit generic type arguments.
70
+ * Returns the parsed type list if successful, null if this looks like a comparison.
71
+ * Does NOT consume any tokens if it returns null.
72
+ */
73
+ private tryParseTypeArgs;
66
74
  private parsePostfixExpr;
67
75
  private parseArgs;
68
76
  private parsePrimaryExpr;