redscript-mc 2.0.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claudeignore +21 -0
- package/README.md +48 -16
- package/README.zh.md +2 -2
- package/dist/cli.js +0 -0
- package/dist/src/__tests__/budget.test.js +261 -0
- package/dist/src/__tests__/diagnostics.test.js +2 -3
- package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
- package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
- package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
- package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
- 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/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
- package/dist/src/__tests__/incremental.test.d.ts +5 -0
- package/dist/src/__tests__/incremental.test.js +308 -0
- package/dist/src/__tests__/lsp.test.d.ts +7 -0
- package/dist/src/__tests__/lsp.test.js +321 -0
- package/dist/src/__tests__/mc-syntax.test.js +1 -6
- package/dist/src/__tests__/mc-version.test.d.ts +10 -0
- package/dist/src/__tests__/mc-version.test.js +154 -0
- package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
- package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
- package/dist/src/__tests__/modules.test.d.ts +7 -0
- package/dist/src/__tests__/modules.test.js +333 -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/interprocedural.test.js +145 -0
- package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
- package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
- package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
- package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
- package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
- package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -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__/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__/stdlib-include.test.js +86 -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/ast/types.d.ts +56 -2
- 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/src/cli.js +83 -45
- package/dist/src/compile.d.ts +3 -2
- package/dist/src/compile.js +34 -11
- package/dist/src/diagnostics/index.d.ts +1 -1
- package/dist/src/diagnostics/index.js +8 -11
- package/dist/src/emit/compile.d.ts +31 -0
- package/dist/src/emit/compile.js +143 -0
- package/dist/{src2 → src}/emit/index.d.ts +9 -0
- package/dist/{src2 → src}/emit/index.js +59 -8
- 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/{src2 → src}/hir/lower.d.ts +1 -1
- package/dist/{src2 → src}/hir/lower.js +22 -1
- package/dist/src/hir/monomorphize.d.ts +22 -0
- package/dist/src/hir/monomorphize.js +379 -0
- package/dist/{src2 → src}/hir/types.d.ts +35 -2
- package/dist/src/index.d.ts +19 -2
- package/dist/src/index.js +36 -14
- package/dist/src/lexer/index.d.ts +1 -1
- package/dist/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/{src2 → src}/lir/lower.js +19 -0
- package/dist/{src2 → src}/lir/types.d.ts +7 -4
- 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 +403 -0
- package/dist/{src2 → src}/mir/lower.d.ts +1 -1
- package/dist/{src2 → src}/mir/lower.js +244 -10
- package/dist/{src2 → src}/mir/types.d.ts +10 -2
- 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 -34
- package/dist/src/optimizer/dce.js +146 -629
- 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/{src2 → src}/optimizer/pipeline.d.ts +4 -0
- package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
- 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/src/parser/index.d.ts +8 -0
- package/dist/src/parser/index.js +204 -14
- package/dist/src/repl.d.ts +1 -1
- package/dist/src/typechecker/index.d.ts +4 -0
- package/dist/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 +27 -10
- 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/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
- package/examples/coroutine-demo.mcrs +50 -0
- package/examples/enum-demo.mcrs +95 -0
- package/examples/scheduler-demo.mcrs +59 -0
- package/examples/showcase.mcrs +3 -3
- package/jest.config.js +1 -1
- package/package.json +9 -3
- package/src/__tests__/budget.test.ts +297 -0
- package/src/__tests__/diagnostics.test.ts +2 -3
- package/src/__tests__/e2e/coroutine.test.ts +142 -0
- package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
- package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
- 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/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
- package/src/__tests__/incremental.test.ts +337 -0
- package/src/__tests__/lsp.test.ts +359 -0
- package/src/__tests__/mc-syntax.test.ts +1 -7
- package/src/__tests__/mc-version.test.ts +178 -0
- package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
- package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
- package/src/__tests__/modules.test.ts +365 -0
- package/src/__tests__/optimizer/coroutine.test.ts +312 -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/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__/stdlib-include.test.ts +61 -0
- package/src/__tests__/tuple.test.ts +220 -0
- package/src/__tests__/typechecker-strict.test.ts +216 -0
- package/src/ast/types.ts +33 -2
- 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 +96 -45
- package/src/compile.ts +46 -17
- package/src/diagnostics/index.ts +8 -11
- package/src/emit/compile.ts +179 -0
- package/{src2 → src}/emit/index.ts +72 -8
- package/src/emit/modules.ts +581 -0
- package/src/emit/sourcemap.ts +101 -0
- package/{src2 → src}/hir/lower.ts +29 -2
- package/src/hir/monomorphize.ts +416 -0
- package/{src2 → src}/hir/types.ts +15 -3
- package/src/index.ts +29 -10
- package/src/lexer/index.ts +2 -1
- package/src/lir/budget.ts +321 -0
- package/{src2 → src}/lir/lower.ts +32 -1
- package/{src2 → src}/lir/types.ts +7 -3
- package/src/lsp/main.ts +9 -0
- package/src/lsp/server.ts +469 -0
- package/{src2 → src}/mir/lower.ts +251 -8
- package/{src2 → src}/mir/types.ts +12 -1
- package/src/optimizer/coroutine.ts +996 -0
- package/{src2 → src}/optimizer/dce.ts +2 -1
- 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/{src2 → src}/optimizer/pipeline.ts +16 -1
- package/src/optimizer/selector-cache.ts +103 -0
- package/src/optimizer/unroll.ts +386 -0
- package/src/parser/index.ts +212 -15
- package/src/repl.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/.claude/commands/build-test.md +0 -10
- package/.claude/commands/deploy-demo.md +0 -12
- package/.claude/commands/stage-status.md +0 -13
- package/.claude/settings.json +0 -12
- package/CLAUDE.md +0 -231
- package/dist/__tests__/cli.test.js +0 -278
- package/dist/__tests__/codegen.test.js +0 -152
- package/dist/__tests__/compile-all.test.d.ts +0 -10
- package/dist/__tests__/compile-all.test.js +0 -108
- package/dist/__tests__/dce.test.js +0 -138
- package/dist/__tests__/diagnostics.test.d.ts +0 -4
- package/dist/__tests__/diagnostics.test.js +0 -149
- 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__/formatter.test.js +0 -40
- package/dist/__tests__/lexer.test.js +0 -343
- 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__/mc-integration.test.d.ts +0 -12
- package/dist/__tests__/mc-integration.test.js +0 -819
- package/dist/__tests__/mc-syntax.test.js +0 -124
- 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__/parser.test.d.ts +0 -1
- package/dist/__tests__/parser.test.js +0 -807
- package/dist/__tests__/repl.test.d.ts +0 -1
- package/dist/__tests__/repl.test.js +0 -27
- package/dist/__tests__/runtime.test.d.ts +0 -1
- 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.d.ts +0 -1
- package/dist/__tests__/structure-optimizer.test.js +0 -33
- package/dist/__tests__/typechecker.test.d.ts +0 -1
- package/dist/__tests__/typechecker.test.js +0 -552
- package/dist/__tests__/var-allocator.test.d.ts +0 -1
- package/dist/__tests__/var-allocator.test.js +0 -69
- package/dist/ast/types.d.ts +0 -514
- package/dist/ast/types.js +0 -9
- package/dist/builtins/metadata.d.ts +0 -36
- package/dist/builtins/metadata.js +0 -1014
- package/dist/cli.d.ts +0 -11
- 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/diagnostics/index.d.ts +0 -44
- package/dist/diagnostics/index.js +0 -140
- package/dist/events/types.d.ts +0 -35
- package/dist/events/types.js +0 -59
- package/dist/formatter/index.d.ts +0 -1
- package/dist/formatter/index.js +0 -26
- 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/lexer/index.d.ts +0 -37
- package/dist/lexer/index.js +0 -569
- package/dist/lowering/index.d.ts +0 -188
- package/dist/lowering/index.js +0 -3405
- package/dist/mathtest.map.json +0 -6
- package/dist/mc-test/client.d.ts +0 -128
- package/dist/mc-test/client.js +0 -174
- package/dist/mc-test/runner.d.ts +0 -28
- package/dist/mc-test/runner.js +0 -150
- package/dist/mc-test/setup.d.ts +0 -11
- package/dist/mc-test/setup.js +0 -98
- package/dist/mc-validator/index.d.ts +0 -17
- package/dist/mc-validator/index.js +0 -322
- package/dist/mypack.map.json +0 -27
- package/dist/nbt/index.d.ts +0 -86
- package/dist/nbt/index.js +0 -250
- 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/parser/index.d.ts +0 -93
- package/dist/parser/index.js +0 -1687
- package/dist/repl.d.ts +0 -16
- package/dist/repl.js +0 -165
- package/dist/reqtest.map.json +0 -4
- package/dist/reqtest2.map.json +0 -4
- package/dist/runtime/index.d.ts +0 -107
- package/dist/runtime/index.js +0 -1409
- package/dist/runtime.map.json +0 -7
- package/dist/src/__tests__/codegen.test.d.ts +0 -1
- package/dist/src/__tests__/codegen.test.js +0 -152
- package/dist/src/__tests__/e2e.test.d.ts +0 -6
- package/dist/src/__tests__/e2e.test.js +0 -1789
- package/dist/src/__tests__/entity-types.test.d.ts +0 -1
- package/dist/src/__tests__/entity-types.test.js +0 -203
- package/dist/src/__tests__/lowering.test.d.ts +0 -1
- package/dist/src/__tests__/lowering.test.js +0 -1015
- package/dist/src/__tests__/macro.test.d.ts +0 -8
- package/dist/src/__tests__/macro.test.js +0 -306
- package/dist/src/__tests__/nbt.test.d.ts +0 -1
- package/dist/src/__tests__/nbt.test.js +0 -82
- package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
- package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
- package/dist/src/__tests__/optimizer.test.d.ts +0 -1
- package/dist/src/__tests__/optimizer.test.js +0 -149
- package/dist/src/__tests__/runtime.test.d.ts +0 -1
- package/dist/src/__tests__/runtime.test.js +0 -289
- package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
- package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
- package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
- package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
- package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
- package/dist/src/__tests__/stdlib-math.test.js +0 -351
- package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
- package/dist/src/__tests__/stdlib-vec.test.js +0 -263
- package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
- package/dist/src/__tests__/structure-optimizer.test.js +0 -33
- package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
- package/dist/src/__tests__/var-allocator.test.js +0 -69
- package/dist/src/codegen/cmdblock/index.d.ts +0 -26
- package/dist/src/codegen/cmdblock/index.js +0 -45
- package/dist/src/codegen/mcfunction/index.d.ts +0 -40
- package/dist/src/codegen/mcfunction/index.js +0 -606
- package/dist/src/codegen/structure/index.d.ts +0 -24
- package/dist/src/codegen/structure/index.js +0 -279
- package/dist/src/codegen/var-allocator.d.ts +0 -45
- package/dist/src/codegen/var-allocator.js +0 -104
- package/dist/src/ir/builder.d.ts +0 -33
- package/dist/src/ir/builder.js +0 -99
- package/dist/src/ir/types.d.ts +0 -132
- package/dist/src/ir/types.js +0 -15
- package/dist/src/lowering/index.d.ts +0 -188
- package/dist/src/lowering/index.js +0 -3405
- package/dist/src/optimizer/commands.d.ts +0 -38
- package/dist/src/optimizer/commands.js +0 -451
- package/dist/src/optimizer/passes.d.ts +0 -34
- package/dist/src/optimizer/passes.js +0 -243
- package/dist/src/optimizer/structure.d.ts +0 -9
- package/dist/src/optimizer/structure.js +0 -356
- package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
- package/dist/src2/emit/compile.d.ts +0 -19
- package/dist/src2/emit/compile.js +0 -80
- package/dist/src2/optimizer/dce.d.ts +0 -8
- package/dist/src2/optimizer/dce.js +0 -155
- package/dist/swap_test.map.json +0 -14
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/typechecker/index.d.ts +0 -61
- package/dist/typechecker/index.js +0 -1034
- package/dist/types/entity-hierarchy.d.ts +0 -29
- package/dist/types/entity-hierarchy.js +0 -107
- package/examples/spiral.mcrs +0 -43
- package/src/examples/arena.mcrs +0 -44
- package/src/examples/counter.mcrs +0 -12
- package/src/examples/new_features_demo.mcrs +0 -193
- package/src/examples/rpg.mcrs +0 -13
- package/src/examples/stdlib_demo.mcrs +0 -181
- package/src2/emit/compile.ts +0 -99
- /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
- /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
- /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
- /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
- /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
- /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
- /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
- /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
- /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
- /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
- /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
- /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
- /package/dist/{src2 → src}/hir/types.js +0 -0
- /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
- /package/dist/{src2 → src}/lir/types.js +0 -0
- /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
- /package/dist/{src2 → src}/lir/verify.js +0 -0
- /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
- /package/dist/{src2 → src}/mir/macro.js +0 -0
- /package/dist/{src2 → src}/mir/types.js +0 -0
- /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
- /package/dist/{src2 → src}/mir/verify.js +0 -0
- /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
- /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
- /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
- /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
- /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
- /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
- /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
- /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
- /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
- /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
- /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
- /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
- /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
- /package/{src2 → src}/lir/verify.ts +0 -0
- /package/{src2 → src}/mir/macro.ts +0 -0
- /package/{src2 → src}/mir/verify.ts +0 -0
- /package/{src2 → src}/optimizer/block_merge.ts +0 -0
- /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
- /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
- /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
package/dist/src/compile.js
CHANGED
|
@@ -48,7 +48,7 @@ const diagnostics_1 = require("./diagnostics");
|
|
|
48
48
|
// ---------------------------------------------------------------------------
|
|
49
49
|
// Re-export v2 compile
|
|
50
50
|
// ---------------------------------------------------------------------------
|
|
51
|
-
var compile_1 = require("
|
|
51
|
+
var compile_1 = require("./emit/compile");
|
|
52
52
|
Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_1.compile; } });
|
|
53
53
|
/**
|
|
54
54
|
* Resolve a combined-source line number back to the original file and line.
|
|
@@ -75,6 +75,31 @@ function isLibrarySource(source) {
|
|
|
75
75
|
}
|
|
76
76
|
return false;
|
|
77
77
|
}
|
|
78
|
+
/** Resolve an import specifier to an absolute file path, trying multiple locations. */
|
|
79
|
+
function resolveImportPath(spec, fromFile, includeDirs) {
|
|
80
|
+
const candidates = spec.endsWith('.mcrs') ? [spec] : [spec, spec + '.mcrs'];
|
|
81
|
+
for (const candidate of candidates) {
|
|
82
|
+
// 1. Relative to the importing file
|
|
83
|
+
const rel = path.resolve(path.dirname(fromFile), candidate);
|
|
84
|
+
if (fs.existsSync(rel))
|
|
85
|
+
return rel;
|
|
86
|
+
// 2. stdlib directory (package root / src / stdlib)
|
|
87
|
+
// Strip leading 'stdlib/' prefix so `import "stdlib/math"` resolves to
|
|
88
|
+
// <stdlibDir>/math.mcrs rather than <stdlibDir>/stdlib/math.mcrs.
|
|
89
|
+
const stdlibDir = path.resolve(__dirname, '..', 'src', 'stdlib');
|
|
90
|
+
const stdlibCandidate = candidate.replace(/^stdlib\//, '');
|
|
91
|
+
const stdlib = path.resolve(stdlibDir, stdlibCandidate);
|
|
92
|
+
if (fs.existsSync(stdlib))
|
|
93
|
+
return stdlib;
|
|
94
|
+
// 3. Extra include dirs
|
|
95
|
+
for (const dir of includeDirs) {
|
|
96
|
+
const extra = path.resolve(dir, candidate);
|
|
97
|
+
if (fs.existsSync(extra))
|
|
98
|
+
return extra;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
78
103
|
function countLines(source) {
|
|
79
104
|
return source === '' ? 0 : source.split('\n').length;
|
|
80
105
|
}
|
|
@@ -88,6 +113,7 @@ function offsetRanges(ranges, lineOffset) {
|
|
|
88
113
|
function preprocessSourceWithMetadata(source, options = {}) {
|
|
89
114
|
const { filePath } = options;
|
|
90
115
|
const seen = options.seen ?? new Set();
|
|
116
|
+
const includeDirs = options.includeDirs ?? [];
|
|
91
117
|
if (filePath) {
|
|
92
118
|
seen.add(path.resolve(filePath));
|
|
93
119
|
}
|
|
@@ -105,27 +131,24 @@ function preprocessSourceWithMetadata(source, options = {}) {
|
|
|
105
131
|
if (!filePath) {
|
|
106
132
|
throw new diagnostics_1.DiagnosticError('ParseError', 'Import statements require a file path', { line: i + 1, col: 1 }, lines);
|
|
107
133
|
}
|
|
108
|
-
const importPath =
|
|
134
|
+
const importPath = resolveImportPath(match[1], filePath, includeDirs);
|
|
135
|
+
if (!importPath) {
|
|
136
|
+
throw new diagnostics_1.DiagnosticError('ParseError', `Cannot import '${match[1]}'`, { file: filePath, line: i + 1, col: 1 }, lines);
|
|
137
|
+
}
|
|
109
138
|
if (!seen.has(importPath)) {
|
|
110
139
|
seen.add(importPath);
|
|
111
|
-
|
|
112
|
-
try {
|
|
113
|
-
importedSource = fs.readFileSync(importPath, 'utf-8');
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
throw new diagnostics_1.DiagnosticError('ParseError', `Cannot import '${match[1]}'`, { file: filePath, line: i + 1, col: 1 }, lines);
|
|
117
|
-
}
|
|
140
|
+
const importedSource = fs.readFileSync(importPath, 'utf-8');
|
|
118
141
|
if (isLibrarySource(importedSource)) {
|
|
119
142
|
// Library file: parse separately so its functions are DCE-eligible.
|
|
120
143
|
// Also collect any transitive library imports inside it.
|
|
121
|
-
const nested = preprocessSourceWithMetadata(importedSource, { filePath: importPath, seen });
|
|
144
|
+
const nested = preprocessSourceWithMetadata(importedSource, { filePath: importPath, seen, includeDirs });
|
|
122
145
|
libraryImports.push({ source: importedSource, filePath: importPath });
|
|
123
146
|
// Propagate transitive library imports (e.g. math.mcrs imports vec.mcrs)
|
|
124
147
|
if (nested.libraryImports)
|
|
125
148
|
libraryImports.push(...nested.libraryImports);
|
|
126
149
|
}
|
|
127
150
|
else {
|
|
128
|
-
imports.push(preprocessSourceWithMetadata(importedSource, { filePath: importPath, seen }));
|
|
151
|
+
imports.push(preprocessSourceWithMetadata(importedSource, { filePath: importPath, seen, includeDirs }));
|
|
129
152
|
}
|
|
130
153
|
}
|
|
131
154
|
continue;
|
|
@@ -41,4 +41,4 @@ export declare class DiagnosticCollector {
|
|
|
41
41
|
* e.g., "Expected ';' at line 5, col 12"
|
|
42
42
|
*/
|
|
43
43
|
export declare function parseErrorMessage(kind: DiagnosticKind, rawMessage: string, sourceLines?: string[], filePath?: string): DiagnosticError;
|
|
44
|
-
export declare function formatError(error: Error | DiagnosticError, source?: string): string;
|
|
44
|
+
export declare function formatError(error: Error | DiagnosticError, source?: string, filePath?: string): string;
|
|
@@ -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,31 @@
|
|
|
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
|
+
/** Extra directories to search when resolving imports (in addition to relative and stdlib). */
|
|
23
|
+
includeDirs?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface CompileResult {
|
|
26
|
+
files: DatapackFile[];
|
|
27
|
+
warnings: string[];
|
|
28
|
+
/** Always true — v1 compat shim (compile() throws on error) */
|
|
29
|
+
readonly success: true;
|
|
30
|
+
}
|
|
31
|
+
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, includeDirs } = options;
|
|
26
|
+
const warnings = [];
|
|
27
|
+
// Preprocess: resolve import directives, merge imported sources
|
|
28
|
+
const preprocessed = (0, compile_1.preprocessSourceWithMetadata)(source, { filePath, includeDirs });
|
|
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
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Each LIRFunction becomes a .mcfunction file under data/<ns>/function/.
|
|
6
6
|
*/
|
|
7
7
|
import type { LIRModule } from '../lir/types';
|
|
8
|
+
import { McVersion } from '../types/mc-version';
|
|
8
9
|
export interface DatapackFile {
|
|
9
10
|
path: string;
|
|
10
11
|
content: string;
|
|
@@ -13,5 +14,13 @@ export interface EmitOptions {
|
|
|
13
14
|
namespace: string;
|
|
14
15
|
tickFunctions?: string[];
|
|
15
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;
|
|
16
25
|
}
|
|
17
26
|
export declare function emit(module: LIRModule, options: EmitOptions): DatapackFile[];
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.emit = emit;
|
|
10
|
+
const sourcemap_1 = require("./sourcemap");
|
|
11
|
+
const mc_version_1 = require("../types/mc-version");
|
|
10
12
|
// ---------------------------------------------------------------------------
|
|
11
13
|
// Public API
|
|
12
14
|
// ---------------------------------------------------------------------------
|
|
@@ -14,7 +16,10 @@ function emit(module, options) {
|
|
|
14
16
|
const { namespace } = options;
|
|
15
17
|
const tickFns = options.tickFunctions ?? [];
|
|
16
18
|
const loadFns = options.loadFunctions ?? [];
|
|
19
|
+
const scheduleFns = options.scheduleFunctions ?? [];
|
|
17
20
|
const objective = module.objective;
|
|
21
|
+
const genSourceMap = options.generateSourceMap ?? false;
|
|
22
|
+
const mcVersion = options.mcVersion ?? mc_version_1.DEFAULT_MC_VERSION;
|
|
18
23
|
const files = [];
|
|
19
24
|
// pack.mcmeta
|
|
20
25
|
files.push({
|
|
@@ -31,9 +36,27 @@ function emit(module, options) {
|
|
|
31
36
|
});
|
|
32
37
|
// Each LIR function → .mcfunction file
|
|
33
38
|
for (const fn of module.functions) {
|
|
34
|
-
const lines = emitFunction(fn, namespace, objective);
|
|
35
39
|
const fnPath = fnNameToPath(fn.name, namespace);
|
|
36
|
-
|
|
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
|
+
});
|
|
37
60
|
}
|
|
38
61
|
// Tag files for tick/load
|
|
39
62
|
if (loadFns.length > 0 || true) {
|
|
@@ -56,10 +79,18 @@ function emit(module, options) {
|
|
|
56
79
|
// ---------------------------------------------------------------------------
|
|
57
80
|
// Function emission
|
|
58
81
|
// ---------------------------------------------------------------------------
|
|
59
|
-
function emitFunction(fn, namespace, objective) {
|
|
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) {
|
|
60
90
|
const lines = [];
|
|
61
91
|
for (const instr of fn.instructions) {
|
|
62
|
-
lines.push(emitInstr(instr, namespace, objective));
|
|
92
|
+
lines.push(emitInstr(instr, namespace, objective, mcVersion));
|
|
93
|
+
builder.addLine(instr.sourceLoc);
|
|
63
94
|
}
|
|
64
95
|
return lines;
|
|
65
96
|
}
|
|
@@ -71,7 +102,7 @@ function fnNameToPath(name, namespace) {
|
|
|
71
102
|
// ---------------------------------------------------------------------------
|
|
72
103
|
// Instruction emission
|
|
73
104
|
// ---------------------------------------------------------------------------
|
|
74
|
-
function emitInstr(instr, ns, obj) {
|
|
105
|
+
function emitInstr(instr, ns, obj, mcVersion) {
|
|
75
106
|
switch (instr.kind) {
|
|
76
107
|
case 'score_set':
|
|
77
108
|
return `scoreboard players set ${slot(instr.dst)} ${instr.value}`;
|
|
@@ -94,7 +125,7 @@ function emitInstr(instr, ns, obj) {
|
|
|
94
125
|
case 'score_swap':
|
|
95
126
|
return `scoreboard players operation ${slot(instr.a)} >< ${slot(instr.b)}`;
|
|
96
127
|
case 'store_cmd_to_score':
|
|
97
|
-
return `execute store result score ${slot(instr.dst)} run ${emitInstr(instr.cmd, ns, obj)}`;
|
|
128
|
+
return `execute store result score ${slot(instr.dst)} run ${emitInstr(instr.cmd, ns, obj, mcVersion)}`;
|
|
98
129
|
case 'store_score_to_nbt':
|
|
99
130
|
return `execute store result storage ${instr.ns} ${instr.path} ${instr.type} ${instr.scale} run scoreboard players get ${slot(instr.src)}`;
|
|
100
131
|
case 'store_nbt_to_score':
|
|
@@ -106,7 +137,11 @@ function emitInstr(instr, ns, obj) {
|
|
|
106
137
|
case 'call':
|
|
107
138
|
return `function ${instr.fn}`;
|
|
108
139
|
case 'call_macro':
|
|
109
|
-
|
|
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}`;
|
|
110
145
|
case 'call_if_matches':
|
|
111
146
|
return `execute if score ${slot(instr.slot)} matches ${instr.range} run function ${instr.fn}`;
|
|
112
147
|
case 'call_unless_matches':
|
|
@@ -122,7 +157,13 @@ function emitInstr(instr, ns, obj) {
|
|
|
122
157
|
case 'return_value':
|
|
123
158
|
return `scoreboard players operation $ret ${instr.slot.obj} = ${slot(instr.slot)}`;
|
|
124
159
|
case 'macro_line':
|
|
125
|
-
|
|
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);
|
|
126
167
|
case 'raw':
|
|
127
168
|
return instr.cmd;
|
|
128
169
|
}
|
|
@@ -143,6 +184,16 @@ function cmpToMC(op) {
|
|
|
143
184
|
case 'ge': return '>=';
|
|
144
185
|
}
|
|
145
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
|
+
}
|
|
146
197
|
function emitSubcmd(sub) {
|
|
147
198
|
switch (sub.kind) {
|
|
148
199
|
case 'as':
|
|
@@ -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;
|