redscript-mc 1.2.30 → 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 (593) hide show
  1. package/.claudeignore +21 -0
  2. package/.github/workflows/ci.yml +1 -0
  3. package/README.md +12 -16
  4. package/README.zh.md +2 -2
  5. package/demo.gif +0 -0
  6. package/dist/cli.js +2 -554
  7. package/dist/compile.js +2 -266
  8. package/dist/index.js +2 -159
  9. package/dist/src/__tests__/budget.test.js +261 -0
  10. package/dist/src/__tests__/cli.test.js +104 -0
  11. package/dist/{__tests__ → src/__tests__}/dce.test.js +11 -47
  12. package/dist/{__tests__ → src/__tests__}/diagnostics.test.js +67 -40
  13. package/dist/src/__tests__/e2e/basic.test.d.ts +8 -0
  14. package/dist/src/__tests__/e2e/basic.test.js +140 -0
  15. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  16. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  17. package/dist/src/__tests__/e2e/macros.test.d.ts +9 -0
  18. package/dist/src/__tests__/e2e/macros.test.js +182 -0
  19. package/dist/src/__tests__/e2e/migrate.test.d.ts +13 -0
  20. package/dist/src/__tests__/e2e/migrate.test.js +2739 -0
  21. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  22. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  23. package/dist/src/__tests__/enum.test.d.ts +10 -0
  24. package/dist/src/__tests__/enum.test.js +389 -0
  25. package/dist/src/__tests__/generics.test.d.ts +14 -0
  26. package/dist/src/__tests__/generics.test.js +367 -0
  27. package/dist/src/__tests__/hir/desugar.test.js +234 -0
  28. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  29. package/dist/src/__tests__/incremental.test.js +308 -0
  30. package/dist/src/__tests__/lir/lower.test.js +559 -0
  31. package/dist/src/__tests__/lir/types.test.js +185 -0
  32. package/dist/src/__tests__/lir/verify.test.js +221 -0
  33. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  34. package/dist/src/__tests__/lsp.test.js +245 -0
  35. package/dist/{__tests__ → src/__tests__}/mc-integration.test.js +1 -3
  36. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  37. package/dist/src/__tests__/mc-version.test.js +154 -0
  38. package/dist/src/__tests__/mir/arithmetic.test.js +130 -0
  39. package/dist/src/__tests__/mir/control-flow.test.js +205 -0
  40. package/dist/src/__tests__/mir/verify.test.js +223 -0
  41. package/dist/src/__tests__/modules.test.d.ts +7 -0
  42. package/dist/src/__tests__/modules.test.js +333 -0
  43. package/dist/src/__tests__/optimizer/block_merge.test.js +78 -0
  44. package/dist/src/__tests__/optimizer/branch_simplify.test.js +58 -0
  45. package/dist/src/__tests__/optimizer/constant_fold.test.js +131 -0
  46. package/dist/src/__tests__/optimizer/copy_prop.test.js +91 -0
  47. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  48. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  49. package/dist/src/__tests__/optimizer/dce.test.d.ts +1 -0
  50. package/dist/src/__tests__/optimizer/dce.test.js +76 -0
  51. package/dist/src/__tests__/optimizer/interprocedural.test.d.ts +1 -0
  52. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  53. package/dist/src/__tests__/optimizer/lir/const_imm.test.d.ts +1 -0
  54. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  55. package/dist/src/__tests__/optimizer/lir/dead_slot.test.d.ts +1 -0
  56. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  57. package/dist/src/__tests__/optimizer/lir/peephole.test.d.ts +1 -0
  58. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  59. package/dist/src/__tests__/optimizer/lir/pipeline.test.d.ts +1 -0
  60. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  61. package/dist/src/__tests__/optimizer/nbt-batch.test.d.ts +1 -0
  62. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  63. package/dist/src/__tests__/optimizer/pipeline.test.d.ts +1 -0
  64. package/dist/src/__tests__/optimizer/pipeline.test.js +102 -0
  65. package/dist/src/__tests__/optimizer/selector-cache.test.d.ts +1 -0
  66. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  67. package/dist/src/__tests__/optimizer/unroll.test.d.ts +1 -0
  68. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  69. package/dist/src/__tests__/option.test.d.ts +14 -0
  70. package/dist/src/__tests__/option.test.js +275 -0
  71. package/dist/src/__tests__/parser.test.d.ts +1 -0
  72. package/dist/src/__tests__/repl.test.d.ts +1 -0
  73. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  74. package/dist/src/__tests__/schedule.test.js +98 -0
  75. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  76. package/dist/src/__tests__/sourcemap.test.js +227 -0
  77. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  78. package/dist/src/__tests__/tuple.test.js +202 -0
  79. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  80. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  81. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  82. package/dist/{ast → src/ast}/types.d.ts +58 -3
  83. package/dist/src/cache/deps.d.ts +41 -0
  84. package/dist/src/cache/deps.js +158 -0
  85. package/dist/src/cache/incremental.d.ts +35 -0
  86. package/dist/src/cache/incremental.js +165 -0
  87. package/dist/src/cache/index.d.ts +37 -0
  88. package/dist/src/cache/index.js +152 -0
  89. package/dist/{cli.d.ts → src/cli.d.ts} +1 -1
  90. package/dist/src/cli.js +474 -0
  91. package/dist/src/compile.d.ts +37 -0
  92. package/dist/src/compile.js +165 -0
  93. package/dist/{diagnostics → src/diagnostics}/index.d.ts +1 -1
  94. package/dist/{diagnostics → src/diagnostics}/index.js +8 -11
  95. package/dist/src/emit/compile.d.ts +29 -0
  96. package/dist/src/emit/compile.js +143 -0
  97. package/dist/src/emit/index.d.ts +26 -0
  98. package/dist/src/emit/index.js +223 -0
  99. package/dist/src/emit/modules.d.ts +29 -0
  100. package/dist/src/emit/modules.js +492 -0
  101. package/dist/src/emit/sourcemap.d.ts +53 -0
  102. package/dist/src/emit/sourcemap.js +73 -0
  103. package/dist/src/hir/lower.d.ts +15 -0
  104. package/dist/src/hir/lower.js +399 -0
  105. package/dist/src/hir/monomorphize.d.ts +22 -0
  106. package/dist/src/hir/monomorphize.js +379 -0
  107. package/dist/src/hir/types.d.ts +406 -0
  108. package/dist/src/hir/types.js +16 -0
  109. package/dist/src/index.d.ts +39 -0
  110. package/dist/src/index.js +67 -0
  111. package/dist/{lexer → src/lexer}/index.d.ts +1 -1
  112. package/dist/{lexer → src/lexer}/index.js +1 -0
  113. package/dist/src/lir/budget.d.ts +37 -0
  114. package/dist/src/lir/budget.js +280 -0
  115. package/dist/src/lir/lower.d.ts +15 -0
  116. package/dist/src/lir/lower.js +472 -0
  117. package/dist/src/lir/types.d.ts +139 -0
  118. package/dist/src/lir/types.js +11 -0
  119. package/dist/src/lir/verify.d.ts +14 -0
  120. package/dist/src/lir/verify.js +113 -0
  121. package/dist/src/lsp/main.d.ts +8 -0
  122. package/dist/src/lsp/main.js +11 -0
  123. package/dist/src/lsp/server.d.ts +11 -0
  124. package/dist/src/lsp/server.js +352 -0
  125. package/dist/{mc-test → src/mc-test}/runner.js +4 -3
  126. package/dist/src/mir/lower.d.ts +9 -0
  127. package/dist/src/mir/lower.js +1264 -0
  128. package/dist/src/mir/macro.d.ts +22 -0
  129. package/dist/src/mir/macro.js +168 -0
  130. package/dist/src/mir/types.d.ts +191 -0
  131. package/dist/src/mir/types.js +11 -0
  132. package/dist/src/mir/verify.d.ts +16 -0
  133. package/dist/src/mir/verify.js +216 -0
  134. package/dist/src/optimizer/block_merge.d.ts +12 -0
  135. package/dist/src/optimizer/block_merge.js +84 -0
  136. package/dist/src/optimizer/branch_simplify.d.ts +9 -0
  137. package/dist/src/optimizer/branch_simplify.js +28 -0
  138. package/dist/src/optimizer/constant_fold.d.ts +10 -0
  139. package/dist/src/optimizer/constant_fold.js +85 -0
  140. package/dist/src/optimizer/copy_prop.d.ts +9 -0
  141. package/dist/src/optimizer/copy_prop.js +113 -0
  142. package/dist/src/optimizer/coroutine.d.ts +34 -0
  143. package/dist/src/optimizer/coroutine.js +789 -0
  144. package/dist/src/optimizer/dce.d.ts +8 -0
  145. package/dist/src/optimizer/dce.js +156 -0
  146. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  147. package/dist/src/optimizer/interprocedural.js +186 -0
  148. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  149. package/dist/src/optimizer/lir/const_imm.js +139 -0
  150. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  151. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  152. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  153. package/dist/src/optimizer/lir/peephole.js +52 -0
  154. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  155. package/dist/src/optimizer/lir/pipeline.js +34 -0
  156. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  157. package/dist/src/optimizer/nbt-batch.js +51 -0
  158. package/dist/src/optimizer/pipeline.d.ts +14 -0
  159. package/dist/src/optimizer/pipeline.js +58 -0
  160. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  161. package/dist/src/optimizer/selector-cache.js +100 -0
  162. package/dist/src/optimizer/unroll.d.ts +32 -0
  163. package/dist/src/optimizer/unroll.js +348 -0
  164. package/dist/{parser → src/parser}/index.d.ts +8 -0
  165. package/dist/{parser → src/parser}/index.js +204 -14
  166. package/dist/{repl.d.ts → src/repl.d.ts} +1 -1
  167. package/dist/{runtime → src/runtime}/index.js +1 -1
  168. package/dist/{typechecker → src/typechecker}/index.d.ts +4 -0
  169. package/dist/{typechecker → src/typechecker}/index.js +198 -13
  170. package/dist/src/types/mc-version.d.ts +24 -0
  171. package/dist/src/types/mc-version.js +49 -0
  172. package/docs/ROADMAP.md +395 -0
  173. package/docs/compiler-pipeline-redesign.md +2260 -0
  174. package/docs/optimization-ideas.md +1076 -0
  175. package/editors/vscode/out/extension.js +25176 -8000
  176. package/editors/vscode/package-lock.json +90 -6
  177. package/editors/vscode/package.json +3 -2
  178. package/editors/vscode/src/extension.ts +97 -67
  179. package/examples/showcase.mcrs +3 -3
  180. package/package.json +13 -6
  181. package/scripts/postbuild.js +15 -0
  182. package/src/__tests__/budget.test.ts +297 -0
  183. package/src/__tests__/cli.test.ts +8 -220
  184. package/src/__tests__/dce.test.ts +11 -56
  185. package/src/__tests__/diagnostics.test.ts +61 -41
  186. package/src/__tests__/e2e/basic.test.ts +154 -0
  187. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  188. package/src/__tests__/e2e/macros.test.ts +199 -0
  189. package/src/__tests__/e2e/migrate.test.ts +3008 -0
  190. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  191. package/src/__tests__/enum.test.ts +425 -0
  192. package/src/__tests__/generics.test.ts +390 -0
  193. package/src/__tests__/hir/desugar.test.ts +263 -0
  194. package/src/__tests__/incremental.test.ts +337 -0
  195. package/src/__tests__/lir/lower.test.ts +619 -0
  196. package/src/__tests__/lir/types.test.ts +207 -0
  197. package/src/__tests__/lir/verify.test.ts +249 -0
  198. package/src/__tests__/lsp.test.ts +270 -0
  199. package/src/__tests__/mc-integration.test.ts +1 -2
  200. package/src/__tests__/mc-version.test.ts +178 -0
  201. package/src/__tests__/mir/arithmetic.test.ts +156 -0
  202. package/src/__tests__/mir/control-flow.test.ts +242 -0
  203. package/src/__tests__/mir/verify.test.ts +254 -0
  204. package/src/__tests__/modules.test.ts +365 -0
  205. package/src/__tests__/optimizer/block_merge.test.ts +84 -0
  206. package/src/__tests__/optimizer/branch_simplify.test.ts +64 -0
  207. package/src/__tests__/optimizer/constant_fold.test.ts +145 -0
  208. package/src/__tests__/optimizer/copy_prop.test.ts +99 -0
  209. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  210. package/src/__tests__/optimizer/dce.test.ts +83 -0
  211. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  212. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  213. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  214. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  215. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  216. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  217. package/src/__tests__/optimizer/pipeline.test.ts +116 -0
  218. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  219. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  220. package/src/__tests__/option.test.ts +299 -0
  221. package/src/__tests__/schedule.test.ts +105 -0
  222. package/src/__tests__/sourcemap.test.ts +254 -0
  223. package/src/__tests__/tuple.test.ts +220 -0
  224. package/src/__tests__/typechecker-strict.test.ts +216 -0
  225. package/src/ast/types.ts +39 -3
  226. package/src/cache/deps.ts +132 -0
  227. package/src/cache/incremental.ts +173 -0
  228. package/src/cache/index.ts +135 -0
  229. package/src/cli.ts +111 -195
  230. package/src/compile.ts +6 -162
  231. package/src/diagnostics/index.ts +8 -11
  232. package/src/emit/compile.ts +177 -0
  233. package/src/emit/index.ts +286 -0
  234. package/src/emit/modules.ts +581 -0
  235. package/src/emit/sourcemap.ts +101 -0
  236. package/src/hir/lower.ts +455 -0
  237. package/src/hir/monomorphize.ts +416 -0
  238. package/src/hir/types.ts +228 -0
  239. package/src/index.ts +37 -182
  240. package/src/lexer/index.ts +2 -1
  241. package/src/lir/budget.ts +321 -0
  242. package/src/lir/lower.ts +587 -0
  243. package/src/lir/types.ts +113 -0
  244. package/src/lir/verify.ts +129 -0
  245. package/src/lsp/main.ts +9 -0
  246. package/src/lsp/server.ts +414 -0
  247. package/src/mc-test/runner.ts +4 -3
  248. package/src/mir/lower.ts +1403 -0
  249. package/src/mir/macro.ts +167 -0
  250. package/src/mir/types.ts +117 -0
  251. package/src/mir/verify.ts +218 -0
  252. package/src/optimizer/block_merge.ts +93 -0
  253. package/src/optimizer/branch_simplify.ts +27 -0
  254. package/src/optimizer/constant_fold.ts +88 -0
  255. package/src/optimizer/copy_prop.ts +106 -0
  256. package/src/optimizer/coroutine.ts +996 -0
  257. package/src/optimizer/dce.ts +108 -653
  258. package/src/optimizer/interprocedural.ts +177 -0
  259. package/src/optimizer/lir/const_imm.ts +143 -0
  260. package/src/optimizer/lir/dead_slot.ts +123 -0
  261. package/src/optimizer/lir/peephole.ts +57 -0
  262. package/src/optimizer/lir/pipeline.ts +37 -0
  263. package/src/optimizer/nbt-batch.ts +50 -0
  264. package/src/optimizer/pipeline.ts +59 -0
  265. package/src/optimizer/selector-cache.ts +103 -0
  266. package/src/optimizer/unroll.ts +386 -0
  267. package/src/parser/index.ts +213 -16
  268. package/src/repl.ts +1 -1
  269. package/src/runtime/index.ts +1 -1
  270. package/src/stdlib/math.mcrs +4 -4
  271. package/src/templates/quest.mcrs +4 -4
  272. package/src/typechecker/index.ts +215 -15
  273. package/src/types/mc-version.ts +46 -0
  274. package/tsconfig.json +1 -1
  275. package/dist/__tests__/cli.test.js +0 -278
  276. package/dist/__tests__/codegen.test.js +0 -152
  277. package/dist/__tests__/e2e.test.d.ts +0 -6
  278. package/dist/__tests__/e2e.test.js +0 -1847
  279. package/dist/__tests__/entity-types.test.js +0 -203
  280. package/dist/__tests__/lowering.test.js +0 -1015
  281. package/dist/__tests__/macro.test.d.ts +0 -8
  282. package/dist/__tests__/macro.test.js +0 -305
  283. package/dist/__tests__/nbt.test.js +0 -82
  284. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  285. package/dist/__tests__/optimizer.test.js +0 -149
  286. package/dist/__tests__/runtime.test.js +0 -289
  287. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  288. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  289. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  290. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  291. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  292. package/dist/__tests__/stdlib-math.test.js +0 -352
  293. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  294. package/dist/__tests__/stdlib-vec.test.js +0 -264
  295. package/dist/__tests__/structure-optimizer.test.js +0 -33
  296. package/dist/__tests__/var-allocator.test.js +0 -69
  297. package/dist/codegen/cmdblock/index.d.ts +0 -26
  298. package/dist/codegen/cmdblock/index.js +0 -45
  299. package/dist/codegen/mcfunction/index.d.ts +0 -40
  300. package/dist/codegen/mcfunction/index.js +0 -606
  301. package/dist/codegen/structure/index.d.ts +0 -24
  302. package/dist/codegen/structure/index.js +0 -279
  303. package/dist/codegen/var-allocator.d.ts +0 -45
  304. package/dist/codegen/var-allocator.js +0 -104
  305. package/dist/compile.d.ts +0 -68
  306. package/dist/data/arena/function/__load.mcfunction +0 -6
  307. package/dist/data/arena/function/__tick.mcfunction +0 -2
  308. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  309. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  310. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  311. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  312. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  313. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  314. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  315. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  316. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  317. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  318. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  319. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  320. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  321. package/dist/data/counter/function/__load.mcfunction +0 -5
  322. package/dist/data/counter/function/__tick.mcfunction +0 -2
  323. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  324. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  325. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  326. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  327. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  328. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  329. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  330. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  331. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  332. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  333. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  334. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  335. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  336. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  337. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  338. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  339. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  340. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  341. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  342. package/dist/data/gcd3/function/test.mcfunction +0 -7
  343. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  344. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  345. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  346. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  347. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  348. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  349. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  350. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  351. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  352. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  353. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  354. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  355. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  356. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  357. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  358. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  359. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  360. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  361. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  362. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  363. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  364. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  365. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  366. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  367. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  368. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  369. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  370. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  371. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  372. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  373. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  374. package/dist/data/mathtest/function/test.mcfunction +0 -5
  375. package/dist/data/minecraft/tags/function/load.json +0 -5
  376. package/dist/data/minecraft/tags/function/tick.json +0 -5
  377. package/dist/data/mypack/function/__load.mcfunction +0 -13
  378. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  379. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  380. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  381. package/dist/data/mypack/function/abs.mcfunction +0 -6
  382. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  383. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  384. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  385. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  386. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  387. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  388. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  389. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  390. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  391. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  392. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  393. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  394. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  395. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  396. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  397. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  398. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  399. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  400. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  401. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  402. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  403. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  404. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  405. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  406. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  407. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  408. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  409. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  410. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  411. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  412. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  413. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  414. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  415. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  416. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  417. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  418. package/dist/data/quiz/function/__load.mcfunction +0 -16
  419. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  420. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  421. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  422. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  423. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  424. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  425. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  426. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  427. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  428. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  429. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  430. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  431. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  432. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  433. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  434. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  435. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  436. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  437. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  438. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  439. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  440. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  441. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  442. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  443. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  444. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  445. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  446. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  447. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  448. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  449. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  450. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  451. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  452. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  453. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  454. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  455. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  456. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  457. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  458. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  459. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  460. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  461. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  462. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  463. package/dist/data/runtime/function/__load.mcfunction +0 -5
  464. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  465. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  466. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  467. package/dist/data/shop/function/__load.mcfunction +0 -7
  468. package/dist/data/shop/function/__tick.mcfunction +0 -3
  469. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  470. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  471. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  472. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  473. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  474. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  475. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  476. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  477. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  478. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  479. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  480. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  481. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  482. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  483. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  484. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  485. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  486. package/dist/data/turret/function/__load.mcfunction +0 -5
  487. package/dist/data/turret/function/__tick.mcfunction +0 -4
  488. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  489. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  490. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  491. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  492. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  493. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  494. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  495. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  496. package/dist/gcd2.map.json +0 -15
  497. package/dist/gcd3.map.json +0 -17
  498. package/dist/gcd_test.map.json +0 -15
  499. package/dist/index.d.ts +0 -62
  500. package/dist/ir/builder.d.ts +0 -33
  501. package/dist/ir/builder.js +0 -99
  502. package/dist/ir/types.d.ts +0 -132
  503. package/dist/ir/types.js +0 -15
  504. package/dist/isqrttest.map.json +0 -15
  505. package/dist/lowering/index.d.ts +0 -188
  506. package/dist/lowering/index.js +0 -3403
  507. package/dist/mathtest.map.json +0 -6
  508. package/dist/mypack.map.json +0 -27
  509. package/dist/optimizer/commands.d.ts +0 -38
  510. package/dist/optimizer/commands.js +0 -451
  511. package/dist/optimizer/dce.d.ts +0 -34
  512. package/dist/optimizer/dce.js +0 -639
  513. package/dist/optimizer/passes.d.ts +0 -34
  514. package/dist/optimizer/passes.js +0 -243
  515. package/dist/optimizer/structure.d.ts +0 -9
  516. package/dist/optimizer/structure.js +0 -356
  517. package/dist/pack.mcmeta +0 -6
  518. package/dist/reqtest.map.json +0 -4
  519. package/dist/reqtest2.map.json +0 -4
  520. package/dist/runtime.map.json +0 -7
  521. package/dist/swap_test.map.json +0 -14
  522. package/src/__tests__/codegen.test.ts +0 -161
  523. package/src/__tests__/e2e.test.ts +0 -2039
  524. package/src/__tests__/entity-types.test.ts +0 -236
  525. package/src/__tests__/lowering.test.ts +0 -1185
  526. package/src/__tests__/macro.test.ts +0 -343
  527. package/src/__tests__/nbt.test.ts +0 -58
  528. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  529. package/src/__tests__/optimizer.test.ts +0 -162
  530. package/src/__tests__/runtime.test.ts +0 -305
  531. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  532. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  533. package/src/__tests__/stdlib-math.test.ts +0 -374
  534. package/src/__tests__/stdlib-vec.test.ts +0 -259
  535. package/src/__tests__/structure-optimizer.test.ts +0 -38
  536. package/src/__tests__/var-allocator.test.ts +0 -75
  537. package/src/codegen/cmdblock/index.ts +0 -63
  538. package/src/codegen/mcfunction/index.ts +0 -662
  539. package/src/codegen/structure/index.ts +0 -346
  540. package/src/codegen/var-allocator.ts +0 -104
  541. package/src/ir/builder.ts +0 -116
  542. package/src/ir/types.ts +0 -134
  543. package/src/lowering/index.ts +0 -3876
  544. package/src/optimizer/commands.ts +0 -534
  545. package/src/optimizer/passes.ts +0 -250
  546. package/src/optimizer/structure.ts +0 -450
  547. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  548. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/cli.test.d.ts} +0 -0
  549. /package/dist/{__tests__ → src/__tests__}/compile-all.test.d.ts +0 -0
  550. /package/dist/{__tests__ → src/__tests__}/compile-all.test.js +0 -0
  551. /package/dist/{__tests__ → src/__tests__}/dce.test.d.ts +0 -0
  552. /package/dist/{__tests__ → src/__tests__}/diagnostics.test.d.ts +0 -0
  553. /package/dist/{__tests__ → src/__tests__}/formatter.test.d.ts +0 -0
  554. /package/dist/{__tests__ → src/__tests__}/formatter.test.js +0 -0
  555. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/hir/desugar.test.d.ts} +0 -0
  556. /package/dist/{__tests__ → src/__tests__}/lexer.test.d.ts +0 -0
  557. /package/dist/{__tests__ → src/__tests__}/lexer.test.js +0 -0
  558. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/lir/lower.test.d.ts} +0 -0
  559. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/lir/types.test.d.ts} +0 -0
  560. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/lir/verify.test.d.ts} +0 -0
  561. /package/dist/{__tests__ → src/__tests__}/mc-integration.test.d.ts +0 -0
  562. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/mc-syntax.test.d.ts} +0 -0
  563. /package/dist/{__tests__ → src/__tests__}/mc-syntax.test.js +0 -0
  564. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/mir/arithmetic.test.d.ts} +0 -0
  565. /package/dist/{__tests__/parser.test.d.ts → src/__tests__/mir/control-flow.test.d.ts} +0 -0
  566. /package/dist/{__tests__/repl.test.d.ts → src/__tests__/mir/verify.test.d.ts} +0 -0
  567. /package/dist/{__tests__/runtime.test.d.ts → src/__tests__/optimizer/block_merge.test.d.ts} +0 -0
  568. /package/dist/{__tests__/structure-optimizer.test.d.ts → src/__tests__/optimizer/branch_simplify.test.d.ts} +0 -0
  569. /package/dist/{__tests__/typechecker.test.d.ts → src/__tests__/optimizer/constant_fold.test.d.ts} +0 -0
  570. /package/dist/{__tests__/var-allocator.test.d.ts → src/__tests__/optimizer/copy_prop.test.d.ts} +0 -0
  571. /package/dist/{__tests__ → src/__tests__}/parser.test.js +0 -0
  572. /package/dist/{__tests__ → src/__tests__}/repl.test.js +0 -0
  573. /package/dist/{__tests__ → src/__tests__}/typechecker.test.js +0 -0
  574. /package/dist/{ast → src/ast}/types.js +0 -0
  575. /package/dist/{builtins → src/builtins}/metadata.d.ts +0 -0
  576. /package/dist/{builtins → src/builtins}/metadata.js +0 -0
  577. /package/dist/{events → src/events}/types.d.ts +0 -0
  578. /package/dist/{events → src/events}/types.js +0 -0
  579. /package/dist/{formatter → src/formatter}/index.d.ts +0 -0
  580. /package/dist/{formatter → src/formatter}/index.js +0 -0
  581. /package/dist/{mc-test → src/mc-test}/client.d.ts +0 -0
  582. /package/dist/{mc-test → src/mc-test}/client.js +0 -0
  583. /package/dist/{mc-test → src/mc-test}/runner.d.ts +0 -0
  584. /package/dist/{mc-test → src/mc-test}/setup.d.ts +0 -0
  585. /package/dist/{mc-test → src/mc-test}/setup.js +0 -0
  586. /package/dist/{mc-validator → src/mc-validator}/index.d.ts +0 -0
  587. /package/dist/{mc-validator → src/mc-validator}/index.js +0 -0
  588. /package/dist/{nbt → src/nbt}/index.d.ts +0 -0
  589. /package/dist/{nbt → src/nbt}/index.js +0 -0
  590. /package/dist/{repl.js → src/repl.js} +0 -0
  591. /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
  592. /package/dist/{types → src/types}/entity-hierarchy.d.ts +0 -0
  593. /package/dist/{types → src/types}/entity-hierarchy.js +0 -0
@@ -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
+ }
@@ -0,0 +1,228 @@
1
+ /**
2
+ * HIR (High-level IR) Types — Stage 2 of the RedScript compiler pipeline.
3
+ *
4
+ * HIR is a desugared, structured representation. Compared to the AST:
5
+ * - `for` loops → `while` loops with explicit init/step
6
+ * - `a += b` → `a = a + b`
7
+ * - `a && b` → `if(a) { b } else { false }`
8
+ * - `a || b` → `if(a) { true } else { b }`
9
+ * - `cond ? a : b` → if/else expression (not present in RedScript, but pattern applies)
10
+ * - `as_block`, `at_block`, `as_at` → unified `execute` with subcommands
11
+ *
12
+ * All types and names are preserved from the AST.
13
+ */
14
+
15
+ import type {
16
+ Span,
17
+ TypeNode,
18
+ EntitySelector,
19
+ CoordComponent,
20
+ Decorator,
21
+ RangeExpr,
22
+ FStringPart,
23
+ SelectorFilter,
24
+ EntityTypeName,
25
+ LambdaParam,
26
+ } from '../ast/types'
27
+ import type { BinOp, CmpOp } from '../ast/types'
28
+
29
+ // Re-export types that HIR shares with AST unchanged
30
+ export type {
31
+ Span,
32
+ TypeNode,
33
+ EntitySelector,
34
+ CoordComponent,
35
+ Decorator,
36
+ RangeExpr,
37
+ FStringPart,
38
+ SelectorFilter,
39
+ EntityTypeName,
40
+ LambdaParam,
41
+ BinOp,
42
+ CmpOp,
43
+ }
44
+
45
+ // ---------------------------------------------------------------------------
46
+ // HIR Expressions
47
+ // ---------------------------------------------------------------------------
48
+
49
+ export type HIRExpr =
50
+ // Literals
51
+ | { kind: 'int_lit'; value: number; span?: Span }
52
+ | { kind: 'float_lit'; value: number; span?: Span }
53
+ | { kind: 'byte_lit'; value: number; span?: Span }
54
+ | { kind: 'short_lit'; value: number; span?: Span }
55
+ | { kind: 'long_lit'; value: number; span?: Span }
56
+ | { kind: 'double_lit'; value: number; span?: Span }
57
+ | { kind: 'bool_lit'; value: boolean; span?: Span }
58
+ | { kind: 'str_lit'; value: string; span?: Span }
59
+ | { kind: 'range_lit'; range: RangeExpr; span?: Span }
60
+ | { kind: 'array_lit'; elements: HIRExpr[]; span?: Span }
61
+ | { kind: 'struct_lit'; fields: { name: string; value: HIRExpr }[]; span?: Span }
62
+ // MC-specific literals
63
+ | { kind: 'rel_coord'; value: string; span?: Span }
64
+ | { kind: 'local_coord'; value: string; span?: Span }
65
+ | { kind: 'mc_name'; value: string; span?: Span }
66
+ | { kind: 'blockpos'; x: CoordComponent; y: CoordComponent; z: CoordComponent; span?: Span }
67
+ | { kind: 'selector'; raw: string; isSingle: boolean; sel: EntitySelector; span?: Span }
68
+ // String interpolation
69
+ | { kind: 'str_interp'; parts: Array<string | HIRExpr>; span?: Span }
70
+ | { kind: 'f_string'; parts: FStringPart[]; span?: Span }
71
+ // Identifiers
72
+ | { kind: 'ident'; name: string; span?: Span }
73
+ // Operators — && and || preserved (control-flow lowering happens in MIR)
74
+ | { kind: 'binary'; op: BinOp | CmpOp | '&&' | '||'; left: HIRExpr; right: HIRExpr; span?: Span }
75
+ | { kind: 'unary'; op: '!' | '-'; operand: HIRExpr; span?: Span }
76
+ | { kind: 'is_check'; expr: HIRExpr; entityType: EntityTypeName; span?: Span }
77
+ // Assignment — only plain '=' (compound ops desugared)
78
+ | { kind: 'assign'; target: string; value: HIRExpr; span?: Span }
79
+ | { kind: 'member_assign'; obj: HIRExpr; field: string; value: HIRExpr; span?: Span }
80
+ // Access
81
+ | { kind: 'member'; obj: HIRExpr; field: string; span?: Span }
82
+ | { kind: 'index'; obj: HIRExpr; index: HIRExpr; span?: Span }
83
+ // Calls
84
+ | { kind: 'call'; fn: string; args: HIRExpr[]; typeArgs?: TypeNode[]; span?: Span }
85
+ | { kind: 'invoke'; callee: HIRExpr; args: HIRExpr[]; span?: Span }
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 }
89
+ // Lambda
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 }
96
+
97
+ // ---------------------------------------------------------------------------
98
+ // Execute Subcommands (unified — absorbs as_block, at_block, as_at)
99
+ // ---------------------------------------------------------------------------
100
+
101
+ export type HIRExecuteSubcommand =
102
+ // Context modifiers
103
+ | { kind: 'as'; selector: EntitySelector }
104
+ | { kind: 'at'; selector: EntitySelector }
105
+ | { kind: 'positioned'; x: string; y: string; z: string }
106
+ | { kind: 'positioned_as'; selector: EntitySelector }
107
+ | { kind: 'rotated'; yaw: string; pitch: string }
108
+ | { kind: 'rotated_as'; selector: EntitySelector }
109
+ | { kind: 'facing'; x: string; y: string; z: string }
110
+ | { kind: 'facing_entity'; selector: EntitySelector; anchor: 'eyes' | 'feet' }
111
+ | { kind: 'anchored'; anchor: 'eyes' | 'feet' }
112
+ | { kind: 'align'; axes: string }
113
+ | { kind: 'in'; dimension: string }
114
+ | { kind: 'on'; relation: string }
115
+ | { kind: 'summon'; entity: string }
116
+ // Conditions
117
+ | { kind: 'if_entity'; selector?: EntitySelector; varName?: string; filters?: SelectorFilter }
118
+ | { kind: 'unless_entity'; selector?: EntitySelector; varName?: string; filters?: SelectorFilter }
119
+ | { kind: 'if_block'; pos: [string, string, string]; block: string }
120
+ | { kind: 'unless_block'; pos: [string, string, string]; block: string }
121
+ | { kind: 'if_score'; target: string; targetObj: string; op: string; source: string; sourceObj: string }
122
+ | { kind: 'unless_score'; target: string; targetObj: string; op: string; source: string; sourceObj: string }
123
+ | { kind: 'if_score_range'; target: string; targetObj: string; range: string }
124
+ | { kind: 'unless_score_range'; target: string; targetObj: string; range: string }
125
+ // Store
126
+ | { kind: 'store_result'; target: string; targetObj: string }
127
+ | { kind: 'store_success'; target: string; targetObj: string }
128
+
129
+ // ---------------------------------------------------------------------------
130
+ // HIR Statements
131
+ // ---------------------------------------------------------------------------
132
+
133
+ export type HIRStmt =
134
+ | { kind: 'let'; name: string; type?: TypeNode; init: HIRExpr; span?: Span }
135
+ | { kind: 'let_destruct'; names: string[]; type?: TypeNode; init: HIRExpr; span?: Span }
136
+ | { kind: 'expr'; expr: HIRExpr; span?: Span }
137
+ | { kind: 'return'; value?: HIRExpr; span?: Span }
138
+ | { kind: 'break'; span?: Span }
139
+ | { kind: 'continue'; span?: Span }
140
+ | { kind: 'if'; cond: HIRExpr; then: HIRBlock; else_?: HIRBlock; span?: Span }
141
+ | { kind: 'while'; cond: HIRExpr; body: HIRBlock; step?: HIRBlock; span?: Span }
142
+ // foreach preserved (entity iteration is MC-specific, not just sugar)
143
+ | { kind: 'foreach'; binding: string; iterable: HIRExpr; body: HIRBlock; executeContext?: string; span?: Span }
144
+ // match preserved (not trivially desugarable)
145
+ | { kind: 'match'; expr: HIRExpr; arms: { pattern: HIRExpr | null; body: HIRBlock }[]; span?: Span }
146
+ // Unified execute block (absorbs as_block, at_block, as_at, execute)
147
+ | { kind: 'execute'; subcommands: HIRExecuteSubcommand[]; body: HIRBlock; span?: Span }
148
+ | { kind: 'raw'; cmd: string; span?: Span }
149
+ | { kind: 'if_let_some'; binding: string; init: HIRExpr; then: HIRBlock; else_?: HIRBlock; span?: Span }
150
+
151
+ export type HIRBlock = HIRStmt[]
152
+
153
+ // ---------------------------------------------------------------------------
154
+ // HIR Function & Module
155
+ // ---------------------------------------------------------------------------
156
+
157
+ export interface HIRParam {
158
+ name: string
159
+ type: TypeNode
160
+ default?: HIRExpr
161
+ }
162
+
163
+ export interface HIRFunction {
164
+ name: string
165
+ /** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
166
+ typeParams?: string[]
167
+ params: HIRParam[]
168
+ returnType: TypeNode
169
+ decorators: Decorator[]
170
+ body: HIRBlock
171
+ isLibraryFn?: boolean
172
+ isExported?: boolean
173
+ span?: Span
174
+ }
175
+
176
+ export interface HIRStructField {
177
+ name: string
178
+ type: TypeNode
179
+ }
180
+
181
+ export interface HIRStruct {
182
+ name: string
183
+ fields: HIRStructField[]
184
+ span?: Span
185
+ }
186
+
187
+ export interface HIRImplBlock {
188
+ typeName: string
189
+ methods: HIRFunction[]
190
+ span?: Span
191
+ }
192
+
193
+ export interface HIREnumVariant {
194
+ name: string
195
+ value?: number
196
+ }
197
+
198
+ export interface HIREnum {
199
+ name: string
200
+ variants: HIREnumVariant[]
201
+ span?: Span
202
+ }
203
+
204
+ export interface HIRConst {
205
+ name: string
206
+ type: TypeNode
207
+ value: HIRExpr
208
+ span?: Span
209
+ }
210
+
211
+ export interface HIRGlobal {
212
+ name: string
213
+ type: TypeNode
214
+ init: HIRExpr
215
+ mutable: boolean
216
+ span?: Span
217
+ }
218
+
219
+ export interface HIRModule {
220
+ namespace: string
221
+ globals: HIRGlobal[]
222
+ functions: HIRFunction[]
223
+ structs: HIRStruct[]
224
+ implBlocks: HIRImplBlock[]
225
+ enums: HIREnum[]
226
+ consts: HIRConst[]
227
+ isLibrary?: boolean
228
+ }