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
package/dist/src/emit/index.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.emit = emit;
|
|
10
|
+
exports.flattenExecute = flattenExecute;
|
|
10
11
|
const sourcemap_1 = require("./sourcemap");
|
|
11
12
|
const mc_version_1 = require("../types/mc-version");
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
@@ -17,10 +18,17 @@ function emit(module, options) {
|
|
|
17
18
|
const tickFns = options.tickFunctions ?? [];
|
|
18
19
|
const loadFns = options.loadFunctions ?? [];
|
|
19
20
|
const scheduleFns = options.scheduleFunctions ?? [];
|
|
21
|
+
const watchFns = options.watchFunctions ?? [];
|
|
22
|
+
const profiledFns = options.profiledFunctions ?? [];
|
|
23
|
+
const enableProfiling = options.enableProfiling ?? false;
|
|
24
|
+
const throttleFns = options.throttleFunctions ?? [];
|
|
25
|
+
const retryFns = options.retryFunctions ?? [];
|
|
26
|
+
const memoizeFns = options.memoizeFunctions ?? [];
|
|
20
27
|
const objective = module.objective;
|
|
21
28
|
const genSourceMap = options.generateSourceMap ?? false;
|
|
22
29
|
const mcVersion = options.mcVersion ?? mc_version_1.DEFAULT_MC_VERSION;
|
|
23
30
|
const files = [];
|
|
31
|
+
const namespaceMapBuilder = genSourceMap ? new sourcemap_1.NamespaceSourceMapBuilder() : null;
|
|
24
32
|
// pack.mcmeta
|
|
25
33
|
files.push({
|
|
26
34
|
path: 'pack.mcmeta',
|
|
@@ -28,8 +36,22 @@ function emit(module, options) {
|
|
|
28
36
|
pack: { pack_format: 26, description: `RedScript datapack: ${namespace}` },
|
|
29
37
|
}, null, 2) + '\n',
|
|
30
38
|
});
|
|
39
|
+
const singletonObjectives = options.singletonObjectives ?? [];
|
|
31
40
|
// load.mcfunction — creates the scoreboard objective
|
|
32
|
-
const loadCmds = [
|
|
41
|
+
const loadCmds = [
|
|
42
|
+
`scoreboard objectives add ${objective} dummy`,
|
|
43
|
+
...watchFns.map(watch => `scoreboard objectives add ${watchPrevObjective(watch.name)} dummy`),
|
|
44
|
+
...singletonObjectives.map(obj => `scoreboard objectives add ${obj} dummy`),
|
|
45
|
+
...(enableProfiling && profiledFns.length > 0
|
|
46
|
+
? [
|
|
47
|
+
'scoreboard objectives add __time dummy',
|
|
48
|
+
'scoreboard objectives add __profile dummy',
|
|
49
|
+
]
|
|
50
|
+
: []),
|
|
51
|
+
...throttleFns.map(t => `scoreboard objectives add ${throttleObjective(t.name)} dummy`),
|
|
52
|
+
...retryFns.map(r => `scoreboard objectives add ${retryObjective(r.name)} dummy`),
|
|
53
|
+
...(memoizeFns.length > 0 ? [`scoreboard objectives add __memo dummy`] : []),
|
|
54
|
+
];
|
|
33
55
|
files.push({
|
|
34
56
|
path: `data/${namespace}/function/load.mcfunction`,
|
|
35
57
|
content: loadCmds.join('\n') + '\n',
|
|
@@ -37,9 +59,10 @@ function emit(module, options) {
|
|
|
37
59
|
// Each LIR function → .mcfunction file
|
|
38
60
|
for (const fn of module.functions) {
|
|
39
61
|
const fnPath = fnNameToPath(fn.name, namespace);
|
|
62
|
+
namespaceMapBuilder?.addFunctionMapping(qualifiedFunctionRef(fn.name, namespace), fn.sourceLoc, humanFunctionName(fn));
|
|
40
63
|
if (genSourceMap) {
|
|
41
64
|
const builder = new sourcemap_1.SourceMapBuilder(fnPath);
|
|
42
|
-
const lines =
|
|
65
|
+
const lines = emitFunction(fn, namespace, objective, mcVersion, enableProfiling && profiledFns.includes(fn.name), builder);
|
|
43
66
|
files.push({ path: fnPath, content: lines.join('\n') + '\n' });
|
|
44
67
|
const map = builder.build();
|
|
45
68
|
if (map) {
|
|
@@ -47,10 +70,27 @@ function emit(module, options) {
|
|
|
47
70
|
}
|
|
48
71
|
}
|
|
49
72
|
else {
|
|
50
|
-
const lines = emitFunction(fn, namespace, objective, mcVersion);
|
|
73
|
+
const lines = emitFunction(fn, namespace, objective, mcVersion, enableProfiling && profiledFns.includes(fn.name));
|
|
51
74
|
files.push({ path: fnPath, content: lines.join('\n') + '\n' });
|
|
52
75
|
}
|
|
53
76
|
}
|
|
77
|
+
const namespaceMap = namespaceMapBuilder?.build();
|
|
78
|
+
if (namespaceMap) {
|
|
79
|
+
files.push({
|
|
80
|
+
path: (0, sourcemap_1.namespaceSourceMapPath)(namespace),
|
|
81
|
+
content: (0, sourcemap_1.serializeSourceMap)(namespaceMap),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (enableProfiling && profiledFns.length > 0) {
|
|
85
|
+
files.push({
|
|
86
|
+
path: `data/${namespace}/function/__profiler_reset.mcfunction`,
|
|
87
|
+
content: emitProfilerReset(profiledFns).join('\n') + '\n',
|
|
88
|
+
});
|
|
89
|
+
files.push({
|
|
90
|
+
path: `data/${namespace}/function/__profiler_report.mcfunction`,
|
|
91
|
+
content: emitProfilerReport(profiledFns).join('\n') + '\n',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
54
94
|
// @schedule wrapper functions: _schedule_xxx → schedule function ns:xxx Nt
|
|
55
95
|
for (const { name, ticks } of scheduleFns) {
|
|
56
96
|
files.push({
|
|
@@ -58,6 +98,118 @@ function emit(module, options) {
|
|
|
58
98
|
content: `schedule function ${namespace}:${name} ${ticks}t\n`,
|
|
59
99
|
});
|
|
60
100
|
}
|
|
101
|
+
for (const watch of watchFns) {
|
|
102
|
+
const dispatcher = watchDispatcherName(watch.name);
|
|
103
|
+
const prevObjective = watchPrevObjective(watch.name);
|
|
104
|
+
const changedCondition = `unless score @s ${watch.objective} = @s ${prevObjective}`;
|
|
105
|
+
files.push({
|
|
106
|
+
path: fnNameToPath(dispatcher, namespace),
|
|
107
|
+
content: [
|
|
108
|
+
`execute as @a unless score @s ${prevObjective} = @s ${prevObjective} run scoreboard players operation @s ${prevObjective} = @s ${watch.objective}`,
|
|
109
|
+
`execute as @a ${changedCondition} run function ${namespace}:${watch.name}`,
|
|
110
|
+
`execute as @a ${changedCondition} run scoreboard players operation @s ${prevObjective} = @s ${watch.objective}`,
|
|
111
|
+
].join('\n') + '\n',
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// @throttle wrapper functions
|
|
115
|
+
for (const { name, ticks } of throttleFns) {
|
|
116
|
+
const obj = throttleObjective(name);
|
|
117
|
+
const inner = `${name}_inner`;
|
|
118
|
+
files.push({
|
|
119
|
+
path: fnNameToPath(throttleDispatcherName(name), namespace),
|
|
120
|
+
content: [
|
|
121
|
+
`scoreboard players add __throttle_${name} ${obj} 1`,
|
|
122
|
+
`execute if score __throttle_${name} ${obj} matches ${ticks}.. run function ${namespace}:${inner}`,
|
|
123
|
+
`execute if score __throttle_${name} ${obj} matches ${ticks}.. run scoreboard players set __throttle_${name} ${obj} 0`,
|
|
124
|
+
].join('\n') + '\n',
|
|
125
|
+
});
|
|
126
|
+
// Rename the original function to _inner by emitting a redirect wrapper:
|
|
127
|
+
// The original LIR function keeps its original name; the dispatcher wraps it.
|
|
128
|
+
// We just need the dispatcher to call the real function as <name>_inner.
|
|
129
|
+
// Actually: the original compiled function stays as <name>. We generate
|
|
130
|
+
// a wrapper at <name>_inner that simply calls <name>.
|
|
131
|
+
files.push({
|
|
132
|
+
path: fnNameToPath(inner, namespace),
|
|
133
|
+
content: `function ${namespace}:${name}\n`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// @retry wrapper functions
|
|
137
|
+
for (const { name, max } of retryFns) {
|
|
138
|
+
const obj = retryObjective(name);
|
|
139
|
+
const dispatcherName = retryDispatcherName(name);
|
|
140
|
+
// Dispatcher: if retries remaining > 0, call the function; if it returns 0, decrement counter
|
|
141
|
+
// We use a two-file approach:
|
|
142
|
+
// __retry_<name>: decrements counter then calls the real function
|
|
143
|
+
// __retry_<name>_init: sets the counter to max and schedules the first attempt
|
|
144
|
+
// Runtime logic:
|
|
145
|
+
// - On success (fn returns nonzero): reset counter to 0
|
|
146
|
+
// - On failure (fn returns 0): counter -= 1, schedule next tick
|
|
147
|
+
// Since we can't read a function return value in mcfunction directly,
|
|
148
|
+
// we use a storage-based approach: the function itself sets a "success" flag.
|
|
149
|
+
// Simpler scoreboard approach (matching task spec):
|
|
150
|
+
// __retry_<name> obj tracks remaining attempts
|
|
151
|
+
// Each tick, if counter > 0: call fn, if fn "failed" (set counter to 0 from outside) schedule retry
|
|
152
|
+
// Simplest correct approach:
|
|
153
|
+
// generate a tick-registered dispatcher that:
|
|
154
|
+
// 1. if counter > 0, call the function
|
|
155
|
+
// 2. function sets __retry_<name>_result to 1 on success (convention)
|
|
156
|
+
// 3. if result == 0, decrement counter; else reset counter
|
|
157
|
+
// For simplicity, use the same pattern as @throttle but inverted:
|
|
158
|
+
// The user's function sets a score $ret to signal success/failure.
|
|
159
|
+
// We wrap it: if counter > 0, run the function.
|
|
160
|
+
// After running, check $ret: if 0, keep counter; else reset to 0.
|
|
161
|
+
// Next tick the dispatcher will retry if counter > 0.
|
|
162
|
+
//
|
|
163
|
+
// Minimal correct implementation (matching task spec — fn returns 0 = failure):
|
|
164
|
+
// __retry_<name>_tick: registered as @tick
|
|
165
|
+
// execute if score __retry_<name> <obj> matches 1.. run function ns:<name>
|
|
166
|
+
// execute if score __retry_<name> <obj> matches 1.. if score $ret <obj> matches 0 run scoreboard players remove __retry_<name> <obj> 1
|
|
167
|
+
// execute if score __retry_<name> <obj> matches 1.. unless score $ret <obj> matches 0 run scoreboard players set __retry_<name> <obj> 0
|
|
168
|
+
// To start a retry sequence, something must set __retry_<name> <obj> to max.
|
|
169
|
+
// We generate __retry_<name>_start: scoreboard players set __retry_<name> <obj> <max>
|
|
170
|
+
files.push({
|
|
171
|
+
path: fnNameToPath(dispatcherName, namespace),
|
|
172
|
+
content: [
|
|
173
|
+
`execute if score __retry_${name} ${obj} matches 1.. run function ${namespace}:${name}`,
|
|
174
|
+
`execute if score __retry_${name} ${obj} matches 1.. if score $ret ${obj} matches 0 run scoreboard players remove __retry_${name} ${obj} 1`,
|
|
175
|
+
`execute if score __retry_${name} ${obj} matches 1.. unless score $ret ${obj} matches 0 run scoreboard players set __retry_${name} ${obj} 0`,
|
|
176
|
+
].join('\n') + '\n',
|
|
177
|
+
});
|
|
178
|
+
files.push({
|
|
179
|
+
path: fnNameToPath(`${name}_start`, namespace),
|
|
180
|
+
content: `scoreboard players set __retry_${name} ${obj} ${max}\n`,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
// @memoize wrapper functions (LRU-1 cache: last call arg/result)
|
|
184
|
+
// The original compiled function has been renamed to <name>_impl.
|
|
185
|
+
// We generate <name>.mcfunction as the public entry point with cache logic:
|
|
186
|
+
// Players in __memo objective:
|
|
187
|
+
// __memo_<name>_key — cached argument value
|
|
188
|
+
// __memo_<name>_val — cached return value
|
|
189
|
+
// __memo_<name>_hit — 1 if a cached result is available
|
|
190
|
+
// On call ($p0 = argument):
|
|
191
|
+
// 1. If __memo_<name>_hit == 1 AND __memo_<name>_key == $p0 → copy cached val to $ret, return
|
|
192
|
+
// 2. Otherwise: call <name>_impl, store $p0 → key, $ret → val, set hit=1
|
|
193
|
+
for (const name of memoizeFns) {
|
|
194
|
+
const keyPlayer = `__memo_${name}_key`;
|
|
195
|
+
const valPlayer = `__memo_${name}_val`;
|
|
196
|
+
const hitPlayer = `__memo_${name}_hit`;
|
|
197
|
+
const implName = `${name}_impl`;
|
|
198
|
+
files.push({
|
|
199
|
+
path: fnNameToPath(name, namespace),
|
|
200
|
+
content: [
|
|
201
|
+
`# @memoize wrapper for ${name} (LRU-1 cache)`,
|
|
202
|
+
`# Cache hit: valid flag set AND key matches current arg`,
|
|
203
|
+
`execute if score ${hitPlayer} __memo matches 1 if score ${keyPlayer} __memo = $p0 ${objective} run scoreboard players operation $ret ${objective} = ${valPlayer} __memo`,
|
|
204
|
+
`execute if score ${hitPlayer} __memo matches 1 if score ${keyPlayer} __memo = $p0 ${objective} run return 0`,
|
|
205
|
+
`# Cache miss: call implementation, store result`,
|
|
206
|
+
`function ${namespace}:${implName}`,
|
|
207
|
+
`scoreboard players operation ${keyPlayer} __memo = $p0 ${objective}`,
|
|
208
|
+
`scoreboard players operation ${valPlayer} __memo = $ret ${objective}`,
|
|
209
|
+
`scoreboard players set ${hitPlayer} __memo 1`,
|
|
210
|
+
].join('\n') + '\n',
|
|
211
|
+
});
|
|
212
|
+
}
|
|
61
213
|
// Tag files for tick/load
|
|
62
214
|
if (loadFns.length > 0 || true) {
|
|
63
215
|
// Always include load.json — it must reference the load.mcfunction
|
|
@@ -67,8 +219,14 @@ function emit(module, options) {
|
|
|
67
219
|
content: JSON.stringify({ values: loadValues }, null, 2) + '\n',
|
|
68
220
|
});
|
|
69
221
|
}
|
|
70
|
-
|
|
71
|
-
|
|
222
|
+
const allTickFns = [
|
|
223
|
+
...tickFns,
|
|
224
|
+
...watchFns.map(watch => watchDispatcherName(watch.name)),
|
|
225
|
+
...throttleFns.map(t => throttleDispatcherName(t.name)),
|
|
226
|
+
...retryFns.map(r => retryDispatcherName(r.name)),
|
|
227
|
+
];
|
|
228
|
+
if (allTickFns.length > 0) {
|
|
229
|
+
const tickValues = allTickFns.map(fn => `${namespace}:${fn}`);
|
|
72
230
|
files.push({
|
|
73
231
|
path: 'data/minecraft/tags/function/tick.json',
|
|
74
232
|
content: JSON.stringify({ values: tickValues }, null, 2) + '\n',
|
|
@@ -98,18 +256,30 @@ function emit(module, options) {
|
|
|
98
256
|
// ---------------------------------------------------------------------------
|
|
99
257
|
// Function emission
|
|
100
258
|
// ---------------------------------------------------------------------------
|
|
101
|
-
function emitFunction(fn, namespace, objective, mcVersion) {
|
|
259
|
+
function emitFunction(fn, namespace, objective, mcVersion, isProfiled = false, builder) {
|
|
102
260
|
const lines = [];
|
|
103
|
-
|
|
104
|
-
lines.push(
|
|
261
|
+
const pushLine = (line, sourceLoc) => {
|
|
262
|
+
lines.push(line);
|
|
263
|
+
builder?.addLine(sourceLoc);
|
|
264
|
+
};
|
|
265
|
+
for (const line of emitFunctionHeader(fn))
|
|
266
|
+
pushLine(line);
|
|
267
|
+
if (isProfiled) {
|
|
268
|
+
for (const line of profilerStartLines(fn.name))
|
|
269
|
+
pushLine(line);
|
|
105
270
|
}
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
function emitFunctionWithSourceMap(fn, namespace, objective, builder, mcVersion) {
|
|
109
|
-
const lines = [];
|
|
271
|
+
let lastSourceMarker;
|
|
110
272
|
for (const instr of fn.instructions) {
|
|
111
|
-
|
|
112
|
-
|
|
273
|
+
const marker = instr.sourceLoc ? formatSourceMarker(instr.sourceLoc) : undefined;
|
|
274
|
+
if (marker && marker !== lastSourceMarker) {
|
|
275
|
+
pushLine(`# src: ${marker}`);
|
|
276
|
+
lastSourceMarker = marker;
|
|
277
|
+
}
|
|
278
|
+
pushLine(flattenExecute(emitInstr(instr, namespace, objective, mcVersion)), instr.sourceLoc);
|
|
279
|
+
}
|
|
280
|
+
if (isProfiled) {
|
|
281
|
+
for (const line of profilerEndLines(fn.name))
|
|
282
|
+
pushLine(line);
|
|
113
283
|
}
|
|
114
284
|
return lines;
|
|
115
285
|
}
|
|
@@ -118,6 +288,85 @@ function fnNameToPath(name, namespace) {
|
|
|
118
288
|
const mcName = name.replace(/::/g, '/').toLowerCase();
|
|
119
289
|
return `data/${namespace}/function/${mcName}.mcfunction`;
|
|
120
290
|
}
|
|
291
|
+
function qualifiedFunctionRef(name, namespace) {
|
|
292
|
+
return `${namespace}:${name.replace(/::/g, '/').toLowerCase()}`;
|
|
293
|
+
}
|
|
294
|
+
function humanFunctionName(fn) {
|
|
295
|
+
const match = fn.sourceSnippet?.match(/^fn\s+([^(]+)/);
|
|
296
|
+
return match?.[1] ?? fn.name.split('::').pop() ?? fn.name;
|
|
297
|
+
}
|
|
298
|
+
function emitFunctionHeader(fn) {
|
|
299
|
+
if (!fn.sourceLoc)
|
|
300
|
+
return [];
|
|
301
|
+
const lines = [];
|
|
302
|
+
lines.push(`# Generated from: ${fn.sourceLoc.file}:${fn.sourceLoc.line} (fn ${humanFunctionName(fn)})`);
|
|
303
|
+
if (fn.sourceSnippet) {
|
|
304
|
+
lines.push(`# Source: ${fn.sourceSnippet}`);
|
|
305
|
+
}
|
|
306
|
+
return lines;
|
|
307
|
+
}
|
|
308
|
+
function formatSourceMarker(sourceLoc) {
|
|
309
|
+
return `${sourceLoc.file}:${sourceLoc.line}`;
|
|
310
|
+
}
|
|
311
|
+
function watchDispatcherName(name) {
|
|
312
|
+
return `__watch_${name}`;
|
|
313
|
+
}
|
|
314
|
+
function watchPrevObjective(name) {
|
|
315
|
+
return `__watch_${name}_prev`;
|
|
316
|
+
}
|
|
317
|
+
function throttleDispatcherName(name) {
|
|
318
|
+
return `__throttle_${name}`;
|
|
319
|
+
}
|
|
320
|
+
function throttleObjective(name) {
|
|
321
|
+
return `__throttle`;
|
|
322
|
+
}
|
|
323
|
+
function retryDispatcherName(name) {
|
|
324
|
+
return `__retry_${name}`;
|
|
325
|
+
}
|
|
326
|
+
function retryObjective(name) {
|
|
327
|
+
return `__retry`;
|
|
328
|
+
}
|
|
329
|
+
function profilerSafeName(name) {
|
|
330
|
+
return name.replace(/[^A-Za-z0-9_]/g, '_');
|
|
331
|
+
}
|
|
332
|
+
function profilerStartPlayer(name) {
|
|
333
|
+
return `#prof_start_${profilerSafeName(name)}`;
|
|
334
|
+
}
|
|
335
|
+
function profilerDeltaPlayer(name) {
|
|
336
|
+
return `#prof_delta_${profilerSafeName(name)}`;
|
|
337
|
+
}
|
|
338
|
+
function profilerTotalPlayer(name) {
|
|
339
|
+
return `#prof_total_${profilerSafeName(name)}`;
|
|
340
|
+
}
|
|
341
|
+
function profilerCountPlayer(name) {
|
|
342
|
+
return `#prof_count_${profilerSafeName(name)}`;
|
|
343
|
+
}
|
|
344
|
+
function profilerStartLines(name) {
|
|
345
|
+
return [
|
|
346
|
+
`# __profiler_start_${name}`,
|
|
347
|
+
`scoreboard players set ${profilerStartPlayer(name)} __time 0`,
|
|
348
|
+
`execute store result score ${profilerStartPlayer(name)} __time run time query gametime`,
|
|
349
|
+
];
|
|
350
|
+
}
|
|
351
|
+
function profilerEndLines(name) {
|
|
352
|
+
return [
|
|
353
|
+
`# __profiler_end_${name}`,
|
|
354
|
+
`scoreboard players set ${profilerDeltaPlayer(name)} __time 0`,
|
|
355
|
+
`execute store result score ${profilerDeltaPlayer(name)} __time run time query gametime`,
|
|
356
|
+
`scoreboard players operation ${profilerDeltaPlayer(name)} __time -= ${profilerStartPlayer(name)} __time`,
|
|
357
|
+
`scoreboard players operation ${profilerTotalPlayer(name)} __profile += ${profilerDeltaPlayer(name)} __time`,
|
|
358
|
+
`scoreboard players add ${profilerCountPlayer(name)} __profile 1`,
|
|
359
|
+
];
|
|
360
|
+
}
|
|
361
|
+
function emitProfilerReset(profiledFns) {
|
|
362
|
+
return profiledFns.flatMap(name => [
|
|
363
|
+
`scoreboard players set ${profilerTotalPlayer(name)} __profile 0`,
|
|
364
|
+
`scoreboard players set ${profilerCountPlayer(name)} __profile 0`,
|
|
365
|
+
]);
|
|
366
|
+
}
|
|
367
|
+
function emitProfilerReport(profiledFns) {
|
|
368
|
+
return profiledFns.map(name => (`tellraw @a [{"text":"[profile] ${name}: total="},{"score":{"name":"${profilerTotalPlayer(name)}","objective":"__profile"}},{"text":" ticks count="},{"score":{"name":"${profilerCountPlayer(name)}","objective":"__profile"}}]`));
|
|
369
|
+
}
|
|
121
370
|
// ---------------------------------------------------------------------------
|
|
122
371
|
// Instruction emission
|
|
123
372
|
// ---------------------------------------------------------------------------
|
|
@@ -215,6 +464,50 @@ function macroLineCompat(template) {
|
|
|
215
464
|
// Replace $(param) with data-get-style substitution marker
|
|
216
465
|
return template.replace(/\$\((\w+)\)/g, (_m, p) => `{storage:rs:macro_args,path:${p}}`);
|
|
217
466
|
}
|
|
467
|
+
// ---------------------------------------------------------------------------
|
|
468
|
+
// Execute Chain Optimization
|
|
469
|
+
// ---------------------------------------------------------------------------
|
|
470
|
+
/**
|
|
471
|
+
* Flatten nested execute-if chains into a single execute with multiple conditions.
|
|
472
|
+
*
|
|
473
|
+
* MC allows chaining conditions:
|
|
474
|
+
* execute if A run execute if B run X
|
|
475
|
+
* can be written as:
|
|
476
|
+
* execute if A if B run X
|
|
477
|
+
*
|
|
478
|
+
* This reduces command-parsing overhead and improves TPS.
|
|
479
|
+
*
|
|
480
|
+
* Rules:
|
|
481
|
+
* - Only merges when the inner `run` clause is itself `execute if ...`
|
|
482
|
+
* - Does NOT merge `if ... run execute unless ...` — semantics differ
|
|
483
|
+
* (unless negates, changing behavior in chain context)
|
|
484
|
+
* - Recursively flattens deeper nesting (3+ levels)
|
|
485
|
+
*/
|
|
486
|
+
function flattenExecute(cmd) {
|
|
487
|
+
// Match: execute <conditions> run execute if <rest>
|
|
488
|
+
// We only flatten when the inner execute starts with "if" (not "unless", "as", "at", etc.)
|
|
489
|
+
// Pattern: "execute <prefix> run execute if <suffix>"
|
|
490
|
+
const RUN_EXECUTE_IF = / run execute if /;
|
|
491
|
+
if (!RUN_EXECUTE_IF.test(cmd)) {
|
|
492
|
+
return cmd;
|
|
493
|
+
}
|
|
494
|
+
// Find the " run execute if " boundary
|
|
495
|
+
const idx = cmd.indexOf(' run execute if ');
|
|
496
|
+
if (idx === -1)
|
|
497
|
+
return cmd;
|
|
498
|
+
const outer = cmd.slice(0, idx); // "execute if A"
|
|
499
|
+
const inner = cmd.slice(idx + ' run '.length); // "execute if B run X"
|
|
500
|
+
// The outer must start with "execute"
|
|
501
|
+
if (!outer.startsWith('execute '))
|
|
502
|
+
return cmd;
|
|
503
|
+
// Inner starts with "execute if ..."
|
|
504
|
+
// Strip the "execute" prefix from inner to get the conditions + run tail
|
|
505
|
+
// Result: outer + " " + inner_conditions_and_tail
|
|
506
|
+
const innerWithoutExecute = inner.slice('execute '.length); // "if B run X"
|
|
507
|
+
const merged = `${outer} ${innerWithoutExecute}`;
|
|
508
|
+
// Recurse to handle 3+ levels
|
|
509
|
+
return flattenExecute(merged);
|
|
510
|
+
}
|
|
218
511
|
function emitSubcmd(sub) {
|
|
219
512
|
switch (sub.kind) {
|
|
220
513
|
case 'as':
|
package/dist/src/emit/modules.js
CHANGED
|
@@ -40,6 +40,9 @@ function compileModules(modules, options = {}) {
|
|
|
40
40
|
const tokens = lexer.tokenize();
|
|
41
41
|
const parser = new parser_1.Parser(tokens, mod.source, mod.filePath);
|
|
42
42
|
const ast = parser.parse(namespace);
|
|
43
|
+
if (parser.parseErrors.length > 0) {
|
|
44
|
+
throw parser.parseErrors[0];
|
|
45
|
+
}
|
|
43
46
|
// Verify declared module name matches provided name
|
|
44
47
|
const declaredName = ast.moduleName;
|
|
45
48
|
if (declaredName && declaredName !== mod.name) {
|
|
@@ -76,7 +79,13 @@ function compileModules(modules, options = {}) {
|
|
|
76
79
|
if (!sourceExports) {
|
|
77
80
|
throw new diagnostics_1.DiagnosticError('LoweringError', `Module '${imp.moduleName}' not found (imported in '${modName}')`, { file: ast.namespace, line: 1, col: 1 });
|
|
78
81
|
}
|
|
79
|
-
if (imp.symbol ===
|
|
82
|
+
if (imp.symbol === undefined) {
|
|
83
|
+
// Whole-module file import (`import player_utils;`) — not a symbol import;
|
|
84
|
+
// this is resolved by the file-level compile() function, not compileModules.
|
|
85
|
+
// Skip here to avoid treating it as a cross-module symbol reference.
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
else if (imp.symbol === '*') {
|
|
80
89
|
// Wildcard: import all exports
|
|
81
90
|
for (const sym of sourceExports) {
|
|
82
91
|
resolved.set(sym, `${imp.moduleName}/${sym}`);
|
|
@@ -101,6 +110,8 @@ function compileModules(modules, options = {}) {
|
|
|
101
110
|
}
|
|
102
111
|
for (const ast of parsedModules.values()) {
|
|
103
112
|
for (const imp of ast.imports) {
|
|
113
|
+
if (imp.symbol === undefined)
|
|
114
|
+
continue; // whole-module file import, skip
|
|
104
115
|
const used = usedExports.get(imp.moduleName);
|
|
105
116
|
if (!used)
|
|
106
117
|
continue;
|
|
@@ -261,6 +272,7 @@ function compileSingleModule(ast, namespace, objective, moduleName, filePath) {
|
|
|
261
272
|
// Extract decorator metadata
|
|
262
273
|
const tickFunctions = [];
|
|
263
274
|
const loadFunctions = [];
|
|
275
|
+
const watchFunctions = [];
|
|
264
276
|
const coroutineInfos = [];
|
|
265
277
|
const scheduleFunctions = [];
|
|
266
278
|
for (const fn of hir.functions) {
|
|
@@ -269,6 +281,9 @@ function compileSingleModule(ast, namespace, objective, moduleName, filePath) {
|
|
|
269
281
|
tickFunctions.push(fn.name);
|
|
270
282
|
if (dec.name === 'load')
|
|
271
283
|
loadFunctions.push(fn.name);
|
|
284
|
+
if (dec.name === 'watch' && dec.args?.objective) {
|
|
285
|
+
watchFunctions.push({ name: fn.name, objective: dec.args.objective });
|
|
286
|
+
}
|
|
272
287
|
if (dec.name === 'coroutine') {
|
|
273
288
|
coroutineInfos.push({ fnName: fn.name, batch: dec.args?.batch ?? 10, onDone: dec.args?.onDone });
|
|
274
289
|
}
|
|
@@ -287,7 +302,7 @@ function compileSingleModule(ast, namespace, objective, moduleName, filePath) {
|
|
|
287
302
|
const lir = (0, lower_3.lowerToLIR)(mirFinal);
|
|
288
303
|
lir.objective = objective;
|
|
289
304
|
const lirOpt = (0, pipeline_2.lirOptimizeModule)(lir);
|
|
290
|
-
const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions });
|
|
305
|
+
const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, watchFunctions, scheduleFunctions });
|
|
291
306
|
// For named modules: rename the load.mcfunction to avoid path collision.
|
|
292
307
|
// Rename `data/${ns}/function/load.mcfunction` → `data/${ns}/function/${modName}/_load.mcfunction`
|
|
293
308
|
// and update the load tag reference accordingly.
|
|
@@ -429,7 +444,10 @@ function rewriteStmt(stmt, symbolMap) {
|
|
|
429
444
|
case 'let_destruct':
|
|
430
445
|
rewriteExpr(stmt.init, symbolMap);
|
|
431
446
|
break;
|
|
432
|
-
|
|
447
|
+
case 'labeled_loop':
|
|
448
|
+
rewriteStmt(stmt.body, symbolMap);
|
|
449
|
+
break;
|
|
450
|
+
// break, continue, break_label, continue_label, raw: nothing to rewrite
|
|
433
451
|
}
|
|
434
452
|
}
|
|
435
453
|
function rewriteExpr(expr, symbolMap) {
|
|
@@ -1,40 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Source
|
|
3
|
-
*
|
|
4
|
-
* For each generated .mcfunction file, produces a parallel sourcemap.json
|
|
5
|
-
* that maps output line numbers back to .mcrs source locations.
|
|
6
|
-
*
|
|
7
|
-
* Format:
|
|
8
|
-
* {
|
|
9
|
-
* "version": 1,
|
|
10
|
-
* "generatedFile": "data/ns/function/main.mcfunction",
|
|
11
|
-
* "sources": ["src/main.mcrs"],
|
|
12
|
-
* "mappings": [
|
|
13
|
-
* { "line": 1, "source": 0, "sourceLine": 5, "sourceCol": 2 },
|
|
14
|
-
* ...
|
|
15
|
-
* ]
|
|
16
|
-
* }
|
|
2
|
+
* Source map helpers for emitted `.mcfunction` files.
|
|
17
3
|
*/
|
|
18
4
|
import type { SourceLoc } from '../lir/types';
|
|
19
5
|
export interface SourceMapEntry {
|
|
20
|
-
/** 1-based output line number in the .mcfunction file */
|
|
21
6
|
line: number;
|
|
22
|
-
/** Index into the `sources` array */
|
|
23
7
|
source: number;
|
|
24
|
-
/** 1-based line in the source .mcrs file */
|
|
25
8
|
sourceLine: number;
|
|
26
|
-
/** 1-based column in the source .mcrs file */
|
|
27
9
|
sourceCol: number;
|
|
28
10
|
}
|
|
29
11
|
export interface SourceMap {
|
|
30
12
|
version: 1;
|
|
31
|
-
/** Relative path to the generated .mcfunction file */
|
|
32
13
|
generatedFile: string;
|
|
33
|
-
/** List of source file paths referenced by mappings */
|
|
34
14
|
sources: string[];
|
|
35
|
-
/** One entry per mapped output line */
|
|
36
15
|
mappings: SourceMapEntry[];
|
|
37
16
|
}
|
|
17
|
+
export interface NamespaceSourceMapEntry {
|
|
18
|
+
source: number;
|
|
19
|
+
line: number;
|
|
20
|
+
col?: number;
|
|
21
|
+
name?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface NamespaceSourceMap {
|
|
24
|
+
version: 1;
|
|
25
|
+
sources: string[];
|
|
26
|
+
mappings: Record<string, NamespaceSourceMapEntry>;
|
|
27
|
+
}
|
|
38
28
|
export declare class SourceMapBuilder {
|
|
39
29
|
private readonly generatedFile;
|
|
40
30
|
private readonly sourceIndex;
|
|
@@ -42,12 +32,18 @@ export declare class SourceMapBuilder {
|
|
|
42
32
|
private readonly mappings;
|
|
43
33
|
private lineNumber;
|
|
44
34
|
constructor(generatedFile: string);
|
|
45
|
-
/** Record the source location for the next output line. */
|
|
46
35
|
addLine(sourceLoc: SourceLoc | undefined): void;
|
|
47
|
-
/** Return the completed SourceMap, or null if there are no mappings. */
|
|
48
36
|
build(): SourceMap | null;
|
|
37
|
+
private getSourceIndex;
|
|
38
|
+
}
|
|
39
|
+
export declare class NamespaceSourceMapBuilder {
|
|
40
|
+
private readonly sourceIndex;
|
|
41
|
+
private readonly sources;
|
|
42
|
+
private readonly mappings;
|
|
43
|
+
addFunctionMapping(functionName: string, sourceLoc: SourceLoc | undefined, name?: string): void;
|
|
44
|
+
build(): NamespaceSourceMap | null;
|
|
45
|
+
private getSourceIndex;
|
|
49
46
|
}
|
|
50
|
-
|
|
51
|
-
export declare function serializeSourceMap(map: SourceMap): string;
|
|
52
|
-
/** Given a .mcfunction path, return the path for the sidecar sourcemap.json. */
|
|
47
|
+
export declare function serializeSourceMap(map: SourceMap | NamespaceSourceMap): string;
|
|
53
48
|
export declare function sourceMapPath(mcfunctionPath: string): string;
|
|
49
|
+
export declare function namespaceSourceMapPath(namespace: string): string;
|
|
@@ -1,28 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Source
|
|
4
|
-
*
|
|
5
|
-
* For each generated .mcfunction file, produces a parallel sourcemap.json
|
|
6
|
-
* that maps output line numbers back to .mcrs source locations.
|
|
7
|
-
*
|
|
8
|
-
* Format:
|
|
9
|
-
* {
|
|
10
|
-
* "version": 1,
|
|
11
|
-
* "generatedFile": "data/ns/function/main.mcfunction",
|
|
12
|
-
* "sources": ["src/main.mcrs"],
|
|
13
|
-
* "mappings": [
|
|
14
|
-
* { "line": 1, "source": 0, "sourceLine": 5, "sourceCol": 2 },
|
|
15
|
-
* ...
|
|
16
|
-
* ]
|
|
17
|
-
* }
|
|
3
|
+
* Source map helpers for emitted `.mcfunction` files.
|
|
18
4
|
*/
|
|
19
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.SourceMapBuilder = void 0;
|
|
6
|
+
exports.NamespaceSourceMapBuilder = exports.SourceMapBuilder = void 0;
|
|
21
7
|
exports.serializeSourceMap = serializeSourceMap;
|
|
22
8
|
exports.sourceMapPath = sourceMapPath;
|
|
23
|
-
|
|
24
|
-
// Builder — accumulates mappings as lines are emitted
|
|
25
|
-
// ---------------------------------------------------------------------------
|
|
9
|
+
exports.namespaceSourceMapPath = namespaceSourceMapPath;
|
|
26
10
|
class SourceMapBuilder {
|
|
27
11
|
constructor(generatedFile) {
|
|
28
12
|
this.sourceIndex = new Map();
|
|
@@ -31,25 +15,17 @@ class SourceMapBuilder {
|
|
|
31
15
|
this.lineNumber = 0;
|
|
32
16
|
this.generatedFile = generatedFile;
|
|
33
17
|
}
|
|
34
|
-
/** Record the source location for the next output line. */
|
|
35
18
|
addLine(sourceLoc) {
|
|
36
19
|
this.lineNumber++;
|
|
37
20
|
if (!sourceLoc)
|
|
38
21
|
return;
|
|
39
|
-
let idx = this.sourceIndex.get(sourceLoc.file);
|
|
40
|
-
if (idx === undefined) {
|
|
41
|
-
idx = this.sources.length;
|
|
42
|
-
this.sources.push(sourceLoc.file);
|
|
43
|
-
this.sourceIndex.set(sourceLoc.file, idx);
|
|
44
|
-
}
|
|
45
22
|
this.mappings.push({
|
|
46
23
|
line: this.lineNumber,
|
|
47
|
-
source:
|
|
24
|
+
source: this.getSourceIndex(sourceLoc.file),
|
|
48
25
|
sourceLine: sourceLoc.line,
|
|
49
26
|
sourceCol: sourceLoc.col,
|
|
50
27
|
});
|
|
51
28
|
}
|
|
52
|
-
/** Return the completed SourceMap, or null if there are no mappings. */
|
|
53
29
|
build() {
|
|
54
30
|
if (this.mappings.length === 0)
|
|
55
31
|
return null;
|
|
@@ -60,14 +36,60 @@ class SourceMapBuilder {
|
|
|
60
36
|
mappings: [...this.mappings],
|
|
61
37
|
};
|
|
62
38
|
}
|
|
39
|
+
getSourceIndex(file) {
|
|
40
|
+
let idx = this.sourceIndex.get(file);
|
|
41
|
+
if (idx === undefined) {
|
|
42
|
+
idx = this.sources.length;
|
|
43
|
+
this.sources.push(file);
|
|
44
|
+
this.sourceIndex.set(file, idx);
|
|
45
|
+
}
|
|
46
|
+
return idx;
|
|
47
|
+
}
|
|
63
48
|
}
|
|
64
49
|
exports.SourceMapBuilder = SourceMapBuilder;
|
|
65
|
-
|
|
50
|
+
class NamespaceSourceMapBuilder {
|
|
51
|
+
constructor() {
|
|
52
|
+
this.sourceIndex = new Map();
|
|
53
|
+
this.sources = [];
|
|
54
|
+
this.mappings = {};
|
|
55
|
+
}
|
|
56
|
+
addFunctionMapping(functionName, sourceLoc, name) {
|
|
57
|
+
if (!sourceLoc)
|
|
58
|
+
return;
|
|
59
|
+
this.mappings[functionName] = {
|
|
60
|
+
source: this.getSourceIndex(sourceLoc.file),
|
|
61
|
+
line: sourceLoc.line,
|
|
62
|
+
col: sourceLoc.col,
|
|
63
|
+
...(name ? { name } : {}),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
build() {
|
|
67
|
+
if (Object.keys(this.mappings).length === 0)
|
|
68
|
+
return null;
|
|
69
|
+
return {
|
|
70
|
+
version: 1,
|
|
71
|
+
sources: [...this.sources],
|
|
72
|
+
mappings: { ...this.mappings },
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
getSourceIndex(file) {
|
|
76
|
+
let idx = this.sourceIndex.get(file);
|
|
77
|
+
if (idx === undefined) {
|
|
78
|
+
idx = this.sources.length;
|
|
79
|
+
this.sources.push(file);
|
|
80
|
+
this.sourceIndex.set(file, idx);
|
|
81
|
+
}
|
|
82
|
+
return idx;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.NamespaceSourceMapBuilder = NamespaceSourceMapBuilder;
|
|
66
86
|
function serializeSourceMap(map) {
|
|
67
87
|
return JSON.stringify(map, null, 2) + '\n';
|
|
68
88
|
}
|
|
69
|
-
/** Given a .mcfunction path, return the path for the sidecar sourcemap.json. */
|
|
70
89
|
function sourceMapPath(mcfunctionPath) {
|
|
71
90
|
return mcfunctionPath.replace(/\.mcfunction$/, '.sourcemap.json');
|
|
72
91
|
}
|
|
92
|
+
function namespaceSourceMapPath(namespace) {
|
|
93
|
+
return `${namespace}.sourcemap.json`;
|
|
94
|
+
}
|
|
73
95
|
//# sourceMappingURL=sourcemap.js.map
|