redscript-mc 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (643) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +48 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +321 -0
  22. package/dist/src/__tests__/mc-syntax.test.js +1 -6
  23. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  24. package/dist/src/__tests__/mc-version.test.js +154 -0
  25. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  26. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  27. package/dist/src/__tests__/modules.test.d.ts +7 -0
  28. package/dist/src/__tests__/modules.test.js +333 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  30. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  31. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  32. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  33. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  34. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  35. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  36. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  37. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  38. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  39. package/dist/src/__tests__/option.test.d.ts +14 -0
  40. package/dist/src/__tests__/option.test.js +275 -0
  41. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  42. package/dist/src/__tests__/schedule.test.js +98 -0
  43. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  44. package/dist/src/__tests__/sourcemap.test.js +227 -0
  45. package/dist/src/__tests__/stdlib-include.test.js +86 -0
  46. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  47. package/dist/src/__tests__/tuple.test.js +202 -0
  48. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  49. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  50. package/dist/src/ast/types.d.ts +56 -2
  51. package/dist/src/cache/deps.d.ts +41 -0
  52. package/dist/src/cache/deps.js +158 -0
  53. package/dist/src/cache/incremental.d.ts +35 -0
  54. package/dist/src/cache/incremental.js +165 -0
  55. package/dist/src/cache/index.d.ts +37 -0
  56. package/dist/src/cache/index.js +152 -0
  57. package/dist/src/cli.js +83 -45
  58. package/dist/src/compile.d.ts +3 -2
  59. package/dist/src/compile.js +34 -11
  60. package/dist/src/diagnostics/index.d.ts +1 -1
  61. package/dist/src/diagnostics/index.js +8 -11
  62. package/dist/src/emit/compile.d.ts +31 -0
  63. package/dist/src/emit/compile.js +143 -0
  64. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  65. package/dist/{src2 → src}/emit/index.js +59 -8
  66. package/dist/src/emit/modules.d.ts +29 -0
  67. package/dist/src/emit/modules.js +492 -0
  68. package/dist/src/emit/sourcemap.d.ts +53 -0
  69. package/dist/src/emit/sourcemap.js +73 -0
  70. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  71. package/dist/{src2 → src}/hir/lower.js +22 -1
  72. package/dist/src/hir/monomorphize.d.ts +22 -0
  73. package/dist/src/hir/monomorphize.js +379 -0
  74. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  75. package/dist/src/index.d.ts +19 -2
  76. package/dist/src/index.js +36 -14
  77. package/dist/src/lexer/index.d.ts +1 -1
  78. package/dist/src/lexer/index.js +1 -0
  79. package/dist/src/lir/budget.d.ts +37 -0
  80. package/dist/src/lir/budget.js +280 -0
  81. package/dist/{src2 → src}/lir/lower.js +19 -0
  82. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  83. package/dist/src/lsp/main.d.ts +8 -0
  84. package/dist/src/lsp/main.js +11 -0
  85. package/dist/src/lsp/server.d.ts +11 -0
  86. package/dist/src/lsp/server.js +403 -0
  87. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  88. package/dist/{src2 → src}/mir/lower.js +244 -10
  89. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  90. package/dist/src/optimizer/coroutine.d.ts +34 -0
  91. package/dist/src/optimizer/coroutine.js +789 -0
  92. package/dist/src/optimizer/dce.d.ts +8 -34
  93. package/dist/src/optimizer/dce.js +146 -629
  94. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  95. package/dist/src/optimizer/interprocedural.js +186 -0
  96. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  97. package/dist/src/optimizer/lir/const_imm.js +139 -0
  98. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  99. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  100. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  101. package/dist/src/optimizer/lir/peephole.js +52 -0
  102. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  103. package/dist/src/optimizer/lir/pipeline.js +34 -0
  104. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  105. package/dist/src/optimizer/nbt-batch.js +51 -0
  106. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  107. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  108. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  109. package/dist/src/optimizer/selector-cache.js +100 -0
  110. package/dist/src/optimizer/unroll.d.ts +32 -0
  111. package/dist/src/optimizer/unroll.js +348 -0
  112. package/dist/src/parser/index.d.ts +8 -0
  113. package/dist/src/parser/index.js +204 -14
  114. package/dist/src/repl.d.ts +1 -1
  115. package/dist/src/typechecker/index.d.ts +4 -0
  116. package/dist/src/typechecker/index.js +198 -13
  117. package/dist/src/types/mc-version.d.ts +24 -0
  118. package/dist/src/types/mc-version.js +49 -0
  119. package/docs/ROADMAP.md +395 -0
  120. package/docs/compiler-pipeline-redesign.md +27 -10
  121. package/editors/vscode/out/extension.js +25176 -8000
  122. package/editors/vscode/package-lock.json +90 -6
  123. package/editors/vscode/package.json +3 -2
  124. package/editors/vscode/src/extension.ts +97 -67
  125. package/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
  126. package/examples/coroutine-demo.mcrs +50 -0
  127. package/examples/enum-demo.mcrs +95 -0
  128. package/examples/scheduler-demo.mcrs +59 -0
  129. package/examples/showcase.mcrs +3 -3
  130. package/jest.config.js +1 -1
  131. package/package.json +9 -3
  132. package/src/__tests__/budget.test.ts +297 -0
  133. package/src/__tests__/diagnostics.test.ts +2 -3
  134. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  135. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  136. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  137. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  138. package/src/__tests__/enum.test.ts +425 -0
  139. package/src/__tests__/generics.test.ts +390 -0
  140. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  141. package/src/__tests__/incremental.test.ts +337 -0
  142. package/src/__tests__/lsp.test.ts +359 -0
  143. package/src/__tests__/mc-syntax.test.ts +1 -7
  144. package/src/__tests__/mc-version.test.ts +178 -0
  145. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  146. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  147. package/src/__tests__/modules.test.ts +365 -0
  148. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  149. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  150. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  151. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  152. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  153. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  154. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  155. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  156. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  157. package/src/__tests__/option.test.ts +299 -0
  158. package/src/__tests__/schedule.test.ts +105 -0
  159. package/src/__tests__/sourcemap.test.ts +254 -0
  160. package/src/__tests__/stdlib-include.test.ts +61 -0
  161. package/src/__tests__/tuple.test.ts +220 -0
  162. package/src/__tests__/typechecker-strict.test.ts +216 -0
  163. package/src/ast/types.ts +33 -2
  164. package/src/cache/deps.ts +132 -0
  165. package/src/cache/incremental.ts +173 -0
  166. package/src/cache/index.ts +135 -0
  167. package/src/cli.ts +96 -45
  168. package/src/compile.ts +46 -17
  169. package/src/diagnostics/index.ts +8 -11
  170. package/src/emit/compile.ts +179 -0
  171. package/{src2 → src}/emit/index.ts +72 -8
  172. package/src/emit/modules.ts +581 -0
  173. package/src/emit/sourcemap.ts +101 -0
  174. package/{src2 → src}/hir/lower.ts +29 -2
  175. package/src/hir/monomorphize.ts +416 -0
  176. package/{src2 → src}/hir/types.ts +15 -3
  177. package/src/index.ts +29 -10
  178. package/src/lexer/index.ts +2 -1
  179. package/src/lir/budget.ts +321 -0
  180. package/{src2 → src}/lir/lower.ts +32 -1
  181. package/{src2 → src}/lir/types.ts +7 -3
  182. package/src/lsp/main.ts +9 -0
  183. package/src/lsp/server.ts +469 -0
  184. package/{src2 → src}/mir/lower.ts +251 -8
  185. package/{src2 → src}/mir/types.ts +12 -1
  186. package/src/optimizer/coroutine.ts +996 -0
  187. package/{src2 → src}/optimizer/dce.ts +2 -1
  188. package/src/optimizer/interprocedural.ts +177 -0
  189. package/src/optimizer/lir/const_imm.ts +143 -0
  190. package/src/optimizer/lir/dead_slot.ts +123 -0
  191. package/src/optimizer/lir/peephole.ts +57 -0
  192. package/src/optimizer/lir/pipeline.ts +37 -0
  193. package/src/optimizer/nbt-batch.ts +50 -0
  194. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  195. package/src/optimizer/selector-cache.ts +103 -0
  196. package/src/optimizer/unroll.ts +386 -0
  197. package/src/parser/index.ts +212 -15
  198. package/src/repl.ts +1 -1
  199. package/src/stdlib/math.mcrs +4 -4
  200. package/src/templates/quest.mcrs +4 -4
  201. package/src/typechecker/index.ts +215 -15
  202. package/src/types/mc-version.ts +46 -0
  203. package/tsconfig.json +1 -1
  204. package/.claude/commands/build-test.md +0 -10
  205. package/.claude/commands/deploy-demo.md +0 -12
  206. package/.claude/commands/stage-status.md +0 -13
  207. package/.claude/settings.json +0 -12
  208. package/CLAUDE.md +0 -231
  209. package/dist/__tests__/cli.test.js +0 -278
  210. package/dist/__tests__/codegen.test.js +0 -152
  211. package/dist/__tests__/compile-all.test.d.ts +0 -10
  212. package/dist/__tests__/compile-all.test.js +0 -108
  213. package/dist/__tests__/dce.test.js +0 -138
  214. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  215. package/dist/__tests__/diagnostics.test.js +0 -149
  216. package/dist/__tests__/e2e.test.d.ts +0 -6
  217. package/dist/__tests__/e2e.test.js +0 -1847
  218. package/dist/__tests__/entity-types.test.js +0 -203
  219. package/dist/__tests__/formatter.test.js +0 -40
  220. package/dist/__tests__/lexer.test.js +0 -343
  221. package/dist/__tests__/lowering.test.js +0 -1015
  222. package/dist/__tests__/macro.test.d.ts +0 -8
  223. package/dist/__tests__/macro.test.js +0 -305
  224. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  225. package/dist/__tests__/mc-integration.test.js +0 -819
  226. package/dist/__tests__/mc-syntax.test.js +0 -124
  227. package/dist/__tests__/nbt.test.js +0 -82
  228. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  229. package/dist/__tests__/optimizer.test.js +0 -149
  230. package/dist/__tests__/parser.test.d.ts +0 -1
  231. package/dist/__tests__/parser.test.js +0 -807
  232. package/dist/__tests__/repl.test.d.ts +0 -1
  233. package/dist/__tests__/repl.test.js +0 -27
  234. package/dist/__tests__/runtime.test.d.ts +0 -1
  235. package/dist/__tests__/runtime.test.js +0 -289
  236. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  237. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  238. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  239. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  240. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  241. package/dist/__tests__/stdlib-math.test.js +0 -352
  242. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  243. package/dist/__tests__/stdlib-vec.test.js +0 -264
  244. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  245. package/dist/__tests__/structure-optimizer.test.js +0 -33
  246. package/dist/__tests__/typechecker.test.d.ts +0 -1
  247. package/dist/__tests__/typechecker.test.js +0 -552
  248. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  249. package/dist/__tests__/var-allocator.test.js +0 -69
  250. package/dist/ast/types.d.ts +0 -514
  251. package/dist/ast/types.js +0 -9
  252. package/dist/builtins/metadata.d.ts +0 -36
  253. package/dist/builtins/metadata.js +0 -1014
  254. package/dist/cli.d.ts +0 -11
  255. package/dist/codegen/cmdblock/index.d.ts +0 -26
  256. package/dist/codegen/cmdblock/index.js +0 -45
  257. package/dist/codegen/mcfunction/index.d.ts +0 -40
  258. package/dist/codegen/mcfunction/index.js +0 -606
  259. package/dist/codegen/structure/index.d.ts +0 -24
  260. package/dist/codegen/structure/index.js +0 -279
  261. package/dist/codegen/var-allocator.d.ts +0 -45
  262. package/dist/codegen/var-allocator.js +0 -104
  263. package/dist/compile.d.ts +0 -68
  264. package/dist/data/arena/function/__load.mcfunction +0 -6
  265. package/dist/data/arena/function/__tick.mcfunction +0 -2
  266. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  267. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  268. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  269. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  270. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  271. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  272. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  273. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  274. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  275. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  276. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  277. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  278. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  279. package/dist/data/counter/function/__load.mcfunction +0 -5
  280. package/dist/data/counter/function/__tick.mcfunction +0 -2
  281. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  282. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  283. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  284. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  285. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  286. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  287. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  288. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  289. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  290. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  291. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  292. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  293. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  294. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  295. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  296. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  297. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  298. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  299. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  300. package/dist/data/gcd3/function/test.mcfunction +0 -7
  301. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  302. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  303. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  304. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  305. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  306. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  307. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  308. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  309. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  310. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  311. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  312. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  313. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  314. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  315. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  316. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  317. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  318. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  319. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  320. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  321. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  322. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  323. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  324. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  325. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  326. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  327. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  328. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  329. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  330. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  331. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  332. package/dist/data/mathtest/function/test.mcfunction +0 -5
  333. package/dist/data/minecraft/tags/function/load.json +0 -5
  334. package/dist/data/minecraft/tags/function/tick.json +0 -5
  335. package/dist/data/mypack/function/__load.mcfunction +0 -13
  336. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  337. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  338. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  339. package/dist/data/mypack/function/abs.mcfunction +0 -6
  340. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  341. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  342. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  343. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  346. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  347. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  348. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  352. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  353. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  354. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  357. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  358. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  359. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  360. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  361. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  365. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  366. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  367. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  368. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  369. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  370. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  371. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  372. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  373. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  374. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  375. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  376. package/dist/data/quiz/function/__load.mcfunction +0 -16
  377. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  378. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  379. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  380. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  381. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  382. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  383. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  384. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  386. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  387. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  388. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  389. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  390. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  391. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  392. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  393. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  394. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  395. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  396. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  397. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  398. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  399. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  400. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  402. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  403. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  404. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  405. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  406. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  407. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  408. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  409. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  410. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  411. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  412. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  413. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  414. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  415. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  416. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  417. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  418. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  419. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  420. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  421. package/dist/data/runtime/function/__load.mcfunction +0 -5
  422. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  423. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  424. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  425. package/dist/data/shop/function/__load.mcfunction +0 -7
  426. package/dist/data/shop/function/__tick.mcfunction +0 -3
  427. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  429. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  430. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  431. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  432. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  433. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  434. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  435. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  436. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  437. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  438. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  439. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  440. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  441. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  442. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  443. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  444. package/dist/data/turret/function/__load.mcfunction +0 -5
  445. package/dist/data/turret/function/__tick.mcfunction +0 -4
  446. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  447. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  448. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  449. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  450. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  451. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  452. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  453. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  454. package/dist/diagnostics/index.d.ts +0 -44
  455. package/dist/diagnostics/index.js +0 -140
  456. package/dist/events/types.d.ts +0 -35
  457. package/dist/events/types.js +0 -59
  458. package/dist/formatter/index.d.ts +0 -1
  459. package/dist/formatter/index.js +0 -26
  460. package/dist/gcd2.map.json +0 -15
  461. package/dist/gcd3.map.json +0 -17
  462. package/dist/gcd_test.map.json +0 -15
  463. package/dist/index.d.ts +0 -62
  464. package/dist/ir/builder.d.ts +0 -33
  465. package/dist/ir/builder.js +0 -99
  466. package/dist/ir/types.d.ts +0 -132
  467. package/dist/ir/types.js +0 -15
  468. package/dist/isqrttest.map.json +0 -15
  469. package/dist/lexer/index.d.ts +0 -37
  470. package/dist/lexer/index.js +0 -569
  471. package/dist/lowering/index.d.ts +0 -188
  472. package/dist/lowering/index.js +0 -3405
  473. package/dist/mathtest.map.json +0 -6
  474. package/dist/mc-test/client.d.ts +0 -128
  475. package/dist/mc-test/client.js +0 -174
  476. package/dist/mc-test/runner.d.ts +0 -28
  477. package/dist/mc-test/runner.js +0 -150
  478. package/dist/mc-test/setup.d.ts +0 -11
  479. package/dist/mc-test/setup.js +0 -98
  480. package/dist/mc-validator/index.d.ts +0 -17
  481. package/dist/mc-validator/index.js +0 -322
  482. package/dist/mypack.map.json +0 -27
  483. package/dist/nbt/index.d.ts +0 -86
  484. package/dist/nbt/index.js +0 -250
  485. package/dist/optimizer/commands.d.ts +0 -38
  486. package/dist/optimizer/commands.js +0 -451
  487. package/dist/optimizer/dce.d.ts +0 -34
  488. package/dist/optimizer/dce.js +0 -639
  489. package/dist/optimizer/passes.d.ts +0 -34
  490. package/dist/optimizer/passes.js +0 -243
  491. package/dist/optimizer/structure.d.ts +0 -9
  492. package/dist/optimizer/structure.js +0 -356
  493. package/dist/pack.mcmeta +0 -6
  494. package/dist/parser/index.d.ts +0 -93
  495. package/dist/parser/index.js +0 -1687
  496. package/dist/repl.d.ts +0 -16
  497. package/dist/repl.js +0 -165
  498. package/dist/reqtest.map.json +0 -4
  499. package/dist/reqtest2.map.json +0 -4
  500. package/dist/runtime/index.d.ts +0 -107
  501. package/dist/runtime/index.js +0 -1409
  502. package/dist/runtime.map.json +0 -7
  503. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  504. package/dist/src/__tests__/codegen.test.js +0 -152
  505. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  506. package/dist/src/__tests__/e2e.test.js +0 -1789
  507. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  508. package/dist/src/__tests__/entity-types.test.js +0 -203
  509. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  510. package/dist/src/__tests__/lowering.test.js +0 -1015
  511. package/dist/src/__tests__/macro.test.d.ts +0 -8
  512. package/dist/src/__tests__/macro.test.js +0 -306
  513. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  514. package/dist/src/__tests__/nbt.test.js +0 -82
  515. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  516. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  517. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  518. package/dist/src/__tests__/optimizer.test.js +0 -149
  519. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  520. package/dist/src/__tests__/runtime.test.js +0 -289
  521. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  522. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  523. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  524. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  525. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  526. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  527. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  528. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  529. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  530. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  531. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  532. package/dist/src/__tests__/var-allocator.test.js +0 -69
  533. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  534. package/dist/src/codegen/cmdblock/index.js +0 -45
  535. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  536. package/dist/src/codegen/mcfunction/index.js +0 -606
  537. package/dist/src/codegen/structure/index.d.ts +0 -24
  538. package/dist/src/codegen/structure/index.js +0 -279
  539. package/dist/src/codegen/var-allocator.d.ts +0 -45
  540. package/dist/src/codegen/var-allocator.js +0 -104
  541. package/dist/src/ir/builder.d.ts +0 -33
  542. package/dist/src/ir/builder.js +0 -99
  543. package/dist/src/ir/types.d.ts +0 -132
  544. package/dist/src/ir/types.js +0 -15
  545. package/dist/src/lowering/index.d.ts +0 -188
  546. package/dist/src/lowering/index.js +0 -3405
  547. package/dist/src/optimizer/commands.d.ts +0 -38
  548. package/dist/src/optimizer/commands.js +0 -451
  549. package/dist/src/optimizer/passes.d.ts +0 -34
  550. package/dist/src/optimizer/passes.js +0 -243
  551. package/dist/src/optimizer/structure.d.ts +0 -9
  552. package/dist/src/optimizer/structure.js +0 -356
  553. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  554. package/dist/src2/emit/compile.d.ts +0 -19
  555. package/dist/src2/emit/compile.js +0 -80
  556. package/dist/src2/optimizer/dce.d.ts +0 -8
  557. package/dist/src2/optimizer/dce.js +0 -155
  558. package/dist/swap_test.map.json +0 -14
  559. package/dist/tsconfig.tsbuildinfo +0 -1
  560. package/dist/typechecker/index.d.ts +0 -61
  561. package/dist/typechecker/index.js +0 -1034
  562. package/dist/types/entity-hierarchy.d.ts +0 -29
  563. package/dist/types/entity-hierarchy.js +0 -107
  564. package/examples/spiral.mcrs +0 -43
  565. package/src/examples/arena.mcrs +0 -44
  566. package/src/examples/counter.mcrs +0 -12
  567. package/src/examples/new_features_demo.mcrs +0 -193
  568. package/src/examples/rpg.mcrs +0 -13
  569. package/src/examples/stdlib_demo.mcrs +0 -181
  570. package/src2/emit/compile.ts +0 -99
  571. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  572. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  576. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  578. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  579. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  580. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  581. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  582. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  583. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  584. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  585. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  586. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  587. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  588. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  589. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  590. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  592. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  593. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  594. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  595. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  596. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  597. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  598. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  599. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  600. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  601. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  602. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  603. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  604. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  605. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  606. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  607. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
  608. /package/dist/{src2 → src}/hir/types.js +0 -0
  609. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  610. /package/dist/{src2 → src}/lir/types.js +0 -0
  611. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  612. /package/dist/{src2 → src}/lir/verify.js +0 -0
  613. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  614. /package/dist/{src2 → src}/mir/macro.js +0 -0
  615. /package/dist/{src2 → src}/mir/types.js +0 -0
  616. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  617. /package/dist/{src2 → src}/mir/verify.js +0 -0
  618. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  619. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  620. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  621. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  622. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  623. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  624. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  625. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  626. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  627. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  628. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  629. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  630. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  631. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  632. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  633. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  634. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  635. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  636. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  637. /package/{src2 → src}/lir/verify.ts +0 -0
  638. /package/{src2 → src}/mir/macro.ts +0 -0
  639. /package/{src2 → src}/mir/verify.ts +0 -0
  640. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  641. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  642. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  643. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Phase 6b: TypeChecker strict (error-mode) tests
3
+ *
4
+ * Covers:
5
+ * - Type errors now block compilation (error-mode default)
6
+ * - --lenient flag demotes type errors to warnings
7
+ * - int/float implicit conversion detection
8
+ * - redscript check command correctly reports type errors
9
+ */
10
+
11
+ import { compile } from '../emit/compile'
12
+ import { Lexer } from '../lexer'
13
+ import { Parser } from '../parser'
14
+ import { TypeChecker } from '../typechecker'
15
+ import type { DiagnosticError } from '../diagnostics'
16
+
17
+ // Helper: run TypeChecker directly
18
+ function typeCheck(source: string): DiagnosticError[] {
19
+ const tokens = new Lexer(source).tokenize()
20
+ const ast = new Parser(tokens).parse('test')
21
+ const checker = new TypeChecker(source)
22
+ return checker.check(ast)
23
+ }
24
+
25
+ // Helper: compile in strict mode (default)
26
+ function compileStrict(source: string): void {
27
+ compile(source, { namespace: 'test' })
28
+ }
29
+
30
+ // Helper: compile in lenient mode
31
+ function compileLenient(source: string): { warnings: string[] } {
32
+ return compile(source, { namespace: 'test', lenient: true })
33
+ }
34
+
35
+ describe('TypeChecker error-mode (Phase 6b)', () => {
36
+ describe('type errors block compilation', () => {
37
+ it('throws on undeclared variable usage', () => {
38
+ expect(() => compileStrict(`
39
+ fn test() {
40
+ let x: int = undeclared;
41
+ }
42
+ `)).toThrow()
43
+ })
44
+
45
+ it('throws on return type mismatch', () => {
46
+ expect(() => compileStrict(`
47
+ fn get_bool() -> bool {
48
+ return 5;
49
+ }
50
+ `)).toThrow()
51
+ })
52
+
53
+ it('throws on wrong argument count', () => {
54
+ expect(() => compileStrict(`
55
+ fn add(a: int, b: int) -> int {
56
+ return a + b;
57
+ }
58
+ fn test() {
59
+ let x: int = add(1);
60
+ }
61
+ `)).toThrow()
62
+ })
63
+
64
+ it('does not throw for valid programs', () => {
65
+ expect(() => compileStrict(`
66
+ fn add(a: int, b: int) -> int {
67
+ return a + b;
68
+ }
69
+ fn test() {
70
+ let x: int = add(1, 2);
71
+ }
72
+ `)).not.toThrow()
73
+ })
74
+ })
75
+
76
+ describe('--lenient mode', () => {
77
+ it('does not throw on type errors in lenient mode', () => {
78
+ expect(() => compileLenient(`
79
+ fn test() {
80
+ let x: int = undeclared;
81
+ }
82
+ `)).not.toThrow()
83
+ })
84
+
85
+ it('returns type errors as warnings in lenient mode', () => {
86
+ const result = compileLenient(`
87
+ fn test() {
88
+ let x: int = undeclared;
89
+ }
90
+ `)
91
+ expect(result.warnings.length).toBeGreaterThan(0)
92
+ expect(result.warnings[0]).toContain('TypeError')
93
+ })
94
+
95
+ it('emits no warnings for valid programs in lenient mode', () => {
96
+ const result = compileLenient(`
97
+ fn test() {
98
+ let x: int = 5;
99
+ }
100
+ `)
101
+ expect(result.warnings).toHaveLength(0)
102
+ })
103
+ })
104
+
105
+ describe('int/float implicit conversion checks', () => {
106
+ it('detects int assigned to float variable', () => {
107
+ // int literal assigned to float — different types
108
+ const errors = typeCheck(`
109
+ fn test() {
110
+ let x: float = 5;
111
+ }
112
+ `)
113
+ expect(errors.length).toBeGreaterThan(0)
114
+ expect(errors[0].message).toContain('cannot implicitly convert int to float')
115
+ expect(errors[0].message).toContain('as float')
116
+ })
117
+
118
+ it('detects float assigned to int variable', () => {
119
+ const errors = typeCheck(`
120
+ fn get_f() -> float {
121
+ return 3.14;
122
+ }
123
+ fn test() {
124
+ let x: int = get_f();
125
+ }
126
+ `)
127
+ expect(errors.length).toBeGreaterThan(0)
128
+ expect(errors[0].message).toContain('cannot implicitly convert')
129
+ })
130
+
131
+ it('detects int/float return type mismatch', () => {
132
+ const errors = typeCheck(`
133
+ fn get_float() -> float {
134
+ return 5;
135
+ }
136
+ `)
137
+ expect(errors.length).toBeGreaterThan(0)
138
+ expect(errors[0].message).toContain('cannot implicitly convert int to float')
139
+ expect(errors[0].message).toContain('as float')
140
+ })
141
+
142
+ it('detects float/int return type mismatch', () => {
143
+ const errors = typeCheck(`
144
+ fn get_int() -> int {
145
+ return 3.14;
146
+ }
147
+ `)
148
+ expect(errors.length).toBeGreaterThan(0)
149
+ expect(errors[0].message).toContain('cannot implicitly convert float to int')
150
+ expect(errors[0].message).toContain('as int')
151
+ })
152
+
153
+ it('allows int assigned to int variable', () => {
154
+ const errors = typeCheck(`
155
+ fn test() {
156
+ let x: int = 5;
157
+ }
158
+ `)
159
+ expect(errors).toHaveLength(0)
160
+ })
161
+
162
+ it('allows float assigned to float variable', () => {
163
+ const errors = typeCheck(`
164
+ fn get_f() -> float {
165
+ return 3.14;
166
+ }
167
+ fn test() {
168
+ let x: float = get_f();
169
+ }
170
+ `)
171
+ expect(errors).toHaveLength(0)
172
+ })
173
+
174
+ it('blocks compilation on int→float mismatch', () => {
175
+ expect(() => compileStrict(`
176
+ fn get_float() -> float {
177
+ return 5;
178
+ }
179
+ `)).toThrow()
180
+ })
181
+
182
+ it('int→float mismatch demoted to warning in lenient mode', () => {
183
+ const result = compileLenient(`
184
+ fn get_float() -> float {
185
+ return 5;
186
+ }
187
+ `)
188
+ expect(result.warnings.length).toBeGreaterThan(0)
189
+ expect(result.warnings[0]).toContain('TypeError')
190
+ })
191
+ })
192
+
193
+ describe('redscript check command behavior', () => {
194
+ it('TypeChecker check() returns errors for type mismatches', () => {
195
+ const errors = typeCheck(`
196
+ fn test() {
197
+ let x: int = undeclared;
198
+ let y: bool = 1;
199
+ }
200
+ `)
201
+ expect(errors.length).toBeGreaterThanOrEqual(1)
202
+ })
203
+
204
+ it('TypeChecker check() returns empty array for valid programs', () => {
205
+ const errors = typeCheck(`
206
+ struct Point { x: int, y: int }
207
+
208
+ fn test() {
209
+ let p: Point = { x: 10, y: 20 };
210
+ let val: int = p.x;
211
+ }
212
+ `)
213
+ expect(errors).toHaveLength(0)
214
+ })
215
+ })
216
+ })
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
+ }