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
|
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.TypeChecker = void 0;
|
|
10
10
|
const diagnostics_1 = require("../diagnostics");
|
|
11
11
|
const types_1 = require("../events/types");
|
|
12
|
+
const expand_1 = require("../structs/expand");
|
|
12
13
|
// Entity type hierarchy for subtype checking
|
|
13
14
|
const ENTITY_HIERARCHY = {
|
|
14
15
|
'entity': null,
|
|
@@ -94,6 +95,10 @@ const INT_TYPE = { kind: 'named', name: 'int' };
|
|
|
94
95
|
const STRING_TYPE = { kind: 'named', name: 'string' };
|
|
95
96
|
const FORMAT_STRING_TYPE = { kind: 'named', name: 'format_string' };
|
|
96
97
|
const BUILTIN_SIGNATURES = {
|
|
98
|
+
assert: {
|
|
99
|
+
params: [{ kind: 'named', name: 'bool' }],
|
|
100
|
+
return: VOID_TYPE,
|
|
101
|
+
},
|
|
97
102
|
setTimeout: {
|
|
98
103
|
params: [INT_TYPE, { kind: 'function_type', params: [], return: VOID_TYPE }],
|
|
99
104
|
return: VOID_TYPE,
|
|
@@ -106,6 +111,14 @@ const BUILTIN_SIGNATURES = {
|
|
|
106
111
|
params: [INT_TYPE],
|
|
107
112
|
return: VOID_TYPE,
|
|
108
113
|
},
|
|
114
|
+
int_to_str: {
|
|
115
|
+
params: [INT_TYPE],
|
|
116
|
+
return: STRING_TYPE,
|
|
117
|
+
},
|
|
118
|
+
bool_to_str: {
|
|
119
|
+
params: [{ kind: 'named', name: 'bool' }],
|
|
120
|
+
return: STRING_TYPE,
|
|
121
|
+
},
|
|
109
122
|
};
|
|
110
123
|
// ---------------------------------------------------------------------------
|
|
111
124
|
// Type Checker
|
|
@@ -117,6 +130,8 @@ class TypeChecker {
|
|
|
117
130
|
this.implMethods = new Map();
|
|
118
131
|
this.structs = new Map();
|
|
119
132
|
this.enums = new Map();
|
|
133
|
+
// enumName → variantName → field list (for payload variants)
|
|
134
|
+
this.enumPayloads = new Map();
|
|
120
135
|
this.consts = new Map();
|
|
121
136
|
this.globals = new Map();
|
|
122
137
|
this.currentFn = null;
|
|
@@ -127,6 +142,8 @@ class TypeChecker {
|
|
|
127
142
|
// Depth of loop/conditional nesting (for static-allocation enforcement)
|
|
128
143
|
this.loopDepth = 0;
|
|
129
144
|
this.condDepth = 0;
|
|
145
|
+
// interface name → InterfaceDecl
|
|
146
|
+
this.interfaces = new Map();
|
|
130
147
|
this.richTextBuiltins = new Map([
|
|
131
148
|
['say', { messageIndex: 0 }],
|
|
132
149
|
['announce', { messageIndex: 0 }],
|
|
@@ -167,6 +184,10 @@ class TypeChecker {
|
|
|
167
184
|
for (const fn of program.declarations) {
|
|
168
185
|
this.functions.set(fn.name, fn);
|
|
169
186
|
}
|
|
187
|
+
// Register interface declarations
|
|
188
|
+
for (const iface of program.interfaces ?? []) {
|
|
189
|
+
this.interfaces.set(iface.name, iface);
|
|
190
|
+
}
|
|
170
191
|
// Register global variables (mutable) so functions can reference and assign them
|
|
171
192
|
for (const global of program.globals ?? []) {
|
|
172
193
|
this.globals.set(global.name, this.normalizeType(global.type));
|
|
@@ -191,19 +212,59 @@ class TypeChecker {
|
|
|
191
212
|
methods.set(method.name, method);
|
|
192
213
|
}
|
|
193
214
|
}
|
|
194
|
-
|
|
215
|
+
const expandedStructs = (0, expand_1.expandStructDeclarations)(program.structs ?? [], ({ message, node }) => {
|
|
216
|
+
this.report(message, node);
|
|
217
|
+
});
|
|
218
|
+
for (const struct of expandedStructs) {
|
|
195
219
|
const fields = new Map();
|
|
196
220
|
for (const field of struct.fields) {
|
|
197
221
|
fields.set(field.name, field.type);
|
|
198
222
|
}
|
|
199
223
|
this.structs.set(struct.name, fields);
|
|
224
|
+
// @singleton structs get synthetic static get() and set(gs) methods
|
|
225
|
+
if (struct.isSingleton) {
|
|
226
|
+
const structType = { kind: 'struct', name: struct.name };
|
|
227
|
+
let singletonMethods = this.implMethods.get(struct.name);
|
|
228
|
+
if (!singletonMethods) {
|
|
229
|
+
singletonMethods = new Map();
|
|
230
|
+
this.implMethods.set(struct.name, singletonMethods);
|
|
231
|
+
}
|
|
232
|
+
const voidType = { kind: 'named', name: 'void' };
|
|
233
|
+
// Synthetic get() — no params, returns struct
|
|
234
|
+
singletonMethods.set('get', {
|
|
235
|
+
name: 'get',
|
|
236
|
+
params: [],
|
|
237
|
+
returnType: structType,
|
|
238
|
+
decorators: [],
|
|
239
|
+
body: [],
|
|
240
|
+
typeParams: undefined,
|
|
241
|
+
isLibraryFn: true,
|
|
242
|
+
});
|
|
243
|
+
// Synthetic set(gs: StructName) — takes struct, returns void
|
|
244
|
+
singletonMethods.set('set', {
|
|
245
|
+
name: 'set',
|
|
246
|
+
params: [{ name: 'gs', type: structType }],
|
|
247
|
+
returnType: voidType,
|
|
248
|
+
decorators: [],
|
|
249
|
+
body: [],
|
|
250
|
+
typeParams: undefined,
|
|
251
|
+
isLibraryFn: true,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
200
254
|
}
|
|
201
255
|
for (const enumDecl of program.enums ?? []) {
|
|
202
256
|
const variants = new Map();
|
|
257
|
+
const payloads = new Map();
|
|
203
258
|
for (const variant of enumDecl.variants) {
|
|
204
259
|
variants.set(variant.name, variant.value ?? 0);
|
|
260
|
+
if (variant.fields && variant.fields.length > 0) {
|
|
261
|
+
payloads.set(variant.name, variant.fields);
|
|
262
|
+
}
|
|
205
263
|
}
|
|
206
264
|
this.enums.set(enumDecl.name, variants);
|
|
265
|
+
if (payloads.size > 0) {
|
|
266
|
+
this.enumPayloads.set(enumDecl.name, payloads);
|
|
267
|
+
}
|
|
207
268
|
}
|
|
208
269
|
for (const constDecl of program.consts ?? []) {
|
|
209
270
|
const constType = this.normalizeType(constDecl.type);
|
|
@@ -213,6 +274,21 @@ class TypeChecker {
|
|
|
213
274
|
}
|
|
214
275
|
this.consts.set(constDecl.name, constType);
|
|
215
276
|
}
|
|
277
|
+
// Verify that each `impl <Interface> for <Struct>` satisfies all interface methods
|
|
278
|
+
for (const implBlock of program.implBlocks ?? []) {
|
|
279
|
+
if (!implBlock.traitName)
|
|
280
|
+
continue;
|
|
281
|
+
const iface = this.interfaces.get(implBlock.traitName);
|
|
282
|
+
if (!iface)
|
|
283
|
+
continue; // Unknown trait — not our concern here (could be built-in like Display)
|
|
284
|
+
const implementedMethods = new Set(implBlock.methods.map(m => m.name));
|
|
285
|
+
for (const required of iface.methods) {
|
|
286
|
+
if (!implementedMethods.has(required.name)) {
|
|
287
|
+
const span = implBlock.span ?? required.span;
|
|
288
|
+
this.report(`Struct '${implBlock.typeName}' does not implement required method '${required.name}' from interface '${implBlock.traitName}'`, span ?? { line: 1, col: 1 });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
216
292
|
// Second pass: type check function bodies
|
|
217
293
|
for (const fn of program.declarations) {
|
|
218
294
|
this.checkFunction(fn);
|
|
@@ -262,6 +338,69 @@ class TypeChecker {
|
|
|
262
338
|
this.currentReturnType = null;
|
|
263
339
|
}
|
|
264
340
|
checkFunctionDecorators(fn) {
|
|
341
|
+
const watchDecorators = fn.decorators.filter(decorator => decorator.name === 'watch');
|
|
342
|
+
if (watchDecorators.length > 1) {
|
|
343
|
+
this.report(`Function '${fn.name}' cannot have multiple @watch decorators`, fn);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (watchDecorators.length === 1) {
|
|
347
|
+
const objective = watchDecorators[0].args?.objective;
|
|
348
|
+
if (!objective) {
|
|
349
|
+
this.report(`Function '${fn.name}' is missing a scoreboard objective in @watch("...")`, fn);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
if (fn.params.length > 0) {
|
|
353
|
+
this.report(`@watch handler '${fn.name}' cannot declare parameters`, fn);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const throttleDecorators = fn.decorators.filter(decorator => decorator.name === 'throttle');
|
|
357
|
+
if (throttleDecorators.length > 1) {
|
|
358
|
+
this.report(`Function '${fn.name}' cannot have multiple @throttle decorators`, fn);
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
if (throttleDecorators.length === 1) {
|
|
362
|
+
const ticks = throttleDecorators[0].args?.ticks;
|
|
363
|
+
if (ticks === undefined || ticks <= 0) {
|
|
364
|
+
this.report(`@throttle on '${fn.name}' requires ticks=N (positive integer)`, fn);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
const retryDecorators = fn.decorators.filter(decorator => decorator.name === 'retry');
|
|
368
|
+
if (retryDecorators.length > 1) {
|
|
369
|
+
this.report(`Function '${fn.name}' cannot have multiple @retry decorators`, fn);
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
if (retryDecorators.length === 1) {
|
|
373
|
+
const max = retryDecorators[0].args?.max;
|
|
374
|
+
if (max === undefined || max <= 0) {
|
|
375
|
+
this.report(`@retry on '${fn.name}' requires max=N (positive integer)`, fn);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
const profileDecorators = fn.decorators.filter(decorator => decorator.name === 'profile');
|
|
379
|
+
if (profileDecorators.length > 1) {
|
|
380
|
+
this.report(`Function '${fn.name}' cannot have multiple @profile decorators`, fn);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
if (profileDecorators.length === 1 && (profileDecorators[0].rawArgs?.length || profileDecorators[0].args && Object.keys(profileDecorators[0].args).length > 0)) {
|
|
384
|
+
this.report(`@profile decorator on '${fn.name}' does not accept arguments`, fn);
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
const memoizeDecorators = fn.decorators.filter(decorator => decorator.name === 'memoize');
|
|
388
|
+
if (memoizeDecorators.length > 1) {
|
|
389
|
+
this.report(`Function '${fn.name}' cannot have multiple @memoize decorators`, fn);
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
if (memoizeDecorators.length === 1) {
|
|
393
|
+
if (fn.params.length !== 1) {
|
|
394
|
+
this.report(`@memoize on '${fn.name}' requires exactly one parameter`, fn);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
const paramType = fn.params[0].type;
|
|
398
|
+
const isInt = paramType.kind === 'named' && paramType.name === 'int';
|
|
399
|
+
if (!isInt) {
|
|
400
|
+
this.report(`@memoize on '${fn.name}' only supports int parameters (got '${paramType.kind === 'named' ? paramType.name : paramType.kind}')`, fn);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
265
404
|
const eventDecorators = fn.decorators.filter(decorator => decorator.name === 'on');
|
|
266
405
|
if (eventDecorators.length === 0) {
|
|
267
406
|
return;
|
|
@@ -372,9 +511,25 @@ class TypeChecker {
|
|
|
372
511
|
!this.typesMatch(subjectType, patternType)) {
|
|
373
512
|
this.report('Match arm pattern type must match subject type', arm.pattern.expr);
|
|
374
513
|
}
|
|
514
|
+
this.checkBlock(arm.body);
|
|
515
|
+
}
|
|
516
|
+
else if (arm.pattern.kind === 'PatEnum') {
|
|
517
|
+
const pat = arm.pattern;
|
|
518
|
+
const variantPayloads = this.enumPayloads.get(pat.enumName)?.get(pat.variant) ?? [];
|
|
519
|
+
// Bind pattern variables to their declared field types in arm scope
|
|
520
|
+
const savedScope = new Map(this.scope);
|
|
521
|
+
for (let i = 0; i < pat.bindings.length; i++) {
|
|
522
|
+
const fieldDef = variantPayloads[i];
|
|
523
|
+
const bindingType = fieldDef ? fieldDef.type : { kind: 'named', name: 'int' };
|
|
524
|
+
this.scope.set(pat.bindings[i], { type: bindingType, mutable: false });
|
|
525
|
+
}
|
|
526
|
+
this.checkBlock(arm.body);
|
|
527
|
+
this.scope = savedScope;
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
// PatSome / PatNone / PatInt / PatWild are structurally typed — no extra scope needed
|
|
531
|
+
this.checkBlock(arm.body);
|
|
375
532
|
}
|
|
376
|
-
// PatSome / PatNone / PatInt / PatWild are structurally typed — no expr to check
|
|
377
|
-
this.checkBlock(arm.body);
|
|
378
533
|
}
|
|
379
534
|
break;
|
|
380
535
|
case 'as_block': {
|
|
@@ -419,6 +574,22 @@ class TypeChecker {
|
|
|
419
574
|
case 'raw':
|
|
420
575
|
// Raw commands are not type checked
|
|
421
576
|
break;
|
|
577
|
+
case 'break':
|
|
578
|
+
case 'continue':
|
|
579
|
+
case 'break_label':
|
|
580
|
+
case 'continue_label':
|
|
581
|
+
// Control flow — no sub-expressions to check
|
|
582
|
+
break;
|
|
583
|
+
case 'labeled_loop':
|
|
584
|
+
// Recurse into the labeled loop body
|
|
585
|
+
this.loopDepth++;
|
|
586
|
+
this.checkStmt(stmt.body);
|
|
587
|
+
this.loopDepth--;
|
|
588
|
+
break;
|
|
589
|
+
case 'const_decl':
|
|
590
|
+
// Local const: register in scope as immutable with its declared type
|
|
591
|
+
this.scope.set(stmt.name, { type: stmt.type, mutable: false });
|
|
592
|
+
break;
|
|
422
593
|
}
|
|
423
594
|
}
|
|
424
595
|
checkLetDestructStmt(stmt) {
|
|
@@ -536,8 +707,8 @@ class TypeChecker {
|
|
|
536
707
|
if (arithmeticOps.includes(expr.op)) {
|
|
537
708
|
const leftType = this.inferType(expr.left);
|
|
538
709
|
const rightType = this.inferType(expr.right);
|
|
539
|
-
const leftIsString = leftType.kind === 'named' && (leftType.name === 'string' || leftType.name === 'format_string');
|
|
540
|
-
const rightIsString = rightType.kind === 'named' && (rightType.name === 'string' || rightType.name === 'format_string');
|
|
710
|
+
const leftIsString = leftType.kind === 'named' && (leftType.name === 'string' || leftType.name === 'format_string'); // format_string kept for legacy type annotations
|
|
711
|
+
const rightIsString = rightType.kind === 'named' && (rightType.name === 'string' || rightType.name === 'format_string'); // format_string kept for legacy type annotations
|
|
541
712
|
if (leftIsString || rightIsString) {
|
|
542
713
|
// String concatenation with + is not supported. Use f-strings instead.
|
|
543
714
|
this.report(`[StringConcat] String concatenation with '+' is not supported. Use f-strings instead: f"text{variable}" — e.g. f"Score: {score}"`, expr);
|
|
@@ -590,7 +761,29 @@ class TypeChecker {
|
|
|
590
761
|
break;
|
|
591
762
|
case 'struct_lit':
|
|
592
763
|
for (const field of expr.fields) {
|
|
593
|
-
|
|
764
|
+
let fieldType;
|
|
765
|
+
if (expectedType) {
|
|
766
|
+
const normalized = this.normalizeType(expectedType);
|
|
767
|
+
if (normalized.kind === 'struct') {
|
|
768
|
+
const structFields = this.structs.get(normalized.name);
|
|
769
|
+
if (structFields && !structFields.has(field.name)) {
|
|
770
|
+
this.report(`Struct '${normalized.name}' has no field '${field.name}'`, expr);
|
|
771
|
+
}
|
|
772
|
+
else {
|
|
773
|
+
fieldType = structFields?.get(field.name);
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
this.checkExpr(field.value, fieldType);
|
|
778
|
+
if (fieldType) {
|
|
779
|
+
const actualType = this.inferType(field.value, fieldType);
|
|
780
|
+
if (this.isNumericMismatch(fieldType, actualType)) {
|
|
781
|
+
this.report(`Field '${field.name}' of struct expects ${this.typeToString(fieldType)}, got ${this.typeToString(actualType)}`, field.value);
|
|
782
|
+
}
|
|
783
|
+
else if (!this.typesMatch(fieldType, actualType)) {
|
|
784
|
+
this.report(`Field '${field.name}' of struct expects ${this.typeToString(fieldType)}, got ${this.typeToString(actualType)}`, field.value);
|
|
785
|
+
}
|
|
786
|
+
}
|
|
594
787
|
}
|
|
595
788
|
break;
|
|
596
789
|
case 'str_interp':
|
|
@@ -642,6 +835,32 @@ class TypeChecker {
|
|
|
642
835
|
}
|
|
643
836
|
}
|
|
644
837
|
break;
|
|
838
|
+
case 'enum_construct': {
|
|
839
|
+
if (!this.enums.has(expr.enumName)) {
|
|
840
|
+
this.report(`Unknown enum '${expr.enumName}'`, expr);
|
|
841
|
+
break;
|
|
842
|
+
}
|
|
843
|
+
const variants = this.enums.get(expr.enumName);
|
|
844
|
+
if (!variants.has(expr.variant)) {
|
|
845
|
+
this.report(`Enum '${expr.enumName}' has no variant '${expr.variant}'`, expr);
|
|
846
|
+
break;
|
|
847
|
+
}
|
|
848
|
+
const variantPayloads = this.enumPayloads.get(expr.enumName)?.get(expr.variant) ?? [];
|
|
849
|
+
if (variantPayloads.length === 0 && expr.args.length > 0) {
|
|
850
|
+
this.report(`Enum variant '${expr.enumName}::${expr.variant}' has no payload fields`, expr);
|
|
851
|
+
break;
|
|
852
|
+
}
|
|
853
|
+
for (const arg of expr.args) {
|
|
854
|
+
const fieldDef = variantPayloads.find(f => f.name === arg.name);
|
|
855
|
+
if (!fieldDef) {
|
|
856
|
+
this.report(`Unknown field '${arg.name}' for enum variant '${expr.enumName}::${expr.variant}'`, expr);
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
this.checkExpr(arg.value, fieldDef.type);
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
break;
|
|
863
|
+
}
|
|
645
864
|
case 'blockpos':
|
|
646
865
|
break;
|
|
647
866
|
// Literals don't need checking
|
|
@@ -741,7 +960,7 @@ class TypeChecker {
|
|
|
741
960
|
}
|
|
742
961
|
const messageType = this.inferType(message);
|
|
743
962
|
if (messageType.kind !== 'named' ||
|
|
744
|
-
|
|
963
|
+
messageType.name !== 'string') {
|
|
745
964
|
this.report(`Argument ${messageIndex + 1} of '${expr.fn}' expects string or format_string, got ${this.typeToString(messageType)}`, message);
|
|
746
965
|
}
|
|
747
966
|
}
|
|
@@ -948,7 +1167,7 @@ class TypeChecker {
|
|
|
948
1167
|
this.checkExpr(part.expr);
|
|
949
1168
|
}
|
|
950
1169
|
}
|
|
951
|
-
return
|
|
1170
|
+
return STRING_TYPE;
|
|
952
1171
|
case 'blockpos':
|
|
953
1172
|
return { kind: 'named', name: 'BlockPos' };
|
|
954
1173
|
case 'ident':
|
|
@@ -1011,6 +1230,11 @@ class TypeChecker {
|
|
|
1011
1230
|
return { kind: 'enum', name: expr.enumName };
|
|
1012
1231
|
}
|
|
1013
1232
|
return { kind: 'named', name: 'void' };
|
|
1233
|
+
case 'enum_construct':
|
|
1234
|
+
if (this.enums.has(expr.enumName)) {
|
|
1235
|
+
return { kind: 'enum', name: expr.enumName };
|
|
1236
|
+
}
|
|
1237
|
+
return { kind: 'named', name: 'void' };
|
|
1014
1238
|
case 'member':
|
|
1015
1239
|
if (expr.obj.kind === 'ident' && this.enums.has(expr.obj.name)) {
|
|
1016
1240
|
return { kind: 'enum', name: expr.obj.name };
|
|
@@ -1134,7 +1358,10 @@ class TypeChecker {
|
|
|
1134
1358
|
if (receiverType.kind !== 'struct') {
|
|
1135
1359
|
return null;
|
|
1136
1360
|
}
|
|
1137
|
-
|
|
1361
|
+
// Try the method name as-is first, then try the original (pre-remap) name
|
|
1362
|
+
const methodName = TypeChecker.PARSER_METHOD_REMAP[expr.fn] ?? expr.fn;
|
|
1363
|
+
const method = this.implMethods.get(receiverType.name)?.get(expr.fn)
|
|
1364
|
+
?? this.implMethods.get(receiverType.name)?.get(methodName);
|
|
1138
1365
|
if (!method || method.params[0]?.name !== 'self') {
|
|
1139
1366
|
return null;
|
|
1140
1367
|
}
|
|
@@ -1203,6 +1430,11 @@ class TypeChecker {
|
|
|
1203
1430
|
if (expected.kind === 'selector' && actual.kind === 'selector') {
|
|
1204
1431
|
return true; // any entity subtype is compatible
|
|
1205
1432
|
}
|
|
1433
|
+
// Fake player names (#name) are mc_name tokens typed as string — allow them
|
|
1434
|
+
// where a selector is expected, since MC scoreboards accept fake player names.
|
|
1435
|
+
if (expected.kind === 'selector' && actual.kind === 'named' && actual.name === 'string') {
|
|
1436
|
+
return true;
|
|
1437
|
+
}
|
|
1206
1438
|
if (expected.kind !== actual.kind)
|
|
1207
1439
|
return false;
|
|
1208
1440
|
if (expected.kind === 'named' && actual.kind === 'named') {
|
|
@@ -1309,4 +1541,17 @@ class TypeChecker {
|
|
|
1309
1541
|
}
|
|
1310
1542
|
}
|
|
1311
1543
|
exports.TypeChecker = TypeChecker;
|
|
1544
|
+
// Reverse map: parser sometimes remaps method names (e.g. add→set_add) for builtins.
|
|
1545
|
+
// When the receiver is a struct with an impl method matching the original name, use that.
|
|
1546
|
+
TypeChecker.PARSER_METHOD_REMAP = {
|
|
1547
|
+
'set_add': 'add',
|
|
1548
|
+
'set_contains': 'contains',
|
|
1549
|
+
'set_remove': 'remove',
|
|
1550
|
+
'set_clear': 'clear',
|
|
1551
|
+
'__array_push': 'push',
|
|
1552
|
+
'__array_pop': 'pop',
|
|
1553
|
+
'__entity_tag': 'tag',
|
|
1554
|
+
'__entity_untag': 'untag',
|
|
1555
|
+
'__entity_has_tag': 'has_tag',
|
|
1556
|
+
};
|
|
1312
1557
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/cli.ts","../src/compile.ts","../src/index.ts","../src/repl.ts","../src/__tests__/cli.test.ts","../src/__tests__/codegen.test.ts","../src/__tests__/compile-all.test.ts","../src/__tests__/dce.test.ts","../src/__tests__/diagnostics.test.ts","../src/__tests__/e2e.test.ts","../src/__tests__/entity-types.test.ts","../src/__tests__/formatter.test.ts","../src/__tests__/lexer.test.ts","../src/__tests__/lowering.test.ts","../src/__tests__/macro.test.ts","../src/__tests__/mc-integration.test.ts","../src/__tests__/mc-syntax.test.ts","../src/__tests__/nbt.test.ts","../src/__tests__/optimizer-advanced.test.ts","../src/__tests__/optimizer.test.ts","../src/__tests__/parser.test.ts","../src/__tests__/repl.test.ts","../src/__tests__/runtime.test.ts","../src/__tests__/stdlib-advanced.test.ts","../src/__tests__/stdlib-bigint.test.ts","../src/__tests__/stdlib-math.test.ts","../src/__tests__/stdlib-vec.test.ts","../src/__tests__/structure-optimizer.test.ts","../src/__tests__/typechecker.test.ts","../src/__tests__/var-allocator.test.ts","../src/ast/types.ts","../src/builtins/metadata.ts","../src/codegen/var-allocator.ts","../src/codegen/cmdblock/index.ts","../src/codegen/mcfunction/index.ts","../src/codegen/structure/index.ts","../src/diagnostics/index.ts","../src/events/types.ts","../src/formatter/index.ts","../src/ir/builder.ts","../src/ir/types.ts","../src/lexer/index.ts","../src/lowering/index.ts","../src/mc-test/client.ts","../src/mc-test/runner.ts","../src/mc-test/setup.ts","../src/mc-validator/index.ts","../src/nbt/index.ts","../src/optimizer/commands.ts","../src/optimizer/dce.ts","../src/optimizer/passes.ts","../src/optimizer/structure.ts","../src/parser/index.ts","../src/runtime/index.ts","../src/typechecker/index.ts","../src/types/entity-hierarchy.ts","../src2/__tests__/e2e/basic.test.ts","../src2/__tests__/e2e/macros.test.ts","../src2/__tests__/e2e/migrate.test.ts","../src2/__tests__/hir/desugar.test.ts","../src2/__tests__/lir/lower.test.ts","../src2/__tests__/lir/types.test.ts","../src2/__tests__/lir/verify.test.ts","../src2/__tests__/mir/arithmetic.test.ts","../src2/__tests__/mir/control-flow.test.ts","../src2/__tests__/mir/verify.test.ts","../src2/__tests__/optimizer/block_merge.test.ts","../src2/__tests__/optimizer/branch_simplify.test.ts","../src2/__tests__/optimizer/constant_fold.test.ts","../src2/__tests__/optimizer/copy_prop.test.ts","../src2/__tests__/optimizer/dce.test.ts","../src2/__tests__/optimizer/pipeline.test.ts","../src2/emit/compile.ts","../src2/emit/index.ts","../src2/hir/lower.ts","../src2/hir/types.ts","../src2/lir/lower.ts","../src2/lir/types.ts","../src2/lir/verify.ts","../src2/mir/lower.ts","../src2/mir/macro.ts","../src2/mir/types.ts","../src2/mir/verify.ts","../src2/optimizer/block_merge.ts","../src2/optimizer/branch_simplify.ts","../src2/optimizer/constant_fold.ts","../src2/optimizer/copy_prop.ts","../src2/optimizer/dce.ts","../src2/optimizer/pipeline.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/cli.ts","../src/compile.ts","../src/index.ts","../src/repl-server.ts","../src/repl.ts","../src/__tests__/array-dynamic.test.ts","../src/__tests__/array-param.test.ts","../src/__tests__/array-write.test.ts","../src/__tests__/budget.test.ts","../src/__tests__/builtins.test.ts","../src/__tests__/cache-extra.test.ts","../src/__tests__/cli-init.test.ts","../src/__tests__/cli-publish.test.ts","../src/__tests__/cli.test.ts","../src/__tests__/compile-all.test.ts","../src/__tests__/compile-preprocess.test.ts","../src/__tests__/config-decorator.test.ts","../src/__tests__/dce.test.ts","../src/__tests__/diagnostics-extra.test.ts","../src/__tests__/diagnostics.test.ts","../src/__tests__/double.test.ts","../src/__tests__/enum.test.ts","../src/__tests__/error-recovery.test.ts","../src/__tests__/events-types-extra.test.ts","../src/__tests__/events-types.test.ts","../src/__tests__/fixed.test.ts","../src/__tests__/float-lint.test.ts","../src/__tests__/float.test.ts","../src/__tests__/for-each.test.ts","../src/__tests__/for-range.test.ts","../src/__tests__/formatter.test.ts","../src/__tests__/generics.test.ts","../src/__tests__/impl.test.ts","../src/__tests__/incremental.test.ts","../src/__tests__/index-extra.test.ts","../src/__tests__/lexer.test.ts","../src/__tests__/lsp-logic.test.ts","../src/__tests__/lsp.test.ts","../src/__tests__/match.test.ts","../src/__tests__/mc-integration.test.ts","../src/__tests__/mc-syntax.test.ts","../src/__tests__/mc-validator-coverage.test.ts","../src/__tests__/mc-validator-extra.test.ts","../src/__tests__/mc-version.test.ts","../src/__tests__/modules.test.ts","../src/__tests__/option.test.ts","../src/__tests__/parser-coverage.test.ts","../src/__tests__/parser-extra.test.ts","../src/__tests__/parser.test.ts","../src/__tests__/repl-extra.test.ts","../src/__tests__/repl-server-extra.test.ts","../src/__tests__/repl-server.test.ts","../src/__tests__/repl.test.ts","../src/__tests__/runtime-extra.test.ts","../src/__tests__/runtime.test.ts","../src/__tests__/schedule.test.ts","../src/__tests__/singleton-decorator.test.ts","../src/__tests__/sourcemap.test.ts","../src/__tests__/stdlib-include.test.ts","../src/__tests__/struct-display.test.ts","../src/__tests__/tuple.test.ts","../src/__tests__/typechecker-coverage.test.ts","../src/__tests__/typechecker-strict.test.ts","../src/__tests__/typechecker.test.ts","../src/__tests__/watch-decorator.test.ts","../src/__tests__/cache/cache-behavior.test.ts","../src/__tests__/compiler/break-stmt.test.ts","../src/__tests__/compiler/const-decl.test.ts","../src/__tests__/compiler/continue-stmt.test.ts","../src/__tests__/compiler/coroutine-extended.test.ts","../src/__tests__/compiler/deprecated.test.ts","../src/__tests__/compiler/do-while.test.ts","../src/__tests__/compiler/enum-payload.test.ts","../src/__tests__/compiler/interface.test.ts","../src/__tests__/compiler/match-string.test.ts","../src/__tests__/compiler/method-chain.test.ts","../src/__tests__/compiler/module-import.test.ts","../src/__tests__/compiler/option-extensions.test.ts","../src/__tests__/compiler/profile-decorator.test.ts","../src/__tests__/compiler/string-advanced.test.ts","../src/__tests__/compiler/tuple-type.test.ts","../src/__tests__/compiler/watch-decorator.test.ts","../src/__tests__/e2e/basic.test.ts","../src/__tests__/e2e/coroutine.test.ts","../src/__tests__/e2e/ecs-stdlib.test.ts","../src/__tests__/e2e/events-stdlib.test.ts","../src/__tests__/e2e/fft-stdlib.test.ts","../src/__tests__/e2e/for-in-array.test.ts","../src/__tests__/e2e/macros.test.ts","../src/__tests__/e2e/migrate.test.ts","../src/__tests__/e2e/ode-stdlib.test.ts","../src/__tests__/e2e/stdlib-e2e.test.ts","../src/__tests__/emit/compile-branches.test.ts","../src/__tests__/emit/compile-coverage.test.ts","../src/__tests__/emit/compile-extra-branches.test.ts","../src/__tests__/emit/compile-mocked-branches.test.ts","../src/__tests__/emit/compile.test.ts","../src/__tests__/emit/index.test.ts","../src/__tests__/emit/modules-branches.test.ts","../src/__tests__/emit/modules-coverage.test.ts","../src/__tests__/emit/modules-errors.test.ts","../src/__tests__/emit/modules-extra.test.ts","../src/__tests__/emit/modules-rewrite.test.ts","../src/__tests__/hir/desugar.test.ts","../src/__tests__/hir/lower-extra.test.ts","../src/__tests__/hir/monomorphize-extra.test.ts","../src/__tests__/hir/monomorphize-extra2.test.ts","../src/__tests__/lint/rules.test.ts","../src/__tests__/lir/lower.test.ts","../src/__tests__/lir/types.test.ts","../src/__tests__/lir/verify.test.ts","../src/__tests__/lsp/completion.test.ts","../src/__tests__/lsp/definition.test.ts","../src/__tests__/mc-integration/item-entity-events.test.ts","../src/__tests__/mc-integration/stdlib-coverage-2.test.ts","../src/__tests__/mc-integration/stdlib-coverage-3.test.ts","../src/__tests__/mc-integration/stdlib-coverage-4.test.ts","../src/__tests__/mc-integration/stdlib-coverage-5.test.ts","../src/__tests__/mc-integration/stdlib-coverage-6.test.ts","../src/__tests__/mc-integration/stdlib-coverage-7.test.ts","../src/__tests__/mc-integration/stdlib-coverage.test.ts","../src/__tests__/mc-integration/syntax-coverage.test.ts","../src/__tests__/mir/arithmetic.test.ts","../src/__tests__/mir/control-flow.test.ts","../src/__tests__/mir/lower-extra.test.ts","../src/__tests__/mir/lower-extra2.test.ts","../src/__tests__/mir/lower-extra3.test.ts","../src/__tests__/mir/lower-extra4.test.ts","../src/__tests__/mir/lower-extra5.test.ts","../src/__tests__/mir/lower-extra6.test.ts","../src/__tests__/mir/lower-extra7.test.ts","../src/__tests__/mir/lower-extra8.test.ts","../src/__tests__/mir/lower-extra9.test.ts","../src/__tests__/mir/verify.test.ts","../src/__tests__/optimizer/block_merge.test.ts","../src/__tests__/optimizer/branch_simplify.test.ts","../src/__tests__/optimizer/constant_fold.test.ts","../src/__tests__/optimizer/copy_prop.test.ts","../src/__tests__/optimizer/coroutine.test.ts","../src/__tests__/optimizer/dce.test.ts","../src/__tests__/optimizer/inline_fn.test.ts","../src/__tests__/optimizer/interprocedural.test.ts","../src/__tests__/optimizer/nbt-batch.test.ts","../src/__tests__/optimizer/optimizer-extended.test.ts","../src/__tests__/optimizer/pipeline.test.ts","../src/__tests__/optimizer/selector-cache.test.ts","../src/__tests__/optimizer/unroll.test.ts","../src/__tests__/optimizer/lir/const_imm.test.ts","../src/__tests__/optimizer/lir/dead_slot.test.ts","../src/__tests__/optimizer/lir/peephole.test.ts","../src/__tests__/optimizer/lir/pipeline.test.ts","../src/__tests__/stdlib/advanced.test.ts","../src/__tests__/stdlib/arr-len.test.ts","../src/__tests__/stdlib/bigint.test.ts","../src/__tests__/stdlib/bits.test.ts","../src/__tests__/stdlib/bossbar.test.ts","../src/__tests__/stdlib/calculus.test.ts","../src/__tests__/stdlib/color.test.ts","../src/__tests__/stdlib/combat.test.ts","../src/__tests__/stdlib/cooldown.test.ts","../src/__tests__/stdlib/dialog.test.ts","../src/__tests__/stdlib/easing.test.ts","../src/__tests__/stdlib/ecs.test.ts","../src/__tests__/stdlib/effects.test.ts","../src/__tests__/stdlib/events.test.ts","../src/__tests__/stdlib/expr.test.ts","../src/__tests__/stdlib/fft.test.ts","../src/__tests__/stdlib/geometry.test.ts","../src/__tests__/stdlib/graph.test.ts","../src/__tests__/stdlib/heap.test.ts","../src/__tests__/stdlib/interactions.test.ts","../src/__tests__/stdlib/inventory.test.ts","../src/__tests__/stdlib/linalg.test.ts","../src/__tests__/stdlib/list.test.ts","../src/__tests__/stdlib/map.test.ts","../src/__tests__/stdlib/math.test.ts","../src/__tests__/stdlib/math_hp.test.ts","../src/__tests__/stdlib/matrix.test.ts","../src/__tests__/stdlib/mobs.test.ts","../src/__tests__/stdlib/noise.test.ts","../src/__tests__/stdlib/ode.test.ts","../src/__tests__/stdlib/parabola.test.ts","../src/__tests__/stdlib/particles.test.ts","../src/__tests__/stdlib/pathfind.test.ts","../src/__tests__/stdlib/physics.test.ts","../src/__tests__/stdlib/player.test.ts","../src/__tests__/stdlib/quaternion.test.ts","../src/__tests__/stdlib/random.test.ts","../src/__tests__/stdlib/result.test.ts","../src/__tests__/stdlib/scheduler.test.ts","../src/__tests__/stdlib/set_int.test.ts","../src/__tests__/stdlib/sets.test.ts","../src/__tests__/stdlib/signal.test.ts","../src/__tests__/stdlib/sort-v2.test.ts","../src/__tests__/stdlib/sort.test.ts","../src/__tests__/stdlib/spawn.test.ts","../src/__tests__/stdlib/state.test.ts","../src/__tests__/stdlib/string.test.ts","../src/__tests__/stdlib/strings.test.ts","../src/__tests__/stdlib/tags.test.ts","../src/__tests__/stdlib/teams.test.ts","../src/__tests__/stdlib/timer.test.ts","../src/__tests__/stdlib/vec.test.ts","../src/__tests__/stdlib/world.test.ts","../src/__tests__/tuner/adapters.test.ts","../src/__tests__/tuner/engine.test.ts","../src/__tests__/tuner/simulator-extra.test.ts","../src/ast/types.ts","../src/builtins/metadata.ts","../src/cache/deps.ts","../src/cache/incremental.ts","../src/cache/index.ts","../src/diagnostics/index.ts","../src/emit/compile.ts","../src/emit/index.ts","../src/emit/modules.ts","../src/emit/sourcemap.ts","../src/events/types.ts","../src/formatter/index.ts","../src/hir/deprecated.ts","../src/hir/lower.ts","../src/hir/monomorphize.ts","../src/hir/types.ts","../src/lexer/index.ts","../src/lint/index.ts","../src/lir/budget.ts","../src/lir/lower.ts","../src/lir/types.ts","../src/lir/verify.ts","../src/lsp/main.ts","../src/lsp/server.ts","../src/mc-test/client.ts","../src/mc-test/runner.ts","../src/mc-test/setup.ts","../src/mc-validator/index.ts","../src/mir/lower.ts","../src/mir/macro.ts","../src/mir/types.ts","../src/mir/verify.ts","../src/nbt/index.ts","../src/optimizer/block_merge.ts","../src/optimizer/branch_simplify.ts","../src/optimizer/constant_fold.ts","../src/optimizer/copy_prop.ts","../src/optimizer/coroutine.ts","../src/optimizer/dce.ts","../src/optimizer/inline.ts","../src/optimizer/interprocedural.ts","../src/optimizer/nbt-batch.ts","../src/optimizer/pipeline.ts","../src/optimizer/selector-cache.ts","../src/optimizer/unroll.ts","../src/optimizer/lir/const_imm.ts","../src/optimizer/lir/dead_slot.ts","../src/optimizer/lir/peephole.ts","../src/optimizer/lir/pipeline.ts","../src/parser/index.ts","../src/runtime/index.ts","../src/tuner/cli.ts","../src/tuner/engine.ts","../src/tuner/metrics.ts","../src/tuner/simulator.ts","../src/tuner/types.ts","../src/tuner/adapters/ln-polynomial.ts","../src/tuner/adapters/sqrt-newton.ts","../src/typechecker/index.ts","../src/types/entity-hierarchy.ts","../src/types/mc-version.ts"],"version":"5.9.3"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# `graph` — Directed and Undirected Weighted Graphs
|
|
2
|
+
|
|
3
|
+
Import: `import "stdlib/graph.mcrs"`
|
|
4
|
+
|
|
5
|
+
Fixed-capacity graph utilities for RedScript datapacks. The graph is stored in a single flat `int[]`, supports up to **64 nodes** and **256 directed edges**, and provides traversal plus shortest-path helpers without any dynamic graph object type.
|
|
6
|
+
|
|
7
|
+
## Data Layout
|
|
8
|
+
|
|
9
|
+
`graph_new()` allocates a 770-element `int[]` with this layout:
|
|
10
|
+
|
|
11
|
+
| Index | Meaning |
|
|
12
|
+
|------|------|
|
|
13
|
+
| `g[0]` | Current directed edge count |
|
|
14
|
+
| `g[1]` | Node count |
|
|
15
|
+
| `g[2 + i * 3]` | Edge `i` source |
|
|
16
|
+
| `g[2 + i * 3 + 1]` | Edge `i` destination |
|
|
17
|
+
| `g[2 + i * 3 + 2]` | Edge `i` weight |
|
|
18
|
+
|
|
19
|
+
Nodes are zero-based integers in `[0, graph_node_count(g))`.
|
|
20
|
+
|
|
21
|
+
## Quick Example
|
|
22
|
+
|
|
23
|
+
```rs
|
|
24
|
+
import "stdlib/graph.mcrs";
|
|
25
|
+
|
|
26
|
+
let g: int[] = graph_new(5);
|
|
27
|
+
g = graph_add_edge(g, 0, 1, 1);
|
|
28
|
+
g = graph_add_edge(g, 0, 2, 4);
|
|
29
|
+
g = graph_add_undirected(g, 2, 3, 2);
|
|
30
|
+
g = graph_add_edge(g, 1, 3, 2);
|
|
31
|
+
g = graph_add_edge(g, 3, 4, 1);
|
|
32
|
+
|
|
33
|
+
let vis: int[] = [0, 0, 0, 0, 0];
|
|
34
|
+
let bfs_order: int[] = graph_bfs(g, 0, vis);
|
|
35
|
+
|
|
36
|
+
let dist: int[] = [0, 0, 0, 0, 0];
|
|
37
|
+
let shortest: int = graph_shortest_path(g, 0, 4, dist);
|
|
38
|
+
// shortest = 4 via 0 -> 1 -> 3 -> 4
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Functions
|
|
42
|
+
|
|
43
|
+
### `graph_new(n: int): int[]`
|
|
44
|
+
|
|
45
|
+
Allocate a new graph with `n` nodes and no edges. `n` is clamped to `[0, 64]`.
|
|
46
|
+
|
|
47
|
+
### `graph_add_edge(g: int[], src: int, dst: int, weight: int): int[]`
|
|
48
|
+
|
|
49
|
+
Append one directed edge `src -> dst`. If `src` or `dst` is invalid, or the graph already holds 256 directed edges, the input graph is returned unchanged.
|
|
50
|
+
|
|
51
|
+
### `graph_add_undirected(g: int[], a: int, b: int, weight: int): int[]`
|
|
52
|
+
|
|
53
|
+
Append `a -> b` and `b -> a` with the same weight. This consumes two directed-edge slots.
|
|
54
|
+
|
|
55
|
+
### `graph_node_count(g: int[]): int`
|
|
56
|
+
|
|
57
|
+
Return the configured node count.
|
|
58
|
+
|
|
59
|
+
### `graph_edge_count(g: int[]): int`
|
|
60
|
+
|
|
61
|
+
Return the current directed edge count.
|
|
62
|
+
|
|
63
|
+
### `graph_bfs(g: int[], start: int, out_visited: int[]): int[]`
|
|
64
|
+
|
|
65
|
+
Breadth-first search from `start`.
|
|
66
|
+
|
|
67
|
+
- Returns node indices in BFS visit order.
|
|
68
|
+
- Writes `1` into `out_visited[i]` for each reachable node.
|
|
69
|
+
- Returns `[]` if `start` is invalid.
|
|
70
|
+
|
|
71
|
+
`out_visited` must have at least `graph_node_count(g)` slots and should be zero-initialized by the caller.
|
|
72
|
+
|
|
73
|
+
### `graph_dfs(g: int[], start: int, out_visited: int[]): int[]`
|
|
74
|
+
|
|
75
|
+
Depth-first search from `start`.
|
|
76
|
+
|
|
77
|
+
- Returns node indices in DFS visit order.
|
|
78
|
+
- Writes `1` into `out_visited[i]` for each reachable node.
|
|
79
|
+
- Returns `[]` if `start` is invalid.
|
|
80
|
+
|
|
81
|
+
Like `graph_bfs()`, the caller owns the output array sizing.
|
|
82
|
+
|
|
83
|
+
### `graph_has_path(g: int[], src: int, dst: int): int`
|
|
84
|
+
|
|
85
|
+
Return `1` if a directed path exists from `src` to `dst`, otherwise `0`.
|
|
86
|
+
|
|
87
|
+
- Invalid endpoints also return `0`.
|
|
88
|
+
- The implementation uses BFS over the stored directed edges.
|
|
89
|
+
|
|
90
|
+
### `graph_shortest_path(g: int[], src: int, dst: int, out_dist: int[]): int`
|
|
91
|
+
|
|
92
|
+
Run Dijkstra from `src` and fill `out_dist` with shortest distances.
|
|
93
|
+
|
|
94
|
+
- `out_dist[i]` becomes the shortest distance from `src` to node `i`.
|
|
95
|
+
- Unreachable nodes are written as `-1`.
|
|
96
|
+
- The function returns `out_dist[dst]`.
|
|
97
|
+
- Invalid `src` or `dst` returns `-1`.
|
|
98
|
+
|
|
99
|
+
## Notes
|
|
100
|
+
|
|
101
|
+
- Edge weights are plain integers.
|
|
102
|
+
- Negative weights are not supported safely because the algorithm is Dijkstra.
|
|
103
|
+
- `graph_bfs()` and `graph_dfs()` use fixed-size internal arrays sized for 64 nodes.
|
|
104
|
+
- `graph_shortest_path()` uses `999999` as its internal infinity sentinel.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# `parabola` — Projectile Aiming and Trajectory Helpers
|
|
2
|
+
|
|
3
|
+
Import: `import "stdlib/parabola.mcrs"`
|
|
4
|
+
|
|
5
|
+
Projectile helpers for Minecraft-style trajectories. This module is aimed at launch planning and simple tick-by-tick simulation. It uses **×10000 fixed-point velocities** and a gravity constant tuned to Minecraft projectile motion.
|
|
6
|
+
|
|
7
|
+
## Units
|
|
8
|
+
|
|
9
|
+
- Position offsets: blocks
|
|
10
|
+
- Velocity: blocks/tick ×10000
|
|
11
|
+
- Time: ticks
|
|
12
|
+
- Gravity: `800` means `0.08 blocks/tick^2`
|
|
13
|
+
- Drag: ×10000
|
|
14
|
+
|
|
15
|
+
Requires `stdlib/math` for `mulfix()` and `isqrt()`.
|
|
16
|
+
|
|
17
|
+
## Quick Example
|
|
18
|
+
|
|
19
|
+
```rs
|
|
20
|
+
import "stdlib/parabola.mcrs";
|
|
21
|
+
|
|
22
|
+
let ticks: int = 20;
|
|
23
|
+
let vx: int = parabola_vx(16, ticks);
|
|
24
|
+
let vy: int = parabola_vy(4, ticks);
|
|
25
|
+
let vz: int = parabola_vz(0, ticks);
|
|
26
|
+
|
|
27
|
+
let y_at_10: int = parabola_y(vy, 10);
|
|
28
|
+
let flight: int = parabola_flight_time(vy);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Constants
|
|
32
|
+
|
|
33
|
+
### `parabola_gravity(): int`
|
|
34
|
+
|
|
35
|
+
Returns `800`, the per-tick gravity constant in ×10000 scale.
|
|
36
|
+
|
|
37
|
+
### `parabola_gravity_half(): int`
|
|
38
|
+
|
|
39
|
+
Returns `400`, used by the displacement formulas.
|
|
40
|
+
|
|
41
|
+
## Velocity Solvers
|
|
42
|
+
|
|
43
|
+
### `parabola_vx(dx: int, ticks: int): int`
|
|
44
|
+
|
|
45
|
+
Initial X velocity needed to travel `dx` blocks in `ticks` ticks. Returns `0` if `ticks <= 0`.
|
|
46
|
+
|
|
47
|
+
### `parabola_vy(dy: int, ticks: int): int`
|
|
48
|
+
|
|
49
|
+
Initial Y velocity needed to reach vertical offset `dy` in `ticks` ticks under constant gravity. Returns `0` if `ticks <= 0`.
|
|
50
|
+
|
|
51
|
+
### `parabola_vz(dz: int, ticks: int): int`
|
|
52
|
+
|
|
53
|
+
Initial Z velocity needed to travel `dz` blocks in `ticks` ticks. Returns `0` if `ticks <= 0`.
|
|
54
|
+
|
|
55
|
+
### `parabola_speed_xz(dx: int, dz: int, ticks: int): int`
|
|
56
|
+
|
|
57
|
+
Horizontal speed magnitude from the solved `vx` and `vz`, returned in ×10000 scale.
|
|
58
|
+
|
|
59
|
+
## Position at Tick `t`
|
|
60
|
+
|
|
61
|
+
### `parabola_x(vx0: int, t: int): int`
|
|
62
|
+
|
|
63
|
+
Horizontal X displacement after `t` ticks.
|
|
64
|
+
|
|
65
|
+
### `parabola_y(vy0: int, t: int): int`
|
|
66
|
+
|
|
67
|
+
Vertical displacement after `t` ticks under constant gravity.
|
|
68
|
+
|
|
69
|
+
### `parabola_z(vz0: int, t: int): int`
|
|
70
|
+
|
|
71
|
+
Horizontal Z displacement after `t` ticks.
|
|
72
|
+
|
|
73
|
+
## Flight Estimates
|
|
74
|
+
|
|
75
|
+
### `parabola_flight_time(vy0: int): int`
|
|
76
|
+
|
|
77
|
+
Approximate number of ticks until a projectile returns to launch height. Returns `0` if `vy0 <= 0`.
|
|
78
|
+
|
|
79
|
+
### `parabola_max_height(vy0: int): int`
|
|
80
|
+
|
|
81
|
+
Approximate maximum height above launch point, in blocks.
|
|
82
|
+
|
|
83
|
+
## Tick-Step Drag Helpers
|
|
84
|
+
|
|
85
|
+
These functions are for per-tick simulation, not closed-form aiming.
|
|
86
|
+
|
|
87
|
+
### `parabola_step_vx(vx: int, drag: int): int`
|
|
88
|
+
|
|
89
|
+
Apply drag to X velocity.
|
|
90
|
+
|
|
91
|
+
### `parabola_step_vy(vy: int, drag: int): int`
|
|
92
|
+
|
|
93
|
+
Apply gravity first, then drag, to Y velocity.
|
|
94
|
+
|
|
95
|
+
### `parabola_step_vz(vz: int, drag: int): int`
|
|
96
|
+
|
|
97
|
+
Apply drag to Z velocity.
|
|
98
|
+
|
|
99
|
+
## Targeting Helpers
|
|
100
|
+
|
|
101
|
+
### `parabola_ticks_for_range(range: int): int`
|
|
102
|
+
|
|
103
|
+
Estimate a practical flight time for a horizontal range, using a simple average-speed heuristic. Returns at least `1`.
|
|
104
|
+
|
|
105
|
+
### `parabola_in_range(dx: int, dz: int, max_range: int): int`
|
|
106
|
+
|
|
107
|
+
Return `1` if the horizontal target lies within `max_range`, otherwise `0`.
|
|
108
|
+
|
|
109
|
+
## Notes
|
|
110
|
+
|
|
111
|
+
- Closed-form position helpers here assume no drag.
|
|
112
|
+
- Drag-aware helpers only advance velocity one tick at a time.
|
|
113
|
+
- `parabola_y()` and `parabola_max_height()` return integer block values, so truncation is expected.
|