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
package/.claudeignore ADDED
@@ -0,0 +1,21 @@
1
+ # Build artifacts
2
+ dist/
3
+ *.js.map
4
+
5
+ # Dependencies
6
+ node_modules/
7
+
8
+ # Lock files
9
+ package-lock.json
10
+
11
+ # Generated / large data
12
+ docs/mc-reference/
13
+
14
+ # Test snapshots (not useful for context)
15
+ **/__snapshots__/
16
+
17
+ # Editor
18
+ .vscode/
19
+ editors/vscode/node_modules/
20
+ editors/vscode/dist/
21
+ *.vsix
package/README.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  <img src="./logo.png" alt="RedScript Logo" width="64" />
4
4
 
5
- <img src="https://img.shields.io/badge/RedScript-1.2.29-red?style=for-the-badge&logo=minecraft&logoColor=white" alt="RedScript" />
5
+ <img src="https://img.shields.io/badge/RedScript-2.0.0-red?style=for-the-badge&logo=minecraft&logoColor=white" alt="RedScript" />
6
6
 
7
7
  **A typed scripting language that compiles to Minecraft datapacks.**
8
8
 
9
9
  Write clean game logic. RedScript handles the scoreboard spaghetti.
10
10
 
11
11
  [![CI](https://github.com/bkmashiro/redscript/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/bkmashiro/redscript/actions/workflows/ci.yml)
12
- [![Tests](https://img.shields.io/badge/tests-920%20passing-brightgreen)](https://github.com/bkmashiro/redscript)
12
+ [![Tests](https://img.shields.io/badge/tests-857%20passing-brightgreen)](https://github.com/bkmashiro/redscript)
13
13
  [![npm](https://img.shields.io/npm/v/redscript-mc?color=cb3837)](https://www.npmjs.com/package/redscript-mc)
14
14
  [![npm downloads](https://img.shields.io/npm/dm/redscript-mc?color=cb3837)](https://www.npmjs.com/package/redscript-mc)
15
15
  [![VSCode](https://img.shields.io/badge/VSCode-Extension-007ACC?logo=visualstudiocode)](https://marketplace.visualstudio.com/items?itemName=bkmashiro.redscript-vscode)
@@ -77,20 +77,16 @@ let frame: int = 0;
77
77
 
78
78
  ---
79
79
 
80
- ### What's New in v1.2.25
81
-
82
- - `impl` blocks and methods for object-style APIs on structs
83
- - `is` type narrowing for safer entity checks
84
- - Static events with `@on(Event)`
85
- - Runtime f-strings for `say`, `title`, `actionbar`, and related output
86
- - Timer OOP API with `Timer::new(...)` and instance methods
87
- - `setTimeout(...)` and `setInterval(...)` scheduling helpers
88
- - `break` / `continue`, match range patterns, and full `execute` subcommands
89
- - `foreach` execute context modifiers like `at`, `positioned`, and `rotated`
90
- - Automatic MC 1.20.2+ function macro support for runtime variables
91
- - Builtins now accept macro parameters in any position
92
- - Dead code elimination that preserves public functions automatically
93
- - 313 Minecraft tag constants in the standard library
80
+ ### What's New in v2.0.0
81
+
82
+ - New compiler pipeline: **AST HIR MIR → LIR → emit**
83
+ - New LIR optimizer passes (dead slot elimination + constant immediate folding)
84
+ - CLI `compile` now runs on the v2 pipeline by default
85
+ - `use "..."` import resolution fully supported in v2 (including library modules)
86
+ - Macro calls (`^var`/`~var`) supported end-to-end in v2 emitter
87
+ - Struct/impl lowering completed in v2 (field slots + method dispatch)
88
+ - Unified source tree: old `src2/` merged back into `src/`
89
+ - Published as **redscript-mc@2.0.0**
94
90
 
95
91
  ---
96
92
 
@@ -196,6 +192,22 @@ fn on_diamond() {
196
192
  fn on_death() {
197
193
  scoreboard_add(@s, #deaths, 1);
198
194
  }
195
+
196
+ // Delay execution by N ticks (20t = 1 second)
197
+ @schedule(ticks=20)
198
+ fn after_one_second(): void {
199
+ title(@a, "One second later!");
200
+ }
201
+
202
+ // Spread a heavy loop across multiple ticks (batch=N iterations/tick)
203
+ @coroutine(batch=50, onDone=all_done)
204
+ fn process_all(): void {
205
+ let i: int = 0;
206
+ while (i < 1000) {
207
+ // work spread over ~20 ticks instead of lagging one tick
208
+ i = i + 1;
209
+ }
210
+ }
199
211
  ```
200
212
 
201
213
  #### Control Flow
@@ -320,6 +332,26 @@ fn show_fib() {
320
332
 
321
333
  ---
322
334
 
335
+ ### Examples
336
+
337
+ The `examples/` directory contains ready-to-compile demos:
338
+
339
+ | File | What it shows |
340
+ |---|---|
341
+ | `readme-demo.mcrs` | Real-time sine wave particles — `@tick`, `foreach`, f-strings, math stdlib |
342
+ | `math-showcase.mcrs` | All stdlib math modules: trig, vectors, BigInt, fractals |
343
+ | `showcase.mcrs` | Full feature tour: structs, enums, `match`, lambdas, `@tick`/`@load` |
344
+ | `coroutine-demo.mcrs` | `@coroutine(batch=50)` — spread 1000 iterations across ~20 ticks |
345
+ | `enum-demo.mcrs` | Enum state machine: NPC AI cycling Idle → Moving → Attacking with `match` |
346
+ | `scheduler-demo.mcrs` | `@schedule(ticks=20)` — delayed events, chained schedules |
347
+
348
+ Compile any example:
349
+ ```bash
350
+ node dist/cli.js compile examples/coroutine-demo.mcrs -o ~/mc-server/datapacks/demo --namespace demo
351
+ ```
352
+
353
+ ---
354
+
323
355
  ### Further Reading
324
356
 
325
357
  | | |
package/README.zh.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  <img src="./logo.png" alt="RedScript Logo" width="64" />
4
4
 
5
- <img src="https://img.shields.io/badge/RedScript-1.2.29-red?style=for-the-badge&logo=minecraft&logoColor=white" alt="RedScript" />
5
+ <img src="https://img.shields.io/badge/RedScript-2.0.0-red?style=for-the-badge&logo=minecraft&logoColor=white" alt="RedScript" />
6
6
 
7
7
  **一个编译到 Minecraft Datapack 的类型化脚本语言。**
8
8
 
9
9
  写干净的游戏逻辑,把记分板的面条代码交给 RedScript 处理。
10
10
 
11
11
  [![CI](https://github.com/bkmashiro/redscript/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/bkmashiro/redscript/actions/workflows/ci.yml)
12
- [![Tests](https://img.shields.io/badge/tests-920%20passing-brightgreen)](https://github.com/bkmashiro/redscript)
12
+ [![Tests](https://img.shields.io/badge/tests-857%20passing-brightgreen)](https://github.com/bkmashiro/redscript)
13
13
  [![npm](https://img.shields.io/npm/v/redscript-mc?color=cb3837)](https://www.npmjs.com/package/redscript-mc)
14
14
  [![npm downloads](https://img.shields.io/npm/dm/redscript-mc?color=cb3837)](https://www.npmjs.com/package/redscript-mc)
15
15
  [![VSCode](https://img.shields.io/badge/VSCode-插件-007ACC?logo=visualstudiocode)](https://marketplace.visualstudio.com/items?itemName=bkmashiro.redscript-vscode)
package/dist/cli.js CHANGED
File without changes
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const budget_1 = require("../lir/budget");
4
+ const compile_1 = require("../emit/compile");
5
+ // ---------------------------------------------------------------------------
6
+ // Helpers
7
+ // ---------------------------------------------------------------------------
8
+ const NS = 'test';
9
+ const OBJ = '__test';
10
+ function slot(name) {
11
+ return { player: name, obj: OBJ };
12
+ }
13
+ function mkFn(name, instructions) {
14
+ return { name, instructions, isMacro: false, macroParams: [] };
15
+ }
16
+ function mkModule(functions) {
17
+ return { functions, namespace: NS, objective: OBJ };
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Unit tests: estimateCommandCount
21
+ // ---------------------------------------------------------------------------
22
+ describe('estimateCommandCount', () => {
23
+ test('flat function — counts each instruction as 1', () => {
24
+ const fn = mkFn('simple', [
25
+ { kind: 'score_set', dst: slot('$x'), value: 0 },
26
+ { kind: 'score_set', dst: slot('$y'), value: 1 },
27
+ { kind: 'score_add', dst: slot('$x'), src: slot('$y') },
28
+ ]);
29
+ const mod = mkModule([fn]);
30
+ expect((0, budget_1.estimateCommandCount)('simple', mod)).toBe(3);
31
+ });
32
+ test('function calling another — sums callee cost', () => {
33
+ const callee = mkFn('helper', [
34
+ { kind: 'score_set', dst: slot('$a'), value: 42 },
35
+ { kind: 'score_set', dst: slot('$b'), value: 43 },
36
+ ]);
37
+ const caller = mkFn('main', [
38
+ { kind: 'score_set', dst: slot('$x'), value: 0 },
39
+ { kind: 'call', fn: `${NS}:helper` },
40
+ ]);
41
+ const mod = mkModule([caller, callee]);
42
+ // caller: 2 instrs + callee: 2 instrs = 4
43
+ expect((0, budget_1.estimateCommandCount)('main', mod)).toBe(4);
44
+ });
45
+ test('self-recursive function (loop) — multiplies by estimated iterations', () => {
46
+ // Simulate a loop: header checks condition, calls body, body calls header
47
+ const header = mkFn('loop__header', [
48
+ { kind: 'call_if_matches', fn: `${NS}:loop__body`, slot: slot('$i'), range: '..99' },
49
+ ]);
50
+ const body = mkFn('loop__body', [
51
+ { kind: 'score_add', dst: slot('$i'), src: slot('$one') },
52
+ { kind: 'score_set', dst: slot('$tmp'), value: 1 },
53
+ { kind: 'call', fn: `${NS}:loop__header` },
54
+ ]);
55
+ const mod = mkModule([header, body]);
56
+ // Cycle: header(1) + body(3) = 4 cmds/iteration
57
+ // Range ..99 → 100 iterations
58
+ // Total: 4 × 100 = 400
59
+ expect((0, budget_1.estimateCommandCount)('loop__header', mod)).toBe(400);
60
+ });
61
+ test('unknown loop bound defaults to 100 iterations', () => {
62
+ const header = mkFn('loop__header', [
63
+ { kind: 'call_if_score', fn: `${NS}:loop__body`, a: slot('$i'), op: 'lt', b: slot('$limit') },
64
+ ]);
65
+ const body = mkFn('loop__body', [
66
+ { kind: 'score_add', dst: slot('$i'), src: slot('$one') },
67
+ { kind: 'call', fn: `${NS}:loop__header` },
68
+ ]);
69
+ const mod = mkModule([header, body]);
70
+ // Cycle: 1 + 2 = 3 cmds/iteration, 100 default iterations = 300
71
+ expect((0, budget_1.estimateCommandCount)('loop__header', mod)).toBe(300);
72
+ });
73
+ test('nested loops — outer × inner', () => {
74
+ // Inner loop: inner_header ↔ inner_body (5 cmds/iter, 10 iters)
75
+ const innerHeader = mkFn('inner__header', [
76
+ { kind: 'call_if_matches', fn: `${NS}:inner__body`, slot: slot('$j'), range: '..9' },
77
+ ]);
78
+ const innerBody = mkFn('inner__body', [
79
+ { kind: 'score_set', dst: slot('$a'), value: 1 },
80
+ { kind: 'score_set', dst: slot('$b'), value: 2 },
81
+ { kind: 'score_add', dst: slot('$j'), src: slot('$one') },
82
+ { kind: 'call', fn: `${NS}:inner__header` },
83
+ ]);
84
+ // Outer loop: outer_header ↔ outer_body (calls inner loop + own work)
85
+ const outerHeader = mkFn('outer__header', [
86
+ { kind: 'call_if_matches', fn: `${NS}:outer__body`, slot: slot('$i'), range: '..19' },
87
+ ]);
88
+ const outerBody = mkFn('outer__body', [
89
+ { kind: 'score_set', dst: slot('$j'), value: 0 },
90
+ { kind: 'call', fn: `${NS}:inner__header` },
91
+ { kind: 'score_add', dst: slot('$i'), src: slot('$one') },
92
+ { kind: 'call', fn: `${NS}:outer__header` },
93
+ ]);
94
+ const mod = mkModule([innerHeader, innerBody, outerHeader, outerBody]);
95
+ // Inner cycle: header(1) + body(4) = 5 cmds × 10 iters = 50
96
+ // Outer cycle local: header(1) + body(4) = 5 cmds
97
+ // Outer cycle external callee: inner = 50
98
+ // Outer total: (5 + 50) × 20 = 1100
99
+ expect((0, budget_1.estimateCommandCount)('outer__header', mod)).toBe(1100);
100
+ });
101
+ test('external call (not in module) contributes 0', () => {
102
+ const fn = mkFn('main', [
103
+ { kind: 'score_set', dst: slot('$x'), value: 0 },
104
+ { kind: 'call', fn: 'other_ns:external_fn' },
105
+ ]);
106
+ const mod = mkModule([fn]);
107
+ expect((0, budget_1.estimateCommandCount)('main', mod)).toBe(2);
108
+ });
109
+ });
110
+ // ---------------------------------------------------------------------------
111
+ // Unit tests: analyzeBudget
112
+ // ---------------------------------------------------------------------------
113
+ describe('analyzeBudget', () => {
114
+ test('small loop (100 iters × 5 cmds = 500) → no diagnostic', () => {
115
+ const header = mkFn('process', [
116
+ { kind: 'call_if_matches', fn: `${NS}:process__body`, slot: slot('$i'), range: '..99' },
117
+ ]);
118
+ const body = mkFn('process__body', [
119
+ { kind: 'score_set', dst: slot('$a'), value: 1 },
120
+ { kind: 'score_set', dst: slot('$b'), value: 2 },
121
+ { kind: 'score_add', dst: slot('$c'), src: slot('$a') },
122
+ { kind: 'call', fn: `${NS}:process` },
123
+ ]);
124
+ const mod = mkModule([header, body]);
125
+ const diags = (0, budget_1.analyzeBudget)(mod);
126
+ expect(diags).toEqual([]);
127
+ });
128
+ test('medium loop (1000 iters × 50 cmds = 50000) → warning', () => {
129
+ // Build a body with 48 instructions + 1 call back + header 1 = 50 per iter
130
+ const bodyInstrs = [];
131
+ for (let i = 0; i < 48; i++) {
132
+ bodyInstrs.push({ kind: 'score_set', dst: slot(`$v${i}`), value: i });
133
+ }
134
+ bodyInstrs.push({ kind: 'call', fn: `${NS}:bigloop` });
135
+ const header = mkFn('bigloop', [
136
+ { kind: 'call_if_matches', fn: `${NS}:bigloop__body`, slot: slot('$i'), range: '..999' },
137
+ ]);
138
+ const body = mkFn('bigloop__body', bodyInstrs);
139
+ const mod = mkModule([header, body]);
140
+ const diags = (0, budget_1.analyzeBudget)(mod);
141
+ expect(diags).toHaveLength(1);
142
+ expect(diags[0].level).toBe('warning');
143
+ expect(diags[0].fnName).toBe('bigloop');
144
+ expect(diags[0].estimatedCommands).toBe(50000);
145
+ expect(diags[0].message).toContain('consider @coroutine');
146
+ });
147
+ test('large loop (1000 iters × 100 cmds = 100000) → error', () => {
148
+ const bodyInstrs = [];
149
+ for (let i = 0; i < 98; i++) {
150
+ bodyInstrs.push({ kind: 'score_set', dst: slot(`$v${i}`), value: i });
151
+ }
152
+ bodyInstrs.push({ kind: 'call', fn: `${NS}:hugeloop` });
153
+ const header = mkFn('hugeloop', [
154
+ { kind: 'call_if_matches', fn: `${NS}:hugeloop__body`, slot: slot('$i'), range: '..999' },
155
+ ]);
156
+ const body = mkFn('hugeloop__body', bodyInstrs);
157
+ const mod = mkModule([header, body]);
158
+ const diags = (0, budget_1.analyzeBudget)(mod);
159
+ expect(diags).toHaveLength(1);
160
+ expect(diags[0].level).toBe('error');
161
+ expect(diags[0].fnName).toBe('hugeloop');
162
+ expect(diags[0].estimatedCommands).toBe(100000);
163
+ });
164
+ test('@coroutine function is skipped', () => {
165
+ const bodyInstrs = [];
166
+ for (let i = 0; i < 98; i++) {
167
+ bodyInstrs.push({ kind: 'score_set', dst: slot(`$v${i}`), value: i });
168
+ }
169
+ bodyInstrs.push({ kind: 'call', fn: `${NS}:bigfn` });
170
+ const header = mkFn('bigfn', [
171
+ { kind: 'call_if_matches', fn: `${NS}:bigfn__body`, slot: slot('$i'), range: '..999' },
172
+ ]);
173
+ const body = mkFn('bigfn__body', bodyInstrs);
174
+ const mod = mkModule([header, body]);
175
+ const diags = (0, budget_1.analyzeBudget)(mod, new Set(['bigfn']));
176
+ expect(diags).toEqual([]);
177
+ });
178
+ test('compiler-generated __helper functions are skipped', () => {
179
+ // Only top-level user functions are analyzed; __body etc are internal
180
+ const bodyInstrs = [];
181
+ for (let i = 0; i < 98; i++) {
182
+ bodyInstrs.push({ kind: 'score_set', dst: slot(`$v${i}`), value: i });
183
+ }
184
+ bodyInstrs.push({ kind: 'call', fn: `${NS}:fn__header` });
185
+ // Only fn__header and fn__body exist — both have __ so both skipped
186
+ const header = mkFn('fn__header', [
187
+ { kind: 'call_if_matches', fn: `${NS}:fn__body`, slot: slot('$i'), range: '..999' },
188
+ ]);
189
+ const body = mkFn('fn__body', bodyInstrs);
190
+ const mod = mkModule([header, body]);
191
+ const diags = (0, budget_1.analyzeBudget)(mod);
192
+ expect(diags).toEqual([]);
193
+ });
194
+ test('nested loop estimation is correct', () => {
195
+ // Inner: 5 cmds × 10 iters = 50
196
+ const innerHeader = mkFn('run__inner_header', [
197
+ { kind: 'call_if_matches', fn: `${NS}:run__inner_body`, slot: slot('$j'), range: '..9' },
198
+ ]);
199
+ const innerBody = mkFn('run__inner_body', [
200
+ { kind: 'score_set', dst: slot('$a'), value: 1 },
201
+ { kind: 'score_set', dst: slot('$b'), value: 2 },
202
+ { kind: 'score_add', dst: slot('$c'), src: slot('$a') },
203
+ { kind: 'call', fn: `${NS}:run__inner_header` },
204
+ ]);
205
+ // Outer: (5 + inner=50) × 20 = 1100
206
+ const outerHeader = mkFn('run__outer_header', [
207
+ { kind: 'call_if_matches', fn: `${NS}:run__outer_body`, slot: slot('$i'), range: '..19' },
208
+ ]);
209
+ const outerBody = mkFn('run__outer_body', [
210
+ { kind: 'score_set', dst: slot('$j'), value: 0 },
211
+ { kind: 'call', fn: `${NS}:run__inner_header` },
212
+ { kind: 'score_add', dst: slot('$i'), src: slot('$one') },
213
+ { kind: 'call', fn: `${NS}:run__outer_header` },
214
+ ]);
215
+ // The "root" user function that sets up the outer loop
216
+ const run = mkFn('run', [
217
+ { kind: 'score_set', dst: slot('$i'), value: 0 },
218
+ { kind: 'call', fn: `${NS}:run__outer_header` },
219
+ ]);
220
+ const mod = mkModule([run, innerHeader, innerBody, outerHeader, outerBody]);
221
+ const estimate = (0, budget_1.estimateCommandCount)('run', mod);
222
+ // run: 2 local + outer(1100) = 1102
223
+ expect(estimate).toBe(1102);
224
+ });
225
+ });
226
+ // ---------------------------------------------------------------------------
227
+ // E2E: compile pipeline integration
228
+ // ---------------------------------------------------------------------------
229
+ describe('budget analysis — compile pipeline integration', () => {
230
+ test('small loop produces no warning', () => {
231
+ const source = `
232
+ fn process(): void {
233
+ let i: int = 0;
234
+ while (i < 10) {
235
+ let x: int = i * 2;
236
+ i = i + 1;
237
+ }
238
+ }
239
+ `;
240
+ const result = (0, compile_1.compile)(source, { namespace: 'budgettest' });
241
+ expect(result.warnings).toEqual([]);
242
+ });
243
+ test('@coroutine function skips budget check', () => {
244
+ const source = `
245
+ @coroutine(batch=5)
246
+ fn process_all(): void {
247
+ let i: int = 0;
248
+ while (i < 10000) {
249
+ let x: int = i * 2;
250
+ i = i + 1;
251
+ }
252
+ }
253
+ `;
254
+ // Should not throw even with huge loop — @coroutine exempts it
255
+ const result = (0, compile_1.compile)(source, { namespace: 'budgettest' });
256
+ // No budget error/warning for coroutine functions
257
+ const budgetWarnings = result.warnings.filter(w => w.includes('tick budget'));
258
+ expect(budgetWarnings).toEqual([]);
259
+ });
260
+ });
261
+ //# sourceMappingURL=budget.test.js.map
@@ -15,16 +15,15 @@ describe('DiagnosticError', () => {
15
15
  ].join('\n');
16
16
  const error = new diagnostics_1.DiagnosticError('TypeError', 'Unknown function: foo', { line: 2, col: 11 }, source.split('\n'));
17
17
  expect((0, diagnostics_1.formatError)(error, source)).toBe([
18
- 'Error at line 2, col 11:',
18
+ '<input>:2:11: error: Unknown function: foo',
19
19
  ' let x = foo(',
20
20
  ' ^',
21
- 'Unknown function: foo',
22
21
  ].join('\n'));
23
22
  });
24
23
  it('includes file path when available', () => {
25
24
  const source = 'let x = foo();';
26
25
  const error = new diagnostics_1.DiagnosticError('TypeError', 'Unknown function: foo', { file: 'test.mcrs', line: 1, col: 9 }, source.split('\n'));
27
- expect((0, diagnostics_1.formatError)(error, source)).toContain('Error in test.mcrs at line 1, col 9:');
26
+ expect((0, diagnostics_1.formatError)(error, source)).toContain('test.mcrs:1:9: error: Unknown function: foo');
28
27
  });
29
28
  });
30
29
  describe('format', () => {
@@ -0,0 +1,7 @@
1
+ /**
2
+ * End-to-end tests for @coroutine decorator.
3
+ *
4
+ * Compiles RedScript with @coroutine through the full pipeline and
5
+ * verifies generated .mcfunction output and tick.json registration.
6
+ */
7
+ export {};
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /**
3
+ * End-to-end tests for @coroutine decorator.
4
+ *
5
+ * Compiles RedScript with @coroutine through the full pipeline and
6
+ * verifies generated .mcfunction output and tick.json registration.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const compile_1 = require("../../emit/compile");
10
+ function getFile(files, pathSubstr) {
11
+ const f = files.find(f => f.path.includes(pathSubstr));
12
+ return f?.content;
13
+ }
14
+ function getFileNames(files) {
15
+ return files.map(f => f.path);
16
+ }
17
+ describe('e2e: @coroutine', () => {
18
+ test('@coroutine loop function generates dispatcher in tick.json', () => {
19
+ const source = `
20
+ @coroutine(batch=10)
21
+ fn process_all(): void {
22
+ let i: int = 0;
23
+ while (i < 100) {
24
+ let x: int = i * 2;
25
+ i = i + 1;
26
+ }
27
+ }
28
+ `;
29
+ const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
30
+ const tickJson = getFile(result.files, 'tick.json');
31
+ expect(tickJson).toBeDefined();
32
+ const parsed = JSON.parse(tickJson);
33
+ // The generated tick dispatcher should be registered
34
+ const hasCoroTick = parsed.values.some((v) => v.includes('_coro_'));
35
+ expect(hasCoroTick).toBe(true);
36
+ });
37
+ test('@coroutine generates continuation mcfunction files', () => {
38
+ const source = `
39
+ @coroutine(batch=5)
40
+ fn heavy_loop(): void {
41
+ let i: int = 0;
42
+ while (i < 1000) {
43
+ let x: int = i + 1;
44
+ i = i + 1;
45
+ }
46
+ }
47
+ `;
48
+ const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
49
+ const paths = getFileNames(result.files);
50
+ // Should have at least one continuation function file
51
+ const contFiles = paths.filter(p => p.includes('_coro_') && p.includes('_cont_'));
52
+ expect(contFiles.length).toBeGreaterThanOrEqual(1);
53
+ // Should have a dispatcher tick function file (may include sub-function files)
54
+ const tickFiles = paths.filter(p => p.includes('_coro_') && p.includes('_tick'));
55
+ expect(tickFiles.length).toBeGreaterThanOrEqual(1);
56
+ });
57
+ test('@coroutine with onDone generates call to callback', () => {
58
+ const source = `
59
+ fn after_done(): void {
60
+ let x: int = 42;
61
+ }
62
+
63
+ @coroutine(batch=10, onDone=after_done)
64
+ fn process(): void {
65
+ let i: int = 0;
66
+ while (i < 100) {
67
+ let x: int = i;
68
+ i = i + 1;
69
+ }
70
+ }
71
+ `;
72
+ const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
73
+ // The continuation files should reference after_done somewhere
74
+ const contFiles = result.files.filter(f => f.path.includes('_coro_') && f.path.includes('_cont_'));
75
+ const allContent = contFiles.map(f => f.content).join('\n');
76
+ expect(allContent).toContain('after_done');
77
+ });
78
+ test('@coroutine function without loops still compiles', () => {
79
+ const source = `
80
+ @coroutine(batch=10)
81
+ fn no_loop(): void {
82
+ let x: int = 1;
83
+ let y: int = x + 2;
84
+ }
85
+ `;
86
+ const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
87
+ expect(result.files.length).toBeGreaterThan(0);
88
+ // Should still produce continuation + dispatcher
89
+ const paths = getFileNames(result.files);
90
+ const contFiles = paths.filter(p => p.includes('_coro_'));
91
+ expect(contFiles.length).toBeGreaterThanOrEqual(2); // at least cont + tick
92
+ });
93
+ test('@coroutine preserves non-coroutine functions', () => {
94
+ const source = `
95
+ fn helper(): int {
96
+ return 42;
97
+ }
98
+
99
+ @coroutine(batch=10)
100
+ fn process(): void {
101
+ let i: int = 0;
102
+ while (i < 100) {
103
+ let x: int = i;
104
+ i = i + 1;
105
+ }
106
+ }
107
+ `;
108
+ const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
109
+ const helperFn = getFile(result.files, 'helper.mcfunction');
110
+ expect(helperFn).toBeDefined();
111
+ });
112
+ test('default batch value is 10 when not specified', () => {
113
+ // @coroutine without batch should default to batch=10
114
+ // We test by ensuring compilation succeeds
115
+ const source = `
116
+ @coroutine
117
+ fn process(): void {
118
+ let i: int = 0;
119
+ while (i < 100) {
120
+ let x: int = i;
121
+ i = i + 1;
122
+ }
123
+ }
124
+ `;
125
+ const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
126
+ expect(result.files.length).toBeGreaterThan(0);
127
+ const paths = getFileNames(result.files);
128
+ const contFiles = paths.filter(p => p.includes('_coro_'));
129
+ expect(contFiles.length).toBeGreaterThanOrEqual(2);
130
+ });
131
+ });
132
+ //# sourceMappingURL=coroutine.test.js.map
@@ -138,7 +138,7 @@ describe('e2e: float macro params with local coords', () => {
138
138
  }
139
139
 
140
140
  fn caller() {
141
- draw_pt(100, 200);
141
+ draw_pt(100.0, 200.0);
142
142
  }
143
143
  `;
144
144
  const result = (0, compile_1.compile)(source, { namespace: 'test' });
@@ -13,7 +13,7 @@
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const compile_1 = require("../../emit/compile");
16
- const runtime_1 = require("../../../src/runtime");
16
+ const runtime_1 = require("../../runtime");
17
17
  // ---------------------------------------------------------------------------
18
18
  // Helpers
19
19
  // ---------------------------------------------------------------------------
@@ -0,0 +1,10 @@
1
+ /**
2
+ * End-to-end stdlib tests through the v2 pipeline.
3
+ *
4
+ * Tests pure-arithmetic stdlib functions (math.mcrs, vec.mcrs) by compiling
5
+ * with librarySources, loading into MCRuntime, and asserting return values.
6
+ *
7
+ * NOTE: sin_fixed/cos_fixed/atan2_fixed are skipped — they depend on
8
+ * storage_get_int/storage_set_array which are not available in MCRuntime.
9
+ */
10
+ export {};