redscript-mc 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (643) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +48 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +321 -0
  22. package/dist/src/__tests__/mc-syntax.test.js +1 -6
  23. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  24. package/dist/src/__tests__/mc-version.test.js +154 -0
  25. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  26. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  27. package/dist/src/__tests__/modules.test.d.ts +7 -0
  28. package/dist/src/__tests__/modules.test.js +333 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  30. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  31. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  32. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  33. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  34. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  35. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  36. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  37. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  38. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  39. package/dist/src/__tests__/option.test.d.ts +14 -0
  40. package/dist/src/__tests__/option.test.js +275 -0
  41. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  42. package/dist/src/__tests__/schedule.test.js +98 -0
  43. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  44. package/dist/src/__tests__/sourcemap.test.js +227 -0
  45. package/dist/src/__tests__/stdlib-include.test.js +86 -0
  46. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  47. package/dist/src/__tests__/tuple.test.js +202 -0
  48. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  49. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  50. package/dist/src/ast/types.d.ts +56 -2
  51. package/dist/src/cache/deps.d.ts +41 -0
  52. package/dist/src/cache/deps.js +158 -0
  53. package/dist/src/cache/incremental.d.ts +35 -0
  54. package/dist/src/cache/incremental.js +165 -0
  55. package/dist/src/cache/index.d.ts +37 -0
  56. package/dist/src/cache/index.js +152 -0
  57. package/dist/src/cli.js +83 -45
  58. package/dist/src/compile.d.ts +3 -2
  59. package/dist/src/compile.js +34 -11
  60. package/dist/src/diagnostics/index.d.ts +1 -1
  61. package/dist/src/diagnostics/index.js +8 -11
  62. package/dist/src/emit/compile.d.ts +31 -0
  63. package/dist/src/emit/compile.js +143 -0
  64. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  65. package/dist/{src2 → src}/emit/index.js +59 -8
  66. package/dist/src/emit/modules.d.ts +29 -0
  67. package/dist/src/emit/modules.js +492 -0
  68. package/dist/src/emit/sourcemap.d.ts +53 -0
  69. package/dist/src/emit/sourcemap.js +73 -0
  70. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  71. package/dist/{src2 → src}/hir/lower.js +22 -1
  72. package/dist/src/hir/monomorphize.d.ts +22 -0
  73. package/dist/src/hir/monomorphize.js +379 -0
  74. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  75. package/dist/src/index.d.ts +19 -2
  76. package/dist/src/index.js +36 -14
  77. package/dist/src/lexer/index.d.ts +1 -1
  78. package/dist/src/lexer/index.js +1 -0
  79. package/dist/src/lir/budget.d.ts +37 -0
  80. package/dist/src/lir/budget.js +280 -0
  81. package/dist/{src2 → src}/lir/lower.js +19 -0
  82. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  83. package/dist/src/lsp/main.d.ts +8 -0
  84. package/dist/src/lsp/main.js +11 -0
  85. package/dist/src/lsp/server.d.ts +11 -0
  86. package/dist/src/lsp/server.js +403 -0
  87. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  88. package/dist/{src2 → src}/mir/lower.js +244 -10
  89. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  90. package/dist/src/optimizer/coroutine.d.ts +34 -0
  91. package/dist/src/optimizer/coroutine.js +789 -0
  92. package/dist/src/optimizer/dce.d.ts +8 -34
  93. package/dist/src/optimizer/dce.js +146 -629
  94. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  95. package/dist/src/optimizer/interprocedural.js +186 -0
  96. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  97. package/dist/src/optimizer/lir/const_imm.js +139 -0
  98. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  99. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  100. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  101. package/dist/src/optimizer/lir/peephole.js +52 -0
  102. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  103. package/dist/src/optimizer/lir/pipeline.js +34 -0
  104. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  105. package/dist/src/optimizer/nbt-batch.js +51 -0
  106. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  107. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  108. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  109. package/dist/src/optimizer/selector-cache.js +100 -0
  110. package/dist/src/optimizer/unroll.d.ts +32 -0
  111. package/dist/src/optimizer/unroll.js +348 -0
  112. package/dist/src/parser/index.d.ts +8 -0
  113. package/dist/src/parser/index.js +204 -14
  114. package/dist/src/repl.d.ts +1 -1
  115. package/dist/src/typechecker/index.d.ts +4 -0
  116. package/dist/src/typechecker/index.js +198 -13
  117. package/dist/src/types/mc-version.d.ts +24 -0
  118. package/dist/src/types/mc-version.js +49 -0
  119. package/docs/ROADMAP.md +395 -0
  120. package/docs/compiler-pipeline-redesign.md +27 -10
  121. package/editors/vscode/out/extension.js +25176 -8000
  122. package/editors/vscode/package-lock.json +90 -6
  123. package/editors/vscode/package.json +3 -2
  124. package/editors/vscode/src/extension.ts +97 -67
  125. package/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
  126. package/examples/coroutine-demo.mcrs +50 -0
  127. package/examples/enum-demo.mcrs +95 -0
  128. package/examples/scheduler-demo.mcrs +59 -0
  129. package/examples/showcase.mcrs +3 -3
  130. package/jest.config.js +1 -1
  131. package/package.json +9 -3
  132. package/src/__tests__/budget.test.ts +297 -0
  133. package/src/__tests__/diagnostics.test.ts +2 -3
  134. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  135. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  136. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  137. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  138. package/src/__tests__/enum.test.ts +425 -0
  139. package/src/__tests__/generics.test.ts +390 -0
  140. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  141. package/src/__tests__/incremental.test.ts +337 -0
  142. package/src/__tests__/lsp.test.ts +359 -0
  143. package/src/__tests__/mc-syntax.test.ts +1 -7
  144. package/src/__tests__/mc-version.test.ts +178 -0
  145. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  146. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  147. package/src/__tests__/modules.test.ts +365 -0
  148. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  149. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  150. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  151. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  152. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  153. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  154. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  155. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  156. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  157. package/src/__tests__/option.test.ts +299 -0
  158. package/src/__tests__/schedule.test.ts +105 -0
  159. package/src/__tests__/sourcemap.test.ts +254 -0
  160. package/src/__tests__/stdlib-include.test.ts +61 -0
  161. package/src/__tests__/tuple.test.ts +220 -0
  162. package/src/__tests__/typechecker-strict.test.ts +216 -0
  163. package/src/ast/types.ts +33 -2
  164. package/src/cache/deps.ts +132 -0
  165. package/src/cache/incremental.ts +173 -0
  166. package/src/cache/index.ts +135 -0
  167. package/src/cli.ts +96 -45
  168. package/src/compile.ts +46 -17
  169. package/src/diagnostics/index.ts +8 -11
  170. package/src/emit/compile.ts +179 -0
  171. package/{src2 → src}/emit/index.ts +72 -8
  172. package/src/emit/modules.ts +581 -0
  173. package/src/emit/sourcemap.ts +101 -0
  174. package/{src2 → src}/hir/lower.ts +29 -2
  175. package/src/hir/monomorphize.ts +416 -0
  176. package/{src2 → src}/hir/types.ts +15 -3
  177. package/src/index.ts +29 -10
  178. package/src/lexer/index.ts +2 -1
  179. package/src/lir/budget.ts +321 -0
  180. package/{src2 → src}/lir/lower.ts +32 -1
  181. package/{src2 → src}/lir/types.ts +7 -3
  182. package/src/lsp/main.ts +9 -0
  183. package/src/lsp/server.ts +469 -0
  184. package/{src2 → src}/mir/lower.ts +251 -8
  185. package/{src2 → src}/mir/types.ts +12 -1
  186. package/src/optimizer/coroutine.ts +996 -0
  187. package/{src2 → src}/optimizer/dce.ts +2 -1
  188. package/src/optimizer/interprocedural.ts +177 -0
  189. package/src/optimizer/lir/const_imm.ts +143 -0
  190. package/src/optimizer/lir/dead_slot.ts +123 -0
  191. package/src/optimizer/lir/peephole.ts +57 -0
  192. package/src/optimizer/lir/pipeline.ts +37 -0
  193. package/src/optimizer/nbt-batch.ts +50 -0
  194. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  195. package/src/optimizer/selector-cache.ts +103 -0
  196. package/src/optimizer/unroll.ts +386 -0
  197. package/src/parser/index.ts +212 -15
  198. package/src/repl.ts +1 -1
  199. package/src/stdlib/math.mcrs +4 -4
  200. package/src/templates/quest.mcrs +4 -4
  201. package/src/typechecker/index.ts +215 -15
  202. package/src/types/mc-version.ts +46 -0
  203. package/tsconfig.json +1 -1
  204. package/.claude/commands/build-test.md +0 -10
  205. package/.claude/commands/deploy-demo.md +0 -12
  206. package/.claude/commands/stage-status.md +0 -13
  207. package/.claude/settings.json +0 -12
  208. package/CLAUDE.md +0 -231
  209. package/dist/__tests__/cli.test.js +0 -278
  210. package/dist/__tests__/codegen.test.js +0 -152
  211. package/dist/__tests__/compile-all.test.d.ts +0 -10
  212. package/dist/__tests__/compile-all.test.js +0 -108
  213. package/dist/__tests__/dce.test.js +0 -138
  214. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  215. package/dist/__tests__/diagnostics.test.js +0 -149
  216. package/dist/__tests__/e2e.test.d.ts +0 -6
  217. package/dist/__tests__/e2e.test.js +0 -1847
  218. package/dist/__tests__/entity-types.test.js +0 -203
  219. package/dist/__tests__/formatter.test.js +0 -40
  220. package/dist/__tests__/lexer.test.js +0 -343
  221. package/dist/__tests__/lowering.test.js +0 -1015
  222. package/dist/__tests__/macro.test.d.ts +0 -8
  223. package/dist/__tests__/macro.test.js +0 -305
  224. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  225. package/dist/__tests__/mc-integration.test.js +0 -819
  226. package/dist/__tests__/mc-syntax.test.js +0 -124
  227. package/dist/__tests__/nbt.test.js +0 -82
  228. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  229. package/dist/__tests__/optimizer.test.js +0 -149
  230. package/dist/__tests__/parser.test.d.ts +0 -1
  231. package/dist/__tests__/parser.test.js +0 -807
  232. package/dist/__tests__/repl.test.d.ts +0 -1
  233. package/dist/__tests__/repl.test.js +0 -27
  234. package/dist/__tests__/runtime.test.d.ts +0 -1
  235. package/dist/__tests__/runtime.test.js +0 -289
  236. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  237. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  238. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  239. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  240. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  241. package/dist/__tests__/stdlib-math.test.js +0 -352
  242. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  243. package/dist/__tests__/stdlib-vec.test.js +0 -264
  244. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  245. package/dist/__tests__/structure-optimizer.test.js +0 -33
  246. package/dist/__tests__/typechecker.test.d.ts +0 -1
  247. package/dist/__tests__/typechecker.test.js +0 -552
  248. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  249. package/dist/__tests__/var-allocator.test.js +0 -69
  250. package/dist/ast/types.d.ts +0 -514
  251. package/dist/ast/types.js +0 -9
  252. package/dist/builtins/metadata.d.ts +0 -36
  253. package/dist/builtins/metadata.js +0 -1014
  254. package/dist/cli.d.ts +0 -11
  255. package/dist/codegen/cmdblock/index.d.ts +0 -26
  256. package/dist/codegen/cmdblock/index.js +0 -45
  257. package/dist/codegen/mcfunction/index.d.ts +0 -40
  258. package/dist/codegen/mcfunction/index.js +0 -606
  259. package/dist/codegen/structure/index.d.ts +0 -24
  260. package/dist/codegen/structure/index.js +0 -279
  261. package/dist/codegen/var-allocator.d.ts +0 -45
  262. package/dist/codegen/var-allocator.js +0 -104
  263. package/dist/compile.d.ts +0 -68
  264. package/dist/data/arena/function/__load.mcfunction +0 -6
  265. package/dist/data/arena/function/__tick.mcfunction +0 -2
  266. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  267. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  268. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  269. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  270. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  271. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  272. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  273. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  274. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  275. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  276. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  277. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  278. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  279. package/dist/data/counter/function/__load.mcfunction +0 -5
  280. package/dist/data/counter/function/__tick.mcfunction +0 -2
  281. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  282. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  283. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  284. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  285. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  286. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  287. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  288. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  289. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  290. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  291. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  292. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  293. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  294. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  295. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  296. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  297. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  298. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  299. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  300. package/dist/data/gcd3/function/test.mcfunction +0 -7
  301. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  302. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  303. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  304. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  305. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  306. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  307. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  308. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  309. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  310. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  311. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  312. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  313. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  314. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  315. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  316. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  317. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  318. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  319. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  320. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  321. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  322. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  323. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  324. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  325. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  326. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  327. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  328. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  329. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  330. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  331. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  332. package/dist/data/mathtest/function/test.mcfunction +0 -5
  333. package/dist/data/minecraft/tags/function/load.json +0 -5
  334. package/dist/data/minecraft/tags/function/tick.json +0 -5
  335. package/dist/data/mypack/function/__load.mcfunction +0 -13
  336. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  337. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  338. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  339. package/dist/data/mypack/function/abs.mcfunction +0 -6
  340. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  341. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  342. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  343. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  346. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  347. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  348. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  352. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  353. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  354. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  357. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  358. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  359. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  360. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  361. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  365. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  366. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  367. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  368. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  369. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  370. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  371. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  372. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  373. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  374. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  375. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  376. package/dist/data/quiz/function/__load.mcfunction +0 -16
  377. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  378. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  379. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  380. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  381. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  382. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  383. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  384. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  386. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  387. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  388. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  389. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  390. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  391. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  392. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  393. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  394. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  395. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  396. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  397. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  398. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  399. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  400. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  402. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  403. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  404. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  405. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  406. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  407. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  408. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  409. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  410. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  411. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  412. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  413. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  414. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  415. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  416. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  417. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  418. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  419. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  420. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  421. package/dist/data/runtime/function/__load.mcfunction +0 -5
  422. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  423. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  424. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  425. package/dist/data/shop/function/__load.mcfunction +0 -7
  426. package/dist/data/shop/function/__tick.mcfunction +0 -3
  427. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  429. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  430. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  431. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  432. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  433. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  434. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  435. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  436. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  437. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  438. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  439. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  440. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  441. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  442. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  443. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  444. package/dist/data/turret/function/__load.mcfunction +0 -5
  445. package/dist/data/turret/function/__tick.mcfunction +0 -4
  446. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  447. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  448. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  449. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  450. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  451. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  452. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  453. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  454. package/dist/diagnostics/index.d.ts +0 -44
  455. package/dist/diagnostics/index.js +0 -140
  456. package/dist/events/types.d.ts +0 -35
  457. package/dist/events/types.js +0 -59
  458. package/dist/formatter/index.d.ts +0 -1
  459. package/dist/formatter/index.js +0 -26
  460. package/dist/gcd2.map.json +0 -15
  461. package/dist/gcd3.map.json +0 -17
  462. package/dist/gcd_test.map.json +0 -15
  463. package/dist/index.d.ts +0 -62
  464. package/dist/ir/builder.d.ts +0 -33
  465. package/dist/ir/builder.js +0 -99
  466. package/dist/ir/types.d.ts +0 -132
  467. package/dist/ir/types.js +0 -15
  468. package/dist/isqrttest.map.json +0 -15
  469. package/dist/lexer/index.d.ts +0 -37
  470. package/dist/lexer/index.js +0 -569
  471. package/dist/lowering/index.d.ts +0 -188
  472. package/dist/lowering/index.js +0 -3405
  473. package/dist/mathtest.map.json +0 -6
  474. package/dist/mc-test/client.d.ts +0 -128
  475. package/dist/mc-test/client.js +0 -174
  476. package/dist/mc-test/runner.d.ts +0 -28
  477. package/dist/mc-test/runner.js +0 -150
  478. package/dist/mc-test/setup.d.ts +0 -11
  479. package/dist/mc-test/setup.js +0 -98
  480. package/dist/mc-validator/index.d.ts +0 -17
  481. package/dist/mc-validator/index.js +0 -322
  482. package/dist/mypack.map.json +0 -27
  483. package/dist/nbt/index.d.ts +0 -86
  484. package/dist/nbt/index.js +0 -250
  485. package/dist/optimizer/commands.d.ts +0 -38
  486. package/dist/optimizer/commands.js +0 -451
  487. package/dist/optimizer/dce.d.ts +0 -34
  488. package/dist/optimizer/dce.js +0 -639
  489. package/dist/optimizer/passes.d.ts +0 -34
  490. package/dist/optimizer/passes.js +0 -243
  491. package/dist/optimizer/structure.d.ts +0 -9
  492. package/dist/optimizer/structure.js +0 -356
  493. package/dist/pack.mcmeta +0 -6
  494. package/dist/parser/index.d.ts +0 -93
  495. package/dist/parser/index.js +0 -1687
  496. package/dist/repl.d.ts +0 -16
  497. package/dist/repl.js +0 -165
  498. package/dist/reqtest.map.json +0 -4
  499. package/dist/reqtest2.map.json +0 -4
  500. package/dist/runtime/index.d.ts +0 -107
  501. package/dist/runtime/index.js +0 -1409
  502. package/dist/runtime.map.json +0 -7
  503. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  504. package/dist/src/__tests__/codegen.test.js +0 -152
  505. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  506. package/dist/src/__tests__/e2e.test.js +0 -1789
  507. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  508. package/dist/src/__tests__/entity-types.test.js +0 -203
  509. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  510. package/dist/src/__tests__/lowering.test.js +0 -1015
  511. package/dist/src/__tests__/macro.test.d.ts +0 -8
  512. package/dist/src/__tests__/macro.test.js +0 -306
  513. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  514. package/dist/src/__tests__/nbt.test.js +0 -82
  515. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  516. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  517. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  518. package/dist/src/__tests__/optimizer.test.js +0 -149
  519. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  520. package/dist/src/__tests__/runtime.test.js +0 -289
  521. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  522. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  523. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  524. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  525. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  526. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  527. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  528. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  529. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  530. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  531. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  532. package/dist/src/__tests__/var-allocator.test.js +0 -69
  533. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  534. package/dist/src/codegen/cmdblock/index.js +0 -45
  535. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  536. package/dist/src/codegen/mcfunction/index.js +0 -606
  537. package/dist/src/codegen/structure/index.d.ts +0 -24
  538. package/dist/src/codegen/structure/index.js +0 -279
  539. package/dist/src/codegen/var-allocator.d.ts +0 -45
  540. package/dist/src/codegen/var-allocator.js +0 -104
  541. package/dist/src/ir/builder.d.ts +0 -33
  542. package/dist/src/ir/builder.js +0 -99
  543. package/dist/src/ir/types.d.ts +0 -132
  544. package/dist/src/ir/types.js +0 -15
  545. package/dist/src/lowering/index.d.ts +0 -188
  546. package/dist/src/lowering/index.js +0 -3405
  547. package/dist/src/optimizer/commands.d.ts +0 -38
  548. package/dist/src/optimizer/commands.js +0 -451
  549. package/dist/src/optimizer/passes.d.ts +0 -34
  550. package/dist/src/optimizer/passes.js +0 -243
  551. package/dist/src/optimizer/structure.d.ts +0 -9
  552. package/dist/src/optimizer/structure.js +0 -356
  553. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  554. package/dist/src2/emit/compile.d.ts +0 -19
  555. package/dist/src2/emit/compile.js +0 -80
  556. package/dist/src2/optimizer/dce.d.ts +0 -8
  557. package/dist/src2/optimizer/dce.js +0 -155
  558. package/dist/swap_test.map.json +0 -14
  559. package/dist/tsconfig.tsbuildinfo +0 -1
  560. package/dist/typechecker/index.d.ts +0 -61
  561. package/dist/typechecker/index.js +0 -1034
  562. package/dist/types/entity-hierarchy.d.ts +0 -29
  563. package/dist/types/entity-hierarchy.js +0 -107
  564. package/examples/spiral.mcrs +0 -43
  565. package/src/examples/arena.mcrs +0 -44
  566. package/src/examples/counter.mcrs +0 -12
  567. package/src/examples/new_features_demo.mcrs +0 -193
  568. package/src/examples/rpg.mcrs +0 -13
  569. package/src/examples/stdlib_demo.mcrs +0 -181
  570. package/src2/emit/compile.ts +0 -99
  571. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  572. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  576. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  578. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  579. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  580. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  581. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  582. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  583. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  584. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  585. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  586. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  587. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  588. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  589. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  590. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  592. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  593. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  594. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  595. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  596. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  597. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  598. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  599. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  600. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  601. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  602. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  603. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  604. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  605. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  606. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  607. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
  608. /package/dist/{src2 → src}/hir/types.js +0 -0
  609. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  610. /package/dist/{src2 → src}/lir/types.js +0 -0
  611. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  612. /package/dist/{src2 → src}/lir/verify.js +0 -0
  613. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  614. /package/dist/{src2 → src}/mir/macro.js +0 -0
  615. /package/dist/{src2 → src}/mir/types.js +0 -0
  616. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  617. /package/dist/{src2 → src}/mir/verify.js +0 -0
  618. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  619. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  620. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  621. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  622. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  623. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  624. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  625. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  626. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  627. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  628. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  629. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  630. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  631. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  632. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  633. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  634. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  635. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  636. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  637. /package/{src2 → src}/lir/verify.ts +0 -0
  638. /package/{src2 → src}/mir/macro.ts +0 -0
  639. /package/{src2 → src}/mir/verify.ts +0 -0
  640. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  641. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  642. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  643. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -0,0 +1,22 @@
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
+ import type { HIRModule } from './types';
22
+ export declare function monomorphize(module: HIRModule): HIRModule;
@@ -0,0 +1,379 @@
1
+ "use strict";
2
+ /**
3
+ * HIR Monomorphization — Phase 2c: Generic functions
4
+ *
5
+ * For each generic function `fn foo<T>(...)`, each unique instantiation
6
+ * `foo<int>`, `foo<float>` etc. produces a concrete copy with a mangled name.
7
+ *
8
+ * Algorithm:
9
+ * 1. Walk the HIR module collecting all call sites to generic functions.
10
+ * 2. For each unique (fnName, typeArgs) pair, clone the generic HIRFunction,
11
+ * substitute all occurrences of the type params, and add to module.functions.
12
+ * 3. Rewrite every call site: `foo<int>(x, y)` → `foo_int(x, y)`.
13
+ * 4. Remove original generic function definitions from the output.
14
+ *
15
+ * Type arg → suffix mapping:
16
+ * int → "int"
17
+ * float → "float"
18
+ * bool → "bool"
19
+ * string → "string"
20
+ * (others) → use struct/enum name
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.monomorphize = monomorphize;
24
+ // ---------------------------------------------------------------------------
25
+ // Public API
26
+ // ---------------------------------------------------------------------------
27
+ function monomorphize(module) {
28
+ const mono = new Monomorphizer(module);
29
+ return mono.run();
30
+ }
31
+ // ---------------------------------------------------------------------------
32
+ // Helpers
33
+ // ---------------------------------------------------------------------------
34
+ /** Return a stable string suffix for a type argument, used in mangled names. */
35
+ function typeSuffix(t) {
36
+ switch (t.kind) {
37
+ case 'named': return t.name;
38
+ case 'struct': return t.name;
39
+ case 'enum': return t.name;
40
+ case 'array': return `arr_${typeSuffix(t.elem)}`;
41
+ case 'tuple': return `tup_${t.elements.map(typeSuffix).join('_')}`;
42
+ case 'option': return `opt_${typeSuffix(t.inner)}`;
43
+ default: return 'unknown';
44
+ }
45
+ }
46
+ /** Produce the mangled name for a specialization, e.g. "max_int". */
47
+ function mangledName(fnName, typeArgs) {
48
+ return `${fnName}_${typeArgs.map(typeSuffix).join('_')}`;
49
+ }
50
+ /** Build a substitution map: type param name → concrete type. */
51
+ function buildSubst(typeParams, typeArgs) {
52
+ const subst = new Map();
53
+ for (let i = 0; i < typeParams.length; i++) {
54
+ subst.set(typeParams[i], typeArgs[i]);
55
+ }
56
+ return subst;
57
+ }
58
+ /** Apply substitution to a TypeNode (replacing struct-kind nodes whose name
59
+ * matches a type param with the concrete type). */
60
+ function substType(t, subst) {
61
+ switch (t.kind) {
62
+ case 'struct': {
63
+ const replacement = subst.get(t.name);
64
+ if (replacement)
65
+ return replacement;
66
+ return t;
67
+ }
68
+ case 'array':
69
+ return { kind: 'array', elem: substType(t.elem, subst) };
70
+ case 'tuple':
71
+ return { kind: 'tuple', elements: t.elements.map(e => substType(e, subst)) };
72
+ case 'option':
73
+ return { kind: 'option', inner: substType(t.inner, subst) };
74
+ case 'function_type':
75
+ return { kind: 'function_type', params: t.params.map(p => substType(p, subst)), return: substType(t.return, subst) };
76
+ default:
77
+ return t;
78
+ }
79
+ }
80
+ class Monomorphizer {
81
+ constructor(module) {
82
+ /** Map from function name → HIRFunction for generic functions */
83
+ this.genericFns = new Map();
84
+ /** Cache: cacheKey → specialized HIRFunction (to avoid duplicate generation) */
85
+ this.specialized = new Map();
86
+ /** Worklist for BFS specialization (to handle generic calling generic) */
87
+ this.worklist = [];
88
+ this.module = module;
89
+ }
90
+ run() {
91
+ // Collect all generic function definitions
92
+ for (const fn of this.module.functions) {
93
+ if (fn.typeParams && fn.typeParams.length > 0) {
94
+ this.genericFns.set(fn.name, fn);
95
+ }
96
+ }
97
+ if (this.genericFns.size === 0) {
98
+ // Nothing to do — fast path
99
+ return this.module;
100
+ }
101
+ // Rewrite all non-generic functions, collecting specializations needed
102
+ const newFunctions = [];
103
+ for (const fn of this.module.functions) {
104
+ if (fn.typeParams && fn.typeParams.length > 0) {
105
+ // Skip generic function templates — they'll be replaced by specializations
106
+ continue;
107
+ }
108
+ const rewritten = this.rewriteFn(fn);
109
+ newFunctions.push(rewritten);
110
+ }
111
+ // Process worklist BFS: generate specializations (which may add more to worklist)
112
+ while (this.worklist.length > 0) {
113
+ const { fn: templateFn, typeArgs } = this.worklist.shift();
114
+ const key = this.cacheKey(templateFn.name, typeArgs);
115
+ if (this.specialized.has(key))
116
+ continue;
117
+ // Mark as in-progress to prevent cycles
118
+ this.specialized.set(key, null);
119
+ const specializedFn = this.specialize(templateFn, typeArgs);
120
+ this.specialized.set(key, specializedFn);
121
+ }
122
+ // Add all specializations
123
+ for (const fn of this.specialized.values()) {
124
+ if (fn)
125
+ newFunctions.push(fn);
126
+ }
127
+ return { ...this.module, functions: newFunctions };
128
+ }
129
+ cacheKey(fnName, typeArgs) {
130
+ return `${fnName}|${typeArgs.map(typeSuffix).join(',')}`;
131
+ }
132
+ /** Specialize a generic function with concrete type args. */
133
+ specialize(templateFn, typeArgs) {
134
+ const subst = buildSubst(templateFn.typeParams, typeArgs);
135
+ const name = mangledName(templateFn.name, typeArgs);
136
+ // Build initial variable scope from parameters
137
+ const varTypes = new Map();
138
+ const params = templateFn.params.map(p => {
139
+ const concreteType = substType(p.type, subst);
140
+ varTypes.set(p.name, concreteType);
141
+ return {
142
+ name: p.name,
143
+ type: concreteType,
144
+ default: p.default ? this.rewriteExpr(p.default, { subst, varTypes }) : undefined,
145
+ };
146
+ });
147
+ const returnType = substType(templateFn.returnType, subst);
148
+ const body = this.rewriteBlock(templateFn.body, { subst, varTypes });
149
+ return {
150
+ name,
151
+ params,
152
+ returnType,
153
+ decorators: templateFn.decorators,
154
+ body,
155
+ isLibraryFn: templateFn.isLibraryFn,
156
+ isExported: templateFn.isExported,
157
+ span: templateFn.span,
158
+ // No typeParams on the specialized copy
159
+ };
160
+ }
161
+ /** Rewrite a non-generic function (substitute calls to generic functions). */
162
+ rewriteFn(fn) {
163
+ const varTypes = new Map();
164
+ // Add params to scope with their concrete types
165
+ for (const p of fn.params) {
166
+ varTypes.set(p.name, p.type);
167
+ }
168
+ return {
169
+ ...fn,
170
+ params: fn.params.map(p => ({
171
+ ...p,
172
+ default: p.default ? this.rewriteExpr(p.default, { subst: new Map(), varTypes }) : undefined,
173
+ })),
174
+ body: this.rewriteBlock(fn.body, { subst: new Map(), varTypes }),
175
+ };
176
+ }
177
+ rewriteBlock(block, ctx) {
178
+ // Clone varTypes so block-local bindings don't leak
179
+ const localCtx = { subst: ctx.subst, varTypes: new Map(ctx.varTypes) };
180
+ const result = [];
181
+ for (const stmt of block) {
182
+ result.push(this.rewriteStmt(stmt, localCtx));
183
+ }
184
+ return result;
185
+ }
186
+ rewriteStmt(stmt, ctx) {
187
+ const { subst } = ctx;
188
+ switch (stmt.kind) {
189
+ case 'let': {
190
+ const init = this.rewriteExpr(stmt.init, ctx);
191
+ const type = stmt.type ? substType(stmt.type, subst) : undefined;
192
+ // Track variable type in scope
193
+ if (type)
194
+ ctx.varTypes.set(stmt.name, type);
195
+ else {
196
+ const inferred = this.inferExprType(init, ctx);
197
+ if (inferred)
198
+ ctx.varTypes.set(stmt.name, inferred);
199
+ }
200
+ return { ...stmt, type, init };
201
+ }
202
+ case 'let_destruct':
203
+ return { ...stmt, type: stmt.type ? substType(stmt.type, subst) : undefined, init: this.rewriteExpr(stmt.init, ctx) };
204
+ case 'expr':
205
+ return { ...stmt, expr: this.rewriteExpr(stmt.expr, ctx) };
206
+ case 'return':
207
+ return { ...stmt, value: stmt.value ? this.rewriteExpr(stmt.value, ctx) : undefined };
208
+ case 'if':
209
+ return {
210
+ ...stmt,
211
+ cond: this.rewriteExpr(stmt.cond, ctx),
212
+ then: this.rewriteBlock(stmt.then, ctx),
213
+ else_: stmt.else_ ? this.rewriteBlock(stmt.else_, ctx) : undefined,
214
+ };
215
+ case 'while':
216
+ return {
217
+ ...stmt,
218
+ cond: this.rewriteExpr(stmt.cond, ctx),
219
+ body: this.rewriteBlock(stmt.body, ctx),
220
+ step: stmt.step ? this.rewriteBlock(stmt.step, ctx) : undefined,
221
+ };
222
+ case 'foreach':
223
+ return { ...stmt, iterable: this.rewriteExpr(stmt.iterable, ctx), body: this.rewriteBlock(stmt.body, ctx) };
224
+ case 'match':
225
+ return {
226
+ ...stmt,
227
+ expr: this.rewriteExpr(stmt.expr, ctx),
228
+ arms: stmt.arms.map(arm => ({
229
+ pattern: arm.pattern ? this.rewriteExpr(arm.pattern, ctx) : null,
230
+ body: this.rewriteBlock(arm.body, ctx),
231
+ })),
232
+ };
233
+ case 'execute':
234
+ return { ...stmt, body: this.rewriteBlock(stmt.body, ctx) };
235
+ case 'if_let_some':
236
+ return {
237
+ ...stmt,
238
+ init: this.rewriteExpr(stmt.init, ctx),
239
+ then: this.rewriteBlock(stmt.then, ctx),
240
+ else_: stmt.else_ ? this.rewriteBlock(stmt.else_, ctx) : undefined,
241
+ };
242
+ case 'break':
243
+ case 'continue':
244
+ case 'raw':
245
+ return stmt;
246
+ }
247
+ }
248
+ rewriteExpr(expr, ctx) {
249
+ const { subst } = ctx;
250
+ switch (expr.kind) {
251
+ case 'call': {
252
+ const args = expr.args.map(a => this.rewriteExpr(a, ctx));
253
+ // Determine concrete type args for this call
254
+ const resolvedTypeArgs = expr.typeArgs?.map(t => substType(t, subst));
255
+ const genericFn = this.genericFns.get(expr.fn);
256
+ if (genericFn && genericFn.typeParams && genericFn.typeParams.length > 0) {
257
+ // This call targets a generic function — we need to monomorphize
258
+ const concreteTypeArgs = resolvedTypeArgs ?? this.inferTypeArgs(genericFn, args, ctx);
259
+ if (concreteTypeArgs) {
260
+ const key = this.cacheKey(expr.fn, concreteTypeArgs);
261
+ if (!this.specialized.has(key)) {
262
+ // Enqueue for specialization
263
+ this.worklist.push({ fn: genericFn, typeArgs: concreteTypeArgs });
264
+ }
265
+ const name = mangledName(expr.fn, concreteTypeArgs);
266
+ return { ...expr, fn: name, args, typeArgs: undefined };
267
+ }
268
+ }
269
+ return { ...expr, args, typeArgs: resolvedTypeArgs };
270
+ }
271
+ case 'invoke':
272
+ return { ...expr, callee: this.rewriteExpr(expr.callee, ctx), args: expr.args.map(a => this.rewriteExpr(a, ctx)) };
273
+ case 'binary':
274
+ return { ...expr, left: this.rewriteExpr(expr.left, ctx), right: this.rewriteExpr(expr.right, ctx) };
275
+ case 'unary':
276
+ return { ...expr, operand: this.rewriteExpr(expr.operand, ctx) };
277
+ case 'assign':
278
+ return { ...expr, value: this.rewriteExpr(expr.value, ctx) };
279
+ case 'member_assign':
280
+ return { ...expr, obj: this.rewriteExpr(expr.obj, ctx), value: this.rewriteExpr(expr.value, ctx) };
281
+ case 'member':
282
+ return { ...expr, obj: this.rewriteExpr(expr.obj, ctx) };
283
+ case 'index':
284
+ return { ...expr, obj: this.rewriteExpr(expr.obj, ctx), index: this.rewriteExpr(expr.index, ctx) };
285
+ case 'array_lit':
286
+ return { ...expr, elements: expr.elements.map(e => this.rewriteExpr(e, ctx)) };
287
+ case 'struct_lit':
288
+ return { ...expr, fields: expr.fields.map(f => ({ name: f.name, value: this.rewriteExpr(f.value, ctx) })) };
289
+ case 'tuple_lit':
290
+ return { ...expr, elements: expr.elements.map(e => this.rewriteExpr(e, ctx)) };
291
+ case 'static_call':
292
+ return { ...expr, args: expr.args.map(a => this.rewriteExpr(a, ctx)) };
293
+ case 'lambda':
294
+ return { ...expr, body: Array.isArray(expr.body) ? this.rewriteBlock(expr.body, ctx) : this.rewriteExpr(expr.body, ctx) };
295
+ case 'is_check':
296
+ return { ...expr, expr: this.rewriteExpr(expr.expr, ctx) };
297
+ case 'str_interp':
298
+ return { ...expr, parts: expr.parts.map(p => typeof p === 'string' ? p : this.rewriteExpr(p, ctx)) };
299
+ case 'f_string':
300
+ // FStringPart uses AST Expr (not HIRExpr) — pass through without rewriting
301
+ return expr;
302
+ case 'some_lit':
303
+ return { ...expr, value: this.rewriteExpr(expr.value, ctx) };
304
+ case 'none_lit':
305
+ return expr;
306
+ // Literals / terminals — pass through unchanged
307
+ default:
308
+ return expr;
309
+ }
310
+ }
311
+ /**
312
+ * Infer type args from the actual argument expressions.
313
+ * Works by looking at the types of call arguments and matching them to
314
+ * the type parameters in the function signature.
315
+ *
316
+ * Returns null if inference fails.
317
+ */
318
+ inferTypeArgs(fn, args, ctx) {
319
+ const inferred = new Map();
320
+ const typeParams = fn.typeParams;
321
+ for (let i = 0; i < fn.params.length && i < args.length; i++) {
322
+ const paramType = fn.params[i].type;
323
+ const argType = this.inferExprType(args[i], ctx);
324
+ if (argType) {
325
+ this.matchTypes(paramType, argType, typeParams, inferred);
326
+ }
327
+ }
328
+ // Check all type params were inferred
329
+ if (typeParams.every(tp => inferred.has(tp))) {
330
+ return typeParams.map(tp => inferred.get(tp));
331
+ }
332
+ return null;
333
+ }
334
+ /** Walk a type pattern and a concrete type, binding type param names. */
335
+ matchTypes(pattern, concrete, typeParams, inferred) {
336
+ if (pattern.kind === 'struct' && typeParams.includes(pattern.name)) {
337
+ // This position is a type param — bind it
338
+ if (!inferred.has(pattern.name)) {
339
+ inferred.set(pattern.name, concrete);
340
+ }
341
+ return;
342
+ }
343
+ if (pattern.kind === 'array' && concrete.kind === 'array') {
344
+ this.matchTypes(pattern.elem, concrete.elem, typeParams, inferred);
345
+ return;
346
+ }
347
+ if (pattern.kind === 'tuple' && concrete.kind === 'tuple') {
348
+ for (let i = 0; i < pattern.elements.length && i < concrete.elements.length; i++) {
349
+ this.matchTypes(pattern.elements[i], concrete.elements[i], typeParams, inferred);
350
+ }
351
+ }
352
+ }
353
+ /** Infer the type of a HIR expression (best-effort, for type inference). */
354
+ inferExprType(expr, ctx) {
355
+ switch (expr.kind) {
356
+ case 'int_lit': return { kind: 'named', name: 'int' };
357
+ case 'float_lit': return { kind: 'named', name: 'float' };
358
+ case 'bool_lit': return { kind: 'named', name: 'bool' };
359
+ case 'str_lit': return { kind: 'named', name: 'string' };
360
+ case 'byte_lit': return { kind: 'named', name: 'byte' };
361
+ case 'short_lit': return { kind: 'named', name: 'short' };
362
+ case 'long_lit': return { kind: 'named', name: 'long' };
363
+ case 'double_lit': return { kind: 'named', name: 'double' };
364
+ case 'ident': return ctx.varTypes.get(expr.name) ?? null;
365
+ case 'unary':
366
+ // unary minus/not preserves the operand's type
367
+ return this.inferExprType(expr.operand, ctx);
368
+ case 'binary': {
369
+ // For arithmetic, use the left operand's type
370
+ const lt = this.inferExprType(expr.left, ctx);
371
+ if (lt)
372
+ return lt;
373
+ return this.inferExprType(expr.right, ctx);
374
+ }
375
+ default: return null;
376
+ }
377
+ }
378
+ }
379
+ //# sourceMappingURL=monomorphize.js.map
@@ -11,8 +11,8 @@
11
11
  *
12
12
  * All types and names are preserved from the AST.
13
13
  */
14
- import type { Span, TypeNode, EntitySelector, CoordComponent, Decorator, RangeExpr, FStringPart, SelectorFilter, EntityTypeName, LambdaParam } from '../../src/ast/types';
15
- import type { BinOp, CmpOp } from '../../src/ast/types';
14
+ import type { Span, TypeNode, EntitySelector, CoordComponent, Decorator, RangeExpr, FStringPart, SelectorFilter, EntityTypeName, LambdaParam } from '../ast/types';
15
+ import type { BinOp, CmpOp } from '../ast/types';
16
16
  export type { Span, TypeNode, EntitySelector, CoordComponent, Decorator, RangeExpr, FStringPart, SelectorFilter, EntityTypeName, LambdaParam, BinOp, CmpOp, };
17
17
  export type HIRExpr = {
18
18
  kind: 'int_lit';
@@ -138,6 +138,7 @@ export type HIRExpr = {
138
138
  kind: 'call';
139
139
  fn: string;
140
140
  args: HIRExpr[];
141
+ typeArgs?: TypeNode[];
141
142
  span?: Span;
142
143
  } | {
143
144
  kind: 'invoke';
@@ -150,12 +151,28 @@ export type HIRExpr = {
150
151
  method: string;
151
152
  args: HIRExpr[];
152
153
  span?: Span;
154
+ } | {
155
+ kind: 'path_expr';
156
+ enumName: string;
157
+ variant: string;
158
+ span?: Span;
153
159
  } | {
154
160
  kind: 'lambda';
155
161
  params: LambdaParam[];
156
162
  returnType?: TypeNode;
157
163
  body: HIRExpr | HIRBlock;
158
164
  span?: Span;
165
+ } | {
166
+ kind: 'tuple_lit';
167
+ elements: HIRExpr[];
168
+ span?: Span;
169
+ } | {
170
+ kind: 'some_lit';
171
+ value: HIRExpr;
172
+ span?: Span;
173
+ } | {
174
+ kind: 'none_lit';
175
+ span?: Span;
159
176
  };
160
177
  export type HIRExecuteSubcommand = {
161
178
  kind: 'as';
@@ -259,6 +276,12 @@ export type HIRStmt = {
259
276
  type?: TypeNode;
260
277
  init: HIRExpr;
261
278
  span?: Span;
279
+ } | {
280
+ kind: 'let_destruct';
281
+ names: string[];
282
+ type?: TypeNode;
283
+ init: HIRExpr;
284
+ span?: Span;
262
285
  } | {
263
286
  kind: 'expr';
264
287
  expr: HIRExpr;
@@ -309,6 +332,13 @@ export type HIRStmt = {
309
332
  kind: 'raw';
310
333
  cmd: string;
311
334
  span?: Span;
335
+ } | {
336
+ kind: 'if_let_some';
337
+ binding: string;
338
+ init: HIRExpr;
339
+ then: HIRBlock;
340
+ else_?: HIRBlock;
341
+ span?: Span;
312
342
  };
313
343
  export type HIRBlock = HIRStmt[];
314
344
  export interface HIRParam {
@@ -318,11 +348,14 @@ export interface HIRParam {
318
348
  }
319
349
  export interface HIRFunction {
320
350
  name: string;
351
+ /** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
352
+ typeParams?: string[];
321
353
  params: HIRParam[];
322
354
  returnType: TypeNode;
323
355
  decorators: Decorator[];
324
356
  body: HIRBlock;
325
357
  isLibraryFn?: boolean;
358
+ isExported?: boolean;
326
359
  span?: Span;
327
360
  }
328
361
  export interface HIRStructField {
@@ -4,19 +4,36 @@
4
4
  * Main entry point for programmatic usage.
5
5
  */
6
6
  export declare const version = "2.0.0";
7
- export { compile, CompileOptions, CompileResult } from '../src2/emit/compile';
8
- export type { DatapackFile } from '../src2/emit/index';
7
+ export { compile, CompileOptions, CompileResult } from './emit/compile';
8
+ export { compileModules } from './emit/modules';
9
+ export type { ModuleInput, CompileModulesOptions, CompileModulesResult } from './emit/modules';
10
+ export { McVersion, parseMcVersion, compareMcVersion, DEFAULT_MC_VERSION } from './types/mc-version';
11
+ export type { DatapackFile } from './emit/index';
9
12
  export { Lexer } from './lexer';
10
13
  export { Parser } from './parser';
11
14
  export { preprocessSource, preprocessSourceWithMetadata } from './compile';
12
15
  export { MCCommandValidator } from './mc-validator';
13
16
  export type { Program, FnDecl, Expr, Stmt, Span } from './ast/types';
14
17
  export type { DiagnosticError } from './diagnostics';
18
+ export { FileCache, hashFile } from './cache/index';
19
+ export { DependencyGraph, parseImports } from './cache/deps';
20
+ export { compileIncremental, resetCompileCache } from './cache/incremental';
21
+ export type { IncrementalOptions, IncrementalResult } from './cache/incremental';
22
+ export interface CheckResult {
23
+ error: Error | null;
24
+ warnings: string[];
25
+ }
15
26
  /**
16
27
  * Check RedScript source code for errors without generating output.
28
+ * Runs the full compile pipeline (lex → parse → HIR → MIR → LIR → emit)
29
+ * to catch type-level and lowering errors, not just parse errors.
17
30
  *
18
31
  * @param source - The RedScript source code
19
32
  * @param namespace - Optional namespace
20
33
  * @returns null if no errors, or an error object
21
34
  */
22
35
  export declare function check(source: string, namespace?: string, filePath?: string): Error | null;
36
+ /**
37
+ * Like check(), but also returns warnings (e.g., tick budget analysis).
38
+ */
39
+ export declare function checkWithWarnings(source: string, namespace?: string, filePath?: string): CheckResult;
package/dist/src/index.js CHANGED
@@ -5,41 +5,63 @@
5
5
  * Main entry point for programmatic usage.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.MCCommandValidator = exports.preprocessSourceWithMetadata = exports.preprocessSource = exports.Parser = exports.Lexer = exports.compile = exports.version = void 0;
8
+ exports.resetCompileCache = exports.compileIncremental = exports.parseImports = exports.DependencyGraph = exports.hashFile = exports.FileCache = exports.MCCommandValidator = exports.preprocessSourceWithMetadata = exports.preprocessSource = exports.Parser = exports.Lexer = exports.DEFAULT_MC_VERSION = exports.compareMcVersion = exports.parseMcVersion = exports.McVersion = exports.compileModules = exports.compile = exports.version = void 0;
9
9
  exports.check = check;
10
+ exports.checkWithWarnings = checkWithWarnings;
10
11
  exports.version = '2.0.0';
11
- const lexer_1 = require("./lexer");
12
- const parser_1 = require("./parser");
13
- const compile_1 = require("./compile");
12
+ const compile_1 = require("./emit/compile");
14
13
  // Re-export v2 compile API
15
- var compile_2 = require("../src2/emit/compile");
14
+ var compile_2 = require("./emit/compile");
16
15
  Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_2.compile; } });
16
+ var modules_1 = require("./emit/modules");
17
+ Object.defineProperty(exports, "compileModules", { enumerable: true, get: function () { return modules_1.compileModules; } });
18
+ var mc_version_1 = require("./types/mc-version");
19
+ Object.defineProperty(exports, "McVersion", { enumerable: true, get: function () { return mc_version_1.McVersion; } });
20
+ Object.defineProperty(exports, "parseMcVersion", { enumerable: true, get: function () { return mc_version_1.parseMcVersion; } });
21
+ Object.defineProperty(exports, "compareMcVersion", { enumerable: true, get: function () { return mc_version_1.compareMcVersion; } });
22
+ Object.defineProperty(exports, "DEFAULT_MC_VERSION", { enumerable: true, get: function () { return mc_version_1.DEFAULT_MC_VERSION; } });
17
23
  // Re-export utilities
18
- var lexer_2 = require("./lexer");
19
- Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return lexer_2.Lexer; } });
20
- var parser_2 = require("./parser");
21
- Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return parser_2.Parser; } });
24
+ var lexer_1 = require("./lexer");
25
+ Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return lexer_1.Lexer; } });
26
+ var parser_1 = require("./parser");
27
+ Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return parser_1.Parser; } });
22
28
  var compile_3 = require("./compile");
23
29
  Object.defineProperty(exports, "preprocessSource", { enumerable: true, get: function () { return compile_3.preprocessSource; } });
24
30
  Object.defineProperty(exports, "preprocessSourceWithMetadata", { enumerable: true, get: function () { return compile_3.preprocessSourceWithMetadata; } });
25
31
  var mc_validator_1 = require("./mc-validator");
26
32
  Object.defineProperty(exports, "MCCommandValidator", { enumerable: true, get: function () { return mc_validator_1.MCCommandValidator; } });
33
+ // Incremental compilation
34
+ var index_1 = require("./cache/index");
35
+ Object.defineProperty(exports, "FileCache", { enumerable: true, get: function () { return index_1.FileCache; } });
36
+ Object.defineProperty(exports, "hashFile", { enumerable: true, get: function () { return index_1.hashFile; } });
37
+ var deps_1 = require("./cache/deps");
38
+ Object.defineProperty(exports, "DependencyGraph", { enumerable: true, get: function () { return deps_1.DependencyGraph; } });
39
+ Object.defineProperty(exports, "parseImports", { enumerable: true, get: function () { return deps_1.parseImports; } });
40
+ var incremental_1 = require("./cache/incremental");
41
+ Object.defineProperty(exports, "compileIncremental", { enumerable: true, get: function () { return incremental_1.compileIncremental; } });
42
+ Object.defineProperty(exports, "resetCompileCache", { enumerable: true, get: function () { return incremental_1.resetCompileCache; } });
27
43
  /**
28
44
  * Check RedScript source code for errors without generating output.
45
+ * Runs the full compile pipeline (lex → parse → HIR → MIR → LIR → emit)
46
+ * to catch type-level and lowering errors, not just parse errors.
29
47
  *
30
48
  * @param source - The RedScript source code
31
49
  * @param namespace - Optional namespace
32
50
  * @returns null if no errors, or an error object
33
51
  */
34
52
  function check(source, namespace = 'redscript', filePath) {
53
+ return checkWithWarnings(source, namespace, filePath).error;
54
+ }
55
+ /**
56
+ * Like check(), but also returns warnings (e.g., tick budget analysis).
57
+ */
58
+ function checkWithWarnings(source, namespace = 'redscript', filePath) {
35
59
  try {
36
- const preprocessedSource = (0, compile_1.preprocessSource)(source, { filePath });
37
- const tokens = new lexer_1.Lexer(preprocessedSource, filePath).tokenize();
38
- new parser_1.Parser(tokens, preprocessedSource, filePath).parse(namespace);
39
- return null;
60
+ const result = (0, compile_1.compile)(source, { namespace, filePath });
61
+ return { error: null, warnings: result.warnings };
40
62
  }
41
63
  catch (err) {
42
- return err;
64
+ return { error: err, warnings: [] };
43
65
  }
44
66
  }
45
67
  //# sourceMappingURL=index.js.map
@@ -5,7 +5,7 @@
5
5
  * Handles special cases like entity selectors vs decorators,
6
6
  * range literals, and raw commands.
7
7
  */
8
- export type TokenKind = 'fn' | 'let' | 'const' | 'if' | 'else' | 'while' | 'for' | 'foreach' | 'match' | 'return' | 'break' | 'continue' | 'as' | 'at' | 'in' | 'is' | 'struct' | 'impl' | 'enum' | 'trigger' | 'namespace' | 'module' | 'execute' | 'run' | 'unless' | 'declare' | 'int' | 'bool' | 'float' | 'string' | 'void' | 'BlockPos' | 'true' | 'false' | 'selector' | 'decorator' | 'int_lit' | 'float_lit' | 'byte_lit' | 'short_lit' | 'long_lit' | 'double_lit' | 'string_lit' | 'f_string' | 'range_lit' | 'rel_coord' | 'local_coord' | '+' | '-' | '*' | '/' | '%' | '~' | '^' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '&&' | '||' | '!' | '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '{' | '}' | '(' | ')' | '[' | ']' | ',' | ';' | ':' | '::' | '->' | '=>' | '.' | 'ident' | 'mc_name' | 'raw_cmd' | 'eof';
8
+ export type TokenKind = 'fn' | 'let' | 'const' | 'if' | 'else' | 'while' | 'for' | 'foreach' | 'match' | 'return' | 'break' | 'continue' | 'as' | 'at' | 'in' | 'is' | 'struct' | 'impl' | 'enum' | 'trigger' | 'namespace' | 'module' | 'execute' | 'run' | 'unless' | 'declare' | 'export' | 'int' | 'bool' | 'float' | 'string' | 'void' | 'BlockPos' | 'true' | 'false' | 'selector' | 'decorator' | 'int_lit' | 'float_lit' | 'byte_lit' | 'short_lit' | 'long_lit' | 'double_lit' | 'string_lit' | 'f_string' | 'range_lit' | 'rel_coord' | 'local_coord' | '+' | '-' | '*' | '/' | '%' | '~' | '^' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '&&' | '||' | '!' | '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '{' | '}' | '(' | ')' | '[' | ']' | ',' | ';' | ':' | '::' | '->' | '=>' | '.' | 'ident' | 'mc_name' | 'raw_cmd' | 'eof';
9
9
  export interface Token {
10
10
  kind: TokenKind;
11
11
  value: string;
@@ -39,6 +39,7 @@ const KEYWORDS = {
39
39
  run: 'run',
40
40
  unless: 'unless',
41
41
  declare: 'declare',
42
+ export: 'export',
42
43
  int: 'int',
43
44
  bool: 'bool',
44
45
  float: 'float',
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Static Tick Budget Analysis — Phase 1a
3
+ *
4
+ * Estimates the number of MC commands a function will execute at runtime.
5
+ * Used to warn when loops may exceed Minecraft's maxCommandChainLength (65536).
6
+ *
7
+ * In LIR, loops are represented as mutually-recursive function calls
8
+ * (e.g., fn__header ↔ fn__body). This module detects call-graph cycles
9
+ * and multiplies the loop body cost by an estimated iteration count.
10
+ */
11
+ import type { LIRModule } from './types';
12
+ /** Warning threshold: suggest @coroutine */
13
+ export declare const BUDGET_WARN_THRESHOLD = 32768;
14
+ /** Error threshold: likely exceeds maxCommandChainLength */
15
+ export declare const BUDGET_ERROR_THRESHOLD = 65536;
16
+ export interface BudgetDiagnostic {
17
+ level: 'warning' | 'error';
18
+ fnName: string;
19
+ estimatedCommands: number;
20
+ message: string;
21
+ }
22
+ /**
23
+ * Estimate the total command count for a function, including callees.
24
+ *
25
+ * @param fnName - Name of the function to estimate
26
+ * @param mod - The LIR module
27
+ * @returns Estimated number of MC commands
28
+ */
29
+ export declare function estimateCommandCount(fnName: string, mod: LIRModule): number;
30
+ /**
31
+ * Analyze all "top-level" functions in the module for tick budget violations.
32
+ *
33
+ * @param mod - The LIR module to analyze
34
+ * @param coroutineFunctions - Set of function names marked @coroutine (skip these)
35
+ * @returns Array of budget diagnostics (warnings and errors)
36
+ */
37
+ export declare function analyzeBudget(mod: LIRModule, coroutineFunctions?: Set<string>): BudgetDiagnostic[];