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
@@ -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
- }