redscript-mc 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +12 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +245 -0
  22. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  23. package/dist/src/__tests__/mc-version.test.js +154 -0
  24. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  25. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  26. package/dist/src/__tests__/modules.test.d.ts +7 -0
  27. package/dist/src/__tests__/modules.test.js +333 -0
  28. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  30. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  31. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  32. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  33. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  34. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  35. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  36. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  37. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  38. package/dist/src/__tests__/option.test.d.ts +14 -0
  39. package/dist/src/__tests__/option.test.js +275 -0
  40. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  41. package/dist/src/__tests__/schedule.test.js +98 -0
  42. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  43. package/dist/src/__tests__/sourcemap.test.js +227 -0
  44. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  45. package/dist/src/__tests__/tuple.test.js +202 -0
  46. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  47. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  48. package/dist/src/ast/types.d.ts +56 -2
  49. package/dist/src/cache/deps.d.ts +41 -0
  50. package/dist/src/cache/deps.js +158 -0
  51. package/dist/src/cache/incremental.d.ts +35 -0
  52. package/dist/src/cache/incremental.js +165 -0
  53. package/dist/src/cache/index.d.ts +37 -0
  54. package/dist/src/cache/index.js +152 -0
  55. package/dist/src/cli.js +76 -45
  56. package/dist/src/compile.d.ts +2 -2
  57. package/dist/src/compile.js +1 -1
  58. package/dist/src/diagnostics/index.d.ts +1 -1
  59. package/dist/src/diagnostics/index.js +8 -11
  60. package/dist/src/emit/compile.d.ts +29 -0
  61. package/dist/src/emit/compile.js +143 -0
  62. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  63. package/dist/{src2 → src}/emit/index.js +59 -8
  64. package/dist/src/emit/modules.d.ts +29 -0
  65. package/dist/src/emit/modules.js +492 -0
  66. package/dist/src/emit/sourcemap.d.ts +53 -0
  67. package/dist/src/emit/sourcemap.js +73 -0
  68. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  69. package/dist/{src2 → src}/hir/lower.js +22 -1
  70. package/dist/src/hir/monomorphize.d.ts +22 -0
  71. package/dist/src/hir/monomorphize.js +379 -0
  72. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  73. package/dist/src/index.d.ts +19 -2
  74. package/dist/src/index.js +36 -14
  75. package/dist/src/lexer/index.d.ts +1 -1
  76. package/dist/src/lexer/index.js +1 -0
  77. package/dist/src/lir/budget.d.ts +37 -0
  78. package/dist/src/lir/budget.js +280 -0
  79. package/dist/{src2 → src}/lir/lower.js +19 -0
  80. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  81. package/dist/src/lsp/main.d.ts +8 -0
  82. package/dist/src/lsp/main.js +11 -0
  83. package/dist/src/lsp/server.d.ts +11 -0
  84. package/dist/src/lsp/server.js +352 -0
  85. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  86. package/dist/{src2 → src}/mir/lower.js +244 -10
  87. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  88. package/dist/src/optimizer/coroutine.d.ts +34 -0
  89. package/dist/src/optimizer/coroutine.js +789 -0
  90. package/dist/src/optimizer/dce.d.ts +8 -34
  91. package/dist/src/optimizer/dce.js +146 -629
  92. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  93. package/dist/src/optimizer/interprocedural.js +186 -0
  94. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  95. package/dist/src/optimizer/lir/const_imm.js +139 -0
  96. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  97. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  98. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  99. package/dist/src/optimizer/lir/peephole.js +52 -0
  100. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  101. package/dist/src/optimizer/lir/pipeline.js +34 -0
  102. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  103. package/dist/src/optimizer/nbt-batch.js +51 -0
  104. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  105. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  106. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  107. package/dist/src/optimizer/selector-cache.js +100 -0
  108. package/dist/src/optimizer/unroll.d.ts +32 -0
  109. package/dist/src/optimizer/unroll.js +348 -0
  110. package/dist/src/parser/index.d.ts +8 -0
  111. package/dist/src/parser/index.js +204 -14
  112. package/dist/src/repl.d.ts +1 -1
  113. package/dist/src/typechecker/index.d.ts +4 -0
  114. package/dist/src/typechecker/index.js +198 -13
  115. package/dist/src/types/mc-version.d.ts +24 -0
  116. package/dist/src/types/mc-version.js +49 -0
  117. package/docs/ROADMAP.md +395 -0
  118. package/docs/compiler-pipeline-redesign.md +27 -10
  119. package/editors/vscode/out/extension.js +25176 -8000
  120. package/editors/vscode/package-lock.json +90 -6
  121. package/editors/vscode/package.json +3 -2
  122. package/editors/vscode/src/extension.ts +97 -67
  123. package/examples/showcase.mcrs +3 -3
  124. package/jest.config.js +1 -1
  125. package/package.json +9 -3
  126. package/src/__tests__/budget.test.ts +297 -0
  127. package/src/__tests__/diagnostics.test.ts +2 -3
  128. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  129. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  130. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  131. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  132. package/src/__tests__/enum.test.ts +425 -0
  133. package/src/__tests__/generics.test.ts +390 -0
  134. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  135. package/src/__tests__/incremental.test.ts +337 -0
  136. package/src/__tests__/lsp.test.ts +270 -0
  137. package/src/__tests__/mc-version.test.ts +178 -0
  138. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  139. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  140. package/src/__tests__/modules.test.ts +365 -0
  141. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  142. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  143. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  144. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  145. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  146. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  147. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  148. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  149. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  150. package/src/__tests__/option.test.ts +299 -0
  151. package/src/__tests__/schedule.test.ts +105 -0
  152. package/src/__tests__/sourcemap.test.ts +254 -0
  153. package/src/__tests__/tuple.test.ts +220 -0
  154. package/src/__tests__/typechecker-strict.test.ts +216 -0
  155. package/src/ast/types.ts +33 -2
  156. package/src/cache/deps.ts +132 -0
  157. package/src/cache/incremental.ts +173 -0
  158. package/src/cache/index.ts +135 -0
  159. package/src/cli.ts +88 -45
  160. package/src/compile.ts +2 -2
  161. package/src/diagnostics/index.ts +8 -11
  162. package/src/emit/compile.ts +177 -0
  163. package/{src2 → src}/emit/index.ts +72 -8
  164. package/src/emit/modules.ts +581 -0
  165. package/src/emit/sourcemap.ts +101 -0
  166. package/{src2 → src}/hir/lower.ts +29 -2
  167. package/src/hir/monomorphize.ts +416 -0
  168. package/{src2 → src}/hir/types.ts +15 -3
  169. package/src/index.ts +29 -10
  170. package/src/lexer/index.ts +2 -1
  171. package/src/lir/budget.ts +321 -0
  172. package/{src2 → src}/lir/lower.ts +32 -1
  173. package/{src2 → src}/lir/types.ts +7 -3
  174. package/src/lsp/main.ts +9 -0
  175. package/src/lsp/server.ts +414 -0
  176. package/{src2 → src}/mir/lower.ts +251 -8
  177. package/{src2 → src}/mir/types.ts +12 -1
  178. package/src/optimizer/coroutine.ts +996 -0
  179. package/{src2 → src}/optimizer/dce.ts +2 -1
  180. package/src/optimizer/interprocedural.ts +177 -0
  181. package/src/optimizer/lir/const_imm.ts +143 -0
  182. package/src/optimizer/lir/dead_slot.ts +123 -0
  183. package/src/optimizer/lir/peephole.ts +57 -0
  184. package/src/optimizer/lir/pipeline.ts +37 -0
  185. package/src/optimizer/nbt-batch.ts +50 -0
  186. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  187. package/src/optimizer/selector-cache.ts +103 -0
  188. package/src/optimizer/unroll.ts +386 -0
  189. package/src/parser/index.ts +212 -15
  190. package/src/repl.ts +1 -1
  191. package/src/stdlib/math.mcrs +4 -4
  192. package/src/templates/quest.mcrs +4 -4
  193. package/src/typechecker/index.ts +215 -15
  194. package/src/types/mc-version.ts +46 -0
  195. package/tsconfig.json +1 -1
  196. package/.claude/commands/build-test.md +0 -10
  197. package/.claude/commands/deploy-demo.md +0 -12
  198. package/.claude/commands/stage-status.md +0 -13
  199. package/.claude/settings.json +0 -12
  200. package/CLAUDE.md +0 -231
  201. package/dist/__tests__/cli.test.js +0 -278
  202. package/dist/__tests__/codegen.test.js +0 -152
  203. package/dist/__tests__/compile-all.test.d.ts +0 -10
  204. package/dist/__tests__/compile-all.test.js +0 -108
  205. package/dist/__tests__/dce.test.js +0 -138
  206. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  207. package/dist/__tests__/diagnostics.test.js +0 -149
  208. package/dist/__tests__/e2e.test.d.ts +0 -6
  209. package/dist/__tests__/e2e.test.js +0 -1847
  210. package/dist/__tests__/entity-types.test.js +0 -203
  211. package/dist/__tests__/formatter.test.js +0 -40
  212. package/dist/__tests__/lexer.test.js +0 -343
  213. package/dist/__tests__/lowering.test.js +0 -1015
  214. package/dist/__tests__/macro.test.d.ts +0 -8
  215. package/dist/__tests__/macro.test.js +0 -305
  216. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  217. package/dist/__tests__/mc-integration.test.js +0 -819
  218. package/dist/__tests__/mc-syntax.test.js +0 -124
  219. package/dist/__tests__/nbt.test.js +0 -82
  220. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  221. package/dist/__tests__/optimizer.test.d.ts +0 -1
  222. package/dist/__tests__/optimizer.test.js +0 -149
  223. package/dist/__tests__/parser.test.d.ts +0 -1
  224. package/dist/__tests__/parser.test.js +0 -807
  225. package/dist/__tests__/repl.test.d.ts +0 -1
  226. package/dist/__tests__/repl.test.js +0 -27
  227. package/dist/__tests__/runtime.test.d.ts +0 -1
  228. package/dist/__tests__/runtime.test.js +0 -289
  229. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  230. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  231. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  232. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  233. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  234. package/dist/__tests__/stdlib-math.test.js +0 -352
  235. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  236. package/dist/__tests__/stdlib-vec.test.js +0 -264
  237. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  238. package/dist/__tests__/structure-optimizer.test.js +0 -33
  239. package/dist/__tests__/typechecker.test.d.ts +0 -1
  240. package/dist/__tests__/typechecker.test.js +0 -552
  241. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  242. package/dist/__tests__/var-allocator.test.js +0 -69
  243. package/dist/ast/types.d.ts +0 -514
  244. package/dist/ast/types.js +0 -9
  245. package/dist/builtins/metadata.d.ts +0 -36
  246. package/dist/builtins/metadata.js +0 -1014
  247. package/dist/cli.d.ts +0 -11
  248. package/dist/codegen/cmdblock/index.d.ts +0 -26
  249. package/dist/codegen/cmdblock/index.js +0 -45
  250. package/dist/codegen/mcfunction/index.d.ts +0 -40
  251. package/dist/codegen/mcfunction/index.js +0 -606
  252. package/dist/codegen/structure/index.d.ts +0 -24
  253. package/dist/codegen/structure/index.js +0 -279
  254. package/dist/codegen/var-allocator.d.ts +0 -45
  255. package/dist/codegen/var-allocator.js +0 -104
  256. package/dist/compile.d.ts +0 -68
  257. package/dist/data/arena/function/__load.mcfunction +0 -6
  258. package/dist/data/arena/function/__tick.mcfunction +0 -2
  259. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  260. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  261. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  262. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  263. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  264. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  265. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  266. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  267. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  268. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  269. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  270. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  271. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  272. package/dist/data/counter/function/__load.mcfunction +0 -5
  273. package/dist/data/counter/function/__tick.mcfunction +0 -2
  274. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  275. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  276. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  277. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  278. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  279. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  280. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  281. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  282. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  283. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  284. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  285. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  286. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  287. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  288. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  289. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  290. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  291. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  292. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  293. package/dist/data/gcd3/function/test.mcfunction +0 -7
  294. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  295. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  296. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  297. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  298. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  299. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  300. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  301. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  302. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  303. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  304. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  305. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  306. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  307. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  308. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  309. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  310. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  311. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  312. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  313. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  314. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  315. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  316. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  317. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  318. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  319. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  320. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  321. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  322. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  323. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  324. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  325. package/dist/data/mathtest/function/test.mcfunction +0 -5
  326. package/dist/data/minecraft/tags/function/load.json +0 -5
  327. package/dist/data/minecraft/tags/function/tick.json +0 -5
  328. package/dist/data/mypack/function/__load.mcfunction +0 -13
  329. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  330. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  331. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  332. package/dist/data/mypack/function/abs.mcfunction +0 -6
  333. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  334. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  335. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  336. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  337. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  338. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  339. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  340. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  341. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  342. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  343. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  346. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  347. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  348. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  352. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  353. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  354. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  357. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  358. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  359. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  360. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  361. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  365. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  366. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  367. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  368. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  369. package/dist/data/quiz/function/__load.mcfunction +0 -16
  370. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  371. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  372. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  373. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  374. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  375. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  376. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  377. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  378. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  379. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  380. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  381. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  382. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  383. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  384. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  386. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  387. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  388. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  389. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  390. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  391. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  392. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  393. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  394. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  395. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  396. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  397. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  398. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  399. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  400. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  402. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  403. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  404. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  405. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  406. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  407. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  408. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  409. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  410. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  411. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  412. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  413. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  414. package/dist/data/runtime/function/__load.mcfunction +0 -5
  415. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  416. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  417. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  418. package/dist/data/shop/function/__load.mcfunction +0 -7
  419. package/dist/data/shop/function/__tick.mcfunction +0 -3
  420. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  421. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  422. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  423. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  424. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  425. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  426. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  427. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  429. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  430. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  431. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  432. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  433. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  434. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  435. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  436. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  437. package/dist/data/turret/function/__load.mcfunction +0 -5
  438. package/dist/data/turret/function/__tick.mcfunction +0 -4
  439. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  440. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  441. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  442. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  443. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  444. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  445. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  446. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  447. package/dist/diagnostics/index.d.ts +0 -44
  448. package/dist/diagnostics/index.js +0 -140
  449. package/dist/events/types.d.ts +0 -35
  450. package/dist/events/types.js +0 -59
  451. package/dist/formatter/index.d.ts +0 -1
  452. package/dist/formatter/index.js +0 -26
  453. package/dist/gcd2.map.json +0 -15
  454. package/dist/gcd3.map.json +0 -17
  455. package/dist/gcd_test.map.json +0 -15
  456. package/dist/index.d.ts +0 -62
  457. package/dist/ir/builder.d.ts +0 -33
  458. package/dist/ir/builder.js +0 -99
  459. package/dist/ir/types.d.ts +0 -132
  460. package/dist/ir/types.js +0 -15
  461. package/dist/isqrttest.map.json +0 -15
  462. package/dist/lexer/index.d.ts +0 -37
  463. package/dist/lexer/index.js +0 -569
  464. package/dist/lowering/index.d.ts +0 -188
  465. package/dist/lowering/index.js +0 -3405
  466. package/dist/mathtest.map.json +0 -6
  467. package/dist/mc-test/client.d.ts +0 -128
  468. package/dist/mc-test/client.js +0 -174
  469. package/dist/mc-test/runner.d.ts +0 -28
  470. package/dist/mc-test/runner.js +0 -150
  471. package/dist/mc-test/setup.d.ts +0 -11
  472. package/dist/mc-test/setup.js +0 -98
  473. package/dist/mc-validator/index.d.ts +0 -17
  474. package/dist/mc-validator/index.js +0 -322
  475. package/dist/mypack.map.json +0 -27
  476. package/dist/nbt/index.d.ts +0 -86
  477. package/dist/nbt/index.js +0 -250
  478. package/dist/optimizer/commands.d.ts +0 -38
  479. package/dist/optimizer/commands.js +0 -451
  480. package/dist/optimizer/dce.d.ts +0 -34
  481. package/dist/optimizer/dce.js +0 -639
  482. package/dist/optimizer/passes.d.ts +0 -34
  483. package/dist/optimizer/passes.js +0 -243
  484. package/dist/optimizer/structure.d.ts +0 -9
  485. package/dist/optimizer/structure.js +0 -356
  486. package/dist/pack.mcmeta +0 -6
  487. package/dist/parser/index.d.ts +0 -93
  488. package/dist/parser/index.js +0 -1687
  489. package/dist/repl.d.ts +0 -16
  490. package/dist/repl.js +0 -165
  491. package/dist/reqtest.map.json +0 -4
  492. package/dist/reqtest2.map.json +0 -4
  493. package/dist/runtime/index.d.ts +0 -107
  494. package/dist/runtime/index.js +0 -1409
  495. package/dist/runtime.map.json +0 -7
  496. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  497. package/dist/src/__tests__/codegen.test.js +0 -152
  498. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  499. package/dist/src/__tests__/e2e.test.js +0 -1789
  500. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  501. package/dist/src/__tests__/entity-types.test.js +0 -203
  502. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  503. package/dist/src/__tests__/lowering.test.js +0 -1015
  504. package/dist/src/__tests__/macro.test.d.ts +0 -8
  505. package/dist/src/__tests__/macro.test.js +0 -306
  506. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  507. package/dist/src/__tests__/nbt.test.js +0 -82
  508. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  509. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  510. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  511. package/dist/src/__tests__/optimizer.test.js +0 -149
  512. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  513. package/dist/src/__tests__/runtime.test.js +0 -289
  514. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  515. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  516. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  517. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  518. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  519. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  520. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  521. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  522. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  523. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  524. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  525. package/dist/src/__tests__/var-allocator.test.js +0 -69
  526. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  527. package/dist/src/codegen/cmdblock/index.js +0 -45
  528. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  529. package/dist/src/codegen/mcfunction/index.js +0 -606
  530. package/dist/src/codegen/structure/index.d.ts +0 -24
  531. package/dist/src/codegen/structure/index.js +0 -279
  532. package/dist/src/codegen/var-allocator.d.ts +0 -45
  533. package/dist/src/codegen/var-allocator.js +0 -104
  534. package/dist/src/ir/builder.d.ts +0 -33
  535. package/dist/src/ir/builder.js +0 -99
  536. package/dist/src/ir/types.d.ts +0 -132
  537. package/dist/src/ir/types.js +0 -15
  538. package/dist/src/lowering/index.d.ts +0 -188
  539. package/dist/src/lowering/index.js +0 -3405
  540. package/dist/src/optimizer/commands.d.ts +0 -38
  541. package/dist/src/optimizer/commands.js +0 -451
  542. package/dist/src/optimizer/passes.d.ts +0 -34
  543. package/dist/src/optimizer/passes.js +0 -243
  544. package/dist/src/optimizer/structure.d.ts +0 -9
  545. package/dist/src/optimizer/structure.js +0 -356
  546. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  547. package/dist/src2/emit/compile.d.ts +0 -19
  548. package/dist/src2/emit/compile.js +0 -80
  549. package/dist/src2/optimizer/dce.d.ts +0 -8
  550. package/dist/src2/optimizer/dce.js +0 -155
  551. package/dist/swap_test.map.json +0 -14
  552. package/dist/tsconfig.tsbuildinfo +0 -1
  553. package/dist/typechecker/index.d.ts +0 -61
  554. package/dist/typechecker/index.js +0 -1034
  555. package/dist/types/entity-hierarchy.d.ts +0 -29
  556. package/dist/types/entity-hierarchy.js +0 -107
  557. package/src2/emit/compile.ts +0 -99
  558. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  559. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  560. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  561. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  562. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  563. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  564. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  565. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  566. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  567. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  568. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  569. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  570. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  571. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  572. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  576. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  578. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  579. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  580. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  581. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  582. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  583. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  584. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  585. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  586. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  587. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  588. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  589. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  590. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  592. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  593. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  594. /package/dist/{src2 → src}/hir/types.js +0 -0
  595. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  596. /package/dist/{src2 → src}/lir/types.js +0 -0
  597. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  598. /package/dist/{src2 → src}/lir/verify.js +0 -0
  599. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  600. /package/dist/{src2 → src}/mir/macro.js +0 -0
  601. /package/dist/{src2 → src}/mir/types.js +0 -0
  602. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  603. /package/dist/{src2 → src}/mir/verify.js +0 -0
  604. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  605. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  606. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  607. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  608. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  609. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  610. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  611. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  612. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  613. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  614. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  615. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  616. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  617. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  618. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  619. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  620. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  621. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  622. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  623. /package/{src2 → src}/lir/verify.ts +0 -0
  624. /package/{src2 → src}/mir/macro.ts +0 -0
  625. /package/{src2 → src}/mir/verify.ts +0 -0
  626. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  627. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  628. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  629. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Tests for the small constant loop unrolling pass.
5
+ *
6
+ * We test through the full compiler pipeline (source → MIR → optimize)
7
+ * to verify realistic unroll behavior, and also test the pass directly
8
+ * with synthetic MIR for edge cases.
9
+ */
10
+ const lexer_1 = require("../../lexer");
11
+ const parser_1 = require("../../parser");
12
+ const lower_1 = require("../../hir/lower");
13
+ const lower_2 = require("../../mir/lower");
14
+ const pipeline_1 = require("../../optimizer/pipeline");
15
+ const unroll_1 = require("../../optimizer/unroll");
16
+ function compileToMIR(source) {
17
+ const tokens = new lexer_1.Lexer(source).tokenize();
18
+ const ast = new parser_1.Parser(tokens).parse('test');
19
+ const hir = (0, lower_1.lowerToHIR)(ast);
20
+ const mir = (0, lower_2.lowerToMIR)(hir);
21
+ return mir.functions;
22
+ }
23
+ function mkBlock(id, instrs, term, preds = []) {
24
+ return { id, instrs, term, preds };
25
+ }
26
+ function mkFn(blocks) {
27
+ return { name: 'test', params: [], blocks, entry: 'entry', isMacro: false };
28
+ }
29
+ const c = (v) => ({ kind: 'const', value: v });
30
+ const t = (n) => ({ kind: 'temp', name: n });
31
+ // ---------------------------------------------------------------------------
32
+ // Synthetic MIR tests
33
+ // ---------------------------------------------------------------------------
34
+ describe('loopUnroll — synthetic MIR', () => {
35
+ /**
36
+ * Build a minimal for(i=0; i<N; i++) loop in MIR form:
37
+ * entry: const i 0; jump → loop_header
38
+ * loop_header: cmp t_cmp lt i N; branch t_cmp → loop_body / loop_exit
39
+ * loop_body: [body instrs]; jump → loop_latch
40
+ * loop_latch: add i i 1; jump → loop_header
41
+ * loop_exit: return null
42
+ */
43
+ function buildLoop(N, bodyInstrs) {
44
+ return mkFn([
45
+ mkBlock('entry', [
46
+ { kind: 'const', dst: 'i', value: 0 },
47
+ ], { kind: 'jump', target: 'loop_header_0' }),
48
+ mkBlock('loop_header_0', [
49
+ { kind: 'cmp', dst: 't_cmp', op: 'lt', a: t('i'), b: c(N) },
50
+ ], { kind: 'branch', cond: t('t_cmp'), then: 'loop_body_0', else: 'loop_exit_0' }),
51
+ mkBlock('loop_body_0', bodyInstrs, { kind: 'jump', target: 'loop_latch_0' }),
52
+ mkBlock('loop_latch_0', [
53
+ { kind: 'add', dst: 'i', a: t('i'), b: c(1) },
54
+ ], { kind: 'jump', target: 'loop_header_0' }),
55
+ mkBlock('loop_exit_0', [], { kind: 'return', value: null }),
56
+ ]);
57
+ }
58
+ test('for(i=0; i<3; i++) unrolls to 3 copies of body', () => {
59
+ const bodyInstrs = [
60
+ { kind: 'call', dst: null, fn: 'test:body', args: [t('i')] },
61
+ ];
62
+ const fn = buildLoop(3, bodyInstrs);
63
+ const result = (0, unroll_1.loopUnroll)(fn);
64
+ // loop_header, loop_body, loop_latch should be gone
65
+ expect(result.blocks.some(b => b.id.startsWith('loop_header'))).toBe(false);
66
+ expect(result.blocks.some(b => b.id.startsWith('loop_latch'))).toBe(false);
67
+ expect(result.blocks.some(b => b.id.startsWith('loop_body'))).toBe(false);
68
+ // loop_exit should still be there
69
+ expect(result.blocks.some(b => b.id.startsWith('loop_exit'))).toBe(true);
70
+ // entry block should contain 3 call instructions with substituted i values
71
+ const entry = result.blocks.find(b => b.id === 'entry');
72
+ const calls = entry.instrs.filter(instr => instr.kind === 'call');
73
+ expect(calls).toHaveLength(3);
74
+ // Each call should have i substituted as 0, 1, 2
75
+ expect(calls[0].args[0]).toEqual(c(0));
76
+ expect(calls[1].args[0]).toEqual(c(1));
77
+ expect(calls[2].args[0]).toEqual(c(2));
78
+ });
79
+ test('for(i=0; i<1; i++) unrolls to 1 copy', () => {
80
+ const bodyInstrs = [
81
+ { kind: 'call', dst: null, fn: 'test:body', args: [t('i')] },
82
+ ];
83
+ const fn = buildLoop(1, bodyInstrs);
84
+ const result = (0, unroll_1.loopUnroll)(fn);
85
+ const entry = result.blocks.find(b => b.id === 'entry');
86
+ const calls = entry.instrs.filter(instr => instr.kind === 'call');
87
+ expect(calls).toHaveLength(1);
88
+ expect(calls[0].args[0]).toEqual(c(0));
89
+ });
90
+ test('for(i=0; i<8; i++) unrolls to 8 copies (at limit)', () => {
91
+ const bodyInstrs = [
92
+ { kind: 'call', dst: null, fn: 'test:body', args: [t('i')] },
93
+ ];
94
+ const fn = buildLoop(8, bodyInstrs);
95
+ const result = (0, unroll_1.loopUnroll)(fn);
96
+ const entry = result.blocks.find(b => b.id === 'entry');
97
+ const calls = entry.instrs.filter(instr => instr.kind === 'call');
98
+ expect(calls).toHaveLength(8);
99
+ });
100
+ test('for(i=0; i<9; i++) does NOT unroll (exceeds limit)', () => {
101
+ const bodyInstrs = [
102
+ { kind: 'call', dst: null, fn: 'test:body', args: [t('i')] },
103
+ ];
104
+ const fn = buildLoop(9, bodyInstrs);
105
+ const result = (0, unroll_1.loopUnroll)(fn);
106
+ // Should not have changed — loop blocks remain
107
+ expect(result.blocks.some(b => b.id.startsWith('loop_header'))).toBe(true);
108
+ expect(result).toBe(fn);
109
+ });
110
+ test('for(i=0; i<10; i++) does NOT unroll', () => {
111
+ const bodyInstrs = [
112
+ { kind: 'call', dst: null, fn: 'test:body', args: [t('i')] },
113
+ ];
114
+ const fn = buildLoop(10, bodyInstrs);
115
+ const result = (0, unroll_1.loopUnroll)(fn);
116
+ expect(result.blocks.some(b => b.id.startsWith('loop_header'))).toBe(true);
117
+ });
118
+ test('variable substitution replaces i in arithmetic', () => {
119
+ // Body: x = i * 2
120
+ const bodyInstrs = [
121
+ { kind: 'mul', dst: 'x', a: t('i'), b: c(2) },
122
+ { kind: 'call', dst: null, fn: 'test:use', args: [t('x')] },
123
+ ];
124
+ const fn = buildLoop(3, bodyInstrs);
125
+ const result = (0, unroll_1.loopUnroll)(fn);
126
+ const entry = result.blocks.find(b => b.id === 'entry');
127
+ const muls = entry.instrs.filter(instr => instr.kind === 'mul');
128
+ expect(muls).toHaveLength(3);
129
+ expect(muls[0].a).toEqual(c(0));
130
+ expect(muls[1].a).toEqual(c(1));
131
+ expect(muls[2].a).toEqual(c(2));
132
+ });
133
+ test('init must be 0 — does not unroll if initialized to non-zero', () => {
134
+ // entry: const i 1 (not 0)
135
+ const fn = mkFn([
136
+ mkBlock('entry', [
137
+ { kind: 'const', dst: 'i', value: 1 },
138
+ ], { kind: 'jump', target: 'loop_header_0' }),
139
+ mkBlock('loop_header_0', [
140
+ { kind: 'cmp', dst: 't_cmp', op: 'lt', a: t('i'), b: c(3) },
141
+ ], { kind: 'branch', cond: t('t_cmp'), then: 'loop_body_0', else: 'loop_exit_0' }),
142
+ mkBlock('loop_body_0', [
143
+ { kind: 'call', dst: null, fn: 'test:body', args: [t('i')] },
144
+ ], { kind: 'jump', target: 'loop_latch_0' }),
145
+ mkBlock('loop_latch_0', [
146
+ { kind: 'add', dst: 'i', a: t('i'), b: c(1) },
147
+ ], { kind: 'jump', target: 'loop_header_0' }),
148
+ mkBlock('loop_exit_0', [], { kind: 'return', value: null }),
149
+ ]);
150
+ const result = (0, unroll_1.loopUnroll)(fn);
151
+ expect(result).toBe(fn);
152
+ });
153
+ test('non-lt comparison does not unroll', () => {
154
+ // loop_header: cmp le (not lt)
155
+ const fn = mkFn([
156
+ mkBlock('entry', [
157
+ { kind: 'const', dst: 'i', value: 0 },
158
+ ], { kind: 'jump', target: 'loop_header_0' }),
159
+ mkBlock('loop_header_0', [
160
+ { kind: 'cmp', dst: 't_cmp', op: 'le', a: t('i'), b: c(3) },
161
+ ], { kind: 'branch', cond: t('t_cmp'), then: 'loop_body_0', else: 'loop_exit_0' }),
162
+ mkBlock('loop_body_0', [
163
+ { kind: 'call', dst: null, fn: 'test:body', args: [t('i')] },
164
+ ], { kind: 'jump', target: 'loop_latch_0' }),
165
+ mkBlock('loop_latch_0', [
166
+ { kind: 'add', dst: 'i', a: t('i'), b: c(1) },
167
+ ], { kind: 'jump', target: 'loop_header_0' }),
168
+ mkBlock('loop_exit_0', [], { kind: 'return', value: null }),
169
+ ]);
170
+ const result = (0, unroll_1.loopUnroll)(fn);
171
+ expect(result).toBe(fn);
172
+ });
173
+ });
174
+ // ---------------------------------------------------------------------------
175
+ // End-to-end tests via full compiler pipeline
176
+ // ---------------------------------------------------------------------------
177
+ describe('loopUnroll — end-to-end via optimizeFunction', () => {
178
+ test('for(0..3) loop is unrolled after full optimization', () => {
179
+ const fns = compileToMIR(`
180
+ fn f(): void {
181
+ for (let i: int = 0; i < 3; i = i + 1) {
182
+ cmd("say " + i);
183
+ }
184
+ }
185
+ `);
186
+ const fn = fns[0];
187
+ const optimized = (0, pipeline_1.optimizeFunction)(fn);
188
+ // After optimization, loop blocks should be gone
189
+ expect(optimized.blocks.some(b => b.id.startsWith('loop_header'))).toBe(false);
190
+ expect(optimized.blocks.some(b => b.id.startsWith('loop_latch'))).toBe(false);
191
+ });
192
+ test('for(0..10) loop is NOT unrolled', () => {
193
+ const fns = compileToMIR(`
194
+ fn f(): void {
195
+ for (let i: int = 0; i < 10; i = i + 1) {
196
+ cmd("say " + i);
197
+ }
198
+ }
199
+ `);
200
+ const fn = fns[0];
201
+ const optimized = (0, pipeline_1.optimizeFunction)(fn);
202
+ // Loop blocks should remain (N=10 > limit)
203
+ expect(optimized.blocks.some(b => b.id.startsWith('loop_header'))).toBe(true);
204
+ });
205
+ });
206
+ //# sourceMappingURL=unroll.test.js.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tests for Phase 6a: Option<T> — null safety
3
+ *
4
+ * Covers:
5
+ * - Parsing Option<T> type annotation
6
+ * - Parsing Some(expr) and None expressions
7
+ * - Parsing if let Some(x) = opt { ... }
8
+ * - HIR lowering of Option nodes
9
+ * - MIR lowering: Option compiles to two slots (has + val)
10
+ * - if let Some(x) = opt → checks has slot, binds val slot
11
+ * - Function returning Option<int>
12
+ * - Correct scoreboard commands generated
13
+ */
14
+ export {};
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for Phase 6a: Option<T> — null safety
4
+ *
5
+ * Covers:
6
+ * - Parsing Option<T> type annotation
7
+ * - Parsing Some(expr) and None expressions
8
+ * - Parsing if let Some(x) = opt { ... }
9
+ * - HIR lowering of Option nodes
10
+ * - MIR lowering: Option compiles to two slots (has + val)
11
+ * - if let Some(x) = opt → checks has slot, binds val slot
12
+ * - Function returning Option<int>
13
+ * - Correct scoreboard commands generated
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ const lexer_1 = require("../lexer");
17
+ const parser_1 = require("../parser");
18
+ const compile_1 = require("../emit/compile");
19
+ const lower_1 = require("../hir/lower");
20
+ function parse(source, namespace = 'test') {
21
+ const tokens = new lexer_1.Lexer(source).tokenize();
22
+ return new parser_1.Parser(tokens).parse(namespace);
23
+ }
24
+ function getFile(files, pathSubstr) {
25
+ // Prefer exact function file match: look for function/<name>.mcfunction
26
+ const exact = files.find(f => f.path.endsWith(`function/${pathSubstr}.mcfunction`));
27
+ if (exact)
28
+ return exact.content;
29
+ const f = files.find(f => f.path.includes(pathSubstr));
30
+ return f?.content;
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Parser tests
34
+ // ---------------------------------------------------------------------------
35
+ describe('Option: Parser', () => {
36
+ it('parses Option<int> type annotation', () => {
37
+ const prog = parse('fn f(): Option<int> {}');
38
+ expect(prog.declarations[0].returnType).toEqual({ kind: 'option', inner: { kind: 'named', name: 'int' } });
39
+ });
40
+ it('parses Option<bool> parameter type', () => {
41
+ const prog = parse('fn f(x: Option<bool>): void {}');
42
+ expect(prog.declarations[0].params[0].type).toEqual({ kind: 'option', inner: { kind: 'named', name: 'bool' } });
43
+ });
44
+ it('parses Some(42) expression', () => {
45
+ const prog = parse('fn f(): void { let x: Option<int> = Some(42); }');
46
+ const letStmt = prog.declarations[0].body[0];
47
+ expect(letStmt.kind).toBe('let');
48
+ if (letStmt.kind === 'let') {
49
+ expect(letStmt.init.kind).toBe('some_lit');
50
+ if (letStmt.init.kind === 'some_lit') {
51
+ expect(letStmt.init.value).toEqual({ kind: 'int_lit', value: 42 });
52
+ }
53
+ }
54
+ });
55
+ it('parses None expression', () => {
56
+ const prog = parse('fn f(): void { let x: Option<int> = None; }');
57
+ const letStmt = prog.declarations[0].body[0];
58
+ expect(letStmt.kind).toBe('let');
59
+ if (letStmt.kind === 'let') {
60
+ expect(letStmt.init.kind).toBe('none_lit');
61
+ }
62
+ });
63
+ it('parses if let Some(x) = opt { ... }', () => {
64
+ const prog = parse('fn f(p: Option<int>): void { if let Some(x) = p { let y: int = x; } }');
65
+ const stmt = prog.declarations[0].body[0];
66
+ expect(stmt.kind).toBe('if_let_some');
67
+ if (stmt.kind === 'if_let_some') {
68
+ expect(stmt.binding).toBe('x');
69
+ expect(stmt.init).toEqual({ kind: 'ident', name: 'p' });
70
+ expect(stmt.then.length).toBe(1);
71
+ }
72
+ });
73
+ it('parses if let Some(x) = opt { } else { }', () => {
74
+ const prog = parse(`
75
+ fn f(p: Option<int>): void {
76
+ if let Some(x) = p {
77
+ let a: int = x;
78
+ } else {
79
+ let b: int = 0;
80
+ }
81
+ }
82
+ `);
83
+ const stmt = prog.declarations[0].body[0];
84
+ expect(stmt.kind).toBe('if_let_some');
85
+ if (stmt.kind === 'if_let_some') {
86
+ expect(stmt.else_).toBeDefined();
87
+ expect(stmt.else_.length).toBe(1);
88
+ }
89
+ });
90
+ it('does not treat Some as identifier', () => {
91
+ const prog = parse('fn f(): void { let x: Option<int> = Some(1); }');
92
+ if (prog.declarations[0].body[0].kind === 'let') {
93
+ const init = prog.declarations[0].body[0].init;
94
+ expect(init.kind).toBe('some_lit');
95
+ }
96
+ });
97
+ it('does not treat None as identifier', () => {
98
+ const prog = parse('fn f(): void { let x: Option<int> = None; }');
99
+ if (prog.declarations[0].body[0].kind === 'let') {
100
+ const init = prog.declarations[0].body[0].init;
101
+ expect(init.kind).toBe('none_lit');
102
+ }
103
+ });
104
+ });
105
+ // ---------------------------------------------------------------------------
106
+ // HIR lowering tests
107
+ // ---------------------------------------------------------------------------
108
+ describe('Option: HIR lowering', () => {
109
+ function hirOf(source) {
110
+ const tokens = new lexer_1.Lexer(source).tokenize();
111
+ const ast = new parser_1.Parser(tokens).parse('test');
112
+ return (0, lower_1.lowerToHIR)(ast);
113
+ }
114
+ it('lowers some_lit through HIR unchanged', () => {
115
+ const hir = hirOf('fn f(): void { let x: Option<int> = Some(42); }');
116
+ const fn0 = hir.functions[0];
117
+ const letStmt = fn0.body[0];
118
+ expect(letStmt.kind).toBe('let');
119
+ if (letStmt.kind === 'let') {
120
+ expect(letStmt.init.kind).toBe('some_lit');
121
+ }
122
+ });
123
+ it('lowers none_lit through HIR unchanged', () => {
124
+ const hir = hirOf('fn f(): void { let x: Option<int> = None; }');
125
+ const fn0 = hir.functions[0];
126
+ const letStmt = fn0.body[0];
127
+ expect(letStmt.kind).toBe('let');
128
+ if (letStmt.kind === 'let') {
129
+ expect(letStmt.init.kind).toBe('none_lit');
130
+ }
131
+ });
132
+ it('lowers if_let_some through HIR unchanged', () => {
133
+ const hir = hirOf('fn f(p: Option<int>): void { if let Some(x) = p {} }');
134
+ const fn0 = hir.functions[0];
135
+ const stmt = fn0.body[0];
136
+ expect(stmt.kind).toBe('if_let_some');
137
+ if (stmt.kind === 'if_let_some') {
138
+ expect(stmt.binding).toBe('x');
139
+ }
140
+ });
141
+ });
142
+ // ---------------------------------------------------------------------------
143
+ // Compilation (E2E) tests
144
+ // ---------------------------------------------------------------------------
145
+ describe('Option: E2E compilation', () => {
146
+ it('compiles Some(42) assignment — sets has=1, val=42', () => {
147
+ const source = `
148
+ fn test(): void {
149
+ let p: Option<int> = Some(42);
150
+ }
151
+ `;
152
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
153
+ const fn = getFile(result.files, 'test');
154
+ expect(fn).toBeDefined();
155
+ expect(fn).toContain('scoreboard players set');
156
+ // has slot should be set to 1, val slot should be set to 42
157
+ expect(fn).toContain('1');
158
+ expect(fn).toContain('42');
159
+ });
160
+ it('compiles None assignment — sets has=0', () => {
161
+ const source = `
162
+ fn test(): void {
163
+ let p: Option<int> = None;
164
+ }
165
+ `;
166
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
167
+ const fn = getFile(result.files, 'test');
168
+ expect(fn).toBeDefined();
169
+ expect(fn).toContain('scoreboard players set');
170
+ expect(fn).toContain('0');
171
+ });
172
+ it('compiles if let Some(x) = p — conditional on has slot', () => {
173
+ const source = `
174
+ fn test(p: Option<int>): void {
175
+ if let Some(x) = p {
176
+ let y: int = x;
177
+ }
178
+ }
179
+ `;
180
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
181
+ // Should generate a conditional call checking has slot
182
+ expect(result.files.length).toBeGreaterThan(0);
183
+ });
184
+ it('compiles function returning Option<int> Some value', () => {
185
+ const source = `
186
+ fn make_some(): Option<int> {
187
+ return Some(99);
188
+ }
189
+ fn test(): void {
190
+ let p: Option<int> = make_some();
191
+ }
192
+ `;
193
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
194
+ const fn = getFile(result.files, 'make_some');
195
+ expect(fn).toBeDefined();
196
+ // Should set ret_has=1 and ret_val=99
197
+ expect(fn).toContain('$ret_has');
198
+ expect(fn).toContain('99');
199
+ });
200
+ it('compiles function returning Option<int> None value', () => {
201
+ const source = `
202
+ fn make_none(): Option<int> {
203
+ return None;
204
+ }
205
+ `;
206
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
207
+ const fn = getFile(result.files, 'make_none');
208
+ expect(fn).toBeDefined();
209
+ expect(fn).toContain('$ret_has');
210
+ // has=0
211
+ expect(fn).toContain('0');
212
+ });
213
+ it('compiles full if-let Some pattern with body using bound variable', () => {
214
+ // Use a function that returns Option<int> so the condition is not constant-folded
215
+ const source = `
216
+ fn maybe_val(): Option<int> {
217
+ return Some(10);
218
+ }
219
+ @tick
220
+ fn tick(): void {
221
+ let p: Option<int> = maybe_val();
222
+ if let Some(n) = p {
223
+ let doubled: int = n + n;
224
+ }
225
+ }
226
+ `;
227
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
228
+ expect(result.files.length).toBeGreaterThan(0);
229
+ // Verify a conditional function split was created
230
+ const hasConditional = result.files.some(f => f.content.includes('execute if score'));
231
+ expect(hasConditional).toBe(true);
232
+ });
233
+ it('compiles if-let with else branch', () => {
234
+ const source = `
235
+ @tick
236
+ fn tick(): void {
237
+ let q: Option<int> = None;
238
+ if let Some(v) = q {
239
+ let a: int = v;
240
+ } else {
241
+ let b: int = 0;
242
+ }
243
+ }
244
+ `;
245
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
246
+ expect(result.files.length).toBeGreaterThan(0);
247
+ });
248
+ it('compiles nested if-let inside if-let', () => {
249
+ const source = `
250
+ fn test(): void {
251
+ let a: Option<int> = Some(1);
252
+ let b: Option<int> = Some(2);
253
+ if let Some(x) = a {
254
+ if let Some(y) = b {
255
+ let sum: int = x + y;
256
+ }
257
+ }
258
+ }
259
+ `;
260
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
261
+ expect(result.files.length).toBeGreaterThan(0);
262
+ });
263
+ it('generated scoreboard slots are unique per function and variable', () => {
264
+ const source = `
265
+ fn test(): void {
266
+ let p: Option<int> = Some(5);
267
+ let q: Option<int> = None;
268
+ }
269
+ `;
270
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
271
+ const fn = getFile(result.files, 'test');
272
+ expect(fn).toBeDefined();
273
+ });
274
+ });
275
+ //# sourceMappingURL=option.test.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for @schedule decorator (Phase 5c)
3
+ *
4
+ * @schedule(ticks=N) generates a _schedule_xxx.mcfunction wrapper that
5
+ * emits `schedule function ns:xxx Nt`.
6
+ */
7
+ export {};
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for @schedule decorator (Phase 5c)
4
+ *
5
+ * @schedule(ticks=N) generates a _schedule_xxx.mcfunction wrapper that
6
+ * emits `schedule function ns:xxx Nt`.
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
+ describe('@schedule decorator', () => {
15
+ test('@schedule(ticks=20) generates _schedule wrapper with 20t', () => {
16
+ const source = `
17
+ @schedule(ticks=20)
18
+ fn after_one_second(): void {
19
+ say("One second passed!");
20
+ }
21
+ `;
22
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
23
+ const wrapper = getFile(result.files, '_schedule_after_one_second.mcfunction');
24
+ expect(wrapper).toBeDefined();
25
+ expect(wrapper).toBe('schedule function test:after_one_second 20t\n');
26
+ });
27
+ test('@schedule(ticks=1) generates _schedule wrapper with 1t', () => {
28
+ const source = `
29
+ @schedule(ticks=1)
30
+ fn next_tick(): void {
31
+ say("next tick!");
32
+ }
33
+ `;
34
+ const result = (0, compile_1.compile)(source, { namespace: 'ns' });
35
+ const wrapper = getFile(result.files, '_schedule_next_tick.mcfunction');
36
+ expect(wrapper).toBeDefined();
37
+ expect(wrapper).toBe('schedule function ns:next_tick 1t\n');
38
+ });
39
+ test('@schedule does not affect tick.json', () => {
40
+ const source = `
41
+ @schedule(ticks=20)
42
+ fn deferred(): void {
43
+ say("deferred");
44
+ }
45
+ `;
46
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
47
+ const tickJson = getFile(result.files, 'tick.json');
48
+ expect(tickJson).toBeUndefined();
49
+ });
50
+ test('@schedule coexists with @tick and @load', () => {
51
+ const source = `
52
+ @tick
53
+ fn game_tick(): void {
54
+ let x: int = 1;
55
+ }
56
+
57
+ @load
58
+ fn init(): void {
59
+ let y: int = 0;
60
+ }
61
+
62
+ @schedule(ticks=40)
63
+ fn two_seconds(): void {
64
+ say("two seconds!");
65
+ }
66
+ `;
67
+ const result = (0, compile_1.compile)(source, { namespace: 'combo' });
68
+ // @tick still works
69
+ const tickJson = getFile(result.files, 'tick.json');
70
+ expect(tickJson).toBeDefined();
71
+ expect(JSON.parse(tickJson).values).toContain('combo:game_tick');
72
+ // @load still works
73
+ const loadJson = getFile(result.files, 'load.json');
74
+ expect(loadJson).toBeDefined();
75
+ expect(JSON.parse(loadJson).values).toContain('combo:init');
76
+ // @schedule generates wrapper
77
+ const wrapper = getFile(result.files, '_schedule_two_seconds.mcfunction');
78
+ expect(wrapper).toBeDefined();
79
+ expect(wrapper).toBe('schedule function combo:two_seconds 40t\n');
80
+ });
81
+ test('calling _schedule_xxx() invokes the schedule wrapper', () => {
82
+ const source = `
83
+ @schedule(ticks=20)
84
+ fn after_one_second(): void {
85
+ say("delayed");
86
+ }
87
+
88
+ fn start(): void {
89
+ _schedule_after_one_second();
90
+ }
91
+ `;
92
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
93
+ const startFn = getFile(result.files, 'start.mcfunction');
94
+ expect(startFn).toBeDefined();
95
+ expect(startFn).toContain('function test:_schedule_after_one_second');
96
+ });
97
+ });
98
+ //# sourceMappingURL=schedule.test.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Source Map Tests — Phase 4a
3
+ *
4
+ * Verifies that generated .sourcemap.json files correctly map output lines
5
+ * back to source .mcrs locations.
6
+ */
7
+ export {};