redscript-mc 2.0.0 → 2.1.1
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/.claudeignore +21 -0
- package/README.md +48 -16
- package/README.zh.md +2 -2
- package/dist/cli.js +0 -0
- package/dist/src/__tests__/budget.test.js +261 -0
- package/dist/src/__tests__/diagnostics.test.js +2 -3
- package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
- package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
- package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
- package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
- package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
- package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
- package/dist/src/__tests__/enum.test.d.ts +10 -0
- package/dist/src/__tests__/enum.test.js +389 -0
- package/dist/src/__tests__/generics.test.d.ts +14 -0
- package/dist/src/__tests__/generics.test.js +367 -0
- package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
- package/dist/src/__tests__/incremental.test.d.ts +5 -0
- package/dist/src/__tests__/incremental.test.js +308 -0
- package/dist/src/__tests__/lsp.test.d.ts +7 -0
- package/dist/src/__tests__/lsp.test.js +321 -0
- package/dist/src/__tests__/mc-syntax.test.js +1 -6
- package/dist/src/__tests__/mc-version.test.d.ts +10 -0
- package/dist/src/__tests__/mc-version.test.js +154 -0
- package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
- package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
- package/dist/src/__tests__/modules.test.d.ts +7 -0
- package/dist/src/__tests__/modules.test.js +333 -0
- package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
- package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
- package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
- package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
- package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
- package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
- package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
- package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
- package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
- package/dist/src/__tests__/option.test.d.ts +14 -0
- package/dist/src/__tests__/option.test.js +275 -0
- package/dist/src/__tests__/schedule.test.d.ts +7 -0
- package/dist/src/__tests__/schedule.test.js +98 -0
- package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
- package/dist/src/__tests__/sourcemap.test.js +227 -0
- package/dist/src/__tests__/stdlib-include.test.js +86 -0
- package/dist/src/__tests__/tuple.test.d.ts +11 -0
- package/dist/src/__tests__/tuple.test.js +202 -0
- package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
- package/dist/src/__tests__/typechecker-strict.test.js +197 -0
- package/dist/src/ast/types.d.ts +56 -2
- package/dist/src/cache/deps.d.ts +41 -0
- package/dist/src/cache/deps.js +158 -0
- package/dist/src/cache/incremental.d.ts +35 -0
- package/dist/src/cache/incremental.js +165 -0
- package/dist/src/cache/index.d.ts +37 -0
- package/dist/src/cache/index.js +152 -0
- package/dist/src/cli.js +83 -45
- package/dist/src/compile.d.ts +3 -2
- package/dist/src/compile.js +34 -11
- package/dist/src/diagnostics/index.d.ts +1 -1
- package/dist/src/diagnostics/index.js +8 -11
- package/dist/src/emit/compile.d.ts +31 -0
- package/dist/src/emit/compile.js +143 -0
- package/dist/{src2 → src}/emit/index.d.ts +9 -0
- package/dist/{src2 → src}/emit/index.js +59 -8
- package/dist/src/emit/modules.d.ts +29 -0
- package/dist/src/emit/modules.js +492 -0
- package/dist/src/emit/sourcemap.d.ts +53 -0
- package/dist/src/emit/sourcemap.js +73 -0
- package/dist/{src2 → src}/hir/lower.d.ts +1 -1
- package/dist/{src2 → src}/hir/lower.js +22 -1
- package/dist/src/hir/monomorphize.d.ts +22 -0
- package/dist/src/hir/monomorphize.js +379 -0
- package/dist/{src2 → src}/hir/types.d.ts +35 -2
- package/dist/src/index.d.ts +19 -2
- package/dist/src/index.js +36 -14
- package/dist/src/lexer/index.d.ts +1 -1
- package/dist/src/lexer/index.js +1 -0
- package/dist/src/lir/budget.d.ts +37 -0
- package/dist/src/lir/budget.js +280 -0
- package/dist/{src2 → src}/lir/lower.js +19 -0
- package/dist/{src2 → src}/lir/types.d.ts +7 -4
- package/dist/src/lsp/main.d.ts +8 -0
- package/dist/src/lsp/main.js +11 -0
- package/dist/src/lsp/server.d.ts +11 -0
- package/dist/src/lsp/server.js +403 -0
- package/dist/{src2 → src}/mir/lower.d.ts +1 -1
- package/dist/{src2 → src}/mir/lower.js +244 -10
- package/dist/{src2 → src}/mir/types.d.ts +10 -2
- package/dist/src/optimizer/coroutine.d.ts +34 -0
- package/dist/src/optimizer/coroutine.js +789 -0
- package/dist/src/optimizer/dce.d.ts +8 -34
- package/dist/src/optimizer/dce.js +146 -629
- package/dist/src/optimizer/interprocedural.d.ts +14 -0
- package/dist/src/optimizer/interprocedural.js +186 -0
- package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
- package/dist/src/optimizer/lir/const_imm.js +139 -0
- package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
- package/dist/src/optimizer/lir/dead_slot.js +130 -0
- package/dist/src/optimizer/lir/peephole.d.ts +21 -0
- package/dist/src/optimizer/lir/peephole.js +52 -0
- package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
- package/dist/src/optimizer/lir/pipeline.js +34 -0
- package/dist/src/optimizer/nbt-batch.d.ts +11 -0
- package/dist/src/optimizer/nbt-batch.js +51 -0
- package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
- package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
- package/dist/src/optimizer/selector-cache.d.ts +22 -0
- package/dist/src/optimizer/selector-cache.js +100 -0
- package/dist/src/optimizer/unroll.d.ts +32 -0
- package/dist/src/optimizer/unroll.js +348 -0
- package/dist/src/parser/index.d.ts +8 -0
- package/dist/src/parser/index.js +204 -14
- package/dist/src/repl.d.ts +1 -1
- package/dist/src/typechecker/index.d.ts +4 -0
- package/dist/src/typechecker/index.js +198 -13
- package/dist/src/types/mc-version.d.ts +24 -0
- package/dist/src/types/mc-version.js +49 -0
- package/docs/ROADMAP.md +395 -0
- package/docs/compiler-pipeline-redesign.md +27 -10
- package/editors/vscode/out/extension.js +25176 -8000
- package/editors/vscode/package-lock.json +90 -6
- package/editors/vscode/package.json +3 -2
- package/editors/vscode/src/extension.ts +97 -67
- package/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
- package/examples/coroutine-demo.mcrs +50 -0
- package/examples/enum-demo.mcrs +95 -0
- package/examples/scheduler-demo.mcrs +59 -0
- package/examples/showcase.mcrs +3 -3
- package/jest.config.js +1 -1
- package/package.json +9 -3
- package/src/__tests__/budget.test.ts +297 -0
- package/src/__tests__/diagnostics.test.ts +2 -3
- package/src/__tests__/e2e/coroutine.test.ts +142 -0
- package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
- package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
- package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
- package/src/__tests__/enum.test.ts +425 -0
- package/src/__tests__/generics.test.ts +390 -0
- package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
- package/src/__tests__/incremental.test.ts +337 -0
- package/src/__tests__/lsp.test.ts +359 -0
- package/src/__tests__/mc-syntax.test.ts +1 -7
- package/src/__tests__/mc-version.test.ts +178 -0
- package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
- package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
- package/src/__tests__/modules.test.ts +365 -0
- package/src/__tests__/optimizer/coroutine.test.ts +312 -0
- package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
- package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
- package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
- package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
- package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
- package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
- package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
- package/src/__tests__/optimizer/unroll.test.ts +231 -0
- package/src/__tests__/option.test.ts +299 -0
- package/src/__tests__/schedule.test.ts +105 -0
- package/src/__tests__/sourcemap.test.ts +254 -0
- package/src/__tests__/stdlib-include.test.ts +61 -0
- package/src/__tests__/tuple.test.ts +220 -0
- package/src/__tests__/typechecker-strict.test.ts +216 -0
- package/src/ast/types.ts +33 -2
- package/src/cache/deps.ts +132 -0
- package/src/cache/incremental.ts +173 -0
- package/src/cache/index.ts +135 -0
- package/src/cli.ts +96 -45
- package/src/compile.ts +46 -17
- package/src/diagnostics/index.ts +8 -11
- package/src/emit/compile.ts +179 -0
- package/{src2 → src}/emit/index.ts +72 -8
- package/src/emit/modules.ts +581 -0
- package/src/emit/sourcemap.ts +101 -0
- package/{src2 → src}/hir/lower.ts +29 -2
- package/src/hir/monomorphize.ts +416 -0
- package/{src2 → src}/hir/types.ts +15 -3
- package/src/index.ts +29 -10
- package/src/lexer/index.ts +2 -1
- package/src/lir/budget.ts +321 -0
- package/{src2 → src}/lir/lower.ts +32 -1
- package/{src2 → src}/lir/types.ts +7 -3
- package/src/lsp/main.ts +9 -0
- package/src/lsp/server.ts +469 -0
- package/{src2 → src}/mir/lower.ts +251 -8
- package/{src2 → src}/mir/types.ts +12 -1
- package/src/optimizer/coroutine.ts +996 -0
- package/{src2 → src}/optimizer/dce.ts +2 -1
- package/src/optimizer/interprocedural.ts +177 -0
- package/src/optimizer/lir/const_imm.ts +143 -0
- package/src/optimizer/lir/dead_slot.ts +123 -0
- package/src/optimizer/lir/peephole.ts +57 -0
- package/src/optimizer/lir/pipeline.ts +37 -0
- package/src/optimizer/nbt-batch.ts +50 -0
- package/{src2 → src}/optimizer/pipeline.ts +16 -1
- package/src/optimizer/selector-cache.ts +103 -0
- package/src/optimizer/unroll.ts +386 -0
- package/src/parser/index.ts +212 -15
- package/src/repl.ts +1 -1
- package/src/stdlib/math.mcrs +4 -4
- package/src/templates/quest.mcrs +4 -4
- package/src/typechecker/index.ts +215 -15
- package/src/types/mc-version.ts +46 -0
- package/tsconfig.json +1 -1
- package/.claude/commands/build-test.md +0 -10
- package/.claude/commands/deploy-demo.md +0 -12
- package/.claude/commands/stage-status.md +0 -13
- package/.claude/settings.json +0 -12
- package/CLAUDE.md +0 -231
- package/dist/__tests__/cli.test.js +0 -278
- package/dist/__tests__/codegen.test.js +0 -152
- package/dist/__tests__/compile-all.test.d.ts +0 -10
- package/dist/__tests__/compile-all.test.js +0 -108
- package/dist/__tests__/dce.test.js +0 -138
- package/dist/__tests__/diagnostics.test.d.ts +0 -4
- package/dist/__tests__/diagnostics.test.js +0 -149
- package/dist/__tests__/e2e.test.d.ts +0 -6
- package/dist/__tests__/e2e.test.js +0 -1847
- package/dist/__tests__/entity-types.test.js +0 -203
- package/dist/__tests__/formatter.test.js +0 -40
- package/dist/__tests__/lexer.test.js +0 -343
- package/dist/__tests__/lowering.test.js +0 -1015
- package/dist/__tests__/macro.test.d.ts +0 -8
- package/dist/__tests__/macro.test.js +0 -305
- package/dist/__tests__/mc-integration.test.d.ts +0 -12
- package/dist/__tests__/mc-integration.test.js +0 -819
- package/dist/__tests__/mc-syntax.test.js +0 -124
- package/dist/__tests__/nbt.test.js +0 -82
- package/dist/__tests__/optimizer-advanced.test.js +0 -124
- package/dist/__tests__/optimizer.test.js +0 -149
- package/dist/__tests__/parser.test.d.ts +0 -1
- package/dist/__tests__/parser.test.js +0 -807
- package/dist/__tests__/repl.test.d.ts +0 -1
- package/dist/__tests__/repl.test.js +0 -27
- package/dist/__tests__/runtime.test.d.ts +0 -1
- package/dist/__tests__/runtime.test.js +0 -289
- package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
- package/dist/__tests__/stdlib-advanced.test.js +0 -378
- package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
- package/dist/__tests__/stdlib-bigint.test.js +0 -428
- package/dist/__tests__/stdlib-math.test.d.ts +0 -7
- package/dist/__tests__/stdlib-math.test.js +0 -352
- package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
- package/dist/__tests__/stdlib-vec.test.js +0 -264
- package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
- package/dist/__tests__/structure-optimizer.test.js +0 -33
- package/dist/__tests__/typechecker.test.d.ts +0 -1
- package/dist/__tests__/typechecker.test.js +0 -552
- package/dist/__tests__/var-allocator.test.d.ts +0 -1
- package/dist/__tests__/var-allocator.test.js +0 -69
- package/dist/ast/types.d.ts +0 -514
- package/dist/ast/types.js +0 -9
- package/dist/builtins/metadata.d.ts +0 -36
- package/dist/builtins/metadata.js +0 -1014
- package/dist/cli.d.ts +0 -11
- package/dist/codegen/cmdblock/index.d.ts +0 -26
- package/dist/codegen/cmdblock/index.js +0 -45
- package/dist/codegen/mcfunction/index.d.ts +0 -40
- package/dist/codegen/mcfunction/index.js +0 -606
- package/dist/codegen/structure/index.d.ts +0 -24
- package/dist/codegen/structure/index.js +0 -279
- package/dist/codegen/var-allocator.d.ts +0 -45
- package/dist/codegen/var-allocator.js +0 -104
- package/dist/compile.d.ts +0 -68
- package/dist/data/arena/function/__load.mcfunction +0 -6
- package/dist/data/arena/function/__tick.mcfunction +0 -2
- package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
- package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
- package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
- package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
- package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
- package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
- package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
- package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
- package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
- package/dist/data/arena/function/arena_tick.mcfunction +0 -11
- package/dist/data/counter/function/__load.mcfunction +0 -5
- package/dist/data/counter/function/__tick.mcfunction +0 -2
- package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
- package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
- package/dist/data/counter/function/counter_tick.mcfunction +0 -11
- package/dist/data/gcd2/function/__load.mcfunction +0 -3
- package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd2/function/abs.mcfunction +0 -7
- package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd2/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3/function/__load.mcfunction +0 -3
- package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd3/function/abs.mcfunction +0 -7
- package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd3/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3/function/test.mcfunction +0 -7
- package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
- package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
- package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
- package/dist/data/gcd3nm/function/test.mcfunction +0 -7
- package/dist/data/gcd_test/function/__load.mcfunction +0 -3
- package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
- package/dist/data/gcd_test/function/abs.mcfunction +0 -7
- package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
- package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
- package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
- package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
- package/dist/data/isqrttest/function/__load.mcfunction +0 -6
- package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
- package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
- package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
- package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
- package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
- package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
- package/dist/data/isqrttest/function/test.mcfunction +0 -6
- package/dist/data/mathtest/function/__load.mcfunction +0 -3
- package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
- package/dist/data/mathtest/function/abs.mcfunction +0 -6
- package/dist/data/mathtest/function/test.mcfunction +0 -5
- package/dist/data/minecraft/tags/function/load.json +0 -5
- package/dist/data/minecraft/tags/function/tick.json +0 -5
- package/dist/data/mypack/function/__load.mcfunction +0 -13
- package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
- package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
- package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
- package/dist/data/mypack/function/abs.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
- package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
- package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
- package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
- package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
- package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
- package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
- package/dist/data/mypack/function/my_game.mcfunction +0 -10
- package/dist/data/quiz/function/__load.mcfunction +0 -16
- package/dist/data/quiz/function/__tick.mcfunction +0 -6
- package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
- package/dist/data/quiz/function/answer_a.mcfunction +0 -4
- package/dist/data/quiz/function/answer_b.mcfunction +0 -4
- package/dist/data/quiz/function/answer_c.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
- package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
- package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
- package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
- package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
- package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
- package/dist/data/quiz/function/ask_question.mcfunction +0 -7
- package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
- package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
- package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
- package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
- package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
- package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
- package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
- package/dist/data/reqtest/function/__load.mcfunction +0 -4
- package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
- package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
- package/dist/data/reqtest/function/use_table.mcfunction +0 -4
- package/dist/data/reqtest2/function/__load.mcfunction +0 -3
- package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
- package/dist/data/runtime/function/__load.mcfunction +0 -5
- package/dist/data/runtime/function/__tick.mcfunction +0 -2
- package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
- package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
- package/dist/data/shop/function/__load.mcfunction +0 -7
- package/dist/data/shop/function/__tick.mcfunction +0 -3
- package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
- package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
- package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
- package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
- package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
- package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
- package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
- package/dist/data/swap_test/function/__load.mcfunction +0 -3
- package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
- package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
- package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
- package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
- package/dist/data/turret/function/__load.mcfunction +0 -5
- package/dist/data/turret/function/__tick.mcfunction +0 -4
- package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
- package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
- package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
- package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
- package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
- package/dist/data/turret/function/turret_tick.mcfunction +0 -5
- package/dist/diagnostics/index.d.ts +0 -44
- package/dist/diagnostics/index.js +0 -140
- package/dist/events/types.d.ts +0 -35
- package/dist/events/types.js +0 -59
- package/dist/formatter/index.d.ts +0 -1
- package/dist/formatter/index.js +0 -26
- package/dist/gcd2.map.json +0 -15
- package/dist/gcd3.map.json +0 -17
- package/dist/gcd_test.map.json +0 -15
- package/dist/index.d.ts +0 -62
- package/dist/ir/builder.d.ts +0 -33
- package/dist/ir/builder.js +0 -99
- package/dist/ir/types.d.ts +0 -132
- package/dist/ir/types.js +0 -15
- package/dist/isqrttest.map.json +0 -15
- package/dist/lexer/index.d.ts +0 -37
- package/dist/lexer/index.js +0 -569
- package/dist/lowering/index.d.ts +0 -188
- package/dist/lowering/index.js +0 -3405
- package/dist/mathtest.map.json +0 -6
- package/dist/mc-test/client.d.ts +0 -128
- package/dist/mc-test/client.js +0 -174
- package/dist/mc-test/runner.d.ts +0 -28
- package/dist/mc-test/runner.js +0 -150
- package/dist/mc-test/setup.d.ts +0 -11
- package/dist/mc-test/setup.js +0 -98
- package/dist/mc-validator/index.d.ts +0 -17
- package/dist/mc-validator/index.js +0 -322
- package/dist/mypack.map.json +0 -27
- package/dist/nbt/index.d.ts +0 -86
- package/dist/nbt/index.js +0 -250
- package/dist/optimizer/commands.d.ts +0 -38
- package/dist/optimizer/commands.js +0 -451
- package/dist/optimizer/dce.d.ts +0 -34
- package/dist/optimizer/dce.js +0 -639
- package/dist/optimizer/passes.d.ts +0 -34
- package/dist/optimizer/passes.js +0 -243
- package/dist/optimizer/structure.d.ts +0 -9
- package/dist/optimizer/structure.js +0 -356
- package/dist/pack.mcmeta +0 -6
- package/dist/parser/index.d.ts +0 -93
- package/dist/parser/index.js +0 -1687
- package/dist/repl.d.ts +0 -16
- package/dist/repl.js +0 -165
- package/dist/reqtest.map.json +0 -4
- package/dist/reqtest2.map.json +0 -4
- package/dist/runtime/index.d.ts +0 -107
- package/dist/runtime/index.js +0 -1409
- package/dist/runtime.map.json +0 -7
- package/dist/src/__tests__/codegen.test.d.ts +0 -1
- package/dist/src/__tests__/codegen.test.js +0 -152
- package/dist/src/__tests__/e2e.test.d.ts +0 -6
- package/dist/src/__tests__/e2e.test.js +0 -1789
- package/dist/src/__tests__/entity-types.test.d.ts +0 -1
- package/dist/src/__tests__/entity-types.test.js +0 -203
- package/dist/src/__tests__/lowering.test.d.ts +0 -1
- package/dist/src/__tests__/lowering.test.js +0 -1015
- package/dist/src/__tests__/macro.test.d.ts +0 -8
- package/dist/src/__tests__/macro.test.js +0 -306
- package/dist/src/__tests__/nbt.test.d.ts +0 -1
- package/dist/src/__tests__/nbt.test.js +0 -82
- package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
- package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
- package/dist/src/__tests__/optimizer.test.d.ts +0 -1
- package/dist/src/__tests__/optimizer.test.js +0 -149
- package/dist/src/__tests__/runtime.test.d.ts +0 -1
- package/dist/src/__tests__/runtime.test.js +0 -289
- package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
- package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
- package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
- package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
- package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
- package/dist/src/__tests__/stdlib-math.test.js +0 -351
- package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
- package/dist/src/__tests__/stdlib-vec.test.js +0 -263
- package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
- package/dist/src/__tests__/structure-optimizer.test.js +0 -33
- package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
- package/dist/src/__tests__/var-allocator.test.js +0 -69
- package/dist/src/codegen/cmdblock/index.d.ts +0 -26
- package/dist/src/codegen/cmdblock/index.js +0 -45
- package/dist/src/codegen/mcfunction/index.d.ts +0 -40
- package/dist/src/codegen/mcfunction/index.js +0 -606
- package/dist/src/codegen/structure/index.d.ts +0 -24
- package/dist/src/codegen/structure/index.js +0 -279
- package/dist/src/codegen/var-allocator.d.ts +0 -45
- package/dist/src/codegen/var-allocator.js +0 -104
- package/dist/src/ir/builder.d.ts +0 -33
- package/dist/src/ir/builder.js +0 -99
- package/dist/src/ir/types.d.ts +0 -132
- package/dist/src/ir/types.js +0 -15
- package/dist/src/lowering/index.d.ts +0 -188
- package/dist/src/lowering/index.js +0 -3405
- package/dist/src/optimizer/commands.d.ts +0 -38
- package/dist/src/optimizer/commands.js +0 -451
- package/dist/src/optimizer/passes.d.ts +0 -34
- package/dist/src/optimizer/passes.js +0 -243
- package/dist/src/optimizer/structure.d.ts +0 -9
- package/dist/src/optimizer/structure.js +0 -356
- package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
- package/dist/src2/emit/compile.d.ts +0 -19
- package/dist/src2/emit/compile.js +0 -80
- package/dist/src2/optimizer/dce.d.ts +0 -8
- package/dist/src2/optimizer/dce.js +0 -155
- package/dist/swap_test.map.json +0 -14
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/typechecker/index.d.ts +0 -61
- package/dist/typechecker/index.js +0 -1034
- package/dist/types/entity-hierarchy.d.ts +0 -29
- package/dist/types/entity-hierarchy.js +0 -107
- package/examples/spiral.mcrs +0 -43
- package/src/examples/arena.mcrs +0 -44
- package/src/examples/counter.mcrs +0 -12
- package/src/examples/new_features_demo.mcrs +0 -193
- package/src/examples/rpg.mcrs +0 -13
- package/src/examples/stdlib_demo.mcrs +0 -181
- package/src2/emit/compile.ts +0 -99
- /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
- /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
- /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
- /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
- /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
- /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
- /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
- /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
- /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
- /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
- /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
- /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
- /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
- /package/dist/{src2 → src}/hir/types.js +0 -0
- /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
- /package/dist/{src2 → src}/lir/types.js +0 -0
- /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
- /package/dist/{src2 → src}/lir/verify.js +0 -0
- /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
- /package/dist/{src2 → src}/mir/macro.js +0 -0
- /package/dist/{src2 → src}/mir/types.js +0 -0
- /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
- /package/dist/{src2 → src}/mir/verify.js +0 -0
- /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
- /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
- /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
- /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
- /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
- /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
- /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
- /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
- /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
- /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
- /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
- /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
- /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
- /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
- /package/{src2 → src}/lir/verify.ts +0 -0
- /package/{src2 → src}/mir/macro.ts +0 -0
- /package/{src2 → src}/mir/verify.ts +0 -0
- /package/{src2 → src}/optimizer/block_merge.ts +0 -0
- /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
- /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
- /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HIR Monomorphization — Phase 2c: Generic functions
|
|
3
|
+
*
|
|
4
|
+
* For each generic function `fn foo<T>(...)`, each unique instantiation
|
|
5
|
+
* `foo<int>`, `foo<float>` etc. produces a concrete copy with a mangled name.
|
|
6
|
+
*
|
|
7
|
+
* Algorithm:
|
|
8
|
+
* 1. Walk the HIR module collecting all call sites to generic functions.
|
|
9
|
+
* 2. For each unique (fnName, typeArgs) pair, clone the generic HIRFunction,
|
|
10
|
+
* substitute all occurrences of the type params, and add to module.functions.
|
|
11
|
+
* 3. Rewrite every call site: `foo<int>(x, y)` → `foo_int(x, y)`.
|
|
12
|
+
* 4. Remove original generic function definitions from the output.
|
|
13
|
+
*
|
|
14
|
+
* Type arg → suffix mapping:
|
|
15
|
+
* int → "int"
|
|
16
|
+
* float → "float"
|
|
17
|
+
* bool → "bool"
|
|
18
|
+
* string → "string"
|
|
19
|
+
* (others) → use struct/enum name
|
|
20
|
+
*/
|
|
21
|
+
import type { HIRModule } from './types';
|
|
22
|
+
export declare function monomorphize(module: HIRModule): HIRModule;
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HIR Monomorphization — Phase 2c: Generic functions
|
|
4
|
+
*
|
|
5
|
+
* For each generic function `fn foo<T>(...)`, each unique instantiation
|
|
6
|
+
* `foo<int>`, `foo<float>` etc. produces a concrete copy with a mangled name.
|
|
7
|
+
*
|
|
8
|
+
* Algorithm:
|
|
9
|
+
* 1. Walk the HIR module collecting all call sites to generic functions.
|
|
10
|
+
* 2. For each unique (fnName, typeArgs) pair, clone the generic HIRFunction,
|
|
11
|
+
* substitute all occurrences of the type params, and add to module.functions.
|
|
12
|
+
* 3. Rewrite every call site: `foo<int>(x, y)` → `foo_int(x, y)`.
|
|
13
|
+
* 4. Remove original generic function definitions from the output.
|
|
14
|
+
*
|
|
15
|
+
* Type arg → suffix mapping:
|
|
16
|
+
* int → "int"
|
|
17
|
+
* float → "float"
|
|
18
|
+
* bool → "bool"
|
|
19
|
+
* string → "string"
|
|
20
|
+
* (others) → use struct/enum name
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.monomorphize = monomorphize;
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Public API
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
function monomorphize(module) {
|
|
28
|
+
const mono = new Monomorphizer(module);
|
|
29
|
+
return mono.run();
|
|
30
|
+
}
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Helpers
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
/** Return a stable string suffix for a type argument, used in mangled names. */
|
|
35
|
+
function typeSuffix(t) {
|
|
36
|
+
switch (t.kind) {
|
|
37
|
+
case 'named': return t.name;
|
|
38
|
+
case 'struct': return t.name;
|
|
39
|
+
case 'enum': return t.name;
|
|
40
|
+
case 'array': return `arr_${typeSuffix(t.elem)}`;
|
|
41
|
+
case 'tuple': return `tup_${t.elements.map(typeSuffix).join('_')}`;
|
|
42
|
+
case 'option': return `opt_${typeSuffix(t.inner)}`;
|
|
43
|
+
default: return 'unknown';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Produce the mangled name for a specialization, e.g. "max_int". */
|
|
47
|
+
function mangledName(fnName, typeArgs) {
|
|
48
|
+
return `${fnName}_${typeArgs.map(typeSuffix).join('_')}`;
|
|
49
|
+
}
|
|
50
|
+
/** Build a substitution map: type param name → concrete type. */
|
|
51
|
+
function buildSubst(typeParams, typeArgs) {
|
|
52
|
+
const subst = new Map();
|
|
53
|
+
for (let i = 0; i < typeParams.length; i++) {
|
|
54
|
+
subst.set(typeParams[i], typeArgs[i]);
|
|
55
|
+
}
|
|
56
|
+
return subst;
|
|
57
|
+
}
|
|
58
|
+
/** Apply substitution to a TypeNode (replacing struct-kind nodes whose name
|
|
59
|
+
* matches a type param with the concrete type). */
|
|
60
|
+
function substType(t, subst) {
|
|
61
|
+
switch (t.kind) {
|
|
62
|
+
case 'struct': {
|
|
63
|
+
const replacement = subst.get(t.name);
|
|
64
|
+
if (replacement)
|
|
65
|
+
return replacement;
|
|
66
|
+
return t;
|
|
67
|
+
}
|
|
68
|
+
case 'array':
|
|
69
|
+
return { kind: 'array', elem: substType(t.elem, subst) };
|
|
70
|
+
case 'tuple':
|
|
71
|
+
return { kind: 'tuple', elements: t.elements.map(e => substType(e, subst)) };
|
|
72
|
+
case 'option':
|
|
73
|
+
return { kind: 'option', inner: substType(t.inner, subst) };
|
|
74
|
+
case 'function_type':
|
|
75
|
+
return { kind: 'function_type', params: t.params.map(p => substType(p, subst)), return: substType(t.return, subst) };
|
|
76
|
+
default:
|
|
77
|
+
return t;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
class Monomorphizer {
|
|
81
|
+
constructor(module) {
|
|
82
|
+
/** Map from function name → HIRFunction for generic functions */
|
|
83
|
+
this.genericFns = new Map();
|
|
84
|
+
/** Cache: cacheKey → specialized HIRFunction (to avoid duplicate generation) */
|
|
85
|
+
this.specialized = new Map();
|
|
86
|
+
/** Worklist for BFS specialization (to handle generic calling generic) */
|
|
87
|
+
this.worklist = [];
|
|
88
|
+
this.module = module;
|
|
89
|
+
}
|
|
90
|
+
run() {
|
|
91
|
+
// Collect all generic function definitions
|
|
92
|
+
for (const fn of this.module.functions) {
|
|
93
|
+
if (fn.typeParams && fn.typeParams.length > 0) {
|
|
94
|
+
this.genericFns.set(fn.name, fn);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (this.genericFns.size === 0) {
|
|
98
|
+
// Nothing to do — fast path
|
|
99
|
+
return this.module;
|
|
100
|
+
}
|
|
101
|
+
// Rewrite all non-generic functions, collecting specializations needed
|
|
102
|
+
const newFunctions = [];
|
|
103
|
+
for (const fn of this.module.functions) {
|
|
104
|
+
if (fn.typeParams && fn.typeParams.length > 0) {
|
|
105
|
+
// Skip generic function templates — they'll be replaced by specializations
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const rewritten = this.rewriteFn(fn);
|
|
109
|
+
newFunctions.push(rewritten);
|
|
110
|
+
}
|
|
111
|
+
// Process worklist BFS: generate specializations (which may add more to worklist)
|
|
112
|
+
while (this.worklist.length > 0) {
|
|
113
|
+
const { fn: templateFn, typeArgs } = this.worklist.shift();
|
|
114
|
+
const key = this.cacheKey(templateFn.name, typeArgs);
|
|
115
|
+
if (this.specialized.has(key))
|
|
116
|
+
continue;
|
|
117
|
+
// Mark as in-progress to prevent cycles
|
|
118
|
+
this.specialized.set(key, null);
|
|
119
|
+
const specializedFn = this.specialize(templateFn, typeArgs);
|
|
120
|
+
this.specialized.set(key, specializedFn);
|
|
121
|
+
}
|
|
122
|
+
// Add all specializations
|
|
123
|
+
for (const fn of this.specialized.values()) {
|
|
124
|
+
if (fn)
|
|
125
|
+
newFunctions.push(fn);
|
|
126
|
+
}
|
|
127
|
+
return { ...this.module, functions: newFunctions };
|
|
128
|
+
}
|
|
129
|
+
cacheKey(fnName, typeArgs) {
|
|
130
|
+
return `${fnName}|${typeArgs.map(typeSuffix).join(',')}`;
|
|
131
|
+
}
|
|
132
|
+
/** Specialize a generic function with concrete type args. */
|
|
133
|
+
specialize(templateFn, typeArgs) {
|
|
134
|
+
const subst = buildSubst(templateFn.typeParams, typeArgs);
|
|
135
|
+
const name = mangledName(templateFn.name, typeArgs);
|
|
136
|
+
// Build initial variable scope from parameters
|
|
137
|
+
const varTypes = new Map();
|
|
138
|
+
const params = templateFn.params.map(p => {
|
|
139
|
+
const concreteType = substType(p.type, subst);
|
|
140
|
+
varTypes.set(p.name, concreteType);
|
|
141
|
+
return {
|
|
142
|
+
name: p.name,
|
|
143
|
+
type: concreteType,
|
|
144
|
+
default: p.default ? this.rewriteExpr(p.default, { subst, varTypes }) : undefined,
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
const returnType = substType(templateFn.returnType, subst);
|
|
148
|
+
const body = this.rewriteBlock(templateFn.body, { subst, varTypes });
|
|
149
|
+
return {
|
|
150
|
+
name,
|
|
151
|
+
params,
|
|
152
|
+
returnType,
|
|
153
|
+
decorators: templateFn.decorators,
|
|
154
|
+
body,
|
|
155
|
+
isLibraryFn: templateFn.isLibraryFn,
|
|
156
|
+
isExported: templateFn.isExported,
|
|
157
|
+
span: templateFn.span,
|
|
158
|
+
// No typeParams on the specialized copy
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/** Rewrite a non-generic function (substitute calls to generic functions). */
|
|
162
|
+
rewriteFn(fn) {
|
|
163
|
+
const varTypes = new Map();
|
|
164
|
+
// Add params to scope with their concrete types
|
|
165
|
+
for (const p of fn.params) {
|
|
166
|
+
varTypes.set(p.name, p.type);
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
...fn,
|
|
170
|
+
params: fn.params.map(p => ({
|
|
171
|
+
...p,
|
|
172
|
+
default: p.default ? this.rewriteExpr(p.default, { subst: new Map(), varTypes }) : undefined,
|
|
173
|
+
})),
|
|
174
|
+
body: this.rewriteBlock(fn.body, { subst: new Map(), varTypes }),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
rewriteBlock(block, ctx) {
|
|
178
|
+
// Clone varTypes so block-local bindings don't leak
|
|
179
|
+
const localCtx = { subst: ctx.subst, varTypes: new Map(ctx.varTypes) };
|
|
180
|
+
const result = [];
|
|
181
|
+
for (const stmt of block) {
|
|
182
|
+
result.push(this.rewriteStmt(stmt, localCtx));
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
rewriteStmt(stmt, ctx) {
|
|
187
|
+
const { subst } = ctx;
|
|
188
|
+
switch (stmt.kind) {
|
|
189
|
+
case 'let': {
|
|
190
|
+
const init = this.rewriteExpr(stmt.init, ctx);
|
|
191
|
+
const type = stmt.type ? substType(stmt.type, subst) : undefined;
|
|
192
|
+
// Track variable type in scope
|
|
193
|
+
if (type)
|
|
194
|
+
ctx.varTypes.set(stmt.name, type);
|
|
195
|
+
else {
|
|
196
|
+
const inferred = this.inferExprType(init, ctx);
|
|
197
|
+
if (inferred)
|
|
198
|
+
ctx.varTypes.set(stmt.name, inferred);
|
|
199
|
+
}
|
|
200
|
+
return { ...stmt, type, init };
|
|
201
|
+
}
|
|
202
|
+
case 'let_destruct':
|
|
203
|
+
return { ...stmt, type: stmt.type ? substType(stmt.type, subst) : undefined, init: this.rewriteExpr(stmt.init, ctx) };
|
|
204
|
+
case 'expr':
|
|
205
|
+
return { ...stmt, expr: this.rewriteExpr(stmt.expr, ctx) };
|
|
206
|
+
case 'return':
|
|
207
|
+
return { ...stmt, value: stmt.value ? this.rewriteExpr(stmt.value, ctx) : undefined };
|
|
208
|
+
case 'if':
|
|
209
|
+
return {
|
|
210
|
+
...stmt,
|
|
211
|
+
cond: this.rewriteExpr(stmt.cond, ctx),
|
|
212
|
+
then: this.rewriteBlock(stmt.then, ctx),
|
|
213
|
+
else_: stmt.else_ ? this.rewriteBlock(stmt.else_, ctx) : undefined,
|
|
214
|
+
};
|
|
215
|
+
case 'while':
|
|
216
|
+
return {
|
|
217
|
+
...stmt,
|
|
218
|
+
cond: this.rewriteExpr(stmt.cond, ctx),
|
|
219
|
+
body: this.rewriteBlock(stmt.body, ctx),
|
|
220
|
+
step: stmt.step ? this.rewriteBlock(stmt.step, ctx) : undefined,
|
|
221
|
+
};
|
|
222
|
+
case 'foreach':
|
|
223
|
+
return { ...stmt, iterable: this.rewriteExpr(stmt.iterable, ctx), body: this.rewriteBlock(stmt.body, ctx) };
|
|
224
|
+
case 'match':
|
|
225
|
+
return {
|
|
226
|
+
...stmt,
|
|
227
|
+
expr: this.rewriteExpr(stmt.expr, ctx),
|
|
228
|
+
arms: stmt.arms.map(arm => ({
|
|
229
|
+
pattern: arm.pattern ? this.rewriteExpr(arm.pattern, ctx) : null,
|
|
230
|
+
body: this.rewriteBlock(arm.body, ctx),
|
|
231
|
+
})),
|
|
232
|
+
};
|
|
233
|
+
case 'execute':
|
|
234
|
+
return { ...stmt, body: this.rewriteBlock(stmt.body, ctx) };
|
|
235
|
+
case 'if_let_some':
|
|
236
|
+
return {
|
|
237
|
+
...stmt,
|
|
238
|
+
init: this.rewriteExpr(stmt.init, ctx),
|
|
239
|
+
then: this.rewriteBlock(stmt.then, ctx),
|
|
240
|
+
else_: stmt.else_ ? this.rewriteBlock(stmt.else_, ctx) : undefined,
|
|
241
|
+
};
|
|
242
|
+
case 'break':
|
|
243
|
+
case 'continue':
|
|
244
|
+
case 'raw':
|
|
245
|
+
return stmt;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
rewriteExpr(expr, ctx) {
|
|
249
|
+
const { subst } = ctx;
|
|
250
|
+
switch (expr.kind) {
|
|
251
|
+
case 'call': {
|
|
252
|
+
const args = expr.args.map(a => this.rewriteExpr(a, ctx));
|
|
253
|
+
// Determine concrete type args for this call
|
|
254
|
+
const resolvedTypeArgs = expr.typeArgs?.map(t => substType(t, subst));
|
|
255
|
+
const genericFn = this.genericFns.get(expr.fn);
|
|
256
|
+
if (genericFn && genericFn.typeParams && genericFn.typeParams.length > 0) {
|
|
257
|
+
// This call targets a generic function — we need to monomorphize
|
|
258
|
+
const concreteTypeArgs = resolvedTypeArgs ?? this.inferTypeArgs(genericFn, args, ctx);
|
|
259
|
+
if (concreteTypeArgs) {
|
|
260
|
+
const key = this.cacheKey(expr.fn, concreteTypeArgs);
|
|
261
|
+
if (!this.specialized.has(key)) {
|
|
262
|
+
// Enqueue for specialization
|
|
263
|
+
this.worklist.push({ fn: genericFn, typeArgs: concreteTypeArgs });
|
|
264
|
+
}
|
|
265
|
+
const name = mangledName(expr.fn, concreteTypeArgs);
|
|
266
|
+
return { ...expr, fn: name, args, typeArgs: undefined };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return { ...expr, args, typeArgs: resolvedTypeArgs };
|
|
270
|
+
}
|
|
271
|
+
case 'invoke':
|
|
272
|
+
return { ...expr, callee: this.rewriteExpr(expr.callee, ctx), args: expr.args.map(a => this.rewriteExpr(a, ctx)) };
|
|
273
|
+
case 'binary':
|
|
274
|
+
return { ...expr, left: this.rewriteExpr(expr.left, ctx), right: this.rewriteExpr(expr.right, ctx) };
|
|
275
|
+
case 'unary':
|
|
276
|
+
return { ...expr, operand: this.rewriteExpr(expr.operand, ctx) };
|
|
277
|
+
case 'assign':
|
|
278
|
+
return { ...expr, value: this.rewriteExpr(expr.value, ctx) };
|
|
279
|
+
case 'member_assign':
|
|
280
|
+
return { ...expr, obj: this.rewriteExpr(expr.obj, ctx), value: this.rewriteExpr(expr.value, ctx) };
|
|
281
|
+
case 'member':
|
|
282
|
+
return { ...expr, obj: this.rewriteExpr(expr.obj, ctx) };
|
|
283
|
+
case 'index':
|
|
284
|
+
return { ...expr, obj: this.rewriteExpr(expr.obj, ctx), index: this.rewriteExpr(expr.index, ctx) };
|
|
285
|
+
case 'array_lit':
|
|
286
|
+
return { ...expr, elements: expr.elements.map(e => this.rewriteExpr(e, ctx)) };
|
|
287
|
+
case 'struct_lit':
|
|
288
|
+
return { ...expr, fields: expr.fields.map(f => ({ name: f.name, value: this.rewriteExpr(f.value, ctx) })) };
|
|
289
|
+
case 'tuple_lit':
|
|
290
|
+
return { ...expr, elements: expr.elements.map(e => this.rewriteExpr(e, ctx)) };
|
|
291
|
+
case 'static_call':
|
|
292
|
+
return { ...expr, args: expr.args.map(a => this.rewriteExpr(a, ctx)) };
|
|
293
|
+
case 'lambda':
|
|
294
|
+
return { ...expr, body: Array.isArray(expr.body) ? this.rewriteBlock(expr.body, ctx) : this.rewriteExpr(expr.body, ctx) };
|
|
295
|
+
case 'is_check':
|
|
296
|
+
return { ...expr, expr: this.rewriteExpr(expr.expr, ctx) };
|
|
297
|
+
case 'str_interp':
|
|
298
|
+
return { ...expr, parts: expr.parts.map(p => typeof p === 'string' ? p : this.rewriteExpr(p, ctx)) };
|
|
299
|
+
case 'f_string':
|
|
300
|
+
// FStringPart uses AST Expr (not HIRExpr) — pass through without rewriting
|
|
301
|
+
return expr;
|
|
302
|
+
case 'some_lit':
|
|
303
|
+
return { ...expr, value: this.rewriteExpr(expr.value, ctx) };
|
|
304
|
+
case 'none_lit':
|
|
305
|
+
return expr;
|
|
306
|
+
// Literals / terminals — pass through unchanged
|
|
307
|
+
default:
|
|
308
|
+
return expr;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Infer type args from the actual argument expressions.
|
|
313
|
+
* Works by looking at the types of call arguments and matching them to
|
|
314
|
+
* the type parameters in the function signature.
|
|
315
|
+
*
|
|
316
|
+
* Returns null if inference fails.
|
|
317
|
+
*/
|
|
318
|
+
inferTypeArgs(fn, args, ctx) {
|
|
319
|
+
const inferred = new Map();
|
|
320
|
+
const typeParams = fn.typeParams;
|
|
321
|
+
for (let i = 0; i < fn.params.length && i < args.length; i++) {
|
|
322
|
+
const paramType = fn.params[i].type;
|
|
323
|
+
const argType = this.inferExprType(args[i], ctx);
|
|
324
|
+
if (argType) {
|
|
325
|
+
this.matchTypes(paramType, argType, typeParams, inferred);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Check all type params were inferred
|
|
329
|
+
if (typeParams.every(tp => inferred.has(tp))) {
|
|
330
|
+
return typeParams.map(tp => inferred.get(tp));
|
|
331
|
+
}
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
/** Walk a type pattern and a concrete type, binding type param names. */
|
|
335
|
+
matchTypes(pattern, concrete, typeParams, inferred) {
|
|
336
|
+
if (pattern.kind === 'struct' && typeParams.includes(pattern.name)) {
|
|
337
|
+
// This position is a type param — bind it
|
|
338
|
+
if (!inferred.has(pattern.name)) {
|
|
339
|
+
inferred.set(pattern.name, concrete);
|
|
340
|
+
}
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
if (pattern.kind === 'array' && concrete.kind === 'array') {
|
|
344
|
+
this.matchTypes(pattern.elem, concrete.elem, typeParams, inferred);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (pattern.kind === 'tuple' && concrete.kind === 'tuple') {
|
|
348
|
+
for (let i = 0; i < pattern.elements.length && i < concrete.elements.length; i++) {
|
|
349
|
+
this.matchTypes(pattern.elements[i], concrete.elements[i], typeParams, inferred);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/** Infer the type of a HIR expression (best-effort, for type inference). */
|
|
354
|
+
inferExprType(expr, ctx) {
|
|
355
|
+
switch (expr.kind) {
|
|
356
|
+
case 'int_lit': return { kind: 'named', name: 'int' };
|
|
357
|
+
case 'float_lit': return { kind: 'named', name: 'float' };
|
|
358
|
+
case 'bool_lit': return { kind: 'named', name: 'bool' };
|
|
359
|
+
case 'str_lit': return { kind: 'named', name: 'string' };
|
|
360
|
+
case 'byte_lit': return { kind: 'named', name: 'byte' };
|
|
361
|
+
case 'short_lit': return { kind: 'named', name: 'short' };
|
|
362
|
+
case 'long_lit': return { kind: 'named', name: 'long' };
|
|
363
|
+
case 'double_lit': return { kind: 'named', name: 'double' };
|
|
364
|
+
case 'ident': return ctx.varTypes.get(expr.name) ?? null;
|
|
365
|
+
case 'unary':
|
|
366
|
+
// unary minus/not preserves the operand's type
|
|
367
|
+
return this.inferExprType(expr.operand, ctx);
|
|
368
|
+
case 'binary': {
|
|
369
|
+
// For arithmetic, use the left operand's type
|
|
370
|
+
const lt = this.inferExprType(expr.left, ctx);
|
|
371
|
+
if (lt)
|
|
372
|
+
return lt;
|
|
373
|
+
return this.inferExprType(expr.right, ctx);
|
|
374
|
+
}
|
|
375
|
+
default: return null;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=monomorphize.js.map
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
*
|
|
12
12
|
* All types and names are preserved from the AST.
|
|
13
13
|
*/
|
|
14
|
-
import type { Span, TypeNode, EntitySelector, CoordComponent, Decorator, RangeExpr, FStringPart, SelectorFilter, EntityTypeName, LambdaParam } from '
|
|
15
|
-
import type { BinOp, CmpOp } from '
|
|
14
|
+
import type { Span, TypeNode, EntitySelector, CoordComponent, Decorator, RangeExpr, FStringPart, SelectorFilter, EntityTypeName, LambdaParam } from '../ast/types';
|
|
15
|
+
import type { BinOp, CmpOp } from '../ast/types';
|
|
16
16
|
export type { Span, TypeNode, EntitySelector, CoordComponent, Decorator, RangeExpr, FStringPart, SelectorFilter, EntityTypeName, LambdaParam, BinOp, CmpOp, };
|
|
17
17
|
export type HIRExpr = {
|
|
18
18
|
kind: 'int_lit';
|
|
@@ -138,6 +138,7 @@ export type HIRExpr = {
|
|
|
138
138
|
kind: 'call';
|
|
139
139
|
fn: string;
|
|
140
140
|
args: HIRExpr[];
|
|
141
|
+
typeArgs?: TypeNode[];
|
|
141
142
|
span?: Span;
|
|
142
143
|
} | {
|
|
143
144
|
kind: 'invoke';
|
|
@@ -150,12 +151,28 @@ export type HIRExpr = {
|
|
|
150
151
|
method: string;
|
|
151
152
|
args: HIRExpr[];
|
|
152
153
|
span?: Span;
|
|
154
|
+
} | {
|
|
155
|
+
kind: 'path_expr';
|
|
156
|
+
enumName: string;
|
|
157
|
+
variant: string;
|
|
158
|
+
span?: Span;
|
|
153
159
|
} | {
|
|
154
160
|
kind: 'lambda';
|
|
155
161
|
params: LambdaParam[];
|
|
156
162
|
returnType?: TypeNode;
|
|
157
163
|
body: HIRExpr | HIRBlock;
|
|
158
164
|
span?: Span;
|
|
165
|
+
} | {
|
|
166
|
+
kind: 'tuple_lit';
|
|
167
|
+
elements: HIRExpr[];
|
|
168
|
+
span?: Span;
|
|
169
|
+
} | {
|
|
170
|
+
kind: 'some_lit';
|
|
171
|
+
value: HIRExpr;
|
|
172
|
+
span?: Span;
|
|
173
|
+
} | {
|
|
174
|
+
kind: 'none_lit';
|
|
175
|
+
span?: Span;
|
|
159
176
|
};
|
|
160
177
|
export type HIRExecuteSubcommand = {
|
|
161
178
|
kind: 'as';
|
|
@@ -259,6 +276,12 @@ export type HIRStmt = {
|
|
|
259
276
|
type?: TypeNode;
|
|
260
277
|
init: HIRExpr;
|
|
261
278
|
span?: Span;
|
|
279
|
+
} | {
|
|
280
|
+
kind: 'let_destruct';
|
|
281
|
+
names: string[];
|
|
282
|
+
type?: TypeNode;
|
|
283
|
+
init: HIRExpr;
|
|
284
|
+
span?: Span;
|
|
262
285
|
} | {
|
|
263
286
|
kind: 'expr';
|
|
264
287
|
expr: HIRExpr;
|
|
@@ -309,6 +332,13 @@ export type HIRStmt = {
|
|
|
309
332
|
kind: 'raw';
|
|
310
333
|
cmd: string;
|
|
311
334
|
span?: Span;
|
|
335
|
+
} | {
|
|
336
|
+
kind: 'if_let_some';
|
|
337
|
+
binding: string;
|
|
338
|
+
init: HIRExpr;
|
|
339
|
+
then: HIRBlock;
|
|
340
|
+
else_?: HIRBlock;
|
|
341
|
+
span?: Span;
|
|
312
342
|
};
|
|
313
343
|
export type HIRBlock = HIRStmt[];
|
|
314
344
|
export interface HIRParam {
|
|
@@ -318,11 +348,14 @@ export interface HIRParam {
|
|
|
318
348
|
}
|
|
319
349
|
export interface HIRFunction {
|
|
320
350
|
name: string;
|
|
351
|
+
/** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
|
|
352
|
+
typeParams?: string[];
|
|
321
353
|
params: HIRParam[];
|
|
322
354
|
returnType: TypeNode;
|
|
323
355
|
decorators: Decorator[];
|
|
324
356
|
body: HIRBlock;
|
|
325
357
|
isLibraryFn?: boolean;
|
|
358
|
+
isExported?: boolean;
|
|
326
359
|
span?: Span;
|
|
327
360
|
}
|
|
328
361
|
export interface HIRStructField {
|
package/dist/src/index.d.ts
CHANGED
|
@@ -4,19 +4,36 @@
|
|
|
4
4
|
* Main entry point for programmatic usage.
|
|
5
5
|
*/
|
|
6
6
|
export declare const version = "2.0.0";
|
|
7
|
-
export { compile, CompileOptions, CompileResult } from '
|
|
8
|
-
export
|
|
7
|
+
export { compile, CompileOptions, CompileResult } from './emit/compile';
|
|
8
|
+
export { compileModules } from './emit/modules';
|
|
9
|
+
export type { ModuleInput, CompileModulesOptions, CompileModulesResult } from './emit/modules';
|
|
10
|
+
export { McVersion, parseMcVersion, compareMcVersion, DEFAULT_MC_VERSION } from './types/mc-version';
|
|
11
|
+
export type { DatapackFile } from './emit/index';
|
|
9
12
|
export { Lexer } from './lexer';
|
|
10
13
|
export { Parser } from './parser';
|
|
11
14
|
export { preprocessSource, preprocessSourceWithMetadata } from './compile';
|
|
12
15
|
export { MCCommandValidator } from './mc-validator';
|
|
13
16
|
export type { Program, FnDecl, Expr, Stmt, Span } from './ast/types';
|
|
14
17
|
export type { DiagnosticError } from './diagnostics';
|
|
18
|
+
export { FileCache, hashFile } from './cache/index';
|
|
19
|
+
export { DependencyGraph, parseImports } from './cache/deps';
|
|
20
|
+
export { compileIncremental, resetCompileCache } from './cache/incremental';
|
|
21
|
+
export type { IncrementalOptions, IncrementalResult } from './cache/incremental';
|
|
22
|
+
export interface CheckResult {
|
|
23
|
+
error: Error | null;
|
|
24
|
+
warnings: string[];
|
|
25
|
+
}
|
|
15
26
|
/**
|
|
16
27
|
* Check RedScript source code for errors without generating output.
|
|
28
|
+
* Runs the full compile pipeline (lex → parse → HIR → MIR → LIR → emit)
|
|
29
|
+
* to catch type-level and lowering errors, not just parse errors.
|
|
17
30
|
*
|
|
18
31
|
* @param source - The RedScript source code
|
|
19
32
|
* @param namespace - Optional namespace
|
|
20
33
|
* @returns null if no errors, or an error object
|
|
21
34
|
*/
|
|
22
35
|
export declare function check(source: string, namespace?: string, filePath?: string): Error | null;
|
|
36
|
+
/**
|
|
37
|
+
* Like check(), but also returns warnings (e.g., tick budget analysis).
|
|
38
|
+
*/
|
|
39
|
+
export declare function checkWithWarnings(source: string, namespace?: string, filePath?: string): CheckResult;
|
package/dist/src/index.js
CHANGED
|
@@ -5,41 +5,63 @@
|
|
|
5
5
|
* Main entry point for programmatic usage.
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.MCCommandValidator = exports.preprocessSourceWithMetadata = exports.preprocessSource = exports.Parser = exports.Lexer = exports.compile = exports.version = void 0;
|
|
8
|
+
exports.resetCompileCache = exports.compileIncremental = exports.parseImports = exports.DependencyGraph = exports.hashFile = exports.FileCache = exports.MCCommandValidator = exports.preprocessSourceWithMetadata = exports.preprocessSource = exports.Parser = exports.Lexer = exports.DEFAULT_MC_VERSION = exports.compareMcVersion = exports.parseMcVersion = exports.McVersion = exports.compileModules = exports.compile = exports.version = void 0;
|
|
9
9
|
exports.check = check;
|
|
10
|
+
exports.checkWithWarnings = checkWithWarnings;
|
|
10
11
|
exports.version = '2.0.0';
|
|
11
|
-
const
|
|
12
|
-
const parser_1 = require("./parser");
|
|
13
|
-
const compile_1 = require("./compile");
|
|
12
|
+
const compile_1 = require("./emit/compile");
|
|
14
13
|
// Re-export v2 compile API
|
|
15
|
-
var compile_2 = require("
|
|
14
|
+
var compile_2 = require("./emit/compile");
|
|
16
15
|
Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_2.compile; } });
|
|
16
|
+
var modules_1 = require("./emit/modules");
|
|
17
|
+
Object.defineProperty(exports, "compileModules", { enumerable: true, get: function () { return modules_1.compileModules; } });
|
|
18
|
+
var mc_version_1 = require("./types/mc-version");
|
|
19
|
+
Object.defineProperty(exports, "McVersion", { enumerable: true, get: function () { return mc_version_1.McVersion; } });
|
|
20
|
+
Object.defineProperty(exports, "parseMcVersion", { enumerable: true, get: function () { return mc_version_1.parseMcVersion; } });
|
|
21
|
+
Object.defineProperty(exports, "compareMcVersion", { enumerable: true, get: function () { return mc_version_1.compareMcVersion; } });
|
|
22
|
+
Object.defineProperty(exports, "DEFAULT_MC_VERSION", { enumerable: true, get: function () { return mc_version_1.DEFAULT_MC_VERSION; } });
|
|
17
23
|
// Re-export utilities
|
|
18
|
-
var
|
|
19
|
-
Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return
|
|
20
|
-
var
|
|
21
|
-
Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return
|
|
24
|
+
var lexer_1 = require("./lexer");
|
|
25
|
+
Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return lexer_1.Lexer; } });
|
|
26
|
+
var parser_1 = require("./parser");
|
|
27
|
+
Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return parser_1.Parser; } });
|
|
22
28
|
var compile_3 = require("./compile");
|
|
23
29
|
Object.defineProperty(exports, "preprocessSource", { enumerable: true, get: function () { return compile_3.preprocessSource; } });
|
|
24
30
|
Object.defineProperty(exports, "preprocessSourceWithMetadata", { enumerable: true, get: function () { return compile_3.preprocessSourceWithMetadata; } });
|
|
25
31
|
var mc_validator_1 = require("./mc-validator");
|
|
26
32
|
Object.defineProperty(exports, "MCCommandValidator", { enumerable: true, get: function () { return mc_validator_1.MCCommandValidator; } });
|
|
33
|
+
// Incremental compilation
|
|
34
|
+
var index_1 = require("./cache/index");
|
|
35
|
+
Object.defineProperty(exports, "FileCache", { enumerable: true, get: function () { return index_1.FileCache; } });
|
|
36
|
+
Object.defineProperty(exports, "hashFile", { enumerable: true, get: function () { return index_1.hashFile; } });
|
|
37
|
+
var deps_1 = require("./cache/deps");
|
|
38
|
+
Object.defineProperty(exports, "DependencyGraph", { enumerable: true, get: function () { return deps_1.DependencyGraph; } });
|
|
39
|
+
Object.defineProperty(exports, "parseImports", { enumerable: true, get: function () { return deps_1.parseImports; } });
|
|
40
|
+
var incremental_1 = require("./cache/incremental");
|
|
41
|
+
Object.defineProperty(exports, "compileIncremental", { enumerable: true, get: function () { return incremental_1.compileIncremental; } });
|
|
42
|
+
Object.defineProperty(exports, "resetCompileCache", { enumerable: true, get: function () { return incremental_1.resetCompileCache; } });
|
|
27
43
|
/**
|
|
28
44
|
* Check RedScript source code for errors without generating output.
|
|
45
|
+
* Runs the full compile pipeline (lex → parse → HIR → MIR → LIR → emit)
|
|
46
|
+
* to catch type-level and lowering errors, not just parse errors.
|
|
29
47
|
*
|
|
30
48
|
* @param source - The RedScript source code
|
|
31
49
|
* @param namespace - Optional namespace
|
|
32
50
|
* @returns null if no errors, or an error object
|
|
33
51
|
*/
|
|
34
52
|
function check(source, namespace = 'redscript', filePath) {
|
|
53
|
+
return checkWithWarnings(source, namespace, filePath).error;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Like check(), but also returns warnings (e.g., tick budget analysis).
|
|
57
|
+
*/
|
|
58
|
+
function checkWithWarnings(source, namespace = 'redscript', filePath) {
|
|
35
59
|
try {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
new parser_1.Parser(tokens, preprocessedSource, filePath).parse(namespace);
|
|
39
|
-
return null;
|
|
60
|
+
const result = (0, compile_1.compile)(source, { namespace, filePath });
|
|
61
|
+
return { error: null, warnings: result.warnings };
|
|
40
62
|
}
|
|
41
63
|
catch (err) {
|
|
42
|
-
return err;
|
|
64
|
+
return { error: err, warnings: [] };
|
|
43
65
|
}
|
|
44
66
|
}
|
|
45
67
|
//# sourceMappingURL=index.js.map
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Handles special cases like entity selectors vs decorators,
|
|
6
6
|
* range literals, and raw commands.
|
|
7
7
|
*/
|
|
8
|
-
export type TokenKind = 'fn' | 'let' | 'const' | 'if' | 'else' | 'while' | 'for' | 'foreach' | 'match' | 'return' | 'break' | 'continue' | 'as' | 'at' | 'in' | 'is' | 'struct' | 'impl' | 'enum' | 'trigger' | 'namespace' | 'module' | 'execute' | 'run' | 'unless' | 'declare' | 'int' | 'bool' | 'float' | 'string' | 'void' | 'BlockPos' | 'true' | 'false' | 'selector' | 'decorator' | 'int_lit' | 'float_lit' | 'byte_lit' | 'short_lit' | 'long_lit' | 'double_lit' | 'string_lit' | 'f_string' | 'range_lit' | 'rel_coord' | 'local_coord' | '+' | '-' | '*' | '/' | '%' | '~' | '^' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '&&' | '||' | '!' | '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '{' | '}' | '(' | ')' | '[' | ']' | ',' | ';' | ':' | '::' | '->' | '=>' | '.' | 'ident' | 'mc_name' | 'raw_cmd' | 'eof';
|
|
8
|
+
export type TokenKind = 'fn' | 'let' | 'const' | 'if' | 'else' | 'while' | 'for' | 'foreach' | 'match' | 'return' | 'break' | 'continue' | 'as' | 'at' | 'in' | 'is' | 'struct' | 'impl' | 'enum' | 'trigger' | 'namespace' | 'module' | 'execute' | 'run' | 'unless' | 'declare' | 'export' | 'int' | 'bool' | 'float' | 'string' | 'void' | 'BlockPos' | 'true' | 'false' | 'selector' | 'decorator' | 'int_lit' | 'float_lit' | 'byte_lit' | 'short_lit' | 'long_lit' | 'double_lit' | 'string_lit' | 'f_string' | 'range_lit' | 'rel_coord' | 'local_coord' | '+' | '-' | '*' | '/' | '%' | '~' | '^' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '&&' | '||' | '!' | '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '{' | '}' | '(' | ')' | '[' | ']' | ',' | ';' | ':' | '::' | '->' | '=>' | '.' | 'ident' | 'mc_name' | 'raw_cmd' | 'eof';
|
|
9
9
|
export interface Token {
|
|
10
10
|
kind: TokenKind;
|
|
11
11
|
value: string;
|
package/dist/src/lexer/index.js
CHANGED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static Tick Budget Analysis — Phase 1a
|
|
3
|
+
*
|
|
4
|
+
* Estimates the number of MC commands a function will execute at runtime.
|
|
5
|
+
* Used to warn when loops may exceed Minecraft's maxCommandChainLength (65536).
|
|
6
|
+
*
|
|
7
|
+
* In LIR, loops are represented as mutually-recursive function calls
|
|
8
|
+
* (e.g., fn__header ↔ fn__body). This module detects call-graph cycles
|
|
9
|
+
* and multiplies the loop body cost by an estimated iteration count.
|
|
10
|
+
*/
|
|
11
|
+
import type { LIRModule } from './types';
|
|
12
|
+
/** Warning threshold: suggest @coroutine */
|
|
13
|
+
export declare const BUDGET_WARN_THRESHOLD = 32768;
|
|
14
|
+
/** Error threshold: likely exceeds maxCommandChainLength */
|
|
15
|
+
export declare const BUDGET_ERROR_THRESHOLD = 65536;
|
|
16
|
+
export interface BudgetDiagnostic {
|
|
17
|
+
level: 'warning' | 'error';
|
|
18
|
+
fnName: string;
|
|
19
|
+
estimatedCommands: number;
|
|
20
|
+
message: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Estimate the total command count for a function, including callees.
|
|
24
|
+
*
|
|
25
|
+
* @param fnName - Name of the function to estimate
|
|
26
|
+
* @param mod - The LIR module
|
|
27
|
+
* @returns Estimated number of MC commands
|
|
28
|
+
*/
|
|
29
|
+
export declare function estimateCommandCount(fnName: string, mod: LIRModule): number;
|
|
30
|
+
/**
|
|
31
|
+
* Analyze all "top-level" functions in the module for tick budget violations.
|
|
32
|
+
*
|
|
33
|
+
* @param mod - The LIR module to analyze
|
|
34
|
+
* @param coroutineFunctions - Set of function names marked @coroutine (skip these)
|
|
35
|
+
* @returns Array of budget diagnostics (warnings and errors)
|
|
36
|
+
*/
|
|
37
|
+
export declare function analyzeBudget(mod: LIRModule, coroutineFunctions?: Set<string>): BudgetDiagnostic[];
|