redscript-mc 1.2.30 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claudeignore +21 -0
- package/.github/workflows/ci.yml +1 -0
- package/README.md +12 -16
- package/README.zh.md +2 -2
- package/demo.gif +0 -0
- package/dist/cli.js +2 -554
- package/dist/compile.js +2 -266
- package/dist/index.js +2 -159
- package/dist/src/__tests__/budget.test.js +261 -0
- package/dist/src/__tests__/cli.test.js +104 -0
- package/dist/{__tests__ → src/__tests__}/dce.test.js +11 -47
- package/dist/{__tests__ → src/__tests__}/diagnostics.test.js +67 -40
- package/dist/src/__tests__/e2e/basic.test.d.ts +8 -0
- package/dist/src/__tests__/e2e/basic.test.js +140 -0
- package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
- package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
- package/dist/src/__tests__/e2e/macros.test.d.ts +9 -0
- package/dist/src/__tests__/e2e/macros.test.js +182 -0
- package/dist/src/__tests__/e2e/migrate.test.d.ts +13 -0
- package/dist/src/__tests__/e2e/migrate.test.js +2739 -0
- package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
- package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
- package/dist/src/__tests__/enum.test.d.ts +10 -0
- package/dist/src/__tests__/enum.test.js +389 -0
- package/dist/src/__tests__/generics.test.d.ts +14 -0
- package/dist/src/__tests__/generics.test.js +367 -0
- package/dist/src/__tests__/hir/desugar.test.js +234 -0
- package/dist/src/__tests__/incremental.test.d.ts +5 -0
- package/dist/src/__tests__/incremental.test.js +308 -0
- package/dist/src/__tests__/lir/lower.test.js +559 -0
- package/dist/src/__tests__/lir/types.test.js +185 -0
- package/dist/src/__tests__/lir/verify.test.js +221 -0
- package/dist/src/__tests__/lsp.test.d.ts +7 -0
- package/dist/src/__tests__/lsp.test.js +245 -0
- package/dist/{__tests__ → src/__tests__}/mc-integration.test.js +1 -3
- package/dist/src/__tests__/mc-version.test.d.ts +10 -0
- package/dist/src/__tests__/mc-version.test.js +154 -0
- package/dist/src/__tests__/mir/arithmetic.test.js +130 -0
- package/dist/src/__tests__/mir/control-flow.test.js +205 -0
- package/dist/src/__tests__/mir/verify.test.js +223 -0
- package/dist/src/__tests__/modules.test.d.ts +7 -0
- package/dist/src/__tests__/modules.test.js +333 -0
- package/dist/src/__tests__/optimizer/block_merge.test.js +78 -0
- package/dist/src/__tests__/optimizer/branch_simplify.test.js +58 -0
- package/dist/src/__tests__/optimizer/constant_fold.test.js +131 -0
- package/dist/src/__tests__/optimizer/copy_prop.test.js +91 -0
- package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
- package/dist/src/__tests__/optimizer/dce.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/dce.test.js +76 -0
- package/dist/src/__tests__/optimizer/interprocedural.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
- package/dist/src/__tests__/optimizer/lir/const_imm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
- package/dist/src/__tests__/optimizer/lir/dead_slot.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
- package/dist/src/__tests__/optimizer/lir/peephole.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
- package/dist/src/__tests__/optimizer/lir/pipeline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
- package/dist/src/__tests__/optimizer/nbt-batch.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
- package/dist/src/__tests__/optimizer/pipeline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/pipeline.test.js +102 -0
- package/dist/src/__tests__/optimizer/selector-cache.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
- package/dist/src/__tests__/optimizer/unroll.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
- package/dist/src/__tests__/option.test.d.ts +14 -0
- package/dist/src/__tests__/option.test.js +275 -0
- package/dist/src/__tests__/parser.test.d.ts +1 -0
- package/dist/src/__tests__/repl.test.d.ts +1 -0
- package/dist/src/__tests__/schedule.test.d.ts +7 -0
- package/dist/src/__tests__/schedule.test.js +98 -0
- package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
- package/dist/src/__tests__/sourcemap.test.js +227 -0
- package/dist/src/__tests__/tuple.test.d.ts +11 -0
- package/dist/src/__tests__/tuple.test.js +202 -0
- package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
- package/dist/src/__tests__/typechecker-strict.test.js +197 -0
- package/dist/src/__tests__/typechecker.test.d.ts +1 -0
- package/dist/{ast → src/ast}/types.d.ts +58 -3
- package/dist/src/cache/deps.d.ts +41 -0
- package/dist/src/cache/deps.js +158 -0
- package/dist/src/cache/incremental.d.ts +35 -0
- package/dist/src/cache/incremental.js +165 -0
- package/dist/src/cache/index.d.ts +37 -0
- package/dist/src/cache/index.js +152 -0
- package/dist/{cli.d.ts → src/cli.d.ts} +1 -1
- package/dist/src/cli.js +474 -0
- package/dist/src/compile.d.ts +37 -0
- package/dist/src/compile.js +165 -0
- package/dist/{diagnostics → src/diagnostics}/index.d.ts +1 -1
- package/dist/{diagnostics → src/diagnostics}/index.js +8 -11
- package/dist/src/emit/compile.d.ts +29 -0
- package/dist/src/emit/compile.js +143 -0
- package/dist/src/emit/index.d.ts +26 -0
- package/dist/src/emit/index.js +223 -0
- package/dist/src/emit/modules.d.ts +29 -0
- package/dist/src/emit/modules.js +492 -0
- package/dist/src/emit/sourcemap.d.ts +53 -0
- package/dist/src/emit/sourcemap.js +73 -0
- package/dist/src/hir/lower.d.ts +15 -0
- package/dist/src/hir/lower.js +399 -0
- package/dist/src/hir/monomorphize.d.ts +22 -0
- package/dist/src/hir/monomorphize.js +379 -0
- package/dist/src/hir/types.d.ts +406 -0
- package/dist/src/hir/types.js +16 -0
- package/dist/src/index.d.ts +39 -0
- package/dist/src/index.js +67 -0
- package/dist/{lexer → src/lexer}/index.d.ts +1 -1
- package/dist/{lexer → src/lexer}/index.js +1 -0
- package/dist/src/lir/budget.d.ts +37 -0
- package/dist/src/lir/budget.js +280 -0
- package/dist/src/lir/lower.d.ts +15 -0
- package/dist/src/lir/lower.js +472 -0
- package/dist/src/lir/types.d.ts +139 -0
- package/dist/src/lir/types.js +11 -0
- package/dist/src/lir/verify.d.ts +14 -0
- package/dist/src/lir/verify.js +113 -0
- package/dist/src/lsp/main.d.ts +8 -0
- package/dist/src/lsp/main.js +11 -0
- package/dist/src/lsp/server.d.ts +11 -0
- package/dist/src/lsp/server.js +352 -0
- package/dist/{mc-test → src/mc-test}/runner.js +4 -3
- package/dist/src/mir/lower.d.ts +9 -0
- package/dist/src/mir/lower.js +1264 -0
- package/dist/src/mir/macro.d.ts +22 -0
- package/dist/src/mir/macro.js +168 -0
- package/dist/src/mir/types.d.ts +191 -0
- package/dist/src/mir/types.js +11 -0
- package/dist/src/mir/verify.d.ts +16 -0
- package/dist/src/mir/verify.js +216 -0
- package/dist/src/optimizer/block_merge.d.ts +12 -0
- package/dist/src/optimizer/block_merge.js +84 -0
- package/dist/src/optimizer/branch_simplify.d.ts +9 -0
- package/dist/src/optimizer/branch_simplify.js +28 -0
- package/dist/src/optimizer/constant_fold.d.ts +10 -0
- package/dist/src/optimizer/constant_fold.js +85 -0
- package/dist/src/optimizer/copy_prop.d.ts +9 -0
- package/dist/src/optimizer/copy_prop.js +113 -0
- package/dist/src/optimizer/coroutine.d.ts +34 -0
- package/dist/src/optimizer/coroutine.js +789 -0
- package/dist/src/optimizer/dce.d.ts +8 -0
- package/dist/src/optimizer/dce.js +156 -0
- package/dist/src/optimizer/interprocedural.d.ts +14 -0
- package/dist/src/optimizer/interprocedural.js +186 -0
- package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
- package/dist/src/optimizer/lir/const_imm.js +139 -0
- package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
- package/dist/src/optimizer/lir/dead_slot.js +130 -0
- package/dist/src/optimizer/lir/peephole.d.ts +21 -0
- package/dist/src/optimizer/lir/peephole.js +52 -0
- package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
- package/dist/src/optimizer/lir/pipeline.js +34 -0
- package/dist/src/optimizer/nbt-batch.d.ts +11 -0
- package/dist/src/optimizer/nbt-batch.js +51 -0
- package/dist/src/optimizer/pipeline.d.ts +14 -0
- package/dist/src/optimizer/pipeline.js +58 -0
- package/dist/src/optimizer/selector-cache.d.ts +22 -0
- package/dist/src/optimizer/selector-cache.js +100 -0
- package/dist/src/optimizer/unroll.d.ts +32 -0
- package/dist/src/optimizer/unroll.js +348 -0
- package/dist/{parser → src/parser}/index.d.ts +8 -0
- package/dist/{parser → src/parser}/index.js +204 -14
- package/dist/{repl.d.ts → src/repl.d.ts} +1 -1
- package/dist/{runtime → src/runtime}/index.js +1 -1
- package/dist/{typechecker → src/typechecker}/index.d.ts +4 -0
- package/dist/{typechecker → src/typechecker}/index.js +198 -13
- package/dist/src/types/mc-version.d.ts +24 -0
- package/dist/src/types/mc-version.js +49 -0
- package/docs/ROADMAP.md +395 -0
- package/docs/compiler-pipeline-redesign.md +2260 -0
- package/docs/optimization-ideas.md +1076 -0
- package/editors/vscode/out/extension.js +25176 -8000
- package/editors/vscode/package-lock.json +90 -6
- package/editors/vscode/package.json +3 -2
- package/editors/vscode/src/extension.ts +97 -67
- package/examples/showcase.mcrs +3 -3
- package/package.json +13 -6
- package/scripts/postbuild.js +15 -0
- package/src/__tests__/budget.test.ts +297 -0
- package/src/__tests__/cli.test.ts +8 -220
- package/src/__tests__/dce.test.ts +11 -56
- package/src/__tests__/diagnostics.test.ts +61 -41
- package/src/__tests__/e2e/basic.test.ts +154 -0
- package/src/__tests__/e2e/coroutine.test.ts +142 -0
- package/src/__tests__/e2e/macros.test.ts +199 -0
- package/src/__tests__/e2e/migrate.test.ts +3008 -0
- package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
- package/src/__tests__/enum.test.ts +425 -0
- package/src/__tests__/generics.test.ts +390 -0
- package/src/__tests__/hir/desugar.test.ts +263 -0
- package/src/__tests__/incremental.test.ts +337 -0
- package/src/__tests__/lir/lower.test.ts +619 -0
- package/src/__tests__/lir/types.test.ts +207 -0
- package/src/__tests__/lir/verify.test.ts +249 -0
- package/src/__tests__/lsp.test.ts +270 -0
- package/src/__tests__/mc-integration.test.ts +1 -2
- package/src/__tests__/mc-version.test.ts +178 -0
- package/src/__tests__/mir/arithmetic.test.ts +156 -0
- package/src/__tests__/mir/control-flow.test.ts +242 -0
- package/src/__tests__/mir/verify.test.ts +254 -0
- package/src/__tests__/modules.test.ts +365 -0
- package/src/__tests__/optimizer/block_merge.test.ts +84 -0
- package/src/__tests__/optimizer/branch_simplify.test.ts +64 -0
- package/src/__tests__/optimizer/constant_fold.test.ts +145 -0
- package/src/__tests__/optimizer/copy_prop.test.ts +99 -0
- package/src/__tests__/optimizer/coroutine.test.ts +312 -0
- package/src/__tests__/optimizer/dce.test.ts +83 -0
- package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
- package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
- package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
- package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
- package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
- package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
- package/src/__tests__/optimizer/pipeline.test.ts +116 -0
- package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
- package/src/__tests__/optimizer/unroll.test.ts +231 -0
- package/src/__tests__/option.test.ts +299 -0
- package/src/__tests__/schedule.test.ts +105 -0
- package/src/__tests__/sourcemap.test.ts +254 -0
- package/src/__tests__/tuple.test.ts +220 -0
- package/src/__tests__/typechecker-strict.test.ts +216 -0
- package/src/ast/types.ts +39 -3
- package/src/cache/deps.ts +132 -0
- package/src/cache/incremental.ts +173 -0
- package/src/cache/index.ts +135 -0
- package/src/cli.ts +111 -195
- package/src/compile.ts +6 -162
- package/src/diagnostics/index.ts +8 -11
- package/src/emit/compile.ts +177 -0
- package/src/emit/index.ts +286 -0
- package/src/emit/modules.ts +581 -0
- package/src/emit/sourcemap.ts +101 -0
- package/src/hir/lower.ts +455 -0
- package/src/hir/monomorphize.ts +416 -0
- package/src/hir/types.ts +228 -0
- package/src/index.ts +37 -182
- package/src/lexer/index.ts +2 -1
- package/src/lir/budget.ts +321 -0
- package/src/lir/lower.ts +587 -0
- package/src/lir/types.ts +113 -0
- package/src/lir/verify.ts +129 -0
- package/src/lsp/main.ts +9 -0
- package/src/lsp/server.ts +414 -0
- package/src/mc-test/runner.ts +4 -3
- package/src/mir/lower.ts +1403 -0
- package/src/mir/macro.ts +167 -0
- package/src/mir/types.ts +117 -0
- package/src/mir/verify.ts +218 -0
- package/src/optimizer/block_merge.ts +93 -0
- package/src/optimizer/branch_simplify.ts +27 -0
- package/src/optimizer/constant_fold.ts +88 -0
- package/src/optimizer/copy_prop.ts +106 -0
- package/src/optimizer/coroutine.ts +996 -0
- package/src/optimizer/dce.ts +108 -653
- package/src/optimizer/interprocedural.ts +177 -0
- package/src/optimizer/lir/const_imm.ts +143 -0
- package/src/optimizer/lir/dead_slot.ts +123 -0
- package/src/optimizer/lir/peephole.ts +57 -0
- package/src/optimizer/lir/pipeline.ts +37 -0
- package/src/optimizer/nbt-batch.ts +50 -0
- package/src/optimizer/pipeline.ts +59 -0
- package/src/optimizer/selector-cache.ts +103 -0
- package/src/optimizer/unroll.ts +386 -0
- package/src/parser/index.ts +213 -16
- package/src/repl.ts +1 -1
- package/src/runtime/index.ts +1 -1
- package/src/stdlib/math.mcrs +4 -4
- package/src/templates/quest.mcrs +4 -4
- package/src/typechecker/index.ts +215 -15
- package/src/types/mc-version.ts +46 -0
- package/tsconfig.json +1 -1
- package/dist/__tests__/cli.test.js +0 -278
- package/dist/__tests__/codegen.test.js +0 -152
- package/dist/__tests__/e2e.test.d.ts +0 -6
- package/dist/__tests__/e2e.test.js +0 -1847
- package/dist/__tests__/entity-types.test.js +0 -203
- package/dist/__tests__/lowering.test.js +0 -1015
- package/dist/__tests__/macro.test.d.ts +0 -8
- package/dist/__tests__/macro.test.js +0 -305
- package/dist/__tests__/nbt.test.js +0 -82
- package/dist/__tests__/optimizer-advanced.test.js +0 -124
- package/dist/__tests__/optimizer.test.js +0 -149
- package/dist/__tests__/runtime.test.js +0 -289
- package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
- package/dist/__tests__/stdlib-advanced.test.js +0 -378
- package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
- package/dist/__tests__/stdlib-bigint.test.js +0 -428
- package/dist/__tests__/stdlib-math.test.d.ts +0 -7
- package/dist/__tests__/stdlib-math.test.js +0 -352
- package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
- package/dist/__tests__/stdlib-vec.test.js +0 -264
- package/dist/__tests__/structure-optimizer.test.js +0 -33
- package/dist/__tests__/var-allocator.test.js +0 -69
- package/dist/codegen/cmdblock/index.d.ts +0 -26
- package/dist/codegen/cmdblock/index.js +0 -45
- package/dist/codegen/mcfunction/index.d.ts +0 -40
- package/dist/codegen/mcfunction/index.js +0 -606
- package/dist/codegen/structure/index.d.ts +0 -24
- package/dist/codegen/structure/index.js +0 -279
- package/dist/codegen/var-allocator.d.ts +0 -45
- package/dist/codegen/var-allocator.js +0 -104
- package/dist/compile.d.ts +0 -68
- package/dist/data/arena/function/__load.mcfunction +0 -6
- package/dist/data/arena/function/__tick.mcfunction +0 -2
- package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
- package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
- package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
- package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
- package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
- package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
- package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
- package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
- package/dist/data/arena/function/arena_tick.mcfunction +0 -11
- package/dist/data/counter/function/__load.mcfunction +0 -5
- package/dist/data/counter/function/__tick.mcfunction +0 -2
- package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
- package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
- package/dist/data/counter/function/counter_tick.mcfunction +0 -11
- package/dist/data/gcd2/function/__load.mcfunction +0 -3
- package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd2/function/abs.mcfunction +0 -7
- package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd2/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3/function/__load.mcfunction +0 -3
- package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd3/function/abs.mcfunction +0 -7
- package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd3/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3/function/test.mcfunction +0 -7
- package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
- package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
- package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3nm/function/test.mcfunction +0 -7
- package/dist/data/gcd_test/function/__load.mcfunction +0 -3
- package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd_test/function/abs.mcfunction +0 -7
- package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
- package/dist/data/isqrttest/function/__load.mcfunction +0 -6
- package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
- package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
- package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
- package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
- package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
- package/dist/data/isqrttest/function/test.mcfunction +0 -6
- package/dist/data/mathtest/function/__load.mcfunction +0 -3
- package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
- package/dist/data/mathtest/function/abs.mcfunction +0 -6
- package/dist/data/mathtest/function/test.mcfunction +0 -5
- package/dist/data/minecraft/tags/function/load.json +0 -5
- package/dist/data/minecraft/tags/function/tick.json +0 -5
- package/dist/data/mypack/function/__load.mcfunction +0 -13
- package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
- package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
- package/dist/data/mypack/function/abs.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
- package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
- package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
- package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
- package/dist/data/mypack/function/my_game.mcfunction +0 -10
- package/dist/data/quiz/function/__load.mcfunction +0 -16
- package/dist/data/quiz/function/__tick.mcfunction +0 -6
- package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/answer_a.mcfunction +0 -4
- package/dist/data/quiz/function/answer_b.mcfunction +0 -4
- package/dist/data/quiz/function/answer_c.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
- package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
- package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
- package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
- package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
- package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question.mcfunction +0 -7
- package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
- package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
- package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
- package/dist/data/reqtest/function/__load.mcfunction +0 -4
- package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
- package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
- package/dist/data/reqtest/function/use_table.mcfunction +0 -4
- package/dist/data/reqtest2/function/__load.mcfunction +0 -3
- package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
- package/dist/data/runtime/function/__load.mcfunction +0 -5
- package/dist/data/runtime/function/__tick.mcfunction +0 -2
- package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
- package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
- package/dist/data/shop/function/__load.mcfunction +0 -7
- package/dist/data/shop/function/__tick.mcfunction +0 -3
- package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
- package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
- package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
- package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
- package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
- package/dist/data/swap_test/function/__load.mcfunction +0 -3
- package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
- package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
- package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
- package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
- package/dist/data/turret/function/__load.mcfunction +0 -5
- package/dist/data/turret/function/__tick.mcfunction +0 -4
- package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
- package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
- package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
- package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
- package/dist/data/turret/function/turret_tick.mcfunction +0 -5
- package/dist/gcd2.map.json +0 -15
- package/dist/gcd3.map.json +0 -17
- package/dist/gcd_test.map.json +0 -15
- package/dist/index.d.ts +0 -62
- package/dist/ir/builder.d.ts +0 -33
- package/dist/ir/builder.js +0 -99
- package/dist/ir/types.d.ts +0 -132
- package/dist/ir/types.js +0 -15
- package/dist/isqrttest.map.json +0 -15
- package/dist/lowering/index.d.ts +0 -188
- package/dist/lowering/index.js +0 -3403
- package/dist/mathtest.map.json +0 -6
- package/dist/mypack.map.json +0 -27
- package/dist/optimizer/commands.d.ts +0 -38
- package/dist/optimizer/commands.js +0 -451
- package/dist/optimizer/dce.d.ts +0 -34
- package/dist/optimizer/dce.js +0 -639
- package/dist/optimizer/passes.d.ts +0 -34
- package/dist/optimizer/passes.js +0 -243
- package/dist/optimizer/structure.d.ts +0 -9
- package/dist/optimizer/structure.js +0 -356
- package/dist/pack.mcmeta +0 -6
- package/dist/reqtest.map.json +0 -4
- package/dist/reqtest2.map.json +0 -4
- package/dist/runtime.map.json +0 -7
- package/dist/swap_test.map.json +0 -14
- package/src/__tests__/codegen.test.ts +0 -161
- package/src/__tests__/e2e.test.ts +0 -2039
- package/src/__tests__/entity-types.test.ts +0 -236
- package/src/__tests__/lowering.test.ts +0 -1185
- package/src/__tests__/macro.test.ts +0 -343
- package/src/__tests__/nbt.test.ts +0 -58
- package/src/__tests__/optimizer-advanced.test.ts +0 -144
- package/src/__tests__/optimizer.test.ts +0 -162
- package/src/__tests__/runtime.test.ts +0 -305
- package/src/__tests__/stdlib-advanced.test.ts +0 -379
- package/src/__tests__/stdlib-bigint.test.ts +0 -427
- package/src/__tests__/stdlib-math.test.ts +0 -374
- package/src/__tests__/stdlib-vec.test.ts +0 -259
- package/src/__tests__/structure-optimizer.test.ts +0 -38
- package/src/__tests__/var-allocator.test.ts +0 -75
- package/src/codegen/cmdblock/index.ts +0 -63
- package/src/codegen/mcfunction/index.ts +0 -662
- package/src/codegen/structure/index.ts +0 -346
- package/src/codegen/var-allocator.ts +0 -104
- package/src/ir/builder.ts +0 -116
- package/src/ir/types.ts +0 -134
- package/src/lowering/index.ts +0 -3876
- package/src/optimizer/commands.ts +0 -534
- package/src/optimizer/passes.ts +0 -250
- package/src/optimizer/structure.ts +0 -450
- /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
- /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/cli.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/compile-all.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/compile-all.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/dce.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/diagnostics.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/formatter.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/formatter.test.js +0 -0
- /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/hir/desugar.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/lexer.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/lexer.test.js +0 -0
- /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/lir/lower.test.d.ts} +0 -0
- /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/lir/types.test.d.ts} +0 -0
- /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/lir/verify.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/mc-integration.test.d.ts +0 -0
- /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/mc-syntax.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/mc-syntax.test.js +0 -0
- /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/mir/arithmetic.test.d.ts} +0 -0
- /package/dist/{__tests__/parser.test.d.ts → src/__tests__/mir/control-flow.test.d.ts} +0 -0
- /package/dist/{__tests__/repl.test.d.ts → src/__tests__/mir/verify.test.d.ts} +0 -0
- /package/dist/{__tests__/runtime.test.d.ts → src/__tests__/optimizer/block_merge.test.d.ts} +0 -0
- /package/dist/{__tests__/structure-optimizer.test.d.ts → src/__tests__/optimizer/branch_simplify.test.d.ts} +0 -0
- /package/dist/{__tests__/typechecker.test.d.ts → src/__tests__/optimizer/constant_fold.test.d.ts} +0 -0
- /package/dist/{__tests__/var-allocator.test.d.ts → src/__tests__/optimizer/copy_prop.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/parser.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/repl.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/typechecker.test.js +0 -0
- /package/dist/{ast → src/ast}/types.js +0 -0
- /package/dist/{builtins → src/builtins}/metadata.d.ts +0 -0
- /package/dist/{builtins → src/builtins}/metadata.js +0 -0
- /package/dist/{events → src/events}/types.d.ts +0 -0
- /package/dist/{events → src/events}/types.js +0 -0
- /package/dist/{formatter → src/formatter}/index.d.ts +0 -0
- /package/dist/{formatter → src/formatter}/index.js +0 -0
- /package/dist/{mc-test → src/mc-test}/client.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/client.js +0 -0
- /package/dist/{mc-test → src/mc-test}/runner.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/setup.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/setup.js +0 -0
- /package/dist/{mc-validator → src/mc-validator}/index.d.ts +0 -0
- /package/dist/{mc-validator → src/mc-validator}/index.js +0 -0
- /package/dist/{nbt → src/nbt}/index.d.ts +0 -0
- /package/dist/{nbt → src/nbt}/index.js +0 -0
- /package/dist/{repl.js → src/repl.js} +0 -0
- /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
- /package/dist/{types → src/types}/entity-hierarchy.d.ts +0 -0
- /package/dist/{types → src/types}/entity-hierarchy.js +0 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for Phase 2b: Multi-return values / Tuple types
|
|
4
|
+
*
|
|
5
|
+
* Covers:
|
|
6
|
+
* - Tuple type parsing: (int, int)
|
|
7
|
+
* - Tuple literal parsing: (a, b)
|
|
8
|
+
* - Destructuring let: let (q, r) = ...
|
|
9
|
+
* - Function return type: fn f(): (int, int)
|
|
10
|
+
* - Full compilation to scoreboard commands
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
const lexer_1 = require("../lexer");
|
|
14
|
+
const parser_1 = require("../parser");
|
|
15
|
+
const compile_1 = require("../emit/compile");
|
|
16
|
+
function parse(source, namespace = 'test') {
|
|
17
|
+
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
18
|
+
return new parser_1.Parser(tokens).parse(namespace);
|
|
19
|
+
}
|
|
20
|
+
function parseStmt(source) {
|
|
21
|
+
const program = parse(`fn _test() { ${source} }`);
|
|
22
|
+
return program.declarations[0].body[0];
|
|
23
|
+
}
|
|
24
|
+
function getFile(files, pathSubstr) {
|
|
25
|
+
const f = files.find(f => f.path.includes(pathSubstr));
|
|
26
|
+
return f?.content;
|
|
27
|
+
}
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Parser tests
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
describe('Tuple: Parser', () => {
|
|
32
|
+
it('parses tuple type (int, int) as return type', () => {
|
|
33
|
+
const program = parse('fn f(a: int, b: int): (int, int) {}');
|
|
34
|
+
const fn = program.declarations[0];
|
|
35
|
+
expect(fn.returnType).toEqual({ kind: 'tuple', elements: [
|
|
36
|
+
{ kind: 'named', name: 'int' },
|
|
37
|
+
{ kind: 'named', name: 'int' },
|
|
38
|
+
] });
|
|
39
|
+
});
|
|
40
|
+
it('parses tuple type with 3 elements', () => {
|
|
41
|
+
const program = parse('fn f(): (int, bool, int) {}');
|
|
42
|
+
expect(program.declarations[0].returnType).toEqual({ kind: 'tuple', elements: [
|
|
43
|
+
{ kind: 'named', name: 'int' },
|
|
44
|
+
{ kind: 'named', name: 'bool' },
|
|
45
|
+
{ kind: 'named', name: 'int' },
|
|
46
|
+
] });
|
|
47
|
+
});
|
|
48
|
+
it('parses tuple literal expression (a, b)', () => {
|
|
49
|
+
const program = parse(`fn _test(a: int, b: int): (int, int) { return (a, b); }`);
|
|
50
|
+
const ret = program.declarations[0].body[0];
|
|
51
|
+
expect(ret.kind).toBe('return');
|
|
52
|
+
if (ret.kind === 'return' && ret.value) {
|
|
53
|
+
expect(ret.value.kind).toBe('tuple_lit');
|
|
54
|
+
if (ret.value.kind === 'tuple_lit') {
|
|
55
|
+
expect(ret.value.elements).toHaveLength(2);
|
|
56
|
+
expect(ret.value.elements[0]).toMatchObject({ kind: 'ident', name: 'a' });
|
|
57
|
+
expect(ret.value.elements[1]).toMatchObject({ kind: 'ident', name: 'b' });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it('parses destructuring let statement', () => {
|
|
62
|
+
const stmt = parseStmt('let (q, r) = divmod(10, 3);');
|
|
63
|
+
expect(stmt.kind).toBe('let_destruct');
|
|
64
|
+
if (stmt.kind === 'let_destruct') {
|
|
65
|
+
expect(stmt.names).toEqual(['q', 'r']);
|
|
66
|
+
expect(stmt.init).toMatchObject({ kind: 'call', fn: 'divmod' });
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
it('parses destructuring with 3 bindings', () => {
|
|
70
|
+
const stmt = parseStmt('let (a, b, c) = get_triple(1);');
|
|
71
|
+
expect(stmt.kind).toBe('let_destruct');
|
|
72
|
+
if (stmt.kind === 'let_destruct') {
|
|
73
|
+
expect(stmt.names).toEqual(['a', 'b', 'c']);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
it('does not confuse (expr) grouped expression with tuple literal', () => {
|
|
77
|
+
const program = parse(`fn _test(): int { return (1 + 2); }`);
|
|
78
|
+
const ret = program.declarations[0].body[0];
|
|
79
|
+
expect(ret.kind).toBe('return');
|
|
80
|
+
if (ret.kind === 'return' && ret.value) {
|
|
81
|
+
expect(ret.value.kind).toBe('binary');
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
it('still parses function type (int) -> int correctly', () => {
|
|
85
|
+
const program = parse('fn apply(f: (int) -> int, x: int): int {}');
|
|
86
|
+
const param = program.declarations[0].params[0];
|
|
87
|
+
expect(param.type).toEqual({ kind: 'function_type', params: [{ kind: 'named', name: 'int' }], return: { kind: 'named', name: 'int' } });
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// E2E compilation tests
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
describe('Tuple: E2E compilation', () => {
|
|
94
|
+
test('basic divmod function compiles and writes $ret_0 and $ret_1', () => {
|
|
95
|
+
const source = `
|
|
96
|
+
fn divmod(a: int, b: int): (int, int) {
|
|
97
|
+
return (a / b, a % b);
|
|
98
|
+
}
|
|
99
|
+
`;
|
|
100
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
101
|
+
const fn = getFile(result.files, 'divmod.mcfunction');
|
|
102
|
+
expect(fn).toBeDefined();
|
|
103
|
+
// MIR __rf_0 → LIR $ret_0 (see lir/lower.ts slot() method)
|
|
104
|
+
expect(fn).toContain('$ret_0');
|
|
105
|
+
expect(fn).toContain('$ret_1');
|
|
106
|
+
});
|
|
107
|
+
test('destructuring let reads from $ret_ slots after call', () => {
|
|
108
|
+
const source = `
|
|
109
|
+
fn divmod(a: int, b: int): (int, int) {
|
|
110
|
+
return (a / b, a % b);
|
|
111
|
+
}
|
|
112
|
+
fn use_divmod(): int {
|
|
113
|
+
let (q, r) = divmod(10, 3);
|
|
114
|
+
return q + r;
|
|
115
|
+
}
|
|
116
|
+
`;
|
|
117
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
118
|
+
const fn = getFile(result.files, 'use_divmod.mcfunction');
|
|
119
|
+
expect(fn).toBeDefined();
|
|
120
|
+
// Should call divmod and then read from $ret_ slots
|
|
121
|
+
expect(fn).toContain('divmod');
|
|
122
|
+
expect(fn).toContain('$ret_0');
|
|
123
|
+
expect(fn).toContain('$ret_1');
|
|
124
|
+
});
|
|
125
|
+
test('tuple literal assigned directly via destructuring', () => {
|
|
126
|
+
const source = `
|
|
127
|
+
fn make_sum(a: int, b: int): int {
|
|
128
|
+
let (x, y) = (a + 1, b + 2);
|
|
129
|
+
return x + y;
|
|
130
|
+
}
|
|
131
|
+
`;
|
|
132
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
133
|
+
const fn = getFile(result.files, 'make_sum.mcfunction');
|
|
134
|
+
expect(fn).toBeDefined();
|
|
135
|
+
expect(fn).toContain('scoreboard players operation');
|
|
136
|
+
});
|
|
137
|
+
test('tuple values used in subsequent computation', () => {
|
|
138
|
+
const source = `
|
|
139
|
+
fn divmod(a: int, b: int): (int, int) {
|
|
140
|
+
return (a / b, a % b);
|
|
141
|
+
}
|
|
142
|
+
fn compute(): int {
|
|
143
|
+
let (q, r) = divmod(10, 3);
|
|
144
|
+
return q + r;
|
|
145
|
+
}
|
|
146
|
+
`;
|
|
147
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
148
|
+
const fn = getFile(result.files, 'compute.mcfunction');
|
|
149
|
+
expect(fn).toBeDefined();
|
|
150
|
+
expect(fn).toContain('scoreboard players operation');
|
|
151
|
+
});
|
|
152
|
+
test('3-tuple return and destructuring', () => {
|
|
153
|
+
const source = `
|
|
154
|
+
fn triple(a: int): (int, int, int) {
|
|
155
|
+
return (a, a + 1, a + 2);
|
|
156
|
+
}
|
|
157
|
+
fn use_triple(): int {
|
|
158
|
+
let (x, y, z) = triple(5);
|
|
159
|
+
return x + y + z;
|
|
160
|
+
}
|
|
161
|
+
`;
|
|
162
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
163
|
+
const tripleFn = getFile(result.files, 'triple.mcfunction');
|
|
164
|
+
expect(tripleFn).toBeDefined();
|
|
165
|
+
expect(tripleFn).toContain('$ret_0');
|
|
166
|
+
expect(tripleFn).toContain('$ret_1');
|
|
167
|
+
expect(tripleFn).toContain('$ret_2');
|
|
168
|
+
});
|
|
169
|
+
test('enum and tuple combined: return (int, Phase)', () => {
|
|
170
|
+
const source = `
|
|
171
|
+
enum Phase { Idle, Running, Done }
|
|
172
|
+
fn get_state(): (int, int) {
|
|
173
|
+
return (42, Phase::Running);
|
|
174
|
+
}
|
|
175
|
+
fn use_state(): int {
|
|
176
|
+
let (count, phase) = get_state();
|
|
177
|
+
return count + phase;
|
|
178
|
+
}
|
|
179
|
+
`;
|
|
180
|
+
const result = (0, compile_1.compile)(source, { namespace: 'test' });
|
|
181
|
+
const fn = getFile(result.files, 'get_state.mcfunction');
|
|
182
|
+
expect(fn).toBeDefined();
|
|
183
|
+
expect(fn).toContain('$ret_0');
|
|
184
|
+
expect(fn).toContain('$ret_1');
|
|
185
|
+
// Phase::Running = 1
|
|
186
|
+
expect(fn).toContain('1');
|
|
187
|
+
});
|
|
188
|
+
test('tuple return type appears in generated mcfunction with correct objective', () => {
|
|
189
|
+
const source = `
|
|
190
|
+
fn minmax(a: int, b: int): (int, int) {
|
|
191
|
+
return (a, b);
|
|
192
|
+
}
|
|
193
|
+
`;
|
|
194
|
+
const result = (0, compile_1.compile)(source, { namespace: 'ns' });
|
|
195
|
+
const fn = getFile(result.files, 'minmax.mcfunction');
|
|
196
|
+
expect(fn).toBeDefined();
|
|
197
|
+
// MIR __rf_0 → LIR $ret_0
|
|
198
|
+
expect(fn).toContain('$ret_0');
|
|
199
|
+
expect(fn).toContain('__ns');
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
//# sourceMappingURL=tuple.test.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 6b: TypeChecker strict (error-mode) tests
|
|
3
|
+
*
|
|
4
|
+
* Covers:
|
|
5
|
+
* - Type errors now block compilation (error-mode default)
|
|
6
|
+
* - --lenient flag demotes type errors to warnings
|
|
7
|
+
* - int/float implicit conversion detection
|
|
8
|
+
* - redscript check command correctly reports type errors
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase 6b: TypeChecker strict (error-mode) tests
|
|
4
|
+
*
|
|
5
|
+
* Covers:
|
|
6
|
+
* - Type errors now block compilation (error-mode default)
|
|
7
|
+
* - --lenient flag demotes type errors to warnings
|
|
8
|
+
* - int/float implicit conversion detection
|
|
9
|
+
* - redscript check command correctly reports type errors
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const compile_1 = require("../emit/compile");
|
|
13
|
+
const lexer_1 = require("../lexer");
|
|
14
|
+
const parser_1 = require("../parser");
|
|
15
|
+
const typechecker_1 = require("../typechecker");
|
|
16
|
+
// Helper: run TypeChecker directly
|
|
17
|
+
function typeCheck(source) {
|
|
18
|
+
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
19
|
+
const ast = new parser_1.Parser(tokens).parse('test');
|
|
20
|
+
const checker = new typechecker_1.TypeChecker(source);
|
|
21
|
+
return checker.check(ast);
|
|
22
|
+
}
|
|
23
|
+
// Helper: compile in strict mode (default)
|
|
24
|
+
function compileStrict(source) {
|
|
25
|
+
(0, compile_1.compile)(source, { namespace: 'test' });
|
|
26
|
+
}
|
|
27
|
+
// Helper: compile in lenient mode
|
|
28
|
+
function compileLenient(source) {
|
|
29
|
+
return (0, compile_1.compile)(source, { namespace: 'test', lenient: true });
|
|
30
|
+
}
|
|
31
|
+
describe('TypeChecker error-mode (Phase 6b)', () => {
|
|
32
|
+
describe('type errors block compilation', () => {
|
|
33
|
+
it('throws on undeclared variable usage', () => {
|
|
34
|
+
expect(() => compileStrict(`
|
|
35
|
+
fn test() {
|
|
36
|
+
let x: int = undeclared;
|
|
37
|
+
}
|
|
38
|
+
`)).toThrow();
|
|
39
|
+
});
|
|
40
|
+
it('throws on return type mismatch', () => {
|
|
41
|
+
expect(() => compileStrict(`
|
|
42
|
+
fn get_bool() -> bool {
|
|
43
|
+
return 5;
|
|
44
|
+
}
|
|
45
|
+
`)).toThrow();
|
|
46
|
+
});
|
|
47
|
+
it('throws on wrong argument count', () => {
|
|
48
|
+
expect(() => compileStrict(`
|
|
49
|
+
fn add(a: int, b: int) -> int {
|
|
50
|
+
return a + b;
|
|
51
|
+
}
|
|
52
|
+
fn test() {
|
|
53
|
+
let x: int = add(1);
|
|
54
|
+
}
|
|
55
|
+
`)).toThrow();
|
|
56
|
+
});
|
|
57
|
+
it('does not throw for valid programs', () => {
|
|
58
|
+
expect(() => compileStrict(`
|
|
59
|
+
fn add(a: int, b: int) -> int {
|
|
60
|
+
return a + b;
|
|
61
|
+
}
|
|
62
|
+
fn test() {
|
|
63
|
+
let x: int = add(1, 2);
|
|
64
|
+
}
|
|
65
|
+
`)).not.toThrow();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('--lenient mode', () => {
|
|
69
|
+
it('does not throw on type errors in lenient mode', () => {
|
|
70
|
+
expect(() => compileLenient(`
|
|
71
|
+
fn test() {
|
|
72
|
+
let x: int = undeclared;
|
|
73
|
+
}
|
|
74
|
+
`)).not.toThrow();
|
|
75
|
+
});
|
|
76
|
+
it('returns type errors as warnings in lenient mode', () => {
|
|
77
|
+
const result = compileLenient(`
|
|
78
|
+
fn test() {
|
|
79
|
+
let x: int = undeclared;
|
|
80
|
+
}
|
|
81
|
+
`);
|
|
82
|
+
expect(result.warnings.length).toBeGreaterThan(0);
|
|
83
|
+
expect(result.warnings[0]).toContain('TypeError');
|
|
84
|
+
});
|
|
85
|
+
it('emits no warnings for valid programs in lenient mode', () => {
|
|
86
|
+
const result = compileLenient(`
|
|
87
|
+
fn test() {
|
|
88
|
+
let x: int = 5;
|
|
89
|
+
}
|
|
90
|
+
`);
|
|
91
|
+
expect(result.warnings).toHaveLength(0);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('int/float implicit conversion checks', () => {
|
|
95
|
+
it('detects int assigned to float variable', () => {
|
|
96
|
+
// int literal assigned to float — different types
|
|
97
|
+
const errors = typeCheck(`
|
|
98
|
+
fn test() {
|
|
99
|
+
let x: float = 5;
|
|
100
|
+
}
|
|
101
|
+
`);
|
|
102
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
103
|
+
expect(errors[0].message).toContain('cannot implicitly convert int to float');
|
|
104
|
+
expect(errors[0].message).toContain('as float');
|
|
105
|
+
});
|
|
106
|
+
it('detects float assigned to int variable', () => {
|
|
107
|
+
const errors = typeCheck(`
|
|
108
|
+
fn get_f() -> float {
|
|
109
|
+
return 3.14;
|
|
110
|
+
}
|
|
111
|
+
fn test() {
|
|
112
|
+
let x: int = get_f();
|
|
113
|
+
}
|
|
114
|
+
`);
|
|
115
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
116
|
+
expect(errors[0].message).toContain('cannot implicitly convert');
|
|
117
|
+
});
|
|
118
|
+
it('detects int/float return type mismatch', () => {
|
|
119
|
+
const errors = typeCheck(`
|
|
120
|
+
fn get_float() -> float {
|
|
121
|
+
return 5;
|
|
122
|
+
}
|
|
123
|
+
`);
|
|
124
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
125
|
+
expect(errors[0].message).toContain('cannot implicitly convert int to float');
|
|
126
|
+
expect(errors[0].message).toContain('as float');
|
|
127
|
+
});
|
|
128
|
+
it('detects float/int return type mismatch', () => {
|
|
129
|
+
const errors = typeCheck(`
|
|
130
|
+
fn get_int() -> int {
|
|
131
|
+
return 3.14;
|
|
132
|
+
}
|
|
133
|
+
`);
|
|
134
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
135
|
+
expect(errors[0].message).toContain('cannot implicitly convert float to int');
|
|
136
|
+
expect(errors[0].message).toContain('as int');
|
|
137
|
+
});
|
|
138
|
+
it('allows int assigned to int variable', () => {
|
|
139
|
+
const errors = typeCheck(`
|
|
140
|
+
fn test() {
|
|
141
|
+
let x: int = 5;
|
|
142
|
+
}
|
|
143
|
+
`);
|
|
144
|
+
expect(errors).toHaveLength(0);
|
|
145
|
+
});
|
|
146
|
+
it('allows float assigned to float variable', () => {
|
|
147
|
+
const errors = typeCheck(`
|
|
148
|
+
fn get_f() -> float {
|
|
149
|
+
return 3.14;
|
|
150
|
+
}
|
|
151
|
+
fn test() {
|
|
152
|
+
let x: float = get_f();
|
|
153
|
+
}
|
|
154
|
+
`);
|
|
155
|
+
expect(errors).toHaveLength(0);
|
|
156
|
+
});
|
|
157
|
+
it('blocks compilation on int→float mismatch', () => {
|
|
158
|
+
expect(() => compileStrict(`
|
|
159
|
+
fn get_float() -> float {
|
|
160
|
+
return 5;
|
|
161
|
+
}
|
|
162
|
+
`)).toThrow();
|
|
163
|
+
});
|
|
164
|
+
it('int→float mismatch demoted to warning in lenient mode', () => {
|
|
165
|
+
const result = compileLenient(`
|
|
166
|
+
fn get_float() -> float {
|
|
167
|
+
return 5;
|
|
168
|
+
}
|
|
169
|
+
`);
|
|
170
|
+
expect(result.warnings.length).toBeGreaterThan(0);
|
|
171
|
+
expect(result.warnings[0]).toContain('TypeError');
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
describe('redscript check command behavior', () => {
|
|
175
|
+
it('TypeChecker check() returns errors for type mismatches', () => {
|
|
176
|
+
const errors = typeCheck(`
|
|
177
|
+
fn test() {
|
|
178
|
+
let x: int = undeclared;
|
|
179
|
+
let y: bool = 1;
|
|
180
|
+
}
|
|
181
|
+
`);
|
|
182
|
+
expect(errors.length).toBeGreaterThanOrEqual(1);
|
|
183
|
+
});
|
|
184
|
+
it('TypeChecker check() returns empty array for valid programs', () => {
|
|
185
|
+
const errors = typeCheck(`
|
|
186
|
+
struct Point { x: int, y: int }
|
|
187
|
+
|
|
188
|
+
fn test() {
|
|
189
|
+
let p: Point = { x: 10, y: 20 };
|
|
190
|
+
let val: int = p.x;
|
|
191
|
+
}
|
|
192
|
+
`);
|
|
193
|
+
expect(errors).toHaveLength(0);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
//# sourceMappingURL=typechecker-strict.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* This module defines the Abstract Syntax Tree structure for RedScript.
|
|
5
5
|
* The AST is produced by the parser and consumed by the lowering pass.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
export type BinOp = '+' | '-' | '*' | '/' | '%';
|
|
8
|
+
export type CmpOp = '==' | '!=' | '<' | '<=' | '>' | '>=';
|
|
8
9
|
export interface Span {
|
|
9
10
|
line: number;
|
|
10
11
|
col: number;
|
|
@@ -35,6 +36,12 @@ export type TypeNode = {
|
|
|
35
36
|
} | {
|
|
36
37
|
kind: 'selector';
|
|
37
38
|
entityType?: string;
|
|
39
|
+
} | {
|
|
40
|
+
kind: 'tuple';
|
|
41
|
+
elements: TypeNode[];
|
|
42
|
+
} | {
|
|
43
|
+
kind: 'option';
|
|
44
|
+
inner: TypeNode;
|
|
38
45
|
};
|
|
39
46
|
export interface LambdaParam {
|
|
40
47
|
name: string;
|
|
@@ -190,6 +197,7 @@ export type Expr = {
|
|
|
190
197
|
kind: 'call';
|
|
191
198
|
fn: string;
|
|
192
199
|
args: Expr[];
|
|
200
|
+
typeArgs?: TypeNode[];
|
|
193
201
|
span?: Span;
|
|
194
202
|
} | {
|
|
195
203
|
kind: 'invoke';
|
|
@@ -230,9 +238,25 @@ export type Expr = {
|
|
|
230
238
|
method: string;
|
|
231
239
|
args: Expr[];
|
|
232
240
|
span?: Span;
|
|
241
|
+
} | {
|
|
242
|
+
kind: 'path_expr';
|
|
243
|
+
enumName: string;
|
|
244
|
+
variant: string;
|
|
245
|
+
span?: Span;
|
|
233
246
|
} | (LambdaExpr & {
|
|
234
247
|
span?: Span;
|
|
235
|
-
})
|
|
248
|
+
}) | {
|
|
249
|
+
kind: 'tuple_lit';
|
|
250
|
+
elements: Expr[];
|
|
251
|
+
span?: Span;
|
|
252
|
+
} | {
|
|
253
|
+
kind: 'some_lit';
|
|
254
|
+
value: Expr;
|
|
255
|
+
span?: Span;
|
|
256
|
+
} | {
|
|
257
|
+
kind: 'none_lit';
|
|
258
|
+
span?: Span;
|
|
259
|
+
};
|
|
236
260
|
export type LiteralExpr = Extract<Expr, {
|
|
237
261
|
kind: 'int_lit';
|
|
238
262
|
}> | Extract<Expr, {
|
|
@@ -344,6 +368,12 @@ export type Stmt = {
|
|
|
344
368
|
type?: TypeNode;
|
|
345
369
|
init: Expr;
|
|
346
370
|
span?: Span;
|
|
371
|
+
} | {
|
|
372
|
+
kind: 'let_destruct';
|
|
373
|
+
names: string[];
|
|
374
|
+
type?: TypeNode;
|
|
375
|
+
init: Expr;
|
|
376
|
+
span?: Span;
|
|
347
377
|
} | {
|
|
348
378
|
kind: 'expr';
|
|
349
379
|
expr: Expr;
|
|
@@ -398,6 +428,13 @@ export type Stmt = {
|
|
|
398
428
|
body: Block;
|
|
399
429
|
}[];
|
|
400
430
|
span?: Span;
|
|
431
|
+
} | {
|
|
432
|
+
kind: 'if_let_some';
|
|
433
|
+
binding: string;
|
|
434
|
+
init: Expr;
|
|
435
|
+
then: Block;
|
|
436
|
+
else_?: Block;
|
|
437
|
+
span?: Span;
|
|
401
438
|
} | {
|
|
402
439
|
kind: 'as_block';
|
|
403
440
|
selector: EntitySelector;
|
|
@@ -426,7 +463,7 @@ export type Stmt = {
|
|
|
426
463
|
};
|
|
427
464
|
export type Block = Stmt[];
|
|
428
465
|
export interface Decorator {
|
|
429
|
-
name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load';
|
|
466
|
+
name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule';
|
|
430
467
|
args?: {
|
|
431
468
|
rate?: number;
|
|
432
469
|
eventType?: string;
|
|
@@ -434,6 +471,9 @@ export interface Decorator {
|
|
|
434
471
|
advancement?: string;
|
|
435
472
|
item?: string;
|
|
436
473
|
team?: string;
|
|
474
|
+
batch?: number;
|
|
475
|
+
onDone?: string;
|
|
476
|
+
ticks?: number;
|
|
437
477
|
};
|
|
438
478
|
/** Raw positional arguments (used by @requires and future generic decorators). */
|
|
439
479
|
rawArgs?: Array<{
|
|
@@ -454,7 +494,11 @@ export interface FnDecl {
|
|
|
454
494
|
* Library functions are NOT MC entry points — DCE only keeps them if they
|
|
455
495
|
* are reachable from a non-library (user) entry point. */
|
|
456
496
|
isLibraryFn?: boolean;
|
|
497
|
+
/** True when declared with `export fn` or `@keep fn` — survives DCE. */
|
|
498
|
+
isExported?: boolean;
|
|
457
499
|
name: string;
|
|
500
|
+
/** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
|
|
501
|
+
typeParams?: string[];
|
|
458
502
|
params: Param[];
|
|
459
503
|
returnType: TypeNode;
|
|
460
504
|
decorators: Decorator[];
|
|
@@ -499,14 +543,25 @@ export interface GlobalDecl {
|
|
|
499
543
|
mutable: boolean;
|
|
500
544
|
span?: Span;
|
|
501
545
|
}
|
|
546
|
+
export interface ImportDecl {
|
|
547
|
+
/** The module being imported from, e.g. "math" in `import math::sin` */
|
|
548
|
+
moduleName: string;
|
|
549
|
+
/** The symbol being imported, or '*' for wildcard */
|
|
550
|
+
symbol: string;
|
|
551
|
+
span?: Span;
|
|
552
|
+
}
|
|
502
553
|
export interface Program {
|
|
503
554
|
namespace: string;
|
|
555
|
+
/** Module name declared with `module <name>;` (undefined if no module decl) */
|
|
556
|
+
moduleName?: string;
|
|
504
557
|
globals: GlobalDecl[];
|
|
505
558
|
declarations: FnDecl[];
|
|
506
559
|
structs: StructDecl[];
|
|
507
560
|
implBlocks: ImplBlock[];
|
|
508
561
|
enums: EnumDecl[];
|
|
509
562
|
consts: ConstDecl[];
|
|
563
|
+
/** Phase 5b: module imports (`import math::sin;`) */
|
|
564
|
+
imports: ImportDecl[];
|
|
510
565
|
/** True when the source file declares `module library;`.
|
|
511
566
|
* Library-mode: all functions are DCE-eligible by default — none are treated
|
|
512
567
|
* as MC entry points unless they carry @tick / @load / @on / @keep etc. */
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
* Parse import statements from a source file's content.
|
|
9
|
+
* Returns absolute paths of imported files.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseImports(filePath: string, source?: string): string[];
|
|
12
|
+
export declare class DependencyGraph {
|
|
13
|
+
/** Forward edges: file → set of files it imports */
|
|
14
|
+
private deps;
|
|
15
|
+
/** Add a file and its direct imports to the graph. */
|
|
16
|
+
addFile(filePath: string, source?: string): void;
|
|
17
|
+
/** Remove a file from the graph. */
|
|
18
|
+
removeFile(filePath: string): void;
|
|
19
|
+
/** Get direct imports of a file. */
|
|
20
|
+
getDirectDeps(filePath: string): Set<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Get transitive dependencies of a file (all files it depends on,
|
|
23
|
+
* directly or indirectly).
|
|
24
|
+
*/
|
|
25
|
+
getTransitiveDeps(filePath: string): Set<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Get reverse dependents: all files that (transitively) depend on the
|
|
28
|
+
* given file. Used for change propagation — when `filePath` changes,
|
|
29
|
+
* all returned files need recompilation.
|
|
30
|
+
*/
|
|
31
|
+
getDependents(filePath: string): Set<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Given a set of changed files, compute the full set of dirty files
|
|
34
|
+
* (changed files + all their reverse dependents).
|
|
35
|
+
*/
|
|
36
|
+
computeDirtySet(changedFiles: Set<string>): Set<string>;
|
|
37
|
+
/** Get all tracked files. */
|
|
38
|
+
getAllFiles(): string[];
|
|
39
|
+
/** Clear the graph. */
|
|
40
|
+
clear(): void;
|
|
41
|
+
}
|