redscript-mc 2.0.0 → 2.1.0

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 (629) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +12 -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 +245 -0
  22. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  23. package/dist/src/__tests__/mc-version.test.js +154 -0
  24. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  25. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  26. package/dist/src/__tests__/modules.test.d.ts +7 -0
  27. package/dist/src/__tests__/modules.test.js +333 -0
  28. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  30. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  31. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  32. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  33. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  34. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  35. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  36. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  37. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  38. package/dist/src/__tests__/option.test.d.ts +14 -0
  39. package/dist/src/__tests__/option.test.js +275 -0
  40. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  41. package/dist/src/__tests__/schedule.test.js +98 -0
  42. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  43. package/dist/src/__tests__/sourcemap.test.js +227 -0
  44. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  45. package/dist/src/__tests__/tuple.test.js +202 -0
  46. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  47. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  48. package/dist/src/ast/types.d.ts +56 -2
  49. package/dist/src/cache/deps.d.ts +41 -0
  50. package/dist/src/cache/deps.js +158 -0
  51. package/dist/src/cache/incremental.d.ts +35 -0
  52. package/dist/src/cache/incremental.js +165 -0
  53. package/dist/src/cache/index.d.ts +37 -0
  54. package/dist/src/cache/index.js +152 -0
  55. package/dist/src/cli.js +76 -45
  56. package/dist/src/compile.d.ts +2 -2
  57. package/dist/src/compile.js +1 -1
  58. package/dist/src/diagnostics/index.d.ts +1 -1
  59. package/dist/src/diagnostics/index.js +8 -11
  60. package/dist/src/emit/compile.d.ts +29 -0
  61. package/dist/src/emit/compile.js +143 -0
  62. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  63. package/dist/{src2 → src}/emit/index.js +59 -8
  64. package/dist/src/emit/modules.d.ts +29 -0
  65. package/dist/src/emit/modules.js +492 -0
  66. package/dist/src/emit/sourcemap.d.ts +53 -0
  67. package/dist/src/emit/sourcemap.js +73 -0
  68. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  69. package/dist/{src2 → src}/hir/lower.js +22 -1
  70. package/dist/src/hir/monomorphize.d.ts +22 -0
  71. package/dist/src/hir/monomorphize.js +379 -0
  72. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  73. package/dist/src/index.d.ts +19 -2
  74. package/dist/src/index.js +36 -14
  75. package/dist/src/lexer/index.d.ts +1 -1
  76. package/dist/src/lexer/index.js +1 -0
  77. package/dist/src/lir/budget.d.ts +37 -0
  78. package/dist/src/lir/budget.js +280 -0
  79. package/dist/{src2 → src}/lir/lower.js +19 -0
  80. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  81. package/dist/src/lsp/main.d.ts +8 -0
  82. package/dist/src/lsp/main.js +11 -0
  83. package/dist/src/lsp/server.d.ts +11 -0
  84. package/dist/src/lsp/server.js +352 -0
  85. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  86. package/dist/{src2 → src}/mir/lower.js +244 -10
  87. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  88. package/dist/src/optimizer/coroutine.d.ts +34 -0
  89. package/dist/src/optimizer/coroutine.js +789 -0
  90. package/dist/src/optimizer/dce.d.ts +8 -34
  91. package/dist/src/optimizer/dce.js +146 -629
  92. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  93. package/dist/src/optimizer/interprocedural.js +186 -0
  94. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  95. package/dist/src/optimizer/lir/const_imm.js +139 -0
  96. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  97. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  98. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  99. package/dist/src/optimizer/lir/peephole.js +52 -0
  100. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  101. package/dist/src/optimizer/lir/pipeline.js +34 -0
  102. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  103. package/dist/src/optimizer/nbt-batch.js +51 -0
  104. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  105. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  106. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  107. package/dist/src/optimizer/selector-cache.js +100 -0
  108. package/dist/src/optimizer/unroll.d.ts +32 -0
  109. package/dist/src/optimizer/unroll.js +348 -0
  110. package/dist/src/parser/index.d.ts +8 -0
  111. package/dist/src/parser/index.js +204 -14
  112. package/dist/src/repl.d.ts +1 -1
  113. package/dist/src/typechecker/index.d.ts +4 -0
  114. package/dist/src/typechecker/index.js +198 -13
  115. package/dist/src/types/mc-version.d.ts +24 -0
  116. package/dist/src/types/mc-version.js +49 -0
  117. package/docs/ROADMAP.md +395 -0
  118. package/docs/compiler-pipeline-redesign.md +27 -10
  119. package/editors/vscode/out/extension.js +25176 -8000
  120. package/editors/vscode/package-lock.json +90 -6
  121. package/editors/vscode/package.json +3 -2
  122. package/editors/vscode/src/extension.ts +97 -67
  123. package/examples/showcase.mcrs +3 -3
  124. package/jest.config.js +1 -1
  125. package/package.json +9 -3
  126. package/src/__tests__/budget.test.ts +297 -0
  127. package/src/__tests__/diagnostics.test.ts +2 -3
  128. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  129. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  130. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  131. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  132. package/src/__tests__/enum.test.ts +425 -0
  133. package/src/__tests__/generics.test.ts +390 -0
  134. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  135. package/src/__tests__/incremental.test.ts +337 -0
  136. package/src/__tests__/lsp.test.ts +270 -0
  137. package/src/__tests__/mc-version.test.ts +178 -0
  138. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  139. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  140. package/src/__tests__/modules.test.ts +365 -0
  141. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  142. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  143. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  144. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  145. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  146. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  147. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  148. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  149. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  150. package/src/__tests__/option.test.ts +299 -0
  151. package/src/__tests__/schedule.test.ts +105 -0
  152. package/src/__tests__/sourcemap.test.ts +254 -0
  153. package/src/__tests__/tuple.test.ts +220 -0
  154. package/src/__tests__/typechecker-strict.test.ts +216 -0
  155. package/src/ast/types.ts +33 -2
  156. package/src/cache/deps.ts +132 -0
  157. package/src/cache/incremental.ts +173 -0
  158. package/src/cache/index.ts +135 -0
  159. package/src/cli.ts +88 -45
  160. package/src/compile.ts +2 -2
  161. package/src/diagnostics/index.ts +8 -11
  162. package/src/emit/compile.ts +177 -0
  163. package/{src2 → src}/emit/index.ts +72 -8
  164. package/src/emit/modules.ts +581 -0
  165. package/src/emit/sourcemap.ts +101 -0
  166. package/{src2 → src}/hir/lower.ts +29 -2
  167. package/src/hir/monomorphize.ts +416 -0
  168. package/{src2 → src}/hir/types.ts +15 -3
  169. package/src/index.ts +29 -10
  170. package/src/lexer/index.ts +2 -1
  171. package/src/lir/budget.ts +321 -0
  172. package/{src2 → src}/lir/lower.ts +32 -1
  173. package/{src2 → src}/lir/types.ts +7 -3
  174. package/src/lsp/main.ts +9 -0
  175. package/src/lsp/server.ts +414 -0
  176. package/{src2 → src}/mir/lower.ts +251 -8
  177. package/{src2 → src}/mir/types.ts +12 -1
  178. package/src/optimizer/coroutine.ts +996 -0
  179. package/{src2 → src}/optimizer/dce.ts +2 -1
  180. package/src/optimizer/interprocedural.ts +177 -0
  181. package/src/optimizer/lir/const_imm.ts +143 -0
  182. package/src/optimizer/lir/dead_slot.ts +123 -0
  183. package/src/optimizer/lir/peephole.ts +57 -0
  184. package/src/optimizer/lir/pipeline.ts +37 -0
  185. package/src/optimizer/nbt-batch.ts +50 -0
  186. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  187. package/src/optimizer/selector-cache.ts +103 -0
  188. package/src/optimizer/unroll.ts +386 -0
  189. package/src/parser/index.ts +212 -15
  190. package/src/repl.ts +1 -1
  191. package/src/stdlib/math.mcrs +4 -4
  192. package/src/templates/quest.mcrs +4 -4
  193. package/src/typechecker/index.ts +215 -15
  194. package/src/types/mc-version.ts +46 -0
  195. package/tsconfig.json +1 -1
  196. package/.claude/commands/build-test.md +0 -10
  197. package/.claude/commands/deploy-demo.md +0 -12
  198. package/.claude/commands/stage-status.md +0 -13
  199. package/.claude/settings.json +0 -12
  200. package/CLAUDE.md +0 -231
  201. package/dist/__tests__/cli.test.js +0 -278
  202. package/dist/__tests__/codegen.test.js +0 -152
  203. package/dist/__tests__/compile-all.test.d.ts +0 -10
  204. package/dist/__tests__/compile-all.test.js +0 -108
  205. package/dist/__tests__/dce.test.js +0 -138
  206. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  207. package/dist/__tests__/diagnostics.test.js +0 -149
  208. package/dist/__tests__/e2e.test.d.ts +0 -6
  209. package/dist/__tests__/e2e.test.js +0 -1847
  210. package/dist/__tests__/entity-types.test.js +0 -203
  211. package/dist/__tests__/formatter.test.js +0 -40
  212. package/dist/__tests__/lexer.test.js +0 -343
  213. package/dist/__tests__/lowering.test.js +0 -1015
  214. package/dist/__tests__/macro.test.d.ts +0 -8
  215. package/dist/__tests__/macro.test.js +0 -305
  216. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  217. package/dist/__tests__/mc-integration.test.js +0 -819
  218. package/dist/__tests__/mc-syntax.test.js +0 -124
  219. package/dist/__tests__/nbt.test.js +0 -82
  220. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  221. package/dist/__tests__/optimizer.test.d.ts +0 -1
  222. package/dist/__tests__/optimizer.test.js +0 -149
  223. package/dist/__tests__/parser.test.d.ts +0 -1
  224. package/dist/__tests__/parser.test.js +0 -807
  225. package/dist/__tests__/repl.test.d.ts +0 -1
  226. package/dist/__tests__/repl.test.js +0 -27
  227. package/dist/__tests__/runtime.test.d.ts +0 -1
  228. package/dist/__tests__/runtime.test.js +0 -289
  229. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  230. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  231. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  232. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  233. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  234. package/dist/__tests__/stdlib-math.test.js +0 -352
  235. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  236. package/dist/__tests__/stdlib-vec.test.js +0 -264
  237. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  238. package/dist/__tests__/structure-optimizer.test.js +0 -33
  239. package/dist/__tests__/typechecker.test.d.ts +0 -1
  240. package/dist/__tests__/typechecker.test.js +0 -552
  241. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  242. package/dist/__tests__/var-allocator.test.js +0 -69
  243. package/dist/ast/types.d.ts +0 -514
  244. package/dist/ast/types.js +0 -9
  245. package/dist/builtins/metadata.d.ts +0 -36
  246. package/dist/builtins/metadata.js +0 -1014
  247. package/dist/cli.d.ts +0 -11
  248. package/dist/codegen/cmdblock/index.d.ts +0 -26
  249. package/dist/codegen/cmdblock/index.js +0 -45
  250. package/dist/codegen/mcfunction/index.d.ts +0 -40
  251. package/dist/codegen/mcfunction/index.js +0 -606
  252. package/dist/codegen/structure/index.d.ts +0 -24
  253. package/dist/codegen/structure/index.js +0 -279
  254. package/dist/codegen/var-allocator.d.ts +0 -45
  255. package/dist/codegen/var-allocator.js +0 -104
  256. package/dist/compile.d.ts +0 -68
  257. package/dist/data/arena/function/__load.mcfunction +0 -6
  258. package/dist/data/arena/function/__tick.mcfunction +0 -2
  259. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  260. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  261. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  262. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  263. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  264. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  265. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  266. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  267. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  268. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  269. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  270. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  271. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  272. package/dist/data/counter/function/__load.mcfunction +0 -5
  273. package/dist/data/counter/function/__tick.mcfunction +0 -2
  274. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  275. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  276. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  277. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  278. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  279. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  280. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  281. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  282. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  283. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  284. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  285. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  286. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  287. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  288. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  289. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  290. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  291. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  292. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  293. package/dist/data/gcd3/function/test.mcfunction +0 -7
  294. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  295. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  296. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  297. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  298. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  299. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  300. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  301. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  302. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  303. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  304. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  305. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  306. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  307. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  308. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  309. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  310. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  311. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  312. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  313. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  314. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  315. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  316. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  317. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  318. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  319. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  320. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  321. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  322. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  323. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  324. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  325. package/dist/data/mathtest/function/test.mcfunction +0 -5
  326. package/dist/data/minecraft/tags/function/load.json +0 -5
  327. package/dist/data/minecraft/tags/function/tick.json +0 -5
  328. package/dist/data/mypack/function/__load.mcfunction +0 -13
  329. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  330. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  331. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  332. package/dist/data/mypack/function/abs.mcfunction +0 -6
  333. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  334. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  335. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  336. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  337. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  338. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  339. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  340. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  341. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  342. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  343. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  346. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  347. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  348. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  352. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  353. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  354. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  357. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  358. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  359. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  360. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  361. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  365. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  366. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  367. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  368. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  369. package/dist/data/quiz/function/__load.mcfunction +0 -16
  370. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  371. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  372. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  373. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  374. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  375. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  376. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  377. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  378. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  379. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  380. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  381. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  382. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  383. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  384. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  386. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  387. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  388. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  389. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  390. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  391. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  392. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  393. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  394. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  395. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  396. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  397. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  398. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  399. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  400. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  402. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  403. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  404. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  405. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  406. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  407. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  408. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  409. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  410. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  411. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  412. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  413. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  414. package/dist/data/runtime/function/__load.mcfunction +0 -5
  415. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  416. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  417. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  418. package/dist/data/shop/function/__load.mcfunction +0 -7
  419. package/dist/data/shop/function/__tick.mcfunction +0 -3
  420. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  421. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  422. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  423. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  424. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  425. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  426. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  427. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  429. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  430. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  431. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  432. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  433. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  434. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  435. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  436. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  437. package/dist/data/turret/function/__load.mcfunction +0 -5
  438. package/dist/data/turret/function/__tick.mcfunction +0 -4
  439. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  440. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  441. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  442. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  443. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  444. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  445. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  446. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  447. package/dist/diagnostics/index.d.ts +0 -44
  448. package/dist/diagnostics/index.js +0 -140
  449. package/dist/events/types.d.ts +0 -35
  450. package/dist/events/types.js +0 -59
  451. package/dist/formatter/index.d.ts +0 -1
  452. package/dist/formatter/index.js +0 -26
  453. package/dist/gcd2.map.json +0 -15
  454. package/dist/gcd3.map.json +0 -17
  455. package/dist/gcd_test.map.json +0 -15
  456. package/dist/index.d.ts +0 -62
  457. package/dist/ir/builder.d.ts +0 -33
  458. package/dist/ir/builder.js +0 -99
  459. package/dist/ir/types.d.ts +0 -132
  460. package/dist/ir/types.js +0 -15
  461. package/dist/isqrttest.map.json +0 -15
  462. package/dist/lexer/index.d.ts +0 -37
  463. package/dist/lexer/index.js +0 -569
  464. package/dist/lowering/index.d.ts +0 -188
  465. package/dist/lowering/index.js +0 -3405
  466. package/dist/mathtest.map.json +0 -6
  467. package/dist/mc-test/client.d.ts +0 -128
  468. package/dist/mc-test/client.js +0 -174
  469. package/dist/mc-test/runner.d.ts +0 -28
  470. package/dist/mc-test/runner.js +0 -150
  471. package/dist/mc-test/setup.d.ts +0 -11
  472. package/dist/mc-test/setup.js +0 -98
  473. package/dist/mc-validator/index.d.ts +0 -17
  474. package/dist/mc-validator/index.js +0 -322
  475. package/dist/mypack.map.json +0 -27
  476. package/dist/nbt/index.d.ts +0 -86
  477. package/dist/nbt/index.js +0 -250
  478. package/dist/optimizer/commands.d.ts +0 -38
  479. package/dist/optimizer/commands.js +0 -451
  480. package/dist/optimizer/dce.d.ts +0 -34
  481. package/dist/optimizer/dce.js +0 -639
  482. package/dist/optimizer/passes.d.ts +0 -34
  483. package/dist/optimizer/passes.js +0 -243
  484. package/dist/optimizer/structure.d.ts +0 -9
  485. package/dist/optimizer/structure.js +0 -356
  486. package/dist/pack.mcmeta +0 -6
  487. package/dist/parser/index.d.ts +0 -93
  488. package/dist/parser/index.js +0 -1687
  489. package/dist/repl.d.ts +0 -16
  490. package/dist/repl.js +0 -165
  491. package/dist/reqtest.map.json +0 -4
  492. package/dist/reqtest2.map.json +0 -4
  493. package/dist/runtime/index.d.ts +0 -107
  494. package/dist/runtime/index.js +0 -1409
  495. package/dist/runtime.map.json +0 -7
  496. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  497. package/dist/src/__tests__/codegen.test.js +0 -152
  498. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  499. package/dist/src/__tests__/e2e.test.js +0 -1789
  500. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  501. package/dist/src/__tests__/entity-types.test.js +0 -203
  502. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  503. package/dist/src/__tests__/lowering.test.js +0 -1015
  504. package/dist/src/__tests__/macro.test.d.ts +0 -8
  505. package/dist/src/__tests__/macro.test.js +0 -306
  506. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  507. package/dist/src/__tests__/nbt.test.js +0 -82
  508. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  509. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  510. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  511. package/dist/src/__tests__/optimizer.test.js +0 -149
  512. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  513. package/dist/src/__tests__/runtime.test.js +0 -289
  514. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  515. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  516. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  517. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  518. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  519. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  520. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  521. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  522. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  523. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  524. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  525. package/dist/src/__tests__/var-allocator.test.js +0 -69
  526. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  527. package/dist/src/codegen/cmdblock/index.js +0 -45
  528. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  529. package/dist/src/codegen/mcfunction/index.js +0 -606
  530. package/dist/src/codegen/structure/index.d.ts +0 -24
  531. package/dist/src/codegen/structure/index.js +0 -279
  532. package/dist/src/codegen/var-allocator.d.ts +0 -45
  533. package/dist/src/codegen/var-allocator.js +0 -104
  534. package/dist/src/ir/builder.d.ts +0 -33
  535. package/dist/src/ir/builder.js +0 -99
  536. package/dist/src/ir/types.d.ts +0 -132
  537. package/dist/src/ir/types.js +0 -15
  538. package/dist/src/lowering/index.d.ts +0 -188
  539. package/dist/src/lowering/index.js +0 -3405
  540. package/dist/src/optimizer/commands.d.ts +0 -38
  541. package/dist/src/optimizer/commands.js +0 -451
  542. package/dist/src/optimizer/passes.d.ts +0 -34
  543. package/dist/src/optimizer/passes.js +0 -243
  544. package/dist/src/optimizer/structure.d.ts +0 -9
  545. package/dist/src/optimizer/structure.js +0 -356
  546. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  547. package/dist/src2/emit/compile.d.ts +0 -19
  548. package/dist/src2/emit/compile.js +0 -80
  549. package/dist/src2/optimizer/dce.d.ts +0 -8
  550. package/dist/src2/optimizer/dce.js +0 -155
  551. package/dist/swap_test.map.json +0 -14
  552. package/dist/tsconfig.tsbuildinfo +0 -1
  553. package/dist/typechecker/index.d.ts +0 -61
  554. package/dist/typechecker/index.js +0 -1034
  555. package/dist/types/entity-hierarchy.d.ts +0 -29
  556. package/dist/types/entity-hierarchy.js +0 -107
  557. package/src2/emit/compile.ts +0 -99
  558. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  559. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  560. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  561. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  562. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  563. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  564. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  565. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  566. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  567. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  568. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  569. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  570. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  571. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  572. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  576. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  578. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  579. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  580. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  581. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  582. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  583. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  584. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  585. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  586. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  587. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  588. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  589. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  590. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  592. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  593. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  594. /package/dist/{src2 → src}/hir/types.js +0 -0
  595. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  596. /package/dist/{src2 → src}/lir/types.js +0 -0
  597. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  598. /package/dist/{src2 → src}/lir/verify.js +0 -0
  599. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  600. /package/dist/{src2 → src}/mir/macro.js +0 -0
  601. /package/dist/{src2 → src}/mir/types.js +0 -0
  602. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  603. /package/dist/{src2 → src}/mir/verify.js +0 -0
  604. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  605. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  606. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  607. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  608. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  609. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  610. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  611. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  612. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  613. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  614. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  615. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  616. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  617. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  618. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  619. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  620. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  621. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  622. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  623. /package/{src2 → src}/lir/verify.ts +0 -0
  624. /package/{src2 → src}/mir/macro.ts +0 -0
  625. /package/{src2 → src}/mir/verify.ts +0 -0
  626. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  627. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  628. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  629. /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',