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
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FileCache — content-hash-based compilation cache for incremental builds.
|
|
4
|
+
*
|
|
5
|
+
* Stores per-file content hashes and optional cached HIR modules.
|
|
6
|
+
* Persists to `.redscript-cache/` as JSON.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.FileCache = void 0;
|
|
43
|
+
exports.hashFile = hashFile;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const crypto = __importStar(require("crypto"));
|
|
47
|
+
class FileCache {
|
|
48
|
+
constructor(cacheDir) {
|
|
49
|
+
this.entries = new Map();
|
|
50
|
+
this.cacheDir = cacheDir;
|
|
51
|
+
}
|
|
52
|
+
/** Get cached entry for a file (by absolute path). */
|
|
53
|
+
get(filePath) {
|
|
54
|
+
return this.entries.get(path.resolve(filePath));
|
|
55
|
+
}
|
|
56
|
+
/** Set cache entry for a file. */
|
|
57
|
+
set(filePath, entry) {
|
|
58
|
+
this.entries.set(path.resolve(filePath), entry);
|
|
59
|
+
}
|
|
60
|
+
/** Check if a file's content has changed since last cache. */
|
|
61
|
+
hasChanged(filePath) {
|
|
62
|
+
const absPath = path.resolve(filePath);
|
|
63
|
+
const cached = this.entries.get(absPath);
|
|
64
|
+
if (!cached)
|
|
65
|
+
return true;
|
|
66
|
+
// Quick mtime check first
|
|
67
|
+
try {
|
|
68
|
+
const stat = fs.statSync(absPath);
|
|
69
|
+
if (stat.mtimeMs === cached.mtime)
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
// mtime changed — compare content hash
|
|
76
|
+
const currentHash = hashFile(absPath);
|
|
77
|
+
return currentHash !== cached.hash;
|
|
78
|
+
}
|
|
79
|
+
/** Update the cache entry for a file from disk. Returns true if content changed. */
|
|
80
|
+
update(filePath, hir) {
|
|
81
|
+
const absPath = path.resolve(filePath);
|
|
82
|
+
const changed = this.hasChanged(absPath);
|
|
83
|
+
if (changed) {
|
|
84
|
+
try {
|
|
85
|
+
const stat = fs.statSync(absPath);
|
|
86
|
+
this.entries.set(absPath, {
|
|
87
|
+
hash: hashFile(absPath),
|
|
88
|
+
mtime: stat.mtimeMs,
|
|
89
|
+
hir,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
this.entries.delete(absPath);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (hir) {
|
|
97
|
+
// Update HIR even if hash didn't change
|
|
98
|
+
const entry = this.entries.get(absPath);
|
|
99
|
+
if (entry)
|
|
100
|
+
entry.hir = hir;
|
|
101
|
+
}
|
|
102
|
+
return changed;
|
|
103
|
+
}
|
|
104
|
+
/** Remove a file from the cache. */
|
|
105
|
+
delete(filePath) {
|
|
106
|
+
this.entries.delete(path.resolve(filePath));
|
|
107
|
+
}
|
|
108
|
+
/** Clear all cache entries. */
|
|
109
|
+
clear() {
|
|
110
|
+
this.entries.clear();
|
|
111
|
+
}
|
|
112
|
+
/** Number of cached entries. */
|
|
113
|
+
get size() {
|
|
114
|
+
return this.entries.size;
|
|
115
|
+
}
|
|
116
|
+
/** Persist cache to disk (`.redscript-cache/cache.json`). */
|
|
117
|
+
save() {
|
|
118
|
+
fs.mkdirSync(this.cacheDir, { recursive: true });
|
|
119
|
+
const serialized = {
|
|
120
|
+
version: 1,
|
|
121
|
+
entries: {},
|
|
122
|
+
};
|
|
123
|
+
for (const [filePath, entry] of this.entries) {
|
|
124
|
+
// Don't persist HIR — it contains non-serializable references
|
|
125
|
+
serialized.entries[filePath] = { hash: entry.hash, mtime: entry.mtime };
|
|
126
|
+
}
|
|
127
|
+
const cachePath = path.join(this.cacheDir, 'cache.json');
|
|
128
|
+
fs.writeFileSync(cachePath, JSON.stringify(serialized, null, 2));
|
|
129
|
+
}
|
|
130
|
+
/** Load cache from disk. */
|
|
131
|
+
load() {
|
|
132
|
+
const cachePath = path.join(this.cacheDir, 'cache.json');
|
|
133
|
+
try {
|
|
134
|
+
const data = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));
|
|
135
|
+
if (data.version !== 1)
|
|
136
|
+
return;
|
|
137
|
+
for (const [filePath, entry] of Object.entries(data.entries)) {
|
|
138
|
+
this.entries.set(filePath, { hash: entry.hash, mtime: entry.mtime });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// No cache or corrupt — start fresh
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.FileCache = FileCache;
|
|
147
|
+
/** SHA-256 hash of a file's content. */
|
|
148
|
+
function hashFile(filePath) {
|
|
149
|
+
const content = fs.readFileSync(filePath);
|
|
150
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=index.js.map
|
package/dist/src/cli.js
CHANGED
|
@@ -45,8 +45,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
46
|
const index_1 = require("./index");
|
|
47
47
|
const diagnostics_1 = require("./diagnostics");
|
|
48
|
+
const mc_version_1 = require("./types/mc-version");
|
|
48
49
|
const repl_1 = require("./repl");
|
|
49
50
|
const metadata_1 = require("./builtins/metadata");
|
|
51
|
+
const index_2 = require("./cache/index");
|
|
52
|
+
const deps_1 = require("./cache/deps");
|
|
53
|
+
const incremental_1 = require("./cache/incremental");
|
|
50
54
|
const fs = __importStar(require("fs"));
|
|
51
55
|
const path = __importStar(require("path"));
|
|
52
56
|
const https = __importStar(require("https"));
|
|
@@ -81,6 +85,10 @@ Options:
|
|
|
81
85
|
--namespace <ns> Datapack namespace (default: derived from filename)
|
|
82
86
|
--hot-reload <url> After each successful compile, POST to <url>/reload
|
|
83
87
|
(use with redscript-testharness; e.g. http://localhost:25561)
|
|
88
|
+
--source-map Generate .sourcemap.json files alongside .mcfunction output
|
|
89
|
+
--mc-version <ver> Target Minecraft version (default: 1.21). Affects codegen features.
|
|
90
|
+
e.g. --mc-version 1.20.2, --mc-version 1.19
|
|
91
|
+
--lenient Treat type errors as warnings instead of blocking compilation
|
|
84
92
|
-h, --help Show this help message
|
|
85
93
|
`);
|
|
86
94
|
}
|
|
@@ -190,6 +198,18 @@ function parseArgs(args) {
|
|
|
190
198
|
result.hotReload = args[++i];
|
|
191
199
|
i++;
|
|
192
200
|
}
|
|
201
|
+
else if (arg === '--source-map') {
|
|
202
|
+
result.sourceMap = true;
|
|
203
|
+
i++;
|
|
204
|
+
}
|
|
205
|
+
else if (arg === '--mc-version') {
|
|
206
|
+
result.mcVersionStr = args[++i];
|
|
207
|
+
i++;
|
|
208
|
+
}
|
|
209
|
+
else if (arg === '--lenient') {
|
|
210
|
+
result.lenient = true;
|
|
211
|
+
i++;
|
|
212
|
+
}
|
|
193
213
|
else if (!result.command) {
|
|
194
214
|
result.command = arg;
|
|
195
215
|
i++;
|
|
@@ -209,15 +229,25 @@ function deriveNamespace(filePath) {
|
|
|
209
229
|
// Convert to valid identifier: lowercase, replace non-alphanumeric with underscore
|
|
210
230
|
return basename.toLowerCase().replace(/[^a-z0-9]/g, '_');
|
|
211
231
|
}
|
|
212
|
-
function compileCommand(file, output, namespace) {
|
|
232
|
+
function compileCommand(file, output, namespace, sourceMap = false, mcVersionStr, lenient = false) {
|
|
213
233
|
// Read source file
|
|
214
234
|
if (!fs.existsSync(file)) {
|
|
215
235
|
console.error(`Error: File not found: ${file}`);
|
|
216
236
|
process.exit(1);
|
|
217
237
|
}
|
|
238
|
+
let mcVersion = mc_version_1.DEFAULT_MC_VERSION;
|
|
239
|
+
if (mcVersionStr) {
|
|
240
|
+
try {
|
|
241
|
+
mcVersion = (0, mc_version_1.parseMcVersion)(mcVersionStr);
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
console.error(`Error: ${e.message}`);
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
218
248
|
const source = fs.readFileSync(file, 'utf-8');
|
|
219
249
|
try {
|
|
220
|
-
const result = (0, index_1.compile)(source, { namespace, filePath: file });
|
|
250
|
+
const result = (0, index_1.compile)(source, { namespace, filePath: file, generateSourceMap: sourceMap, mcVersion, lenient });
|
|
221
251
|
for (const w of result.warnings) {
|
|
222
252
|
console.error(`Warning: ${w}`);
|
|
223
253
|
}
|
|
@@ -235,23 +265,27 @@ function compileCommand(file, output, namespace) {
|
|
|
235
265
|
console.log(` Files: ${result.files.length}`);
|
|
236
266
|
}
|
|
237
267
|
catch (err) {
|
|
238
|
-
console.error((0, diagnostics_1.formatError)(err, source));
|
|
268
|
+
console.error((0, diagnostics_1.formatError)(err, source, file));
|
|
239
269
|
process.exit(1);
|
|
240
270
|
}
|
|
241
271
|
}
|
|
242
|
-
function checkCommand(file) {
|
|
272
|
+
function checkCommand(file, namespace) {
|
|
243
273
|
// Read source file
|
|
244
274
|
if (!fs.existsSync(file)) {
|
|
245
275
|
console.error(`Error: File not found: ${file}`);
|
|
246
276
|
process.exit(1);
|
|
247
277
|
}
|
|
248
278
|
const source = fs.readFileSync(file, 'utf-8');
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
|
|
279
|
+
const ns = namespace ?? deriveNamespace(file);
|
|
280
|
+
const result = (0, index_1.checkWithWarnings)(source, ns, file);
|
|
281
|
+
for (const w of result.warnings) {
|
|
282
|
+
console.error(`Warning: ${w}`);
|
|
283
|
+
}
|
|
284
|
+
if (result.error) {
|
|
285
|
+
console.error((0, diagnostics_1.formatError)(result.error, source, file));
|
|
252
286
|
process.exit(1);
|
|
253
287
|
}
|
|
254
|
-
console.log(`✓
|
|
288
|
+
console.log(`✓ No errors found`);
|
|
255
289
|
}
|
|
256
290
|
async function hotReload(url) {
|
|
257
291
|
try {
|
|
@@ -282,49 +316,46 @@ function watchCommand(dir, output, namespace, hotReloadUrl) {
|
|
|
282
316
|
console.log(` Output: ${output}`);
|
|
283
317
|
if (hotReloadUrl)
|
|
284
318
|
console.log(` Hot reload: ${hotReloadUrl}`);
|
|
319
|
+
console.log(` Incremental compilation enabled`);
|
|
285
320
|
console.log(` Press Ctrl+C to stop\n`);
|
|
321
|
+
// Set up incremental compilation infrastructure
|
|
322
|
+
const cacheDir = path.join(dir, '.redscript-cache');
|
|
323
|
+
const cache = new index_2.FileCache(cacheDir);
|
|
324
|
+
cache.load();
|
|
325
|
+
const depGraph = new deps_1.DependencyGraph();
|
|
286
326
|
// Debounce timer
|
|
287
327
|
let debounceTimer = null;
|
|
288
|
-
// Compile all .mcrs files in directory
|
|
289
|
-
async function
|
|
328
|
+
// Compile all .mcrs files in directory (incrementally)
|
|
329
|
+
async function compileAllIncremental() {
|
|
290
330
|
const files = findRsFiles(dir);
|
|
291
331
|
if (files.length === 0) {
|
|
292
332
|
console.log(`⚠ No .mcrs files found in ${dir}`);
|
|
293
333
|
return;
|
|
294
334
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}
|
|
305
|
-
// Create output directory
|
|
306
|
-
fs.mkdirSync(output, { recursive: true });
|
|
307
|
-
// Write all files
|
|
308
|
-
for (const dataFile of result.files) {
|
|
309
|
-
const filePath = path.join(output, dataFile.path);
|
|
310
|
-
const fileDir = path.dirname(filePath);
|
|
311
|
-
fs.mkdirSync(fileDir, { recursive: true });
|
|
312
|
-
fs.writeFileSync(filePath, dataFile.content);
|
|
313
|
-
}
|
|
314
|
-
const timestamp = new Date().toLocaleTimeString();
|
|
315
|
-
console.log(`✓ [${timestamp}] Compiled ${file} (${result.files.length} files)`);
|
|
316
|
-
}
|
|
317
|
-
catch (err) {
|
|
318
|
-
hasErrors = true;
|
|
319
|
-
const timestamp = new Date().toLocaleTimeString();
|
|
320
|
-
console.error(`✗ [${timestamp}] ${(0, diagnostics_1.formatError)(err, source)}`);
|
|
335
|
+
const incResult = (0, incremental_1.compileIncremental)(files, cache, depGraph, {
|
|
336
|
+
namespace,
|
|
337
|
+
output,
|
|
338
|
+
});
|
|
339
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
340
|
+
// Print warnings from recompiled files
|
|
341
|
+
for (const [file, compileResult] of incResult.results) {
|
|
342
|
+
for (const w of compileResult.warnings) {
|
|
343
|
+
console.error(`Warning: ${w}`);
|
|
321
344
|
}
|
|
345
|
+
console.log(`✓ [${timestamp}] Compiled ${path.relative(dir, file)} (${compileResult.files.length} files)`);
|
|
346
|
+
}
|
|
347
|
+
if (incResult.cached > 0) {
|
|
348
|
+
console.log(` [${timestamp}] ${incResult.cached} file(s) unchanged (cached)`);
|
|
322
349
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
console.log('');
|
|
350
|
+
// Print errors
|
|
351
|
+
for (const [file, errMsg] of incResult.errors) {
|
|
352
|
+
console.error(`✗ [${timestamp}] ${path.relative(dir, file)}: ${errMsg}`);
|
|
327
353
|
}
|
|
354
|
+
// Persist cache
|
|
355
|
+
cache.save();
|
|
356
|
+
if (incResult.errors.size === 0 && hotReloadUrl)
|
|
357
|
+
await hotReload(hotReloadUrl);
|
|
358
|
+
console.log('');
|
|
328
359
|
}
|
|
329
360
|
// Find all .mcrs files recursively
|
|
330
361
|
function findRsFiles(directory) {
|
|
@@ -332,7 +363,7 @@ function watchCommand(dir, output, namespace, hotReloadUrl) {
|
|
|
332
363
|
const entries = fs.readdirSync(directory, { withFileTypes: true });
|
|
333
364
|
for (const entry of entries) {
|
|
334
365
|
const fullPath = path.join(directory, entry.name);
|
|
335
|
-
if (entry.isDirectory()) {
|
|
366
|
+
if (entry.isDirectory() && entry.name !== '.redscript-cache') {
|
|
336
367
|
results.push(...findRsFiles(fullPath));
|
|
337
368
|
}
|
|
338
369
|
else if (entry.isFile() && entry.name.endsWith('.mcrs')) {
|
|
@@ -342,7 +373,7 @@ function watchCommand(dir, output, namespace, hotReloadUrl) {
|
|
|
342
373
|
return results;
|
|
343
374
|
}
|
|
344
375
|
// Initial compile
|
|
345
|
-
void
|
|
376
|
+
void compileAllIncremental();
|
|
346
377
|
// Watch for changes
|
|
347
378
|
fs.watch(dir, { recursive: true }, (eventType, filename) => {
|
|
348
379
|
if (filename && filename.endsWith('.mcrs')) {
|
|
@@ -352,7 +383,7 @@ function watchCommand(dir, output, namespace, hotReloadUrl) {
|
|
|
352
383
|
}
|
|
353
384
|
debounceTimer = setTimeout(() => {
|
|
354
385
|
console.log(`📝 Change detected: ${filename}`);
|
|
355
|
-
void
|
|
386
|
+
void compileAllIncremental();
|
|
356
387
|
}, 100);
|
|
357
388
|
}
|
|
358
389
|
});
|
|
@@ -380,7 +411,7 @@ async function main() {
|
|
|
380
411
|
{
|
|
381
412
|
const namespace = parsed.namespace ?? deriveNamespace(parsed.file);
|
|
382
413
|
const output = parsed.output ?? './dist';
|
|
383
|
-
compileCommand(parsed.file, output, namespace);
|
|
414
|
+
compileCommand(parsed.file, output, namespace, parsed.sourceMap, parsed.mcVersionStr, parsed.lenient);
|
|
384
415
|
}
|
|
385
416
|
break;
|
|
386
417
|
case 'watch':
|
|
@@ -397,7 +428,7 @@ async function main() {
|
|
|
397
428
|
printUsage();
|
|
398
429
|
process.exit(1);
|
|
399
430
|
}
|
|
400
|
-
checkCommand(parsed.file);
|
|
431
|
+
checkCommand(parsed.file, parsed.namespace);
|
|
401
432
|
break;
|
|
402
433
|
case 'fmt':
|
|
403
434
|
case 'format': {
|
package/dist/src/compile.d.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Preprocessing utilities and v2 compile re-export.
|
|
5
5
|
*/
|
|
6
|
-
export { compile, CompileOptions, CompileResult } from '
|
|
7
|
-
export type { DatapackFile } from '
|
|
6
|
+
export { compile, CompileOptions, CompileResult } from './emit/compile';
|
|
7
|
+
export type { DatapackFile } from './emit/index';
|
|
8
8
|
export interface SourceRange {
|
|
9
9
|
startLine: number;
|
|
10
10
|
endLine: number;
|
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.
|
|
@@ -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,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level compile function for the v2 pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: source → Lexer → Parser → TypeCheck → HIR → MIR → optimize → LIR → emit
|
|
5
|
+
*/
|
|
6
|
+
import { type DatapackFile } from './index';
|
|
7
|
+
import { McVersion } from '../types/mc-version';
|
|
8
|
+
export interface CompileOptions {
|
|
9
|
+
namespace?: string;
|
|
10
|
+
filePath?: string;
|
|
11
|
+
/** v1 compat: inline library sources (treated as `module library;` imports) */
|
|
12
|
+
librarySources?: string[];
|
|
13
|
+
/** When true, generate .sourcemap.json files alongside .mcfunction output */
|
|
14
|
+
generateSourceMap?: boolean;
|
|
15
|
+
/** Target Minecraft version (default: 1.21). Affects which MC features are used. */
|
|
16
|
+
mcVersion?: McVersion;
|
|
17
|
+
/**
|
|
18
|
+
* When true, type errors are reported as warnings instead of blocking compilation.
|
|
19
|
+
* Use for gradual migration or testing with existing codebases that have type errors.
|
|
20
|
+
*/
|
|
21
|
+
lenient?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface CompileResult {
|
|
24
|
+
files: DatapackFile[];
|
|
25
|
+
warnings: string[];
|
|
26
|
+
/** Always true — v1 compat shim (compile() throws on error) */
|
|
27
|
+
readonly success: true;
|
|
28
|
+
}
|
|
29
|
+
export declare function compile(source: string, options?: CompileOptions): CompileResult;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Top-level compile function for the v2 pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Pipeline: source → Lexer → Parser → TypeCheck → HIR → MIR → optimize → LIR → emit
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.compile = compile;
|
|
9
|
+
const lexer_1 = require("../lexer");
|
|
10
|
+
const parser_1 = require("../parser");
|
|
11
|
+
const compile_1 = require("../compile");
|
|
12
|
+
const diagnostics_1 = require("../diagnostics");
|
|
13
|
+
const lower_1 = require("../hir/lower");
|
|
14
|
+
const monomorphize_1 = require("../hir/monomorphize");
|
|
15
|
+
const lower_2 = require("../mir/lower");
|
|
16
|
+
const pipeline_1 = require("../optimizer/pipeline");
|
|
17
|
+
const lower_3 = require("../lir/lower");
|
|
18
|
+
const pipeline_2 = require("../optimizer/lir/pipeline");
|
|
19
|
+
const index_1 = require("./index");
|
|
20
|
+
const coroutine_1 = require("../optimizer/coroutine");
|
|
21
|
+
const budget_1 = require("../lir/budget");
|
|
22
|
+
const mc_version_1 = require("../types/mc-version");
|
|
23
|
+
const typechecker_1 = require("../typechecker");
|
|
24
|
+
function compile(source, options = {}) {
|
|
25
|
+
const { namespace = 'redscript', filePath, generateSourceMap = false, mcVersion = mc_version_1.DEFAULT_MC_VERSION, lenient = false } = options;
|
|
26
|
+
const warnings = [];
|
|
27
|
+
// Preprocess: resolve import directives, merge imported sources
|
|
28
|
+
const preprocessed = (0, compile_1.preprocessSourceWithMetadata)(source, { filePath });
|
|
29
|
+
const processedSource = preprocessed.source;
|
|
30
|
+
// Stage 1: Lex + Parse → AST
|
|
31
|
+
const lexer = new lexer_1.Lexer(processedSource);
|
|
32
|
+
const tokens = lexer.tokenize();
|
|
33
|
+
const parser = new parser_1.Parser(tokens, processedSource, filePath);
|
|
34
|
+
const ast = parser.parse(namespace);
|
|
35
|
+
// Merge library imports (files with `module library;`) into AST
|
|
36
|
+
for (const li of preprocessed.libraryImports ?? []) {
|
|
37
|
+
const libPreprocessed = (0, compile_1.preprocessSourceWithMetadata)(li.source, { filePath: li.filePath });
|
|
38
|
+
const libTokens = new lexer_1.Lexer(libPreprocessed.source, li.filePath).tokenize();
|
|
39
|
+
const libAst = new parser_1.Parser(libTokens, libPreprocessed.source, li.filePath).parse(namespace);
|
|
40
|
+
for (const fn of libAst.declarations)
|
|
41
|
+
fn.isLibraryFn = true;
|
|
42
|
+
ast.declarations.push(...libAst.declarations);
|
|
43
|
+
ast.structs.push(...libAst.structs);
|
|
44
|
+
ast.implBlocks.push(...libAst.implBlocks);
|
|
45
|
+
ast.enums.push(...libAst.enums);
|
|
46
|
+
ast.consts.push(...libAst.consts);
|
|
47
|
+
ast.globals.push(...libAst.globals);
|
|
48
|
+
}
|
|
49
|
+
// Merge librarySources (v1 compat: inline library strings) before HIR
|
|
50
|
+
if (options.librarySources) {
|
|
51
|
+
for (const libSrc of options.librarySources) {
|
|
52
|
+
const libTokens = new lexer_1.Lexer(libSrc).tokenize();
|
|
53
|
+
const libAst = new parser_1.Parser(libTokens, libSrc).parse(namespace);
|
|
54
|
+
for (const fn of libAst.declarations)
|
|
55
|
+
fn.isLibraryFn = true;
|
|
56
|
+
ast.declarations.push(...libAst.declarations);
|
|
57
|
+
ast.structs.push(...libAst.structs);
|
|
58
|
+
ast.implBlocks.push(...libAst.implBlocks);
|
|
59
|
+
ast.enums.push(...libAst.enums);
|
|
60
|
+
ast.consts.push(...libAst.consts);
|
|
61
|
+
ast.globals.push(...libAst.globals);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Stage 1b: Type checking
|
|
65
|
+
// Run TypeChecker on the merged AST. In error-mode (default), throw on first type error.
|
|
66
|
+
// In lenient mode, demote type errors to warnings.
|
|
67
|
+
{
|
|
68
|
+
const checker = new typechecker_1.TypeChecker(processedSource, filePath);
|
|
69
|
+
const typeErrors = checker.check(ast);
|
|
70
|
+
if (typeErrors.length > 0) {
|
|
71
|
+
if (lenient) {
|
|
72
|
+
for (const e of typeErrors) {
|
|
73
|
+
warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
throw typeErrors[0];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Stage 2–7: lower, optimize, emit
|
|
82
|
+
// Wrap non-DiagnosticError from later stages so CLI always gets structured errors.
|
|
83
|
+
try {
|
|
84
|
+
// Stage 2: AST → HIR
|
|
85
|
+
const hirRaw = (0, lower_1.lowerToHIR)(ast);
|
|
86
|
+
// Stage 2b: Monomorphize generic functions
|
|
87
|
+
const hir = (0, monomorphize_1.monomorphize)(hirRaw);
|
|
88
|
+
// Extract @tick, @load, @coroutine, and @schedule functions from HIR (before decorator info is lost)
|
|
89
|
+
const tickFunctions = [];
|
|
90
|
+
const loadFunctions = [];
|
|
91
|
+
const coroutineInfos = [];
|
|
92
|
+
const scheduleFunctions = [];
|
|
93
|
+
for (const fn of hir.functions) {
|
|
94
|
+
for (const dec of fn.decorators) {
|
|
95
|
+
if (dec.name === 'tick')
|
|
96
|
+
tickFunctions.push(fn.name);
|
|
97
|
+
if (dec.name === 'load')
|
|
98
|
+
loadFunctions.push(fn.name);
|
|
99
|
+
if (dec.name === 'coroutine') {
|
|
100
|
+
coroutineInfos.push({
|
|
101
|
+
fnName: fn.name,
|
|
102
|
+
batch: dec.args?.batch ?? 10,
|
|
103
|
+
onDone: dec.args?.onDone,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (dec.name === 'schedule') {
|
|
107
|
+
scheduleFunctions.push({ name: fn.name, ticks: dec.args?.ticks ?? 1 });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Stage 3: HIR → MIR
|
|
112
|
+
const mir = (0, lower_2.lowerToMIR)(hir, filePath);
|
|
113
|
+
// Stage 4: MIR optimization
|
|
114
|
+
const mirOpt = (0, pipeline_1.optimizeModule)(mir);
|
|
115
|
+
// Stage 4b: Coroutine transform (opt-in, only for @coroutine functions)
|
|
116
|
+
const coroResult = (0, coroutine_1.coroutineTransform)(mirOpt, coroutineInfos);
|
|
117
|
+
const mirFinal = coroResult.module;
|
|
118
|
+
tickFunctions.push(...coroResult.generatedTickFunctions);
|
|
119
|
+
// Stage 5: MIR → LIR
|
|
120
|
+
const lir = (0, lower_3.lowerToLIR)(mirFinal);
|
|
121
|
+
// Stage 6: LIR optimization
|
|
122
|
+
const lirOpt = (0, pipeline_2.lirOptimizeModule)(lir);
|
|
123
|
+
// Static tick budget analysis
|
|
124
|
+
const coroutineNames = new Set(coroutineInfos.map(c => c.fnName));
|
|
125
|
+
const budgetDiags = (0, budget_1.analyzeBudget)(lirOpt, coroutineNames);
|
|
126
|
+
for (const diag of budgetDiags) {
|
|
127
|
+
if (diag.level === 'error') {
|
|
128
|
+
throw new diagnostics_1.DiagnosticError('LoweringError', diag.message, { line: 1, col: 1, file: filePath });
|
|
129
|
+
}
|
|
130
|
+
warnings.push(diag.message);
|
|
131
|
+
}
|
|
132
|
+
// Stage 7: LIR → .mcfunction
|
|
133
|
+
const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions, generateSourceMap, mcVersion });
|
|
134
|
+
return { files, warnings, success: true };
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
if (err instanceof diagnostics_1.DiagnosticError)
|
|
138
|
+
throw err;
|
|
139
|
+
const sourceLines = processedSource.split('\n');
|
|
140
|
+
throw (0, diagnostics_1.parseErrorMessage)('LoweringError', err.message, sourceLines, filePath);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -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[];
|