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
package/src/ast/types.ts CHANGED
@@ -53,6 +53,8 @@ export type TypeNode =
53
53
  | { kind: 'function_type'; params: TypeNode[]; return: TypeNode }
54
54
  | { kind: 'entity'; entityType: EntityTypeName } // Entity types
55
55
  | { kind: 'selector'; entityType?: string } // Selector type, optionally parameterized: selector<Player>
56
+ | { kind: 'tuple'; elements: TypeNode[] } // Tuple type: (int, int, bool)
57
+ | { kind: 'option'; inner: TypeNode } // Option<T> — null safety wrapper
56
58
 
57
59
  export interface LambdaParam {
58
60
  name: string
@@ -163,7 +165,7 @@ export type Expr =
163
165
  | { kind: 'is_check'; expr: Expr; entityType: EntityTypeName; span?: Span }
164
166
  | { kind: 'unary'; op: '!' | '-'; operand: Expr; span?: Span }
165
167
  | { kind: 'assign'; target: string; op: AssignOp; value: Expr; span?: Span }
166
- | { kind: 'call'; fn: string; args: Expr[]; span?: Span }
168
+ | { kind: 'call'; fn: string; args: Expr[]; typeArgs?: TypeNode[]; span?: Span }
167
169
  | { kind: 'invoke'; callee: Expr; args: Expr[]; span?: Span }
168
170
  | { kind: 'member'; obj: Expr; field: string; span?: Span }
169
171
  | { kind: 'struct_lit'; fields: { name: string; value: Expr }[]; span?: Span }
@@ -171,7 +173,11 @@ export type Expr =
171
173
  | { kind: 'index'; obj: Expr; index: Expr; span?: Span }
172
174
  | { kind: 'array_lit'; elements: Expr[]; span?: Span }
173
175
  | { kind: 'static_call'; type: string; method: string; args: Expr[]; span?: Span }
176
+ | { kind: 'path_expr'; enumName: string; variant: string; span?: Span }
174
177
  | (LambdaExpr & { span?: Span })
178
+ | { kind: 'tuple_lit'; elements: Expr[]; span?: Span }
179
+ | { kind: 'some_lit'; value: Expr; span?: Span } // Some(expr)
180
+ | { kind: 'none_lit'; span?: Span } // None
175
181
 
176
182
  export type LiteralExpr =
177
183
  | Extract<Expr, { kind: 'int_lit' }>
@@ -217,6 +223,7 @@ export type ExecuteSubcommand =
217
223
 
218
224
  export type Stmt =
219
225
  | { kind: 'let'; name: string; type?: TypeNode; init: Expr; span?: Span }
226
+ | { kind: 'let_destruct'; names: string[]; type?: TypeNode; init: Expr; span?: Span }
220
227
  | { kind: 'expr'; expr: Expr; span?: Span }
221
228
  | { kind: 'return'; value?: Expr; span?: Span }
222
229
  | { kind: 'break'; span?: Span }
@@ -227,6 +234,7 @@ export type Stmt =
227
234
  | { kind: 'foreach'; binding: string; iterable: Expr; body: Block; executeContext?: string; span?: Span }
228
235
  | { kind: 'for_range'; varName: string; start: Expr; end: Expr; body: Block; span?: Span }
229
236
  | { kind: 'match'; expr: Expr; arms: { pattern: Expr | null; body: Block }[]; span?: Span }
237
+ | { kind: 'if_let_some'; binding: string; init: Expr; then: Block; else_?: Block; span?: Span }
230
238
  | { kind: 'as_block'; selector: EntitySelector; body: Block; span?: Span }
231
239
  | { kind: 'at_block'; selector: EntitySelector; body: Block; span?: Span }
232
240
  | { kind: 'as_at'; as_sel: EntitySelector; at_sel: EntitySelector; body: Block; span?: Span }
@@ -240,7 +248,7 @@ export type Block = Stmt[]
240
248
  // ---------------------------------------------------------------------------
241
249
 
242
250
  export interface Decorator {
243
- name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load'
251
+ name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule'
244
252
  args?: {
245
253
  rate?: number
246
254
  eventType?: string
@@ -248,6 +256,9 @@ export interface Decorator {
248
256
  advancement?: string
249
257
  item?: string
250
258
  team?: string
259
+ batch?: number
260
+ onDone?: string
261
+ ticks?: number
251
262
  }
252
263
  /** Raw positional arguments (used by @requires and future generic decorators). */
253
264
  rawArgs?: Array<{ kind: 'string'; value: string } | { kind: 'number'; value: number }>
@@ -268,7 +279,11 @@ export interface FnDecl {
268
279
  * Library functions are NOT MC entry points — DCE only keeps them if they
269
280
  * are reachable from a non-library (user) entry point. */
270
281
  isLibraryFn?: boolean
282
+ /** True when declared with `export fn` or `@keep fn` — survives DCE. */
283
+ isExported?: boolean
271
284
  name: string
285
+ /** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
286
+ typeParams?: string[]
272
287
  params: Param[]
273
288
  returnType: TypeNode
274
289
  decorators: Decorator[]
@@ -325,18 +340,34 @@ export interface GlobalDecl {
325
340
  span?: Span
326
341
  }
327
342
 
343
+ // ---------------------------------------------------------------------------
344
+ // Import Declarations (Phase 5b module system)
345
+ // ---------------------------------------------------------------------------
346
+
347
+ export interface ImportDecl {
348
+ /** The module being imported from, e.g. "math" in `import math::sin` */
349
+ moduleName: string
350
+ /** The symbol being imported, or '*' for wildcard */
351
+ symbol: string // '*' | identifier
352
+ span?: Span
353
+ }
354
+
328
355
  // ---------------------------------------------------------------------------
329
356
  // Program (Top-Level)
330
357
  // ---------------------------------------------------------------------------
331
358
 
332
359
  export interface Program {
333
360
  namespace: string // Inferred from filename or `namespace mypack;`
361
+ /** Module name declared with `module <name>;` (undefined if no module decl) */
362
+ moduleName?: string
334
363
  globals: GlobalDecl[]
335
364
  declarations: FnDecl[]
336
365
  structs: StructDecl[]
337
366
  implBlocks: ImplBlock[]
338
367
  enums: EnumDecl[]
339
368
  consts: ConstDecl[]
369
+ /** Phase 5b: module imports (`import math::sin;`) */
370
+ imports: ImportDecl[]
340
371
  /** True when the source file declares `module library;`.
341
372
  * Library-mode: all functions are DCE-eligible by default — none are treated
342
373
  * as MC entry points unless they carry @tick / @load / @on / @keep etc. */
@@ -0,0 +1,132 @@
1
+ /**
2
+ * DependencyGraph — tracks import relationships between .mcrs files.
3
+ *
4
+ * Builds a forward dependency map (file → files it imports) and supports
5
+ * reverse lookups (file → files that depend on it) for change propagation.
6
+ */
7
+
8
+ import * as fs from 'fs'
9
+ import * as path from 'path'
10
+
11
+ const IMPORT_RE = /^\s*import\s+"([^"]+)"\s*;?\s*$/
12
+
13
+ /**
14
+ * Parse import statements from a source file's content.
15
+ * Returns absolute paths of imported files.
16
+ */
17
+ export function parseImports(filePath: string, source?: string): string[] {
18
+ const absPath = path.resolve(filePath)
19
+ const content = source ?? fs.readFileSync(absPath, 'utf-8')
20
+ const dir = path.dirname(absPath)
21
+ const imports: string[] = []
22
+
23
+ for (const line of content.split('\n')) {
24
+ const trimmed = line.trim()
25
+ // Stop at first non-comment, non-blank, non-import line
26
+ if (!trimmed || trimmed.startsWith('//')) continue
27
+ const match = trimmed.match(IMPORT_RE)
28
+ if (match) {
29
+ imports.push(path.resolve(dir, match[1]))
30
+ } else {
31
+ // Past the import header
32
+ break
33
+ }
34
+ }
35
+
36
+ return imports
37
+ }
38
+
39
+ export class DependencyGraph {
40
+ /** Forward edges: file → set of files it imports */
41
+ private deps = new Map<string, Set<string>>()
42
+
43
+ /** Add a file and its direct imports to the graph. */
44
+ addFile(filePath: string, source?: string): void {
45
+ const absPath = path.resolve(filePath)
46
+ const imports = parseImports(absPath, source)
47
+ this.deps.set(absPath, new Set(imports))
48
+ }
49
+
50
+ /** Remove a file from the graph. */
51
+ removeFile(filePath: string): void {
52
+ this.deps.delete(path.resolve(filePath))
53
+ }
54
+
55
+ /** Get direct imports of a file. */
56
+ getDirectDeps(filePath: string): Set<string> {
57
+ return this.deps.get(path.resolve(filePath)) ?? new Set()
58
+ }
59
+
60
+ /**
61
+ * Get transitive dependencies of a file (all files it depends on,
62
+ * directly or indirectly).
63
+ */
64
+ getTransitiveDeps(filePath: string): Set<string> {
65
+ const absPath = path.resolve(filePath)
66
+ const result = new Set<string>()
67
+ const stack = [absPath]
68
+
69
+ while (stack.length > 0) {
70
+ const current = stack.pop()!
71
+ const directDeps = this.deps.get(current)
72
+ if (!directDeps) continue
73
+ for (const dep of directDeps) {
74
+ if (!result.has(dep)) {
75
+ result.add(dep)
76
+ stack.push(dep)
77
+ }
78
+ }
79
+ }
80
+
81
+ return result
82
+ }
83
+
84
+ /**
85
+ * Get reverse dependents: all files that (transitively) depend on the
86
+ * given file. Used for change propagation — when `filePath` changes,
87
+ * all returned files need recompilation.
88
+ */
89
+ getDependents(filePath: string): Set<string> {
90
+ const absPath = path.resolve(filePath)
91
+ const result = new Set<string>()
92
+ const stack = [absPath]
93
+
94
+ while (stack.length > 0) {
95
+ const current = stack.pop()!
96
+ for (const [file, deps] of this.deps) {
97
+ if (deps.has(current) && !result.has(file)) {
98
+ result.add(file)
99
+ stack.push(file)
100
+ }
101
+ }
102
+ }
103
+
104
+ return result
105
+ }
106
+
107
+ /**
108
+ * Given a set of changed files, compute the full set of dirty files
109
+ * (changed files + all their reverse dependents).
110
+ */
111
+ computeDirtySet(changedFiles: Set<string>): Set<string> {
112
+ const dirty = new Set<string>()
113
+ for (const file of changedFiles) {
114
+ const absFile = path.resolve(file)
115
+ dirty.add(absFile)
116
+ for (const dep of this.getDependents(absFile)) {
117
+ dirty.add(dep)
118
+ }
119
+ }
120
+ return dirty
121
+ }
122
+
123
+ /** Get all tracked files. */
124
+ getAllFiles(): string[] {
125
+ return [...this.deps.keys()]
126
+ }
127
+
128
+ /** Clear the graph. */
129
+ clear(): void {
130
+ this.deps.clear()
131
+ }
132
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Incremental compilation — only recompile files whose content (or
3
+ * dependencies) has changed since the last build.
4
+ */
5
+
6
+ import * as path from 'path'
7
+ import { compile, type CompileOptions, type CompileResult } from '../emit/compile'
8
+ import * as fs from 'fs'
9
+ import { FileCache } from './index'
10
+ import { DependencyGraph } from './deps'
11
+
12
+ export interface IncrementalOptions {
13
+ namespace?: string
14
+ /** Output directory for compiled files. */
15
+ output: string
16
+ }
17
+
18
+ export interface IncrementalResult {
19
+ /** Number of files that were recompiled. */
20
+ recompiled: number
21
+ /** Number of files that used the cache (skipped). */
22
+ cached: number
23
+ /** Files that had errors (path → error message). */
24
+ errors: Map<string, string>
25
+ /** Per-file compile results (only for recompiled files). */
26
+ results: Map<string, CompileResult>
27
+ }
28
+
29
+ /** Cached compilation output per entry file. */
30
+ interface CompileCacheEntry {
31
+ result: CompileResult
32
+ /** Content hashes of entry file + all its transitive deps at compile time. */
33
+ depHashes: Map<string, string>
34
+ }
35
+
36
+ const compiledCache = new Map<string, CompileCacheEntry>()
37
+
38
+ /**
39
+ * Compile a set of entry files incrementally.
40
+ *
41
+ * For each file:
42
+ * - Compute content hash of the file and all its transitive imports
43
+ * - If all hashes match the previous build → skip (cache hit)
44
+ * - If any hash changed → recompile from scratch
45
+ */
46
+ export function compileIncremental(
47
+ files: string[],
48
+ cache: FileCache,
49
+ depGraph: DependencyGraph,
50
+ options: IncrementalOptions,
51
+ ): IncrementalResult {
52
+ const result: IncrementalResult = {
53
+ recompiled: 0,
54
+ cached: 0,
55
+ errors: new Map(),
56
+ results: new Map(),
57
+ }
58
+
59
+ // Phase 1: Update dependency graph for all files
60
+ for (const file of files) {
61
+ const absFile = path.resolve(file)
62
+ try {
63
+ const source = fs.readFileSync(absFile, 'utf-8')
64
+ depGraph.addFile(absFile, source)
65
+ } catch {
66
+ // File might have been deleted
67
+ depGraph.removeFile(absFile)
68
+ }
69
+ }
70
+
71
+ // Phase 2: Detect all changed source files BEFORE recompiling anything.
72
+ // This prevents cache.update() during one file's recompile from hiding
73
+ // changes needed by another file that shares the same dependency.
74
+ const changedSourceFiles = new Set<string>()
75
+ const allSourceFiles = new Set<string>()
76
+
77
+ for (const file of files) {
78
+ const absFile = path.resolve(file)
79
+ const allDeps = depGraph.getTransitiveDeps(absFile)
80
+ allSourceFiles.add(absFile)
81
+ for (const dep of allDeps) allSourceFiles.add(dep)
82
+ }
83
+
84
+ for (const sourceFile of allSourceFiles) {
85
+ if (cache.hasChanged(sourceFile)) {
86
+ changedSourceFiles.add(sourceFile)
87
+ }
88
+ }
89
+
90
+ // Phase 3: For each entry file, check if it or any dep changed → recompile
91
+ for (const file of files) {
92
+ const absFile = path.resolve(file)
93
+
94
+ // Collect all files in this compilation unit (entry + transitive deps)
95
+ const allDeps = depGraph.getTransitiveDeps(absFile)
96
+ const unitFiles = [absFile, ...allDeps]
97
+
98
+ // Check if any file in the unit has changed
99
+ let needsRecompile = false
100
+ const prevEntry = compiledCache.get(absFile)
101
+
102
+ if (!prevEntry) {
103
+ needsRecompile = true
104
+ } else {
105
+ for (const unitFile of unitFiles) {
106
+ if (changedSourceFiles.has(unitFile)) {
107
+ needsRecompile = true
108
+ break
109
+ }
110
+ }
111
+ // Also check if the set of dependencies changed
112
+ if (!needsRecompile && prevEntry.depHashes.size !== unitFiles.length) {
113
+ needsRecompile = true
114
+ }
115
+ }
116
+
117
+ if (!needsRecompile) {
118
+ // Cache hit — write cached result to output
119
+ const cached = compiledCache.get(absFile)!
120
+ writeBuildOutput(cached.result, options.output)
121
+ result.cached++
122
+ continue
123
+ }
124
+
125
+ // Cache miss — recompile
126
+ try {
127
+ const source = fs.readFileSync(absFile, 'utf-8')
128
+ const ns = options.namespace ?? deriveNamespace(absFile)
129
+ const compileResult = compile(source, { namespace: ns, filePath: absFile })
130
+
131
+ // Update caches
132
+ const depHashes = new Map<string, string>()
133
+ for (const unitFile of unitFiles) {
134
+ cache.update(unitFile)
135
+ const entry = cache.get(unitFile)
136
+ if (entry) depHashes.set(unitFile, entry.hash)
137
+ }
138
+
139
+ compiledCache.set(absFile, { result: compileResult, depHashes })
140
+ writeBuildOutput(compileResult, options.output)
141
+
142
+ result.recompiled++
143
+ result.results.set(absFile, compileResult)
144
+ } catch (err) {
145
+ result.errors.set(absFile, (err as Error).message)
146
+ }
147
+ }
148
+
149
+ return result
150
+ }
151
+
152
+ /** Write compile output files to the output directory. */
153
+ function writeBuildOutput(compileResult: CompileResult, output: string): void {
154
+ fs.mkdirSync(output, { recursive: true })
155
+ for (const dataFile of compileResult.files) {
156
+ const filePath = path.join(output, dataFile.path)
157
+ const dir = path.dirname(filePath)
158
+ fs.mkdirSync(dir, { recursive: true })
159
+ fs.writeFileSync(filePath, dataFile.content)
160
+ }
161
+ }
162
+
163
+ function deriveNamespace(filePath: string): string {
164
+ const basename = path.basename(filePath, path.extname(filePath))
165
+ return basename.toLowerCase().replace(/[^a-z0-9]/g, '_')
166
+ }
167
+
168
+ /**
169
+ * Reset the in-memory compile cache. Useful for testing.
170
+ */
171
+ export function resetCompileCache(): void {
172
+ compiledCache.clear()
173
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * FileCache — content-hash-based compilation cache for incremental builds.
3
+ *
4
+ * Stores per-file content hashes and optional cached HIR modules.
5
+ * Persists to `.redscript-cache/` as JSON.
6
+ */
7
+
8
+ import * as fs from 'fs'
9
+ import * as path from 'path'
10
+ import * as crypto from 'crypto'
11
+ import type { HIRModule } from '../hir/types'
12
+
13
+ export interface CacheEntry {
14
+ hash: string
15
+ mtime: number
16
+ hir?: HIRModule
17
+ }
18
+
19
+ interface SerializedCache {
20
+ version: 1
21
+ entries: Record<string, { hash: string; mtime: number }>
22
+ }
23
+
24
+ export class FileCache {
25
+ private entries = new Map<string, CacheEntry>()
26
+ private cacheDir: string
27
+
28
+ constructor(cacheDir: string) {
29
+ this.cacheDir = cacheDir
30
+ }
31
+
32
+ /** Get cached entry for a file (by absolute path). */
33
+ get(filePath: string): CacheEntry | undefined {
34
+ return this.entries.get(path.resolve(filePath))
35
+ }
36
+
37
+ /** Set cache entry for a file. */
38
+ set(filePath: string, entry: CacheEntry): void {
39
+ this.entries.set(path.resolve(filePath), entry)
40
+ }
41
+
42
+ /** Check if a file's content has changed since last cache. */
43
+ hasChanged(filePath: string): boolean {
44
+ const absPath = path.resolve(filePath)
45
+ const cached = this.entries.get(absPath)
46
+ if (!cached) return true
47
+
48
+ // Quick mtime check first
49
+ try {
50
+ const stat = fs.statSync(absPath)
51
+ if (stat.mtimeMs === cached.mtime) return false
52
+ } catch {
53
+ return true
54
+ }
55
+
56
+ // mtime changed — compare content hash
57
+ const currentHash = hashFile(absPath)
58
+ return currentHash !== cached.hash
59
+ }
60
+
61
+ /** Update the cache entry for a file from disk. Returns true if content changed. */
62
+ update(filePath: string, hir?: HIRModule): boolean {
63
+ const absPath = path.resolve(filePath)
64
+ const changed = this.hasChanged(absPath)
65
+
66
+ if (changed) {
67
+ try {
68
+ const stat = fs.statSync(absPath)
69
+ this.entries.set(absPath, {
70
+ hash: hashFile(absPath),
71
+ mtime: stat.mtimeMs,
72
+ hir,
73
+ })
74
+ } catch {
75
+ this.entries.delete(absPath)
76
+ }
77
+ } else if (hir) {
78
+ // Update HIR even if hash didn't change
79
+ const entry = this.entries.get(absPath)
80
+ if (entry) entry.hir = hir
81
+ }
82
+
83
+ return changed
84
+ }
85
+
86
+ /** Remove a file from the cache. */
87
+ delete(filePath: string): void {
88
+ this.entries.delete(path.resolve(filePath))
89
+ }
90
+
91
+ /** Clear all cache entries. */
92
+ clear(): void {
93
+ this.entries.clear()
94
+ }
95
+
96
+ /** Number of cached entries. */
97
+ get size(): number {
98
+ return this.entries.size
99
+ }
100
+
101
+ /** Persist cache to disk (`.redscript-cache/cache.json`). */
102
+ save(): void {
103
+ fs.mkdirSync(this.cacheDir, { recursive: true })
104
+ const serialized: SerializedCache = {
105
+ version: 1,
106
+ entries: {},
107
+ }
108
+ for (const [filePath, entry] of this.entries) {
109
+ // Don't persist HIR — it contains non-serializable references
110
+ serialized.entries[filePath] = { hash: entry.hash, mtime: entry.mtime }
111
+ }
112
+ const cachePath = path.join(this.cacheDir, 'cache.json')
113
+ fs.writeFileSync(cachePath, JSON.stringify(serialized, null, 2))
114
+ }
115
+
116
+ /** Load cache from disk. */
117
+ load(): void {
118
+ const cachePath = path.join(this.cacheDir, 'cache.json')
119
+ try {
120
+ const data = JSON.parse(fs.readFileSync(cachePath, 'utf-8')) as SerializedCache
121
+ if (data.version !== 1) return
122
+ for (const [filePath, entry] of Object.entries(data.entries)) {
123
+ this.entries.set(filePath, { hash: entry.hash, mtime: entry.mtime })
124
+ }
125
+ } catch {
126
+ // No cache or corrupt — start fresh
127
+ }
128
+ }
129
+ }
130
+
131
+ /** SHA-256 hash of a file's content. */
132
+ export function hashFile(filePath: string): string {
133
+ const content = fs.readFileSync(filePath)
134
+ return crypto.createHash('sha256').update(content).digest('hex')
135
+ }