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
@@ -14,7 +14,7 @@
14
14
  import type {
15
15
  Program, Expr, Stmt, Block, FnDecl, Param,
16
16
  AssignOp, ExecuteSubcommand,
17
- } from '../../src/ast/types'
17
+ } from '../ast/types'
18
18
  import type {
19
19
  HIRModule, HIRFunction, HIRParam, HIRExpr, HIRStmt, HIRBlock,
20
20
  HIRExecuteSubcommand, HIRStruct, HIRImplBlock, HIREnum, HIRConst, HIRGlobal,
@@ -71,11 +71,13 @@ function lowerGlobal(g: Program['globals'][0]): HIRGlobal {
71
71
  function lowerFunction(fn: FnDecl): HIRFunction {
72
72
  return {
73
73
  name: fn.name,
74
+ typeParams: fn.typeParams,
74
75
  params: fn.params.map(lowerParam),
75
76
  returnType: fn.returnType,
76
77
  decorators: fn.decorators,
77
78
  body: lowerBlock(fn.body),
78
79
  isLibraryFn: fn.isLibraryFn,
80
+ isExported: fn.isExported,
79
81
  span: fn.span,
80
82
  }
81
83
  }
@@ -111,6 +113,9 @@ function lowerStmt(stmt: Stmt): HIRStmt | HIRStmt[] {
111
113
  case 'let':
112
114
  return { kind: 'let', name: stmt.name, type: stmt.type, init: lowerExpr(stmt.init), span: stmt.span }
113
115
 
116
+ case 'let_destruct':
117
+ return { kind: 'let_destruct', names: stmt.names, type: stmt.type, init: lowerExpr(stmt.init), span: stmt.span }
118
+
114
119
  case 'expr':
115
120
  return { kind: 'expr', expr: lowerExpr(stmt.expr), span: stmt.span }
116
121
 
@@ -253,6 +258,16 @@ function lowerStmt(stmt: Stmt): HIRStmt | HIRStmt[] {
253
258
  case 'raw':
254
259
  return { kind: 'raw', cmd: stmt.cmd, span: stmt.span }
255
260
 
261
+ case 'if_let_some':
262
+ return {
263
+ kind: 'if_let_some',
264
+ binding: stmt.binding,
265
+ init: lowerExpr(stmt.init),
266
+ then: lowerBlock(stmt.then),
267
+ else_: stmt.else_ ? lowerBlock(stmt.else_) : undefined,
268
+ span: stmt.span,
269
+ }
270
+
256
271
  default: {
257
272
  const _exhaustive: never = stmt
258
273
  throw new Error(`Unknown statement kind: ${(_exhaustive as any).kind}`)
@@ -395,7 +410,7 @@ function lowerExpr(expr: Expr): HIRExpr {
395
410
  return { kind: 'index', obj: lowerExpr(expr.obj), index: lowerExpr(expr.index), span: expr.span }
396
411
 
397
412
  case 'call':
398
- return { kind: 'call', fn: expr.fn, args: expr.args.map(lowerExpr), span: expr.span }
413
+ return { kind: 'call', fn: expr.fn, args: expr.args.map(lowerExpr), typeArgs: expr.typeArgs, span: expr.span }
399
414
 
400
415
  case 'invoke':
401
416
  return { kind: 'invoke', callee: lowerExpr(expr.callee), args: expr.args.map(lowerExpr), span: expr.span }
@@ -409,6 +424,18 @@ function lowerExpr(expr: Expr): HIRExpr {
409
424
  span: expr.span,
410
425
  }
411
426
 
427
+ case 'path_expr':
428
+ return { kind: 'path_expr', enumName: expr.enumName, variant: expr.variant, span: expr.span }
429
+
430
+ case 'tuple_lit':
431
+ return { kind: 'tuple_lit', elements: expr.elements.map(lowerExpr), span: expr.span }
432
+
433
+ case 'some_lit':
434
+ return { kind: 'some_lit', value: lowerExpr(expr.value), span: expr.span }
435
+
436
+ case 'none_lit':
437
+ return { kind: 'none_lit', span: expr.span }
438
+
412
439
  case 'lambda': {
413
440
  const body = Array.isArray(expr.body) ? lowerBlock(expr.body) : lowerExpr(expr.body)
414
441
  return {
@@ -0,0 +1,416 @@
1
+ /**
2
+ * HIR Monomorphization — Phase 2c: Generic functions
3
+ *
4
+ * For each generic function `fn foo<T>(...)`, each unique instantiation
5
+ * `foo<int>`, `foo<float>` etc. produces a concrete copy with a mangled name.
6
+ *
7
+ * Algorithm:
8
+ * 1. Walk the HIR module collecting all call sites to generic functions.
9
+ * 2. For each unique (fnName, typeArgs) pair, clone the generic HIRFunction,
10
+ * substitute all occurrences of the type params, and add to module.functions.
11
+ * 3. Rewrite every call site: `foo<int>(x, y)` → `foo_int(x, y)`.
12
+ * 4. Remove original generic function definitions from the output.
13
+ *
14
+ * Type arg → suffix mapping:
15
+ * int → "int"
16
+ * float → "float"
17
+ * bool → "bool"
18
+ * string → "string"
19
+ * (others) → use struct/enum name
20
+ */
21
+
22
+ import type {
23
+ HIRModule, HIRFunction, HIRParam, HIRExpr, HIRStmt, HIRBlock,
24
+ TypeNode,
25
+ } from './types'
26
+
27
+ // ---------------------------------------------------------------------------
28
+ // Public API
29
+ // ---------------------------------------------------------------------------
30
+
31
+ export function monomorphize(module: HIRModule): HIRModule {
32
+ const mono = new Monomorphizer(module)
33
+ return mono.run()
34
+ }
35
+
36
+ // ---------------------------------------------------------------------------
37
+ // Helpers
38
+ // ---------------------------------------------------------------------------
39
+
40
+ /** Return a stable string suffix for a type argument, used in mangled names. */
41
+ function typeSuffix(t: TypeNode): string {
42
+ switch (t.kind) {
43
+ case 'named': return t.name
44
+ case 'struct': return t.name
45
+ case 'enum': return t.name
46
+ case 'array': return `arr_${typeSuffix(t.elem)}`
47
+ case 'tuple': return `tup_${t.elements.map(typeSuffix).join('_')}`
48
+ case 'option': return `opt_${typeSuffix(t.inner)}`
49
+ default: return 'unknown'
50
+ }
51
+ }
52
+
53
+ /** Produce the mangled name for a specialization, e.g. "max_int". */
54
+ function mangledName(fnName: string, typeArgs: TypeNode[]): string {
55
+ return `${fnName}_${typeArgs.map(typeSuffix).join('_')}`
56
+ }
57
+
58
+ /** Build a substitution map: type param name → concrete type. */
59
+ function buildSubst(typeParams: string[], typeArgs: TypeNode[]): Map<string, TypeNode> {
60
+ const subst = new Map<string, TypeNode>()
61
+ for (let i = 0; i < typeParams.length; i++) {
62
+ subst.set(typeParams[i], typeArgs[i])
63
+ }
64
+ return subst
65
+ }
66
+
67
+ /** Apply substitution to a TypeNode (replacing struct-kind nodes whose name
68
+ * matches a type param with the concrete type). */
69
+ function substType(t: TypeNode, subst: Map<string, TypeNode>): TypeNode {
70
+ switch (t.kind) {
71
+ case 'struct': {
72
+ const replacement = subst.get(t.name)
73
+ if (replacement) return replacement
74
+ return t
75
+ }
76
+ case 'array':
77
+ return { kind: 'array', elem: substType(t.elem, subst) }
78
+ case 'tuple':
79
+ return { kind: 'tuple', elements: t.elements.map(e => substType(e, subst)) }
80
+ case 'option':
81
+ return { kind: 'option', inner: substType(t.inner, subst) }
82
+ case 'function_type':
83
+ return { kind: 'function_type', params: t.params.map(p => substType(p, subst)), return: substType(t.return, subst) }
84
+ default:
85
+ return t
86
+ }
87
+ }
88
+
89
+ // ---------------------------------------------------------------------------
90
+ // Monomorphizer
91
+ // ---------------------------------------------------------------------------
92
+
93
+ /** Context passed through expression/statement rewriting. */
94
+ interface RewriteCtx {
95
+ /** Type substitution: type param name → concrete type */
96
+ subst: Map<string, TypeNode>
97
+ /** Variable scope: variable name → concrete type (for inference) */
98
+ varTypes: Map<string, TypeNode>
99
+ }
100
+
101
+ class Monomorphizer {
102
+ private module: HIRModule
103
+ /** Map from function name → HIRFunction for generic functions */
104
+ private genericFns: Map<string, HIRFunction> = new Map()
105
+ /** Cache: cacheKey → specialized HIRFunction (to avoid duplicate generation) */
106
+ private specialized: Map<string, HIRFunction> = new Map()
107
+ /** Worklist for BFS specialization (to handle generic calling generic) */
108
+ private worklist: Array<{ fn: HIRFunction; typeArgs: TypeNode[] }> = []
109
+
110
+ constructor(module: HIRModule) {
111
+ this.module = module
112
+ }
113
+
114
+ run(): HIRModule {
115
+ // Collect all generic function definitions
116
+ for (const fn of this.module.functions) {
117
+ if (fn.typeParams && fn.typeParams.length > 0) {
118
+ this.genericFns.set(fn.name, fn)
119
+ }
120
+ }
121
+
122
+ if (this.genericFns.size === 0) {
123
+ // Nothing to do — fast path
124
+ return this.module
125
+ }
126
+
127
+ // Rewrite all non-generic functions, collecting specializations needed
128
+ const newFunctions: HIRFunction[] = []
129
+ for (const fn of this.module.functions) {
130
+ if (fn.typeParams && fn.typeParams.length > 0) {
131
+ // Skip generic function templates — they'll be replaced by specializations
132
+ continue
133
+ }
134
+ const rewritten = this.rewriteFn(fn)
135
+ newFunctions.push(rewritten)
136
+ }
137
+
138
+ // Process worklist BFS: generate specializations (which may add more to worklist)
139
+ while (this.worklist.length > 0) {
140
+ const { fn: templateFn, typeArgs } = this.worklist.shift()!
141
+ const key = this.cacheKey(templateFn.name, typeArgs)
142
+ if (this.specialized.has(key)) continue
143
+ // Mark as in-progress to prevent cycles
144
+ this.specialized.set(key, null as unknown as HIRFunction)
145
+ const specializedFn = this.specialize(templateFn, typeArgs)
146
+ this.specialized.set(key, specializedFn)
147
+ }
148
+
149
+ // Add all specializations
150
+ for (const fn of this.specialized.values()) {
151
+ if (fn) newFunctions.push(fn)
152
+ }
153
+
154
+ return { ...this.module, functions: newFunctions }
155
+ }
156
+
157
+ private cacheKey(fnName: string, typeArgs: TypeNode[]): string {
158
+ return `${fnName}|${typeArgs.map(typeSuffix).join(',')}`
159
+ }
160
+
161
+ /** Specialize a generic function with concrete type args. */
162
+ private specialize(templateFn: HIRFunction, typeArgs: TypeNode[]): HIRFunction {
163
+ const subst = buildSubst(templateFn.typeParams!, typeArgs)
164
+ const name = mangledName(templateFn.name, typeArgs)
165
+
166
+ // Build initial variable scope from parameters
167
+ const varTypes = new Map<string, TypeNode>()
168
+ const params: HIRParam[] = templateFn.params.map(p => {
169
+ const concreteType = substType(p.type, subst)
170
+ varTypes.set(p.name, concreteType)
171
+ return {
172
+ name: p.name,
173
+ type: concreteType,
174
+ default: p.default ? this.rewriteExpr(p.default, { subst, varTypes }) : undefined,
175
+ }
176
+ })
177
+
178
+ const returnType = substType(templateFn.returnType, subst)
179
+ const body = this.rewriteBlock(templateFn.body, { subst, varTypes })
180
+
181
+ return {
182
+ name,
183
+ params,
184
+ returnType,
185
+ decorators: templateFn.decorators,
186
+ body,
187
+ isLibraryFn: templateFn.isLibraryFn,
188
+ isExported: templateFn.isExported,
189
+ span: templateFn.span,
190
+ // No typeParams on the specialized copy
191
+ }
192
+ }
193
+
194
+ /** Rewrite a non-generic function (substitute calls to generic functions). */
195
+ private rewriteFn(fn: HIRFunction): HIRFunction {
196
+ const varTypes = new Map<string, TypeNode>()
197
+ // Add params to scope with their concrete types
198
+ for (const p of fn.params) {
199
+ varTypes.set(p.name, p.type)
200
+ }
201
+ return {
202
+ ...fn,
203
+ params: fn.params.map(p => ({
204
+ ...p,
205
+ default: p.default ? this.rewriteExpr(p.default, { subst: new Map(), varTypes }) : undefined,
206
+ })),
207
+ body: this.rewriteBlock(fn.body, { subst: new Map(), varTypes }),
208
+ }
209
+ }
210
+
211
+ private rewriteBlock(block: HIRBlock, ctx: RewriteCtx): HIRBlock {
212
+ // Clone varTypes so block-local bindings don't leak
213
+ const localCtx: RewriteCtx = { subst: ctx.subst, varTypes: new Map(ctx.varTypes) }
214
+ const result: HIRBlock = []
215
+ for (const stmt of block) {
216
+ result.push(this.rewriteStmt(stmt, localCtx))
217
+ }
218
+ return result
219
+ }
220
+
221
+ private rewriteStmt(stmt: HIRStmt, ctx: RewriteCtx): HIRStmt {
222
+ const { subst } = ctx
223
+ switch (stmt.kind) {
224
+ case 'let': {
225
+ const init = this.rewriteExpr(stmt.init, ctx)
226
+ const type = stmt.type ? substType(stmt.type, subst) : undefined
227
+ // Track variable type in scope
228
+ if (type) ctx.varTypes.set(stmt.name, type)
229
+ else {
230
+ const inferred = this.inferExprType(init, ctx)
231
+ if (inferred) ctx.varTypes.set(stmt.name, inferred)
232
+ }
233
+ return { ...stmt, type, init }
234
+ }
235
+ case 'let_destruct':
236
+ return { ...stmt, type: stmt.type ? substType(stmt.type, subst) : undefined, init: this.rewriteExpr(stmt.init, ctx) }
237
+ case 'expr':
238
+ return { ...stmt, expr: this.rewriteExpr(stmt.expr, ctx) }
239
+ case 'return':
240
+ return { ...stmt, value: stmt.value ? this.rewriteExpr(stmt.value, ctx) : undefined }
241
+ case 'if':
242
+ return {
243
+ ...stmt,
244
+ cond: this.rewriteExpr(stmt.cond, ctx),
245
+ then: this.rewriteBlock(stmt.then, ctx),
246
+ else_: stmt.else_ ? this.rewriteBlock(stmt.else_, ctx) : undefined,
247
+ }
248
+ case 'while':
249
+ return {
250
+ ...stmt,
251
+ cond: this.rewriteExpr(stmt.cond, ctx),
252
+ body: this.rewriteBlock(stmt.body, ctx),
253
+ step: stmt.step ? this.rewriteBlock(stmt.step, ctx) : undefined,
254
+ }
255
+ case 'foreach':
256
+ return { ...stmt, iterable: this.rewriteExpr(stmt.iterable, ctx), body: this.rewriteBlock(stmt.body, ctx) }
257
+ case 'match':
258
+ return {
259
+ ...stmt,
260
+ expr: this.rewriteExpr(stmt.expr, ctx),
261
+ arms: stmt.arms.map(arm => ({
262
+ pattern: arm.pattern ? this.rewriteExpr(arm.pattern, ctx) : null,
263
+ body: this.rewriteBlock(arm.body, ctx),
264
+ })),
265
+ }
266
+ case 'execute':
267
+ return { ...stmt, body: this.rewriteBlock(stmt.body, ctx) }
268
+ case 'if_let_some':
269
+ return {
270
+ ...stmt,
271
+ init: this.rewriteExpr(stmt.init, ctx),
272
+ then: this.rewriteBlock(stmt.then, ctx),
273
+ else_: stmt.else_ ? this.rewriteBlock(stmt.else_, ctx) : undefined,
274
+ }
275
+ case 'break':
276
+ case 'continue':
277
+ case 'raw':
278
+ return stmt
279
+ }
280
+ }
281
+
282
+ private rewriteExpr(expr: HIRExpr, ctx: RewriteCtx): HIRExpr {
283
+ const { subst } = ctx
284
+ switch (expr.kind) {
285
+ case 'call': {
286
+ const args = expr.args.map(a => this.rewriteExpr(a, ctx))
287
+ // Determine concrete type args for this call
288
+ const resolvedTypeArgs: TypeNode[] | undefined = expr.typeArgs?.map(t => substType(t, subst))
289
+ const genericFn = this.genericFns.get(expr.fn)
290
+ if (genericFn && genericFn.typeParams && genericFn.typeParams.length > 0) {
291
+ // This call targets a generic function — we need to monomorphize
292
+ const concreteTypeArgs = resolvedTypeArgs ?? this.inferTypeArgs(genericFn, args, ctx)
293
+ if (concreteTypeArgs) {
294
+ const key = this.cacheKey(expr.fn, concreteTypeArgs)
295
+ if (!this.specialized.has(key)) {
296
+ // Enqueue for specialization
297
+ this.worklist.push({ fn: genericFn, typeArgs: concreteTypeArgs })
298
+ }
299
+ const name = mangledName(expr.fn, concreteTypeArgs)
300
+ return { ...expr, fn: name, args, typeArgs: undefined }
301
+ }
302
+ }
303
+ return { ...expr, args, typeArgs: resolvedTypeArgs }
304
+ }
305
+ case 'invoke':
306
+ return { ...expr, callee: this.rewriteExpr(expr.callee, ctx), args: expr.args.map(a => this.rewriteExpr(a, ctx)) }
307
+ case 'binary':
308
+ return { ...expr, left: this.rewriteExpr(expr.left, ctx), right: this.rewriteExpr(expr.right, ctx) }
309
+ case 'unary':
310
+ return { ...expr, operand: this.rewriteExpr(expr.operand, ctx) }
311
+ case 'assign':
312
+ return { ...expr, value: this.rewriteExpr(expr.value, ctx) }
313
+ case 'member_assign':
314
+ return { ...expr, obj: this.rewriteExpr(expr.obj, ctx), value: this.rewriteExpr(expr.value, ctx) }
315
+ case 'member':
316
+ return { ...expr, obj: this.rewriteExpr(expr.obj, ctx) }
317
+ case 'index':
318
+ return { ...expr, obj: this.rewriteExpr(expr.obj, ctx), index: this.rewriteExpr(expr.index, ctx) }
319
+ case 'array_lit':
320
+ return { ...expr, elements: expr.elements.map(e => this.rewriteExpr(e, ctx)) }
321
+ case 'struct_lit':
322
+ return { ...expr, fields: expr.fields.map(f => ({ name: f.name, value: this.rewriteExpr(f.value, ctx) })) }
323
+ case 'tuple_lit':
324
+ return { ...expr, elements: expr.elements.map(e => this.rewriteExpr(e, ctx)) }
325
+ case 'static_call':
326
+ return { ...expr, args: expr.args.map(a => this.rewriteExpr(a, ctx)) }
327
+ case 'lambda':
328
+ return { ...expr, body: Array.isArray(expr.body) ? this.rewriteBlock(expr.body as HIRBlock, ctx) : this.rewriteExpr(expr.body as HIRExpr, ctx) }
329
+ case 'is_check':
330
+ return { ...expr, expr: this.rewriteExpr(expr.expr, ctx) }
331
+ case 'str_interp':
332
+ return { ...expr, parts: expr.parts.map(p => typeof p === 'string' ? p : this.rewriteExpr(p, ctx)) }
333
+ case 'f_string':
334
+ // FStringPart uses AST Expr (not HIRExpr) — pass through without rewriting
335
+ return expr
336
+ case 'some_lit':
337
+ return { ...expr, value: this.rewriteExpr(expr.value, ctx) }
338
+ case 'none_lit':
339
+ return expr
340
+ // Literals / terminals — pass through unchanged
341
+ default:
342
+ return expr
343
+ }
344
+ }
345
+
346
+ /**
347
+ * Infer type args from the actual argument expressions.
348
+ * Works by looking at the types of call arguments and matching them to
349
+ * the type parameters in the function signature.
350
+ *
351
+ * Returns null if inference fails.
352
+ */
353
+ private inferTypeArgs(fn: HIRFunction, args: HIRExpr[], ctx: RewriteCtx): TypeNode[] | null {
354
+ const inferred = new Map<string, TypeNode>()
355
+ const typeParams = fn.typeParams!
356
+
357
+ for (let i = 0; i < fn.params.length && i < args.length; i++) {
358
+ const paramType = fn.params[i].type
359
+ const argType = this.inferExprType(args[i], ctx)
360
+ if (argType) {
361
+ this.matchTypes(paramType, argType, typeParams, inferred)
362
+ }
363
+ }
364
+
365
+ // Check all type params were inferred
366
+ if (typeParams.every(tp => inferred.has(tp))) {
367
+ return typeParams.map(tp => inferred.get(tp)!)
368
+ }
369
+ return null
370
+ }
371
+
372
+ /** Walk a type pattern and a concrete type, binding type param names. */
373
+ private matchTypes(pattern: TypeNode, concrete: TypeNode, typeParams: string[], inferred: Map<string, TypeNode>): void {
374
+ if (pattern.kind === 'struct' && typeParams.includes(pattern.name)) {
375
+ // This position is a type param — bind it
376
+ if (!inferred.has(pattern.name)) {
377
+ inferred.set(pattern.name, concrete)
378
+ }
379
+ return
380
+ }
381
+ if (pattern.kind === 'array' && concrete.kind === 'array') {
382
+ this.matchTypes(pattern.elem, concrete.elem, typeParams, inferred)
383
+ return
384
+ }
385
+ if (pattern.kind === 'tuple' && concrete.kind === 'tuple') {
386
+ for (let i = 0; i < pattern.elements.length && i < concrete.elements.length; i++) {
387
+ this.matchTypes(pattern.elements[i], concrete.elements[i], typeParams, inferred)
388
+ }
389
+ }
390
+ }
391
+
392
+ /** Infer the type of a HIR expression (best-effort, for type inference). */
393
+ private inferExprType(expr: HIRExpr, ctx: RewriteCtx): TypeNode | null {
394
+ switch (expr.kind) {
395
+ case 'int_lit': return { kind: 'named', name: 'int' }
396
+ case 'float_lit': return { kind: 'named', name: 'float' }
397
+ case 'bool_lit': return { kind: 'named', name: 'bool' }
398
+ case 'str_lit': return { kind: 'named', name: 'string' }
399
+ case 'byte_lit': return { kind: 'named', name: 'byte' }
400
+ case 'short_lit': return { kind: 'named', name: 'short' }
401
+ case 'long_lit': return { kind: 'named', name: 'long' }
402
+ case 'double_lit': return { kind: 'named', name: 'double' }
403
+ case 'ident': return ctx.varTypes.get(expr.name) ?? null
404
+ case 'unary':
405
+ // unary minus/not preserves the operand's type
406
+ return this.inferExprType(expr.operand, ctx)
407
+ case 'binary': {
408
+ // For arithmetic, use the left operand's type
409
+ const lt = this.inferExprType(expr.left, ctx)
410
+ if (lt) return lt
411
+ return this.inferExprType(expr.right, ctx)
412
+ }
413
+ default: return null
414
+ }
415
+ }
416
+ }
@@ -23,8 +23,8 @@ import type {
23
23
  SelectorFilter,
24
24
  EntityTypeName,
25
25
  LambdaParam,
26
- } from '../../src/ast/types'
27
- import type { BinOp, CmpOp } from '../../src/ast/types'
26
+ } from '../ast/types'
27
+ import type { BinOp, CmpOp } from '../ast/types'
28
28
 
29
29
  // Re-export types that HIR shares with AST unchanged
30
30
  export type {
@@ -81,11 +81,18 @@ export type HIRExpr =
81
81
  | { kind: 'member'; obj: HIRExpr; field: string; span?: Span }
82
82
  | { kind: 'index'; obj: HIRExpr; index: HIRExpr; span?: Span }
83
83
  // Calls
84
- | { kind: 'call'; fn: string; args: HIRExpr[]; span?: Span }
84
+ | { kind: 'call'; fn: string; args: HIRExpr[]; typeArgs?: TypeNode[]; span?: Span }
85
85
  | { kind: 'invoke'; callee: HIRExpr; args: HIRExpr[]; span?: Span }
86
86
  | { kind: 'static_call'; type: string; method: string; args: HIRExpr[]; span?: Span }
87
+ // Enum variant path
88
+ | { kind: 'path_expr'; enumName: string; variant: string; span?: Span }
87
89
  // Lambda
88
90
  | { kind: 'lambda'; params: LambdaParam[]; returnType?: TypeNode; body: HIRExpr | HIRBlock; span?: Span }
91
+ // Tuple literal
92
+ | { kind: 'tuple_lit'; elements: HIRExpr[]; span?: Span }
93
+ // Option literals
94
+ | { kind: 'some_lit'; value: HIRExpr; span?: Span }
95
+ | { kind: 'none_lit'; span?: Span }
89
96
 
90
97
  // ---------------------------------------------------------------------------
91
98
  // Execute Subcommands (unified — absorbs as_block, at_block, as_at)
@@ -125,6 +132,7 @@ export type HIRExecuteSubcommand =
125
132
 
126
133
  export type HIRStmt =
127
134
  | { kind: 'let'; name: string; type?: TypeNode; init: HIRExpr; span?: Span }
135
+ | { kind: 'let_destruct'; names: string[]; type?: TypeNode; init: HIRExpr; span?: Span }
128
136
  | { kind: 'expr'; expr: HIRExpr; span?: Span }
129
137
  | { kind: 'return'; value?: HIRExpr; span?: Span }
130
138
  | { kind: 'break'; span?: Span }
@@ -138,6 +146,7 @@ export type HIRStmt =
138
146
  // Unified execute block (absorbs as_block, at_block, as_at, execute)
139
147
  | { kind: 'execute'; subcommands: HIRExecuteSubcommand[]; body: HIRBlock; span?: Span }
140
148
  | { kind: 'raw'; cmd: string; span?: Span }
149
+ | { kind: 'if_let_some'; binding: string; init: HIRExpr; then: HIRBlock; else_?: HIRBlock; span?: Span }
141
150
 
142
151
  export type HIRBlock = HIRStmt[]
143
152
 
@@ -153,11 +162,14 @@ export interface HIRParam {
153
162
 
154
163
  export interface HIRFunction {
155
164
  name: string
165
+ /** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
166
+ typeParams?: string[]
156
167
  params: HIRParam[]
157
168
  returnType: TypeNode
158
169
  decorators: Decorator[]
159
170
  body: HIRBlock
160
171
  isLibraryFn?: boolean
172
+ isExported?: boolean
161
173
  span?: Span
162
174
  }
163
175
 
package/src/index.ts CHANGED
@@ -6,13 +6,14 @@
6
6
 
7
7
  export const version = '2.0.0'
8
8
 
9
- import { Lexer } from './lexer'
10
- import { Parser } from './parser'
11
- import { preprocessSource } from './compile'
9
+ import { compile } from './emit/compile'
12
10
 
13
11
  // Re-export v2 compile API
14
- export { compile, CompileOptions, CompileResult } from '../src2/emit/compile'
15
- export type { DatapackFile } from '../src2/emit/index'
12
+ export { compile, CompileOptions, CompileResult } from './emit/compile'
13
+ export { compileModules } from './emit/modules'
14
+ export type { ModuleInput, CompileModulesOptions, CompileModulesResult } from './emit/modules'
15
+ export { McVersion, parseMcVersion, compareMcVersion, DEFAULT_MC_VERSION } from './types/mc-version'
16
+ export type { DatapackFile } from './emit/index'
16
17
 
17
18
  // Re-export utilities
18
19
  export { Lexer } from './lexer'
@@ -22,20 +23,38 @@ export { MCCommandValidator } from './mc-validator'
22
23
  export type { Program, FnDecl, Expr, Stmt, Span } from './ast/types'
23
24
  export type { DiagnosticError } from './diagnostics'
24
25
 
26
+ // Incremental compilation
27
+ export { FileCache, hashFile } from './cache/index'
28
+ export { DependencyGraph, parseImports } from './cache/deps'
29
+ export { compileIncremental, resetCompileCache } from './cache/incremental'
30
+ export type { IncrementalOptions, IncrementalResult } from './cache/incremental'
31
+
32
+ export interface CheckResult {
33
+ error: Error | null
34
+ warnings: string[]
35
+ }
36
+
25
37
  /**
26
38
  * Check RedScript source code for errors without generating output.
39
+ * Runs the full compile pipeline (lex → parse → HIR → MIR → LIR → emit)
40
+ * to catch type-level and lowering errors, not just parse errors.
27
41
  *
28
42
  * @param source - The RedScript source code
29
43
  * @param namespace - Optional namespace
30
44
  * @returns null if no errors, or an error object
31
45
  */
32
46
  export function check(source: string, namespace = 'redscript', filePath?: string): Error | null {
47
+ return checkWithWarnings(source, namespace, filePath).error
48
+ }
49
+
50
+ /**
51
+ * Like check(), but also returns warnings (e.g., tick budget analysis).
52
+ */
53
+ export function checkWithWarnings(source: string, namespace = 'redscript', filePath?: string): CheckResult {
33
54
  try {
34
- const preprocessedSource = preprocessSource(source, { filePath })
35
- const tokens = new Lexer(preprocessedSource, filePath).tokenize()
36
- new Parser(tokens, preprocessedSource, filePath).parse(namespace)
37
- return null
55
+ const result = compile(source, { namespace, filePath })
56
+ return { error: null, warnings: result.warnings }
38
57
  } catch (err) {
39
- return err as Error
58
+ return { error: err as Error, warnings: [] }
40
59
  }
41
60
  }
@@ -16,7 +16,7 @@ export type TokenKind =
16
16
  // Keywords
17
17
  | 'fn' | 'let' | 'const' | 'if' | 'else' | 'while' | 'for' | 'foreach' | 'match'
18
18
  | 'return' | 'break' | 'continue' | 'as' | 'at' | 'in' | 'is' | 'struct' | 'impl' | 'enum' | 'trigger' | 'namespace' | 'module'
19
- | 'execute' | 'run' | 'unless' | 'declare'
19
+ | 'execute' | 'run' | 'unless' | 'declare' | 'export'
20
20
  // Types
21
21
  | 'int' | 'bool' | 'float' | 'string' | 'void'
22
22
  | 'BlockPos'
@@ -91,6 +91,7 @@ const KEYWORDS: Record<string, TokenKind> = {
91
91
  run: 'run',
92
92
  unless: 'unless',
93
93
  declare: 'declare',
94
+ export: 'export',
94
95
  int: 'int',
95
96
  bool: 'bool',
96
97
  float: 'float',