redscript-mc 2.6.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +11 -0
- package/CHANGELOG.md +18 -9
- package/README-benchmarks.md +48 -0
- package/README-vscode-test.md +251 -0
- package/RELEASE_NOTES.md +74 -0
- package/ROADMAP.md +131 -167
- package/benchmarks/_shared.ts +468 -0
- package/benchmarks/baseline.json +2816 -0
- package/benchmarks/baseline.md +13 -0
- package/benchmarks/compiler-perf.report.json +207 -0
- package/benchmarks/compiler-perf.ts +76 -0
- package/benchmarks/results.md +13 -0
- package/benchmarks/stdlib-complexity.report.json +2606 -0
- package/benchmarks/stdlib-complexity.ts +54 -0
- package/benchmarks/stdlib-size.md +57 -0
- package/benchmarks/stdlib-size.ts +91 -0
- package/coverage-report.md +177 -0
- package/dist/src/__tests__/budget.test.js +4 -0
- package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
- package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
- package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
- package/dist/src/__tests__/cache-extra.test.js +211 -0
- package/dist/src/__tests__/cli-init.test.d.ts +1 -0
- package/dist/src/__tests__/cli-init.test.js +97 -0
- package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
- package/dist/src/__tests__/cli-publish.test.js +189 -0
- package/dist/src/__tests__/cli.test.js +76 -0
- package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
- package/dist/src/__tests__/compile-preprocess.test.js +328 -0
- package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
- package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
- package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
- package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
- package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/do-while.test.js +120 -0
- package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
- package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
- package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/interface.test.js +258 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
- package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/match-string.test.js +43 -0
- package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/memoize.test.js +113 -0
- package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
- package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
- package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
- package/dist/src/__tests__/compiler/module-import.test.js +261 -0
- package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
- package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
- package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
- package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
- package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
- package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
- package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
- package/dist/src/__tests__/config/project-config.test.js +199 -0
- package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
- package/dist/src/__tests__/config-decorator.test.js +142 -0
- package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
- package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
- package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
- package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
- package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
- package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
- package/dist/src/__tests__/emit/index.test.js +2 -1
- package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
- package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
- package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
- package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
- package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
- package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
- package/dist/src/__tests__/emit/source-map.test.js +167 -0
- package/dist/src/__tests__/enum.test.js +9 -4
- package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
- package/dist/src/__tests__/error-recovery.test.js +217 -0
- package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
- package/dist/src/__tests__/events-types-extra.test.js +91 -0
- package/dist/src/__tests__/events-types.test.d.ts +4 -0
- package/dist/src/__tests__/events-types.test.js +56 -0
- package/dist/src/__tests__/formatter.test.js +13 -5
- package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
- package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
- package/dist/src/__tests__/incremental.test.js +10 -2
- package/dist/src/__tests__/index-extra.test.d.ts +10 -0
- package/dist/src/__tests__/index-extra.test.js +71 -0
- package/dist/src/__tests__/lexer.test.js +2 -2
- package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
- package/dist/src/__tests__/lint/rules.test.js +208 -0
- package/dist/src/__tests__/lir/lower.test.js +29 -0
- package/dist/src/__tests__/lir/verify.test.js +30 -0
- package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/completion.test.js +583 -0
- package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/definition.test.js +454 -0
- package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
- package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
- package/dist/src/__tests__/lsp.test.js +4 -1
- package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
- package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
- package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
- package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
- package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
- package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
- package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
- package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
- package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
- package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
- package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
- package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
- package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
- package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
- package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
- package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
- package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
- package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
- package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
- package/dist/src/__tests__/optimizer/cse.test.js +178 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
- package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/licm.test.js +244 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
- package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
- package/dist/src/__tests__/optimizer/tco.test.js +203 -0
- package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/parser-coverage.test.js +491 -0
- package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
- package/dist/src/__tests__/parser-extra.test.js +451 -0
- package/dist/src/__tests__/parser.test.js +12 -0
- package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
- package/dist/src/__tests__/repl-extra.test.js +174 -0
- package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
- package/dist/src/__tests__/repl-server-extra.test.js +161 -0
- package/dist/src/__tests__/repl-server.test.d.ts +6 -0
- package/dist/src/__tests__/repl-server.test.js +146 -0
- package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
- package/dist/src/__tests__/runtime-extra.test.js +732 -0
- package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
- package/dist/src/__tests__/singleton-decorator.test.js +260 -0
- package/dist/src/__tests__/sourcemap.test.js +1 -1
- package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
- package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
- package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bits.test.js +96 -0
- package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
- package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/color.test.js +84 -0
- package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/combat.test.js +64 -0
- package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
- package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
- package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
- package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/effects.test.js +72 -0
- package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/events.test.js +55 -0
- package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/expr.test.js +77 -0
- package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/fft.test.js +82 -0
- package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/graph.test.js +102 -0
- package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
- package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
- package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
- package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/map.test.js +84 -0
- package/dist/src/__tests__/stdlib/math.test.js +19 -6
- package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
- package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
- package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/noise.test.js +73 -0
- package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ode.test.js +68 -0
- package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
- package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/particles.test.js +68 -0
- package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/physics.test.js +76 -0
- package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/player.test.js +64 -0
- package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
- package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/queue.test.js +97 -0
- package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/random.test.js +76 -0
- package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/result.test.js +329 -0
- package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
- package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
- package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
- package/dist/src/__tests__/stdlib/sets.test.js +60 -0
- package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/signal.test.js +84 -0
- package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
- package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/string.test.js +231 -0
- package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/strings.test.js +83 -0
- package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/tags.test.js +57 -0
- package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/teams.test.js +72 -0
- package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/timer.test.js +79 -0
- package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/vec.test.js +94 -0
- package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/world.test.js +72 -0
- package/dist/src/__tests__/struct-display.test.d.ts +1 -0
- package/dist/src/__tests__/struct-display.test.js +64 -0
- package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
- package/dist/src/__tests__/test-framework/runner.test.js +193 -0
- package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
- package/dist/src/__tests__/tuner/adapters.test.js +194 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
- package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
- package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
- package/dist/src/__tests__/typechecker.test.js +3 -3
- package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/watch-decorator.test.js +54 -0
- package/dist/src/ast/types.d.ts +102 -3
- package/dist/src/cache/incremental.d.ts +13 -14
- package/dist/src/cache/incremental.js +106 -89
- package/dist/src/cache/index.d.ts +8 -2
- package/dist/src/cache/index.js +18 -6
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.js +466 -17
- package/dist/src/config/project-config.d.ts +29 -0
- package/dist/src/config/project-config.js +180 -0
- package/dist/src/diagnostics/index.d.ts +9 -0
- package/dist/src/diagnostics/index.js +18 -1
- package/dist/src/emit/compile.d.ts +10 -0
- package/dist/src/emit/compile.js +395 -50
- package/dist/src/emit/index.d.ts +40 -0
- package/dist/src/emit/index.js +307 -14
- package/dist/src/emit/modules.js +21 -3
- package/dist/src/emit/sourcemap.d.ts +23 -27
- package/dist/src/emit/sourcemap.js +52 -30
- package/dist/src/formatter/index.js +33 -8
- package/dist/src/hir/deprecated.d.ts +13 -0
- package/dist/src/hir/deprecated.js +218 -0
- package/dist/src/hir/lower.js +114 -8
- package/dist/src/hir/monomorphize.js +22 -2
- package/dist/src/hir/types.d.ts +65 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +18 -3
- package/dist/src/lexer/index.d.ts +2 -1
- package/dist/src/lexer/index.js +39 -3
- package/dist/src/lint/index.d.ts +45 -0
- package/dist/src/lint/index.js +930 -0
- package/dist/src/lir/lower.js +29 -2
- package/dist/src/lir/types.d.ts +2 -0
- package/dist/src/lsp/server.js +92 -5
- package/dist/src/mir/lower.js +775 -34
- package/dist/src/mir/macro.js +36 -2
- package/dist/src/mir/types.d.ts +12 -0
- package/dist/src/mir/verify.js +9 -0
- package/dist/src/optimizer/auto-inline.d.ts +2 -0
- package/dist/src/optimizer/auto-inline.js +67 -0
- package/dist/src/optimizer/cse.d.ts +20 -0
- package/dist/src/optimizer/cse.js +234 -0
- package/dist/src/optimizer/inline.d.ts +26 -0
- package/dist/src/optimizer/inline.js +286 -0
- package/dist/src/optimizer/interprocedural.js +4 -0
- package/dist/src/optimizer/licm.d.ts +32 -0
- package/dist/src/optimizer/licm.js +371 -0
- package/dist/src/optimizer/pipeline.js +12 -2
- package/dist/src/optimizer/strength_reduction.d.ts +15 -0
- package/dist/src/optimizer/strength_reduction.js +90 -0
- package/dist/src/optimizer/tco.d.ts +53 -0
- package/dist/src/optimizer/tco.js +238 -0
- package/dist/src/parser/index.d.ts +32 -0
- package/dist/src/parser/index.js +421 -59
- package/dist/src/repl-server.d.ts +13 -0
- package/dist/src/repl-server.js +127 -0
- package/dist/src/structs/expand.d.ts +15 -0
- package/dist/src/structs/expand.js +46 -0
- package/dist/src/testing/runner.d.ts +40 -0
- package/dist/src/testing/runner.js +237 -0
- package/dist/src/typechecker/index.d.ts +3 -0
- package/dist/src/typechecker/index.js +254 -9
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
- package/docs/stdlib/result.md +156 -0
- package/docs/stdlib/result.zh.md +156 -0
- package/editors/vscode/fixtures/test.mcrs +7 -0
- package/editors/vscode/out/extension.js +2095 -225
- package/editors/vscode/out/lsp-server.js +519 -51
- package/editors/vscode/package-lock.json +9 -4
- package/editors/vscode/package.json +1 -1
- package/examples/display-demo.mcrs +64 -0
- package/examples/game/racing.mcrs +301 -0
- package/examples/game/tower_defense.mcrs +311 -0
- package/examples/math/physics_sim.mcrs +322 -0
- package/examples/rpg/boss_fight.mcrs +313 -0
- package/examples/rpg/health_system.mcrs +237 -0
- package/examples/rpg/inventory.mcrs +265 -0
- package/examples/util/debug_hud.mcrs +279 -0
- package/jest.config.js +10 -0
- package/package.json +12 -3
- package/playground/index.html +823 -0
- package/scripts/gen-docs.ts +533 -0
- package/scripts/update-redscript-docs-stdlib.sh +770 -0
- package/src/__tests__/budget.test.ts +5 -0
- package/src/__tests__/cache/cache-behavior.test.ts +480 -0
- package/src/__tests__/cache-extra.test.ts +199 -0
- package/src/__tests__/cli-docs.test.ts +77 -0
- package/src/__tests__/cli-init.test.ts +91 -0
- package/src/__tests__/cli-publish.test.ts +190 -0
- package/src/__tests__/cli.test.ts +117 -1
- package/src/__tests__/compile-preprocess.test.ts +366 -0
- package/src/__tests__/compiler/break-stmt.test.ts +66 -0
- package/src/__tests__/compiler/const-decl.test.ts +141 -0
- package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
- package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
- package/src/__tests__/compiler/deprecated.test.ts +305 -0
- package/src/__tests__/compiler/do-while.test.ts +130 -0
- package/src/__tests__/compiler/enum-payload.test.ts +299 -0
- package/src/__tests__/compiler/interface.test.ts +287 -0
- package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
- package/src/__tests__/compiler/match-string.test.ts +45 -0
- package/src/__tests__/compiler/memoize.test.ts +126 -0
- package/src/__tests__/compiler/method-chain.test.ts +121 -0
- package/src/__tests__/compiler/module-import.test.ts +240 -0
- package/src/__tests__/compiler/option-extensions.test.ts +207 -0
- package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
- package/src/__tests__/compiler/string-advanced.test.ts +310 -0
- package/src/__tests__/compiler/struct-extends.test.ts +109 -0
- package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
- package/src/__tests__/compiler/tuple-type.test.ts +263 -0
- package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
- package/src/__tests__/config/project-config.test.ts +181 -0
- package/src/__tests__/config-decorator.test.ts +157 -0
- package/src/__tests__/diagnostics-extra.test.ts +155 -0
- package/src/__tests__/emit/compile-branches.test.ts +135 -0
- package/src/__tests__/emit/compile-coverage.test.ts +696 -0
- package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
- package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
- package/src/__tests__/emit/compile.test.ts +6 -1
- package/src/__tests__/emit/execute-chain.test.ts +114 -0
- package/src/__tests__/emit/index.test.ts +2 -1
- package/src/__tests__/emit/modules-branches.test.ts +90 -0
- package/src/__tests__/emit/modules-coverage.test.ts +241 -0
- package/src/__tests__/emit/modules-errors.test.ts +192 -0
- package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
- package/src/__tests__/emit/source-map.test.ts +152 -0
- package/src/__tests__/enum.test.ts +9 -4
- package/src/__tests__/error-recovery.test.ts +226 -0
- package/src/__tests__/events-types-extra.test.ts +110 -0
- package/src/__tests__/events-types.test.ts +66 -0
- package/src/__tests__/formatter.test.ts +15 -5
- package/src/__tests__/generics.test.ts +16 -9
- package/src/__tests__/hir/lower-extra.test.ts +151 -0
- package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
- package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
- package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
- package/src/__tests__/impl.test.ts +12 -8
- package/src/__tests__/incremental.test.ts +10 -2
- package/src/__tests__/index-extra.test.ts +79 -0
- package/src/__tests__/lexer.test.ts +2 -2
- package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
- package/src/__tests__/lint/rules-coverage.test.ts +598 -0
- package/src/__tests__/lint/rules.test.ts +230 -0
- package/src/__tests__/lir/lower.test.ts +33 -0
- package/src/__tests__/lir/verify.test.ts +33 -0
- package/src/__tests__/lsp/completion.test.ts +687 -0
- package/src/__tests__/lsp/definition.test.ts +499 -0
- package/src/__tests__/lsp/diagnostics.test.ts +108 -0
- package/src/__tests__/lsp/hover-docs.test.ts +222 -0
- package/src/__tests__/lsp.test.ts +4 -1
- package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
- package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
- package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
- package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
- package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
- package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
- package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
- package/src/__tests__/mc-validator-coverage.test.ts +325 -0
- package/src/__tests__/mc-validator-extra.test.ts +252 -0
- package/src/__tests__/mir/lower-extra.test.ts +402 -0
- package/src/__tests__/mir/lower-extra2.test.ts +348 -0
- package/src/__tests__/mir/lower-extra3.test.ts +277 -0
- package/src/__tests__/mir/lower-extra4.test.ts +636 -0
- package/src/__tests__/mir/lower-extra5.test.ts +612 -0
- package/src/__tests__/mir/lower-extra6.test.ts +520 -0
- package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
- package/src/__tests__/mir/lower-extra8.test.ts +704 -0
- package/src/__tests__/mir/lower-extra9.test.ts +821 -0
- package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
- package/src/__tests__/optimizer/cse.test.ts +195 -0
- package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
- package/src/__tests__/optimizer/licm.test.ts +358 -0
- package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
- package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
- package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
- package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
- package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
- package/src/__tests__/optimizer/tco.test.ts +238 -0
- package/src/__tests__/option.test.ts +14 -7
- package/src/__tests__/parser-coverage.test.ts +576 -0
- package/src/__tests__/parser-extra.test.ts +531 -0
- package/src/__tests__/parser.test.ts +14 -0
- package/src/__tests__/repl-extra.test.ts +195 -0
- package/src/__tests__/repl-server-extra.test.ts +150 -0
- package/src/__tests__/repl-server.test.ts +122 -0
- package/src/__tests__/runtime-extra.test.ts +862 -0
- package/src/__tests__/singleton-decorator.test.ts +285 -0
- package/src/__tests__/sourcemap.test.ts +1 -1
- package/src/__tests__/stdlib/advanced.test.ts +312 -0
- package/src/__tests__/stdlib/bigint.test.ts +57 -0
- package/src/__tests__/stdlib/bits.test.ts +75 -0
- package/src/__tests__/stdlib/bossbar.test.ts +45 -0
- package/src/__tests__/stdlib/color.test.ts +60 -0
- package/src/__tests__/stdlib/combat.test.ts +35 -0
- package/src/__tests__/stdlib/cooldown.test.ts +35 -0
- package/src/__tests__/stdlib/dialog.test.ts +14 -6
- package/src/__tests__/stdlib/ecs.test.ts +54 -0
- package/src/__tests__/stdlib/effects.test.ts +45 -0
- package/src/__tests__/stdlib/events.test.ts +23 -0
- package/src/__tests__/stdlib/expr.test.ts +48 -0
- package/src/__tests__/stdlib/fft.test.ts +54 -0
- package/src/__tests__/stdlib/graph.test.ts +77 -0
- package/src/__tests__/stdlib/interactions.test.ts +30 -0
- package/src/__tests__/stdlib/inventory.test.ts +40 -0
- package/src/__tests__/stdlib/linalg.test.ts +52 -0
- package/src/__tests__/stdlib/map.test.ts +55 -0
- package/src/__tests__/stdlib/math.test.ts +19 -5
- package/src/__tests__/stdlib/math_hp.test.ts +55 -0
- package/src/__tests__/stdlib/mobs.test.ts +40 -0
- package/src/__tests__/stdlib/noise.test.ts +46 -0
- package/src/__tests__/stdlib/ode.test.ts +40 -0
- package/src/__tests__/stdlib/parabola.test.ts +51 -0
- package/src/__tests__/stdlib/particles.test.ts +40 -0
- package/src/__tests__/stdlib/physics.test.ts +50 -0
- package/src/__tests__/stdlib/player.test.ts +35 -0
- package/src/__tests__/stdlib/quaternion.test.ts +46 -0
- package/src/__tests__/stdlib/queue.test.ts +73 -0
- package/src/__tests__/stdlib/random.test.ts +50 -0
- package/src/__tests__/stdlib/result.test.ts +326 -0
- package/src/__tests__/stdlib/scheduler.test.ts +18 -7
- package/src/__tests__/stdlib/set_int.test.ts +62 -0
- package/src/__tests__/stdlib/sets.test.ts +28 -0
- package/src/__tests__/stdlib/signal.test.ts +60 -0
- package/src/__tests__/stdlib/spawn.test.ts +40 -0
- package/src/__tests__/stdlib/string.test.ts +224 -0
- package/src/__tests__/stdlib/strings.test.ts +55 -0
- package/src/__tests__/stdlib/tags.test.ts +32 -0
- package/src/__tests__/stdlib/teams.test.ts +45 -0
- package/src/__tests__/stdlib/timer.test.ts +53 -0
- package/src/__tests__/stdlib/vec.test.ts +72 -0
- package/src/__tests__/stdlib/world.test.ts +45 -0
- package/src/__tests__/struct-display.test.ts +69 -0
- package/src/__tests__/test-framework/runner.test.ts +208 -0
- package/src/__tests__/tuner/adapters.test.ts +232 -0
- package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
- package/src/__tests__/tuple.test.ts +11 -4
- package/src/__tests__/typechecker-coverage.test.ts +671 -0
- package/src/__tests__/typechecker.test.ts +4 -3
- package/src/__tests__/watch-decorator.test.ts +59 -0
- package/src/ast/types.ts +65 -3
- package/src/cache/incremental.ts +128 -99
- package/src/cache/index.ts +35 -8
- package/src/cli.ts +538 -29
- package/src/config/project-config.ts +176 -0
- package/src/diagnostics/index.ts +22 -0
- package/src/docs.ts +98 -0
- package/src/emit/compile.ts +408 -51
- package/src/emit/index.ts +366 -18
- package/src/emit/modules.ts +19 -3
- package/src/emit/sourcemap.ts +64 -43
- package/src/formatter/index.ts +35 -8
- package/src/hir/deprecated.ts +212 -0
- package/src/hir/lower.ts +128 -8
- package/src/hir/monomorphize.ts +24 -2
- package/src/hir/types.ts +26 -1
- package/src/index.ts +23 -3
- package/src/lexer/index.ts +45 -6
- package/src/lint/index.ts +922 -0
- package/src/lir/lower.ts +30 -2
- package/src/lir/types.ts +4 -0
- package/src/lsp/server.ts +100 -1
- package/src/mir/lower.ts +785 -40
- package/src/mir/macro.ts +30 -2
- package/src/mir/types.ts +13 -0
- package/src/mir/verify.ts +10 -2
- package/src/optimizer/auto-inline.ts +86 -0
- package/src/optimizer/copy_prop.ts +2 -2
- package/src/optimizer/coroutine.ts +3 -3
- package/src/optimizer/cse.ts +205 -0
- package/src/optimizer/dce.ts +2 -2
- package/src/optimizer/inline.ts +335 -0
- package/src/optimizer/interprocedural.ts +5 -1
- package/src/optimizer/licm.ts +454 -0
- package/src/optimizer/nbt-coalesce.ts +109 -0
- package/src/optimizer/pipeline.ts +16 -2
- package/src/optimizer/scoreboard-batch.ts +52 -0
- package/src/optimizer/strength_reduction.ts +95 -0
- package/src/optimizer/tco.ts +267 -0
- package/src/optimizer/unroll.ts +2 -2
- package/src/parser/index.ts +426 -53
- package/src/repl-server.ts +102 -0
- package/src/stdlib/advanced.mcrs +271 -101
- package/src/stdlib/bigint.mcrs +97 -11
- package/src/stdlib/bits.mcrs +75 -12
- package/src/stdlib/bossbar.mcrs +37 -8
- package/src/stdlib/calculus.mcrs +82 -26
- package/src/stdlib/color.mcrs +98 -16
- package/src/stdlib/combat.mcrs +23 -5
- package/src/stdlib/cooldown.mcrs +19 -0
- package/src/stdlib/dialog.mcrs +45 -7
- package/src/stdlib/easing.mcrs +132 -12
- package/src/stdlib/ecs.mcrs +142 -25
- package/src/stdlib/effects.mcrs +88 -12
- package/src/stdlib/events.mcrs +21 -2
- package/src/stdlib/expr.mcrs +18 -3
- package/src/stdlib/fft.mcrs +66 -56
- package/src/stdlib/geometry.mcrs +137 -39
- package/src/stdlib/graph.mcrs +73 -0
- package/src/stdlib/heap.mcrs +49 -8
- package/src/stdlib/i18n/zh.yaml +2891 -0
- package/src/stdlib/interactions.mcrs +43 -20
- package/src/stdlib/inventory.mcrs +14 -3
- package/src/stdlib/linalg.mcrs +185 -30
- package/src/stdlib/list.mcrs +168 -18
- package/src/stdlib/map.mcrs +112 -0
- package/src/stdlib/math.mcrs +68 -18
- package/src/stdlib/math_hp.mcrs +124 -33
- package/src/stdlib/matrix.mcrs +133 -20
- package/src/stdlib/mobs.mcrs +87 -0
- package/src/stdlib/noise.mcrs +65 -21
- package/src/stdlib/ode.mcrs +96 -0
- package/src/stdlib/parabola.mcrs +104 -29
- package/src/stdlib/particles.mcrs +78 -21
- package/src/stdlib/pathfind.mcrs +89 -35
- package/src/stdlib/physics.mcrs +134 -26
- package/src/stdlib/player.mcrs +18 -0
- package/src/stdlib/quaternion.mcrs +213 -9
- package/src/stdlib/queue.mcrs +123 -0
- package/src/stdlib/random.mcrs +63 -18
- package/src/stdlib/result.mcrs +111 -0
- package/src/stdlib/scheduler.mcrs +59 -10
- package/src/stdlib/set_int.mcrs +240 -0
- package/src/stdlib/sets.mcrs +49 -19
- package/src/stdlib/signal.mcrs +151 -79
- package/src/stdlib/sort.mcrs +44 -24
- package/src/stdlib/spawn.mcrs +30 -7
- package/src/stdlib/state.mcrs +40 -5
- package/src/stdlib/strings.mcrs +131 -3
- package/src/stdlib/tags.mcrs +2 -2
- package/src/stdlib/teams.mcrs +22 -10
- package/src/stdlib/timer.mcrs +36 -6
- package/src/stdlib/vec.mcrs +44 -9
- package/src/stdlib/world.mcrs +57 -25
- package/src/structs/expand.ts +64 -0
- package/src/testing/runner.ts +271 -0
- package/src/typechecker/index.ts +273 -9
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for enhanced string features:
|
|
4
|
+
* - Enhanced f-string interpolation (expressions, function calls, array indexing)
|
|
5
|
+
* - Multi-line triple-quoted strings
|
|
6
|
+
* - int_to_str / bool_to_str builtin functions
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const lexer_1 = require("../../lexer");
|
|
10
|
+
const parser_1 = require("../../parser");
|
|
11
|
+
const lower_1 = require("../../hir/lower");
|
|
12
|
+
const lower_2 = require("../../mir/lower");
|
|
13
|
+
const verify_1 = require("../../mir/verify");
|
|
14
|
+
const compile_1 = require("../../emit/compile");
|
|
15
|
+
const typechecker_1 = require("../../typechecker");
|
|
16
|
+
function parse(source) {
|
|
17
|
+
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
18
|
+
return new parser_1.Parser(tokens, source).parse('test');
|
|
19
|
+
}
|
|
20
|
+
function compileSource(source, namespace = 'test') {
|
|
21
|
+
return (0, compile_1.compile)(source, { namespace });
|
|
22
|
+
}
|
|
23
|
+
function typeCheck(source) {
|
|
24
|
+
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
25
|
+
const ast = new parser_1.Parser(tokens, source).parse('test');
|
|
26
|
+
const tc = new typechecker_1.TypeChecker(source, 'test');
|
|
27
|
+
return tc.check(ast);
|
|
28
|
+
}
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Multi-line strings
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
describe('multi-line triple-quoted strings', () => {
|
|
33
|
+
test('lexer tokenizes triple-quoted string as string_lit', () => {
|
|
34
|
+
const tokens = new lexer_1.Lexer('"""Hello\nWorld"""').tokenize();
|
|
35
|
+
expect(tokens[0].kind).toBe('string_lit');
|
|
36
|
+
expect(tokens[0].value).toBe('Hello\nWorld');
|
|
37
|
+
});
|
|
38
|
+
test('triple-quoted string with leading/trailing newlines is trimmed', () => {
|
|
39
|
+
const tokens = new lexer_1.Lexer('"""\nHello\nWorld\n"""').tokenize();
|
|
40
|
+
expect(tokens[0].kind).toBe('string_lit');
|
|
41
|
+
expect(tokens[0].value).toBe('Hello\nWorld');
|
|
42
|
+
});
|
|
43
|
+
test('triple-quoted string compiles in let binding', () => {
|
|
44
|
+
expect(() => compileSource(`
|
|
45
|
+
fn test() {
|
|
46
|
+
let msg: string = """
|
|
47
|
+
Hello
|
|
48
|
+
World
|
|
49
|
+
"""
|
|
50
|
+
say(msg)
|
|
51
|
+
}
|
|
52
|
+
`)).not.toThrow();
|
|
53
|
+
});
|
|
54
|
+
test('typechecker accepts triple-quoted string as string type', () => {
|
|
55
|
+
const errors = typeCheck(`
|
|
56
|
+
fn test() {
|
|
57
|
+
let msg: string = """
|
|
58
|
+
Hello
|
|
59
|
+
World
|
|
60
|
+
"""
|
|
61
|
+
}
|
|
62
|
+
`);
|
|
63
|
+
expect(errors).toHaveLength(0);
|
|
64
|
+
});
|
|
65
|
+
test('triple-quoted string with interpolation content parses correctly', () => {
|
|
66
|
+
const ast = parse(`
|
|
67
|
+
fn test() {
|
|
68
|
+
let s: string = """Line 1
|
|
69
|
+
Line 2"""
|
|
70
|
+
}
|
|
71
|
+
`);
|
|
72
|
+
expect(ast.declarations).toHaveLength(1);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Enhanced f-string interpolation
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
describe('enhanced f-string interpolation', () => {
|
|
79
|
+
test('f-string with simple variable compiles', () => {
|
|
80
|
+
expect(() => compileSource(`
|
|
81
|
+
fn test() {
|
|
82
|
+
let x: int = 5
|
|
83
|
+
tellraw(@a, f"Value: {x}")
|
|
84
|
+
}
|
|
85
|
+
`)).not.toThrow();
|
|
86
|
+
});
|
|
87
|
+
test('f-string with binary expression compiles', () => {
|
|
88
|
+
expect(() => compileSource(`
|
|
89
|
+
fn test() {
|
|
90
|
+
let x: int = 5
|
|
91
|
+
tellraw(@a, f"Result: {x + 1}")
|
|
92
|
+
}
|
|
93
|
+
`)).not.toThrow();
|
|
94
|
+
});
|
|
95
|
+
test('f-string with arithmetic expression compiles', () => {
|
|
96
|
+
expect(() => compileSource(`
|
|
97
|
+
fn test() {
|
|
98
|
+
let a: int = 3
|
|
99
|
+
let b: int = 4
|
|
100
|
+
tellraw(@a, f"Product: {a * b}")
|
|
101
|
+
}
|
|
102
|
+
`)).not.toThrow();
|
|
103
|
+
});
|
|
104
|
+
test('f-string with function call expression compiles', () => {
|
|
105
|
+
expect(() => compileSource(`
|
|
106
|
+
fn double(n: int): int {
|
|
107
|
+
return n * 2
|
|
108
|
+
}
|
|
109
|
+
fn test() {
|
|
110
|
+
let x: int = 5
|
|
111
|
+
tellraw(@a, f"Doubled: {double(x)}")
|
|
112
|
+
}
|
|
113
|
+
`)).not.toThrow();
|
|
114
|
+
});
|
|
115
|
+
test('f-string passes MIR verification with expression interpolation', () => {
|
|
116
|
+
const source = `
|
|
117
|
+
fn test() {
|
|
118
|
+
let x: int = 5
|
|
119
|
+
tellraw(@a, f"Result: {x + 1}")
|
|
120
|
+
}
|
|
121
|
+
`;
|
|
122
|
+
const ast = parse(source);
|
|
123
|
+
const hir = (0, lower_1.lowerToHIR)(ast);
|
|
124
|
+
const mir = (0, lower_2.lowerToMIR)(hir);
|
|
125
|
+
expect((0, verify_1.verifyMIR)(mir)).toEqual([]);
|
|
126
|
+
});
|
|
127
|
+
test('f-string with multiple complex parts compiles', () => {
|
|
128
|
+
expect(() => compileSource(`
|
|
129
|
+
fn test() {
|
|
130
|
+
let a: int = 3
|
|
131
|
+
let b: int = 4
|
|
132
|
+
tellraw(@a, f"Sum: {a + b}, Product: {a * b}")
|
|
133
|
+
}
|
|
134
|
+
`)).not.toThrow();
|
|
135
|
+
});
|
|
136
|
+
test('f-string with text-only parts still works', () => {
|
|
137
|
+
expect(() => compileSource(`
|
|
138
|
+
fn test() {
|
|
139
|
+
tellraw(@a, f"Hello World")
|
|
140
|
+
}
|
|
141
|
+
`)).not.toThrow();
|
|
142
|
+
});
|
|
143
|
+
test('f-string generates JSON text component with score reference for ident', () => {
|
|
144
|
+
const source = `
|
|
145
|
+
fn test() {
|
|
146
|
+
let score: int = 10
|
|
147
|
+
tellraw(@a, f"Score: {score}")
|
|
148
|
+
}
|
|
149
|
+
`;
|
|
150
|
+
const result = compileSource(source, 'myns');
|
|
151
|
+
// result is CompileResult with .files array of { path, content }
|
|
152
|
+
const allContent = result.files.map(f => f.content).join('\n');
|
|
153
|
+
expect(allContent).toContain('tellraw');
|
|
154
|
+
// Should contain a JSON text component with 'text' or 'score'
|
|
155
|
+
expect(allContent.includes('score') || allContent.includes('text')).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
test('f-string with expression generates precomputed temp in MIR', () => {
|
|
158
|
+
const source = `
|
|
159
|
+
fn test() {
|
|
160
|
+
let x: int = 5
|
|
161
|
+
tellraw(@a, f"Val: {x + 1}")
|
|
162
|
+
}
|
|
163
|
+
`;
|
|
164
|
+
const ast = parse(source);
|
|
165
|
+
const hir = (0, lower_1.lowerToHIR)(ast);
|
|
166
|
+
const mir = (0, lower_2.lowerToMIR)(hir);
|
|
167
|
+
const fn = mir.functions.find(f => f.name === 'test');
|
|
168
|
+
expect(fn).toBeDefined();
|
|
169
|
+
// Should have emitted arithmetic instructions for x + 1
|
|
170
|
+
const allInstrs = fn.blocks.flatMap(b => b.instrs);
|
|
171
|
+
// MIR arithmetic uses 'add', 'sub', 'mul', etc. (not 'arith')
|
|
172
|
+
const arithInstrs = allInstrs.filter(i => ['add', 'sub', 'mul', 'div'].includes(i.kind));
|
|
173
|
+
expect(arithInstrs.length).toBeGreaterThan(0);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
// int_to_str and bool_to_str
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
describe('int_to_str builtin', () => {
|
|
180
|
+
test('int_to_str is accepted by typechecker', () => {
|
|
181
|
+
const errors = typeCheck(`
|
|
182
|
+
fn test() {
|
|
183
|
+
let n: int = 42
|
|
184
|
+
let s: string = int_to_str(n)
|
|
185
|
+
}
|
|
186
|
+
`);
|
|
187
|
+
expect(errors).toHaveLength(0);
|
|
188
|
+
});
|
|
189
|
+
test('int_to_str in f-string compiles', () => {
|
|
190
|
+
expect(() => compileSource(`
|
|
191
|
+
fn test() {
|
|
192
|
+
let n: int = 42
|
|
193
|
+
tellraw(@a, f"Value: {int_to_str(n)}")
|
|
194
|
+
}
|
|
195
|
+
`)).not.toThrow();
|
|
196
|
+
});
|
|
197
|
+
test('int_to_str standalone compiles', () => {
|
|
198
|
+
expect(() => compileSource(`
|
|
199
|
+
fn test() {
|
|
200
|
+
let n: int = 42
|
|
201
|
+
let s: string = int_to_str(n)
|
|
202
|
+
}
|
|
203
|
+
`)).not.toThrow();
|
|
204
|
+
});
|
|
205
|
+
test('int_to_str passes MIR verification', () => {
|
|
206
|
+
const source = `
|
|
207
|
+
fn test() {
|
|
208
|
+
let n: int = 42
|
|
209
|
+
let s: string = int_to_str(n)
|
|
210
|
+
}
|
|
211
|
+
`;
|
|
212
|
+
const ast = parse(source);
|
|
213
|
+
const hir = (0, lower_1.lowerToHIR)(ast);
|
|
214
|
+
const mir = (0, lower_2.lowerToMIR)(hir);
|
|
215
|
+
expect((0, verify_1.verifyMIR)(mir)).toEqual([]);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe('bool_to_str builtin', () => {
|
|
219
|
+
test('bool_to_str is accepted by typechecker', () => {
|
|
220
|
+
const errors = typeCheck(`
|
|
221
|
+
fn test() {
|
|
222
|
+
let b: bool = true
|
|
223
|
+
let s: string = bool_to_str(b)
|
|
224
|
+
}
|
|
225
|
+
`);
|
|
226
|
+
expect(errors).toHaveLength(0);
|
|
227
|
+
});
|
|
228
|
+
test('bool_to_str in f-string compiles', () => {
|
|
229
|
+
expect(() => compileSource(`
|
|
230
|
+
fn test() {
|
|
231
|
+
let b: bool = true
|
|
232
|
+
tellraw(@a, f"Active: {bool_to_str(b)}")
|
|
233
|
+
}
|
|
234
|
+
`)).not.toThrow();
|
|
235
|
+
});
|
|
236
|
+
test('bool_to_str passes MIR verification', () => {
|
|
237
|
+
const source = `
|
|
238
|
+
fn test() {
|
|
239
|
+
let b: bool = false
|
|
240
|
+
let s: string = bool_to_str(b)
|
|
241
|
+
}
|
|
242
|
+
`;
|
|
243
|
+
const ast = parse(source);
|
|
244
|
+
const hir = (0, lower_1.lowerToHIR)(ast);
|
|
245
|
+
const mir = (0, lower_2.lowerToMIR)(hir);
|
|
246
|
+
expect((0, verify_1.verifyMIR)(mir)).toEqual([]);
|
|
247
|
+
});
|
|
248
|
+
test('bool_to_str in title builtin compiles', () => {
|
|
249
|
+
expect(() => compileSource(`
|
|
250
|
+
fn test() {
|
|
251
|
+
let active: bool = true
|
|
252
|
+
title(@a, f"Active: {bool_to_str(active)}")
|
|
253
|
+
}
|
|
254
|
+
`)).not.toThrow();
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
// Integration: combined features
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
describe('combined string features', () => {
|
|
261
|
+
test('multi-line string with f-string expression compiles', () => {
|
|
262
|
+
expect(() => compileSource(`
|
|
263
|
+
fn test() {
|
|
264
|
+
let x: int = 10
|
|
265
|
+
let msg: string = """Hello World"""
|
|
266
|
+
tellraw(@a, f"Score: {x + 5}")
|
|
267
|
+
}
|
|
268
|
+
`)).not.toThrow();
|
|
269
|
+
});
|
|
270
|
+
test('int_to_str and f-string with arithmetic in same function', () => {
|
|
271
|
+
expect(() => compileSource(`
|
|
272
|
+
fn test() {
|
|
273
|
+
let n: int = 5
|
|
274
|
+
let doubled: int = n * 2
|
|
275
|
+
let s: string = int_to_str(doubled)
|
|
276
|
+
tellraw(@a, f"Value: {n + 1}, Doubled str: {int_to_str(n * 2)}")
|
|
277
|
+
}
|
|
278
|
+
`)).not.toThrow();
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
//# sourceMappingURL=string-advanced.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const lexer_1 = require("../../lexer");
|
|
4
|
+
const parser_1 = require("../../parser");
|
|
5
|
+
const lower_1 = require("../../hir/lower");
|
|
6
|
+
const compile_1 = require("../../emit/compile");
|
|
7
|
+
const typechecker_1 = require("../../typechecker");
|
|
8
|
+
function parse(source) {
|
|
9
|
+
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
10
|
+
return new parser_1.Parser(tokens, source).parse('test');
|
|
11
|
+
}
|
|
12
|
+
function typeCheck(source) {
|
|
13
|
+
const program = parse(source);
|
|
14
|
+
return new typechecker_1.TypeChecker(source).check(program);
|
|
15
|
+
}
|
|
16
|
+
describe('struct-extends: parser', () => {
|
|
17
|
+
test('parses extends clause on struct declarations', () => {
|
|
18
|
+
const program = parse(`
|
|
19
|
+
struct Animal { name: string, hp: int }
|
|
20
|
+
struct Dog extends Animal { breed: string }
|
|
21
|
+
`);
|
|
22
|
+
expect(program.structs).toHaveLength(2);
|
|
23
|
+
expect(program.structs[1].name).toBe('Dog');
|
|
24
|
+
expect(program.structs[1].extends).toBe('Animal');
|
|
25
|
+
expect(program.structs[1].fields.map(field => field.name)).toEqual(['breed']);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('struct-extends: HIR lowering', () => {
|
|
29
|
+
test('expands inherited fields before child fields', () => {
|
|
30
|
+
const hir = (0, lower_1.lowerToHIR)(parse(`
|
|
31
|
+
struct Animal { name: string, hp: int }
|
|
32
|
+
struct Dog extends Animal { breed: string }
|
|
33
|
+
`));
|
|
34
|
+
expect(hir.structs[1].fields.map(field => field.name)).toEqual(['name', 'hp', 'breed']);
|
|
35
|
+
});
|
|
36
|
+
test('expands multi-level inheritance transitively', () => {
|
|
37
|
+
const hir = (0, lower_1.lowerToHIR)(parse(`
|
|
38
|
+
struct Base { id: int }
|
|
39
|
+
struct Animal extends Base { hp: int }
|
|
40
|
+
struct Dog extends Animal { breed: string }
|
|
41
|
+
`));
|
|
42
|
+
expect(hir.structs[2].fields.map(field => field.name)).toEqual(['id', 'hp', 'breed']);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('struct-extends: typechecker', () => {
|
|
46
|
+
test('accepts inherited fields in struct literals', () => {
|
|
47
|
+
const errors = typeCheck(`
|
|
48
|
+
struct Animal { name: string, hp: int }
|
|
49
|
+
struct Dog extends Animal { breed: string }
|
|
50
|
+
fn make(): Dog {
|
|
51
|
+
return Dog { name: "Rex", hp: 10, breed: "Corgi" }
|
|
52
|
+
}
|
|
53
|
+
`);
|
|
54
|
+
expect(errors).toHaveLength(0);
|
|
55
|
+
});
|
|
56
|
+
test('accepts multi-level inherited field access', () => {
|
|
57
|
+
const errors = typeCheck(`
|
|
58
|
+
struct Base { id: int }
|
|
59
|
+
struct Animal extends Base { hp: int }
|
|
60
|
+
struct Dog extends Animal { breed: string }
|
|
61
|
+
fn id_of(d: Dog): int {
|
|
62
|
+
return d.id
|
|
63
|
+
}
|
|
64
|
+
`);
|
|
65
|
+
expect(errors).toHaveLength(0);
|
|
66
|
+
});
|
|
67
|
+
test('reports overriding an inherited field', () => {
|
|
68
|
+
const errors = typeCheck(`
|
|
69
|
+
struct Animal { name: string, hp: int }
|
|
70
|
+
struct Dog extends Animal { hp: int, breed: string }
|
|
71
|
+
`);
|
|
72
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
73
|
+
expect(errors[0].message).toContain("Struct 'Dog' cannot override inherited field 'hp'");
|
|
74
|
+
});
|
|
75
|
+
test('reports unknown parent struct', () => {
|
|
76
|
+
const errors = typeCheck(`
|
|
77
|
+
struct Dog extends Animal { breed: string }
|
|
78
|
+
`);
|
|
79
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
80
|
+
expect(errors[0].message).toContain("Struct 'Dog' extends unknown struct 'Animal'");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('struct-extends: compile', () => {
|
|
84
|
+
test('compiles inherited structs as flattened plain structs', () => {
|
|
85
|
+
expect(() => (0, compile_1.compile)(`
|
|
86
|
+
struct Animal { name: string, hp: int }
|
|
87
|
+
struct Dog extends Animal { breed: string }
|
|
88
|
+
@keep fn main(): void {
|
|
89
|
+
let dog: Dog = Dog { name: "Rex", hp: 10, breed: "Corgi" }
|
|
90
|
+
let hp: int = dog.hp
|
|
91
|
+
}
|
|
92
|
+
`, { namespace: 'test' })).not.toThrow();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=struct-extends.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const compile_1 = require("../../emit/compile");
|
|
4
|
+
const lexer_1 = require("../../lexer");
|
|
5
|
+
const parser_1 = require("../../parser");
|
|
6
|
+
const typechecker_1 = require("../../typechecker");
|
|
7
|
+
function getFile(files, path) {
|
|
8
|
+
const file = files.find(entry => entry.path === path);
|
|
9
|
+
if (!file) {
|
|
10
|
+
throw new Error(`Missing file: ${path}\nFiles:\n${files.map(entry => entry.path).join('\n')}`);
|
|
11
|
+
}
|
|
12
|
+
return file.content;
|
|
13
|
+
}
|
|
14
|
+
function parseDecorators(source) {
|
|
15
|
+
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
16
|
+
const ast = new parser_1.Parser(tokens).parse('test');
|
|
17
|
+
return ast.declarations[0]?.decorators ?? [];
|
|
18
|
+
}
|
|
19
|
+
function typeCheck(source) {
|
|
20
|
+
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
21
|
+
const ast = new parser_1.Parser(tokens).parse('test');
|
|
22
|
+
return new typechecker_1.TypeChecker(source).check(ast);
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// @throttle tests
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
describe('@throttle decorator', () => {
|
|
28
|
+
test('parser records @throttle with ticks argument', () => {
|
|
29
|
+
const decorators = parseDecorators(`
|
|
30
|
+
@throttle(ticks=20)
|
|
31
|
+
fn on_player_move() {}
|
|
32
|
+
`);
|
|
33
|
+
expect(decorators).toHaveLength(1);
|
|
34
|
+
expect(decorators[0].name).toBe('throttle');
|
|
35
|
+
expect(decorators[0].args?.ticks).toBe(20);
|
|
36
|
+
});
|
|
37
|
+
test('typechecker rejects @throttle without ticks argument', () => {
|
|
38
|
+
const errors = typeCheck(`
|
|
39
|
+
@throttle(ticks=0)
|
|
40
|
+
fn on_player_move() {}
|
|
41
|
+
`);
|
|
42
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
43
|
+
expect(errors[0].message).toContain('@throttle');
|
|
44
|
+
});
|
|
45
|
+
test('typechecker rejects duplicate @throttle decorators', () => {
|
|
46
|
+
const errors = typeCheck(`
|
|
47
|
+
@throttle(ticks=10)
|
|
48
|
+
@throttle(ticks=20)
|
|
49
|
+
fn on_player_move() {}
|
|
50
|
+
`);
|
|
51
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
52
|
+
expect(errors[0].message).toContain('multiple @throttle');
|
|
53
|
+
});
|
|
54
|
+
test('typechecker accepts valid @throttle decorator', () => {
|
|
55
|
+
const errors = typeCheck(`
|
|
56
|
+
@throttle(ticks=20)
|
|
57
|
+
fn on_player_move() {}
|
|
58
|
+
`);
|
|
59
|
+
expect(errors).toHaveLength(0);
|
|
60
|
+
});
|
|
61
|
+
test('emits throttle objective in load.mcfunction', () => {
|
|
62
|
+
const result = (0, compile_1.compile)(`
|
|
63
|
+
@throttle(ticks=20)
|
|
64
|
+
fn on_player_move() {
|
|
65
|
+
say("moved");
|
|
66
|
+
}
|
|
67
|
+
`, { namespace: 'throttle_test' });
|
|
68
|
+
const load = getFile(result.files, 'data/throttle_test/function/load.mcfunction');
|
|
69
|
+
expect(load).toContain('scoreboard objectives add __throttle dummy');
|
|
70
|
+
});
|
|
71
|
+
test('emits throttle dispatcher mcfunction with correct scoreboard commands', () => {
|
|
72
|
+
const result = (0, compile_1.compile)(`
|
|
73
|
+
@throttle(ticks=20)
|
|
74
|
+
fn on_player_move() {
|
|
75
|
+
say("moved");
|
|
76
|
+
}
|
|
77
|
+
`, { namespace: 'throttle_test' });
|
|
78
|
+
const dispatcher = getFile(result.files, 'data/throttle_test/function/__throttle_on_player_move.mcfunction');
|
|
79
|
+
expect(dispatcher).toContain('scoreboard players add __throttle_on_player_move __throttle 1');
|
|
80
|
+
expect(dispatcher).toContain('execute if score __throttle_on_player_move __throttle matches 20.. run function throttle_test:on_player_move_inner');
|
|
81
|
+
expect(dispatcher).toContain('execute if score __throttle_on_player_move __throttle matches 20.. run scoreboard players set __throttle_on_player_move __throttle 0');
|
|
82
|
+
});
|
|
83
|
+
test('registers throttle dispatcher in tick.json', () => {
|
|
84
|
+
const result = (0, compile_1.compile)(`
|
|
85
|
+
@throttle(ticks=20)
|
|
86
|
+
fn on_player_move() {
|
|
87
|
+
say("moved");
|
|
88
|
+
}
|
|
89
|
+
`, { namespace: 'throttle_test' });
|
|
90
|
+
const tick = JSON.parse(getFile(result.files, 'data/minecraft/tags/function/tick.json'));
|
|
91
|
+
expect(tick.values).toContain('throttle_test:__throttle_on_player_move');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// @retry tests
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
describe('@retry decorator', () => {
|
|
98
|
+
test('parser records @retry with max argument', () => {
|
|
99
|
+
const decorators = parseDecorators(`
|
|
100
|
+
@retry(max=3)
|
|
101
|
+
fn try_spawn_mob(): int { 0 }
|
|
102
|
+
`);
|
|
103
|
+
expect(decorators).toHaveLength(1);
|
|
104
|
+
expect(decorators[0].name).toBe('retry');
|
|
105
|
+
expect(decorators[0].args?.max).toBe(3);
|
|
106
|
+
});
|
|
107
|
+
test('typechecker rejects @retry without max argument', () => {
|
|
108
|
+
const errors = typeCheck(`
|
|
109
|
+
@retry(max=0)
|
|
110
|
+
fn try_spawn_mob(): int { 0 }
|
|
111
|
+
`);
|
|
112
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
113
|
+
expect(errors[0].message).toContain('@retry');
|
|
114
|
+
});
|
|
115
|
+
test('typechecker rejects duplicate @retry decorators', () => {
|
|
116
|
+
const errors = typeCheck(`
|
|
117
|
+
@retry(max=3)
|
|
118
|
+
@retry(max=5)
|
|
119
|
+
fn try_spawn_mob(): int { 0 }
|
|
120
|
+
`);
|
|
121
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
122
|
+
expect(errors[0].message).toContain('multiple @retry');
|
|
123
|
+
});
|
|
124
|
+
test('typechecker accepts valid @retry decorator', () => {
|
|
125
|
+
const errors = typeCheck(`
|
|
126
|
+
@retry(max=3)
|
|
127
|
+
fn try_spawn_mob(): int { 0 }
|
|
128
|
+
`);
|
|
129
|
+
expect(errors).toHaveLength(0);
|
|
130
|
+
});
|
|
131
|
+
test('emits retry objective in load.mcfunction', () => {
|
|
132
|
+
const result = (0, compile_1.compile)(`
|
|
133
|
+
@retry(max=3)
|
|
134
|
+
fn try_spawn_mob(): int { 0 }
|
|
135
|
+
`, { namespace: 'retry_test' });
|
|
136
|
+
const load = getFile(result.files, 'data/retry_test/function/load.mcfunction');
|
|
137
|
+
expect(load).toContain('scoreboard objectives add __retry dummy');
|
|
138
|
+
});
|
|
139
|
+
test('emits retry dispatcher mcfunction with correct scoreboard commands', () => {
|
|
140
|
+
const result = (0, compile_1.compile)(`
|
|
141
|
+
@retry(max=3)
|
|
142
|
+
fn try_spawn_mob(): int { 0 }
|
|
143
|
+
`, { namespace: 'retry_test' });
|
|
144
|
+
const dispatcher = getFile(result.files, 'data/retry_test/function/__retry_try_spawn_mob.mcfunction');
|
|
145
|
+
expect(dispatcher).toContain('execute if score __retry_try_spawn_mob __retry matches 1.. run function retry_test:try_spawn_mob');
|
|
146
|
+
expect(dispatcher).toContain('execute if score __retry_try_spawn_mob __retry matches 1.. if score $ret __retry matches 0 run scoreboard players remove __retry_try_spawn_mob __retry 1');
|
|
147
|
+
expect(dispatcher).toContain('execute if score __retry_try_spawn_mob __retry matches 1.. unless score $ret __retry matches 0 run scoreboard players set __retry_try_spawn_mob __retry 0');
|
|
148
|
+
});
|
|
149
|
+
test('emits retry start helper function with max count', () => {
|
|
150
|
+
const result = (0, compile_1.compile)(`
|
|
151
|
+
@retry(max=3)
|
|
152
|
+
fn try_spawn_mob(): int { 0 }
|
|
153
|
+
`, { namespace: 'retry_test' });
|
|
154
|
+
const start = getFile(result.files, 'data/retry_test/function/try_spawn_mob_start.mcfunction');
|
|
155
|
+
expect(start).toContain('scoreboard players set __retry_try_spawn_mob __retry 3');
|
|
156
|
+
});
|
|
157
|
+
test('registers retry dispatcher in tick.json', () => {
|
|
158
|
+
const result = (0, compile_1.compile)(`
|
|
159
|
+
@retry(max=3)
|
|
160
|
+
fn try_spawn_mob(): int { 0 }
|
|
161
|
+
`, { namespace: 'retry_test' });
|
|
162
|
+
const tick = JSON.parse(getFile(result.files, 'data/minecraft/tags/function/tick.json'));
|
|
163
|
+
expect(tick.values).toContain('retry_test:__retry_try_spawn_mob');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=throttle-retry.test.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for tuple types and destructuring.
|
|
3
|
+
*
|
|
4
|
+
* RedScript supports:
|
|
5
|
+
* - Tuple type annotations: (int, int)
|
|
6
|
+
* - Tuple literal expressions: (a, b)
|
|
7
|
+
* - Destructuring let-bindings: let (lo, hi) = expr
|
|
8
|
+
* - Functions that return tuples: fn foo(): (int, int) { return (a, b) }
|
|
9
|
+
*/
|
|
10
|
+
export {};
|