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,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the @singleton decorator — global state singleton structs.
|
|
3
|
+
*
|
|
4
|
+
* Covers:
|
|
5
|
+
* 1. Parser: @singleton recognized before struct
|
|
6
|
+
* 2. AST: isSingleton flag set on StructDecl
|
|
7
|
+
* 3. HIR: isSingleton propagated to HIRStruct
|
|
8
|
+
* 4. TypeChecker: synthetic get/set methods registered; no type errors
|
|
9
|
+
* 5. Emit (end-to-end): load.mcfunction includes objective adds, get/set .mcfunction files generated
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for the @singleton decorator — global state singleton structs.
|
|
4
|
+
*
|
|
5
|
+
* Covers:
|
|
6
|
+
* 1. Parser: @singleton recognized before struct
|
|
7
|
+
* 2. AST: isSingleton flag set on StructDecl
|
|
8
|
+
* 3. HIR: isSingleton propagated to HIRStruct
|
|
9
|
+
* 4. TypeChecker: synthetic get/set methods registered; no type errors
|
|
10
|
+
* 5. Emit (end-to-end): load.mcfunction includes objective adds, get/set .mcfunction files generated
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
const lexer_1 = require("../lexer");
|
|
14
|
+
const parser_1 = require("../parser");
|
|
15
|
+
const compile_1 = require("../emit/compile");
|
|
16
|
+
const typechecker_1 = require("../typechecker");
|
|
17
|
+
const lower_1 = require("../hir/lower");
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Helpers
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
function parse(source) {
|
|
22
|
+
const tokens = new lexer_1.Lexer(source).tokenize();
|
|
23
|
+
return new parser_1.Parser(tokens, source).parse();
|
|
24
|
+
}
|
|
25
|
+
function typeCheck(source) {
|
|
26
|
+
const program = parse(source);
|
|
27
|
+
const checker = new typechecker_1.TypeChecker(source);
|
|
28
|
+
return checker.check(program);
|
|
29
|
+
}
|
|
30
|
+
function compileAndGetFiles(source, namespace = 'test') {
|
|
31
|
+
const result = (0, compile_1.compile)(source, { namespace });
|
|
32
|
+
expect(result.success).toBe(true);
|
|
33
|
+
return result.files;
|
|
34
|
+
}
|
|
35
|
+
function getFile(files, pathSubstr) {
|
|
36
|
+
return files.find(f => f.path.includes(pathSubstr))?.content;
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Test 1: Parser recognizes @singleton before struct
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
describe('@singleton: parser', () => {
|
|
42
|
+
test('parses @singleton struct with isSingleton=true', () => {
|
|
43
|
+
const program = parse(`
|
|
44
|
+
@singleton
|
|
45
|
+
struct GameState {
|
|
46
|
+
phase: int,
|
|
47
|
+
tick_count: int,
|
|
48
|
+
}
|
|
49
|
+
`);
|
|
50
|
+
expect(program.structs).toHaveLength(1);
|
|
51
|
+
expect(program.structs[0].name).toBe('GameState');
|
|
52
|
+
expect(program.structs[0].isSingleton).toBe(true);
|
|
53
|
+
expect(program.structs[0].fields).toHaveLength(2);
|
|
54
|
+
});
|
|
55
|
+
test('plain struct without @singleton has isSingleton=undefined', () => {
|
|
56
|
+
const program = parse(`
|
|
57
|
+
struct Vec2 { x: int, y: int }
|
|
58
|
+
`);
|
|
59
|
+
expect(program.structs[0].isSingleton).toBeUndefined();
|
|
60
|
+
});
|
|
61
|
+
test('@singleton struct fields are correctly parsed', () => {
|
|
62
|
+
const program = parse(`
|
|
63
|
+
@singleton
|
|
64
|
+
struct Config {
|
|
65
|
+
difficulty: int,
|
|
66
|
+
player_count: int,
|
|
67
|
+
game_running: int,
|
|
68
|
+
}
|
|
69
|
+
`);
|
|
70
|
+
const s = program.structs[0];
|
|
71
|
+
expect(s.isSingleton).toBe(true);
|
|
72
|
+
expect(s.fields.map(f => f.name)).toEqual(['difficulty', 'player_count', 'game_running']);
|
|
73
|
+
expect(s.fields.every(f => f.type.kind === 'named' && f.type.name === 'int')).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Test 2: HIR lowering propagates isSingleton
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
describe('@singleton: HIR lowering', () => {
|
|
80
|
+
test('lowerToHIR preserves isSingleton flag', () => {
|
|
81
|
+
const program = parse(`
|
|
82
|
+
@singleton
|
|
83
|
+
struct Counter { value: int }
|
|
84
|
+
`);
|
|
85
|
+
const hir = (0, lower_1.lowerToHIR)(program);
|
|
86
|
+
expect(hir.structs).toHaveLength(1);
|
|
87
|
+
expect(hir.structs[0].name).toBe('Counter');
|
|
88
|
+
expect(hir.structs[0].isSingleton).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
test('plain struct isSingleton stays undefined in HIR', () => {
|
|
91
|
+
const program = parse(`
|
|
92
|
+
struct Plain { x: int }
|
|
93
|
+
`);
|
|
94
|
+
const hir = (0, lower_1.lowerToHIR)(program);
|
|
95
|
+
expect(hir.structs[0].isSingleton).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Test 3: TypeChecker — no errors for GameState::get() / GameState::set(gs)
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
describe('@singleton: typechecker', () => {
|
|
102
|
+
test('GameState::get() and GameState::set(gs) pass type-checking', () => {
|
|
103
|
+
const errors = typeCheck(`
|
|
104
|
+
@singleton
|
|
105
|
+
struct GameState {
|
|
106
|
+
phase: int,
|
|
107
|
+
tick_count: int,
|
|
108
|
+
}
|
|
109
|
+
@keep fn update(): void {
|
|
110
|
+
let gs = GameState::get()
|
|
111
|
+
GameState::set(gs)
|
|
112
|
+
}
|
|
113
|
+
`);
|
|
114
|
+
expect(errors).toHaveLength(0);
|
|
115
|
+
});
|
|
116
|
+
test('calling unknown method on singleton struct is a type error', () => {
|
|
117
|
+
const errors = typeCheck(`
|
|
118
|
+
@singleton
|
|
119
|
+
struct Counter { value: int }
|
|
120
|
+
@keep fn test(): void {
|
|
121
|
+
Counter::reset()
|
|
122
|
+
}
|
|
123
|
+
`);
|
|
124
|
+
expect(errors.length).toBeGreaterThan(0);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Test 4: End-to-end — load.mcfunction has scoreboard objectives
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
describe('@singleton: emit — load.mcfunction', () => {
|
|
131
|
+
test('load.mcfunction includes scoreboard objective add for each field', () => {
|
|
132
|
+
const files = compileAndGetFiles(`
|
|
133
|
+
@singleton
|
|
134
|
+
struct GameState {
|
|
135
|
+
phase: int,
|
|
136
|
+
tick_count: int,
|
|
137
|
+
player_count: int,
|
|
138
|
+
}
|
|
139
|
+
@keep fn dummy(): void {}
|
|
140
|
+
`);
|
|
141
|
+
const load = getFile(files, 'load.mcfunction') ?? '';
|
|
142
|
+
expect(load).toContain('scoreboard objectives add');
|
|
143
|
+
// Each field gets its own objective (truncated to ≤16 chars: _s_<4ofStruct>_<field>)
|
|
144
|
+
// GameState → prefix "_s_Game_" (8 chars), then field name up to 8 chars
|
|
145
|
+
expect(load).toContain('_s_Game_phase');
|
|
146
|
+
expect(load).toContain('_s_Game_tick_cou');
|
|
147
|
+
expect(load).toContain('_s_Game_player_c');
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// Test 5: End-to-end — GameState::get mcfunction reads from scoreboard
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
describe('@singleton: emit — get/set functions', () => {
|
|
154
|
+
test('GameState/get.mcfunction is generated', () => {
|
|
155
|
+
const files = compileAndGetFiles(`
|
|
156
|
+
@singleton
|
|
157
|
+
struct GameState {
|
|
158
|
+
phase: int,
|
|
159
|
+
tick_count: int,
|
|
160
|
+
}
|
|
161
|
+
@keep fn dummy(): void {}
|
|
162
|
+
`);
|
|
163
|
+
const getPaths = files.filter(f => f.path.includes('gamestate/get'));
|
|
164
|
+
expect(getPaths.length).toBeGreaterThan(0);
|
|
165
|
+
});
|
|
166
|
+
test('GameState/set.mcfunction is generated', () => {
|
|
167
|
+
const files = compileAndGetFiles(`
|
|
168
|
+
@singleton
|
|
169
|
+
struct GameState {
|
|
170
|
+
phase: int,
|
|
171
|
+
tick_count: int,
|
|
172
|
+
}
|
|
173
|
+
@keep fn dummy(): void {}
|
|
174
|
+
`);
|
|
175
|
+
const setPaths = files.filter(f => f.path.includes('gamestate/set'));
|
|
176
|
+
expect(setPaths.length).toBeGreaterThan(0);
|
|
177
|
+
});
|
|
178
|
+
test('GameState/get reads fields from their scoreboard objectives', () => {
|
|
179
|
+
const files = compileAndGetFiles(`
|
|
180
|
+
@singleton
|
|
181
|
+
struct GameState {
|
|
182
|
+
phase: int,
|
|
183
|
+
}
|
|
184
|
+
@keep fn dummy(): void {}
|
|
185
|
+
`);
|
|
186
|
+
const getContent = getFile(files, 'gamestate/get') ?? '';
|
|
187
|
+
// Should copy from __sng in the field objective to $__rf_phase
|
|
188
|
+
// (objective name is truncated: _s_Game_phase for GameState/phase)
|
|
189
|
+
expect(getContent).toContain('_s_Game_phase');
|
|
190
|
+
expect(getContent).toContain('__sng');
|
|
191
|
+
});
|
|
192
|
+
test('GameState/set writes fields to their scoreboard objectives', () => {
|
|
193
|
+
const files = compileAndGetFiles(`
|
|
194
|
+
@singleton
|
|
195
|
+
struct GameState {
|
|
196
|
+
phase: int,
|
|
197
|
+
}
|
|
198
|
+
@keep fn dummy(): void {}
|
|
199
|
+
`);
|
|
200
|
+
const setContent = getFile(files, 'gamestate/set') ?? '';
|
|
201
|
+
// Should copy from $p0 to __sng in the field objective
|
|
202
|
+
expect(setContent).toContain('_s_Game_phase');
|
|
203
|
+
});
|
|
204
|
+
test('full update_state pattern compiles without errors', () => {
|
|
205
|
+
expect(() => (0, compile_1.compile)(`
|
|
206
|
+
@singleton
|
|
207
|
+
struct GameState {
|
|
208
|
+
phase: int,
|
|
209
|
+
tick_count: int,
|
|
210
|
+
player_count: int,
|
|
211
|
+
}
|
|
212
|
+
@keep fn update_state(): void {
|
|
213
|
+
let gs = GameState::get()
|
|
214
|
+
gs.phase = 1
|
|
215
|
+
gs.tick_count = gs.tick_count + 1
|
|
216
|
+
GameState::set(gs)
|
|
217
|
+
}
|
|
218
|
+
`, { namespace: 'test' })).not.toThrow();
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Test 6: Multiple singletons coexist
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
describe('@singleton: multiple singletons', () => {
|
|
225
|
+
test('two singleton structs both get objectives in load.mcfunction', () => {
|
|
226
|
+
const files = compileAndGetFiles(`
|
|
227
|
+
@singleton
|
|
228
|
+
struct GameState { phase: int }
|
|
229
|
+
@singleton
|
|
230
|
+
struct Config { difficulty: int }
|
|
231
|
+
@keep fn dummy(): void {}
|
|
232
|
+
`);
|
|
233
|
+
const load = getFile(files, 'load.mcfunction') ?? '';
|
|
234
|
+
// GameState → _s_Game_phase, Config → _s_Conf_difficul (both truncated to ≤16 chars)
|
|
235
|
+
expect(load).toContain('_s_Game_phase');
|
|
236
|
+
expect(load).toContain('_s_Conf_difficul');
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
// Test 7: Singleton with non-singleton struct — no interference
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
describe('@singleton: no interference with plain structs', () => {
|
|
243
|
+
test('plain struct is not treated as singleton', () => {
|
|
244
|
+
const files = compileAndGetFiles(`
|
|
245
|
+
struct Vec2 { x: int, y: int }
|
|
246
|
+
@singleton
|
|
247
|
+
struct Counter { value: int }
|
|
248
|
+
@keep fn dummy(): void {}
|
|
249
|
+
`);
|
|
250
|
+
const load = getFile(files, 'load.mcfunction') ?? '';
|
|
251
|
+
// Counter fields get objectives (_s_Counter_value is exactly 16 chars, fits)
|
|
252
|
+
expect(load).toContain('_s_Counter_value');
|
|
253
|
+
// Vec2 fields do NOT
|
|
254
|
+
expect(load).not.toContain('Vec2');
|
|
255
|
+
// No get/set for Vec2
|
|
256
|
+
const vec2GetPath = files.filter(f => f.path.includes('vec2/get'));
|
|
257
|
+
expect(vec2GetPath).toHaveLength(0);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
//# sourceMappingURL=singleton-decorator.test.js.map
|
|
@@ -214,7 +214,7 @@ describe('source map — file path convention', () => {
|
|
|
214
214
|
generateSourceMap: true,
|
|
215
215
|
filePath: 'src/test.mcrs',
|
|
216
216
|
});
|
|
217
|
-
const smFiles = result.files.filter(f => f.path.endsWith('.sourcemap.json'));
|
|
217
|
+
const smFiles = result.files.filter(f => f.path.startsWith('data/') && f.path.endsWith('.sourcemap.json'));
|
|
218
218
|
expect(smFiles.length).toBeGreaterThan(0);
|
|
219
219
|
for (const sf of smFiles) {
|
|
220
220
|
expect(sf.path).toMatch(/\.sourcemap\.json$/);
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for stdlib/advanced.mcrs.
|
|
4
|
+
* Verifies compilation succeeds and all key functions are emitted.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const compile_1 = require("../../emit/compile");
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const ADVANCED_STDLIB = path.join(__dirname, '../../stdlib/advanced.mcrs');
|
|
44
|
+
const advancedSrc = fs.readFileSync(ADVANCED_STDLIB, 'utf-8');
|
|
45
|
+
function compileWith(extra) {
|
|
46
|
+
const result = (0, compile_1.compile)(advancedSrc + '\n' + extra, { namespace: 'test' });
|
|
47
|
+
if (!result.success) {
|
|
48
|
+
const errors = result.errors ?? [];
|
|
49
|
+
throw new Error(`Compilation failed:\n${errors.map((e) => e.message ?? e).join('\n')}`);
|
|
50
|
+
}
|
|
51
|
+
return result.files ?? [];
|
|
52
|
+
}
|
|
53
|
+
function hasFn(files, fnName) {
|
|
54
|
+
// Match exact name or any sub-files (e.g. fn__then_0, fn__loop_body_1, fn__const_0_0)
|
|
55
|
+
return files.some(f => {
|
|
56
|
+
const base = f.path.split('/').pop();
|
|
57
|
+
return base === `${fnName}.mcfunction` || base.startsWith(`${fnName}__`);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function getFn(files, fnName) {
|
|
61
|
+
// Match exact name or specialized variants (e.g. fn__const_0_0)
|
|
62
|
+
const f = files.find(f => f.path.endsWith(`/${fnName}.mcfunction`))
|
|
63
|
+
?? files.find(f => {
|
|
64
|
+
const base = f.path.split('/').pop();
|
|
65
|
+
return base.startsWith(`${fnName}__`);
|
|
66
|
+
});
|
|
67
|
+
if (!f) {
|
|
68
|
+
const paths = files.map(f => f.path).join('\n');
|
|
69
|
+
throw new Error(`Function '${fnName}' not found. Files:\n${paths}`);
|
|
70
|
+
}
|
|
71
|
+
return f.content;
|
|
72
|
+
}
|
|
73
|
+
// ── Compilation ──────────────────────────────────────────────────────────────
|
|
74
|
+
describe('stdlib/advanced.mcrs: compilation', () => {
|
|
75
|
+
test('compiles the full stdlib file without errors', () => {
|
|
76
|
+
const result = (0, compile_1.compile)(advancedSrc, { namespace: 'test' });
|
|
77
|
+
expect(result.success).toBe(true);
|
|
78
|
+
// library module: no files unless something is referenced
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
// ── Number Theory ─────────────────────────────────────────────────────────────
|
|
82
|
+
describe('stdlib/advanced.mcrs: number theory', () => {
|
|
83
|
+
test('fib is emitted', () => {
|
|
84
|
+
const files = compileWith(`@keep fn t(): int { return fib(10); }`);
|
|
85
|
+
expect(hasFn(files, 'fib')).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
test('is_prime is emitted', () => {
|
|
88
|
+
const files = compileWith(`@keep fn t(): int { return is_prime(7); }`);
|
|
89
|
+
expect(hasFn(files, 'is_prime')).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
test('collatz_steps is emitted', () => {
|
|
92
|
+
const files = compileWith(`@keep fn t(): int { return collatz_steps(6); }`);
|
|
93
|
+
expect(hasFn(files, 'collatz_steps')).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
test('digit_sum is emitted', () => {
|
|
96
|
+
const files = compileWith(`@keep fn t(): int { return digit_sum(123); }`);
|
|
97
|
+
expect(hasFn(files, 'digit_sum')).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
test('count_digits is emitted', () => {
|
|
100
|
+
const files = compileWith(`@keep fn t(): int { return count_digits(1000); }`);
|
|
101
|
+
expect(hasFn(files, 'count_digits')).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
test('reverse_int is emitted', () => {
|
|
104
|
+
const files = compileWith(`@keep fn t(): int { return reverse_int(123); }`);
|
|
105
|
+
expect(hasFn(files, 'reverse_int')).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
test('mod_pow is emitted', () => {
|
|
108
|
+
const files = compileWith(`@keep fn t(): int { return mod_pow(2, 10, 1000); }`);
|
|
109
|
+
expect(hasFn(files, 'mod_pow')).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
test('digital_root is emitted', () => {
|
|
112
|
+
const files = compileWith(`@keep fn t(): int { return digital_root(493); }`);
|
|
113
|
+
expect(hasFn(files, 'digital_root')).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
test('spiral_ring is emitted', () => {
|
|
116
|
+
const files = compileWith(`@keep fn t(): int { return spiral_ring(9); }`);
|
|
117
|
+
expect(hasFn(files, 'spiral_ring')).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
// ── Hashing / Noise ───────────────────────────────────────────────────────────
|
|
121
|
+
describe('stdlib/advanced.mcrs: hashing and noise', () => {
|
|
122
|
+
test('hash_int is emitted', () => {
|
|
123
|
+
const files = compileWith(`@keep fn t(): int { return hash_int(42); }`);
|
|
124
|
+
expect(hasFn(files, 'hash_int')).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
test('noise1d is emitted', () => {
|
|
127
|
+
const files = compileWith(`@keep fn t(): int { return noise1d(500); }`);
|
|
128
|
+
expect(hasFn(files, 'noise1d')).toBe(true);
|
|
129
|
+
});
|
|
130
|
+
test('noise1d body references hash_int', () => {
|
|
131
|
+
const files = compileWith(`@keep fn t(): int { return noise1d(500); }`);
|
|
132
|
+
// noise1d should call hash_int internally
|
|
133
|
+
expect(hasFn(files, 'hash_int')).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
// ── Curves / Bezier ───────────────────────────────────────────────────────────
|
|
137
|
+
describe('stdlib/advanced.mcrs: bezier curves', () => {
|
|
138
|
+
test('bezier_quad is emitted', () => {
|
|
139
|
+
const files = compileWith(`@keep fn t(): int { return bezier_quad(0, 500, 1000, 500); }`);
|
|
140
|
+
expect(hasFn(files, 'bezier_quad')).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
test('bezier_cubic is emitted', () => {
|
|
143
|
+
const files = compileWith(`@keep fn t(): int { return bezier_cubic(0, 0, 1000, 1000, 500); }`);
|
|
144
|
+
expect(hasFn(files, 'bezier_cubic')).toBe(true);
|
|
145
|
+
});
|
|
146
|
+
test('bezier_quartic is emitted', () => {
|
|
147
|
+
const files = compileWith(`@keep fn t(): int { return bezier_quartic(0, 0, 500, 1000, 1000, 500); }`);
|
|
148
|
+
expect(hasFn(files, 'bezier_quartic')).toBe(true);
|
|
149
|
+
});
|
|
150
|
+
test('bezier_n is emitted with array input', () => {
|
|
151
|
+
const files = compileWith(`
|
|
152
|
+
@keep fn t(): int {
|
|
153
|
+
let pts: int[] = [0, 500, 1000];
|
|
154
|
+
return bezier_n(pts, 3, 500);
|
|
155
|
+
}
|
|
156
|
+
`);
|
|
157
|
+
expect(hasFn(files, 'bezier_n')).toBe(true);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
// ── Fractals ──────────────────────────────────────────────────────────────────
|
|
161
|
+
describe('stdlib/advanced.mcrs: fractals', () => {
|
|
162
|
+
test('mandelbrot_iter is emitted', () => {
|
|
163
|
+
const files = compileWith(`@keep fn t(): int { return mandelbrot_iter(0, 0, 20); }`);
|
|
164
|
+
expect(hasFn(files, 'mandelbrot_iter')).toBe(true);
|
|
165
|
+
});
|
|
166
|
+
test('julia_iter is emitted', () => {
|
|
167
|
+
const files = compileWith(`@keep fn t(): int { return julia_iter(0, 0, -300, 0, 20); }`);
|
|
168
|
+
expect(hasFn(files, 'julia_iter')).toBe(true);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
// ── Geometry helpers ──────────────────────────────────────────────────────────
|
|
172
|
+
describe('stdlib/advanced.mcrs: geometry helpers', () => {
|
|
173
|
+
test('angle_between is emitted', () => {
|
|
174
|
+
const files = compileWith(`@keep fn t(): int { return angle_between(1000, 0, 0, 1000); }`);
|
|
175
|
+
expect(hasFn(files, 'angle_between')).toBe(true);
|
|
176
|
+
});
|
|
177
|
+
test('clamp_circle_x is emitted', () => {
|
|
178
|
+
const files = compileWith(`@keep fn t(): int { return clamp_circle_x(500, 500, 1); }`);
|
|
179
|
+
expect(hasFn(files, 'clamp_circle_x')).toBe(true);
|
|
180
|
+
});
|
|
181
|
+
test('clamp_circle_y is emitted', () => {
|
|
182
|
+
const files = compileWith(`@keep fn t(): int { return clamp_circle_y(500, 500, 1); }`);
|
|
183
|
+
expect(hasFn(files, 'clamp_circle_y')).toBe(true);
|
|
184
|
+
});
|
|
185
|
+
test('newton_sqrt is emitted', () => {
|
|
186
|
+
const files = compileWith(`@keep fn t(): int { return newton_sqrt(100); }`);
|
|
187
|
+
expect(hasFn(files, 'newton_sqrt')).toBe(true);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
// ── Statistics ────────────────────────────────────────────────────────────────
|
|
191
|
+
describe('stdlib/advanced.mcrs: statistics', () => {
|
|
192
|
+
test('mean_fx is emitted', () => {
|
|
193
|
+
const files = compileWith(`
|
|
194
|
+
@keep fn t(): int {
|
|
195
|
+
let a: int[] = [1, 2, 3, 4, 5];
|
|
196
|
+
return mean_fx(a, 5);
|
|
197
|
+
}
|
|
198
|
+
`);
|
|
199
|
+
expect(hasFn(files, 'mean_fx')).toBe(true);
|
|
200
|
+
});
|
|
201
|
+
test('median is emitted', () => {
|
|
202
|
+
const files = compileWith(`
|
|
203
|
+
@keep fn t(): int {
|
|
204
|
+
let a: int[] = [3, 1, 2];
|
|
205
|
+
let w: int[] = [0, 0, 0];
|
|
206
|
+
return median(a, w, 3);
|
|
207
|
+
}
|
|
208
|
+
`);
|
|
209
|
+
expect(hasFn(files, 'median')).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
test('median emits comparison/branch commands (sorting logic)', () => {
|
|
212
|
+
const files = compileWith(`
|
|
213
|
+
@keep fn t(): int {
|
|
214
|
+
let a: int[] = [3, 1, 2];
|
|
215
|
+
let w: int[] = [0, 0, 0];
|
|
216
|
+
return median(a, w, 3);
|
|
217
|
+
}
|
|
218
|
+
`);
|
|
219
|
+
// median depends on sorting — median fn itself must be emitted
|
|
220
|
+
expect(hasFn(files, 'median')).toBe(true);
|
|
221
|
+
// and bigint_copy should be pulled in for the work-array copy
|
|
222
|
+
const allPaths = files.map(f => f.path).join('\n');
|
|
223
|
+
expect(allPaths).toContain('median');
|
|
224
|
+
});
|
|
225
|
+
test('mode is emitted', () => {
|
|
226
|
+
const files = compileWith(`
|
|
227
|
+
@keep fn t(): int {
|
|
228
|
+
let a: int[] = [1, 2, 2, 3];
|
|
229
|
+
let w: int[] = [0, 0, 0, 0];
|
|
230
|
+
return mode(a, w, 4);
|
|
231
|
+
}
|
|
232
|
+
`);
|
|
233
|
+
expect(hasFn(files, 'mode')).toBe(true);
|
|
234
|
+
});
|
|
235
|
+
test('std_dev_fx is emitted', () => {
|
|
236
|
+
const files = compileWith(`
|
|
237
|
+
@keep fn t(): int {
|
|
238
|
+
let a: int[] = [2, 4, 4, 4, 5, 5, 7, 9];
|
|
239
|
+
return std_dev_fx(a, 8);
|
|
240
|
+
}
|
|
241
|
+
`);
|
|
242
|
+
expect(hasFn(files, 'std_dev_fx')).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
test('std_dev_fx body uses newton_sqrt for the square root step', () => {
|
|
245
|
+
const files = compileWith(`
|
|
246
|
+
@keep fn t(): int {
|
|
247
|
+
let a: int[] = [2, 4, 4, 4, 5, 5, 7, 9];
|
|
248
|
+
return std_dev_fx(a, 8);
|
|
249
|
+
}
|
|
250
|
+
`);
|
|
251
|
+
expect(hasFn(files, 'newton_sqrt')).toBe(true);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
// ── Interpolation ─────────────────────────────────────────────────────────────
|
|
255
|
+
describe('stdlib/advanced.mcrs: interpolation', () => {
|
|
256
|
+
test('hermite_spline is emitted', () => {
|
|
257
|
+
const files = compileWith(`
|
|
258
|
+
@keep fn t(): int {
|
|
259
|
+
return hermite_spline(0, 1000, 0, 0, 500);
|
|
260
|
+
}
|
|
261
|
+
`);
|
|
262
|
+
expect(hasFn(files, 'hermite_spline')).toBe(true);
|
|
263
|
+
});
|
|
264
|
+
test('hermite_spline at t=0 evaluates to p0 region', () => {
|
|
265
|
+
const files = compileWith(`
|
|
266
|
+
@keep fn t(): int {
|
|
267
|
+
return hermite_spline(0, 1000, 0, 0, 0);
|
|
268
|
+
}
|
|
269
|
+
`);
|
|
270
|
+
// Entry point may be inlined (constant args → specialised function); check any content emitted
|
|
271
|
+
const allContent = files.map(f => f.content).join('\n');
|
|
272
|
+
expect(allContent.length).toBeGreaterThan(0);
|
|
273
|
+
});
|
|
274
|
+
test('hermite_spline at t=1000 evaluates to p1 region', () => {
|
|
275
|
+
const files = compileWith(`
|
|
276
|
+
@keep fn t(): int {
|
|
277
|
+
return hermite_spline(0, 1000, 0, 0, 1000);
|
|
278
|
+
}
|
|
279
|
+
`);
|
|
280
|
+
// Entry point may be inlined; check any content emitted
|
|
281
|
+
const allContent = files.map(f => f.content).join('\n');
|
|
282
|
+
expect(allContent.length).toBeGreaterThan(0);
|
|
283
|
+
});
|
|
284
|
+
test('catmull_rom is emitted', () => {
|
|
285
|
+
const files = compileWith(`
|
|
286
|
+
@keep fn t(): int {
|
|
287
|
+
return catmull_rom(0, 100, 200, 300, 500);
|
|
288
|
+
}
|
|
289
|
+
`);
|
|
290
|
+
expect(hasFn(files, 'catmull_rom')).toBe(true);
|
|
291
|
+
});
|
|
292
|
+
test('catmull_rom internally calls hermite_spline', () => {
|
|
293
|
+
const files = compileWith(`
|
|
294
|
+
@keep fn t(): int {
|
|
295
|
+
return catmull_rom(0, 100, 200, 300, 500);
|
|
296
|
+
}
|
|
297
|
+
`);
|
|
298
|
+
expect(hasFn(files, 'hermite_spline')).toBe(true);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
//# sourceMappingURL=advanced.test.js.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for stdlib/bigint.mcrs — multi-precision integer arithmetic.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const compile_1 = require("../../emit/compile");
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/bigint.mcrs'), 'utf-8');
|
|
43
|
+
function compileWith(extra) {
|
|
44
|
+
return (0, compile_1.compile)(SRC + '\n' + extra, { namespace: 'test' });
|
|
45
|
+
}
|
|
46
|
+
describe('stdlib/bigint.mcrs', () => {
|
|
47
|
+
test('compiles without errors', () => {
|
|
48
|
+
const r = compileWith('');
|
|
49
|
+
expect(r.files.length).toBeGreaterThan(0);
|
|
50
|
+
});
|
|
51
|
+
test('bigint_base is emitted or constant-folded', () => {
|
|
52
|
+
// bigint_base() returns 10000 — compiler may constant-fold it instead of emitting a function
|
|
53
|
+
const r = compileWith(`@keep fn t(): int { return bigint_base(); }`);
|
|
54
|
+
// Either a dedicated function file is emitted, or the value 10000 appears inlined
|
|
55
|
+
const emittedFile = r.files.some(f => f.path.includes('bigint_base'));
|
|
56
|
+
const inlined = r.files.some(f => f.content.includes('10000'));
|
|
57
|
+
expect(emittedFile || inlined).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
test('bigint3_add_lo is emitted', () => {
|
|
60
|
+
const r = compileWith(`@keep fn t(): int { return bigint3_add_lo(7000, 5000); }`);
|
|
61
|
+
expect(r.files.some(f => f.path.includes('bigint3_add_lo'))).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
test('bigint3_cmp is emitted', () => {
|
|
64
|
+
const r = compileWith(`@keep fn t(): int { return bigint3_cmp(0, 0, 1, 0, 0, 2); }`);
|
|
65
|
+
expect(r.files.some(f => f.path.includes('bigint3_cmp'))).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
test('int32_to_bigint3_lo is emitted', () => {
|
|
68
|
+
const r = compileWith(`@keep fn t(): int { return int32_to_bigint3_lo(123456789); }`);
|
|
69
|
+
expect(r.files.some(f => f.path.includes('int32_to_bigint3'))).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
test('bigint3_to_int32 is emitted', () => {
|
|
72
|
+
const r = compileWith(`@keep fn t(): int { return bigint3_to_int32(0, 1, 2345); }`);
|
|
73
|
+
expect(r.files.some(f => f.path.includes('bigint3_to_int32'))).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
test('bigint_zero is emitted', () => {
|
|
76
|
+
const r = compileWith(`@keep fn t() {
|
|
77
|
+
let a: int[] = [0, 0, 0];
|
|
78
|
+
bigint_zero(a, 3);
|
|
79
|
+
}`);
|
|
80
|
+
expect(r.files.some(f => f.path.includes('bigint_zero'))).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=bigint.test.js.map
|