redscript-mc 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +12 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +245 -0
  22. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  23. package/dist/src/__tests__/mc-version.test.js +154 -0
  24. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  25. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  26. package/dist/src/__tests__/modules.test.d.ts +7 -0
  27. package/dist/src/__tests__/modules.test.js +333 -0
  28. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  30. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  31. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  32. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  33. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  34. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  35. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  36. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  37. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  38. package/dist/src/__tests__/option.test.d.ts +14 -0
  39. package/dist/src/__tests__/option.test.js +275 -0
  40. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  41. package/dist/src/__tests__/schedule.test.js +98 -0
  42. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  43. package/dist/src/__tests__/sourcemap.test.js +227 -0
  44. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  45. package/dist/src/__tests__/tuple.test.js +202 -0
  46. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  47. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  48. package/dist/src/ast/types.d.ts +56 -2
  49. package/dist/src/cache/deps.d.ts +41 -0
  50. package/dist/src/cache/deps.js +158 -0
  51. package/dist/src/cache/incremental.d.ts +35 -0
  52. package/dist/src/cache/incremental.js +165 -0
  53. package/dist/src/cache/index.d.ts +37 -0
  54. package/dist/src/cache/index.js +152 -0
  55. package/dist/src/cli.js +76 -45
  56. package/dist/src/compile.d.ts +2 -2
  57. package/dist/src/compile.js +1 -1
  58. package/dist/src/diagnostics/index.d.ts +1 -1
  59. package/dist/src/diagnostics/index.js +8 -11
  60. package/dist/src/emit/compile.d.ts +29 -0
  61. package/dist/src/emit/compile.js +143 -0
  62. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  63. package/dist/{src2 → src}/emit/index.js +59 -8
  64. package/dist/src/emit/modules.d.ts +29 -0
  65. package/dist/src/emit/modules.js +492 -0
  66. package/dist/src/emit/sourcemap.d.ts +53 -0
  67. package/dist/src/emit/sourcemap.js +73 -0
  68. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  69. package/dist/{src2 → src}/hir/lower.js +22 -1
  70. package/dist/src/hir/monomorphize.d.ts +22 -0
  71. package/dist/src/hir/monomorphize.js +379 -0
  72. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  73. package/dist/src/index.d.ts +19 -2
  74. package/dist/src/index.js +36 -14
  75. package/dist/src/lexer/index.d.ts +1 -1
  76. package/dist/src/lexer/index.js +1 -0
  77. package/dist/src/lir/budget.d.ts +37 -0
  78. package/dist/src/lir/budget.js +280 -0
  79. package/dist/{src2 → src}/lir/lower.js +19 -0
  80. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  81. package/dist/src/lsp/main.d.ts +8 -0
  82. package/dist/src/lsp/main.js +11 -0
  83. package/dist/src/lsp/server.d.ts +11 -0
  84. package/dist/src/lsp/server.js +352 -0
  85. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  86. package/dist/{src2 → src}/mir/lower.js +244 -10
  87. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  88. package/dist/src/optimizer/coroutine.d.ts +34 -0
  89. package/dist/src/optimizer/coroutine.js +789 -0
  90. package/dist/src/optimizer/dce.d.ts +8 -34
  91. package/dist/src/optimizer/dce.js +146 -629
  92. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  93. package/dist/src/optimizer/interprocedural.js +186 -0
  94. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  95. package/dist/src/optimizer/lir/const_imm.js +139 -0
  96. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  97. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  98. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  99. package/dist/src/optimizer/lir/peephole.js +52 -0
  100. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  101. package/dist/src/optimizer/lir/pipeline.js +34 -0
  102. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  103. package/dist/src/optimizer/nbt-batch.js +51 -0
  104. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  105. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  106. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  107. package/dist/src/optimizer/selector-cache.js +100 -0
  108. package/dist/src/optimizer/unroll.d.ts +32 -0
  109. package/dist/src/optimizer/unroll.js +348 -0
  110. package/dist/src/parser/index.d.ts +8 -0
  111. package/dist/src/parser/index.js +204 -14
  112. package/dist/src/repl.d.ts +1 -1
  113. package/dist/src/typechecker/index.d.ts +4 -0
  114. package/dist/src/typechecker/index.js +198 -13
  115. package/dist/src/types/mc-version.d.ts +24 -0
  116. package/dist/src/types/mc-version.js +49 -0
  117. package/docs/ROADMAP.md +395 -0
  118. package/docs/compiler-pipeline-redesign.md +27 -10
  119. package/editors/vscode/out/extension.js +25176 -8000
  120. package/editors/vscode/package-lock.json +90 -6
  121. package/editors/vscode/package.json +3 -2
  122. package/editors/vscode/src/extension.ts +97 -67
  123. package/examples/showcase.mcrs +3 -3
  124. package/jest.config.js +1 -1
  125. package/package.json +9 -3
  126. package/src/__tests__/budget.test.ts +297 -0
  127. package/src/__tests__/diagnostics.test.ts +2 -3
  128. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  129. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  130. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  131. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  132. package/src/__tests__/enum.test.ts +425 -0
  133. package/src/__tests__/generics.test.ts +390 -0
  134. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  135. package/src/__tests__/incremental.test.ts +337 -0
  136. package/src/__tests__/lsp.test.ts +270 -0
  137. package/src/__tests__/mc-version.test.ts +178 -0
  138. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  139. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  140. package/src/__tests__/modules.test.ts +365 -0
  141. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  142. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  143. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  144. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  145. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  146. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  147. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  148. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  149. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  150. package/src/__tests__/option.test.ts +299 -0
  151. package/src/__tests__/schedule.test.ts +105 -0
  152. package/src/__tests__/sourcemap.test.ts +254 -0
  153. package/src/__tests__/tuple.test.ts +220 -0
  154. package/src/__tests__/typechecker-strict.test.ts +216 -0
  155. package/src/ast/types.ts +33 -2
  156. package/src/cache/deps.ts +132 -0
  157. package/src/cache/incremental.ts +173 -0
  158. package/src/cache/index.ts +135 -0
  159. package/src/cli.ts +88 -45
  160. package/src/compile.ts +2 -2
  161. package/src/diagnostics/index.ts +8 -11
  162. package/src/emit/compile.ts +177 -0
  163. package/{src2 → src}/emit/index.ts +72 -8
  164. package/src/emit/modules.ts +581 -0
  165. package/src/emit/sourcemap.ts +101 -0
  166. package/{src2 → src}/hir/lower.ts +29 -2
  167. package/src/hir/monomorphize.ts +416 -0
  168. package/{src2 → src}/hir/types.ts +15 -3
  169. package/src/index.ts +29 -10
  170. package/src/lexer/index.ts +2 -1
  171. package/src/lir/budget.ts +321 -0
  172. package/{src2 → src}/lir/lower.ts +32 -1
  173. package/{src2 → src}/lir/types.ts +7 -3
  174. package/src/lsp/main.ts +9 -0
  175. package/src/lsp/server.ts +414 -0
  176. package/{src2 → src}/mir/lower.ts +251 -8
  177. package/{src2 → src}/mir/types.ts +12 -1
  178. package/src/optimizer/coroutine.ts +996 -0
  179. package/{src2 → src}/optimizer/dce.ts +2 -1
  180. package/src/optimizer/interprocedural.ts +177 -0
  181. package/src/optimizer/lir/const_imm.ts +143 -0
  182. package/src/optimizer/lir/dead_slot.ts +123 -0
  183. package/src/optimizer/lir/peephole.ts +57 -0
  184. package/src/optimizer/lir/pipeline.ts +37 -0
  185. package/src/optimizer/nbt-batch.ts +50 -0
  186. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  187. package/src/optimizer/selector-cache.ts +103 -0
  188. package/src/optimizer/unroll.ts +386 -0
  189. package/src/parser/index.ts +212 -15
  190. package/src/repl.ts +1 -1
  191. package/src/stdlib/math.mcrs +4 -4
  192. package/src/templates/quest.mcrs +4 -4
  193. package/src/typechecker/index.ts +215 -15
  194. package/src/types/mc-version.ts +46 -0
  195. package/tsconfig.json +1 -1
  196. package/.claude/commands/build-test.md +0 -10
  197. package/.claude/commands/deploy-demo.md +0 -12
  198. package/.claude/commands/stage-status.md +0 -13
  199. package/.claude/settings.json +0 -12
  200. package/CLAUDE.md +0 -231
  201. package/dist/__tests__/cli.test.js +0 -278
  202. package/dist/__tests__/codegen.test.js +0 -152
  203. package/dist/__tests__/compile-all.test.d.ts +0 -10
  204. package/dist/__tests__/compile-all.test.js +0 -108
  205. package/dist/__tests__/dce.test.js +0 -138
  206. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  207. package/dist/__tests__/diagnostics.test.js +0 -149
  208. package/dist/__tests__/e2e.test.d.ts +0 -6
  209. package/dist/__tests__/e2e.test.js +0 -1847
  210. package/dist/__tests__/entity-types.test.js +0 -203
  211. package/dist/__tests__/formatter.test.js +0 -40
  212. package/dist/__tests__/lexer.test.js +0 -343
  213. package/dist/__tests__/lowering.test.js +0 -1015
  214. package/dist/__tests__/macro.test.d.ts +0 -8
  215. package/dist/__tests__/macro.test.js +0 -305
  216. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  217. package/dist/__tests__/mc-integration.test.js +0 -819
  218. package/dist/__tests__/mc-syntax.test.js +0 -124
  219. package/dist/__tests__/nbt.test.js +0 -82
  220. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  221. package/dist/__tests__/optimizer.test.d.ts +0 -1
  222. package/dist/__tests__/optimizer.test.js +0 -149
  223. package/dist/__tests__/parser.test.d.ts +0 -1
  224. package/dist/__tests__/parser.test.js +0 -807
  225. package/dist/__tests__/repl.test.d.ts +0 -1
  226. package/dist/__tests__/repl.test.js +0 -27
  227. package/dist/__tests__/runtime.test.d.ts +0 -1
  228. package/dist/__tests__/runtime.test.js +0 -289
  229. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  230. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  231. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  232. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  233. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  234. package/dist/__tests__/stdlib-math.test.js +0 -352
  235. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  236. package/dist/__tests__/stdlib-vec.test.js +0 -264
  237. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  238. package/dist/__tests__/structure-optimizer.test.js +0 -33
  239. package/dist/__tests__/typechecker.test.d.ts +0 -1
  240. package/dist/__tests__/typechecker.test.js +0 -552
  241. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  242. package/dist/__tests__/var-allocator.test.js +0 -69
  243. package/dist/ast/types.d.ts +0 -514
  244. package/dist/ast/types.js +0 -9
  245. package/dist/builtins/metadata.d.ts +0 -36
  246. package/dist/builtins/metadata.js +0 -1014
  247. package/dist/cli.d.ts +0 -11
  248. package/dist/codegen/cmdblock/index.d.ts +0 -26
  249. package/dist/codegen/cmdblock/index.js +0 -45
  250. package/dist/codegen/mcfunction/index.d.ts +0 -40
  251. package/dist/codegen/mcfunction/index.js +0 -606
  252. package/dist/codegen/structure/index.d.ts +0 -24
  253. package/dist/codegen/structure/index.js +0 -279
  254. package/dist/codegen/var-allocator.d.ts +0 -45
  255. package/dist/codegen/var-allocator.js +0 -104
  256. package/dist/compile.d.ts +0 -68
  257. package/dist/data/arena/function/__load.mcfunction +0 -6
  258. package/dist/data/arena/function/__tick.mcfunction +0 -2
  259. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  260. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  261. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  262. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  263. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  264. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  265. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  266. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  267. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  268. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  269. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  270. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  271. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  272. package/dist/data/counter/function/__load.mcfunction +0 -5
  273. package/dist/data/counter/function/__tick.mcfunction +0 -2
  274. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  275. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  276. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  277. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  278. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  279. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  280. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  281. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  282. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  283. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  284. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  285. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  286. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  287. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  288. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  289. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  290. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  291. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  292. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  293. package/dist/data/gcd3/function/test.mcfunction +0 -7
  294. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  295. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  296. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  297. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  298. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  299. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  300. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  301. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  302. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  303. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  304. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  305. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  306. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  307. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  308. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  309. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  310. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  311. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  312. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  313. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  314. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  315. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  316. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  317. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  318. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  319. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  320. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  321. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  322. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  323. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  324. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  325. package/dist/data/mathtest/function/test.mcfunction +0 -5
  326. package/dist/data/minecraft/tags/function/load.json +0 -5
  327. package/dist/data/minecraft/tags/function/tick.json +0 -5
  328. package/dist/data/mypack/function/__load.mcfunction +0 -13
  329. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  330. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  331. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  332. package/dist/data/mypack/function/abs.mcfunction +0 -6
  333. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  334. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  335. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  336. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  337. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  338. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  339. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  340. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  341. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  342. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  343. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  346. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  347. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  348. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  352. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  353. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  354. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  357. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  358. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  359. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  360. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  361. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  365. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  366. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  367. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  368. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  369. package/dist/data/quiz/function/__load.mcfunction +0 -16
  370. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  371. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  372. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  373. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  374. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  375. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  376. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  377. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  378. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  379. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  380. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  381. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  382. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  383. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  384. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  386. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  387. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  388. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  389. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  390. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  391. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  392. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  393. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  394. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  395. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  396. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  397. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  398. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  399. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  400. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  402. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  403. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  404. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  405. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  406. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  407. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  408. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  409. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  410. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  411. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  412. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  413. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  414. package/dist/data/runtime/function/__load.mcfunction +0 -5
  415. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  416. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  417. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  418. package/dist/data/shop/function/__load.mcfunction +0 -7
  419. package/dist/data/shop/function/__tick.mcfunction +0 -3
  420. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  421. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  422. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  423. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  424. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  425. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  426. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  427. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  429. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  430. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  431. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  432. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  433. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  434. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  435. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  436. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  437. package/dist/data/turret/function/__load.mcfunction +0 -5
  438. package/dist/data/turret/function/__tick.mcfunction +0 -4
  439. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  440. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  441. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  442. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  443. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  444. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  445. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  446. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  447. package/dist/diagnostics/index.d.ts +0 -44
  448. package/dist/diagnostics/index.js +0 -140
  449. package/dist/events/types.d.ts +0 -35
  450. package/dist/events/types.js +0 -59
  451. package/dist/formatter/index.d.ts +0 -1
  452. package/dist/formatter/index.js +0 -26
  453. package/dist/gcd2.map.json +0 -15
  454. package/dist/gcd3.map.json +0 -17
  455. package/dist/gcd_test.map.json +0 -15
  456. package/dist/index.d.ts +0 -62
  457. package/dist/ir/builder.d.ts +0 -33
  458. package/dist/ir/builder.js +0 -99
  459. package/dist/ir/types.d.ts +0 -132
  460. package/dist/ir/types.js +0 -15
  461. package/dist/isqrttest.map.json +0 -15
  462. package/dist/lexer/index.d.ts +0 -37
  463. package/dist/lexer/index.js +0 -569
  464. package/dist/lowering/index.d.ts +0 -188
  465. package/dist/lowering/index.js +0 -3405
  466. package/dist/mathtest.map.json +0 -6
  467. package/dist/mc-test/client.d.ts +0 -128
  468. package/dist/mc-test/client.js +0 -174
  469. package/dist/mc-test/runner.d.ts +0 -28
  470. package/dist/mc-test/runner.js +0 -150
  471. package/dist/mc-test/setup.d.ts +0 -11
  472. package/dist/mc-test/setup.js +0 -98
  473. package/dist/mc-validator/index.d.ts +0 -17
  474. package/dist/mc-validator/index.js +0 -322
  475. package/dist/mypack.map.json +0 -27
  476. package/dist/nbt/index.d.ts +0 -86
  477. package/dist/nbt/index.js +0 -250
  478. package/dist/optimizer/commands.d.ts +0 -38
  479. package/dist/optimizer/commands.js +0 -451
  480. package/dist/optimizer/dce.d.ts +0 -34
  481. package/dist/optimizer/dce.js +0 -639
  482. package/dist/optimizer/passes.d.ts +0 -34
  483. package/dist/optimizer/passes.js +0 -243
  484. package/dist/optimizer/structure.d.ts +0 -9
  485. package/dist/optimizer/structure.js +0 -356
  486. package/dist/pack.mcmeta +0 -6
  487. package/dist/parser/index.d.ts +0 -93
  488. package/dist/parser/index.js +0 -1687
  489. package/dist/repl.d.ts +0 -16
  490. package/dist/repl.js +0 -165
  491. package/dist/reqtest.map.json +0 -4
  492. package/dist/reqtest2.map.json +0 -4
  493. package/dist/runtime/index.d.ts +0 -107
  494. package/dist/runtime/index.js +0 -1409
  495. package/dist/runtime.map.json +0 -7
  496. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  497. package/dist/src/__tests__/codegen.test.js +0 -152
  498. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  499. package/dist/src/__tests__/e2e.test.js +0 -1789
  500. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  501. package/dist/src/__tests__/entity-types.test.js +0 -203
  502. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  503. package/dist/src/__tests__/lowering.test.js +0 -1015
  504. package/dist/src/__tests__/macro.test.d.ts +0 -8
  505. package/dist/src/__tests__/macro.test.js +0 -306
  506. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  507. package/dist/src/__tests__/nbt.test.js +0 -82
  508. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  509. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  510. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  511. package/dist/src/__tests__/optimizer.test.js +0 -149
  512. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  513. package/dist/src/__tests__/runtime.test.js +0 -289
  514. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  515. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  516. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  517. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  518. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  519. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  520. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  521. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  522. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  523. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  524. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  525. package/dist/src/__tests__/var-allocator.test.js +0 -69
  526. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  527. package/dist/src/codegen/cmdblock/index.js +0 -45
  528. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  529. package/dist/src/codegen/mcfunction/index.js +0 -606
  530. package/dist/src/codegen/structure/index.d.ts +0 -24
  531. package/dist/src/codegen/structure/index.js +0 -279
  532. package/dist/src/codegen/var-allocator.d.ts +0 -45
  533. package/dist/src/codegen/var-allocator.js +0 -104
  534. package/dist/src/ir/builder.d.ts +0 -33
  535. package/dist/src/ir/builder.js +0 -99
  536. package/dist/src/ir/types.d.ts +0 -132
  537. package/dist/src/ir/types.js +0 -15
  538. package/dist/src/lowering/index.d.ts +0 -188
  539. package/dist/src/lowering/index.js +0 -3405
  540. package/dist/src/optimizer/commands.d.ts +0 -38
  541. package/dist/src/optimizer/commands.js +0 -451
  542. package/dist/src/optimizer/passes.d.ts +0 -34
  543. package/dist/src/optimizer/passes.js +0 -243
  544. package/dist/src/optimizer/structure.d.ts +0 -9
  545. package/dist/src/optimizer/structure.js +0 -356
  546. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  547. package/dist/src2/emit/compile.d.ts +0 -19
  548. package/dist/src2/emit/compile.js +0 -80
  549. package/dist/src2/optimizer/dce.d.ts +0 -8
  550. package/dist/src2/optimizer/dce.js +0 -155
  551. package/dist/swap_test.map.json +0 -14
  552. package/dist/tsconfig.tsbuildinfo +0 -1
  553. package/dist/typechecker/index.d.ts +0 -61
  554. package/dist/typechecker/index.js +0 -1034
  555. package/dist/types/entity-hierarchy.d.ts +0 -29
  556. package/dist/types/entity-hierarchy.js +0 -107
  557. package/src2/emit/compile.ts +0 -99
  558. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  559. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  560. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  561. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  562. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  563. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  564. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  565. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  566. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  567. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  568. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  569. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  570. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  571. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  572. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  576. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  578. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  579. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  580. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  581. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  582. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  583. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  584. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  585. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  586. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  587. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  588. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  589. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  590. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  592. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  593. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  594. /package/dist/{src2 → src}/hir/types.js +0 -0
  595. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  596. /package/dist/{src2 → src}/lir/types.js +0 -0
  597. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  598. /package/dist/{src2 → src}/lir/verify.js +0 -0
  599. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  600. /package/dist/{src2 → src}/mir/macro.js +0 -0
  601. /package/dist/{src2 → src}/mir/types.js +0 -0
  602. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  603. /package/dist/{src2 → src}/mir/verify.js +0 -0
  604. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  605. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  606. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  607. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  608. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  609. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  610. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  611. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  612. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  613. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  614. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  615. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  616. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  617. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  618. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  619. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  620. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  621. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  622. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  623. /package/{src2 → src}/lir/verify.ts +0 -0
  624. /package/{src2 → src}/mir/macro.ts +0 -0
  625. /package/{src2 → src}/mir/verify.ts +0 -0
  626. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  627. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  628. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  629. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -132,6 +132,7 @@ export class TypeChecker {
132
132
  private structs: Map<string, Map<string, TypeNode>> = new Map()
133
133
  private enums: Map<string, Map<string, number>> = new Map()
134
134
  private consts: Map<string, TypeNode> = new Map()
135
+ private globals: Map<string, TypeNode> = new Map()
135
136
  private currentFn: FnDecl | null = null
136
137
  private currentReturnType: TypeNode | null = null
137
138
  private scope: Map<string, ScopeSymbol> = new Map()
@@ -174,6 +175,11 @@ export class TypeChecker {
174
175
  this.functions.set(fn.name, fn)
175
176
  }
176
177
 
178
+ // Register global variables (mutable) so functions can reference and assign them
179
+ for (const global of program.globals ?? []) {
180
+ this.globals.set(global.name, this.normalizeType(global.type))
181
+ }
182
+
177
183
  for (const implBlock of program.implBlocks ?? []) {
178
184
  let methods = this.implMethods.get(implBlock.typeName)
179
185
  if (!methods) {
@@ -239,6 +245,10 @@ export class TypeChecker {
239
245
  }
240
246
 
241
247
  private checkFunction(fn: FnDecl): void {
248
+ // Generic functions (with type params like <T>) are checked after monomorphization.
249
+ // Skip body checking here to avoid false errors for unresolved type params.
250
+ if (fn.typeParams && fn.typeParams.length > 0) return
251
+
242
252
  this.currentFn = fn
243
253
  this.currentReturnType = this.normalizeType(fn.returnType)
244
254
  this.scope = new Map()
@@ -250,6 +260,10 @@ export class TypeChecker {
250
260
  this.scope.set(name, { type, mutable: false })
251
261
  }
252
262
 
263
+ for (const [name, type] of this.globals.entries()) {
264
+ this.scope.set(name, { type, mutable: true })
265
+ }
266
+
253
267
  // Add parameters to scope
254
268
  for (const param of fn.params) {
255
269
  this.scope.set(param.name, { type: this.normalizeType(param.type), mutable: true })
@@ -330,6 +344,9 @@ export class TypeChecker {
330
344
  case 'let':
331
345
  this.checkLetStmt(stmt)
332
346
  break
347
+ case 'let_destruct':
348
+ this.checkLetDestructStmt(stmt)
349
+ break
333
350
  case 'return':
334
351
  this.checkReturnStmt(stmt)
335
352
  break
@@ -375,7 +392,12 @@ export class TypeChecker {
375
392
  for (const arm of stmt.arms) {
376
393
  if (arm.pattern) {
377
394
  this.checkExpr(arm.pattern)
378
- if (!this.typesMatch(this.inferType(stmt.expr), this.inferType(arm.pattern))) {
395
+ const subjectType = this.inferType(stmt.expr)
396
+ const patternType = this.inferType(arm.pattern)
397
+ // Skip check if either type is unknown (void) — struct field access not yet inferred
398
+ const isUnknown = (t: TypeNode) => t.kind === 'named' && t.name === 'void'
399
+ if (!isUnknown(subjectType) && !isUnknown(patternType) &&
400
+ !this.typesMatch(subjectType, patternType)) {
379
401
  this.report('Match arm pattern type must match subject type', arm.pattern)
380
402
  }
381
403
  }
@@ -427,6 +449,46 @@ export class TypeChecker {
427
449
  }
428
450
  }
429
451
 
452
+ private checkLetDestructStmt(stmt: Extract<Stmt, { kind: 'let_destruct' }>): void {
453
+ this.checkExpr(stmt.init)
454
+ const initType = this.inferType(stmt.init)
455
+ if (stmt.type) {
456
+ // Type annotation must be a tuple
457
+ const normalized = this.normalizeType(stmt.type)
458
+ if (normalized.kind !== 'tuple') {
459
+ this.report(`Destructuring type annotation must be a tuple type`, stmt)
460
+ return
461
+ }
462
+ if (normalized.elements.length !== stmt.names.length) {
463
+ this.report(
464
+ `Destructuring pattern has ${stmt.names.length} bindings but type has ${normalized.elements.length} elements`,
465
+ stmt
466
+ )
467
+ }
468
+ for (let i = 0; i < stmt.names.length; i++) {
469
+ const elemType = normalized.elements[i] ?? { kind: 'named', name: 'int' } as TypeNode
470
+ this.scope.set(stmt.names[i], { type: elemType, mutable: true })
471
+ }
472
+ } else if (initType.kind === 'tuple') {
473
+ // Infer element types from tuple literal type
474
+ if (initType.elements.length !== stmt.names.length) {
475
+ this.report(
476
+ `Destructuring pattern has ${stmt.names.length} bindings but tuple has ${initType.elements.length} elements`,
477
+ stmt
478
+ )
479
+ }
480
+ for (let i = 0; i < stmt.names.length; i++) {
481
+ const elemType = initType.elements[i] ?? { kind: 'named', name: 'int' } as TypeNode
482
+ this.scope.set(stmt.names[i], { type: elemType, mutable: true })
483
+ }
484
+ } else {
485
+ // Can't infer element types — use int as fallback (tuple returns inferred as int from scoreboard)
486
+ for (const name of stmt.names) {
487
+ this.scope.set(name, { type: INT_TYPE, mutable: true })
488
+ }
489
+ }
490
+ }
491
+
430
492
  private checkLetStmt(stmt: Extract<Stmt, { kind: 'let' }>): void {
431
493
  // Check initializer
432
494
  const expectedType = stmt.type ? this.normalizeType(stmt.type) : undefined
@@ -441,13 +503,21 @@ export class TypeChecker {
441
503
  expectedType &&
442
504
  stmt.init.kind !== 'struct_lit' &&
443
505
  stmt.init.kind !== 'array_lit' &&
444
- !(actualType.kind === 'named' && actualType.name === 'void') &&
445
- !this.typesMatch(expectedType, actualType)
506
+ !(actualType.kind === 'named' && actualType.name === 'void')
446
507
  ) {
447
- this.report(
448
- `Type mismatch: expected ${this.typeToString(expectedType)}, got ${this.typeToString(actualType)}`,
449
- stmt
450
- )
508
+ if (this.isNumericMismatch(expectedType, actualType)) {
509
+ // Explicit numeric conversion required for let assignments
510
+ this.report(
511
+ `Type mismatch: cannot implicitly convert ${this.typeToString(actualType)} to ${this.typeToString(expectedType)}` +
512
+ ` (use an explicit cast: 'as ${this.typeToString(expectedType)}')`,
513
+ stmt
514
+ )
515
+ } else if (!this.typesMatch(expectedType, actualType)) {
516
+ this.report(
517
+ `Type mismatch: expected ${this.typeToString(expectedType)}, got ${this.typeToString(actualType)}`,
518
+ stmt
519
+ )
520
+ }
451
521
  }
452
522
  }
453
523
 
@@ -460,7 +530,14 @@ export class TypeChecker {
460
530
  const actualType = this.inferType(stmt.value, expectedType)
461
531
  this.checkExpr(stmt.value, expectedType)
462
532
 
463
- if (!this.typesMatch(expectedType, actualType)) {
533
+ if (this.isNumericMismatch(expectedType, actualType)) {
534
+ // Explicit numeric conversion required for return statements
535
+ this.report(
536
+ `Return type mismatch: cannot implicitly convert ${this.typeToString(actualType)} to ${this.typeToString(expectedType)}` +
537
+ ` (use an explicit cast: 'as ${this.typeToString(expectedType)}')`,
538
+ stmt
539
+ )
540
+ } else if (!this.typesMatch(expectedType, actualType)) {
464
541
  this.report(
465
542
  `Return type mismatch: expected ${this.typeToString(expectedType)}, got ${this.typeToString(actualType)}`,
466
543
  stmt
@@ -559,7 +636,10 @@ export class TypeChecker {
559
636
  }
560
637
  this.checkExpr(part.expr)
561
638
  const partType = this.inferType(part.expr)
639
+ // Skip check if type is unknown (void) — struct field access not yet fully inferred
640
+ const isUnknown = partType.kind === 'named' && partType.name === 'void'
562
641
  if (
642
+ !isUnknown &&
563
643
  !(partType.kind === 'named' && (partType.name === 'int' || partType.name === 'string' || partType.name === 'format_string'))
564
644
  ) {
565
645
  this.report(
@@ -576,10 +656,30 @@ export class TypeChecker {
576
656
  }
577
657
  break
578
658
 
659
+ case 'tuple_lit':
660
+ if (expr.elements.length < 2 || expr.elements.length > 8) {
661
+ this.report(`Tuple must have 2-8 elements, got ${expr.elements.length}`, expr)
662
+ }
663
+ for (const elem of expr.elements) {
664
+ this.checkExpr(elem)
665
+ }
666
+ break
667
+
579
668
  case 'lambda':
580
669
  this.checkLambdaExpr(expr, expectedType)
581
670
  break
582
671
 
672
+ case 'path_expr':
673
+ if (!this.enums.has(expr.enumName)) {
674
+ this.report(`Unknown enum '${expr.enumName}'`, expr)
675
+ } else {
676
+ const variants = this.enums.get(expr.enumName)!
677
+ if (!variants.has(expr.variant)) {
678
+ this.report(`Enum '${expr.enumName}' has no variant '${expr.variant}'`, expr)
679
+ }
680
+ }
681
+ break
682
+
583
683
  case 'blockpos':
584
684
  break
585
685
 
@@ -619,6 +719,18 @@ export class TypeChecker {
619
719
  // Check if function exists and arg count matches
620
720
  const fn = this.functions.get(expr.fn)
621
721
  if (fn) {
722
+ // Generic functions: skip param-type checking (monomorphizer handles it)
723
+ if (fn.typeParams && fn.typeParams.length > 0) {
724
+ const requiredParams = fn.params.filter(param => !param.default).length
725
+ if (expr.args.length < requiredParams || expr.args.length > fn.params.length) {
726
+ this.report(
727
+ `Function '${expr.fn}' expects ${requiredParams}-${fn.params.length} arguments, got ${expr.args.length}`,
728
+ expr
729
+ )
730
+ }
731
+ for (const arg of expr.args) this.checkExpr(arg)
732
+ return
733
+ }
622
734
  const requiredParams = fn.params.filter(param => !param.default).length
623
735
  if (expr.args.length < requiredParams || expr.args.length > fn.params.length) {
624
736
  const expectedRange = requiredParams === fn.params.length
@@ -968,7 +1080,15 @@ export class TypeChecker {
968
1080
  return this.normalizeType(implMethod.returnType)
969
1081
  }
970
1082
  const fn = this.functions.get(expr.fn)
971
- return fn?.returnType ?? INT_TYPE
1083
+ if (fn) {
1084
+ // For generic functions, the return type may be a type param (e.g. T).
1085
+ // If we have an expected type from context, trust it; otherwise return int as default.
1086
+ if (fn.typeParams && fn.typeParams.length > 0) {
1087
+ return expectedType ?? INT_TYPE
1088
+ }
1089
+ return this.normalizeType(fn.returnType)
1090
+ }
1091
+ return INT_TYPE
972
1092
  }
973
1093
  case 'static_call': {
974
1094
  const method = this.implMethods.get(expr.type)?.get(expr.method)
@@ -981,6 +1101,11 @@ export class TypeChecker {
981
1101
  }
982
1102
  return { kind: 'named', name: 'void' }
983
1103
  }
1104
+ case 'path_expr':
1105
+ if (this.enums.has(expr.enumName)) {
1106
+ return { kind: 'enum', name: expr.enumName }
1107
+ }
1108
+ return { kind: 'named', name: 'void' }
984
1109
  case 'member':
985
1110
  if (expr.obj.kind === 'ident' && this.enums.has(expr.obj.name)) {
986
1111
  return { kind: 'enum', name: expr.obj.name }
@@ -1007,6 +1132,11 @@ export class TypeChecker {
1007
1132
  case 'unary':
1008
1133
  if (expr.op === '!') return { kind: 'named', name: 'bool' }
1009
1134
  return this.inferType(expr.operand)
1135
+ case 'selector': {
1136
+ // Infer entity type from the selector
1137
+ const entityType = this.inferEntityTypeFromSelector(expr.sel)
1138
+ return { kind: 'selector', entityType: entityType ?? undefined }
1139
+ }
1010
1140
  case 'array_lit':
1011
1141
  if (expr.elements.length > 0) {
1012
1142
  return { kind: 'array', elem: this.inferType(expr.elements[0]) }
@@ -1020,6 +1150,22 @@ export class TypeChecker {
1020
1150
  }
1021
1151
  }
1022
1152
  return { kind: 'named', name: 'void' }
1153
+ case 'tuple_lit':
1154
+ return {
1155
+ kind: 'tuple',
1156
+ elements: expr.elements.map(e => this.inferType(e)),
1157
+ }
1158
+ case 'some_lit': {
1159
+ // Some(expr) → Option<T> where T is inferred from inner value
1160
+ const innerType = this.inferType(expr.value,
1161
+ expectedType?.kind === 'option' ? expectedType.inner : undefined)
1162
+ return { kind: 'option', inner: innerType }
1163
+ }
1164
+ case 'none_lit': {
1165
+ // None → Option<T>, use expected type if available
1166
+ if (expectedType?.kind === 'option') return expectedType
1167
+ return { kind: 'option', inner: { kind: 'named', name: 'void' } }
1168
+ }
1023
1169
  case 'lambda':
1024
1170
  return this.inferLambdaType(
1025
1171
  expr,
@@ -1132,13 +1278,53 @@ export class TypeChecker {
1132
1278
  return this.selfTypeStack[this.selfTypeStack.length - 1]
1133
1279
  }
1134
1280
 
1281
+ /** Returns true if expected/actual are a numeric type mismatch (int vs float). */
1282
+ private isNumericMismatch(expected: TypeNode, actual: TypeNode): boolean {
1283
+ if (expected.kind !== 'named' || actual.kind !== 'named') return false
1284
+ const numericPairs = [
1285
+ ['int', 'float'], ['float', 'int'],
1286
+ ['int', 'double'], ['double', 'int'],
1287
+ ['float', 'double'], ['double', 'float'],
1288
+ ]
1289
+ return numericPairs.some(([e, a]) => expected.name === e && actual.name === a)
1290
+ }
1291
+
1135
1292
  private typesMatch(expected: TypeNode, actual: TypeNode): boolean {
1293
+ // Enum values are backed by int — allow enum where int is expected and vice versa
1294
+ if (expected.kind === 'named' && expected.name === 'int' && actual.kind === 'enum') {
1295
+ return true
1296
+ }
1297
+ if (expected.kind === 'enum' && actual.kind === 'named' && actual.name === 'int') {
1298
+ return true
1299
+ }
1300
+
1301
+ // Selector/entity cross-kind compatibility (must come before kind guard)
1302
+ if (expected.kind === 'selector' && actual.kind === 'entity') {
1303
+ return true // entity is a valid selector
1304
+ }
1305
+ if (expected.kind === 'entity' && actual.kind === 'selector') {
1306
+ return true // selector is a valid entity context
1307
+ }
1308
+ if (expected.kind === 'entity' && actual.kind === 'entity') {
1309
+ return this.isEntitySubtype(actual.entityType, expected.entityType)
1310
+ }
1311
+ if (expected.kind === 'selector' && actual.kind === 'selector') {
1312
+ return true // any entity subtype is compatible
1313
+ }
1314
+
1136
1315
  if (expected.kind !== actual.kind) return false
1137
1316
 
1138
1317
  if (expected.kind === 'named' && actual.kind === 'named') {
1139
1318
  // void matches anything (for inferred types)
1140
1319
  if (actual.name === 'void') return true
1141
- return expected.name === actual.name
1320
+ if (expected.name === actual.name) return true
1321
+ // int→float/double implicit promotion in function calls (not for let/return — handled separately)
1322
+ const numericPromotion = [
1323
+ ['int', 'float'], ['int', 'double'], ['float', 'double'],
1324
+ ['float', 'int'], ['double', 'int'], ['double', 'float'],
1325
+ ]
1326
+ if (numericPromotion.some(([e, a]) => expected.name === e && actual.name === a)) return true
1327
+ return false
1142
1328
  }
1143
1329
 
1144
1330
  if (expected.kind === 'array' && actual.kind === 'array') {
@@ -1159,13 +1345,17 @@ export class TypeChecker {
1159
1345
  this.typesMatch(expected.return, actual.return)
1160
1346
  }
1161
1347
 
1162
- // Entity type matching with subtype support
1163
- if (expected.kind === 'entity' && actual.kind === 'entity') {
1164
- return this.isEntitySubtype(actual.entityType, expected.entityType)
1348
+ if (expected.kind === 'tuple' && actual.kind === 'tuple') {
1349
+ return expected.elements.length === actual.elements.length &&
1350
+ expected.elements.every((elem, i) => this.typesMatch(elem, actual.elements[i]))
1165
1351
  }
1166
1352
 
1167
- // Selector matches any entity type
1168
- if (expected.kind === 'selector' && actual.kind === 'entity') {
1353
+ if (expected.kind === 'option' && actual.kind === 'option') {
1354
+ return this.typesMatch(expected.inner, actual.inner)
1355
+ }
1356
+
1357
+ // Option<T> is compatible with None (void inner) or partially inferred types
1358
+ if (expected.kind === 'option' && actual.kind === 'named' && actual.name === 'void') {
1169
1359
  return true
1170
1360
  }
1171
1361
 
@@ -1188,6 +1378,10 @@ export class TypeChecker {
1188
1378
  return type.entityType
1189
1379
  case 'selector':
1190
1380
  return 'selector'
1381
+ case 'tuple':
1382
+ return `(${type.elements.map(e => this.typeToString(e)).join(', ')})`
1383
+ case 'option':
1384
+ return `Option<${this.typeToString(type.inner)}>`
1191
1385
  default:
1192
1386
  return 'unknown'
1193
1387
  }
@@ -1197,6 +1391,12 @@ export class TypeChecker {
1197
1391
  if (type.kind === 'array') {
1198
1392
  return { kind: 'array', elem: this.normalizeType(type.elem) }
1199
1393
  }
1394
+ if (type.kind === 'option') {
1395
+ return { kind: 'option', inner: this.normalizeType(type.inner) }
1396
+ }
1397
+ if (type.kind === 'tuple') {
1398
+ return { kind: 'tuple', elements: type.elements.map(e => this.normalizeType(e)) }
1399
+ }
1200
1400
  if (type.kind === 'function_type') {
1201
1401
  return {
1202
1402
  kind: 'function_type',
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Minecraft version target enumeration.
3
+ *
4
+ * Encoded as: major * 1000 + minor (patch is ignored for feature gating).
5
+ * e.g., 1.20.2 → 20002, 1.21 → 21000, 1.21.4 → 21004
6
+ */
7
+
8
+ export enum McVersion {
9
+ v1_19 = 19000,
10
+ v1_20 = 20000,
11
+ v1_20_2 = 20002,
12
+ v1_20_4 = 20004,
13
+ v1_21 = 21000,
14
+ v1_21_4 = 21004,
15
+ }
16
+
17
+ /**
18
+ * Parse a version string like "1.20.2" or "1.21" into a McVersion number.
19
+ * Throws if the string is not a valid Minecraft version.
20
+ */
21
+ export function parseMcVersion(s: string): McVersion {
22
+ const parts = s.trim().split('.')
23
+ if (parts.length < 2 || parts.length > 3) {
24
+ throw new Error(`Invalid MC version: "${s}" — expected format "1.20" or "1.20.2"`)
25
+ }
26
+ const [majorStr, minorStr, patchStr = '0'] = parts
27
+ const major = parseInt(majorStr, 10)
28
+ const minor = parseInt(minorStr, 10)
29
+ const patch = parseInt(patchStr, 10)
30
+ if (isNaN(major) || isNaN(minor) || isNaN(patch)) {
31
+ throw new Error(`Invalid MC version: "${s}" — non-numeric component`)
32
+ }
33
+ if (major !== 1) {
34
+ throw new Error(`Invalid MC version: "${s}" — only Minecraft 1.x is supported`)
35
+ }
36
+ return minor * 1000 + patch as McVersion
37
+ }
38
+
39
+ /**
40
+ * Compare two McVersion values. Returns negative if a < b, 0 if equal, positive if a > b.
41
+ */
42
+ export function compareMcVersion(a: McVersion, b: McVersion): number {
43
+ return a - b
44
+ }
45
+
46
+ export const DEFAULT_MC_VERSION = McVersion.v1_21
package/tsconfig.json CHANGED
@@ -11,6 +11,6 @@
11
11
  "esModuleInterop": true,
12
12
  "skipLibCheck": true
13
13
  },
14
- "include": ["src/**/*", "src2/**/*"],
14
+ "include": ["src/**/*"],
15
15
  "exclude": ["dist", "node_modules"]
16
16
  }
@@ -1,10 +0,0 @@
1
- # build-test
2
-
3
- Build and run all tests. Always run this after making changes.
4
-
5
- ```bash
6
- npm run build && npm test
7
- ```
8
-
9
- Expected: 920/920 tests passing.
10
- If any test fails, fix it before committing.
@@ -1,12 +0,0 @@
1
- # deploy-demo
2
-
3
- Compile and deploy the readme demo to the local test server.
4
-
5
- ```bash
6
- node dist/cli.js compile examples/readme-demo.mcrs \
7
- -o ~/mc-test-server/world/datapacks/rsdemo \
8
- --namespace rsdemo
9
- ```
10
-
11
- Then in-game: `/reload` → `/function rsdemo:start`
12
- Stand ~10 blocks back, face forward.
@@ -1,13 +0,0 @@
1
- # stage-status
2
-
3
- Show the current state of the refactor pipeline.
4
-
5
- Check what exists in src2/ (if the refactor branch is active), run tests,
6
- and summarize which pipeline stages are implemented and passing.
7
-
8
- ```bash
9
- echo "=== Current branch ===" && git branch --show-current
10
- echo "=== Test status ===" && npm test -- --passWithNoTests 2>&1 | tail -5
11
- echo "=== src2 exists? ===" && ls src2/ 2>/dev/null || echo "not started"
12
- echo "=== Design doc ===" && wc -l docs/compiler-pipeline-redesign.md
13
- ```
@@ -1,12 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npm run build)",
5
- "Bash(npm test)",
6
- "Bash(npm run build && npm test)",
7
- "Bash(git *)",
8
- "Bash(node dist/cli.js *)",
9
- "Bash(trash *)"
10
- ]
11
- }
12
- }