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
|
@@ -116,25 +116,22 @@ function parseErrorMessage(kind, rawMessage, sourceLines, filePath) {
|
|
|
116
116
|
// Fallback: line 1, col 1
|
|
117
117
|
return new DiagnosticError(kind, rawMessage, { file: filePath, line: 1, col: 1 }, sourceLines);
|
|
118
118
|
}
|
|
119
|
-
function formatError(error, source) {
|
|
119
|
+
function formatError(error, source, filePath) {
|
|
120
120
|
if (error instanceof DiagnosticError) {
|
|
121
121
|
const sourceLines = source?.split('\n') ?? error.sourceLines ?? [];
|
|
122
122
|
const { file, line, col } = error.location;
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
: ` at line ${line}, col ${col}`;
|
|
126
|
-
const lines = [`Error${locationPart}:`];
|
|
123
|
+
const fileStr = file ?? filePath ?? '<input>';
|
|
124
|
+
const header = `${fileStr}:${line}:${col}: error: ${error.message}`;
|
|
127
125
|
const pointerLines = formatSourcePointer(sourceLines, line, col);
|
|
128
|
-
if (pointerLines.length
|
|
129
|
-
|
|
126
|
+
if (pointerLines.length === 0) {
|
|
127
|
+
return header;
|
|
130
128
|
}
|
|
131
|
-
|
|
132
|
-
return lines.join('\n');
|
|
129
|
+
return [header, ...pointerLines].join('\n');
|
|
133
130
|
}
|
|
134
131
|
if (!source) {
|
|
135
132
|
return error.message;
|
|
136
133
|
}
|
|
137
|
-
const parsed = parseErrorMessage('ParseError', error.message, source.split('\n'));
|
|
138
|
-
return formatError(parsed, source);
|
|
134
|
+
const parsed = parseErrorMessage('ParseError', error.message, source.split('\n'), filePath);
|
|
135
|
+
return formatError(parsed, source, filePath);
|
|
139
136
|
}
|
|
140
137
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level compile function for the v2 pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: source → Lexer → Parser → TypeCheck → HIR → MIR → optimize → LIR → emit
|
|
5
|
+
*/
|
|
6
|
+
import { type DatapackFile } from './index';
|
|
7
|
+
import { McVersion } from '../types/mc-version';
|
|
8
|
+
export interface CompileOptions {
|
|
9
|
+
namespace?: string;
|
|
10
|
+
filePath?: string;
|
|
11
|
+
/** v1 compat: inline library sources (treated as `module library;` imports) */
|
|
12
|
+
librarySources?: string[];
|
|
13
|
+
/** When true, generate .sourcemap.json files alongside .mcfunction output */
|
|
14
|
+
generateSourceMap?: boolean;
|
|
15
|
+
/** Target Minecraft version (default: 1.21). Affects which MC features are used. */
|
|
16
|
+
mcVersion?: McVersion;
|
|
17
|
+
/**
|
|
18
|
+
* When true, type errors are reported as warnings instead of blocking compilation.
|
|
19
|
+
* Use for gradual migration or testing with existing codebases that have type errors.
|
|
20
|
+
*/
|
|
21
|
+
lenient?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface CompileResult {
|
|
24
|
+
files: DatapackFile[];
|
|
25
|
+
warnings: string[];
|
|
26
|
+
/** Always true — v1 compat shim (compile() throws on error) */
|
|
27
|
+
readonly success: true;
|
|
28
|
+
}
|
|
29
|
+
export declare function compile(source: string, options?: CompileOptions): CompileResult;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Top-level compile function for the v2 pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Pipeline: source → Lexer → Parser → TypeCheck → HIR → MIR → optimize → LIR → emit
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.compile = compile;
|
|
9
|
+
const lexer_1 = require("../lexer");
|
|
10
|
+
const parser_1 = require("../parser");
|
|
11
|
+
const compile_1 = require("../compile");
|
|
12
|
+
const diagnostics_1 = require("../diagnostics");
|
|
13
|
+
const lower_1 = require("../hir/lower");
|
|
14
|
+
const monomorphize_1 = require("../hir/monomorphize");
|
|
15
|
+
const lower_2 = require("../mir/lower");
|
|
16
|
+
const pipeline_1 = require("../optimizer/pipeline");
|
|
17
|
+
const lower_3 = require("../lir/lower");
|
|
18
|
+
const pipeline_2 = require("../optimizer/lir/pipeline");
|
|
19
|
+
const index_1 = require("./index");
|
|
20
|
+
const coroutine_1 = require("../optimizer/coroutine");
|
|
21
|
+
const budget_1 = require("../lir/budget");
|
|
22
|
+
const mc_version_1 = require("../types/mc-version");
|
|
23
|
+
const typechecker_1 = require("../typechecker");
|
|
24
|
+
function compile(source, options = {}) {
|
|
25
|
+
const { namespace = 'redscript', filePath, generateSourceMap = false, mcVersion = mc_version_1.DEFAULT_MC_VERSION, lenient = false } = options;
|
|
26
|
+
const warnings = [];
|
|
27
|
+
// Preprocess: resolve import directives, merge imported sources
|
|
28
|
+
const preprocessed = (0, compile_1.preprocessSourceWithMetadata)(source, { filePath });
|
|
29
|
+
const processedSource = preprocessed.source;
|
|
30
|
+
// Stage 1: Lex + Parse → AST
|
|
31
|
+
const lexer = new lexer_1.Lexer(processedSource);
|
|
32
|
+
const tokens = lexer.tokenize();
|
|
33
|
+
const parser = new parser_1.Parser(tokens, processedSource, filePath);
|
|
34
|
+
const ast = parser.parse(namespace);
|
|
35
|
+
// Merge library imports (files with `module library;`) into AST
|
|
36
|
+
for (const li of preprocessed.libraryImports ?? []) {
|
|
37
|
+
const libPreprocessed = (0, compile_1.preprocessSourceWithMetadata)(li.source, { filePath: li.filePath });
|
|
38
|
+
const libTokens = new lexer_1.Lexer(libPreprocessed.source, li.filePath).tokenize();
|
|
39
|
+
const libAst = new parser_1.Parser(libTokens, libPreprocessed.source, li.filePath).parse(namespace);
|
|
40
|
+
for (const fn of libAst.declarations)
|
|
41
|
+
fn.isLibraryFn = true;
|
|
42
|
+
ast.declarations.push(...libAst.declarations);
|
|
43
|
+
ast.structs.push(...libAst.structs);
|
|
44
|
+
ast.implBlocks.push(...libAst.implBlocks);
|
|
45
|
+
ast.enums.push(...libAst.enums);
|
|
46
|
+
ast.consts.push(...libAst.consts);
|
|
47
|
+
ast.globals.push(...libAst.globals);
|
|
48
|
+
}
|
|
49
|
+
// Merge librarySources (v1 compat: inline library strings) before HIR
|
|
50
|
+
if (options.librarySources) {
|
|
51
|
+
for (const libSrc of options.librarySources) {
|
|
52
|
+
const libTokens = new lexer_1.Lexer(libSrc).tokenize();
|
|
53
|
+
const libAst = new parser_1.Parser(libTokens, libSrc).parse(namespace);
|
|
54
|
+
for (const fn of libAst.declarations)
|
|
55
|
+
fn.isLibraryFn = true;
|
|
56
|
+
ast.declarations.push(...libAst.declarations);
|
|
57
|
+
ast.structs.push(...libAst.structs);
|
|
58
|
+
ast.implBlocks.push(...libAst.implBlocks);
|
|
59
|
+
ast.enums.push(...libAst.enums);
|
|
60
|
+
ast.consts.push(...libAst.consts);
|
|
61
|
+
ast.globals.push(...libAst.globals);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Stage 1b: Type checking
|
|
65
|
+
// Run TypeChecker on the merged AST. In error-mode (default), throw on first type error.
|
|
66
|
+
// In lenient mode, demote type errors to warnings.
|
|
67
|
+
{
|
|
68
|
+
const checker = new typechecker_1.TypeChecker(processedSource, filePath);
|
|
69
|
+
const typeErrors = checker.check(ast);
|
|
70
|
+
if (typeErrors.length > 0) {
|
|
71
|
+
if (lenient) {
|
|
72
|
+
for (const e of typeErrors) {
|
|
73
|
+
warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
throw typeErrors[0];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Stage 2–7: lower, optimize, emit
|
|
82
|
+
// Wrap non-DiagnosticError from later stages so CLI always gets structured errors.
|
|
83
|
+
try {
|
|
84
|
+
// Stage 2: AST → HIR
|
|
85
|
+
const hirRaw = (0, lower_1.lowerToHIR)(ast);
|
|
86
|
+
// Stage 2b: Monomorphize generic functions
|
|
87
|
+
const hir = (0, monomorphize_1.monomorphize)(hirRaw);
|
|
88
|
+
// Extract @tick, @load, @coroutine, and @schedule functions from HIR (before decorator info is lost)
|
|
89
|
+
const tickFunctions = [];
|
|
90
|
+
const loadFunctions = [];
|
|
91
|
+
const coroutineInfos = [];
|
|
92
|
+
const scheduleFunctions = [];
|
|
93
|
+
for (const fn of hir.functions) {
|
|
94
|
+
for (const dec of fn.decorators) {
|
|
95
|
+
if (dec.name === 'tick')
|
|
96
|
+
tickFunctions.push(fn.name);
|
|
97
|
+
if (dec.name === 'load')
|
|
98
|
+
loadFunctions.push(fn.name);
|
|
99
|
+
if (dec.name === 'coroutine') {
|
|
100
|
+
coroutineInfos.push({
|
|
101
|
+
fnName: fn.name,
|
|
102
|
+
batch: dec.args?.batch ?? 10,
|
|
103
|
+
onDone: dec.args?.onDone,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (dec.name === 'schedule') {
|
|
107
|
+
scheduleFunctions.push({ name: fn.name, ticks: dec.args?.ticks ?? 1 });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Stage 3: HIR → MIR
|
|
112
|
+
const mir = (0, lower_2.lowerToMIR)(hir, filePath);
|
|
113
|
+
// Stage 4: MIR optimization
|
|
114
|
+
const mirOpt = (0, pipeline_1.optimizeModule)(mir);
|
|
115
|
+
// Stage 4b: Coroutine transform (opt-in, only for @coroutine functions)
|
|
116
|
+
const coroResult = (0, coroutine_1.coroutineTransform)(mirOpt, coroutineInfos);
|
|
117
|
+
const mirFinal = coroResult.module;
|
|
118
|
+
tickFunctions.push(...coroResult.generatedTickFunctions);
|
|
119
|
+
// Stage 5: MIR → LIR
|
|
120
|
+
const lir = (0, lower_3.lowerToLIR)(mirFinal);
|
|
121
|
+
// Stage 6: LIR optimization
|
|
122
|
+
const lirOpt = (0, pipeline_2.lirOptimizeModule)(lir);
|
|
123
|
+
// Static tick budget analysis
|
|
124
|
+
const coroutineNames = new Set(coroutineInfos.map(c => c.fnName));
|
|
125
|
+
const budgetDiags = (0, budget_1.analyzeBudget)(lirOpt, coroutineNames);
|
|
126
|
+
for (const diag of budgetDiags) {
|
|
127
|
+
if (diag.level === 'error') {
|
|
128
|
+
throw new diagnostics_1.DiagnosticError('LoweringError', diag.message, { line: 1, col: 1, file: filePath });
|
|
129
|
+
}
|
|
130
|
+
warnings.push(diag.message);
|
|
131
|
+
}
|
|
132
|
+
// Stage 7: LIR → .mcfunction
|
|
133
|
+
const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions, generateSourceMap, mcVersion });
|
|
134
|
+
return { files, warnings, success: true };
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
if (err instanceof diagnostics_1.DiagnosticError)
|
|
138
|
+
throw err;
|
|
139
|
+
const sourceLines = processedSource.split('\n');
|
|
140
|
+
throw (0, diagnostics_1.parseErrorMessage)('LoweringError', err.message, sourceLines, filePath);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 7 — LIR → .mcfunction Emission
|
|
3
|
+
*
|
|
4
|
+
* Converts a LIRModule into DatapackFile[] representing a Minecraft datapack.
|
|
5
|
+
* Each LIRFunction becomes a .mcfunction file under data/<ns>/function/.
|
|
6
|
+
*/
|
|
7
|
+
import type { LIRModule } from '../lir/types';
|
|
8
|
+
import { McVersion } from '../types/mc-version';
|
|
9
|
+
export interface DatapackFile {
|
|
10
|
+
path: string;
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
13
|
+
export interface EmitOptions {
|
|
14
|
+
namespace: string;
|
|
15
|
+
tickFunctions?: string[];
|
|
16
|
+
loadFunctions?: string[];
|
|
17
|
+
scheduleFunctions?: Array<{
|
|
18
|
+
name: string;
|
|
19
|
+
ticks: number;
|
|
20
|
+
}>;
|
|
21
|
+
/** When true, generate a .sourcemap.json sidecar file for each .mcfunction */
|
|
22
|
+
generateSourceMap?: boolean;
|
|
23
|
+
/** Target Minecraft version; controls which MC features are used in codegen */
|
|
24
|
+
mcVersion?: McVersion;
|
|
25
|
+
}
|
|
26
|
+
export declare function emit(module: LIRModule, options: EmitOptions): DatapackFile[];
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Stage 7 — LIR → .mcfunction Emission
|
|
4
|
+
*
|
|
5
|
+
* Converts a LIRModule into DatapackFile[] representing a Minecraft datapack.
|
|
6
|
+
* Each LIRFunction becomes a .mcfunction file under data/<ns>/function/.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.emit = emit;
|
|
10
|
+
const sourcemap_1 = require("./sourcemap");
|
|
11
|
+
const mc_version_1 = require("../types/mc-version");
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Public API
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
function emit(module, options) {
|
|
16
|
+
const { namespace } = options;
|
|
17
|
+
const tickFns = options.tickFunctions ?? [];
|
|
18
|
+
const loadFns = options.loadFunctions ?? [];
|
|
19
|
+
const scheduleFns = options.scheduleFunctions ?? [];
|
|
20
|
+
const objective = module.objective;
|
|
21
|
+
const genSourceMap = options.generateSourceMap ?? false;
|
|
22
|
+
const mcVersion = options.mcVersion ?? mc_version_1.DEFAULT_MC_VERSION;
|
|
23
|
+
const files = [];
|
|
24
|
+
// pack.mcmeta
|
|
25
|
+
files.push({
|
|
26
|
+
path: 'pack.mcmeta',
|
|
27
|
+
content: JSON.stringify({
|
|
28
|
+
pack: { pack_format: 26, description: `RedScript datapack: ${namespace}` },
|
|
29
|
+
}, null, 2) + '\n',
|
|
30
|
+
});
|
|
31
|
+
// load.mcfunction — creates the scoreboard objective
|
|
32
|
+
const loadCmds = [`scoreboard objectives add ${objective} dummy`];
|
|
33
|
+
files.push({
|
|
34
|
+
path: `data/${namespace}/function/load.mcfunction`,
|
|
35
|
+
content: loadCmds.join('\n') + '\n',
|
|
36
|
+
});
|
|
37
|
+
// Each LIR function → .mcfunction file
|
|
38
|
+
for (const fn of module.functions) {
|
|
39
|
+
const fnPath = fnNameToPath(fn.name, namespace);
|
|
40
|
+
if (genSourceMap) {
|
|
41
|
+
const builder = new sourcemap_1.SourceMapBuilder(fnPath);
|
|
42
|
+
const lines = emitFunctionWithSourceMap(fn, namespace, objective, builder, mcVersion);
|
|
43
|
+
files.push({ path: fnPath, content: lines.join('\n') + '\n' });
|
|
44
|
+
const map = builder.build();
|
|
45
|
+
if (map) {
|
|
46
|
+
files.push({ path: (0, sourcemap_1.sourceMapPath)(fnPath), content: (0, sourcemap_1.serializeSourceMap)(map) });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const lines = emitFunction(fn, namespace, objective, mcVersion);
|
|
51
|
+
files.push({ path: fnPath, content: lines.join('\n') + '\n' });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// @schedule wrapper functions: _schedule_xxx → schedule function ns:xxx Nt
|
|
55
|
+
for (const { name, ticks } of scheduleFns) {
|
|
56
|
+
files.push({
|
|
57
|
+
path: `data/${namespace}/function/_schedule_${name}.mcfunction`,
|
|
58
|
+
content: `schedule function ${namespace}:${name} ${ticks}t\n`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Tag files for tick/load
|
|
62
|
+
if (loadFns.length > 0 || true) {
|
|
63
|
+
// Always include load.json — it must reference the load.mcfunction
|
|
64
|
+
const loadValues = [`${namespace}:load`, ...loadFns.map(fn => `${namespace}:${fn}`)];
|
|
65
|
+
files.push({
|
|
66
|
+
path: 'data/minecraft/tags/function/load.json',
|
|
67
|
+
content: JSON.stringify({ values: loadValues }, null, 2) + '\n',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (tickFns.length > 0) {
|
|
71
|
+
const tickValues = tickFns.map(fn => `${namespace}:${fn}`);
|
|
72
|
+
files.push({
|
|
73
|
+
path: 'data/minecraft/tags/function/tick.json',
|
|
74
|
+
content: JSON.stringify({ values: tickValues }, null, 2) + '\n',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return files;
|
|
78
|
+
}
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Function emission
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
function emitFunction(fn, namespace, objective, mcVersion) {
|
|
83
|
+
const lines = [];
|
|
84
|
+
for (const instr of fn.instructions) {
|
|
85
|
+
lines.push(emitInstr(instr, namespace, objective, mcVersion));
|
|
86
|
+
}
|
|
87
|
+
return lines;
|
|
88
|
+
}
|
|
89
|
+
function emitFunctionWithSourceMap(fn, namespace, objective, builder, mcVersion) {
|
|
90
|
+
const lines = [];
|
|
91
|
+
for (const instr of fn.instructions) {
|
|
92
|
+
lines.push(emitInstr(instr, namespace, objective, mcVersion));
|
|
93
|
+
builder.addLine(instr.sourceLoc);
|
|
94
|
+
}
|
|
95
|
+
return lines;
|
|
96
|
+
}
|
|
97
|
+
function fnNameToPath(name, namespace) {
|
|
98
|
+
// LIR function names may contain :: for methods — convert to /
|
|
99
|
+
const mcName = name.replace(/::/g, '/').toLowerCase();
|
|
100
|
+
return `data/${namespace}/function/${mcName}.mcfunction`;
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Instruction emission
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
function emitInstr(instr, ns, obj, mcVersion) {
|
|
106
|
+
switch (instr.kind) {
|
|
107
|
+
case 'score_set':
|
|
108
|
+
return `scoreboard players set ${slot(instr.dst)} ${instr.value}`;
|
|
109
|
+
case 'score_copy':
|
|
110
|
+
return `scoreboard players operation ${slot(instr.dst)} = ${slot(instr.src)}`;
|
|
111
|
+
case 'score_add':
|
|
112
|
+
return `scoreboard players operation ${slot(instr.dst)} += ${slot(instr.src)}`;
|
|
113
|
+
case 'score_sub':
|
|
114
|
+
return `scoreboard players operation ${slot(instr.dst)} -= ${slot(instr.src)}`;
|
|
115
|
+
case 'score_mul':
|
|
116
|
+
return `scoreboard players operation ${slot(instr.dst)} *= ${slot(instr.src)}`;
|
|
117
|
+
case 'score_div':
|
|
118
|
+
return `scoreboard players operation ${slot(instr.dst)} /= ${slot(instr.src)}`;
|
|
119
|
+
case 'score_mod':
|
|
120
|
+
return `scoreboard players operation ${slot(instr.dst)} %= ${slot(instr.src)}`;
|
|
121
|
+
case 'score_min':
|
|
122
|
+
return `scoreboard players operation ${slot(instr.dst)} < ${slot(instr.src)}`;
|
|
123
|
+
case 'score_max':
|
|
124
|
+
return `scoreboard players operation ${slot(instr.dst)} > ${slot(instr.src)}`;
|
|
125
|
+
case 'score_swap':
|
|
126
|
+
return `scoreboard players operation ${slot(instr.a)} >< ${slot(instr.b)}`;
|
|
127
|
+
case 'store_cmd_to_score':
|
|
128
|
+
return `execute store result score ${slot(instr.dst)} run ${emitInstr(instr.cmd, ns, obj, mcVersion)}`;
|
|
129
|
+
case 'store_score_to_nbt':
|
|
130
|
+
return `execute store result storage ${instr.ns} ${instr.path} ${instr.type} ${instr.scale} run scoreboard players get ${slot(instr.src)}`;
|
|
131
|
+
case 'store_nbt_to_score':
|
|
132
|
+
return `execute store result score ${slot(instr.dst)} run data get storage ${instr.ns} ${instr.path} ${instr.scale}`;
|
|
133
|
+
case 'nbt_set_literal':
|
|
134
|
+
return `data modify storage ${instr.ns} ${instr.path} set value ${instr.value}`;
|
|
135
|
+
case 'nbt_copy':
|
|
136
|
+
return `data modify storage ${instr.dstNs} ${instr.dstPath} set from storage ${instr.srcNs} ${instr.srcPath}`;
|
|
137
|
+
case 'call':
|
|
138
|
+
return `function ${instr.fn}`;
|
|
139
|
+
case 'call_macro':
|
|
140
|
+
if (mcVersion >= mc_version_1.McVersion.v1_20_2) {
|
|
141
|
+
return `function ${instr.fn} with storage ${instr.storage}`;
|
|
142
|
+
}
|
|
143
|
+
// Pre-1.20.2: macros not supported; call function directly (args in storage are ignored)
|
|
144
|
+
return `function ${instr.fn}`;
|
|
145
|
+
case 'call_if_matches':
|
|
146
|
+
return `execute if score ${slot(instr.slot)} matches ${instr.range} run function ${instr.fn}`;
|
|
147
|
+
case 'call_unless_matches':
|
|
148
|
+
return `execute unless score ${slot(instr.slot)} matches ${instr.range} run function ${instr.fn}`;
|
|
149
|
+
case 'call_if_score':
|
|
150
|
+
return `execute if score ${slot(instr.a)} ${cmpToMC(instr.op)} ${slot(instr.b)} run function ${instr.fn}`;
|
|
151
|
+
case 'call_unless_score':
|
|
152
|
+
return `execute unless score ${slot(instr.a)} ${cmpToMC(instr.op)} ${slot(instr.b)} run function ${instr.fn}`;
|
|
153
|
+
case 'call_context': {
|
|
154
|
+
const subcmds = instr.subcommands.map(emitSubcmd).join(' ');
|
|
155
|
+
return `execute ${subcmds} run function ${instr.fn}`;
|
|
156
|
+
}
|
|
157
|
+
case 'return_value':
|
|
158
|
+
return `scoreboard players operation $ret ${instr.slot.obj} = ${slot(instr.slot)}`;
|
|
159
|
+
case 'macro_line':
|
|
160
|
+
if (mcVersion >= mc_version_1.McVersion.v1_20_2) {
|
|
161
|
+
return `$${instr.template}`;
|
|
162
|
+
}
|
|
163
|
+
// Pre-1.20.2: function macros not available. Emit as a plain command with
|
|
164
|
+
// $(param) placeholders replaced by storage reads via data get (best-effort
|
|
165
|
+
// compat for string/id params; numeric coords will not be dynamic).
|
|
166
|
+
return macroLineCompat(instr.template);
|
|
167
|
+
case 'raw':
|
|
168
|
+
return instr.cmd;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// Helpers
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
function slot(s) {
|
|
175
|
+
return `${s.player} ${s.obj}`;
|
|
176
|
+
}
|
|
177
|
+
function cmpToMC(op) {
|
|
178
|
+
switch (op) {
|
|
179
|
+
case 'eq': return '=';
|
|
180
|
+
case 'ne': return '='; // ne uses "unless" form, but when used in if score context
|
|
181
|
+
case 'lt': return '<';
|
|
182
|
+
case 'le': return '<=';
|
|
183
|
+
case 'gt': return '>';
|
|
184
|
+
case 'ge': return '>=';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Pre-1.20.2 compat: emit a macro template as a plain command.
|
|
189
|
+
* $(param) placeholders are replaced with `storage rs:macro_args <param>` data-get
|
|
190
|
+
* expressions for string/id values, or left as literal "0" for coordinates.
|
|
191
|
+
* This is best-effort — dynamic numeric positions cannot be truly emulated.
|
|
192
|
+
*/
|
|
193
|
+
function macroLineCompat(template) {
|
|
194
|
+
// Replace $(param) with data-get-style substitution marker
|
|
195
|
+
return template.replace(/\$\((\w+)\)/g, (_m, p) => `{storage:rs:macro_args,path:${p}}`);
|
|
196
|
+
}
|
|
197
|
+
function emitSubcmd(sub) {
|
|
198
|
+
switch (sub.kind) {
|
|
199
|
+
case 'as':
|
|
200
|
+
return `as ${sub.selector}`;
|
|
201
|
+
case 'at':
|
|
202
|
+
return `at ${sub.selector}`;
|
|
203
|
+
case 'at_self':
|
|
204
|
+
return 'at @s';
|
|
205
|
+
case 'positioned':
|
|
206
|
+
return `positioned ${sub.x} ${sub.y} ${sub.z}`;
|
|
207
|
+
case 'rotated':
|
|
208
|
+
return `rotated ${sub.yaw} ${sub.pitch}`;
|
|
209
|
+
case 'in':
|
|
210
|
+
return `in ${sub.dimension}`;
|
|
211
|
+
case 'anchored':
|
|
212
|
+
return `anchored ${sub.anchor}`;
|
|
213
|
+
case 'if_score':
|
|
214
|
+
return `if score ${sub.a} ${cmpToMC(sub.op)} ${sub.b}`;
|
|
215
|
+
case 'unless_score':
|
|
216
|
+
return `unless score ${sub.a} ${cmpToMC(sub.op)} ${sub.b}`;
|
|
217
|
+
case 'if_matches':
|
|
218
|
+
return `if score ${sub.score} matches ${sub.range}`;
|
|
219
|
+
case 'unless_matches':
|
|
220
|
+
return `unless score ${sub.score} matches ${sub.range}`;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 5b — Multi-Module Compilation
|
|
3
|
+
*
|
|
4
|
+
* Compiles multiple .mcrs files that use `module <name>;` / `import <mod>::<sym>;`
|
|
5
|
+
* into a single datapack with namespace-isolated scoreboards and correct cross-module
|
|
6
|
+
* function paths.
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Each module gets its own scoreboard objective: `__${namespace}_${moduleName}`
|
|
10
|
+
* - Cross-module function calls are emitted as `${namespace}:${moduleName}/${fnName}`
|
|
11
|
+
* - DCE: exported-but-never-imported functions are stripped from the output
|
|
12
|
+
* - Circular imports are detected and rejected
|
|
13
|
+
*/
|
|
14
|
+
import { type DatapackFile } from './index';
|
|
15
|
+
export interface ModuleInput {
|
|
16
|
+
/** Module name (must match the `module <name>;` declaration in source, or be inferred) */
|
|
17
|
+
name: string;
|
|
18
|
+
source: string;
|
|
19
|
+
filePath?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CompileModulesOptions {
|
|
22
|
+
/** Datapack namespace (e.g. "mypack") */
|
|
23
|
+
namespace?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CompileModulesResult {
|
|
26
|
+
files: DatapackFile[];
|
|
27
|
+
warnings: string[];
|
|
28
|
+
}
|
|
29
|
+
export declare function compileModules(modules: ModuleInput[], options?: CompileModulesOptions): CompileModulesResult;
|