redscript-mc 2.6.2 → 3.0.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/.github/workflows/ci.yml +11 -0
- package/CHANGELOG.md +18 -9
- package/README-benchmarks.md +48 -0
- package/README-vscode-test.md +251 -0
- package/RELEASE_NOTES.md +74 -0
- package/ROADMAP.md +131 -167
- package/benchmarks/_shared.ts +468 -0
- package/benchmarks/baseline.json +2816 -0
- package/benchmarks/baseline.md +13 -0
- package/benchmarks/compiler-perf.report.json +207 -0
- package/benchmarks/compiler-perf.ts +76 -0
- package/benchmarks/results.md +13 -0
- package/benchmarks/stdlib-complexity.report.json +2606 -0
- package/benchmarks/stdlib-complexity.ts +54 -0
- package/benchmarks/stdlib-size.md +57 -0
- package/benchmarks/stdlib-size.ts +91 -0
- package/coverage-report.md +177 -0
- package/dist/src/__tests__/budget.test.js +4 -0
- package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
- package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
- package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
- package/dist/src/__tests__/cache-extra.test.js +211 -0
- package/dist/src/__tests__/cli-init.test.d.ts +1 -0
- package/dist/src/__tests__/cli-init.test.js +97 -0
- package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
- package/dist/src/__tests__/cli-publish.test.js +189 -0
- package/dist/src/__tests__/cli.test.js +76 -0
- package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
- package/dist/src/__tests__/compile-preprocess.test.js +328 -0
- package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
- package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
- package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
- package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
- package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/do-while.test.js +120 -0
- package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
- package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
- package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/interface.test.js +258 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
- package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/match-string.test.js +43 -0
- package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/memoize.test.js +113 -0
- package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
- package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
- package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
- package/dist/src/__tests__/compiler/module-import.test.js +261 -0
- package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
- package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
- package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
- package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
- package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
- package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
- package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
- package/dist/src/__tests__/config/project-config.test.js +199 -0
- package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
- package/dist/src/__tests__/config-decorator.test.js +142 -0
- package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
- package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
- package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
- package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
- package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
- package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
- package/dist/src/__tests__/emit/index.test.js +2 -1
- package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
- package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
- package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
- package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
- package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
- package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
- package/dist/src/__tests__/emit/source-map.test.js +167 -0
- package/dist/src/__tests__/enum.test.js +9 -4
- package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
- package/dist/src/__tests__/error-recovery.test.js +217 -0
- package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
- package/dist/src/__tests__/events-types-extra.test.js +91 -0
- package/dist/src/__tests__/events-types.test.d.ts +4 -0
- package/dist/src/__tests__/events-types.test.js +56 -0
- package/dist/src/__tests__/formatter.test.js +13 -5
- package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
- package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
- package/dist/src/__tests__/incremental.test.js +10 -2
- package/dist/src/__tests__/index-extra.test.d.ts +10 -0
- package/dist/src/__tests__/index-extra.test.js +71 -0
- package/dist/src/__tests__/lexer.test.js +2 -2
- package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
- package/dist/src/__tests__/lint/rules.test.js +208 -0
- package/dist/src/__tests__/lir/lower.test.js +29 -0
- package/dist/src/__tests__/lir/verify.test.js +30 -0
- package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/completion.test.js +583 -0
- package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/definition.test.js +454 -0
- package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
- package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
- package/dist/src/__tests__/lsp.test.js +4 -1
- package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
- package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
- package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
- package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
- package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
- package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
- package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
- package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
- package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
- package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
- package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
- package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
- package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
- package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
- package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
- package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
- package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
- package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
- package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
- package/dist/src/__tests__/optimizer/cse.test.js +178 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
- package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/licm.test.js +244 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
- package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
- package/dist/src/__tests__/optimizer/tco.test.js +203 -0
- package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/parser-coverage.test.js +491 -0
- package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
- package/dist/src/__tests__/parser-extra.test.js +451 -0
- package/dist/src/__tests__/parser.test.js +12 -0
- package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
- package/dist/src/__tests__/repl-extra.test.js +174 -0
- package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
- package/dist/src/__tests__/repl-server-extra.test.js +161 -0
- package/dist/src/__tests__/repl-server.test.d.ts +6 -0
- package/dist/src/__tests__/repl-server.test.js +146 -0
- package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
- package/dist/src/__tests__/runtime-extra.test.js +732 -0
- package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
- package/dist/src/__tests__/singleton-decorator.test.js +260 -0
- package/dist/src/__tests__/sourcemap.test.js +1 -1
- package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
- package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
- package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bits.test.js +96 -0
- package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
- package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/color.test.js +84 -0
- package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/combat.test.js +64 -0
- package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
- package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
- package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
- package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/effects.test.js +72 -0
- package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/events.test.js +55 -0
- package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/expr.test.js +77 -0
- package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/fft.test.js +82 -0
- package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/graph.test.js +102 -0
- package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
- package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
- package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
- package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/map.test.js +84 -0
- package/dist/src/__tests__/stdlib/math.test.js +19 -6
- package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
- package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
- package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/noise.test.js +73 -0
- package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ode.test.js +68 -0
- package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
- package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/particles.test.js +68 -0
- package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/physics.test.js +76 -0
- package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/player.test.js +64 -0
- package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
- package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/queue.test.js +97 -0
- package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/random.test.js +76 -0
- package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/result.test.js +329 -0
- package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
- package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
- package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
- package/dist/src/__tests__/stdlib/sets.test.js +60 -0
- package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/signal.test.js +84 -0
- package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
- package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/string.test.js +231 -0
- package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/strings.test.js +83 -0
- package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/tags.test.js +57 -0
- package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/teams.test.js +72 -0
- package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/timer.test.js +79 -0
- package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/vec.test.js +94 -0
- package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/world.test.js +72 -0
- package/dist/src/__tests__/struct-display.test.d.ts +1 -0
- package/dist/src/__tests__/struct-display.test.js +64 -0
- package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
- package/dist/src/__tests__/test-framework/runner.test.js +193 -0
- package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
- package/dist/src/__tests__/tuner/adapters.test.js +194 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
- package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
- package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
- package/dist/src/__tests__/typechecker.test.js +3 -3
- package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/watch-decorator.test.js +54 -0
- package/dist/src/ast/types.d.ts +102 -3
- package/dist/src/cache/incremental.d.ts +13 -14
- package/dist/src/cache/incremental.js +106 -89
- package/dist/src/cache/index.d.ts +8 -2
- package/dist/src/cache/index.js +18 -6
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.js +466 -17
- package/dist/src/config/project-config.d.ts +29 -0
- package/dist/src/config/project-config.js +180 -0
- package/dist/src/diagnostics/index.d.ts +9 -0
- package/dist/src/diagnostics/index.js +18 -1
- package/dist/src/emit/compile.d.ts +10 -0
- package/dist/src/emit/compile.js +395 -50
- package/dist/src/emit/index.d.ts +40 -0
- package/dist/src/emit/index.js +307 -14
- package/dist/src/emit/modules.js +21 -3
- package/dist/src/emit/sourcemap.d.ts +23 -27
- package/dist/src/emit/sourcemap.js +52 -30
- package/dist/src/formatter/index.js +33 -8
- package/dist/src/hir/deprecated.d.ts +13 -0
- package/dist/src/hir/deprecated.js +218 -0
- package/dist/src/hir/lower.js +114 -8
- package/dist/src/hir/monomorphize.js +22 -2
- package/dist/src/hir/types.d.ts +65 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +18 -3
- package/dist/src/lexer/index.d.ts +2 -1
- package/dist/src/lexer/index.js +39 -3
- package/dist/src/lint/index.d.ts +45 -0
- package/dist/src/lint/index.js +930 -0
- package/dist/src/lir/lower.js +29 -2
- package/dist/src/lir/types.d.ts +2 -0
- package/dist/src/lsp/server.js +92 -5
- package/dist/src/mir/lower.js +775 -34
- package/dist/src/mir/macro.js +36 -2
- package/dist/src/mir/types.d.ts +12 -0
- package/dist/src/mir/verify.js +9 -0
- package/dist/src/optimizer/auto-inline.d.ts +2 -0
- package/dist/src/optimizer/auto-inline.js +67 -0
- package/dist/src/optimizer/cse.d.ts +20 -0
- package/dist/src/optimizer/cse.js +234 -0
- package/dist/src/optimizer/inline.d.ts +26 -0
- package/dist/src/optimizer/inline.js +286 -0
- package/dist/src/optimizer/interprocedural.js +4 -0
- package/dist/src/optimizer/licm.d.ts +32 -0
- package/dist/src/optimizer/licm.js +371 -0
- package/dist/src/optimizer/pipeline.js +12 -2
- package/dist/src/optimizer/strength_reduction.d.ts +15 -0
- package/dist/src/optimizer/strength_reduction.js +90 -0
- package/dist/src/optimizer/tco.d.ts +53 -0
- package/dist/src/optimizer/tco.js +238 -0
- package/dist/src/parser/index.d.ts +32 -0
- package/dist/src/parser/index.js +421 -59
- package/dist/src/repl-server.d.ts +13 -0
- package/dist/src/repl-server.js +127 -0
- package/dist/src/structs/expand.d.ts +15 -0
- package/dist/src/structs/expand.js +46 -0
- package/dist/src/testing/runner.d.ts +40 -0
- package/dist/src/testing/runner.js +237 -0
- package/dist/src/typechecker/index.d.ts +3 -0
- package/dist/src/typechecker/index.js +254 -9
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
- package/docs/stdlib/result.md +156 -0
- package/docs/stdlib/result.zh.md +156 -0
- package/editors/vscode/fixtures/test.mcrs +7 -0
- package/editors/vscode/out/extension.js +2095 -225
- package/editors/vscode/out/lsp-server.js +519 -51
- package/editors/vscode/package-lock.json +9 -4
- package/editors/vscode/package.json +1 -1
- package/examples/display-demo.mcrs +64 -0
- package/examples/game/racing.mcrs +301 -0
- package/examples/game/tower_defense.mcrs +311 -0
- package/examples/math/physics_sim.mcrs +322 -0
- package/examples/rpg/boss_fight.mcrs +313 -0
- package/examples/rpg/health_system.mcrs +237 -0
- package/examples/rpg/inventory.mcrs +265 -0
- package/examples/util/debug_hud.mcrs +279 -0
- package/jest.config.js +10 -0
- package/package.json +12 -3
- package/playground/index.html +823 -0
- package/scripts/gen-docs.ts +533 -0
- package/scripts/update-redscript-docs-stdlib.sh +770 -0
- package/src/__tests__/budget.test.ts +5 -0
- package/src/__tests__/cache/cache-behavior.test.ts +480 -0
- package/src/__tests__/cache-extra.test.ts +199 -0
- package/src/__tests__/cli-docs.test.ts +77 -0
- package/src/__tests__/cli-init.test.ts +91 -0
- package/src/__tests__/cli-publish.test.ts +190 -0
- package/src/__tests__/cli.test.ts +117 -1
- package/src/__tests__/compile-preprocess.test.ts +366 -0
- package/src/__tests__/compiler/break-stmt.test.ts +66 -0
- package/src/__tests__/compiler/const-decl.test.ts +141 -0
- package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
- package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
- package/src/__tests__/compiler/deprecated.test.ts +305 -0
- package/src/__tests__/compiler/do-while.test.ts +130 -0
- package/src/__tests__/compiler/enum-payload.test.ts +299 -0
- package/src/__tests__/compiler/interface.test.ts +287 -0
- package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
- package/src/__tests__/compiler/match-string.test.ts +45 -0
- package/src/__tests__/compiler/memoize.test.ts +126 -0
- package/src/__tests__/compiler/method-chain.test.ts +121 -0
- package/src/__tests__/compiler/module-import.test.ts +240 -0
- package/src/__tests__/compiler/option-extensions.test.ts +207 -0
- package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
- package/src/__tests__/compiler/string-advanced.test.ts +310 -0
- package/src/__tests__/compiler/struct-extends.test.ts +109 -0
- package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
- package/src/__tests__/compiler/tuple-type.test.ts +263 -0
- package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
- package/src/__tests__/config/project-config.test.ts +181 -0
- package/src/__tests__/config-decorator.test.ts +157 -0
- package/src/__tests__/diagnostics-extra.test.ts +155 -0
- package/src/__tests__/emit/compile-branches.test.ts +135 -0
- package/src/__tests__/emit/compile-coverage.test.ts +696 -0
- package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
- package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
- package/src/__tests__/emit/compile.test.ts +6 -1
- package/src/__tests__/emit/execute-chain.test.ts +114 -0
- package/src/__tests__/emit/index.test.ts +2 -1
- package/src/__tests__/emit/modules-branches.test.ts +90 -0
- package/src/__tests__/emit/modules-coverage.test.ts +241 -0
- package/src/__tests__/emit/modules-errors.test.ts +192 -0
- package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
- package/src/__tests__/emit/source-map.test.ts +152 -0
- package/src/__tests__/enum.test.ts +9 -4
- package/src/__tests__/error-recovery.test.ts +226 -0
- package/src/__tests__/events-types-extra.test.ts +110 -0
- package/src/__tests__/events-types.test.ts +66 -0
- package/src/__tests__/formatter.test.ts +15 -5
- package/src/__tests__/generics.test.ts +16 -9
- package/src/__tests__/hir/lower-extra.test.ts +151 -0
- package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
- package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
- package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
- package/src/__tests__/impl.test.ts +12 -8
- package/src/__tests__/incremental.test.ts +10 -2
- package/src/__tests__/index-extra.test.ts +79 -0
- package/src/__tests__/lexer.test.ts +2 -2
- package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
- package/src/__tests__/lint/rules-coverage.test.ts +598 -0
- package/src/__tests__/lint/rules.test.ts +230 -0
- package/src/__tests__/lir/lower.test.ts +33 -0
- package/src/__tests__/lir/verify.test.ts +33 -0
- package/src/__tests__/lsp/completion.test.ts +687 -0
- package/src/__tests__/lsp/definition.test.ts +499 -0
- package/src/__tests__/lsp/diagnostics.test.ts +108 -0
- package/src/__tests__/lsp/hover-docs.test.ts +222 -0
- package/src/__tests__/lsp.test.ts +4 -1
- package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
- package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
- package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
- package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
- package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
- package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
- package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
- package/src/__tests__/mc-validator-coverage.test.ts +325 -0
- package/src/__tests__/mc-validator-extra.test.ts +252 -0
- package/src/__tests__/mir/lower-extra.test.ts +402 -0
- package/src/__tests__/mir/lower-extra2.test.ts +348 -0
- package/src/__tests__/mir/lower-extra3.test.ts +277 -0
- package/src/__tests__/mir/lower-extra4.test.ts +636 -0
- package/src/__tests__/mir/lower-extra5.test.ts +612 -0
- package/src/__tests__/mir/lower-extra6.test.ts +520 -0
- package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
- package/src/__tests__/mir/lower-extra8.test.ts +704 -0
- package/src/__tests__/mir/lower-extra9.test.ts +821 -0
- package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
- package/src/__tests__/optimizer/cse.test.ts +195 -0
- package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
- package/src/__tests__/optimizer/licm.test.ts +358 -0
- package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
- package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
- package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
- package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
- package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
- package/src/__tests__/optimizer/tco.test.ts +238 -0
- package/src/__tests__/option.test.ts +14 -7
- package/src/__tests__/parser-coverage.test.ts +576 -0
- package/src/__tests__/parser-extra.test.ts +531 -0
- package/src/__tests__/parser.test.ts +14 -0
- package/src/__tests__/repl-extra.test.ts +195 -0
- package/src/__tests__/repl-server-extra.test.ts +150 -0
- package/src/__tests__/repl-server.test.ts +122 -0
- package/src/__tests__/runtime-extra.test.ts +862 -0
- package/src/__tests__/singleton-decorator.test.ts +285 -0
- package/src/__tests__/sourcemap.test.ts +1 -1
- package/src/__tests__/stdlib/advanced.test.ts +312 -0
- package/src/__tests__/stdlib/bigint.test.ts +57 -0
- package/src/__tests__/stdlib/bits.test.ts +75 -0
- package/src/__tests__/stdlib/bossbar.test.ts +45 -0
- package/src/__tests__/stdlib/color.test.ts +60 -0
- package/src/__tests__/stdlib/combat.test.ts +35 -0
- package/src/__tests__/stdlib/cooldown.test.ts +35 -0
- package/src/__tests__/stdlib/dialog.test.ts +14 -6
- package/src/__tests__/stdlib/ecs.test.ts +54 -0
- package/src/__tests__/stdlib/effects.test.ts +45 -0
- package/src/__tests__/stdlib/events.test.ts +23 -0
- package/src/__tests__/stdlib/expr.test.ts +48 -0
- package/src/__tests__/stdlib/fft.test.ts +54 -0
- package/src/__tests__/stdlib/graph.test.ts +77 -0
- package/src/__tests__/stdlib/interactions.test.ts +30 -0
- package/src/__tests__/stdlib/inventory.test.ts +40 -0
- package/src/__tests__/stdlib/linalg.test.ts +52 -0
- package/src/__tests__/stdlib/map.test.ts +55 -0
- package/src/__tests__/stdlib/math.test.ts +19 -5
- package/src/__tests__/stdlib/math_hp.test.ts +55 -0
- package/src/__tests__/stdlib/mobs.test.ts +40 -0
- package/src/__tests__/stdlib/noise.test.ts +46 -0
- package/src/__tests__/stdlib/ode.test.ts +40 -0
- package/src/__tests__/stdlib/parabola.test.ts +51 -0
- package/src/__tests__/stdlib/particles.test.ts +40 -0
- package/src/__tests__/stdlib/physics.test.ts +50 -0
- package/src/__tests__/stdlib/player.test.ts +35 -0
- package/src/__tests__/stdlib/quaternion.test.ts +46 -0
- package/src/__tests__/stdlib/queue.test.ts +73 -0
- package/src/__tests__/stdlib/random.test.ts +50 -0
- package/src/__tests__/stdlib/result.test.ts +326 -0
- package/src/__tests__/stdlib/scheduler.test.ts +18 -7
- package/src/__tests__/stdlib/set_int.test.ts +62 -0
- package/src/__tests__/stdlib/sets.test.ts +28 -0
- package/src/__tests__/stdlib/signal.test.ts +60 -0
- package/src/__tests__/stdlib/spawn.test.ts +40 -0
- package/src/__tests__/stdlib/string.test.ts +224 -0
- package/src/__tests__/stdlib/strings.test.ts +55 -0
- package/src/__tests__/stdlib/tags.test.ts +32 -0
- package/src/__tests__/stdlib/teams.test.ts +45 -0
- package/src/__tests__/stdlib/timer.test.ts +53 -0
- package/src/__tests__/stdlib/vec.test.ts +72 -0
- package/src/__tests__/stdlib/world.test.ts +45 -0
- package/src/__tests__/struct-display.test.ts +69 -0
- package/src/__tests__/test-framework/runner.test.ts +208 -0
- package/src/__tests__/tuner/adapters.test.ts +232 -0
- package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
- package/src/__tests__/tuple.test.ts +11 -4
- package/src/__tests__/typechecker-coverage.test.ts +671 -0
- package/src/__tests__/typechecker.test.ts +4 -3
- package/src/__tests__/watch-decorator.test.ts +59 -0
- package/src/ast/types.ts +65 -3
- package/src/cache/incremental.ts +128 -99
- package/src/cache/index.ts +35 -8
- package/src/cli.ts +538 -29
- package/src/config/project-config.ts +176 -0
- package/src/diagnostics/index.ts +22 -0
- package/src/docs.ts +98 -0
- package/src/emit/compile.ts +408 -51
- package/src/emit/index.ts +366 -18
- package/src/emit/modules.ts +19 -3
- package/src/emit/sourcemap.ts +64 -43
- package/src/formatter/index.ts +35 -8
- package/src/hir/deprecated.ts +212 -0
- package/src/hir/lower.ts +128 -8
- package/src/hir/monomorphize.ts +24 -2
- package/src/hir/types.ts +26 -1
- package/src/index.ts +23 -3
- package/src/lexer/index.ts +45 -6
- package/src/lint/index.ts +922 -0
- package/src/lir/lower.ts +30 -2
- package/src/lir/types.ts +4 -0
- package/src/lsp/server.ts +100 -1
- package/src/mir/lower.ts +785 -40
- package/src/mir/macro.ts +30 -2
- package/src/mir/types.ts +13 -0
- package/src/mir/verify.ts +10 -2
- package/src/optimizer/auto-inline.ts +86 -0
- package/src/optimizer/copy_prop.ts +2 -2
- package/src/optimizer/coroutine.ts +3 -3
- package/src/optimizer/cse.ts +205 -0
- package/src/optimizer/dce.ts +2 -2
- package/src/optimizer/inline.ts +335 -0
- package/src/optimizer/interprocedural.ts +5 -1
- package/src/optimizer/licm.ts +454 -0
- package/src/optimizer/nbt-coalesce.ts +109 -0
- package/src/optimizer/pipeline.ts +16 -2
- package/src/optimizer/scoreboard-batch.ts +52 -0
- package/src/optimizer/strength_reduction.ts +95 -0
- package/src/optimizer/tco.ts +267 -0
- package/src/optimizer/unroll.ts +2 -2
- package/src/parser/index.ts +426 -53
- package/src/repl-server.ts +102 -0
- package/src/stdlib/advanced.mcrs +271 -101
- package/src/stdlib/bigint.mcrs +97 -11
- package/src/stdlib/bits.mcrs +75 -12
- package/src/stdlib/bossbar.mcrs +37 -8
- package/src/stdlib/calculus.mcrs +82 -26
- package/src/stdlib/color.mcrs +98 -16
- package/src/stdlib/combat.mcrs +23 -5
- package/src/stdlib/cooldown.mcrs +19 -0
- package/src/stdlib/dialog.mcrs +45 -7
- package/src/stdlib/easing.mcrs +132 -12
- package/src/stdlib/ecs.mcrs +142 -25
- package/src/stdlib/effects.mcrs +88 -12
- package/src/stdlib/events.mcrs +21 -2
- package/src/stdlib/expr.mcrs +18 -3
- package/src/stdlib/fft.mcrs +66 -56
- package/src/stdlib/geometry.mcrs +137 -39
- package/src/stdlib/graph.mcrs +73 -0
- package/src/stdlib/heap.mcrs +49 -8
- package/src/stdlib/i18n/zh.yaml +2891 -0
- package/src/stdlib/interactions.mcrs +43 -20
- package/src/stdlib/inventory.mcrs +14 -3
- package/src/stdlib/linalg.mcrs +185 -30
- package/src/stdlib/list.mcrs +168 -18
- package/src/stdlib/map.mcrs +112 -0
- package/src/stdlib/math.mcrs +68 -18
- package/src/stdlib/math_hp.mcrs +124 -33
- package/src/stdlib/matrix.mcrs +133 -20
- package/src/stdlib/mobs.mcrs +87 -0
- package/src/stdlib/noise.mcrs +65 -21
- package/src/stdlib/ode.mcrs +96 -0
- package/src/stdlib/parabola.mcrs +104 -29
- package/src/stdlib/particles.mcrs +78 -21
- package/src/stdlib/pathfind.mcrs +89 -35
- package/src/stdlib/physics.mcrs +134 -26
- package/src/stdlib/player.mcrs +18 -0
- package/src/stdlib/quaternion.mcrs +213 -9
- package/src/stdlib/queue.mcrs +123 -0
- package/src/stdlib/random.mcrs +63 -18
- package/src/stdlib/result.mcrs +111 -0
- package/src/stdlib/scheduler.mcrs +59 -10
- package/src/stdlib/set_int.mcrs +240 -0
- package/src/stdlib/sets.mcrs +49 -19
- package/src/stdlib/signal.mcrs +151 -79
- package/src/stdlib/sort.mcrs +44 -24
- package/src/stdlib/spawn.mcrs +30 -7
- package/src/stdlib/state.mcrs +40 -5
- package/src/stdlib/strings.mcrs +131 -3
- package/src/stdlib/tags.mcrs +2 -2
- package/src/stdlib/teams.mcrs +22 -10
- package/src/stdlib/timer.mcrs +36 -6
- package/src/stdlib/vec.mcrs +44 -9
- package/src/stdlib/world.mcrs +57 -25
- package/src/structs/expand.ts +64 -0
- package/src/testing/runner.ts +271 -0
- package/src/typechecker/index.ts +273 -9
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { compile } from '../emit/compile'
|
|
2
|
+
import { Lexer } from '../lexer'
|
|
3
|
+
import { Parser } from '../parser'
|
|
4
|
+
import { TypeChecker } from '../typechecker'
|
|
5
|
+
import type { DiagnosticError } from '../diagnostics'
|
|
6
|
+
|
|
7
|
+
function getFile(files: Array<{ path: string; content: string }>, path: string): string {
|
|
8
|
+
const file = files.find(entry => entry.path === path)
|
|
9
|
+
if (!file) {
|
|
10
|
+
throw new Error(`Missing file: ${path}\nFiles:\n${files.map(entry => entry.path).join('\n')}`)
|
|
11
|
+
}
|
|
12
|
+
return file.content
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function typeCheck(source: string): DiagnosticError[] {
|
|
16
|
+
const tokens = new Lexer(source).tokenize()
|
|
17
|
+
const ast = new Parser(tokens).parse('test')
|
|
18
|
+
return new TypeChecker(source).check(ast)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('@watch decorator', () => {
|
|
22
|
+
test('typechecker accepts parameterless handlers and rejects parameters', () => {
|
|
23
|
+
expect(typeCheck(`
|
|
24
|
+
@watch("rs.kills")
|
|
25
|
+
fn on_kill() {
|
|
26
|
+
say("kill");
|
|
27
|
+
}
|
|
28
|
+
`)).toHaveLength(0)
|
|
29
|
+
|
|
30
|
+
const errors = typeCheck(`
|
|
31
|
+
@watch("rs.kills")
|
|
32
|
+
fn on_kill(player: Player) {}
|
|
33
|
+
`)
|
|
34
|
+
expect(errors.length).toBeGreaterThan(0)
|
|
35
|
+
expect(errors[0].message).toContain('cannot declare parameters')
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('emits watcher objective, dispatcher, and tick registration', () => {
|
|
39
|
+
const result = compile(`
|
|
40
|
+
@watch("rs.kills")
|
|
41
|
+
fn on_kill() {
|
|
42
|
+
let k: int = scoreboard_get("@s", "rs.kills");
|
|
43
|
+
if (k >= 10) {
|
|
44
|
+
title("@s", "Achievement Unlocked!");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
`, { namespace: 'watch_test' })
|
|
48
|
+
|
|
49
|
+
const load = getFile(result.files, 'data/watch_test/function/load.mcfunction')
|
|
50
|
+
const tick = JSON.parse(getFile(result.files, 'data/minecraft/tags/function/tick.json'))
|
|
51
|
+
const watch = getFile(result.files, 'data/watch_test/function/__watch_on_kill.mcfunction')
|
|
52
|
+
|
|
53
|
+
expect(load).toContain('scoreboard objectives add __watch_on_kill_prev dummy')
|
|
54
|
+
expect(tick.values).toContain('watch_test:__watch_on_kill')
|
|
55
|
+
expect(watch).toContain('execute as @a unless score @s __watch_on_kill_prev = @s __watch_on_kill_prev run scoreboard players operation @s __watch_on_kill_prev = @s rs.kills')
|
|
56
|
+
expect(watch).toContain('execute as @a unless score @s rs.kills = @s __watch_on_kill_prev run function watch_test:on_kill')
|
|
57
|
+
expect(watch).toContain('execute as @a unless score @s rs.kills = @s __watch_on_kill_prev run scoreboard players operation @s __watch_on_kill_prev = @s rs.kills')
|
|
58
|
+
})
|
|
59
|
+
})
|
package/src/ast/types.ts
CHANGED
|
@@ -175,10 +175,12 @@ export type Expr =
|
|
|
175
175
|
| { kind: 'array_lit'; elements: Expr[]; span?: Span }
|
|
176
176
|
| { kind: 'static_call'; type: string; method: string; args: Expr[]; span?: Span }
|
|
177
177
|
| { kind: 'path_expr'; enumName: string; variant: string; span?: Span }
|
|
178
|
+
| { kind: 'enum_construct'; enumName: string; variant: string; args: { name: string; value: Expr }[]; span?: Span }
|
|
178
179
|
| (LambdaExpr & { span?: Span })
|
|
179
180
|
| { kind: 'tuple_lit'; elements: Expr[]; span?: Span }
|
|
180
181
|
| { kind: 'some_lit'; value: Expr; span?: Span } // Some(expr)
|
|
181
182
|
| { kind: 'none_lit'; span?: Span } // None
|
|
183
|
+
| { kind: 'unwrap_or'; opt: Expr; default_: Expr; span?: Span } // opt.unwrap_or(default)
|
|
182
184
|
| { kind: 'type_cast'; expr: Expr; targetType: TypeNode; span?: Span } // expr as Type
|
|
183
185
|
|
|
184
186
|
export type LiteralExpr =
|
|
@@ -233,16 +235,23 @@ export type MatchPattern =
|
|
|
233
235
|
| { kind: 'PatInt'; value: number } // 1, 2, 3
|
|
234
236
|
| { kind: 'PatWild' } // _
|
|
235
237
|
| { kind: 'PatExpr'; expr: Expr } // legacy: range_lit or other expr
|
|
238
|
+
| { kind: 'PatEnum'; enumName: string; variant: string; bindings: string[] } // Color::RGB(r, g, b)
|
|
236
239
|
|
|
237
240
|
export type Stmt =
|
|
238
241
|
| { kind: 'let'; name: string; type?: TypeNode; init: Expr; span?: Span }
|
|
239
242
|
| { kind: 'let_destruct'; names: string[]; type?: TypeNode; init: Expr; span?: Span }
|
|
243
|
+
| { kind: 'const_decl'; name: string; type: TypeNode; value: Expr; span?: Span }
|
|
240
244
|
| { kind: 'expr'; expr: Expr; span?: Span }
|
|
241
245
|
| { kind: 'return'; value?: Expr; span?: Span }
|
|
242
246
|
| { kind: 'break'; span?: Span }
|
|
243
247
|
| { kind: 'continue'; span?: Span }
|
|
248
|
+
| { kind: 'break_label'; label: string; span?: Span }
|
|
249
|
+
| { kind: 'continue_label'; label: string; span?: Span }
|
|
250
|
+
| { kind: 'labeled_loop'; label: string; body: Stmt; span?: Span }
|
|
244
251
|
| { kind: 'if'; cond: Expr; then: Block; else_?: Block; span?: Span }
|
|
245
252
|
| { kind: 'while'; cond: Expr; body: Block; span?: Span }
|
|
253
|
+
| { kind: 'do_while'; cond: Expr; body: Block; span?: Span }
|
|
254
|
+
| { kind: 'repeat'; count: number; body: Block; span?: Span }
|
|
246
255
|
| { kind: 'for'; init?: Stmt; cond: Expr; step: Expr; body: Block; span?: Span }
|
|
247
256
|
| { kind: 'foreach'; binding: string; iterable: Expr; body: Block; executeContext?: string; span?: Span }
|
|
248
257
|
| { kind: 'for_range'; varName: string; start: Expr; end: Expr; inclusive?: boolean; body: Block; span?: Span }
|
|
@@ -250,6 +259,7 @@ export type Stmt =
|
|
|
250
259
|
| { kind: 'for_each'; binding: string; array: Expr; body: Block; span?: Span }
|
|
251
260
|
| { kind: 'match'; expr: Expr; arms: { pattern: MatchPattern; body: Block }[]; span?: Span }
|
|
252
261
|
| { kind: 'if_let_some'; binding: string; init: Expr; then: Block; else_?: Block; span?: Span }
|
|
262
|
+
| { kind: 'while_let_some'; binding: string; init: Expr; body: Block; span?: Span }
|
|
253
263
|
| { kind: 'as_block'; selector: EntitySelector; body: Block; span?: Span }
|
|
254
264
|
| { kind: 'at_block'; selector: EntitySelector; body: Block; span?: Span }
|
|
255
265
|
| { kind: 'as_at'; as_sel: EntitySelector; at_sel: EntitySelector; body: Block; span?: Span }
|
|
@@ -263,9 +273,10 @@ export type Block = Stmt[]
|
|
|
263
273
|
// ---------------------------------------------------------------------------
|
|
264
274
|
|
|
265
275
|
export interface Decorator {
|
|
266
|
-
name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule'
|
|
276
|
+
name: 'tick' | 'load' | 'watch' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule' | 'deprecated' | 'inline' | 'no-inline' | 'config' | 'singleton' | 'profile' | 'throttle' | 'retry' | 'memoize' | 'test'
|
|
267
277
|
args?: {
|
|
268
278
|
rate?: number
|
|
279
|
+
objective?: string
|
|
269
280
|
eventType?: string
|
|
270
281
|
trigger?: string
|
|
271
282
|
advancement?: string
|
|
@@ -274,6 +285,16 @@ export interface Decorator {
|
|
|
274
285
|
batch?: number
|
|
275
286
|
onDone?: string
|
|
276
287
|
ticks?: number
|
|
288
|
+
/** @deprecated decorator message */
|
|
289
|
+
message?: string
|
|
290
|
+
/** @config decorator: config key name */
|
|
291
|
+
configKey?: string
|
|
292
|
+
/** @config decorator: default value */
|
|
293
|
+
configDefault?: number
|
|
294
|
+
/** @retry decorator: max retry count */
|
|
295
|
+
max?: number
|
|
296
|
+
/** @test decorator: human-readable test label */
|
|
297
|
+
testLabel?: string
|
|
277
298
|
}
|
|
278
299
|
/** Raw positional arguments (used by @requires and future generic decorators). */
|
|
279
300
|
rawArgs?: Array<{ kind: 'string'; value: string } | { kind: 'number'; value: number }>
|
|
@@ -296,6 +317,8 @@ export interface FnDecl {
|
|
|
296
317
|
isLibraryFn?: boolean
|
|
297
318
|
/** True when declared with `export fn` or `@keep fn` — survives DCE. */
|
|
298
319
|
isExported?: boolean
|
|
320
|
+
/** Scoreboard objective watched by @watch("..."), if present. */
|
|
321
|
+
watchObjective?: string
|
|
299
322
|
name: string
|
|
300
323
|
/** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
|
|
301
324
|
typeParams?: string[]
|
|
@@ -304,6 +327,7 @@ export interface FnDecl {
|
|
|
304
327
|
decorators: Decorator[]
|
|
305
328
|
body: Block
|
|
306
329
|
span?: Span
|
|
330
|
+
sourceFile?: string
|
|
307
331
|
}
|
|
308
332
|
|
|
309
333
|
// ---------------------------------------------------------------------------
|
|
@@ -317,20 +341,51 @@ export interface StructField {
|
|
|
317
341
|
|
|
318
342
|
export interface StructDecl {
|
|
319
343
|
name: string
|
|
344
|
+
extends?: string
|
|
320
345
|
fields: StructField[]
|
|
346
|
+
/** True when the struct was declared with `@singleton` */
|
|
347
|
+
isSingleton?: boolean
|
|
321
348
|
span?: Span
|
|
322
349
|
}
|
|
323
350
|
|
|
324
351
|
export interface ImplBlock {
|
|
325
352
|
kind: 'impl_block'
|
|
326
353
|
typeName: string
|
|
354
|
+
/** Trait name when declared as `impl TraitName for TypeName` (e.g. "Display") */
|
|
355
|
+
traitName?: string
|
|
327
356
|
methods: FnDecl[]
|
|
328
357
|
span?: Span
|
|
329
358
|
}
|
|
330
359
|
|
|
360
|
+
// ---------------------------------------------------------------------------
|
|
361
|
+
// Interface / Trait Declarations
|
|
362
|
+
// ---------------------------------------------------------------------------
|
|
363
|
+
|
|
364
|
+
/** A method signature in an interface body (no body) */
|
|
365
|
+
export interface InterfaceMethod {
|
|
366
|
+
name: string
|
|
367
|
+
params: Param[]
|
|
368
|
+
returnType?: TypeNode
|
|
369
|
+
span?: Span
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/** `interface Drawable { fn draw(self, x: int, y: int) ... }` */
|
|
373
|
+
export interface InterfaceDecl {
|
|
374
|
+
name: string
|
|
375
|
+
methods: InterfaceMethod[]
|
|
376
|
+
span?: Span
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export interface EnumPayloadField {
|
|
380
|
+
name: string
|
|
381
|
+
type: TypeNode
|
|
382
|
+
}
|
|
383
|
+
|
|
331
384
|
export interface EnumVariant {
|
|
332
385
|
name: string
|
|
333
386
|
value?: number
|
|
387
|
+
/** Payload fields for tuple-like variants, e.g. RGB(r: int, g: int, b: int) */
|
|
388
|
+
fields?: EnumPayloadField[]
|
|
334
389
|
}
|
|
335
390
|
|
|
336
391
|
export interface EnumDecl {
|
|
@@ -352,6 +407,10 @@ export interface GlobalDecl {
|
|
|
352
407
|
type: TypeNode
|
|
353
408
|
init: Expr
|
|
354
409
|
mutable: boolean // let = true, const = false
|
|
410
|
+
/** Present when the global was declared with @config("key", default: value) */
|
|
411
|
+
configKey?: string
|
|
412
|
+
/** Default value for @config globals */
|
|
413
|
+
configDefault?: number
|
|
355
414
|
span?: Span
|
|
356
415
|
}
|
|
357
416
|
|
|
@@ -362,8 +421,9 @@ export interface GlobalDecl {
|
|
|
362
421
|
export interface ImportDecl {
|
|
363
422
|
/** The module being imported from, e.g. "math" in `import math::sin` */
|
|
364
423
|
moduleName: string
|
|
365
|
-
/** The symbol being imported, or '*' for wildcard
|
|
366
|
-
|
|
424
|
+
/** The symbol being imported, or '*' for wildcard.
|
|
425
|
+
* Undefined when this is a whole-module file import (`import player_utils`). */
|
|
426
|
+
symbol?: string // '*' | identifier | undefined (whole-module import)
|
|
367
427
|
span?: Span
|
|
368
428
|
}
|
|
369
429
|
|
|
@@ -383,6 +443,8 @@ export interface Program {
|
|
|
383
443
|
consts: ConstDecl[]
|
|
384
444
|
/** Phase 5b: module imports (`import math::sin;`) */
|
|
385
445
|
imports: ImportDecl[]
|
|
446
|
+
/** Interface / trait declarations */
|
|
447
|
+
interfaces: InterfaceDecl[]
|
|
386
448
|
/** True when the source file declares `module library;`.
|
|
387
449
|
* Library-mode: all functions are DCE-eligible by default — none are treated
|
|
388
450
|
* as MC entry points unless they carry @tick / @load / @on / @keep etc. */
|
package/src/cache/incremental.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Incremental compilation — only recompile files whose content
|
|
3
|
-
*
|
|
2
|
+
* Incremental compilation — only recompile files whose content, imports,
|
|
3
|
+
* or reverse dependents changed since the last build.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import * as fs from 'fs'
|
|
6
7
|
import * as path from 'path'
|
|
7
8
|
import { compile, type CompileOptions, type CompileResult } from '../emit/compile'
|
|
8
|
-
import
|
|
9
|
+
import type { DatapackFile } from '../emit'
|
|
9
10
|
import { FileCache } from './index'
|
|
10
|
-
import { DependencyGraph } from './deps'
|
|
11
|
+
import { DependencyGraph, parseImports } from './deps'
|
|
11
12
|
|
|
12
13
|
export interface IncrementalOptions {
|
|
13
14
|
namespace?: string
|
|
14
15
|
/** Output directory for compiled files. */
|
|
15
16
|
output: string
|
|
17
|
+
generateSourceMap?: boolean
|
|
18
|
+
mcVersion?: CompileOptions['mcVersion']
|
|
19
|
+
lenient?: boolean
|
|
20
|
+
includeDirs?: string[]
|
|
16
21
|
}
|
|
17
22
|
|
|
18
23
|
export interface IncrementalResult {
|
|
@@ -24,135 +29,149 @@ export interface IncrementalResult {
|
|
|
24
29
|
errors: Map<string, string>
|
|
25
30
|
/** Per-file compile results (only for recompiled files). */
|
|
26
31
|
results: Map<string, CompileResult>
|
|
32
|
+
/** Files skipped due to cache hit. */
|
|
33
|
+
skippedFiles: string[]
|
|
34
|
+
/** Files rebuilt in this run. */
|
|
35
|
+
rebuiltFiles: string[]
|
|
36
|
+
/** Elapsed wall time for this run. */
|
|
37
|
+
elapsedMs: number
|
|
27
38
|
}
|
|
28
39
|
|
|
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
40
|
export function compileIncremental(
|
|
47
41
|
files: string[],
|
|
48
42
|
cache: FileCache,
|
|
49
43
|
depGraph: DependencyGraph,
|
|
50
44
|
options: IncrementalOptions,
|
|
51
45
|
): IncrementalResult {
|
|
46
|
+
const start = Date.now()
|
|
47
|
+
const normalizedEntries = [...new Set(files.map(file => path.resolve(file)))]
|
|
52
48
|
const result: IncrementalResult = {
|
|
53
49
|
recompiled: 0,
|
|
54
50
|
cached: 0,
|
|
55
51
|
errors: new Map(),
|
|
56
52
|
results: new Map(),
|
|
53
|
+
skippedFiles: [],
|
|
54
|
+
rebuiltFiles: [],
|
|
55
|
+
elapsedMs: 0,
|
|
57
56
|
}
|
|
58
57
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
}
|
|
58
|
+
if (normalizedEntries.length === 0) {
|
|
59
|
+
result.elapsedMs = Date.now() - start
|
|
60
|
+
return result
|
|
69
61
|
}
|
|
70
62
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const
|
|
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)
|
|
63
|
+
depGraph.clear()
|
|
64
|
+
const discoveredFiles = discoverDependencyGraph(normalizedEntries, depGraph)
|
|
65
|
+
const changedFiles = new Set<string>()
|
|
66
|
+
|
|
67
|
+
for (const file of discoveredFiles) {
|
|
68
|
+
if (cache.hasChanged(file)) changedFiles.add(file)
|
|
82
69
|
}
|
|
83
70
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
71
|
+
const dirtyFiles = depGraph.computeDirtySet(changedFiles)
|
|
72
|
+
for (const entry of normalizedEntries) {
|
|
73
|
+
if (!discoveredFiles.has(entry)) dirtyFiles.add(entry)
|
|
88
74
|
}
|
|
89
75
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
}
|
|
76
|
+
for (const entryFile of normalizedEntries) {
|
|
77
|
+
const entryDeps = depGraph.getTransitiveDeps(entryFile)
|
|
78
|
+
const entryUnit = new Set([entryFile, ...entryDeps])
|
|
79
|
+
const cachedEntry = cache.get(entryFile)
|
|
80
|
+
const cachedDepList = new Set(cachedEntry?.dependencies ?? [])
|
|
116
81
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
82
|
+
const hasDependencyDrift =
|
|
83
|
+
cachedDepList.size !== entryUnit.size ||
|
|
84
|
+
[...entryUnit].some(file => !cachedDepList.has(file))
|
|
85
|
+
|
|
86
|
+
const canUseCache =
|
|
87
|
+
!dirtyFiles.has(entryFile) &&
|
|
88
|
+
!hasDependencyDrift &&
|
|
89
|
+
!!cachedEntry?.outputFiles &&
|
|
90
|
+
cachedEntry.outputFiles.length > 0
|
|
91
|
+
|
|
92
|
+
if (canUseCache) {
|
|
93
|
+
writeBuildOutput(cachedEntry.outputFiles!, options.output)
|
|
121
94
|
result.cached++
|
|
95
|
+
result.skippedFiles.push(entryFile)
|
|
122
96
|
continue
|
|
123
97
|
}
|
|
124
98
|
|
|
125
|
-
// Cache miss — recompile
|
|
126
99
|
try {
|
|
127
|
-
const source = fs.readFileSync(
|
|
128
|
-
const ns = options.namespace ?? deriveNamespace(
|
|
129
|
-
const compileResult = compile(source, {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
100
|
+
const source = fs.readFileSync(entryFile, 'utf-8')
|
|
101
|
+
const ns = options.namespace ?? deriveNamespace(entryFile)
|
|
102
|
+
const compileResult = compile(source, {
|
|
103
|
+
namespace: ns,
|
|
104
|
+
filePath: entryFile,
|
|
105
|
+
generateSourceMap: options.generateSourceMap,
|
|
106
|
+
mcVersion: options.mcVersion,
|
|
107
|
+
lenient: options.lenient,
|
|
108
|
+
includeDirs: options.includeDirs,
|
|
109
|
+
})
|
|
110
|
+
const outputFiles = cloneFiles(compileResult.files)
|
|
111
|
+
const compiledFunctions = outputFiles
|
|
112
|
+
.filter(file => file.path.endsWith('.mcfunction'))
|
|
113
|
+
.map(file => file.path)
|
|
114
|
+
|
|
115
|
+
removeStaleOutputs(cachedEntry?.outputFiles ?? [], outputFiles, options.output)
|
|
116
|
+
|
|
117
|
+
for (const file of entryUnit) {
|
|
118
|
+
cache.update(file)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const entryRecord = cache.get(entryFile)
|
|
122
|
+
if (entryRecord) {
|
|
123
|
+
entryRecord.compiledFunctions = compiledFunctions
|
|
124
|
+
entryRecord.outputFiles = outputFiles
|
|
125
|
+
entryRecord.dependencies = [...entryUnit].sort()
|
|
137
126
|
}
|
|
138
127
|
|
|
139
|
-
|
|
140
|
-
writeBuildOutput(compileResult, options.output)
|
|
128
|
+
writeBuildOutput(outputFiles, options.output)
|
|
141
129
|
|
|
142
130
|
result.recompiled++
|
|
143
|
-
result.results.set(
|
|
131
|
+
result.results.set(entryFile, compileResult)
|
|
132
|
+
result.rebuiltFiles.push(entryFile)
|
|
144
133
|
} catch (err) {
|
|
145
|
-
result.errors.set(
|
|
134
|
+
result.errors.set(entryFile, (err as Error).message)
|
|
146
135
|
}
|
|
147
136
|
}
|
|
148
137
|
|
|
138
|
+
cache.save()
|
|
139
|
+
result.elapsedMs = Date.now() - start
|
|
149
140
|
return result
|
|
150
141
|
}
|
|
151
142
|
|
|
143
|
+
function discoverDependencyGraph(entries: string[], depGraph: DependencyGraph): Set<string> {
|
|
144
|
+
const visited = new Set<string>()
|
|
145
|
+
const queue = [...entries]
|
|
146
|
+
|
|
147
|
+
while (queue.length > 0) {
|
|
148
|
+
const current = path.resolve(queue.shift()!)
|
|
149
|
+
if (visited.has(current)) continue
|
|
150
|
+
visited.add(current)
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
const source = fs.readFileSync(current, 'utf-8')
|
|
154
|
+
depGraph.addFile(current, source)
|
|
155
|
+
const imports = parseImports(current, source)
|
|
156
|
+
for (const imported of imports) {
|
|
157
|
+
if (!visited.has(imported)) queue.push(imported)
|
|
158
|
+
}
|
|
159
|
+
} catch {
|
|
160
|
+
depGraph.removeFile(current)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return visited
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function cloneFiles(files: DatapackFile[]): DatapackFile[] {
|
|
168
|
+
return files.map(file => ({ path: file.path, content: file.content }))
|
|
169
|
+
}
|
|
170
|
+
|
|
152
171
|
/** Write compile output files to the output directory. */
|
|
153
|
-
function writeBuildOutput(
|
|
172
|
+
function writeBuildOutput(files: DatapackFile[], output: string): void {
|
|
154
173
|
fs.mkdirSync(output, { recursive: true })
|
|
155
|
-
for (const dataFile of
|
|
174
|
+
for (const dataFile of files) {
|
|
156
175
|
const filePath = path.join(output, dataFile.path)
|
|
157
176
|
const dir = path.dirname(filePath)
|
|
158
177
|
fs.mkdirSync(dir, { recursive: true })
|
|
@@ -160,14 +179,24 @@ function writeBuildOutput(compileResult: CompileResult, output: string): void {
|
|
|
160
179
|
}
|
|
161
180
|
}
|
|
162
181
|
|
|
182
|
+
function removeStaleOutputs(
|
|
183
|
+
previousFiles: DatapackFile[],
|
|
184
|
+
nextFiles: DatapackFile[],
|
|
185
|
+
output: string,
|
|
186
|
+
): void {
|
|
187
|
+
if (previousFiles.length === 0) return
|
|
188
|
+
const nextPaths = new Set(nextFiles.map(file => file.path))
|
|
189
|
+
|
|
190
|
+
for (const oldFile of previousFiles) {
|
|
191
|
+
if (nextPaths.has(oldFile.path)) continue
|
|
192
|
+
const targetPath = path.join(output, oldFile.path)
|
|
193
|
+
if (fs.existsSync(targetPath)) fs.rmSync(targetPath, { force: true })
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
163
197
|
function deriveNamespace(filePath: string): string {
|
|
164
198
|
const basename = path.basename(filePath, path.extname(filePath))
|
|
165
199
|
return basename.toLowerCase().replace(/[^a-z0-9]/g, '_')
|
|
166
200
|
}
|
|
167
201
|
|
|
168
|
-
|
|
169
|
-
* Reset the in-memory compile cache. Useful for testing.
|
|
170
|
-
*/
|
|
171
|
-
export function resetCompileCache(): void {
|
|
172
|
-
compiledCache.clear()
|
|
173
|
-
}
|
|
202
|
+
export function resetCompileCache(): void {}
|
package/src/cache/index.ts
CHANGED
|
@@ -1,24 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FileCache — content-hash-based compilation cache for incremental builds.
|
|
3
3
|
*
|
|
4
|
-
* Stores per-file content hashes and optional cached
|
|
5
|
-
* Persists to `.redscript-cache
|
|
4
|
+
* Stores per-file content hashes and optional cached output payloads.
|
|
5
|
+
* Persists to `.redscript-cache/cache.json`.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import * as fs from 'fs'
|
|
9
9
|
import * as path from 'path'
|
|
10
10
|
import * as crypto from 'crypto'
|
|
11
11
|
import type { HIRModule } from '../hir/types'
|
|
12
|
+
import type { DatapackFile } from '../emit'
|
|
13
|
+
|
|
14
|
+
export interface CachedOutputFile extends DatapackFile {}
|
|
12
15
|
|
|
13
16
|
export interface CacheEntry {
|
|
14
17
|
hash: string
|
|
15
18
|
mtime: number
|
|
16
19
|
hir?: HIRModule
|
|
20
|
+
compiledFunctions?: string[]
|
|
21
|
+
outputFiles?: CachedOutputFile[]
|
|
22
|
+
dependencies?: string[]
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
interface SerializedCache {
|
|
20
|
-
version:
|
|
21
|
-
entries: Record<
|
|
26
|
+
version: 2
|
|
27
|
+
entries: Record<
|
|
28
|
+
string,
|
|
29
|
+
{
|
|
30
|
+
hash: string
|
|
31
|
+
mtime: number
|
|
32
|
+
compiledFunctions?: string[]
|
|
33
|
+
outputFiles?: CachedOutputFile[]
|
|
34
|
+
dependencies?: string[]
|
|
35
|
+
}
|
|
36
|
+
>
|
|
22
37
|
}
|
|
23
38
|
|
|
24
39
|
export class FileCache {
|
|
@@ -102,12 +117,18 @@ export class FileCache {
|
|
|
102
117
|
save(): void {
|
|
103
118
|
fs.mkdirSync(this.cacheDir, { recursive: true })
|
|
104
119
|
const serialized: SerializedCache = {
|
|
105
|
-
version:
|
|
120
|
+
version: 2,
|
|
106
121
|
entries: {},
|
|
107
122
|
}
|
|
108
123
|
for (const [filePath, entry] of this.entries) {
|
|
109
124
|
// Don't persist HIR — it contains non-serializable references
|
|
110
|
-
serialized.entries[filePath] = {
|
|
125
|
+
serialized.entries[filePath] = {
|
|
126
|
+
hash: entry.hash,
|
|
127
|
+
mtime: entry.mtime,
|
|
128
|
+
compiledFunctions: entry.compiledFunctions,
|
|
129
|
+
outputFiles: entry.outputFiles,
|
|
130
|
+
dependencies: entry.dependencies,
|
|
131
|
+
}
|
|
111
132
|
}
|
|
112
133
|
const cachePath = path.join(this.cacheDir, 'cache.json')
|
|
113
134
|
fs.writeFileSync(cachePath, JSON.stringify(serialized, null, 2))
|
|
@@ -118,9 +139,15 @@ export class FileCache {
|
|
|
118
139
|
const cachePath = path.join(this.cacheDir, 'cache.json')
|
|
119
140
|
try {
|
|
120
141
|
const data = JSON.parse(fs.readFileSync(cachePath, 'utf-8')) as SerializedCache
|
|
121
|
-
if (data.version !==
|
|
142
|
+
if (data.version !== 2) return
|
|
122
143
|
for (const [filePath, entry] of Object.entries(data.entries)) {
|
|
123
|
-
this.entries.set(filePath, {
|
|
144
|
+
this.entries.set(filePath, {
|
|
145
|
+
hash: entry.hash,
|
|
146
|
+
mtime: entry.mtime,
|
|
147
|
+
compiledFunctions: entry.compiledFunctions,
|
|
148
|
+
outputFiles: entry.outputFiles,
|
|
149
|
+
dependencies: entry.dependencies,
|
|
150
|
+
})
|
|
124
151
|
}
|
|
125
152
|
} catch {
|
|
126
153
|
// No cache or corrupt — start fresh
|