redscript-mc 1.2.30 → 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.
- package/.claudeignore +21 -0
- package/.github/workflows/ci.yml +1 -0
- package/README.md +12 -16
- package/README.zh.md +2 -2
- package/demo.gif +0 -0
- package/dist/cli.js +2 -554
- package/dist/compile.js +2 -266
- package/dist/index.js +2 -159
- package/dist/src/__tests__/budget.test.js +261 -0
- package/dist/src/__tests__/cli.test.js +104 -0
- package/dist/{__tests__ → src/__tests__}/dce.test.js +11 -47
- package/dist/{__tests__ → src/__tests__}/diagnostics.test.js +67 -40
- package/dist/src/__tests__/e2e/basic.test.d.ts +8 -0
- package/dist/src/__tests__/e2e/basic.test.js +140 -0
- package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
- package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
- package/dist/src/__tests__/e2e/macros.test.d.ts +9 -0
- package/dist/src/__tests__/e2e/macros.test.js +182 -0
- package/dist/src/__tests__/e2e/migrate.test.d.ts +13 -0
- package/dist/src/__tests__/e2e/migrate.test.js +2739 -0
- package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
- package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
- package/dist/src/__tests__/enum.test.d.ts +10 -0
- package/dist/src/__tests__/enum.test.js +389 -0
- package/dist/src/__tests__/generics.test.d.ts +14 -0
- package/dist/src/__tests__/generics.test.js +367 -0
- package/dist/src/__tests__/hir/desugar.test.js +234 -0
- package/dist/src/__tests__/incremental.test.d.ts +5 -0
- package/dist/src/__tests__/incremental.test.js +308 -0
- package/dist/src/__tests__/lir/lower.test.js +559 -0
- package/dist/src/__tests__/lir/types.test.js +185 -0
- package/dist/src/__tests__/lir/verify.test.js +221 -0
- package/dist/src/__tests__/lsp.test.d.ts +7 -0
- package/dist/src/__tests__/lsp.test.js +245 -0
- package/dist/{__tests__ → src/__tests__}/mc-integration.test.js +1 -3
- package/dist/src/__tests__/mc-version.test.d.ts +10 -0
- package/dist/src/__tests__/mc-version.test.js +154 -0
- package/dist/src/__tests__/mir/arithmetic.test.js +130 -0
- package/dist/src/__tests__/mir/control-flow.test.js +205 -0
- package/dist/src/__tests__/mir/verify.test.js +223 -0
- package/dist/src/__tests__/modules.test.d.ts +7 -0
- package/dist/src/__tests__/modules.test.js +333 -0
- package/dist/src/__tests__/optimizer/block_merge.test.js +78 -0
- package/dist/src/__tests__/optimizer/branch_simplify.test.js +58 -0
- package/dist/src/__tests__/optimizer/constant_fold.test.js +131 -0
- package/dist/src/__tests__/optimizer/copy_prop.test.js +91 -0
- package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
- package/dist/src/__tests__/optimizer/dce.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/dce.test.js +76 -0
- package/dist/src/__tests__/optimizer/interprocedural.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
- package/dist/src/__tests__/optimizer/lir/const_imm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
- package/dist/src/__tests__/optimizer/lir/dead_slot.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
- package/dist/src/__tests__/optimizer/lir/peephole.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
- package/dist/src/__tests__/optimizer/lir/pipeline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
- package/dist/src/__tests__/optimizer/nbt-batch.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
- package/dist/src/__tests__/optimizer/pipeline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/pipeline.test.js +102 -0
- package/dist/src/__tests__/optimizer/selector-cache.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
- package/dist/src/__tests__/optimizer/unroll.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
- package/dist/src/__tests__/option.test.d.ts +14 -0
- package/dist/src/__tests__/option.test.js +275 -0
- package/dist/src/__tests__/parser.test.d.ts +1 -0
- package/dist/src/__tests__/repl.test.d.ts +1 -0
- package/dist/src/__tests__/schedule.test.d.ts +7 -0
- package/dist/src/__tests__/schedule.test.js +98 -0
- package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
- package/dist/src/__tests__/sourcemap.test.js +227 -0
- package/dist/src/__tests__/tuple.test.d.ts +11 -0
- package/dist/src/__tests__/tuple.test.js +202 -0
- package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
- package/dist/src/__tests__/typechecker-strict.test.js +197 -0
- package/dist/src/__tests__/typechecker.test.d.ts +1 -0
- package/dist/{ast → src/ast}/types.d.ts +58 -3
- package/dist/src/cache/deps.d.ts +41 -0
- package/dist/src/cache/deps.js +158 -0
- package/dist/src/cache/incremental.d.ts +35 -0
- package/dist/src/cache/incremental.js +165 -0
- package/dist/src/cache/index.d.ts +37 -0
- package/dist/src/cache/index.js +152 -0
- package/dist/{cli.d.ts → src/cli.d.ts} +1 -1
- package/dist/src/cli.js +474 -0
- package/dist/src/compile.d.ts +37 -0
- package/dist/src/compile.js +165 -0
- package/dist/{diagnostics → src/diagnostics}/index.d.ts +1 -1
- package/dist/{diagnostics → src/diagnostics}/index.js +8 -11
- package/dist/src/emit/compile.d.ts +29 -0
- package/dist/src/emit/compile.js +143 -0
- package/dist/src/emit/index.d.ts +26 -0
- package/dist/src/emit/index.js +223 -0
- package/dist/src/emit/modules.d.ts +29 -0
- package/dist/src/emit/modules.js +492 -0
- package/dist/src/emit/sourcemap.d.ts +53 -0
- package/dist/src/emit/sourcemap.js +73 -0
- package/dist/src/hir/lower.d.ts +15 -0
- package/dist/src/hir/lower.js +399 -0
- package/dist/src/hir/monomorphize.d.ts +22 -0
- package/dist/src/hir/monomorphize.js +379 -0
- package/dist/src/hir/types.d.ts +406 -0
- package/dist/src/hir/types.js +16 -0
- package/dist/src/index.d.ts +39 -0
- package/dist/src/index.js +67 -0
- package/dist/{lexer → src/lexer}/index.d.ts +1 -1
- package/dist/{lexer → src/lexer}/index.js +1 -0
- package/dist/src/lir/budget.d.ts +37 -0
- package/dist/src/lir/budget.js +280 -0
- package/dist/src/lir/lower.d.ts +15 -0
- package/dist/src/lir/lower.js +472 -0
- package/dist/src/lir/types.d.ts +139 -0
- package/dist/src/lir/types.js +11 -0
- package/dist/src/lir/verify.d.ts +14 -0
- package/dist/src/lir/verify.js +113 -0
- package/dist/src/lsp/main.d.ts +8 -0
- package/dist/src/lsp/main.js +11 -0
- package/dist/src/lsp/server.d.ts +11 -0
- package/dist/src/lsp/server.js +352 -0
- package/dist/{mc-test → src/mc-test}/runner.js +4 -3
- package/dist/src/mir/lower.d.ts +9 -0
- package/dist/src/mir/lower.js +1264 -0
- package/dist/src/mir/macro.d.ts +22 -0
- package/dist/src/mir/macro.js +168 -0
- package/dist/src/mir/types.d.ts +191 -0
- package/dist/src/mir/types.js +11 -0
- package/dist/src/mir/verify.d.ts +16 -0
- package/dist/src/mir/verify.js +216 -0
- package/dist/src/optimizer/block_merge.d.ts +12 -0
- package/dist/src/optimizer/block_merge.js +84 -0
- package/dist/src/optimizer/branch_simplify.d.ts +9 -0
- package/dist/src/optimizer/branch_simplify.js +28 -0
- package/dist/src/optimizer/constant_fold.d.ts +10 -0
- package/dist/src/optimizer/constant_fold.js +85 -0
- package/dist/src/optimizer/copy_prop.d.ts +9 -0
- package/dist/src/optimizer/copy_prop.js +113 -0
- package/dist/src/optimizer/coroutine.d.ts +34 -0
- package/dist/src/optimizer/coroutine.js +789 -0
- package/dist/src/optimizer/dce.d.ts +8 -0
- package/dist/src/optimizer/dce.js +156 -0
- package/dist/src/optimizer/interprocedural.d.ts +14 -0
- package/dist/src/optimizer/interprocedural.js +186 -0
- package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
- package/dist/src/optimizer/lir/const_imm.js +139 -0
- package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
- package/dist/src/optimizer/lir/dead_slot.js +130 -0
- package/dist/src/optimizer/lir/peephole.d.ts +21 -0
- package/dist/src/optimizer/lir/peephole.js +52 -0
- package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
- package/dist/src/optimizer/lir/pipeline.js +34 -0
- package/dist/src/optimizer/nbt-batch.d.ts +11 -0
- package/dist/src/optimizer/nbt-batch.js +51 -0
- package/dist/src/optimizer/pipeline.d.ts +14 -0
- package/dist/src/optimizer/pipeline.js +58 -0
- package/dist/src/optimizer/selector-cache.d.ts +22 -0
- package/dist/src/optimizer/selector-cache.js +100 -0
- package/dist/src/optimizer/unroll.d.ts +32 -0
- package/dist/src/optimizer/unroll.js +348 -0
- package/dist/{parser → src/parser}/index.d.ts +8 -0
- package/dist/{parser → src/parser}/index.js +204 -14
- package/dist/{repl.d.ts → src/repl.d.ts} +1 -1
- package/dist/{runtime → src/runtime}/index.js +1 -1
- package/dist/{typechecker → src/typechecker}/index.d.ts +4 -0
- package/dist/{typechecker → src/typechecker}/index.js +198 -13
- package/dist/src/types/mc-version.d.ts +24 -0
- package/dist/src/types/mc-version.js +49 -0
- package/docs/ROADMAP.md +395 -0
- package/docs/compiler-pipeline-redesign.md +2260 -0
- package/docs/optimization-ideas.md +1076 -0
- package/editors/vscode/out/extension.js +25176 -8000
- package/editors/vscode/package-lock.json +90 -6
- package/editors/vscode/package.json +3 -2
- package/editors/vscode/src/extension.ts +97 -67
- package/examples/showcase.mcrs +3 -3
- package/package.json +13 -6
- package/scripts/postbuild.js +15 -0
- package/src/__tests__/budget.test.ts +297 -0
- package/src/__tests__/cli.test.ts +8 -220
- package/src/__tests__/dce.test.ts +11 -56
- package/src/__tests__/diagnostics.test.ts +61 -41
- package/src/__tests__/e2e/basic.test.ts +154 -0
- package/src/__tests__/e2e/coroutine.test.ts +142 -0
- package/src/__tests__/e2e/macros.test.ts +199 -0
- package/src/__tests__/e2e/migrate.test.ts +3008 -0
- package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
- package/src/__tests__/enum.test.ts +425 -0
- package/src/__tests__/generics.test.ts +390 -0
- package/src/__tests__/hir/desugar.test.ts +263 -0
- package/src/__tests__/incremental.test.ts +337 -0
- package/src/__tests__/lir/lower.test.ts +619 -0
- package/src/__tests__/lir/types.test.ts +207 -0
- package/src/__tests__/lir/verify.test.ts +249 -0
- package/src/__tests__/lsp.test.ts +270 -0
- package/src/__tests__/mc-integration.test.ts +1 -2
- package/src/__tests__/mc-version.test.ts +178 -0
- package/src/__tests__/mir/arithmetic.test.ts +156 -0
- package/src/__tests__/mir/control-flow.test.ts +242 -0
- package/src/__tests__/mir/verify.test.ts +254 -0
- package/src/__tests__/modules.test.ts +365 -0
- package/src/__tests__/optimizer/block_merge.test.ts +84 -0
- package/src/__tests__/optimizer/branch_simplify.test.ts +64 -0
- package/src/__tests__/optimizer/constant_fold.test.ts +145 -0
- package/src/__tests__/optimizer/copy_prop.test.ts +99 -0
- package/src/__tests__/optimizer/coroutine.test.ts +312 -0
- package/src/__tests__/optimizer/dce.test.ts +83 -0
- package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
- package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
- package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
- package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
- package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
- package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
- package/src/__tests__/optimizer/pipeline.test.ts +116 -0
- package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
- package/src/__tests__/optimizer/unroll.test.ts +231 -0
- package/src/__tests__/option.test.ts +299 -0
- package/src/__tests__/schedule.test.ts +105 -0
- package/src/__tests__/sourcemap.test.ts +254 -0
- package/src/__tests__/tuple.test.ts +220 -0
- package/src/__tests__/typechecker-strict.test.ts +216 -0
- package/src/ast/types.ts +39 -3
- package/src/cache/deps.ts +132 -0
- package/src/cache/incremental.ts +173 -0
- package/src/cache/index.ts +135 -0
- package/src/cli.ts +111 -195
- package/src/compile.ts +6 -162
- package/src/diagnostics/index.ts +8 -11
- package/src/emit/compile.ts +177 -0
- package/src/emit/index.ts +286 -0
- package/src/emit/modules.ts +581 -0
- package/src/emit/sourcemap.ts +101 -0
- package/src/hir/lower.ts +455 -0
- package/src/hir/monomorphize.ts +416 -0
- package/src/hir/types.ts +228 -0
- package/src/index.ts +37 -182
- package/src/lexer/index.ts +2 -1
- package/src/lir/budget.ts +321 -0
- package/src/lir/lower.ts +587 -0
- package/src/lir/types.ts +113 -0
- package/src/lir/verify.ts +129 -0
- package/src/lsp/main.ts +9 -0
- package/src/lsp/server.ts +414 -0
- package/src/mc-test/runner.ts +4 -3
- package/src/mir/lower.ts +1403 -0
- package/src/mir/macro.ts +167 -0
- package/src/mir/types.ts +117 -0
- package/src/mir/verify.ts +218 -0
- package/src/optimizer/block_merge.ts +93 -0
- package/src/optimizer/branch_simplify.ts +27 -0
- package/src/optimizer/constant_fold.ts +88 -0
- package/src/optimizer/copy_prop.ts +106 -0
- package/src/optimizer/coroutine.ts +996 -0
- package/src/optimizer/dce.ts +108 -653
- package/src/optimizer/interprocedural.ts +177 -0
- package/src/optimizer/lir/const_imm.ts +143 -0
- package/src/optimizer/lir/dead_slot.ts +123 -0
- package/src/optimizer/lir/peephole.ts +57 -0
- package/src/optimizer/lir/pipeline.ts +37 -0
- package/src/optimizer/nbt-batch.ts +50 -0
- package/src/optimizer/pipeline.ts +59 -0
- package/src/optimizer/selector-cache.ts +103 -0
- package/src/optimizer/unroll.ts +386 -0
- package/src/parser/index.ts +213 -16
- package/src/repl.ts +1 -1
- package/src/runtime/index.ts +1 -1
- package/src/stdlib/math.mcrs +4 -4
- package/src/templates/quest.mcrs +4 -4
- package/src/typechecker/index.ts +215 -15
- package/src/types/mc-version.ts +46 -0
- package/tsconfig.json +1 -1
- package/dist/__tests__/cli.test.js +0 -278
- package/dist/__tests__/codegen.test.js +0 -152
- package/dist/__tests__/e2e.test.d.ts +0 -6
- package/dist/__tests__/e2e.test.js +0 -1847
- package/dist/__tests__/entity-types.test.js +0 -203
- package/dist/__tests__/lowering.test.js +0 -1015
- package/dist/__tests__/macro.test.d.ts +0 -8
- package/dist/__tests__/macro.test.js +0 -305
- package/dist/__tests__/nbt.test.js +0 -82
- package/dist/__tests__/optimizer-advanced.test.js +0 -124
- package/dist/__tests__/optimizer.test.js +0 -149
- package/dist/__tests__/runtime.test.js +0 -289
- package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
- package/dist/__tests__/stdlib-advanced.test.js +0 -378
- package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
- package/dist/__tests__/stdlib-bigint.test.js +0 -428
- package/dist/__tests__/stdlib-math.test.d.ts +0 -7
- package/dist/__tests__/stdlib-math.test.js +0 -352
- package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
- package/dist/__tests__/stdlib-vec.test.js +0 -264
- package/dist/__tests__/structure-optimizer.test.js +0 -33
- package/dist/__tests__/var-allocator.test.js +0 -69
- package/dist/codegen/cmdblock/index.d.ts +0 -26
- package/dist/codegen/cmdblock/index.js +0 -45
- package/dist/codegen/mcfunction/index.d.ts +0 -40
- package/dist/codegen/mcfunction/index.js +0 -606
- package/dist/codegen/structure/index.d.ts +0 -24
- package/dist/codegen/structure/index.js +0 -279
- package/dist/codegen/var-allocator.d.ts +0 -45
- package/dist/codegen/var-allocator.js +0 -104
- package/dist/compile.d.ts +0 -68
- package/dist/data/arena/function/__load.mcfunction +0 -6
- package/dist/data/arena/function/__tick.mcfunction +0 -2
- package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
- package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
- package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
- package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
- package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
- package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
- package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
- package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
- package/dist/data/arena/function/arena_tick.mcfunction +0 -11
- package/dist/data/counter/function/__load.mcfunction +0 -5
- package/dist/data/counter/function/__tick.mcfunction +0 -2
- package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
- package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
- package/dist/data/counter/function/counter_tick.mcfunction +0 -11
- package/dist/data/gcd2/function/__load.mcfunction +0 -3
- package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd2/function/abs.mcfunction +0 -7
- package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd2/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3/function/__load.mcfunction +0 -3
- package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd3/function/abs.mcfunction +0 -7
- package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd3/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3/function/test.mcfunction +0 -7
- package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
- package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
- package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3nm/function/test.mcfunction +0 -7
- package/dist/data/gcd_test/function/__load.mcfunction +0 -3
- package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd_test/function/abs.mcfunction +0 -7
- package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
- package/dist/data/isqrttest/function/__load.mcfunction +0 -6
- package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
- package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
- package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
- package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
- package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
- package/dist/data/isqrttest/function/test.mcfunction +0 -6
- package/dist/data/mathtest/function/__load.mcfunction +0 -3
- package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
- package/dist/data/mathtest/function/abs.mcfunction +0 -6
- package/dist/data/mathtest/function/test.mcfunction +0 -5
- package/dist/data/minecraft/tags/function/load.json +0 -5
- package/dist/data/minecraft/tags/function/tick.json +0 -5
- package/dist/data/mypack/function/__load.mcfunction +0 -13
- package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
- package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
- package/dist/data/mypack/function/abs.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
- package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
- package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
- package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
- package/dist/data/mypack/function/my_game.mcfunction +0 -10
- package/dist/data/quiz/function/__load.mcfunction +0 -16
- package/dist/data/quiz/function/__tick.mcfunction +0 -6
- package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/answer_a.mcfunction +0 -4
- package/dist/data/quiz/function/answer_b.mcfunction +0 -4
- package/dist/data/quiz/function/answer_c.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
- package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
- package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
- package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
- package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
- package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question.mcfunction +0 -7
- package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
- package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
- package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
- package/dist/data/reqtest/function/__load.mcfunction +0 -4
- package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
- package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
- package/dist/data/reqtest/function/use_table.mcfunction +0 -4
- package/dist/data/reqtest2/function/__load.mcfunction +0 -3
- package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
- package/dist/data/runtime/function/__load.mcfunction +0 -5
- package/dist/data/runtime/function/__tick.mcfunction +0 -2
- package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
- package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
- package/dist/data/shop/function/__load.mcfunction +0 -7
- package/dist/data/shop/function/__tick.mcfunction +0 -3
- package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
- package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
- package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
- package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
- package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
- package/dist/data/swap_test/function/__load.mcfunction +0 -3
- package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
- package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
- package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
- package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
- package/dist/data/turret/function/__load.mcfunction +0 -5
- package/dist/data/turret/function/__tick.mcfunction +0 -4
- package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
- package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
- package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
- package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
- package/dist/data/turret/function/turret_tick.mcfunction +0 -5
- package/dist/gcd2.map.json +0 -15
- package/dist/gcd3.map.json +0 -17
- package/dist/gcd_test.map.json +0 -15
- package/dist/index.d.ts +0 -62
- package/dist/ir/builder.d.ts +0 -33
- package/dist/ir/builder.js +0 -99
- package/dist/ir/types.d.ts +0 -132
- package/dist/ir/types.js +0 -15
- package/dist/isqrttest.map.json +0 -15
- package/dist/lowering/index.d.ts +0 -188
- package/dist/lowering/index.js +0 -3403
- package/dist/mathtest.map.json +0 -6
- package/dist/mypack.map.json +0 -27
- package/dist/optimizer/commands.d.ts +0 -38
- package/dist/optimizer/commands.js +0 -451
- package/dist/optimizer/dce.d.ts +0 -34
- package/dist/optimizer/dce.js +0 -639
- package/dist/optimizer/passes.d.ts +0 -34
- package/dist/optimizer/passes.js +0 -243
- package/dist/optimizer/structure.d.ts +0 -9
- package/dist/optimizer/structure.js +0 -356
- package/dist/pack.mcmeta +0 -6
- package/dist/reqtest.map.json +0 -4
- package/dist/reqtest2.map.json +0 -4
- package/dist/runtime.map.json +0 -7
- package/dist/swap_test.map.json +0 -14
- package/src/__tests__/codegen.test.ts +0 -161
- package/src/__tests__/e2e.test.ts +0 -2039
- package/src/__tests__/entity-types.test.ts +0 -236
- package/src/__tests__/lowering.test.ts +0 -1185
- package/src/__tests__/macro.test.ts +0 -343
- package/src/__tests__/nbt.test.ts +0 -58
- package/src/__tests__/optimizer-advanced.test.ts +0 -144
- package/src/__tests__/optimizer.test.ts +0 -162
- package/src/__tests__/runtime.test.ts +0 -305
- package/src/__tests__/stdlib-advanced.test.ts +0 -379
- package/src/__tests__/stdlib-bigint.test.ts +0 -427
- package/src/__tests__/stdlib-math.test.ts +0 -374
- package/src/__tests__/stdlib-vec.test.ts +0 -259
- package/src/__tests__/structure-optimizer.test.ts +0 -38
- package/src/__tests__/var-allocator.test.ts +0 -75
- package/src/codegen/cmdblock/index.ts +0 -63
- package/src/codegen/mcfunction/index.ts +0 -662
- package/src/codegen/structure/index.ts +0 -346
- package/src/codegen/var-allocator.ts +0 -104
- package/src/ir/builder.ts +0 -116
- package/src/ir/types.ts +0 -134
- package/src/lowering/index.ts +0 -3876
- package/src/optimizer/commands.ts +0 -534
- package/src/optimizer/passes.ts +0 -250
- package/src/optimizer/structure.ts +0 -450
- /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
- /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/cli.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/compile-all.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/compile-all.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/dce.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/diagnostics.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/formatter.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/formatter.test.js +0 -0
- /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/hir/desugar.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/lexer.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/lexer.test.js +0 -0
- /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/lir/lower.test.d.ts} +0 -0
- /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/lir/types.test.d.ts} +0 -0
- /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/lir/verify.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/mc-integration.test.d.ts +0 -0
- /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/mc-syntax.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/mc-syntax.test.js +0 -0
- /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/mir/arithmetic.test.d.ts} +0 -0
- /package/dist/{__tests__/parser.test.d.ts → src/__tests__/mir/control-flow.test.d.ts} +0 -0
- /package/dist/{__tests__/repl.test.d.ts → src/__tests__/mir/verify.test.d.ts} +0 -0
- /package/dist/{__tests__/runtime.test.d.ts → src/__tests__/optimizer/block_merge.test.d.ts} +0 -0
- /package/dist/{__tests__/structure-optimizer.test.d.ts → src/__tests__/optimizer/branch_simplify.test.d.ts} +0 -0
- /package/dist/{__tests__/typechecker.test.d.ts → src/__tests__/optimizer/constant_fold.test.d.ts} +0 -0
- /package/dist/{__tests__/var-allocator.test.d.ts → src/__tests__/optimizer/copy_prop.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/parser.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/repl.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/typechecker.test.js +0 -0
- /package/dist/{ast → src/ast}/types.js +0 -0
- /package/dist/{builtins → src/builtins}/metadata.d.ts +0 -0
- /package/dist/{builtins → src/builtins}/metadata.js +0 -0
- /package/dist/{events → src/events}/types.d.ts +0 -0
- /package/dist/{events → src/events}/types.js +0 -0
- /package/dist/{formatter → src/formatter}/index.d.ts +0 -0
- /package/dist/{formatter → src/formatter}/index.js +0 -0
- /package/dist/{mc-test → src/mc-test}/client.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/client.js +0 -0
- /package/dist/{mc-test → src/mc-test}/runner.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/setup.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/setup.js +0 -0
- /package/dist/{mc-validator → src/mc-validator}/index.d.ts +0 -0
- /package/dist/{mc-validator → src/mc-validator}/index.js +0 -0
- /package/dist/{nbt → src/nbt}/index.d.ts +0 -0
- /package/dist/{nbt → src/nbt}/index.js +0 -0
- /package/dist/{repl.js → src/repl.js} +0 -0
- /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
- /package/dist/{types → src/types}/entity-hierarchy.d.ts +0 -0
- /package/dist/{types → src/types}/entity-hierarchy.js +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* End-to-end tests for the v2 compiler pipeline.
|
|
4
|
+
*
|
|
5
|
+
* These tests compile RedScript source through the full pipeline
|
|
6
|
+
* (Lexer → Parser → HIR → MIR → optimize → LIR → emit) and verify
|
|
7
|
+
* the generated .mcfunction output contains expected MC commands.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const compile_1 = require("../../emit/compile");
|
|
11
|
+
function getFile(files, pathSubstr) {
|
|
12
|
+
const f = files.find(f => f.path.includes(pathSubstr));
|
|
13
|
+
return f?.content;
|
|
14
|
+
}
|
|
15
|
+
describe('e2e: basic compilation', () => {
|
|
16
|
+
test('simple arithmetic function produces scoreboard commands', () => {
|
|
17
|
+
const source = `
|
|
18
|
+
fn add(a: int, b: int): int {
|
|
19
|
+
return a + b;
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
23
|
+
expect(result.files.length).toBeGreaterThan(0);
|
|
24
|
+
const addFn = getFile(result.files, 'add.mcfunction');
|
|
25
|
+
expect(addFn).toBeDefined();
|
|
26
|
+
expect(addFn).toContain('scoreboard players operation');
|
|
27
|
+
expect(addFn).toContain('__test');
|
|
28
|
+
});
|
|
29
|
+
test('pack.mcmeta is generated with pack_format 26', () => {
|
|
30
|
+
const source = `fn noop(): void {}`;
|
|
31
|
+
const result = (0, compile_1.compile)(source, { namespace: 'demo' });
|
|
32
|
+
const meta = getFile(result.files, 'pack.mcmeta');
|
|
33
|
+
expect(meta).toBeDefined();
|
|
34
|
+
const parsed = JSON.parse(meta);
|
|
35
|
+
expect(parsed.pack.pack_format).toBe(26);
|
|
36
|
+
});
|
|
37
|
+
test('load.mcfunction creates scoreboard objective', () => {
|
|
38
|
+
const source = `fn noop(): void {}`;
|
|
39
|
+
const result = (0, compile_1.compile)(source, { namespace: 'mypack' });
|
|
40
|
+
const load = getFile(result.files, 'load.mcfunction');
|
|
41
|
+
expect(load).toBeDefined();
|
|
42
|
+
expect(load).toContain('scoreboard objectives add __mypack dummy');
|
|
43
|
+
});
|
|
44
|
+
test('@tick function appears in tick.json', () => {
|
|
45
|
+
const source = `
|
|
46
|
+
@tick fn game_tick(): void {
|
|
47
|
+
let x: int = 1;
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
const result = (0, compile_1.compile)(source, { namespace: 'ticktest' });
|
|
51
|
+
const tickJson = getFile(result.files, 'tick.json');
|
|
52
|
+
expect(tickJson).toBeDefined();
|
|
53
|
+
const parsed = JSON.parse(tickJson);
|
|
54
|
+
expect(parsed.values).toContain('ticktest:game_tick');
|
|
55
|
+
});
|
|
56
|
+
test('@load function appears in load.json', () => {
|
|
57
|
+
const source = `
|
|
58
|
+
@load fn setup(): void {
|
|
59
|
+
let x: int = 42;
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
const result = (0, compile_1.compile)(source, { namespace: 'loadtest' });
|
|
63
|
+
const loadJson = getFile(result.files, 'load.json');
|
|
64
|
+
expect(loadJson).toBeDefined();
|
|
65
|
+
const parsed = JSON.parse(loadJson);
|
|
66
|
+
expect(parsed.values).toContain('loadtest:setup');
|
|
67
|
+
// load.json should also reference the objective-init load function
|
|
68
|
+
expect(parsed.values).toContain('loadtest:load');
|
|
69
|
+
});
|
|
70
|
+
test('if/else produces conditional call pattern', () => {
|
|
71
|
+
const source = `
|
|
72
|
+
fn check(x: int): int {
|
|
73
|
+
if (x > 0) {
|
|
74
|
+
return 1;
|
|
75
|
+
} else {
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
const result = (0, compile_1.compile)(source, { namespace: 'cond' });
|
|
81
|
+
// The main function should contain call_if_matches / call_unless_matches
|
|
82
|
+
const checkFn = getFile(result.files, 'check.mcfunction');
|
|
83
|
+
expect(checkFn).toBeDefined();
|
|
84
|
+
expect(checkFn).toContain('execute if score');
|
|
85
|
+
expect(checkFn).toContain('matches');
|
|
86
|
+
expect(checkFn).toContain('run function');
|
|
87
|
+
});
|
|
88
|
+
test('while loop produces loop structure with recursive call', () => {
|
|
89
|
+
const source = `
|
|
90
|
+
fn count(): void {
|
|
91
|
+
let i: int = 0;
|
|
92
|
+
while (i < 10) {
|
|
93
|
+
i = i + 1;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
`;
|
|
97
|
+
const result = (0, compile_1.compile)(source, { namespace: 'loop' });
|
|
98
|
+
// There should be a loop body function that calls itself (or a header)
|
|
99
|
+
const fnFiles = result.files.filter(f => f.path.endsWith('.mcfunction'));
|
|
100
|
+
expect(fnFiles.length).toBeGreaterThan(1); // main + at least one extracted block
|
|
101
|
+
// At least one file should have a conditional call pattern for the loop
|
|
102
|
+
const allContent = fnFiles.map(f => f.content).join('\n');
|
|
103
|
+
expect(allContent).toContain('execute if score');
|
|
104
|
+
expect(allContent).toContain('run function');
|
|
105
|
+
});
|
|
106
|
+
test('function names are lowercased in output paths', () => {
|
|
107
|
+
const source = `fn MyFunc(): void {}`;
|
|
108
|
+
const result = (0, compile_1.compile)(source, { namespace: 'ns' });
|
|
109
|
+
const fn = result.files.find(f => f.path.includes('myfunc.mcfunction'));
|
|
110
|
+
expect(fn).toBeDefined();
|
|
111
|
+
});
|
|
112
|
+
test('constant assignment produces score_set', () => {
|
|
113
|
+
const source = `
|
|
114
|
+
fn init(): int {
|
|
115
|
+
let x: int = 42;
|
|
116
|
+
return x;
|
|
117
|
+
}
|
|
118
|
+
`;
|
|
119
|
+
const result = (0, compile_1.compile)(source, { namespace: 'cst' });
|
|
120
|
+
const fn = getFile(result.files, 'init.mcfunction');
|
|
121
|
+
expect(fn).toBeDefined();
|
|
122
|
+
expect(fn).toContain('scoreboard players set');
|
|
123
|
+
expect(fn).toContain('42');
|
|
124
|
+
});
|
|
125
|
+
test('load.json always includes namespace:load', () => {
|
|
126
|
+
const source = `fn noop(): void {}`;
|
|
127
|
+
const result = (0, compile_1.compile)(source, { namespace: 'abc' });
|
|
128
|
+
const loadJson = getFile(result.files, 'load.json');
|
|
129
|
+
expect(loadJson).toBeDefined();
|
|
130
|
+
const parsed = JSON.parse(loadJson);
|
|
131
|
+
expect(parsed.values).toContain('abc:load');
|
|
132
|
+
});
|
|
133
|
+
test('no tick.json when no @tick functions', () => {
|
|
134
|
+
const source = `fn noop(): void {}`;
|
|
135
|
+
const result = (0, compile_1.compile)(source, { namespace: 'notick' });
|
|
136
|
+
const tickJson = getFile(result.files, 'tick.json');
|
|
137
|
+
expect(tickJson).toBeUndefined();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=basic.test.js.map
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* End-to-end tests for @coroutine decorator.
|
|
4
|
+
*
|
|
5
|
+
* Compiles RedScript with @coroutine through the full pipeline and
|
|
6
|
+
* verifies generated .mcfunction output and tick.json registration.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const compile_1 = require("../../emit/compile");
|
|
10
|
+
function getFile(files, pathSubstr) {
|
|
11
|
+
const f = files.find(f => f.path.includes(pathSubstr));
|
|
12
|
+
return f?.content;
|
|
13
|
+
}
|
|
14
|
+
function getFileNames(files) {
|
|
15
|
+
return files.map(f => f.path);
|
|
16
|
+
}
|
|
17
|
+
describe('e2e: @coroutine', () => {
|
|
18
|
+
test('@coroutine loop function generates dispatcher in tick.json', () => {
|
|
19
|
+
const source = `
|
|
20
|
+
@coroutine(batch=10)
|
|
21
|
+
fn process_all(): void {
|
|
22
|
+
let i: int = 0;
|
|
23
|
+
while (i < 100) {
|
|
24
|
+
let x: int = i * 2;
|
|
25
|
+
i = i + 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
29
|
+
const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
|
|
30
|
+
const tickJson = getFile(result.files, 'tick.json');
|
|
31
|
+
expect(tickJson).toBeDefined();
|
|
32
|
+
const parsed = JSON.parse(tickJson);
|
|
33
|
+
// The generated tick dispatcher should be registered
|
|
34
|
+
const hasCoroTick = parsed.values.some((v) => v.includes('_coro_'));
|
|
35
|
+
expect(hasCoroTick).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
test('@coroutine generates continuation mcfunction files', () => {
|
|
38
|
+
const source = `
|
|
39
|
+
@coroutine(batch=5)
|
|
40
|
+
fn heavy_loop(): void {
|
|
41
|
+
let i: int = 0;
|
|
42
|
+
while (i < 1000) {
|
|
43
|
+
let x: int = i + 1;
|
|
44
|
+
i = i + 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
|
|
49
|
+
const paths = getFileNames(result.files);
|
|
50
|
+
// Should have at least one continuation function file
|
|
51
|
+
const contFiles = paths.filter(p => p.includes('_coro_') && p.includes('_cont_'));
|
|
52
|
+
expect(contFiles.length).toBeGreaterThanOrEqual(1);
|
|
53
|
+
// Should have a dispatcher tick function file (may include sub-function files)
|
|
54
|
+
const tickFiles = paths.filter(p => p.includes('_coro_') && p.includes('_tick'));
|
|
55
|
+
expect(tickFiles.length).toBeGreaterThanOrEqual(1);
|
|
56
|
+
});
|
|
57
|
+
test('@coroutine with onDone generates call to callback', () => {
|
|
58
|
+
const source = `
|
|
59
|
+
fn after_done(): void {
|
|
60
|
+
let x: int = 42;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@coroutine(batch=10, onDone=after_done)
|
|
64
|
+
fn process(): void {
|
|
65
|
+
let i: int = 0;
|
|
66
|
+
while (i < 100) {
|
|
67
|
+
let x: int = i;
|
|
68
|
+
i = i + 1;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
|
|
73
|
+
// The continuation files should reference after_done somewhere
|
|
74
|
+
const contFiles = result.files.filter(f => f.path.includes('_coro_') && f.path.includes('_cont_'));
|
|
75
|
+
const allContent = contFiles.map(f => f.content).join('\n');
|
|
76
|
+
expect(allContent).toContain('after_done');
|
|
77
|
+
});
|
|
78
|
+
test('@coroutine function without loops still compiles', () => {
|
|
79
|
+
const source = `
|
|
80
|
+
@coroutine(batch=10)
|
|
81
|
+
fn no_loop(): void {
|
|
82
|
+
let x: int = 1;
|
|
83
|
+
let y: int = x + 2;
|
|
84
|
+
}
|
|
85
|
+
`;
|
|
86
|
+
const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
|
|
87
|
+
expect(result.files.length).toBeGreaterThan(0);
|
|
88
|
+
// Should still produce continuation + dispatcher
|
|
89
|
+
const paths = getFileNames(result.files);
|
|
90
|
+
const contFiles = paths.filter(p => p.includes('_coro_'));
|
|
91
|
+
expect(contFiles.length).toBeGreaterThanOrEqual(2); // at least cont + tick
|
|
92
|
+
});
|
|
93
|
+
test('@coroutine preserves non-coroutine functions', () => {
|
|
94
|
+
const source = `
|
|
95
|
+
fn helper(): int {
|
|
96
|
+
return 42;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@coroutine(batch=10)
|
|
100
|
+
fn process(): void {
|
|
101
|
+
let i: int = 0;
|
|
102
|
+
while (i < 100) {
|
|
103
|
+
let x: int = i;
|
|
104
|
+
i = i + 1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
`;
|
|
108
|
+
const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
|
|
109
|
+
const helperFn = getFile(result.files, 'helper.mcfunction');
|
|
110
|
+
expect(helperFn).toBeDefined();
|
|
111
|
+
});
|
|
112
|
+
test('default batch value is 10 when not specified', () => {
|
|
113
|
+
// @coroutine without batch should default to batch=10
|
|
114
|
+
// We test by ensuring compilation succeeds
|
|
115
|
+
const source = `
|
|
116
|
+
@coroutine
|
|
117
|
+
fn process(): void {
|
|
118
|
+
let i: int = 0;
|
|
119
|
+
while (i < 100) {
|
|
120
|
+
let x: int = i;
|
|
121
|
+
i = i + 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
`;
|
|
125
|
+
const result = (0, compile_1.compile)(source, { namespace: 'corotest' });
|
|
126
|
+
expect(result.files.length).toBeGreaterThan(0);
|
|
127
|
+
const paths = getFileNames(result.files);
|
|
128
|
+
const contFiles = paths.filter(p => p.includes('_coro_'));
|
|
129
|
+
expect(contFiles.length).toBeGreaterThanOrEqual(2);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=coroutine.test.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-to-end tests for MC 1.20.2+ macro function support in the v2 pipeline.
|
|
3
|
+
*
|
|
4
|
+
* When a function uses runtime parameters in positions that require literal
|
|
5
|
+
* values in MC commands (coordinates, entity types, etc.), the compiler should
|
|
6
|
+
* automatically compile it as a macro function using $-prefixed syntax and
|
|
7
|
+
* call it via `function ns:fn with storage rs:macro_args`.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* End-to-end tests for MC 1.20.2+ macro function support in the v2 pipeline.
|
|
4
|
+
*
|
|
5
|
+
* When a function uses runtime parameters in positions that require literal
|
|
6
|
+
* values in MC commands (coordinates, entity types, etc.), the compiler should
|
|
7
|
+
* automatically compile it as a macro function using $-prefixed syntax and
|
|
8
|
+
* call it via `function ns:fn with storage rs:macro_args`.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const compile_1 = require("../../emit/compile");
|
|
12
|
+
function getFile(files, pathSubstr) {
|
|
13
|
+
const f = files.find(f => f.path.includes(pathSubstr));
|
|
14
|
+
return f?.content;
|
|
15
|
+
}
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Macro function detection
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
describe('e2e: macro function detection', () => {
|
|
20
|
+
test('function with int params in summon coords emits $-prefixed command', () => {
|
|
21
|
+
const source = `
|
|
22
|
+
fn spawn_zombie(x: int, y: int, z: int) {
|
|
23
|
+
summon("minecraft:zombie", x, y, z);
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
27
|
+
const fn = getFile(result.files, 'spawn_zombie.mcfunction');
|
|
28
|
+
expect(fn).toBeDefined();
|
|
29
|
+
// The function body should have a $summon macro line
|
|
30
|
+
expect(fn).toContain('$summon minecraft:zombie $(x) $(y) $(z)');
|
|
31
|
+
});
|
|
32
|
+
test('function with all constant args does NOT produce macro line', () => {
|
|
33
|
+
const source = `
|
|
34
|
+
fn spawn_fixed() {
|
|
35
|
+
summon("minecraft:zombie", 100, 64, 200);
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
39
|
+
const fn = getFile(result.files, 'spawn_fixed.mcfunction');
|
|
40
|
+
expect(fn).toBeDefined();
|
|
41
|
+
expect(fn).toContain('summon minecraft:zombie 100 64 200');
|
|
42
|
+
// No $ prefix
|
|
43
|
+
expect(fn).not.toMatch(/^\$summon/m);
|
|
44
|
+
});
|
|
45
|
+
test('function with int params in particle coords emits $-prefixed command', () => {
|
|
46
|
+
const source = `
|
|
47
|
+
fn show_particle(x: int, y: int, z: int) {
|
|
48
|
+
particle("minecraft:flame", x, y, z);
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
52
|
+
const fn = getFile(result.files, 'show_particle.mcfunction');
|
|
53
|
+
expect(fn).toBeDefined();
|
|
54
|
+
expect(fn).toContain('$particle minecraft:flame $(x) $(y) $(z)');
|
|
55
|
+
});
|
|
56
|
+
test('function with int params in setblock coords emits $-prefixed command', () => {
|
|
57
|
+
const source = `
|
|
58
|
+
fn place_block(x: int, y: int, z: int) {
|
|
59
|
+
setblock(x, y, z, "minecraft:stone");
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
63
|
+
const fn = getFile(result.files, 'place_block.mcfunction');
|
|
64
|
+
expect(fn).toBeDefined();
|
|
65
|
+
expect(fn).toContain('$setblock $(x) $(y) $(z) minecraft:stone');
|
|
66
|
+
});
|
|
67
|
+
test('mixed literal and variable args: only variable args get $()', () => {
|
|
68
|
+
const source = `
|
|
69
|
+
fn teleport_y(y: int) {
|
|
70
|
+
summon("minecraft:zombie", 100, y, 200);
|
|
71
|
+
}
|
|
72
|
+
`;
|
|
73
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
74
|
+
const fn = getFile(result.files, 'teleport_y.mcfunction');
|
|
75
|
+
expect(fn).toBeDefined();
|
|
76
|
+
expect(fn).toContain('$summon minecraft:zombie 100 $(y) 200');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Macro call site generation
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
describe('e2e: macro call site generation', () => {
|
|
83
|
+
test('call site emits store_score_to_nbt + function with storage', () => {
|
|
84
|
+
const source = `
|
|
85
|
+
fn spawn_zombie(x: int, y: int, z: int) {
|
|
86
|
+
summon("minecraft:zombie", x, y, z);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
fn caller(px: int, pz: int) {
|
|
90
|
+
spawn_zombie(px, 64, pz);
|
|
91
|
+
}
|
|
92
|
+
`;
|
|
93
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
94
|
+
const callerFn = getFile(result.files, 'caller.mcfunction');
|
|
95
|
+
expect(callerFn).toBeDefined();
|
|
96
|
+
// Should have 'function test:spawn_zombie with storage rs:macro_args'
|
|
97
|
+
expect(callerFn).toContain('with storage rs:macro_args');
|
|
98
|
+
expect(callerFn).toContain('spawn_zombie');
|
|
99
|
+
});
|
|
100
|
+
test('call site stores args to rs:macro_args NBT', () => {
|
|
101
|
+
const source = `
|
|
102
|
+
fn spawn_zombie(x: int, y: int, z: int) {
|
|
103
|
+
summon("minecraft:zombie", x, y, z);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
fn caller(my_x: int) {
|
|
107
|
+
spawn_zombie(my_x, 64, 0);
|
|
108
|
+
}
|
|
109
|
+
`;
|
|
110
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
111
|
+
const callerFn = getFile(result.files, 'caller.mcfunction');
|
|
112
|
+
expect(callerFn).toBeDefined();
|
|
113
|
+
// Should have NBT storage setup for macro args
|
|
114
|
+
expect(callerFn).toContain('rs:macro_args');
|
|
115
|
+
expect(callerFn).toContain('with storage');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
// Float macro params (local coords)
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
describe('e2e: float macro params with local coords', () => {
|
|
122
|
+
test('float params in ^coord positions produce macro function', () => {
|
|
123
|
+
const source = `
|
|
124
|
+
fn draw_pt(px: float, py: float) {
|
|
125
|
+
particle("minecraft:end_rod", ^px, ^py, ^5, 0.02, 0.02, 0.02, 0.0, 10);
|
|
126
|
+
}
|
|
127
|
+
`;
|
|
128
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
129
|
+
const fn = getFile(result.files, 'draw_pt.mcfunction');
|
|
130
|
+
expect(fn).toBeDefined();
|
|
131
|
+
// Should have $particle with ^$(px) and ^$(py)
|
|
132
|
+
expect(fn).toContain('$particle minecraft:end_rod ^$(px) ^$(py) ^5');
|
|
133
|
+
});
|
|
134
|
+
test('float macro call site uses double 0.01 scale for NBT storage', () => {
|
|
135
|
+
const source = `
|
|
136
|
+
fn draw_pt(px: float, py: float) {
|
|
137
|
+
particle("minecraft:end_rod", ^px, ^py, ^5, 0.02, 0.02, 0.02, 0.0, 10);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
fn caller() {
|
|
141
|
+
draw_pt(100.0, 200.0);
|
|
142
|
+
}
|
|
143
|
+
`;
|
|
144
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
145
|
+
const callerFn = getFile(result.files, 'caller.mcfunction');
|
|
146
|
+
expect(callerFn).toBeDefined();
|
|
147
|
+
// Should store to NBT with double type and 0.01 scale
|
|
148
|
+
expect(callerFn).toContain('rs:macro_args');
|
|
149
|
+
expect(callerFn).toContain('double 0.01');
|
|
150
|
+
expect(callerFn).toContain('with storage rs:macro_args');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Non-macro functions still work
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
describe('e2e: non-macro functions', () => {
|
|
157
|
+
test('say builtin emits normal (non-macro) command', () => {
|
|
158
|
+
const source = `
|
|
159
|
+
fn greet() {
|
|
160
|
+
say("hello world");
|
|
161
|
+
}
|
|
162
|
+
`;
|
|
163
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
164
|
+
const fn = getFile(result.files, 'greet.mcfunction');
|
|
165
|
+
expect(fn).toBeDefined();
|
|
166
|
+
expect(fn).toContain('say hello world');
|
|
167
|
+
// No $ prefix
|
|
168
|
+
expect(fn).not.toMatch(/^\$/m);
|
|
169
|
+
});
|
|
170
|
+
test('kill builtin emits normal command', () => {
|
|
171
|
+
const source = `
|
|
172
|
+
fn cleanup() {
|
|
173
|
+
kill(@e[tag=temp]);
|
|
174
|
+
}
|
|
175
|
+
`;
|
|
176
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
177
|
+
const fn = getFile(result.files, 'cleanup.mcfunction');
|
|
178
|
+
expect(fn).toBeDefined();
|
|
179
|
+
expect(fn).toContain('kill @e[tag=temp]');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=macros.test.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration tests — representative cases from the existing 920-test suite
|
|
3
|
+
* run through the NEW v2 compiler pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Pattern:
|
|
6
|
+
* 1. Compile source with src2/emit/compile.ts
|
|
7
|
+
* 2. Load .mcfunction files into MCRuntime
|
|
8
|
+
* 3. Execute functions and assert scoreboard state
|
|
9
|
+
*
|
|
10
|
+
* NOTE: v2 uses objective `__<ns>` (not `rs`), load function is `ns:load`
|
|
11
|
+
* (not `ns:__load`), and return values go to `$ret` on the objective.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|