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
@@ -11,7 +11,7 @@ import type {
11
11
  } from '../hir/types'
12
12
  import type {
13
13
  MIRModule, MIRFunction, MIRBlock, MIRInstr, BlockId,
14
- Operand, Temp, CmpOp, ExecuteSubcmd, NBTType,
14
+ Operand, Temp, CmpOp, ExecuteSubcmd, NBTType, SourceLoc,
15
15
  } from './types'
16
16
  import { detectMacroFunctions, BUILTIN_SET, type MacroFunctionInfo } from './macro'
17
17
 
@@ -19,13 +19,23 @@ import { detectMacroFunctions, BUILTIN_SET, type MacroFunctionInfo } from './mac
19
19
  // Public API
20
20
  // ---------------------------------------------------------------------------
21
21
 
22
- export function lowerToMIR(hir: HIRModule): MIRModule {
22
+ export function lowerToMIR(hir: HIRModule, sourceFile?: string): MIRModule {
23
23
  // Build struct definitions: name → field names
24
24
  const structDefs = new Map<string, string[]>()
25
25
  for (const s of hir.structs) {
26
26
  structDefs.set(s.name, s.fields.map(f => f.name))
27
27
  }
28
28
 
29
+ // Build enum definitions: enumName → variantName → integer value
30
+ const enumDefs = new Map<string, Map<string, number>>()
31
+ for (const e of hir.enums) {
32
+ const variants = new Map<string, number>()
33
+ for (const v of e.variants) {
34
+ variants.set(v.name, v.value ?? 0)
35
+ }
36
+ enumDefs.set(e.name, variants)
37
+ }
38
+
29
39
  // Build impl method info: typeName → methodName → { hasSelf }
30
40
  const implMethods = new Map<string, Map<string, { hasSelf: boolean }>>()
31
41
  for (const ib of hir.implBlocks) {
@@ -53,14 +63,14 @@ export function lowerToMIR(hir: HIRModule): MIRModule {
53
63
 
54
64
  const allFunctions: MIRFunction[] = []
55
65
  for (const f of hir.functions) {
56
- const { fn, helpers } = lowerFunction(f, hir.namespace, structDefs, implMethods, macroInfo, fnParamInfo)
66
+ const { fn, helpers } = lowerFunction(f, hir.namespace, structDefs, implMethods, macroInfo, fnParamInfo, enumDefs, sourceFile)
57
67
  allFunctions.push(fn, ...helpers)
58
68
  }
59
69
 
60
70
  // Lower impl block methods
61
71
  for (const ib of hir.implBlocks) {
62
72
  for (const m of ib.methods) {
63
- const { fn, helpers } = lowerImplMethod(m, ib.typeName, hir.namespace, structDefs, implMethods, macroInfo, fnParamInfo)
73
+ const { fn, helpers } = lowerImplMethod(m, ib.typeName, hir.namespace, structDefs, implMethods, macroInfo, fnParamInfo, enumDefs, sourceFile)
64
74
  allFunctions.push(fn, ...helpers)
65
75
  }
66
76
  }
@@ -93,12 +103,20 @@ class FnContext {
93
103
  readonly implMethods: Map<string, Map<string, { hasSelf: boolean }>>
94
104
  /** Struct variable tracking: varName → { typeName, fields: fieldName → temp } */
95
105
  readonly structVars = new Map<string, { typeName: string; fields: Map<string, Temp> }>()
106
+ /** Tuple variable tracking: varName → array of element temps (index = slot) */
107
+ readonly tupleVars = new Map<string, Temp[]>()
96
108
  /** Macro function info for all functions in the module */
97
109
  readonly macroInfo: Map<string, MacroFunctionInfo>
98
110
  /** Function parameter info for call_macro generation */
99
111
  readonly fnParamInfo: Map<string, HIRParam[]>
100
112
  /** Macro params for the current function being lowered */
101
113
  readonly currentMacroParams: Set<string>
114
+ /** Enum definitions: enumName → variantName → integer value */
115
+ readonly enumDefs: Map<string, Map<string, number>>
116
+ /** Current source location (set during statement lowering) */
117
+ currentSourceLoc: SourceLoc | undefined = undefined
118
+ /** Source file path for the module being compiled */
119
+ sourceFile: string | undefined = undefined
102
120
 
103
121
  constructor(
104
122
  namespace: string,
@@ -107,6 +125,7 @@ class FnContext {
107
125
  implMethods: Map<string, Map<string, { hasSelf: boolean }>> = new Map(),
108
126
  macroInfo: Map<string, MacroFunctionInfo> = new Map(),
109
127
  fnParamInfo: Map<string, HIRParam[]> = new Map(),
128
+ enumDefs: Map<string, Map<string, number>> = new Map(),
110
129
  ) {
111
130
  this.namespace = namespace
112
131
  this.fnName = fnName
@@ -115,6 +134,7 @@ class FnContext {
115
134
  this.macroInfo = macroInfo
116
135
  this.fnParamInfo = fnParamInfo
117
136
  this.currentMacroParams = macroInfo.get(fnName)?.macroParams ?? new Set()
137
+ this.enumDefs = enumDefs
118
138
  const entry = this.makeBlock('entry')
119
139
  this.currentBlock = entry
120
140
  }
@@ -139,10 +159,16 @@ class FnContext {
139
159
  }
140
160
 
141
161
  emit(instr: MIRInstr): void {
162
+ if (this.currentSourceLoc && !instr.sourceLoc) {
163
+ instr.sourceLoc = this.currentSourceLoc
164
+ }
142
165
  this.currentBlock.instrs.push(instr)
143
166
  }
144
167
 
145
168
  terminate(term: MIRInstr): void {
169
+ if (this.currentSourceLoc && !term.sourceLoc) {
170
+ term.sourceLoc = this.currentSourceLoc
171
+ }
146
172
  this.currentBlock.term = term
147
173
  }
148
174
 
@@ -186,8 +212,11 @@ function lowerFunction(
186
212
  implMethods: Map<string, Map<string, { hasSelf: boolean }>> = new Map(),
187
213
  macroInfo: Map<string, MacroFunctionInfo> = new Map(),
188
214
  fnParamInfo: Map<string, HIRParam[]> = new Map(),
215
+ enumDefs: Map<string, Map<string, number>> = new Map(),
216
+ sourceFile?: string,
189
217
  ): { fn: MIRFunction; helpers: MIRFunction[] } {
190
- const ctx = new FnContext(namespace, fn.name, structDefs, implMethods, macroInfo, fnParamInfo)
218
+ const ctx = new FnContext(namespace, fn.name, structDefs, implMethods, macroInfo, fnParamInfo, enumDefs)
219
+ ctx.sourceFile = sourceFile
191
220
  const fnMacroInfo = macroInfo.get(fn.name)
192
221
 
193
222
  // Create temps for parameters
@@ -236,9 +265,12 @@ function lowerImplMethod(
236
265
  implMethods: Map<string, Map<string, { hasSelf: boolean }>>,
237
266
  macroInfo: Map<string, MacroFunctionInfo> = new Map(),
238
267
  fnParamInfo: Map<string, HIRParam[]> = new Map(),
268
+ enumDefs: Map<string, Map<string, number>> = new Map(),
269
+ sourceFile?: string,
239
270
  ): { fn: MIRFunction; helpers: MIRFunction[] } {
240
271
  const fnName = `${typeName}::${method.name}`
241
- const ctx = new FnContext(namespace, fnName, structDefs, implMethods, macroInfo, fnParamInfo)
272
+ const ctx = new FnContext(namespace, fnName, structDefs, implMethods, macroInfo, fnParamInfo, enumDefs)
273
+ ctx.sourceFile = sourceFile
242
274
  const fields = structDefs.get(typeName) ?? []
243
275
  const hasSelf = method.params.length > 0 && method.params[0].name === 'self'
244
276
 
@@ -356,9 +388,32 @@ function lowerStmt(
356
388
  ctx: FnContext,
357
389
  scope: Map<string, Temp>,
358
390
  ): void {
391
+ // Propagate source location from HIR statement span
392
+ if (stmt.span && ctx.sourceFile) {
393
+ ctx.currentSourceLoc = { file: ctx.sourceFile, line: stmt.span.line, col: stmt.span.col }
394
+ }
395
+
359
396
  switch (stmt.kind) {
360
397
  case 'let': {
361
- if (stmt.init.kind === 'struct_lit') {
398
+ if (stmt.init.kind === 'some_lit') {
399
+ // Some(expr) — create option struct vars: has=1, val=expr
400
+ // Use __opt_ prefix so DCE treats these as side-effectful scoreboard writes
401
+ const hasTemp: Temp = `__opt_${stmt.name}_has`
402
+ const valTemp: Temp = `__opt_${stmt.name}_val`
403
+ ctx.emit({ kind: 'const', dst: hasTemp, value: 1 })
404
+ const valOp = lowerExpr(stmt.init.value, ctx, scope)
405
+ ctx.emit({ kind: 'copy', dst: valTemp, src: valOp })
406
+ const fieldTemps = new Map<string, Temp>([['has', hasTemp], ['val', valTemp]])
407
+ ctx.structVars.set(stmt.name, { typeName: '__option', fields: fieldTemps })
408
+ } else if (stmt.init.kind === 'none_lit') {
409
+ // None — create option struct vars: has=0, val=0
410
+ const hasTemp: Temp = `__opt_${stmt.name}_has`
411
+ const valTemp: Temp = `__opt_${stmt.name}_val`
412
+ ctx.emit({ kind: 'const', dst: hasTemp, value: 0 })
413
+ ctx.emit({ kind: 'const', dst: valTemp, value: 0 })
414
+ const fieldTemps = new Map<string, Temp>([['has', hasTemp], ['val', valTemp]])
415
+ ctx.structVars.set(stmt.name, { typeName: '__option', fields: fieldTemps })
416
+ } else if (stmt.init.kind === 'struct_lit') {
362
417
  // Struct literal: create per-field temps
363
418
  const typeName = (stmt.type?.kind === 'struct') ? stmt.type.name : '__anon'
364
419
  const fieldTemps = new Map<string, Temp>()
@@ -369,6 +424,15 @@ function lowerStmt(
369
424
  fieldTemps.set(field.name, t)
370
425
  }
371
426
  ctx.structVars.set(stmt.name, { typeName, fields: fieldTemps })
427
+ } else if (stmt.type?.kind === 'option') {
428
+ // Option<T>-typed let with function call result — use __rf_has/__rf_val convention
429
+ lowerExpr(stmt.init, ctx, scope)
430
+ const hasTemp: Temp = `__opt_${stmt.name}_has`
431
+ const valTemp: Temp = `__opt_${stmt.name}_val`
432
+ ctx.emit({ kind: 'copy', dst: hasTemp, src: { kind: 'temp', name: '__rf_has' } })
433
+ ctx.emit({ kind: 'copy', dst: valTemp, src: { kind: 'temp', name: '__rf_val' } })
434
+ const fieldTemps = new Map<string, Temp>([['has', hasTemp], ['val', valTemp]])
435
+ ctx.structVars.set(stmt.name, { typeName: '__option', fields: fieldTemps })
372
436
  } else if (stmt.type?.kind === 'struct') {
373
437
  // Struct-typed let with non-literal init (e.g., call returning struct)
374
438
  const fields = ctx.structDefs.get(stmt.type.name)
@@ -397,19 +461,98 @@ function lowerStmt(
397
461
  break
398
462
  }
399
463
 
464
+ case 'let_destruct': {
465
+ // Tuple destructuring: let (a, b, c) = expr
466
+ const n = stmt.names.length
467
+ if (stmt.init.kind === 'tuple_lit') {
468
+ // Direct tuple literal: evaluate each element into its own temp
469
+ const elemTemps: Temp[] = []
470
+ for (let i = 0; i < stmt.init.elements.length && i < n; i++) {
471
+ const val = lowerExpr(stmt.init.elements[i], ctx, scope)
472
+ const t = ctx.freshTemp()
473
+ ctx.emit({ kind: 'copy', dst: t, src: val })
474
+ elemTemps.push(t)
475
+ scope.set(stmt.names[i], t)
476
+ }
477
+ } else if (stmt.init.kind === 'ident') {
478
+ // Could be referencing a known tuple var
479
+ const tv = ctx.tupleVars.get(stmt.init.name)
480
+ if (tv) {
481
+ for (let i = 0; i < n && i < tv.length; i++) {
482
+ scope.set(stmt.names[i], tv[i])
483
+ }
484
+ break
485
+ }
486
+ // Otherwise treat as a call result stored in __rf_ slots
487
+ lowerExpr(stmt.init, ctx, scope)
488
+ const elemTemps: Temp[] = []
489
+ for (let i = 0; i < n; i++) {
490
+ const t = ctx.freshTemp()
491
+ ctx.emit({ kind: 'copy', dst: t, src: { kind: 'temp', name: `__rf_${i}` } })
492
+ elemTemps.push(t)
493
+ scope.set(stmt.names[i], t)
494
+ }
495
+ // Register as tuple var so it can be passed around
496
+ const varName = stmt.names.join('_') + '_tup'
497
+ ctx.tupleVars.set(varName, elemTemps)
498
+ } else {
499
+ // General expression (e.g. function call) — evaluate, read __rf_ slots
500
+ lowerExpr(stmt.init, ctx, scope)
501
+ const elemTemps: Temp[] = []
502
+ for (let i = 0; i < n; i++) {
503
+ const t = ctx.freshTemp()
504
+ ctx.emit({ kind: 'copy', dst: t, src: { kind: 'temp', name: `__rf_${i}` } })
505
+ elemTemps.push(t)
506
+ scope.set(stmt.names[i], t)
507
+ }
508
+ }
509
+ break
510
+ }
511
+
400
512
  case 'expr': {
401
513
  lowerExpr(stmt.expr, ctx, scope)
402
514
  break
403
515
  }
404
516
 
405
517
  case 'return': {
406
- if (stmt.value?.kind === 'struct_lit') {
518
+ if (stmt.value?.kind === 'some_lit') {
519
+ // Option return: Some(expr) → set __rf_has=1, __rf_val=expr
520
+ const valOp = lowerExpr(stmt.value.value, ctx, scope)
521
+ ctx.emit({ kind: 'copy', dst: '__rf_has', src: { kind: 'const', value: 1 } })
522
+ ctx.emit({ kind: 'copy', dst: '__rf_val', src: valOp })
523
+ ctx.terminate({ kind: 'return', value: null })
524
+ } else if (stmt.value?.kind === 'none_lit') {
525
+ // Option return: None → set __rf_has=0, __rf_val=0
526
+ ctx.emit({ kind: 'copy', dst: '__rf_has', src: { kind: 'const', value: 0 } })
527
+ ctx.emit({ kind: 'copy', dst: '__rf_val', src: { kind: 'const', value: 0 } })
528
+ ctx.terminate({ kind: 'return', value: null })
529
+ } else if (stmt.value?.kind === 'struct_lit') {
407
530
  // Struct return — copy each field to return field slots
408
531
  for (const field of stmt.value.fields) {
409
532
  const val = lowerExpr(field.value, ctx, scope)
410
533
  ctx.emit({ kind: 'copy', dst: `__rf_${field.name}`, src: val })
411
534
  }
412
535
  ctx.terminate({ kind: 'return', value: null })
536
+ } else if (stmt.value?.kind === 'tuple_lit') {
537
+ // Tuple return — copy each element to __rf_0, __rf_1, ...
538
+ for (let i = 0; i < stmt.value.elements.length; i++) {
539
+ const val = lowerExpr(stmt.value.elements[i], ctx, scope)
540
+ ctx.emit({ kind: 'copy', dst: `__rf_${i}`, src: val })
541
+ }
542
+ ctx.terminate({ kind: 'return', value: null })
543
+ } else if (stmt.value?.kind === 'ident') {
544
+ // Check if returning an option struct var
545
+ const sv = ctx.structVars.get(stmt.value.name)
546
+ if (sv && sv.typeName === '__option') {
547
+ const hasT = sv.fields.get('has')!
548
+ const valT = sv.fields.get('val')!
549
+ ctx.emit({ kind: 'copy', dst: '__rf_has', src: { kind: 'temp', name: hasT } })
550
+ ctx.emit({ kind: 'copy', dst: '__rf_val', src: { kind: 'temp', name: valT } })
551
+ ctx.terminate({ kind: 'return', value: null })
552
+ } else {
553
+ const val = lowerExpr(stmt.value, ctx, scope)
554
+ ctx.terminate({ kind: 'return', value: val })
555
+ }
413
556
  } else {
414
557
  const val = stmt.value ? lowerExpr(stmt.value, ctx, scope) : null
415
558
  ctx.terminate({ kind: 'return', value: val })
@@ -622,6 +765,61 @@ function lowerStmt(
622
765
  break
623
766
  }
624
767
 
768
+ case 'if_let_some': {
769
+ // if let Some(x) = opt { ... }
770
+ // Lower: check opt.has, if 1 then bind x = opt.val and run then-block
771
+ const sv = (() => {
772
+ if (stmt.init.kind === 'ident') return ctx.structVars.get(stmt.init.name)
773
+ return undefined
774
+ })()
775
+
776
+ let hasOp: Operand
777
+ let valTemp: Temp | undefined
778
+
779
+ if (sv && sv.typeName === '__option') {
780
+ const hasT = sv.fields.get('has')!
781
+ const valT = sv.fields.get('val')!
782
+ hasOp = { kind: 'temp', name: hasT }
783
+ valTemp = valT
784
+ } else {
785
+ // General: evaluate init (e.g. function call returning option via __rf_has/__rf_val)
786
+ lowerExpr(stmt.init, ctx, scope)
787
+ const hasT = ctx.freshTemp()
788
+ const valT = ctx.freshTemp()
789
+ ctx.emit({ kind: 'copy', dst: hasT, src: { kind: 'temp', name: '__rf_has' } })
790
+ ctx.emit({ kind: 'copy', dst: valT, src: { kind: 'temp', name: '__rf_val' } })
791
+ hasOp = { kind: 'temp', name: hasT }
792
+ valTemp = valT
793
+ }
794
+
795
+ const thenBlock = ctx.newBlock('ifl_then')
796
+ const mergeBlock = ctx.newBlock('ifl_merge')
797
+ const elseBlock = stmt.else_ ? ctx.newBlock('ifl_else') : mergeBlock
798
+
799
+ ctx.terminate({ kind: 'branch', cond: hasOp, then: thenBlock.id, else: elseBlock.id })
800
+
801
+ // Then branch: bind x = val temp
802
+ ctx.switchTo(thenBlock)
803
+ const thenScope = new Map(scope)
804
+ if (valTemp) thenScope.set(stmt.binding, valTemp)
805
+ lowerBlock(stmt.then, ctx, thenScope)
806
+ if (isPlaceholderTerm(ctx.current().term)) {
807
+ ctx.terminate({ kind: 'jump', target: mergeBlock.id })
808
+ }
809
+
810
+ // Else branch
811
+ if (stmt.else_) {
812
+ ctx.switchTo(elseBlock)
813
+ lowerBlock(stmt.else_, ctx, new Map(scope))
814
+ if (isPlaceholderTerm(ctx.current().term)) {
815
+ ctx.terminate({ kind: 'jump', target: mergeBlock.id })
816
+ }
817
+ }
818
+
819
+ ctx.switchTo(mergeBlock)
820
+ break
821
+ }
822
+
625
823
  default: {
626
824
  const _exhaustive: never = stmt
627
825
  throw new Error(`Unknown HIR statement kind: ${(_exhaustive as any).kind}`)
@@ -767,7 +965,21 @@ function lowerExpr(
767
965
  return val
768
966
  }
769
967
 
968
+ case 'path_expr': {
969
+ // Enum variant access: Phase::Idle → integer constant
970
+ const variants = ctx.enumDefs.get(expr.enumName)
971
+ const value = variants?.get(expr.variant) ?? 0
972
+ return { kind: 'const', value }
973
+ }
974
+
770
975
  case 'member': {
976
+ // Enum variant access via dot syntax: Phase.Idle → integer constant
977
+ if (expr.obj.kind === 'ident') {
978
+ const enumVariants = ctx.enumDefs.get(expr.obj.name)
979
+ if (enumVariants && enumVariants.has(expr.field)) {
980
+ return { kind: 'const', value: enumVariants.get(expr.field)! }
981
+ }
982
+ }
771
983
  // Struct field access: v.x → return v's x temp
772
984
  if (expr.obj.kind === 'ident') {
773
985
  const sv = ctx.structVars.get(expr.obj.name)
@@ -888,6 +1100,37 @@ function lowerExpr(
888
1100
  return { kind: 'temp', name: t }
889
1101
  }
890
1102
 
1103
+ case 'tuple_lit': {
1104
+ // Inline tuple literal as expression: store elements into __rf_ slots and return a dummy temp
1105
+ // This happens when a tuple literal appears as an expression (e.g., passed to a function)
1106
+ for (let i = 0; i < expr.elements.length; i++) {
1107
+ const val = lowerExpr(expr.elements[i], ctx, scope)
1108
+ ctx.emit({ kind: 'copy', dst: `__rf_${i}`, src: val })
1109
+ }
1110
+ const t = ctx.freshTemp()
1111
+ ctx.emit({ kind: 'const', dst: t, value: 0 })
1112
+ return { kind: 'temp', name: t }
1113
+ }
1114
+
1115
+ case 'some_lit': {
1116
+ // Some(expr) in expression context: store has=1,val into __rf_has/__rf_val slots
1117
+ const valOp = lowerExpr(expr.value, ctx, scope)
1118
+ ctx.emit({ kind: 'copy', dst: '__rf_has', src: { kind: 'const', value: 1 } })
1119
+ ctx.emit({ kind: 'copy', dst: '__rf_val', src: valOp })
1120
+ const t = ctx.freshTemp()
1121
+ ctx.emit({ kind: 'const', dst: t, value: 1 })
1122
+ return { kind: 'temp', name: t }
1123
+ }
1124
+
1125
+ case 'none_lit': {
1126
+ // None in expression context: store has=0,val=0 into __rf_has/__rf_val slots
1127
+ ctx.emit({ kind: 'copy', dst: '__rf_has', src: { kind: 'const', value: 0 } })
1128
+ ctx.emit({ kind: 'copy', dst: '__rf_val', src: { kind: 'const', value: 0 } })
1129
+ const t = ctx.freshTemp()
1130
+ ctx.emit({ kind: 'const', dst: t, value: 0 })
1131
+ return { kind: 'temp', name: t }
1132
+ }
1133
+
891
1134
  default: {
892
1135
  const _exhaustive: never = expr
893
1136
  throw new Error(`Unknown HIR expression kind: ${(_exhaustive as any).kind}`)
@@ -10,6 +10,13 @@
10
10
  // A temporary variable — unique within a function, named t0, t1, t2...
11
11
  export type Temp = string
12
12
 
13
+ // Source location from the original .mcrs file
14
+ export interface SourceLoc {
15
+ file: string
16
+ line: number
17
+ col: number
18
+ }
19
+
13
20
  // An operand: either a temp or an inline constant
14
21
  export type Operand =
15
22
  | { kind: 'temp'; name: Temp }
@@ -45,7 +52,10 @@ export type ExecuteSubcmd =
45
52
  // MIR Instructions
46
53
  // ---------------------------------------------------------------------------
47
54
 
48
- export type MIRInstr =
55
+ // Base type for all MIR instructions — carries optional source location
56
+ export type MIRInstrBase = { sourceLoc?: SourceLoc }
57
+
58
+ export type MIRInstr = MIRInstrBase & (
49
59
  // ── Constants & copies ──────────────────────────────────────────────────
50
60
  | { kind: 'const'; dst: Temp; value: number }
51
61
  | { kind: 'copy'; dst: Temp; src: Operand }
@@ -79,6 +89,7 @@ export type MIRInstr =
79
89
  | { kind: 'jump'; target: BlockId }
80
90
  | { kind: 'branch'; cond: Operand; then: BlockId; else: BlockId }
81
91
  | { kind: 'return'; value: Operand | null }
92
+ )
82
93
 
83
94
  // ---------------------------------------------------------------------------
84
95
  // Basic block and function structure