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/compile.js
CHANGED
|
@@ -4,14 +4,50 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Pipeline: source → Lexer → Parser → TypeCheck → HIR → MIR → optimize → LIR → emit
|
|
6
6
|
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
7
40
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
41
|
exports.compile = compile;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
9
44
|
const lexer_1 = require("../lexer");
|
|
10
45
|
const parser_1 = require("../parser");
|
|
11
46
|
const compile_1 = require("../compile");
|
|
12
47
|
const diagnostics_1 = require("../diagnostics");
|
|
13
48
|
const lower_1 = require("../hir/lower");
|
|
14
49
|
const monomorphize_1 = require("../hir/monomorphize");
|
|
50
|
+
const deprecated_1 = require("../hir/deprecated");
|
|
15
51
|
const lower_2 = require("../mir/lower");
|
|
16
52
|
const pipeline_1 = require("../optimizer/pipeline");
|
|
17
53
|
const lower_3 = require("../lir/lower");
|
|
@@ -22,39 +58,153 @@ const budget_1 = require("../lir/budget");
|
|
|
22
58
|
const mc_version_1 = require("../types/mc-version");
|
|
23
59
|
const typechecker_1 = require("../typechecker");
|
|
24
60
|
const types_1 = require("../events/types");
|
|
61
|
+
function annotateFunctionSourceFiles(program, sourceFile) {
|
|
62
|
+
if (!sourceFile)
|
|
63
|
+
return;
|
|
64
|
+
for (const fn of program.declarations)
|
|
65
|
+
fn.sourceFile = sourceFile;
|
|
66
|
+
for (const impl of program.implBlocks) {
|
|
67
|
+
for (const method of impl.methods)
|
|
68
|
+
method.sourceFile = sourceFile;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function pruneLibraryFunctionFiles(files, libraryPaths) {
|
|
72
|
+
if (libraryPaths.size === 0)
|
|
73
|
+
return files;
|
|
74
|
+
const fnPathToFilePath = new Map();
|
|
75
|
+
for (const file of files) {
|
|
76
|
+
const match = file.path.match(/^data\/([^/]+)\/function\/(.+)\.mcfunction$/);
|
|
77
|
+
if (match) {
|
|
78
|
+
fnPathToFilePath.set(`${match[1]}:${match[2]}`, file.path);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const callGraph = new Map();
|
|
82
|
+
const callPattern = /\bfunction\s+([\w\-]+:[\w\-./]+)/g;
|
|
83
|
+
for (const file of files) {
|
|
84
|
+
if (!file.path.endsWith('.mcfunction'))
|
|
85
|
+
continue;
|
|
86
|
+
const called = new Set();
|
|
87
|
+
let match;
|
|
88
|
+
callPattern.lastIndex = 0;
|
|
89
|
+
while ((match = callPattern.exec(file.content)) !== null) {
|
|
90
|
+
called.add(match[1]);
|
|
91
|
+
}
|
|
92
|
+
callGraph.set(file.path, called);
|
|
93
|
+
}
|
|
94
|
+
const reachableFiles = new Set();
|
|
95
|
+
const queue = [];
|
|
96
|
+
for (const file of files) {
|
|
97
|
+
if (!file.path.endsWith('.mcfunction'))
|
|
98
|
+
continue;
|
|
99
|
+
if (libraryPaths.has(file.path))
|
|
100
|
+
continue;
|
|
101
|
+
queue.push(file.path);
|
|
102
|
+
reachableFiles.add(file.path);
|
|
103
|
+
}
|
|
104
|
+
while (queue.length > 0) {
|
|
105
|
+
const current = queue.shift();
|
|
106
|
+
const called = callGraph.get(current) ?? new Set();
|
|
107
|
+
for (const fnPath of called) {
|
|
108
|
+
const filePath = fnPathToFilePath.get(fnPath);
|
|
109
|
+
if (filePath && !reachableFiles.has(filePath)) {
|
|
110
|
+
reachableFiles.add(filePath);
|
|
111
|
+
queue.push(filePath);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return files.filter(file => !libraryPaths.has(file.path) || reachableFiles.has(file.path));
|
|
116
|
+
}
|
|
25
117
|
function compile(source, options = {}) {
|
|
26
|
-
const { namespace = 'redscript', filePath, generateSourceMap = false, mcVersion = mc_version_1.DEFAULT_MC_VERSION, lenient = false, includeDirs } = options;
|
|
118
|
+
const { namespace = 'redscript', filePath, generateSourceMap = false, mcVersion = mc_version_1.DEFAULT_MC_VERSION, lenient = false, includeDirs, stopAfterCheck = false, debug = false, } = options;
|
|
27
119
|
const warnings = [];
|
|
28
120
|
// Preprocess: resolve import directives, merge imported sources
|
|
29
121
|
const preprocessed = (0, compile_1.preprocessSourceWithMetadata)(source, { filePath, includeDirs });
|
|
30
122
|
const processedSource = preprocessed.source;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
123
|
+
try {
|
|
124
|
+
// Stage 1: Lex + Parse → AST
|
|
125
|
+
const lexer = new lexer_1.Lexer(processedSource);
|
|
126
|
+
const tokens = lexer.tokenize();
|
|
127
|
+
const parser = new parser_1.Parser(tokens, processedSource, filePath);
|
|
128
|
+
const ast = parser.parse(namespace);
|
|
129
|
+
annotateFunctionSourceFiles(ast, filePath);
|
|
130
|
+
warnings.push(...parser.warnings);
|
|
131
|
+
if (parser.parseErrors.length > 0) {
|
|
132
|
+
throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(parser.parseErrors) : parser.parseErrors[0];
|
|
133
|
+
}
|
|
134
|
+
// Resolve whole-module file imports: `import player_utils;` (no `::` symbol)
|
|
135
|
+
const seenModuleImports = new Set();
|
|
136
|
+
function resolveModuleFilePath(modName, fromFile) {
|
|
137
|
+
const candidates = [`${modName}.mcrs`, modName];
|
|
138
|
+
const stdlibDir = path.resolve(__dirname, '..', 'src', 'stdlib');
|
|
139
|
+
for (const candidate of candidates) {
|
|
140
|
+
if (fromFile) {
|
|
141
|
+
const rel = path.resolve(path.dirname(fromFile), candidate);
|
|
142
|
+
if (fs.existsSync(rel))
|
|
143
|
+
return rel;
|
|
144
|
+
}
|
|
145
|
+
const stdlib = path.resolve(stdlibDir, candidate);
|
|
146
|
+
if (fs.existsSync(stdlib))
|
|
147
|
+
return stdlib;
|
|
148
|
+
for (const dir of includeDirs ?? []) {
|
|
149
|
+
const extra = path.resolve(dir, candidate);
|
|
150
|
+
if (fs.existsSync(extra))
|
|
151
|
+
return extra;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function mergeWholeModuleImport(modFilePath) {
|
|
157
|
+
if (seenModuleImports.has(modFilePath))
|
|
158
|
+
return;
|
|
159
|
+
seenModuleImports.add(modFilePath);
|
|
160
|
+
const modSource = fs.readFileSync(modFilePath, 'utf-8');
|
|
161
|
+
const modPreprocessed = (0, compile_1.preprocessSourceWithMetadata)(modSource, { filePath: modFilePath, includeDirs });
|
|
162
|
+
const modTokens = new lexer_1.Lexer(modPreprocessed.source, modFilePath).tokenize();
|
|
163
|
+
const modParser = new parser_1.Parser(modTokens, modPreprocessed.source, modFilePath);
|
|
164
|
+
const modAst = modParser.parse(namespace);
|
|
165
|
+
annotateFunctionSourceFiles(modAst, modFilePath);
|
|
166
|
+
warnings.push(...modParser.warnings);
|
|
167
|
+
if (modParser.parseErrors.length > 0) {
|
|
168
|
+
throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(modParser.parseErrors) : modParser.parseErrors[0];
|
|
169
|
+
}
|
|
170
|
+
for (const fn of modAst.declarations)
|
|
171
|
+
fn.isLibraryFn = true;
|
|
172
|
+
for (const imp of modAst.imports) {
|
|
173
|
+
if (imp.symbol !== undefined)
|
|
174
|
+
continue;
|
|
175
|
+
const nestedPath = resolveModuleFilePath(imp.moduleName, modFilePath);
|
|
176
|
+
if (!nestedPath) {
|
|
177
|
+
warnings.push(`[ImportWarning] Module '${imp.moduleName}' not found (imported in ${modFilePath})`);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
mergeWholeModuleImport(nestedPath);
|
|
181
|
+
}
|
|
182
|
+
ast.declarations.push(...modAst.declarations);
|
|
183
|
+
ast.structs.push(...modAst.structs);
|
|
184
|
+
ast.implBlocks.push(...modAst.implBlocks);
|
|
185
|
+
ast.enums.push(...modAst.enums);
|
|
186
|
+
ast.consts.push(...modAst.consts);
|
|
187
|
+
ast.globals.push(...modAst.globals);
|
|
188
|
+
}
|
|
189
|
+
for (const imp of ast.imports) {
|
|
190
|
+
if (imp.symbol !== undefined)
|
|
191
|
+
continue;
|
|
192
|
+
const resolved = resolveModuleFilePath(imp.moduleName, filePath);
|
|
193
|
+
if (!resolved) {
|
|
194
|
+
throw new diagnostics_1.DiagnosticError('ParseError', `Module '${imp.moduleName}' not found. Make sure '${imp.moduleName}.mcrs' exists relative to this file or in the stdlib.`, imp.span ?? { line: 1, col: 1 });
|
|
195
|
+
}
|
|
196
|
+
mergeWholeModuleImport(resolved);
|
|
197
|
+
}
|
|
198
|
+
for (const li of preprocessed.libraryImports ?? []) {
|
|
199
|
+
const libPreprocessed = (0, compile_1.preprocessSourceWithMetadata)(li.source, { filePath: li.filePath });
|
|
200
|
+
const libTokens = new lexer_1.Lexer(libPreprocessed.source, li.filePath).tokenize();
|
|
201
|
+
const libParser = new parser_1.Parser(libTokens, libPreprocessed.source, li.filePath);
|
|
202
|
+
const libAst = libParser.parse(namespace);
|
|
203
|
+
annotateFunctionSourceFiles(libAst, li.filePath);
|
|
204
|
+
warnings.push(...libParser.warnings);
|
|
205
|
+
if (libParser.parseErrors.length > 0) {
|
|
206
|
+
throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(libParser.parseErrors) : libParser.parseErrors[0];
|
|
207
|
+
}
|
|
58
208
|
for (const fn of libAst.declarations)
|
|
59
209
|
fn.isLibraryFn = true;
|
|
60
210
|
ast.declarations.push(...libAst.declarations);
|
|
@@ -64,45 +214,107 @@ function compile(source, options = {}) {
|
|
|
64
214
|
ast.consts.push(...libAst.consts);
|
|
65
215
|
ast.globals.push(...libAst.globals);
|
|
66
216
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
warnings.push(...checker.getWarnings());
|
|
76
|
-
if (typeErrors.length > 0) {
|
|
77
|
-
if (lenient) {
|
|
78
|
-
for (const e of typeErrors) {
|
|
79
|
-
warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`);
|
|
217
|
+
if (options.librarySources) {
|
|
218
|
+
for (const libSrc of options.librarySources) {
|
|
219
|
+
const libTokens = new lexer_1.Lexer(libSrc).tokenize();
|
|
220
|
+
const libParser = new parser_1.Parser(libTokens, libSrc);
|
|
221
|
+
const libAst = libParser.parse(namespace);
|
|
222
|
+
warnings.push(...libParser.warnings);
|
|
223
|
+
if (libParser.parseErrors.length > 0) {
|
|
224
|
+
throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(libParser.parseErrors) : libParser.parseErrors[0];
|
|
80
225
|
}
|
|
226
|
+
for (const fn of libAst.declarations)
|
|
227
|
+
fn.isLibraryFn = true;
|
|
228
|
+
ast.declarations.push(...libAst.declarations);
|
|
229
|
+
ast.structs.push(...libAst.structs);
|
|
230
|
+
ast.implBlocks.push(...libAst.implBlocks);
|
|
231
|
+
ast.enums.push(...libAst.enums);
|
|
232
|
+
ast.consts.push(...libAst.consts);
|
|
233
|
+
ast.globals.push(...libAst.globals);
|
|
81
234
|
}
|
|
82
|
-
|
|
83
|
-
|
|
235
|
+
}
|
|
236
|
+
{
|
|
237
|
+
const configValues = options.config ?? {};
|
|
238
|
+
const configGlobalNames = new Set();
|
|
239
|
+
for (const g of ast.globals) {
|
|
240
|
+
if (g.configKey !== undefined) {
|
|
241
|
+
const resolvedValue = Object.prototype.hasOwnProperty.call(configValues, g.configKey)
|
|
242
|
+
? configValues[g.configKey]
|
|
243
|
+
: (g.configDefault ?? 0);
|
|
244
|
+
const intValue = Math.round(resolvedValue);
|
|
245
|
+
ast.consts.push({
|
|
246
|
+
name: g.name,
|
|
247
|
+
type: { kind: 'named', name: 'int' },
|
|
248
|
+
value: { kind: 'int_lit', value: intValue },
|
|
249
|
+
span: g.span,
|
|
250
|
+
});
|
|
251
|
+
configGlobalNames.add(g.name);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (configGlobalNames.size > 0) {
|
|
255
|
+
ast.globals = ast.globals.filter(g => !configGlobalNames.has(g.name));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
{
|
|
259
|
+
const checker = new typechecker_1.TypeChecker(processedSource, filePath);
|
|
260
|
+
const typeErrors = checker.check(ast);
|
|
261
|
+
warnings.push(...checker.getWarnings());
|
|
262
|
+
if (typeErrors.length > 0) {
|
|
263
|
+
if (lenient) {
|
|
264
|
+
for (const e of typeErrors) {
|
|
265
|
+
warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(typeErrors) : typeErrors[0];
|
|
270
|
+
}
|
|
84
271
|
}
|
|
85
272
|
}
|
|
86
|
-
}
|
|
87
|
-
// Stage 2–7: lower, optimize, emit
|
|
88
|
-
// Wrap non-DiagnosticError from later stages so CLI always gets structured errors.
|
|
89
|
-
try {
|
|
90
273
|
// Stage 2: AST → HIR
|
|
91
274
|
const hirRaw = (0, lower_1.lowerToHIR)(ast);
|
|
92
275
|
// Stage 2b: Monomorphize generic functions
|
|
93
276
|
const hir = (0, monomorphize_1.monomorphize)(hirRaw);
|
|
94
|
-
|
|
277
|
+
const libraryFilePaths = new Set(hir.functions
|
|
278
|
+
.filter(fn => fn.isLibraryFn && fn.decorators.length === 0)
|
|
279
|
+
.map(fn => `data/${namespace}/function/${fn.name}.mcfunction`));
|
|
280
|
+
// Stage 2c: Deprecated usage check — emit warnings for calls to @deprecated functions
|
|
281
|
+
warnings.push(...(0, deprecated_1.checkDeprecatedCalls)(hir));
|
|
282
|
+
if (stopAfterCheck) {
|
|
283
|
+
return { files: [], warnings, success: true };
|
|
284
|
+
}
|
|
285
|
+
// Extract decorator metadata before HIR lowering discards it.
|
|
95
286
|
const tickFunctions = [];
|
|
96
287
|
const loadFunctions = [];
|
|
288
|
+
const watchFunctions = [];
|
|
289
|
+
const inlineFunctions = new Set();
|
|
290
|
+
const noInlineFunctions = new Set();
|
|
97
291
|
const coroutineInfos = [];
|
|
98
292
|
const scheduleFunctions = [];
|
|
293
|
+
const profiledFunctions = [];
|
|
294
|
+
const throttleFunctions = [];
|
|
295
|
+
const retryFunctions = [];
|
|
296
|
+
const memoizeFunctions = [];
|
|
99
297
|
const eventHandlers = new Map();
|
|
100
298
|
for (const fn of hir.functions) {
|
|
299
|
+
if (fn.watchObjective) {
|
|
300
|
+
watchFunctions.push({ name: fn.name, objective: fn.watchObjective });
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
// Fallback: extract from decorator if watchObjective not propagated
|
|
304
|
+
const watchDec = fn.decorators?.find(d => d.name === 'watch' && d.args?.objective);
|
|
305
|
+
if (watchDec?.args?.objective) {
|
|
306
|
+
watchFunctions.push({ name: fn.name, objective: watchDec.args.objective });
|
|
307
|
+
}
|
|
308
|
+
}
|
|
101
309
|
for (const dec of fn.decorators) {
|
|
102
310
|
if (dec.name === 'tick')
|
|
103
311
|
tickFunctions.push(fn.name);
|
|
104
312
|
if (dec.name === 'load')
|
|
105
313
|
loadFunctions.push(fn.name);
|
|
314
|
+
if (dec.name === 'inline')
|
|
315
|
+
inlineFunctions.add(fn.name);
|
|
316
|
+
if (dec.name === 'no-inline')
|
|
317
|
+
noInlineFunctions.add(fn.name);
|
|
106
318
|
if (dec.name === 'coroutine') {
|
|
107
319
|
coroutineInfos.push({
|
|
108
320
|
fnName: fn.name,
|
|
@@ -113,6 +325,18 @@ function compile(source, options = {}) {
|
|
|
113
325
|
if (dec.name === 'schedule') {
|
|
114
326
|
scheduleFunctions.push({ name: fn.name, ticks: dec.args?.ticks ?? 1 });
|
|
115
327
|
}
|
|
328
|
+
if (dec.name === 'profile') {
|
|
329
|
+
profiledFunctions.push(fn.name);
|
|
330
|
+
}
|
|
331
|
+
if (dec.name === 'throttle' && dec.args?.ticks) {
|
|
332
|
+
throttleFunctions.push({ name: fn.name, ticks: dec.args.ticks });
|
|
333
|
+
}
|
|
334
|
+
if (dec.name === 'retry' && dec.args?.max) {
|
|
335
|
+
retryFunctions.push({ name: fn.name, max: dec.args.max });
|
|
336
|
+
}
|
|
337
|
+
if (dec.name === 'memoize') {
|
|
338
|
+
memoizeFunctions.push(fn.name);
|
|
339
|
+
}
|
|
116
340
|
if (dec.name === 'on' && dec.args?.eventType) {
|
|
117
341
|
const evType = dec.args.eventType;
|
|
118
342
|
if ((0, types_1.isEventTypeName)(evType)) {
|
|
@@ -125,6 +349,12 @@ function compile(source, options = {}) {
|
|
|
125
349
|
}
|
|
126
350
|
// Stage 3: HIR → MIR
|
|
127
351
|
const mir = (0, lower_2.lowerToMIR)(hir, filePath);
|
|
352
|
+
if (inlineFunctions.size > 0) {
|
|
353
|
+
mir.inlineFunctions = inlineFunctions;
|
|
354
|
+
}
|
|
355
|
+
if (noInlineFunctions.size > 0) {
|
|
356
|
+
mir.noInlineFunctions = noInlineFunctions;
|
|
357
|
+
}
|
|
128
358
|
// Stage 4: MIR optimization
|
|
129
359
|
const mirOpt = (0, pipeline_1.optimizeModule)(mir);
|
|
130
360
|
// Stage 4b: Coroutine transform (opt-in, only for @coroutine functions)
|
|
@@ -157,15 +387,130 @@ function compile(source, options = {}) {
|
|
|
157
387
|
}
|
|
158
388
|
}
|
|
159
389
|
}
|
|
390
|
+
// Stage 6.9: Inject synthetic LIR functions for @singleton structs
|
|
391
|
+
// Each @singleton struct gets:
|
|
392
|
+
// - A "<StructName>_get" function that reads all fields from scoreboard
|
|
393
|
+
// - A "<StructName>_set" function that writes all fields back to scoreboard
|
|
394
|
+
// Fields are stored in scoreboard objectives named "_sng_<StructName>_<fieldName>"
|
|
395
|
+
// (max 16 chars for objective name — truncated with hash suffix if needed)
|
|
396
|
+
const singletonObjectives = [];
|
|
397
|
+
for (const s of hir.structs) {
|
|
398
|
+
if (!s.isSingleton)
|
|
399
|
+
continue;
|
|
400
|
+
const structName = s.name;
|
|
401
|
+
const objective = lirOpt.objective; // the main ns objective for return values
|
|
402
|
+
// Build _get function: reads each field from its own scoreboard objective
|
|
403
|
+
// Return struct fields via __rf_<field> slots in the main objective
|
|
404
|
+
const getInstrs = [];
|
|
405
|
+
for (const field of s.fields) {
|
|
406
|
+
const fieldObj = singletonObjectiveName(structName, field.name);
|
|
407
|
+
if (!singletonObjectives.includes(fieldObj)) {
|
|
408
|
+
singletonObjectives.push(fieldObj);
|
|
409
|
+
}
|
|
410
|
+
// copy: scoreboard players operation $__rf_<field> <obj> = __sng_<S>_<f> <fieldObj>
|
|
411
|
+
getInstrs.push({
|
|
412
|
+
kind: 'score_copy',
|
|
413
|
+
dst: { player: `$__rf_${field.name}`, obj: objective },
|
|
414
|
+
src: { player: `__sng`, obj: fieldObj },
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
// Return value placeholder
|
|
418
|
+
getInstrs.push({ kind: 'score_set', dst: { player: '$ret', obj: objective }, value: 0 });
|
|
419
|
+
// Use `::` naming so it matches how static_call `GameState::get` is qualified
|
|
420
|
+
// fnNameToPath converts `GameState::get` → `data/<ns>/function/gamestate/get.mcfunction`
|
|
421
|
+
lirOpt.functions.push({
|
|
422
|
+
name: `${structName}::get`,
|
|
423
|
+
instructions: getInstrs,
|
|
424
|
+
isMacro: false,
|
|
425
|
+
macroParams: [],
|
|
426
|
+
});
|
|
427
|
+
// Build _set function: writes each field back to its scoreboard objective
|
|
428
|
+
// Parameters come in via $p0..$pN slots (one per field)
|
|
429
|
+
const setInstrs = [];
|
|
430
|
+
for (let i = 0; i < s.fields.length; i++) {
|
|
431
|
+
const field = s.fields[i];
|
|
432
|
+
const fieldObj = singletonObjectiveName(structName, field.name);
|
|
433
|
+
setInstrs.push({
|
|
434
|
+
kind: 'score_copy',
|
|
435
|
+
dst: { player: `__sng`, obj: fieldObj },
|
|
436
|
+
src: { player: `$p${i}`, obj: objective },
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
setInstrs.push({ kind: 'score_set', dst: { player: '$ret', obj: objective }, value: 0 });
|
|
440
|
+
lirOpt.functions.push({
|
|
441
|
+
name: `${structName}::set`,
|
|
442
|
+
instructions: setInstrs,
|
|
443
|
+
isMacro: false,
|
|
444
|
+
macroParams: [],
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
// Stage 6.95: Rename @memoize functions to <fn>_impl in LIR,
|
|
448
|
+
// rewriting recursive self-calls so the wrapper becomes the public entry point.
|
|
449
|
+
for (const fnName of memoizeFunctions) {
|
|
450
|
+
const lirFn = lirOpt.functions.find(f => f.name === fnName);
|
|
451
|
+
if (!lirFn)
|
|
452
|
+
continue;
|
|
453
|
+
const implName = `${fnName}_impl`;
|
|
454
|
+
lirFn.name = implName;
|
|
455
|
+
// Rewrite recursive calls: any call to fnName inside this function → implName
|
|
456
|
+
for (const instr of lirFn.instructions) {
|
|
457
|
+
if ('fn' in instr && instr.fn === fnName) {
|
|
458
|
+
;
|
|
459
|
+
instr.fn = implName;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
160
463
|
// Stage 7: LIR → .mcfunction
|
|
161
|
-
const files = (0, index_1.emit)(lirOpt, {
|
|
162
|
-
|
|
464
|
+
const files = (0, index_1.emit)(lirOpt, {
|
|
465
|
+
namespace,
|
|
466
|
+
tickFunctions,
|
|
467
|
+
loadFunctions,
|
|
468
|
+
watchFunctions,
|
|
469
|
+
scheduleFunctions,
|
|
470
|
+
generateSourceMap,
|
|
471
|
+
mcVersion,
|
|
472
|
+
eventHandlers,
|
|
473
|
+
singletonObjectives,
|
|
474
|
+
profiledFunctions,
|
|
475
|
+
enableProfiling: debug,
|
|
476
|
+
throttleFunctions,
|
|
477
|
+
retryFunctions,
|
|
478
|
+
memoizeFunctions,
|
|
479
|
+
});
|
|
480
|
+
const prunedFiles = pruneLibraryFunctionFiles(files, libraryFilePaths);
|
|
481
|
+
return { files: prunedFiles, warnings, success: true };
|
|
163
482
|
}
|
|
164
483
|
catch (err) {
|
|
484
|
+
if (stopAfterCheck) {
|
|
485
|
+
if (err instanceof diagnostics_1.CheckFailedError)
|
|
486
|
+
throw err;
|
|
487
|
+
if (err instanceof diagnostics_1.DiagnosticBundleError) {
|
|
488
|
+
throw new diagnostics_1.CheckFailedError(err.diagnostics, warnings);
|
|
489
|
+
}
|
|
490
|
+
if (err instanceof diagnostics_1.DiagnosticError) {
|
|
491
|
+
throw new diagnostics_1.CheckFailedError([err], warnings);
|
|
492
|
+
}
|
|
493
|
+
const sourceLines = processedSource.split('\n');
|
|
494
|
+
throw new diagnostics_1.CheckFailedError([(0, diagnostics_1.parseErrorMessage)('LoweringError', err.message, sourceLines, filePath)], warnings);
|
|
495
|
+
}
|
|
165
496
|
if (err instanceof diagnostics_1.DiagnosticError)
|
|
166
497
|
throw err;
|
|
167
498
|
const sourceLines = processedSource.split('\n');
|
|
168
499
|
throw (0, diagnostics_1.parseErrorMessage)('LoweringError', err.message, sourceLines, filePath);
|
|
169
500
|
}
|
|
170
501
|
}
|
|
502
|
+
/**
|
|
503
|
+
* Compute a scoreboard objective name for a @singleton struct field.
|
|
504
|
+
* Format: _s_<struct>_<field>, truncated so total length ≤ 16 chars.
|
|
505
|
+
* If struct+field combined (with _s_ and _) exceeds 16:
|
|
506
|
+
* use first 4 chars of struct, first 8 chars of field.
|
|
507
|
+
*/
|
|
508
|
+
function singletonObjectiveName(structName, fieldName) {
|
|
509
|
+
const overhead = 5; // "_s_" (3) + "_" (1) = 4, +1 for safety -- actually "_s_" + "_" = 4
|
|
510
|
+
// Budget: 16 - 4 = 12 chars for struct + field combined
|
|
511
|
+
if (structName.length + fieldName.length <= 12) {
|
|
512
|
+
return `_s_${structName}_${fieldName}`;
|
|
513
|
+
}
|
|
514
|
+
return `_s_${structName.slice(0, 4)}_${fieldName.slice(0, 8)}`;
|
|
515
|
+
}
|
|
171
516
|
//# sourceMappingURL=compile.js.map
|
package/dist/src/emit/index.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ export interface DatapackFile {
|
|
|
10
10
|
path: string;
|
|
11
11
|
content: string;
|
|
12
12
|
}
|
|
13
|
+
export interface WatchFunction {
|
|
14
|
+
name: string;
|
|
15
|
+
objective: string;
|
|
16
|
+
}
|
|
13
17
|
export interface EmitOptions {
|
|
14
18
|
namespace: string;
|
|
15
19
|
tickFunctions?: string[];
|
|
@@ -18,11 +22,47 @@ export interface EmitOptions {
|
|
|
18
22
|
name: string;
|
|
19
23
|
ticks: number;
|
|
20
24
|
}>;
|
|
25
|
+
watchFunctions?: WatchFunction[];
|
|
21
26
|
/** When true, generate a .sourcemap.json sidecar file for each .mcfunction */
|
|
22
27
|
generateSourceMap?: boolean;
|
|
23
28
|
/** Target Minecraft version; controls which MC features are used in codegen */
|
|
24
29
|
mcVersion?: McVersion;
|
|
25
30
|
/** Map of EventTypeName → list of fully-qualified function references for @on handlers */
|
|
26
31
|
eventHandlers?: Map<string, string[]>;
|
|
32
|
+
/** Scoreboard objective names for @singleton struct fields — added to load.mcfunction */
|
|
33
|
+
singletonObjectives?: string[];
|
|
34
|
+
/** Functions decorated with @profile. */
|
|
35
|
+
profiledFunctions?: string[];
|
|
36
|
+
/** Emit debug-only profiling instrumentation and helpers. */
|
|
37
|
+
enableProfiling?: boolean;
|
|
38
|
+
/** Functions decorated with @throttle. */
|
|
39
|
+
throttleFunctions?: Array<{
|
|
40
|
+
name: string;
|
|
41
|
+
ticks: number;
|
|
42
|
+
}>;
|
|
43
|
+
/** Functions decorated with @retry. */
|
|
44
|
+
retryFunctions?: Array<{
|
|
45
|
+
name: string;
|
|
46
|
+
max: number;
|
|
47
|
+
}>;
|
|
48
|
+
/** Functions decorated with @memoize — single-arg int result caching (LRU-1). */
|
|
49
|
+
memoizeFunctions?: string[];
|
|
27
50
|
}
|
|
28
51
|
export declare function emit(module: LIRModule, options: EmitOptions): DatapackFile[];
|
|
52
|
+
/**
|
|
53
|
+
* Flatten nested execute-if chains into a single execute with multiple conditions.
|
|
54
|
+
*
|
|
55
|
+
* MC allows chaining conditions:
|
|
56
|
+
* execute if A run execute if B run X
|
|
57
|
+
* can be written as:
|
|
58
|
+
* execute if A if B run X
|
|
59
|
+
*
|
|
60
|
+
* This reduces command-parsing overhead and improves TPS.
|
|
61
|
+
*
|
|
62
|
+
* Rules:
|
|
63
|
+
* - Only merges when the inner `run` clause is itself `execute if ...`
|
|
64
|
+
* - Does NOT merge `if ... run execute unless ...` — semantics differ
|
|
65
|
+
* (unless negates, changing behavior in chain context)
|
|
66
|
+
* - Recursively flattens deeper nesting (3+ levels)
|
|
67
|
+
*/
|
|
68
|
+
export declare function flattenExecute(cmd: string): string;
|