redscript-mc 2.0.0 → 2.1.1

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