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
package/src/ast/types.ts
CHANGED
|
@@ -53,6 +53,8 @@ export type TypeNode =
|
|
|
53
53
|
| { kind: 'function_type'; params: TypeNode[]; return: TypeNode }
|
|
54
54
|
| { kind: 'entity'; entityType: EntityTypeName } // Entity types
|
|
55
55
|
| { kind: 'selector'; entityType?: string } // Selector type, optionally parameterized: selector<Player>
|
|
56
|
+
| { kind: 'tuple'; elements: TypeNode[] } // Tuple type: (int, int, bool)
|
|
57
|
+
| { kind: 'option'; inner: TypeNode } // Option<T> — null safety wrapper
|
|
56
58
|
|
|
57
59
|
export interface LambdaParam {
|
|
58
60
|
name: string
|
|
@@ -163,7 +165,7 @@ export type Expr =
|
|
|
163
165
|
| { kind: 'is_check'; expr: Expr; entityType: EntityTypeName; span?: Span }
|
|
164
166
|
| { kind: 'unary'; op: '!' | '-'; operand: Expr; span?: Span }
|
|
165
167
|
| { kind: 'assign'; target: string; op: AssignOp; value: Expr; span?: Span }
|
|
166
|
-
| { kind: 'call'; fn: string; args: Expr[]; span?: Span }
|
|
168
|
+
| { kind: 'call'; fn: string; args: Expr[]; typeArgs?: TypeNode[]; span?: Span }
|
|
167
169
|
| { kind: 'invoke'; callee: Expr; args: Expr[]; span?: Span }
|
|
168
170
|
| { kind: 'member'; obj: Expr; field: string; span?: Span }
|
|
169
171
|
| { kind: 'struct_lit'; fields: { name: string; value: Expr }[]; span?: Span }
|
|
@@ -171,7 +173,11 @@ export type Expr =
|
|
|
171
173
|
| { kind: 'index'; obj: Expr; index: Expr; span?: Span }
|
|
172
174
|
| { kind: 'array_lit'; elements: Expr[]; span?: Span }
|
|
173
175
|
| { kind: 'static_call'; type: string; method: string; args: Expr[]; span?: Span }
|
|
176
|
+
| { kind: 'path_expr'; enumName: string; variant: string; span?: Span }
|
|
174
177
|
| (LambdaExpr & { span?: Span })
|
|
178
|
+
| { kind: 'tuple_lit'; elements: Expr[]; span?: Span }
|
|
179
|
+
| { kind: 'some_lit'; value: Expr; span?: Span } // Some(expr)
|
|
180
|
+
| { kind: 'none_lit'; span?: Span } // None
|
|
175
181
|
|
|
176
182
|
export type LiteralExpr =
|
|
177
183
|
| Extract<Expr, { kind: 'int_lit' }>
|
|
@@ -217,6 +223,7 @@ export type ExecuteSubcommand =
|
|
|
217
223
|
|
|
218
224
|
export type Stmt =
|
|
219
225
|
| { kind: 'let'; name: string; type?: TypeNode; init: Expr; span?: Span }
|
|
226
|
+
| { kind: 'let_destruct'; names: string[]; type?: TypeNode; init: Expr; span?: Span }
|
|
220
227
|
| { kind: 'expr'; expr: Expr; span?: Span }
|
|
221
228
|
| { kind: 'return'; value?: Expr; span?: Span }
|
|
222
229
|
| { kind: 'break'; span?: Span }
|
|
@@ -227,6 +234,7 @@ export type Stmt =
|
|
|
227
234
|
| { kind: 'foreach'; binding: string; iterable: Expr; body: Block; executeContext?: string; span?: Span }
|
|
228
235
|
| { kind: 'for_range'; varName: string; start: Expr; end: Expr; body: Block; span?: Span }
|
|
229
236
|
| { kind: 'match'; expr: Expr; arms: { pattern: Expr | null; body: Block }[]; span?: Span }
|
|
237
|
+
| { kind: 'if_let_some'; binding: string; init: Expr; then: Block; else_?: Block; span?: Span }
|
|
230
238
|
| { kind: 'as_block'; selector: EntitySelector; body: Block; span?: Span }
|
|
231
239
|
| { kind: 'at_block'; selector: EntitySelector; body: Block; span?: Span }
|
|
232
240
|
| { kind: 'as_at'; as_sel: EntitySelector; at_sel: EntitySelector; body: Block; span?: Span }
|
|
@@ -240,7 +248,7 @@ export type Block = Stmt[]
|
|
|
240
248
|
// ---------------------------------------------------------------------------
|
|
241
249
|
|
|
242
250
|
export interface Decorator {
|
|
243
|
-
name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load'
|
|
251
|
+
name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule'
|
|
244
252
|
args?: {
|
|
245
253
|
rate?: number
|
|
246
254
|
eventType?: string
|
|
@@ -248,6 +256,9 @@ export interface Decorator {
|
|
|
248
256
|
advancement?: string
|
|
249
257
|
item?: string
|
|
250
258
|
team?: string
|
|
259
|
+
batch?: number
|
|
260
|
+
onDone?: string
|
|
261
|
+
ticks?: number
|
|
251
262
|
}
|
|
252
263
|
/** Raw positional arguments (used by @requires and future generic decorators). */
|
|
253
264
|
rawArgs?: Array<{ kind: 'string'; value: string } | { kind: 'number'; value: number }>
|
|
@@ -268,7 +279,11 @@ export interface FnDecl {
|
|
|
268
279
|
* Library functions are NOT MC entry points — DCE only keeps them if they
|
|
269
280
|
* are reachable from a non-library (user) entry point. */
|
|
270
281
|
isLibraryFn?: boolean
|
|
282
|
+
/** True when declared with `export fn` or `@keep fn` — survives DCE. */
|
|
283
|
+
isExported?: boolean
|
|
271
284
|
name: string
|
|
285
|
+
/** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
|
|
286
|
+
typeParams?: string[]
|
|
272
287
|
params: Param[]
|
|
273
288
|
returnType: TypeNode
|
|
274
289
|
decorators: Decorator[]
|
|
@@ -325,18 +340,34 @@ export interface GlobalDecl {
|
|
|
325
340
|
span?: Span
|
|
326
341
|
}
|
|
327
342
|
|
|
343
|
+
// ---------------------------------------------------------------------------
|
|
344
|
+
// Import Declarations (Phase 5b module system)
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
|
|
347
|
+
export interface ImportDecl {
|
|
348
|
+
/** The module being imported from, e.g. "math" in `import math::sin` */
|
|
349
|
+
moduleName: string
|
|
350
|
+
/** The symbol being imported, or '*' for wildcard */
|
|
351
|
+
symbol: string // '*' | identifier
|
|
352
|
+
span?: Span
|
|
353
|
+
}
|
|
354
|
+
|
|
328
355
|
// ---------------------------------------------------------------------------
|
|
329
356
|
// Program (Top-Level)
|
|
330
357
|
// ---------------------------------------------------------------------------
|
|
331
358
|
|
|
332
359
|
export interface Program {
|
|
333
360
|
namespace: string // Inferred from filename or `namespace mypack;`
|
|
361
|
+
/** Module name declared with `module <name>;` (undefined if no module decl) */
|
|
362
|
+
moduleName?: string
|
|
334
363
|
globals: GlobalDecl[]
|
|
335
364
|
declarations: FnDecl[]
|
|
336
365
|
structs: StructDecl[]
|
|
337
366
|
implBlocks: ImplBlock[]
|
|
338
367
|
enums: EnumDecl[]
|
|
339
368
|
consts: ConstDecl[]
|
|
369
|
+
/** Phase 5b: module imports (`import math::sin;`) */
|
|
370
|
+
imports: ImportDecl[]
|
|
340
371
|
/** True when the source file declares `module library;`.
|
|
341
372
|
* Library-mode: all functions are DCE-eligible by default — none are treated
|
|
342
373
|
* as MC entry points unless they carry @tick / @load / @on / @keep etc. */
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DependencyGraph — tracks import relationships between .mcrs files.
|
|
3
|
+
*
|
|
4
|
+
* Builds a forward dependency map (file → files it imports) and supports
|
|
5
|
+
* reverse lookups (file → files that depend on it) for change propagation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from 'fs'
|
|
9
|
+
import * as path from 'path'
|
|
10
|
+
|
|
11
|
+
const IMPORT_RE = /^\s*import\s+"([^"]+)"\s*;?\s*$/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Parse import statements from a source file's content.
|
|
15
|
+
* Returns absolute paths of imported files.
|
|
16
|
+
*/
|
|
17
|
+
export function parseImports(filePath: string, source?: string): string[] {
|
|
18
|
+
const absPath = path.resolve(filePath)
|
|
19
|
+
const content = source ?? fs.readFileSync(absPath, 'utf-8')
|
|
20
|
+
const dir = path.dirname(absPath)
|
|
21
|
+
const imports: string[] = []
|
|
22
|
+
|
|
23
|
+
for (const line of content.split('\n')) {
|
|
24
|
+
const trimmed = line.trim()
|
|
25
|
+
// Stop at first non-comment, non-blank, non-import line
|
|
26
|
+
if (!trimmed || trimmed.startsWith('//')) continue
|
|
27
|
+
const match = trimmed.match(IMPORT_RE)
|
|
28
|
+
if (match) {
|
|
29
|
+
imports.push(path.resolve(dir, match[1]))
|
|
30
|
+
} else {
|
|
31
|
+
// Past the import header
|
|
32
|
+
break
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return imports
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export class DependencyGraph {
|
|
40
|
+
/** Forward edges: file → set of files it imports */
|
|
41
|
+
private deps = new Map<string, Set<string>>()
|
|
42
|
+
|
|
43
|
+
/** Add a file and its direct imports to the graph. */
|
|
44
|
+
addFile(filePath: string, source?: string): void {
|
|
45
|
+
const absPath = path.resolve(filePath)
|
|
46
|
+
const imports = parseImports(absPath, source)
|
|
47
|
+
this.deps.set(absPath, new Set(imports))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Remove a file from the graph. */
|
|
51
|
+
removeFile(filePath: string): void {
|
|
52
|
+
this.deps.delete(path.resolve(filePath))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Get direct imports of a file. */
|
|
56
|
+
getDirectDeps(filePath: string): Set<string> {
|
|
57
|
+
return this.deps.get(path.resolve(filePath)) ?? new Set()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get transitive dependencies of a file (all files it depends on,
|
|
62
|
+
* directly or indirectly).
|
|
63
|
+
*/
|
|
64
|
+
getTransitiveDeps(filePath: string): Set<string> {
|
|
65
|
+
const absPath = path.resolve(filePath)
|
|
66
|
+
const result = new Set<string>()
|
|
67
|
+
const stack = [absPath]
|
|
68
|
+
|
|
69
|
+
while (stack.length > 0) {
|
|
70
|
+
const current = stack.pop()!
|
|
71
|
+
const directDeps = this.deps.get(current)
|
|
72
|
+
if (!directDeps) continue
|
|
73
|
+
for (const dep of directDeps) {
|
|
74
|
+
if (!result.has(dep)) {
|
|
75
|
+
result.add(dep)
|
|
76
|
+
stack.push(dep)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return result
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Get reverse dependents: all files that (transitively) depend on the
|
|
86
|
+
* given file. Used for change propagation — when `filePath` changes,
|
|
87
|
+
* all returned files need recompilation.
|
|
88
|
+
*/
|
|
89
|
+
getDependents(filePath: string): Set<string> {
|
|
90
|
+
const absPath = path.resolve(filePath)
|
|
91
|
+
const result = new Set<string>()
|
|
92
|
+
const stack = [absPath]
|
|
93
|
+
|
|
94
|
+
while (stack.length > 0) {
|
|
95
|
+
const current = stack.pop()!
|
|
96
|
+
for (const [file, deps] of this.deps) {
|
|
97
|
+
if (deps.has(current) && !result.has(file)) {
|
|
98
|
+
result.add(file)
|
|
99
|
+
stack.push(file)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return result
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Given a set of changed files, compute the full set of dirty files
|
|
109
|
+
* (changed files + all their reverse dependents).
|
|
110
|
+
*/
|
|
111
|
+
computeDirtySet(changedFiles: Set<string>): Set<string> {
|
|
112
|
+
const dirty = new Set<string>()
|
|
113
|
+
for (const file of changedFiles) {
|
|
114
|
+
const absFile = path.resolve(file)
|
|
115
|
+
dirty.add(absFile)
|
|
116
|
+
for (const dep of this.getDependents(absFile)) {
|
|
117
|
+
dirty.add(dep)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return dirty
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Get all tracked files. */
|
|
124
|
+
getAllFiles(): string[] {
|
|
125
|
+
return [...this.deps.keys()]
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Clear the graph. */
|
|
129
|
+
clear(): void {
|
|
130
|
+
this.deps.clear()
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental compilation — only recompile files whose content (or
|
|
3
|
+
* dependencies) has changed since the last build.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import * as path from 'path'
|
|
7
|
+
import { compile, type CompileOptions, type CompileResult } from '../emit/compile'
|
|
8
|
+
import * as fs from 'fs'
|
|
9
|
+
import { FileCache } from './index'
|
|
10
|
+
import { DependencyGraph } from './deps'
|
|
11
|
+
|
|
12
|
+
export interface IncrementalOptions {
|
|
13
|
+
namespace?: string
|
|
14
|
+
/** Output directory for compiled files. */
|
|
15
|
+
output: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface IncrementalResult {
|
|
19
|
+
/** Number of files that were recompiled. */
|
|
20
|
+
recompiled: number
|
|
21
|
+
/** Number of files that used the cache (skipped). */
|
|
22
|
+
cached: number
|
|
23
|
+
/** Files that had errors (path → error message). */
|
|
24
|
+
errors: Map<string, string>
|
|
25
|
+
/** Per-file compile results (only for recompiled files). */
|
|
26
|
+
results: Map<string, CompileResult>
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Cached compilation output per entry file. */
|
|
30
|
+
interface CompileCacheEntry {
|
|
31
|
+
result: CompileResult
|
|
32
|
+
/** Content hashes of entry file + all its transitive deps at compile time. */
|
|
33
|
+
depHashes: Map<string, string>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const compiledCache = new Map<string, CompileCacheEntry>()
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Compile a set of entry files incrementally.
|
|
40
|
+
*
|
|
41
|
+
* For each file:
|
|
42
|
+
* - Compute content hash of the file and all its transitive imports
|
|
43
|
+
* - If all hashes match the previous build → skip (cache hit)
|
|
44
|
+
* - If any hash changed → recompile from scratch
|
|
45
|
+
*/
|
|
46
|
+
export function compileIncremental(
|
|
47
|
+
files: string[],
|
|
48
|
+
cache: FileCache,
|
|
49
|
+
depGraph: DependencyGraph,
|
|
50
|
+
options: IncrementalOptions,
|
|
51
|
+
): IncrementalResult {
|
|
52
|
+
const result: IncrementalResult = {
|
|
53
|
+
recompiled: 0,
|
|
54
|
+
cached: 0,
|
|
55
|
+
errors: new Map(),
|
|
56
|
+
results: new Map(),
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Phase 1: Update dependency graph for all files
|
|
60
|
+
for (const file of files) {
|
|
61
|
+
const absFile = path.resolve(file)
|
|
62
|
+
try {
|
|
63
|
+
const source = fs.readFileSync(absFile, 'utf-8')
|
|
64
|
+
depGraph.addFile(absFile, source)
|
|
65
|
+
} catch {
|
|
66
|
+
// File might have been deleted
|
|
67
|
+
depGraph.removeFile(absFile)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Phase 2: Detect all changed source files BEFORE recompiling anything.
|
|
72
|
+
// This prevents cache.update() during one file's recompile from hiding
|
|
73
|
+
// changes needed by another file that shares the same dependency.
|
|
74
|
+
const changedSourceFiles = new Set<string>()
|
|
75
|
+
const allSourceFiles = new Set<string>()
|
|
76
|
+
|
|
77
|
+
for (const file of files) {
|
|
78
|
+
const absFile = path.resolve(file)
|
|
79
|
+
const allDeps = depGraph.getTransitiveDeps(absFile)
|
|
80
|
+
allSourceFiles.add(absFile)
|
|
81
|
+
for (const dep of allDeps) allSourceFiles.add(dep)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
for (const sourceFile of allSourceFiles) {
|
|
85
|
+
if (cache.hasChanged(sourceFile)) {
|
|
86
|
+
changedSourceFiles.add(sourceFile)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Phase 3: For each entry file, check if it or any dep changed → recompile
|
|
91
|
+
for (const file of files) {
|
|
92
|
+
const absFile = path.resolve(file)
|
|
93
|
+
|
|
94
|
+
// Collect all files in this compilation unit (entry + transitive deps)
|
|
95
|
+
const allDeps = depGraph.getTransitiveDeps(absFile)
|
|
96
|
+
const unitFiles = [absFile, ...allDeps]
|
|
97
|
+
|
|
98
|
+
// Check if any file in the unit has changed
|
|
99
|
+
let needsRecompile = false
|
|
100
|
+
const prevEntry = compiledCache.get(absFile)
|
|
101
|
+
|
|
102
|
+
if (!prevEntry) {
|
|
103
|
+
needsRecompile = true
|
|
104
|
+
} else {
|
|
105
|
+
for (const unitFile of unitFiles) {
|
|
106
|
+
if (changedSourceFiles.has(unitFile)) {
|
|
107
|
+
needsRecompile = true
|
|
108
|
+
break
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Also check if the set of dependencies changed
|
|
112
|
+
if (!needsRecompile && prevEntry.depHashes.size !== unitFiles.length) {
|
|
113
|
+
needsRecompile = true
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (!needsRecompile) {
|
|
118
|
+
// Cache hit — write cached result to output
|
|
119
|
+
const cached = compiledCache.get(absFile)!
|
|
120
|
+
writeBuildOutput(cached.result, options.output)
|
|
121
|
+
result.cached++
|
|
122
|
+
continue
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Cache miss — recompile
|
|
126
|
+
try {
|
|
127
|
+
const source = fs.readFileSync(absFile, 'utf-8')
|
|
128
|
+
const ns = options.namespace ?? deriveNamespace(absFile)
|
|
129
|
+
const compileResult = compile(source, { namespace: ns, filePath: absFile })
|
|
130
|
+
|
|
131
|
+
// Update caches
|
|
132
|
+
const depHashes = new Map<string, string>()
|
|
133
|
+
for (const unitFile of unitFiles) {
|
|
134
|
+
cache.update(unitFile)
|
|
135
|
+
const entry = cache.get(unitFile)
|
|
136
|
+
if (entry) depHashes.set(unitFile, entry.hash)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
compiledCache.set(absFile, { result: compileResult, depHashes })
|
|
140
|
+
writeBuildOutput(compileResult, options.output)
|
|
141
|
+
|
|
142
|
+
result.recompiled++
|
|
143
|
+
result.results.set(absFile, compileResult)
|
|
144
|
+
} catch (err) {
|
|
145
|
+
result.errors.set(absFile, (err as Error).message)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return result
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Write compile output files to the output directory. */
|
|
153
|
+
function writeBuildOutput(compileResult: CompileResult, output: string): void {
|
|
154
|
+
fs.mkdirSync(output, { recursive: true })
|
|
155
|
+
for (const dataFile of compileResult.files) {
|
|
156
|
+
const filePath = path.join(output, dataFile.path)
|
|
157
|
+
const dir = path.dirname(filePath)
|
|
158
|
+
fs.mkdirSync(dir, { recursive: true })
|
|
159
|
+
fs.writeFileSync(filePath, dataFile.content)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function deriveNamespace(filePath: string): string {
|
|
164
|
+
const basename = path.basename(filePath, path.extname(filePath))
|
|
165
|
+
return basename.toLowerCase().replace(/[^a-z0-9]/g, '_')
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Reset the in-memory compile cache. Useful for testing.
|
|
170
|
+
*/
|
|
171
|
+
export function resetCompileCache(): void {
|
|
172
|
+
compiledCache.clear()
|
|
173
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileCache — content-hash-based compilation cache for incremental builds.
|
|
3
|
+
*
|
|
4
|
+
* Stores per-file content hashes and optional cached HIR modules.
|
|
5
|
+
* Persists to `.redscript-cache/` as JSON.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from 'fs'
|
|
9
|
+
import * as path from 'path'
|
|
10
|
+
import * as crypto from 'crypto'
|
|
11
|
+
import type { HIRModule } from '../hir/types'
|
|
12
|
+
|
|
13
|
+
export interface CacheEntry {
|
|
14
|
+
hash: string
|
|
15
|
+
mtime: number
|
|
16
|
+
hir?: HIRModule
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface SerializedCache {
|
|
20
|
+
version: 1
|
|
21
|
+
entries: Record<string, { hash: string; mtime: number }>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class FileCache {
|
|
25
|
+
private entries = new Map<string, CacheEntry>()
|
|
26
|
+
private cacheDir: string
|
|
27
|
+
|
|
28
|
+
constructor(cacheDir: string) {
|
|
29
|
+
this.cacheDir = cacheDir
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Get cached entry for a file (by absolute path). */
|
|
33
|
+
get(filePath: string): CacheEntry | undefined {
|
|
34
|
+
return this.entries.get(path.resolve(filePath))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Set cache entry for a file. */
|
|
38
|
+
set(filePath: string, entry: CacheEntry): void {
|
|
39
|
+
this.entries.set(path.resolve(filePath), entry)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Check if a file's content has changed since last cache. */
|
|
43
|
+
hasChanged(filePath: string): boolean {
|
|
44
|
+
const absPath = path.resolve(filePath)
|
|
45
|
+
const cached = this.entries.get(absPath)
|
|
46
|
+
if (!cached) return true
|
|
47
|
+
|
|
48
|
+
// Quick mtime check first
|
|
49
|
+
try {
|
|
50
|
+
const stat = fs.statSync(absPath)
|
|
51
|
+
if (stat.mtimeMs === cached.mtime) return false
|
|
52
|
+
} catch {
|
|
53
|
+
return true
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// mtime changed — compare content hash
|
|
57
|
+
const currentHash = hashFile(absPath)
|
|
58
|
+
return currentHash !== cached.hash
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Update the cache entry for a file from disk. Returns true if content changed. */
|
|
62
|
+
update(filePath: string, hir?: HIRModule): boolean {
|
|
63
|
+
const absPath = path.resolve(filePath)
|
|
64
|
+
const changed = this.hasChanged(absPath)
|
|
65
|
+
|
|
66
|
+
if (changed) {
|
|
67
|
+
try {
|
|
68
|
+
const stat = fs.statSync(absPath)
|
|
69
|
+
this.entries.set(absPath, {
|
|
70
|
+
hash: hashFile(absPath),
|
|
71
|
+
mtime: stat.mtimeMs,
|
|
72
|
+
hir,
|
|
73
|
+
})
|
|
74
|
+
} catch {
|
|
75
|
+
this.entries.delete(absPath)
|
|
76
|
+
}
|
|
77
|
+
} else if (hir) {
|
|
78
|
+
// Update HIR even if hash didn't change
|
|
79
|
+
const entry = this.entries.get(absPath)
|
|
80
|
+
if (entry) entry.hir = hir
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return changed
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Remove a file from the cache. */
|
|
87
|
+
delete(filePath: string): void {
|
|
88
|
+
this.entries.delete(path.resolve(filePath))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Clear all cache entries. */
|
|
92
|
+
clear(): void {
|
|
93
|
+
this.entries.clear()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Number of cached entries. */
|
|
97
|
+
get size(): number {
|
|
98
|
+
return this.entries.size
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Persist cache to disk (`.redscript-cache/cache.json`). */
|
|
102
|
+
save(): void {
|
|
103
|
+
fs.mkdirSync(this.cacheDir, { recursive: true })
|
|
104
|
+
const serialized: SerializedCache = {
|
|
105
|
+
version: 1,
|
|
106
|
+
entries: {},
|
|
107
|
+
}
|
|
108
|
+
for (const [filePath, entry] of this.entries) {
|
|
109
|
+
// Don't persist HIR — it contains non-serializable references
|
|
110
|
+
serialized.entries[filePath] = { hash: entry.hash, mtime: entry.mtime }
|
|
111
|
+
}
|
|
112
|
+
const cachePath = path.join(this.cacheDir, 'cache.json')
|
|
113
|
+
fs.writeFileSync(cachePath, JSON.stringify(serialized, null, 2))
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Load cache from disk. */
|
|
117
|
+
load(): void {
|
|
118
|
+
const cachePath = path.join(this.cacheDir, 'cache.json')
|
|
119
|
+
try {
|
|
120
|
+
const data = JSON.parse(fs.readFileSync(cachePath, 'utf-8')) as SerializedCache
|
|
121
|
+
if (data.version !== 1) return
|
|
122
|
+
for (const [filePath, entry] of Object.entries(data.entries)) {
|
|
123
|
+
this.entries.set(filePath, { hash: entry.hash, mtime: entry.mtime })
|
|
124
|
+
}
|
|
125
|
+
} catch {
|
|
126
|
+
// No cache or corrupt — start fresh
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** SHA-256 hash of a file's content. */
|
|
132
|
+
export function hashFile(filePath: string): string {
|
|
133
|
+
const content = fs.readFileSync(filePath)
|
|
134
|
+
return crypto.createHash('sha256').update(content).digest('hex')
|
|
135
|
+
}
|