redscript-mc 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claudeignore +21 -0
- package/README.md +12 -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 +245 -0
- 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__/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 +76 -45
- package/dist/src/compile.d.ts +2 -2
- package/dist/src/compile.js +1 -1
- package/dist/src/diagnostics/index.d.ts +1 -1
- package/dist/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/{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 +352 -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/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 +270 -0
- 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__/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 +88 -45
- package/src/compile.ts +2 -2
- package/src/diagnostics/index.ts +8 -11
- package/src/emit/compile.ts +177 -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 +414 -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.d.ts +0 -1
- 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/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/{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
|
@@ -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;
|
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase 5b — Multi-Module Compilation
|
|
4
|
+
*
|
|
5
|
+
* Compiles multiple .mcrs files that use `module <name>;` / `import <mod>::<sym>;`
|
|
6
|
+
* into a single datapack with namespace-isolated scoreboards and correct cross-module
|
|
7
|
+
* function paths.
|
|
8
|
+
*
|
|
9
|
+
* Design:
|
|
10
|
+
* - Each module gets its own scoreboard objective: `__${namespace}_${moduleName}`
|
|
11
|
+
* - Cross-module function calls are emitted as `${namespace}:${moduleName}/${fnName}`
|
|
12
|
+
* - DCE: exported-but-never-imported functions are stripped from the output
|
|
13
|
+
* - Circular imports are detected and rejected
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.compileModules = compileModules;
|
|
17
|
+
const lexer_1 = require("../lexer");
|
|
18
|
+
const parser_1 = require("../parser");
|
|
19
|
+
const diagnostics_1 = require("../diagnostics");
|
|
20
|
+
const lower_1 = require("../hir/lower");
|
|
21
|
+
const monomorphize_1 = require("../hir/monomorphize");
|
|
22
|
+
const lower_2 = require("../mir/lower");
|
|
23
|
+
const pipeline_1 = require("../optimizer/pipeline");
|
|
24
|
+
const lower_3 = require("../lir/lower");
|
|
25
|
+
const pipeline_2 = require("../optimizer/lir/pipeline");
|
|
26
|
+
const index_1 = require("./index");
|
|
27
|
+
const coroutine_1 = require("../optimizer/coroutine");
|
|
28
|
+
function compileModules(modules, options = {}) {
|
|
29
|
+
const namespace = options.namespace ?? 'redscript';
|
|
30
|
+
const warnings = [];
|
|
31
|
+
if (modules.length === 0) {
|
|
32
|
+
throw new diagnostics_1.DiagnosticError('LoweringError', 'No modules provided', { line: 1, col: 1 });
|
|
33
|
+
}
|
|
34
|
+
// -------------------------------------------------------------------------
|
|
35
|
+
// Step 1: Parse all modules
|
|
36
|
+
// -------------------------------------------------------------------------
|
|
37
|
+
const parsedModules = new Map(); // moduleName → AST
|
|
38
|
+
for (const mod of modules) {
|
|
39
|
+
const lexer = new lexer_1.Lexer(mod.source, mod.filePath);
|
|
40
|
+
const tokens = lexer.tokenize();
|
|
41
|
+
const parser = new parser_1.Parser(tokens, mod.source, mod.filePath);
|
|
42
|
+
const ast = parser.parse(namespace);
|
|
43
|
+
// Verify declared module name matches provided name
|
|
44
|
+
const declaredName = ast.moduleName;
|
|
45
|
+
if (declaredName && declaredName !== mod.name) {
|
|
46
|
+
throw new diagnostics_1.DiagnosticError('LoweringError', `Module declares name '${declaredName}' but was registered as '${mod.name}'`, { file: mod.filePath, line: 1, col: 1 });
|
|
47
|
+
}
|
|
48
|
+
parsedModules.set(mod.name, ast);
|
|
49
|
+
}
|
|
50
|
+
// -------------------------------------------------------------------------
|
|
51
|
+
// Step 2: Build export tables and validate imports
|
|
52
|
+
// -------------------------------------------------------------------------
|
|
53
|
+
// moduleName → set of exported function names
|
|
54
|
+
const exportTable = new Map();
|
|
55
|
+
for (const [modName, ast] of parsedModules) {
|
|
56
|
+
const exports = new Set();
|
|
57
|
+
for (const fn of ast.declarations) {
|
|
58
|
+
if (fn.isExported)
|
|
59
|
+
exports.add(fn.name);
|
|
60
|
+
}
|
|
61
|
+
exportTable.set(modName, exports);
|
|
62
|
+
}
|
|
63
|
+
// -------------------------------------------------------------------------
|
|
64
|
+
// Step 3: Circular import detection
|
|
65
|
+
// -------------------------------------------------------------------------
|
|
66
|
+
detectCircularImports(parsedModules);
|
|
67
|
+
// -------------------------------------------------------------------------
|
|
68
|
+
// Step 4: Build import resolution table per module
|
|
69
|
+
// importMap: moduleName → { symbolName → qualifiedName (e.g. "math/sin") }
|
|
70
|
+
// -------------------------------------------------------------------------
|
|
71
|
+
const importMap = new Map();
|
|
72
|
+
for (const [modName, ast] of parsedModules) {
|
|
73
|
+
const resolved = new Map();
|
|
74
|
+
for (const imp of ast.imports) {
|
|
75
|
+
const sourceExports = exportTable.get(imp.moduleName);
|
|
76
|
+
if (!sourceExports) {
|
|
77
|
+
throw new diagnostics_1.DiagnosticError('LoweringError', `Module '${imp.moduleName}' not found (imported in '${modName}')`, { file: ast.namespace, line: 1, col: 1 });
|
|
78
|
+
}
|
|
79
|
+
if (imp.symbol === '*') {
|
|
80
|
+
// Wildcard: import all exports
|
|
81
|
+
for (const sym of sourceExports) {
|
|
82
|
+
resolved.set(sym, `${imp.moduleName}/${sym}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
if (!sourceExports.has(imp.symbol)) {
|
|
87
|
+
throw new diagnostics_1.DiagnosticError('LoweringError', `Module '${imp.moduleName}' does not export '${imp.symbol}'`, { line: 1, col: 1 });
|
|
88
|
+
}
|
|
89
|
+
resolved.set(imp.symbol, `${imp.moduleName}/${imp.symbol}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
importMap.set(modName, resolved);
|
|
93
|
+
}
|
|
94
|
+
// -------------------------------------------------------------------------
|
|
95
|
+
// Step 5: Compute which exported symbols are actually used (for cross-module DCE)
|
|
96
|
+
// usedExports: moduleName → set of exported fn names that are imported somewhere
|
|
97
|
+
// -------------------------------------------------------------------------
|
|
98
|
+
const usedExports = new Map();
|
|
99
|
+
for (const modName of parsedModules.keys()) {
|
|
100
|
+
usedExports.set(modName, new Set());
|
|
101
|
+
}
|
|
102
|
+
for (const ast of parsedModules.values()) {
|
|
103
|
+
for (const imp of ast.imports) {
|
|
104
|
+
const used = usedExports.get(imp.moduleName);
|
|
105
|
+
if (!used)
|
|
106
|
+
continue;
|
|
107
|
+
if (imp.symbol === '*') {
|
|
108
|
+
const exports = exportTable.get(imp.moduleName);
|
|
109
|
+
if (exports)
|
|
110
|
+
for (const s of exports)
|
|
111
|
+
used.add(s);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
used.add(imp.symbol);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// -------------------------------------------------------------------------
|
|
119
|
+
// Step 6: Compile each module
|
|
120
|
+
// -------------------------------------------------------------------------
|
|
121
|
+
const allFiles = [];
|
|
122
|
+
// Track library-eligible file paths for cross-module DCE
|
|
123
|
+
const libraryFilePaths = new Set();
|
|
124
|
+
let packMetaEmitted = false;
|
|
125
|
+
for (const mod of modules) {
|
|
126
|
+
const ast = parsedModules.get(mod.name);
|
|
127
|
+
const symbolMap = importMap.get(mod.name) ?? new Map();
|
|
128
|
+
const isNamed = !!ast.moduleName;
|
|
129
|
+
// Rewrite call sites in AST: imported symbol names → qualified names
|
|
130
|
+
if (symbolMap.size > 0) {
|
|
131
|
+
rewriteCallsInProgram(ast, symbolMap);
|
|
132
|
+
}
|
|
133
|
+
// For named modules: prefix all function definitions with `${moduleName}/`
|
|
134
|
+
// so they emit to `${namespace}:${moduleName}/${fnName}.mcfunction`
|
|
135
|
+
// Track which exported functions are not imported anywhere (for cross-module DCE)
|
|
136
|
+
const unusedExportedFns = new Set();
|
|
137
|
+
if (isNamed) {
|
|
138
|
+
const used = usedExports.get(mod.name) ?? new Set();
|
|
139
|
+
for (const fn of ast.declarations) {
|
|
140
|
+
// Prefix function name
|
|
141
|
+
fn.name = `${mod.name}/${fn.name}`;
|
|
142
|
+
// Functions not imported by anyone are library-eligible (DCE)
|
|
143
|
+
const baseName = fn.name.split('/').pop();
|
|
144
|
+
if (fn.isExported && !used.has(baseName)) {
|
|
145
|
+
unusedExportedFns.add(fn.name);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Determine scoreboard objective
|
|
150
|
+
// Named module: `__${namespace}_${moduleName}`, anonymous: `__${namespace}`
|
|
151
|
+
const objective = isNamed ? `__${namespace}_${mod.name}` : `__${namespace}`;
|
|
152
|
+
// Run the pipeline
|
|
153
|
+
const modFiles = compileSingleModule(ast, namespace, objective, isNamed ? mod.name : undefined, mod.filePath);
|
|
154
|
+
warnings.push(...modFiles.warnings);
|
|
155
|
+
// Record library-eligible file paths (only if there are multiple modules — single module = library author)
|
|
156
|
+
if (modules.length > 1) {
|
|
157
|
+
for (const fnName of unusedExportedFns) {
|
|
158
|
+
// fnName is like "math/unused" → file path "data/<ns>/function/math/unused.mcfunction"
|
|
159
|
+
libraryFilePaths.add(`data/${namespace}/function/${fnName}.mcfunction`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Merge files, emitting pack.mcmeta only once
|
|
163
|
+
for (const file of modFiles.files) {
|
|
164
|
+
if (file.path === 'pack.mcmeta') {
|
|
165
|
+
if (!packMetaEmitted) {
|
|
166
|
+
allFiles.push(file);
|
|
167
|
+
packMetaEmitted = true;
|
|
168
|
+
}
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
// Merge load.json tag values
|
|
172
|
+
if (file.path === 'data/minecraft/tags/function/load.json') {
|
|
173
|
+
mergeTagFile(allFiles, file);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
// Merge tick.json tag values
|
|
177
|
+
if (file.path === 'data/minecraft/tags/function/tick.json') {
|
|
178
|
+
mergeTagFile(allFiles, file);
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
allFiles.push(file);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// -------------------------------------------------------------------------
|
|
185
|
+
// Step 7: Cross-module DCE — remove unreachable library-eligible functions
|
|
186
|
+
// -------------------------------------------------------------------------
|
|
187
|
+
const finalFiles = crossModuleDCE(allFiles, libraryFilePaths, namespace);
|
|
188
|
+
return { files: finalFiles, warnings };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* File-level cross-module DCE.
|
|
192
|
+
*
|
|
193
|
+
* After all module files are emitted, prune .mcfunction files that:
|
|
194
|
+
* 1. Correspond to exported-but-unimported functions (tracked in `libraryPaths`)
|
|
195
|
+
* 2. Are not reachable (directly or transitively) from any non-library entry file
|
|
196
|
+
*
|
|
197
|
+
* The reachability is computed by scanning `function <ns>:<path>` calls in
|
|
198
|
+
* every .mcfunction file.
|
|
199
|
+
*/
|
|
200
|
+
function crossModuleDCE(files, libraryPaths, // file paths (e.g. "data/ns/function/math/unused.mcfunction")
|
|
201
|
+
namespace) {
|
|
202
|
+
if (libraryPaths.size === 0)
|
|
203
|
+
return files;
|
|
204
|
+
// Build a map: fnPath (e.g. "ns:math/add") → file path
|
|
205
|
+
const fnPathToFilePath = new Map();
|
|
206
|
+
for (const file of files) {
|
|
207
|
+
const m = file.path.match(/^data\/([^/]+)\/function\/(.+)\.mcfunction$/);
|
|
208
|
+
if (m) {
|
|
209
|
+
fnPathToFilePath.set(`${m[1]}:${m[2]}`, file.path);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Build call graph: filePath → set of called fnPaths (namespace:path)
|
|
213
|
+
const callGraph = new Map();
|
|
214
|
+
const callPattern = /\bfunction\s+([\w\-]+:[\w\-./]+)/g;
|
|
215
|
+
for (const file of files) {
|
|
216
|
+
if (!file.path.endsWith('.mcfunction'))
|
|
217
|
+
continue;
|
|
218
|
+
const called = new Set();
|
|
219
|
+
let match;
|
|
220
|
+
callPattern.lastIndex = 0;
|
|
221
|
+
while ((match = callPattern.exec(file.content)) !== null) {
|
|
222
|
+
called.add(match[1]);
|
|
223
|
+
}
|
|
224
|
+
callGraph.set(file.path, called);
|
|
225
|
+
}
|
|
226
|
+
// BFS from non-library entry files
|
|
227
|
+
const reachableFiles = new Set();
|
|
228
|
+
const queue = [];
|
|
229
|
+
for (const file of files) {
|
|
230
|
+
if (!file.path.endsWith('.mcfunction'))
|
|
231
|
+
continue;
|
|
232
|
+
if (!libraryPaths.has(file.path)) {
|
|
233
|
+
// Non-library file: it's an entry point
|
|
234
|
+
queue.push(file.path);
|
|
235
|
+
reachableFiles.add(file.path);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
while (queue.length > 0) {
|
|
239
|
+
const current = queue.shift();
|
|
240
|
+
const called = callGraph.get(current) ?? new Set();
|
|
241
|
+
for (const fnPath of called) {
|
|
242
|
+
const filePath = fnPathToFilePath.get(fnPath);
|
|
243
|
+
if (filePath && !reachableFiles.has(filePath)) {
|
|
244
|
+
reachableFiles.add(filePath);
|
|
245
|
+
queue.push(filePath);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Filter out unreachable library files
|
|
250
|
+
return files.filter(file => {
|
|
251
|
+
if (!libraryPaths.has(file.path))
|
|
252
|
+
return true; // non-library: always keep
|
|
253
|
+
return reachableFiles.has(file.path); // library: keep only if reachable
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
function compileSingleModule(ast, namespace, objective, moduleName, filePath) {
|
|
257
|
+
const warnings = [];
|
|
258
|
+
try {
|
|
259
|
+
const hirRaw = (0, lower_1.lowerToHIR)(ast);
|
|
260
|
+
const hir = (0, monomorphize_1.monomorphize)(hirRaw);
|
|
261
|
+
// Extract decorator metadata
|
|
262
|
+
const tickFunctions = [];
|
|
263
|
+
const loadFunctions = [];
|
|
264
|
+
const coroutineInfos = [];
|
|
265
|
+
const scheduleFunctions = [];
|
|
266
|
+
for (const fn of hir.functions) {
|
|
267
|
+
for (const dec of fn.decorators) {
|
|
268
|
+
if (dec.name === 'tick')
|
|
269
|
+
tickFunctions.push(fn.name);
|
|
270
|
+
if (dec.name === 'load')
|
|
271
|
+
loadFunctions.push(fn.name);
|
|
272
|
+
if (dec.name === 'coroutine') {
|
|
273
|
+
coroutineInfos.push({ fnName: fn.name, batch: dec.args?.batch ?? 10, onDone: dec.args?.onDone });
|
|
274
|
+
}
|
|
275
|
+
if (dec.name === 'schedule') {
|
|
276
|
+
scheduleFunctions.push({ name: fn.name, ticks: dec.args?.ticks ?? 1 });
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Patch the MIR module objective (lowerToMIR computes `__${namespace}` by default)
|
|
281
|
+
const mir = (0, lower_2.lowerToMIR)(hir, filePath);
|
|
282
|
+
mir.objective = objective;
|
|
283
|
+
const mirOpt = (0, pipeline_1.optimizeModule)(mir);
|
|
284
|
+
const coroResult = (0, coroutine_1.coroutineTransform)(mirOpt, coroutineInfos);
|
|
285
|
+
const mirFinal = coroResult.module;
|
|
286
|
+
tickFunctions.push(...coroResult.generatedTickFunctions);
|
|
287
|
+
const lir = (0, lower_3.lowerToLIR)(mirFinal);
|
|
288
|
+
lir.objective = objective;
|
|
289
|
+
const lirOpt = (0, pipeline_2.lirOptimizeModule)(lir);
|
|
290
|
+
const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions });
|
|
291
|
+
// For named modules: rename the load.mcfunction to avoid path collision.
|
|
292
|
+
// Rename `data/${ns}/function/load.mcfunction` → `data/${ns}/function/${modName}/_load.mcfunction`
|
|
293
|
+
// and update the load tag reference accordingly.
|
|
294
|
+
if (moduleName) {
|
|
295
|
+
const loadPath = `data/${namespace}/function/load.mcfunction`;
|
|
296
|
+
const newLoadPath = `data/${namespace}/function/${moduleName}/_load.mcfunction`;
|
|
297
|
+
const loadTagPath = 'data/minecraft/tags/function/load.json';
|
|
298
|
+
for (const file of files) {
|
|
299
|
+
if (file.path === loadPath) {
|
|
300
|
+
file.path = newLoadPath;
|
|
301
|
+
}
|
|
302
|
+
else if (file.path === loadTagPath) {
|
|
303
|
+
const tag = JSON.parse(file.content);
|
|
304
|
+
tag.values = tag.values.map(v => v === `${namespace}:load` ? `${namespace}:${moduleName}/_load` : v);
|
|
305
|
+
file.content = JSON.stringify(tag, null, 2) + '\n';
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return { files, warnings };
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
if (err instanceof diagnostics_1.DiagnosticError)
|
|
313
|
+
throw err;
|
|
314
|
+
throw err;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/** Merge a tag file (load.json / tick.json) values into existing files array. */
|
|
318
|
+
function mergeTagFile(files, newFile) {
|
|
319
|
+
const existing = files.find(f => f.path === newFile.path);
|
|
320
|
+
if (!existing) {
|
|
321
|
+
files.push(newFile);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const existingJson = JSON.parse(existing.content);
|
|
325
|
+
const newJson = JSON.parse(newFile.content);
|
|
326
|
+
existingJson.values.push(...newJson.values);
|
|
327
|
+
existing.content = JSON.stringify(existingJson, null, 2) + '\n';
|
|
328
|
+
}
|
|
329
|
+
/** Detect circular imports using DFS. Throws if a cycle is found. */
|
|
330
|
+
function detectCircularImports(parsedModules) {
|
|
331
|
+
const visited = new Set();
|
|
332
|
+
const inStack = new Set();
|
|
333
|
+
function dfs(modName, stack) {
|
|
334
|
+
if (inStack.has(modName)) {
|
|
335
|
+
const cycle = [...stack.slice(stack.indexOf(modName)), modName];
|
|
336
|
+
throw new diagnostics_1.DiagnosticError('LoweringError', `Circular import detected: ${cycle.join(' → ')}`, { line: 1, col: 1 });
|
|
337
|
+
}
|
|
338
|
+
if (visited.has(modName))
|
|
339
|
+
return;
|
|
340
|
+
visited.add(modName);
|
|
341
|
+
inStack.add(modName);
|
|
342
|
+
const ast = parsedModules.get(modName);
|
|
343
|
+
if (ast) {
|
|
344
|
+
for (const imp of ast.imports) {
|
|
345
|
+
dfs(imp.moduleName, [...stack, modName]);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
inStack.delete(modName);
|
|
349
|
+
}
|
|
350
|
+
for (const modName of parsedModules.keys()) {
|
|
351
|
+
dfs(modName, []);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// ---------------------------------------------------------------------------
|
|
355
|
+
// AST rewriting: remap imported symbol calls to qualified names
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
/** Rewrite call expressions in the program AST.
|
|
358
|
+
* symbolMap: localName → qualifiedName (e.g. "sin" → "math/sin") */
|
|
359
|
+
function rewriteCallsInProgram(program, symbolMap) {
|
|
360
|
+
for (const fn of program.declarations) {
|
|
361
|
+
rewriteBlock(fn.body, symbolMap);
|
|
362
|
+
}
|
|
363
|
+
for (const ib of program.implBlocks) {
|
|
364
|
+
for (const m of ib.methods) {
|
|
365
|
+
rewriteBlock(m.body, symbolMap);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
function rewriteBlock(block, symbolMap) {
|
|
370
|
+
for (const stmt of block) {
|
|
371
|
+
rewriteStmt(stmt, symbolMap);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
function rewriteStmt(stmt, symbolMap) {
|
|
375
|
+
switch (stmt.kind) {
|
|
376
|
+
case 'let':
|
|
377
|
+
case 'expr':
|
|
378
|
+
rewriteExpr(stmt.kind === 'let' ? stmt.init : stmt.expr, symbolMap);
|
|
379
|
+
break;
|
|
380
|
+
case 'return':
|
|
381
|
+
if (stmt.value)
|
|
382
|
+
rewriteExpr(stmt.value, symbolMap);
|
|
383
|
+
break;
|
|
384
|
+
case 'if':
|
|
385
|
+
rewriteExpr(stmt.cond, symbolMap);
|
|
386
|
+
rewriteBlock(stmt.then, symbolMap);
|
|
387
|
+
if (stmt.else_)
|
|
388
|
+
rewriteBlock(stmt.else_, symbolMap);
|
|
389
|
+
break;
|
|
390
|
+
case 'while':
|
|
391
|
+
rewriteExpr(stmt.cond, symbolMap);
|
|
392
|
+
rewriteBlock(stmt.body, symbolMap);
|
|
393
|
+
break;
|
|
394
|
+
case 'for':
|
|
395
|
+
if (stmt.init)
|
|
396
|
+
rewriteStmt(stmt.init, symbolMap);
|
|
397
|
+
rewriteExpr(stmt.cond, symbolMap);
|
|
398
|
+
rewriteExpr(stmt.step, symbolMap);
|
|
399
|
+
rewriteBlock(stmt.body, symbolMap);
|
|
400
|
+
break;
|
|
401
|
+
case 'for_range':
|
|
402
|
+
rewriteExpr(stmt.start, symbolMap);
|
|
403
|
+
rewriteExpr(stmt.end, symbolMap);
|
|
404
|
+
rewriteBlock(stmt.body, symbolMap);
|
|
405
|
+
break;
|
|
406
|
+
case 'foreach':
|
|
407
|
+
rewriteExpr(stmt.iterable, symbolMap);
|
|
408
|
+
rewriteBlock(stmt.body, symbolMap);
|
|
409
|
+
break;
|
|
410
|
+
case 'match':
|
|
411
|
+
rewriteExpr(stmt.expr, symbolMap);
|
|
412
|
+
for (const arm of stmt.arms) {
|
|
413
|
+
if (arm.pattern)
|
|
414
|
+
rewriteExpr(arm.pattern, symbolMap);
|
|
415
|
+
rewriteBlock(arm.body, symbolMap);
|
|
416
|
+
}
|
|
417
|
+
break;
|
|
418
|
+
case 'as_block':
|
|
419
|
+
case 'at_block':
|
|
420
|
+
rewriteBlock(stmt.body, symbolMap);
|
|
421
|
+
break;
|
|
422
|
+
case 'as_at':
|
|
423
|
+
rewriteBlock(stmt.body, symbolMap);
|
|
424
|
+
break;
|
|
425
|
+
case 'execute':
|
|
426
|
+
rewriteBlock(stmt.body, symbolMap);
|
|
427
|
+
break;
|
|
428
|
+
case 'let_destruct':
|
|
429
|
+
rewriteExpr(stmt.init, symbolMap);
|
|
430
|
+
break;
|
|
431
|
+
// break, continue, raw: nothing to rewrite
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function rewriteExpr(expr, symbolMap) {
|
|
435
|
+
switch (expr.kind) {
|
|
436
|
+
case 'call': {
|
|
437
|
+
// Remap the function name if it's an imported symbol
|
|
438
|
+
const remapped = symbolMap.get(expr.fn);
|
|
439
|
+
if (remapped) {
|
|
440
|
+
;
|
|
441
|
+
expr.fn = remapped;
|
|
442
|
+
}
|
|
443
|
+
for (const arg of expr.args)
|
|
444
|
+
rewriteExpr(arg, symbolMap);
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
case 'assign':
|
|
448
|
+
rewriteExpr(expr.value, symbolMap);
|
|
449
|
+
break;
|
|
450
|
+
case 'binary':
|
|
451
|
+
rewriteExpr(expr.left, symbolMap);
|
|
452
|
+
rewriteExpr(expr.right, symbolMap);
|
|
453
|
+
break;
|
|
454
|
+
case 'unary':
|
|
455
|
+
rewriteExpr(expr.operand, symbolMap);
|
|
456
|
+
break;
|
|
457
|
+
case 'member':
|
|
458
|
+
rewriteExpr(expr.obj, symbolMap);
|
|
459
|
+
break;
|
|
460
|
+
case 'member_assign':
|
|
461
|
+
rewriteExpr(expr.obj, symbolMap);
|
|
462
|
+
rewriteExpr(expr.value, symbolMap);
|
|
463
|
+
break;
|
|
464
|
+
case 'index':
|
|
465
|
+
rewriteExpr(expr.obj, symbolMap);
|
|
466
|
+
rewriteExpr(expr.index, symbolMap);
|
|
467
|
+
break;
|
|
468
|
+
case 'array_lit':
|
|
469
|
+
for (const el of expr.elements)
|
|
470
|
+
rewriteExpr(el, symbolMap);
|
|
471
|
+
break;
|
|
472
|
+
case 'struct_lit':
|
|
473
|
+
for (const f of expr.fields)
|
|
474
|
+
rewriteExpr(f.value, symbolMap);
|
|
475
|
+
break;
|
|
476
|
+
case 'invoke':
|
|
477
|
+
rewriteExpr(expr.callee, symbolMap);
|
|
478
|
+
for (const arg of expr.args)
|
|
479
|
+
rewriteExpr(arg, symbolMap);
|
|
480
|
+
break;
|
|
481
|
+
case 'tuple_lit':
|
|
482
|
+
for (const el of expr.elements)
|
|
483
|
+
rewriteExpr(el, symbolMap);
|
|
484
|
+
break;
|
|
485
|
+
case 'static_call':
|
|
486
|
+
for (const arg of expr.args)
|
|
487
|
+
rewriteExpr(arg, symbolMap);
|
|
488
|
+
break;
|
|
489
|
+
// Literals, ident, selector, path_expr, f_string, etc: nothing to rewrite
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=modules.js.map
|