redscript-mc 1.2.30 → 2.1.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/.claudeignore +21 -0
- package/.github/workflows/ci.yml +1 -0
- package/README.md +12 -16
- package/README.zh.md +2 -2
- package/demo.gif +0 -0
- package/dist/cli.js +2 -554
- package/dist/compile.js +2 -266
- package/dist/index.js +2 -159
- package/dist/src/__tests__/budget.test.js +261 -0
- package/dist/src/__tests__/cli.test.js +104 -0
- package/dist/{__tests__ → src/__tests__}/dce.test.js +11 -47
- package/dist/{__tests__ → src/__tests__}/diagnostics.test.js +67 -40
- package/dist/src/__tests__/e2e/basic.test.d.ts +8 -0
- package/dist/src/__tests__/e2e/basic.test.js +140 -0
- package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
- package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
- package/dist/src/__tests__/e2e/macros.test.d.ts +9 -0
- package/dist/src/__tests__/e2e/macros.test.js +182 -0
- package/dist/src/__tests__/e2e/migrate.test.d.ts +13 -0
- package/dist/src/__tests__/e2e/migrate.test.js +2739 -0
- 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/src/__tests__/hir/desugar.test.js +234 -0
- package/dist/src/__tests__/incremental.test.d.ts +5 -0
- package/dist/src/__tests__/incremental.test.js +308 -0
- package/dist/src/__tests__/lir/lower.test.js +559 -0
- package/dist/src/__tests__/lir/types.test.js +185 -0
- package/dist/src/__tests__/lir/verify.test.js +221 -0
- package/dist/src/__tests__/lsp.test.d.ts +7 -0
- package/dist/src/__tests__/lsp.test.js +245 -0
- package/dist/{__tests__ → src/__tests__}/mc-integration.test.js +1 -3
- package/dist/src/__tests__/mc-version.test.d.ts +10 -0
- package/dist/src/__tests__/mc-version.test.js +154 -0
- package/dist/src/__tests__/mir/arithmetic.test.js +130 -0
- package/dist/src/__tests__/mir/control-flow.test.js +205 -0
- package/dist/src/__tests__/mir/verify.test.js +223 -0
- package/dist/src/__tests__/modules.test.d.ts +7 -0
- package/dist/src/__tests__/modules.test.js +333 -0
- package/dist/src/__tests__/optimizer/block_merge.test.js +78 -0
- package/dist/src/__tests__/optimizer/branch_simplify.test.js +58 -0
- package/dist/src/__tests__/optimizer/constant_fold.test.js +131 -0
- package/dist/src/__tests__/optimizer/copy_prop.test.js +91 -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/dce.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/dce.test.js +76 -0
- package/dist/src/__tests__/optimizer/interprocedural.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
- package/dist/src/__tests__/optimizer/lir/const_imm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
- package/dist/src/__tests__/optimizer/lir/dead_slot.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
- package/dist/src/__tests__/optimizer/lir/peephole.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
- package/dist/src/__tests__/optimizer/lir/pipeline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
- package/dist/src/__tests__/optimizer/nbt-batch.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
- package/dist/src/__tests__/optimizer/pipeline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/pipeline.test.js +102 -0
- package/dist/src/__tests__/optimizer/selector-cache.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
- package/dist/src/__tests__/optimizer/unroll.test.d.ts +1 -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__/parser.test.d.ts +1 -0
- package/dist/src/__tests__/repl.test.d.ts +1 -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__/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/__tests__/typechecker.test.d.ts +1 -0
- package/dist/{ast → src/ast}/types.d.ts +58 -3
- 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/{cli.d.ts → src/cli.d.ts} +1 -1
- package/dist/src/cli.js +474 -0
- package/dist/src/compile.d.ts +37 -0
- package/dist/src/compile.js +165 -0
- package/dist/{diagnostics → src/diagnostics}/index.d.ts +1 -1
- package/dist/{diagnostics → src/diagnostics}/index.js +8 -11
- package/dist/src/emit/compile.d.ts +29 -0
- package/dist/src/emit/compile.js +143 -0
- package/dist/src/emit/index.d.ts +26 -0
- package/dist/src/emit/index.js +223 -0
- 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/src/hir/lower.d.ts +15 -0
- package/dist/src/hir/lower.js +399 -0
- package/dist/src/hir/monomorphize.d.ts +22 -0
- package/dist/src/hir/monomorphize.js +379 -0
- package/dist/src/hir/types.d.ts +406 -0
- package/dist/src/hir/types.js +16 -0
- package/dist/src/index.d.ts +39 -0
- package/dist/src/index.js +67 -0
- package/dist/{lexer → src/lexer}/index.d.ts +1 -1
- package/dist/{lexer → 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/src/lir/lower.d.ts +15 -0
- package/dist/src/lir/lower.js +472 -0
- package/dist/src/lir/types.d.ts +139 -0
- package/dist/src/lir/types.js +11 -0
- package/dist/src/lir/verify.d.ts +14 -0
- package/dist/src/lir/verify.js +113 -0
- 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 +352 -0
- package/dist/{mc-test → src/mc-test}/runner.js +4 -3
- package/dist/src/mir/lower.d.ts +9 -0
- package/dist/src/mir/lower.js +1264 -0
- package/dist/src/mir/macro.d.ts +22 -0
- package/dist/src/mir/macro.js +168 -0
- package/dist/src/mir/types.d.ts +191 -0
- package/dist/src/mir/types.js +11 -0
- package/dist/src/mir/verify.d.ts +16 -0
- package/dist/src/mir/verify.js +216 -0
- package/dist/src/optimizer/block_merge.d.ts +12 -0
- package/dist/src/optimizer/block_merge.js +84 -0
- package/dist/src/optimizer/branch_simplify.d.ts +9 -0
- package/dist/src/optimizer/branch_simplify.js +28 -0
- package/dist/src/optimizer/constant_fold.d.ts +10 -0
- package/dist/src/optimizer/constant_fold.js +85 -0
- package/dist/src/optimizer/copy_prop.d.ts +9 -0
- package/dist/src/optimizer/copy_prop.js +113 -0
- 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 -0
- package/dist/src/optimizer/dce.js +156 -0
- 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/src/optimizer/pipeline.d.ts +14 -0
- package/dist/src/optimizer/pipeline.js +58 -0
- 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/{parser → src/parser}/index.d.ts +8 -0
- package/dist/{parser → src/parser}/index.js +204 -14
- package/dist/{repl.d.ts → src/repl.d.ts} +1 -1
- package/dist/{runtime → src/runtime}/index.js +1 -1
- package/dist/{typechecker → src/typechecker}/index.d.ts +4 -0
- package/dist/{typechecker → 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 +2260 -0
- package/docs/optimization-ideas.md +1076 -0
- 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/examples/showcase.mcrs +3 -3
- package/package.json +13 -6
- package/scripts/postbuild.js +15 -0
- package/src/__tests__/budget.test.ts +297 -0
- package/src/__tests__/cli.test.ts +8 -220
- package/src/__tests__/dce.test.ts +11 -56
- package/src/__tests__/diagnostics.test.ts +61 -41
- package/src/__tests__/e2e/basic.test.ts +154 -0
- package/src/__tests__/e2e/coroutine.test.ts +142 -0
- package/src/__tests__/e2e/macros.test.ts +199 -0
- package/src/__tests__/e2e/migrate.test.ts +3008 -0
- 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/src/__tests__/hir/desugar.test.ts +263 -0
- package/src/__tests__/incremental.test.ts +337 -0
- package/src/__tests__/lir/lower.test.ts +619 -0
- package/src/__tests__/lir/types.test.ts +207 -0
- package/src/__tests__/lir/verify.test.ts +249 -0
- package/src/__tests__/lsp.test.ts +270 -0
- package/src/__tests__/mc-integration.test.ts +1 -2
- package/src/__tests__/mc-version.test.ts +178 -0
- package/src/__tests__/mir/arithmetic.test.ts +156 -0
- package/src/__tests__/mir/control-flow.test.ts +242 -0
- package/src/__tests__/mir/verify.test.ts +254 -0
- package/src/__tests__/modules.test.ts +365 -0
- package/src/__tests__/optimizer/block_merge.test.ts +84 -0
- package/src/__tests__/optimizer/branch_simplify.test.ts +64 -0
- package/src/__tests__/optimizer/constant_fold.test.ts +145 -0
- package/src/__tests__/optimizer/copy_prop.test.ts +99 -0
- package/src/__tests__/optimizer/coroutine.test.ts +312 -0
- package/src/__tests__/optimizer/dce.test.ts +83 -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/pipeline.test.ts +116 -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__/tuple.test.ts +220 -0
- package/src/__tests__/typechecker-strict.test.ts +216 -0
- package/src/ast/types.ts +39 -3
- 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 +111 -195
- package/src/compile.ts +6 -162
- package/src/diagnostics/index.ts +8 -11
- package/src/emit/compile.ts +177 -0
- package/src/emit/index.ts +286 -0
- package/src/emit/modules.ts +581 -0
- package/src/emit/sourcemap.ts +101 -0
- package/src/hir/lower.ts +455 -0
- package/src/hir/monomorphize.ts +416 -0
- package/src/hir/types.ts +228 -0
- package/src/index.ts +37 -182
- package/src/lexer/index.ts +2 -1
- package/src/lir/budget.ts +321 -0
- package/src/lir/lower.ts +587 -0
- package/src/lir/types.ts +113 -0
- package/src/lir/verify.ts +129 -0
- package/src/lsp/main.ts +9 -0
- package/src/lsp/server.ts +414 -0
- package/src/mc-test/runner.ts +4 -3
- package/src/mir/lower.ts +1403 -0
- package/src/mir/macro.ts +167 -0
- package/src/mir/types.ts +117 -0
- package/src/mir/verify.ts +218 -0
- package/src/optimizer/block_merge.ts +93 -0
- package/src/optimizer/branch_simplify.ts +27 -0
- package/src/optimizer/constant_fold.ts +88 -0
- package/src/optimizer/copy_prop.ts +106 -0
- package/src/optimizer/coroutine.ts +996 -0
- package/src/optimizer/dce.ts +108 -653
- 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/src/optimizer/pipeline.ts +59 -0
- package/src/optimizer/selector-cache.ts +103 -0
- package/src/optimizer/unroll.ts +386 -0
- package/src/parser/index.ts +213 -16
- package/src/repl.ts +1 -1
- package/src/runtime/index.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/dist/__tests__/cli.test.js +0 -278
- package/dist/__tests__/codegen.test.js +0 -152
- 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__/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__/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__/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.js +0 -33
- package/dist/__tests__/var-allocator.test.js +0 -69
- 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/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/lowering/index.d.ts +0 -188
- package/dist/lowering/index.js +0 -3403
- package/dist/mathtest.map.json +0 -6
- package/dist/mypack.map.json +0 -27
- 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/reqtest.map.json +0 -4
- package/dist/reqtest2.map.json +0 -4
- package/dist/runtime.map.json +0 -7
- package/dist/swap_test.map.json +0 -14
- package/src/__tests__/codegen.test.ts +0 -161
- package/src/__tests__/e2e.test.ts +0 -2039
- package/src/__tests__/entity-types.test.ts +0 -236
- package/src/__tests__/lowering.test.ts +0 -1185
- package/src/__tests__/macro.test.ts +0 -343
- package/src/__tests__/nbt.test.ts +0 -58
- package/src/__tests__/optimizer-advanced.test.ts +0 -144
- package/src/__tests__/optimizer.test.ts +0 -162
- package/src/__tests__/runtime.test.ts +0 -305
- package/src/__tests__/stdlib-advanced.test.ts +0 -379
- package/src/__tests__/stdlib-bigint.test.ts +0 -427
- package/src/__tests__/stdlib-math.test.ts +0 -374
- package/src/__tests__/stdlib-vec.test.ts +0 -259
- package/src/__tests__/structure-optimizer.test.ts +0 -38
- package/src/__tests__/var-allocator.test.ts +0 -75
- package/src/codegen/cmdblock/index.ts +0 -63
- package/src/codegen/mcfunction/index.ts +0 -662
- package/src/codegen/structure/index.ts +0 -346
- package/src/codegen/var-allocator.ts +0 -104
- package/src/ir/builder.ts +0 -116
- package/src/ir/types.ts +0 -134
- package/src/lowering/index.ts +0 -3876
- package/src/optimizer/commands.ts +0 -534
- package/src/optimizer/passes.ts +0 -250
- package/src/optimizer/structure.ts +0 -450
- /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
- /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/cli.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/compile-all.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/compile-all.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/dce.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/diagnostics.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/formatter.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/formatter.test.js +0 -0
- /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/hir/desugar.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/lexer.test.d.ts +0 -0
- /package/dist/{__tests__ → src/__tests__}/lexer.test.js +0 -0
- /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/lir/lower.test.d.ts} +0 -0
- /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/lir/types.test.d.ts} +0 -0
- /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/lir/verify.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/mc-integration.test.d.ts +0 -0
- /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/mc-syntax.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/mc-syntax.test.js +0 -0
- /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/mir/arithmetic.test.d.ts} +0 -0
- /package/dist/{__tests__/parser.test.d.ts → src/__tests__/mir/control-flow.test.d.ts} +0 -0
- /package/dist/{__tests__/repl.test.d.ts → src/__tests__/mir/verify.test.d.ts} +0 -0
- /package/dist/{__tests__/runtime.test.d.ts → src/__tests__/optimizer/block_merge.test.d.ts} +0 -0
- /package/dist/{__tests__/structure-optimizer.test.d.ts → src/__tests__/optimizer/branch_simplify.test.d.ts} +0 -0
- /package/dist/{__tests__/typechecker.test.d.ts → src/__tests__/optimizer/constant_fold.test.d.ts} +0 -0
- /package/dist/{__tests__/var-allocator.test.d.ts → src/__tests__/optimizer/copy_prop.test.d.ts} +0 -0
- /package/dist/{__tests__ → src/__tests__}/parser.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/repl.test.js +0 -0
- /package/dist/{__tests__ → src/__tests__}/typechecker.test.js +0 -0
- /package/dist/{ast → src/ast}/types.js +0 -0
- /package/dist/{builtins → src/builtins}/metadata.d.ts +0 -0
- /package/dist/{builtins → src/builtins}/metadata.js +0 -0
- /package/dist/{events → src/events}/types.d.ts +0 -0
- /package/dist/{events → src/events}/types.js +0 -0
- /package/dist/{formatter → src/formatter}/index.d.ts +0 -0
- /package/dist/{formatter → src/formatter}/index.js +0 -0
- /package/dist/{mc-test → src/mc-test}/client.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/client.js +0 -0
- /package/dist/{mc-test → src/mc-test}/runner.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/setup.d.ts +0 -0
- /package/dist/{mc-test → src/mc-test}/setup.js +0 -0
- /package/dist/{mc-validator → src/mc-validator}/index.d.ts +0 -0
- /package/dist/{mc-validator → src/mc-validator}/index.js +0 -0
- /package/dist/{nbt → src/nbt}/index.d.ts +0 -0
- /package/dist/{nbt → src/nbt}/index.js +0 -0
- /package/dist/{repl.js → src/repl.js} +0 -0
- /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
- /package/dist/{types → src/types}/entity-hierarchy.d.ts +0 -0
- /package/dist/{types → src/types}/entity-hierarchy.js +0 -0
package/src/cli.ts
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* RedScript CLI
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
5
|
* Usage:
|
|
6
|
-
* redscript compile <file> [-o <out>] [--
|
|
6
|
+
* redscript compile <file> [-o <out>] [--namespace <ns>]
|
|
7
7
|
* redscript check <file>
|
|
8
8
|
* redscript repl
|
|
9
9
|
* redscript version
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import { compile,
|
|
13
|
-
import { generateCommandBlocks } from './codegen/cmdblock'
|
|
14
|
-
import { compileToStructure } from './codegen/structure'
|
|
12
|
+
import { compile, checkWithWarnings } from './index'
|
|
15
13
|
import { formatError } from './diagnostics'
|
|
14
|
+
import { parseMcVersion, DEFAULT_MC_VERSION } from './types/mc-version'
|
|
16
15
|
import { startRepl } from './repl'
|
|
17
16
|
import { generateDts } from './builtins/metadata'
|
|
18
|
-
import
|
|
17
|
+
import { FileCache } from './cache/index'
|
|
18
|
+
import { DependencyGraph } from './cache/deps'
|
|
19
|
+
import { compileIncremental } from './cache/incremental'
|
|
19
20
|
import * as fs from 'fs'
|
|
20
21
|
import * as path from 'path'
|
|
21
22
|
import * as https from 'https'
|
|
@@ -26,10 +27,10 @@ const args = process.argv.slice(2)
|
|
|
26
27
|
|
|
27
28
|
function printUsage(): void {
|
|
28
29
|
console.log(`
|
|
29
|
-
RedScript Compiler
|
|
30
|
+
RedScript Compiler v2
|
|
30
31
|
|
|
31
32
|
Usage:
|
|
32
|
-
redscript compile <file> [-o <out>] [--
|
|
33
|
+
redscript compile <file> [-o <out>] [--namespace <ns>]
|
|
33
34
|
redscript watch <dir> [-o <outdir>] [--namespace <ns>] [--hot-reload <url>]
|
|
34
35
|
redscript check <file>
|
|
35
36
|
redscript fmt <file.mcrs> [file2.mcrs ...]
|
|
@@ -48,24 +49,15 @@ Commands:
|
|
|
48
49
|
upgrade Upgrade to the latest version (npm install -g redscript-mc@latest)
|
|
49
50
|
|
|
50
51
|
Options:
|
|
51
|
-
-o, --output <path> Output directory or file path
|
|
52
|
-
--output-nbt <file> Output .nbt file path for structure target
|
|
52
|
+
-o, --output <path> Output directory or file path
|
|
53
53
|
--namespace <ns> Datapack namespace (default: derived from filename)
|
|
54
|
-
--target <target> Output target: datapack (default), cmdblock, or structure
|
|
55
|
-
--no-dce Disable AST dead code elimination
|
|
56
|
-
--no-mangle Disable variable name mangling (use readable names)
|
|
57
|
-
--scoreboard <obj> Scoreboard objective for variables (default: namespace).
|
|
58
|
-
Each datapack automatically uses its namespace as the objective
|
|
59
|
-
so multiple datapacks can coexist without collisions.
|
|
60
|
-
--stats Print optimizer statistics
|
|
61
54
|
--hot-reload <url> After each successful compile, POST to <url>/reload
|
|
62
55
|
(use with redscript-testharness; e.g. http://localhost:25561)
|
|
56
|
+
--source-map Generate .sourcemap.json files alongside .mcfunction output
|
|
57
|
+
--mc-version <ver> Target Minecraft version (default: 1.21). Affects codegen features.
|
|
58
|
+
e.g. --mc-version 1.20.2, --mc-version 1.19
|
|
59
|
+
--lenient Treat type errors as warnings instead of blocking compilation
|
|
63
60
|
-h, --help Show this help message
|
|
64
|
-
|
|
65
|
-
Targets:
|
|
66
|
-
datapack Generate a full Minecraft datapack (default)
|
|
67
|
-
cmdblock Generate JSON structure for command block placement
|
|
68
|
-
structure Generate a Minecraft structure .nbt file with command blocks
|
|
69
61
|
`)
|
|
70
62
|
}
|
|
71
63
|
|
|
@@ -163,17 +155,14 @@ function parseArgs(args: string[]): {
|
|
|
163
155
|
command?: string
|
|
164
156
|
file?: string
|
|
165
157
|
output?: string
|
|
166
|
-
outputNbt?: string
|
|
167
158
|
namespace?: string
|
|
168
|
-
target?: string
|
|
169
|
-
stats?: boolean
|
|
170
159
|
help?: boolean
|
|
171
160
|
hotReload?: string
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
161
|
+
sourceMap?: boolean
|
|
162
|
+
mcVersionStr?: string
|
|
163
|
+
lenient?: boolean
|
|
175
164
|
} {
|
|
176
|
-
const result: ReturnType<typeof parseArgs> = {
|
|
165
|
+
const result: ReturnType<typeof parseArgs> = {}
|
|
177
166
|
let i = 0
|
|
178
167
|
|
|
179
168
|
while (i < args.length) {
|
|
@@ -185,29 +174,20 @@ function parseArgs(args: string[]): {
|
|
|
185
174
|
} else if (arg === '-o' || arg === '--output') {
|
|
186
175
|
result.output = args[++i]
|
|
187
176
|
i++
|
|
188
|
-
} else if (arg === '--output-nbt') {
|
|
189
|
-
result.outputNbt = args[++i]
|
|
190
|
-
i++
|
|
191
177
|
} else if (arg === '--namespace') {
|
|
192
178
|
result.namespace = args[++i]
|
|
193
179
|
i++
|
|
194
|
-
} else if (arg === '--
|
|
195
|
-
result.
|
|
196
|
-
i++
|
|
197
|
-
} else if (arg === '--stats') {
|
|
198
|
-
result.stats = true
|
|
180
|
+
} else if (arg === '--hot-reload') {
|
|
181
|
+
result.hotReload = args[++i]
|
|
199
182
|
i++
|
|
200
|
-
} else if (arg === '--
|
|
201
|
-
result.
|
|
183
|
+
} else if (arg === '--source-map') {
|
|
184
|
+
result.sourceMap = true
|
|
202
185
|
i++
|
|
203
|
-
} else if (arg === '--
|
|
204
|
-
result.
|
|
186
|
+
} else if (arg === '--mc-version') {
|
|
187
|
+
result.mcVersionStr = args[++i]
|
|
205
188
|
i++
|
|
206
|
-
} else if (arg === '--
|
|
207
|
-
result.
|
|
208
|
-
i++
|
|
209
|
-
} else if (arg === '--hot-reload') {
|
|
210
|
-
result.hotReload = args[++i]
|
|
189
|
+
} else if (arg === '--lenient') {
|
|
190
|
+
result.lenient = true
|
|
211
191
|
i++
|
|
212
192
|
} else if (!result.command) {
|
|
213
193
|
result.command = arg
|
|
@@ -229,48 +209,13 @@ function deriveNamespace(filePath: string): string {
|
|
|
229
209
|
return basename.toLowerCase().replace(/[^a-z0-9]/g, '_')
|
|
230
210
|
}
|
|
231
211
|
|
|
232
|
-
function printWarnings(warnings: Array<{ code: string; message: string; line?: number; col?: number; filePath?: string }> | undefined): void {
|
|
233
|
-
if (!warnings || warnings.length === 0) {
|
|
234
|
-
return
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
for (const warning of warnings) {
|
|
238
|
-
const loc = warning.filePath
|
|
239
|
-
? `${warning.filePath}:${warning.line ?? '?'}`
|
|
240
|
-
: warning.line != null
|
|
241
|
-
? `line ${warning.line}`
|
|
242
|
-
: null
|
|
243
|
-
const locStr = loc ? ` (${loc})` : ''
|
|
244
|
-
console.error(`Warning [${warning.code}]: ${warning.message}${locStr}`)
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function formatReduction(before: number, after: number): string {
|
|
249
|
-
if (before === 0) return '0%'
|
|
250
|
-
return `${Math.round(((before - after) / before) * 100)}%`
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
function printOptimizationStats(stats: OptimizationStats | undefined): void {
|
|
254
|
-
if (!stats) return
|
|
255
|
-
|
|
256
|
-
console.log('Optimizations applied:')
|
|
257
|
-
console.log(` LICM: ${stats.licmHoists} reads hoisted from ${stats.licmLoopBodies} loop bodies`)
|
|
258
|
-
console.log(` CSE: ${stats.cseRedundantReads + stats.cseArithmetic} expressions eliminated`)
|
|
259
|
-
console.log(` setblock batching: ${stats.setblockMergedCommands} setblocks -> ${stats.setblockFillCommands} fills (saved ${stats.setblockSavedCommands} commands)`)
|
|
260
|
-
console.log(` dead code: ${stats.deadCodeRemoved} commands removed`)
|
|
261
|
-
console.log(` constant folding: ${stats.constantFolds} constants folded`)
|
|
262
|
-
console.log(` Total mcfunction commands: ${stats.totalCommandsBefore} -> ${stats.totalCommandsAfter} (${formatReduction(stats.totalCommandsBefore, stats.totalCommandsAfter)} reduction)`)
|
|
263
|
-
}
|
|
264
|
-
|
|
265
212
|
function compileCommand(
|
|
266
213
|
file: string,
|
|
267
214
|
output: string,
|
|
268
215
|
namespace: string,
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
mangle = true,
|
|
273
|
-
scoreboardObjective: string | undefined = undefined
|
|
216
|
+
sourceMap = false,
|
|
217
|
+
mcVersionStr?: string,
|
|
218
|
+
lenient = false,
|
|
274
219
|
): void {
|
|
275
220
|
// Read source file
|
|
276
221
|
if (!fs.existsSync(file)) {
|
|
@@ -278,78 +223,46 @@ function compileCommand(
|
|
|
278
223
|
process.exit(1)
|
|
279
224
|
}
|
|
280
225
|
|
|
226
|
+
let mcVersion = DEFAULT_MC_VERSION
|
|
227
|
+
if (mcVersionStr) {
|
|
228
|
+
try {
|
|
229
|
+
mcVersion = parseMcVersion(mcVersionStr)
|
|
230
|
+
} catch (e) {
|
|
231
|
+
console.error(`Error: ${(e as Error).message}`)
|
|
232
|
+
process.exit(1)
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
281
236
|
const source = fs.readFileSync(file, 'utf-8')
|
|
282
237
|
|
|
283
238
|
try {
|
|
284
|
-
|
|
285
|
-
const result = compile(source, { namespace, filePath: file, dce, mangle, scoreboardObjective })
|
|
286
|
-
printWarnings(result.warnings)
|
|
287
|
-
|
|
288
|
-
// Generate command block JSON
|
|
289
|
-
const hasTick = result.files.some(f => f.path.includes('__tick.mcfunction'))
|
|
290
|
-
const hasLoad = result.files.some(f => f.path.includes('__load.mcfunction'))
|
|
291
|
-
const cmdBlocks = generateCommandBlocks(namespace, hasTick, hasLoad)
|
|
292
|
-
|
|
293
|
-
// Write command block JSON
|
|
294
|
-
fs.mkdirSync(output, { recursive: true })
|
|
295
|
-
const outputFile = path.join(output, `${namespace}_cmdblocks.json`)
|
|
296
|
-
fs.writeFileSync(outputFile, JSON.stringify(cmdBlocks, null, 2))
|
|
297
|
-
|
|
298
|
-
console.log(`✓ Generated command blocks for ${file}`)
|
|
299
|
-
console.log(` Output: ${outputFile}`)
|
|
300
|
-
console.log(` Blocks: ${cmdBlocks.blocks.length}`)
|
|
301
|
-
if (showStats) {
|
|
302
|
-
printOptimizationStats(result.stats)
|
|
303
|
-
}
|
|
304
|
-
} else if (target === 'structure') {
|
|
305
|
-
const structure = compileToStructure(source, namespace, file, { dce, mangle })
|
|
306
|
-
fs.mkdirSync(path.dirname(output), { recursive: true })
|
|
307
|
-
fs.writeFileSync(output, structure.buffer)
|
|
308
|
-
|
|
309
|
-
console.log(`✓ Generated structure for ${file}`)
|
|
310
|
-
console.log(` Output: ${output}`)
|
|
311
|
-
console.log(` Blocks: ${structure.blockCount}`)
|
|
312
|
-
if (showStats) {
|
|
313
|
-
printOptimizationStats(structure.stats)
|
|
314
|
-
}
|
|
315
|
-
} else {
|
|
316
|
-
const result = compile(source, { namespace, filePath: file, dce, mangle, scoreboardObjective })
|
|
317
|
-
printWarnings(result.warnings)
|
|
318
|
-
|
|
319
|
-
// Default: generate datapack
|
|
320
|
-
// Create output directory
|
|
321
|
-
fs.mkdirSync(output, { recursive: true })
|
|
322
|
-
|
|
323
|
-
// Write all files
|
|
324
|
-
for (const dataFile of result.files) {
|
|
325
|
-
const filePath = path.join(output, dataFile.path)
|
|
326
|
-
const dir = path.dirname(filePath)
|
|
327
|
-
fs.mkdirSync(dir, { recursive: true })
|
|
328
|
-
fs.writeFileSync(filePath, dataFile.content)
|
|
329
|
-
}
|
|
239
|
+
const result = compile(source, { namespace, filePath: file, generateSourceMap: sourceMap, mcVersion, lenient })
|
|
330
240
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
fs.writeFileSync(mapPath, JSON.stringify(result.sourceMap, null, 2))
|
|
335
|
-
console.log(` Sourcemap: ${mapPath}`)
|
|
336
|
-
}
|
|
241
|
+
for (const w of result.warnings) {
|
|
242
|
+
console.error(`Warning: ${w}`)
|
|
243
|
+
}
|
|
337
244
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
245
|
+
// Create output directory
|
|
246
|
+
fs.mkdirSync(output, { recursive: true })
|
|
247
|
+
|
|
248
|
+
// Write all files
|
|
249
|
+
for (const dataFile of result.files) {
|
|
250
|
+
const filePath = path.join(output, dataFile.path)
|
|
251
|
+
const dir = path.dirname(filePath)
|
|
252
|
+
fs.mkdirSync(dir, { recursive: true })
|
|
253
|
+
fs.writeFileSync(filePath, dataFile.content)
|
|
345
254
|
}
|
|
255
|
+
|
|
256
|
+
console.log(`✓ Compiled ${file} to ${output}/`)
|
|
257
|
+
console.log(` Namespace: ${namespace}`)
|
|
258
|
+
console.log(` Files: ${result.files.length}`)
|
|
346
259
|
} catch (err) {
|
|
347
|
-
console.error(formatError(err as Error, source))
|
|
260
|
+
console.error(formatError(err as Error, source, file))
|
|
348
261
|
process.exit(1)
|
|
349
262
|
}
|
|
350
263
|
}
|
|
351
264
|
|
|
352
|
-
function checkCommand(file: string): void {
|
|
265
|
+
function checkCommand(file: string, namespace?: string): void {
|
|
353
266
|
// Read source file
|
|
354
267
|
if (!fs.existsSync(file)) {
|
|
355
268
|
console.error(`Error: File not found: ${file}`)
|
|
@@ -358,13 +271,19 @@ function checkCommand(file: string): void {
|
|
|
358
271
|
|
|
359
272
|
const source = fs.readFileSync(file, 'utf-8')
|
|
360
273
|
|
|
361
|
-
const
|
|
362
|
-
|
|
363
|
-
|
|
274
|
+
const ns = namespace ?? deriveNamespace(file)
|
|
275
|
+
const result = checkWithWarnings(source, ns, file)
|
|
276
|
+
|
|
277
|
+
for (const w of result.warnings) {
|
|
278
|
+
console.error(`Warning: ${w}`)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (result.error) {
|
|
282
|
+
console.error(formatError(result.error, source, file))
|
|
364
283
|
process.exit(1)
|
|
365
284
|
}
|
|
366
285
|
|
|
367
|
-
console.log(`✓
|
|
286
|
+
console.log(`✓ No errors found`)
|
|
368
287
|
}
|
|
369
288
|
|
|
370
289
|
async function hotReload(url: string): Promise<void> {
|
|
@@ -380,7 +299,7 @@ async function hotReload(url: string): Promise<void> {
|
|
|
380
299
|
}
|
|
381
300
|
}
|
|
382
301
|
|
|
383
|
-
function watchCommand(dir: string, output: string, namespace?: string, hotReloadUrl?: string
|
|
302
|
+
function watchCommand(dir: string, output: string, namespace?: string, hotReloadUrl?: string): void {
|
|
384
303
|
// Check if directory exists
|
|
385
304
|
if (!fs.existsSync(dir)) {
|
|
386
305
|
console.error(`Error: Directory not found: ${dir}`)
|
|
@@ -396,52 +315,55 @@ function watchCommand(dir: string, output: string, namespace?: string, hotReload
|
|
|
396
315
|
console.log(`👁 Watching ${dir} for .mcrs file changes...`)
|
|
397
316
|
console.log(` Output: ${output}`)
|
|
398
317
|
if (hotReloadUrl) console.log(` Hot reload: ${hotReloadUrl}`)
|
|
318
|
+
console.log(` Incremental compilation enabled`)
|
|
399
319
|
console.log(` Press Ctrl+C to stop\n`)
|
|
400
320
|
|
|
321
|
+
// Set up incremental compilation infrastructure
|
|
322
|
+
const cacheDir = path.join(dir, '.redscript-cache')
|
|
323
|
+
const cache = new FileCache(cacheDir)
|
|
324
|
+
cache.load()
|
|
325
|
+
const depGraph = new DependencyGraph()
|
|
326
|
+
|
|
401
327
|
// Debounce timer
|
|
402
328
|
let debounceTimer: NodeJS.Timeout | null = null
|
|
403
329
|
|
|
404
|
-
// Compile all .mcrs files in directory
|
|
405
|
-
async function
|
|
330
|
+
// Compile all .mcrs files in directory (incrementally)
|
|
331
|
+
async function compileAllIncremental(): Promise<void> {
|
|
406
332
|
const files = findRsFiles(dir)
|
|
407
333
|
if (files.length === 0) {
|
|
408
334
|
console.log(`⚠ No .mcrs files found in ${dir}`)
|
|
409
335
|
return
|
|
410
336
|
}
|
|
411
337
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
// Write all files
|
|
425
|
-
for (const dataFile of result.files) {
|
|
426
|
-
const filePath = path.join(output, dataFile.path)
|
|
427
|
-
const fileDir = path.dirname(filePath)
|
|
428
|
-
fs.mkdirSync(fileDir, { recursive: true })
|
|
429
|
-
fs.writeFileSync(filePath, dataFile.content)
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
const timestamp = new Date().toLocaleTimeString()
|
|
433
|
-
console.log(`✓ [${timestamp}] Compiled ${file} (${result.files.length} files)`)
|
|
434
|
-
} catch (err) {
|
|
435
|
-
hasErrors = true
|
|
436
|
-
const timestamp = new Date().toLocaleTimeString()
|
|
437
|
-
console.error(`✗ [${timestamp}] ${formatError(err as Error, source)}`)
|
|
338
|
+
const incResult = compileIncremental(files, cache, depGraph, {
|
|
339
|
+
namespace,
|
|
340
|
+
output,
|
|
341
|
+
})
|
|
342
|
+
|
|
343
|
+
const timestamp = new Date().toLocaleTimeString()
|
|
344
|
+
|
|
345
|
+
// Print warnings from recompiled files
|
|
346
|
+
for (const [file, compileResult] of incResult.results) {
|
|
347
|
+
for (const w of compileResult.warnings) {
|
|
348
|
+
console.error(`Warning: ${w}`)
|
|
438
349
|
}
|
|
350
|
+
console.log(`✓ [${timestamp}] Compiled ${path.relative(dir, file)} (${compileResult.files.length} files)`)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (incResult.cached > 0) {
|
|
354
|
+
console.log(` [${timestamp}] ${incResult.cached} file(s) unchanged (cached)`)
|
|
439
355
|
}
|
|
440
356
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
console.
|
|
357
|
+
// Print errors
|
|
358
|
+
for (const [file, errMsg] of incResult.errors) {
|
|
359
|
+
console.error(`✗ [${timestamp}] ${path.relative(dir, file)}: ${errMsg}`)
|
|
444
360
|
}
|
|
361
|
+
|
|
362
|
+
// Persist cache
|
|
363
|
+
cache.save()
|
|
364
|
+
|
|
365
|
+
if (incResult.errors.size === 0 && hotReloadUrl) await hotReload(hotReloadUrl)
|
|
366
|
+
console.log('')
|
|
445
367
|
}
|
|
446
368
|
|
|
447
369
|
// Find all .mcrs files recursively
|
|
@@ -451,7 +373,7 @@ function watchCommand(dir: string, output: string, namespace?: string, hotReload
|
|
|
451
373
|
|
|
452
374
|
for (const entry of entries) {
|
|
453
375
|
const fullPath = path.join(directory, entry.name)
|
|
454
|
-
if (entry.isDirectory()) {
|
|
376
|
+
if (entry.isDirectory() && entry.name !== '.redscript-cache') {
|
|
455
377
|
results.push(...findRsFiles(fullPath))
|
|
456
378
|
} else if (entry.isFile() && entry.name.endsWith('.mcrs')) {
|
|
457
379
|
results.push(fullPath)
|
|
@@ -462,7 +384,7 @@ function watchCommand(dir: string, output: string, namespace?: string, hotReload
|
|
|
462
384
|
}
|
|
463
385
|
|
|
464
386
|
// Initial compile
|
|
465
|
-
void
|
|
387
|
+
void compileAllIncremental()
|
|
466
388
|
|
|
467
389
|
// Watch for changes
|
|
468
390
|
fs.watch(dir, { recursive: true }, (eventType, filename) => {
|
|
@@ -473,7 +395,7 @@ function watchCommand(dir: string, output: string, namespace?: string, hotReload
|
|
|
473
395
|
}
|
|
474
396
|
debounceTimer = setTimeout(() => {
|
|
475
397
|
console.log(`📝 Change detected: ${filename}`)
|
|
476
|
-
void
|
|
398
|
+
void compileAllIncremental()
|
|
477
399
|
}, 100)
|
|
478
400
|
}
|
|
479
401
|
})
|
|
@@ -504,20 +426,15 @@ async function main(): Promise<void> {
|
|
|
504
426
|
}
|
|
505
427
|
{
|
|
506
428
|
const namespace = parsed.namespace ?? deriveNamespace(parsed.file)
|
|
507
|
-
const
|
|
508
|
-
const output = target === 'structure'
|
|
509
|
-
? (parsed.outputNbt ?? parsed.output ?? `./${namespace}.nbt`)
|
|
510
|
-
: (parsed.output ?? './dist')
|
|
429
|
+
const output = parsed.output ?? './dist'
|
|
511
430
|
|
|
512
431
|
compileCommand(
|
|
513
432
|
parsed.file,
|
|
514
433
|
output,
|
|
515
434
|
namespace,
|
|
516
|
-
|
|
517
|
-
parsed.
|
|
518
|
-
parsed.
|
|
519
|
-
parsed.mangle,
|
|
520
|
-
parsed.scoreboardObjective // undefined = derive from namespace in compile()
|
|
435
|
+
parsed.sourceMap,
|
|
436
|
+
parsed.mcVersionStr,
|
|
437
|
+
parsed.lenient,
|
|
521
438
|
)
|
|
522
439
|
}
|
|
523
440
|
break
|
|
@@ -533,7 +450,6 @@ async function main(): Promise<void> {
|
|
|
533
450
|
parsed.output ?? './dist',
|
|
534
451
|
parsed.namespace,
|
|
535
452
|
parsed.hotReload,
|
|
536
|
-
parsed.dce
|
|
537
453
|
)
|
|
538
454
|
break
|
|
539
455
|
|
|
@@ -543,7 +459,7 @@ async function main(): Promise<void> {
|
|
|
543
459
|
printUsage()
|
|
544
460
|
process.exit(1)
|
|
545
461
|
}
|
|
546
|
-
checkCommand(parsed.file)
|
|
462
|
+
checkCommand(parsed.file, parsed.namespace)
|
|
547
463
|
break
|
|
548
464
|
|
|
549
465
|
case 'fmt':
|
package/src/compile.ts
CHANGED
|
@@ -1,58 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* RedScript Compile API
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Preprocessing utilities and v2 compile re-export.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import * as fs from 'fs'
|
|
8
8
|
import * as path from 'path'
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
import { Parser } from './parser'
|
|
12
|
-
import { Lowering, setScoreboardObjective } from './lowering'
|
|
13
|
-
import { optimize } from './optimizer/passes'
|
|
14
|
-
import { eliminateDeadCode } from './optimizer/dce'
|
|
15
|
-
import { generateDatapackWithStats, DatapackFile } from './codegen/mcfunction'
|
|
16
|
-
import { DiagnosticError, formatError, parseErrorMessage } from './diagnostics'
|
|
17
|
-
import type { IRModule } from './ir/types'
|
|
18
|
-
import type { Program } from './ast/types'
|
|
10
|
+
import { DiagnosticError } from './diagnostics'
|
|
19
11
|
|
|
20
12
|
// ---------------------------------------------------------------------------
|
|
21
|
-
//
|
|
13
|
+
// Re-export v2 compile
|
|
22
14
|
// ---------------------------------------------------------------------------
|
|
23
15
|
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
filePath?: string
|
|
27
|
-
optimize?: boolean
|
|
28
|
-
dce?: boolean
|
|
29
|
-
mangle?: boolean
|
|
30
|
-
/** Scoreboard objective used for all variable slots.
|
|
31
|
-
* Defaults to '__<namespace>' (e.g. '__mathshow') — the double-underscore
|
|
32
|
-
* prefix signals compiler-internal and avoids occupying the user's namespace.
|
|
33
|
-
* Each datapack gets a unique objective automatically; no manual setup needed. */
|
|
34
|
-
scoreboardObjective?: string
|
|
35
|
-
/** Additional source files that should be treated as *library* code.
|
|
36
|
-
* Functions in these files are DCE-eligible: they are only compiled into
|
|
37
|
-
* the datapack when actually called from user code. Each string is parsed
|
|
38
|
-
* independently (as if it had `module library;` at the top), so library
|
|
39
|
-
* mode never bleeds into the main `source`. */
|
|
40
|
-
librarySources?: string[]
|
|
41
|
-
}
|
|
16
|
+
export { compile, CompileOptions, CompileResult } from './emit/compile'
|
|
17
|
+
export type { DatapackFile } from './emit/index'
|
|
42
18
|
|
|
43
19
|
// ---------------------------------------------------------------------------
|
|
44
|
-
//
|
|
20
|
+
// Source Range / Preprocessing
|
|
45
21
|
// ---------------------------------------------------------------------------
|
|
46
22
|
|
|
47
|
-
export interface CompileResult {
|
|
48
|
-
success: boolean
|
|
49
|
-
files?: DatapackFile[]
|
|
50
|
-
advancements?: DatapackFile[]
|
|
51
|
-
ast?: Program
|
|
52
|
-
ir?: IRModule
|
|
53
|
-
error?: DiagnosticError
|
|
54
|
-
}
|
|
55
|
-
|
|
56
23
|
export interface SourceRange {
|
|
57
24
|
startLine: number
|
|
58
25
|
endLine: number
|
|
@@ -215,126 +182,3 @@ export function preprocessSourceWithMetadata(source: string, options: Preprocess
|
|
|
215
182
|
export function preprocessSource(source: string, options: PreprocessOptions = {}): string {
|
|
216
183
|
return preprocessSourceWithMetadata(source, options).source
|
|
217
184
|
}
|
|
218
|
-
|
|
219
|
-
// ---------------------------------------------------------------------------
|
|
220
|
-
// Main Compile Function
|
|
221
|
-
// ---------------------------------------------------------------------------
|
|
222
|
-
|
|
223
|
-
export function compile(source: string, options: CompileOptions = {}): CompileResult {
|
|
224
|
-
const { namespace = 'redscript', filePath, optimize: shouldOptimize = true } = options
|
|
225
|
-
const shouldRunDce = options.dce ?? shouldOptimize
|
|
226
|
-
let sourceLines = source.split('\n')
|
|
227
|
-
|
|
228
|
-
try {
|
|
229
|
-
const preprocessed = preprocessSourceWithMetadata(source, { filePath })
|
|
230
|
-
const preprocessedSource = preprocessed.source
|
|
231
|
-
sourceLines = preprocessedSource.split('\n')
|
|
232
|
-
|
|
233
|
-
// Lexing
|
|
234
|
-
const tokens = new Lexer(preprocessedSource, filePath).tokenize()
|
|
235
|
-
|
|
236
|
-
// Parsing — user source
|
|
237
|
-
const parsedAst = new Parser(tokens, preprocessedSource, filePath).parse(namespace)
|
|
238
|
-
|
|
239
|
-
// Collect all library sources: explicit `librarySources` option +
|
|
240
|
-
// auto-detected imports (files with `module library;` pulled out by the
|
|
241
|
-
// preprocessor rather than concatenated).
|
|
242
|
-
const allLibrarySources: Array<{ src: string; fp?: string }> = []
|
|
243
|
-
for (const libSrc of options.librarySources ?? []) {
|
|
244
|
-
allLibrarySources.push({ src: libSrc })
|
|
245
|
-
}
|
|
246
|
-
for (const li of preprocessed.libraryImports ?? []) {
|
|
247
|
-
allLibrarySources.push({ src: li.source, fp: li.filePath })
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Parse library sources independently (fresh Parser per source) so that
|
|
251
|
-
// `inLibraryMode` never bleeds into user code. All resulting functions get
|
|
252
|
-
// isLibraryFn=true (either via `module library;` in the source, or forced below).
|
|
253
|
-
for (const { src, fp } of allLibrarySources) {
|
|
254
|
-
const libPreprocessed = preprocessSourceWithMetadata(src, fp ? { filePath: fp } : {})
|
|
255
|
-
const libTokens = new Lexer(libPreprocessed.source, fp).tokenize()
|
|
256
|
-
const libAst = new Parser(libTokens, libPreprocessed.source, fp).parse(namespace)
|
|
257
|
-
// Force all functions to library mode (even if source lacks `module library;`)
|
|
258
|
-
for (const fn of libAst.declarations) fn.isLibraryFn = true
|
|
259
|
-
// Merge into main AST
|
|
260
|
-
parsedAst.declarations.push(...libAst.declarations)
|
|
261
|
-
parsedAst.structs.push(...libAst.structs)
|
|
262
|
-
parsedAst.implBlocks.push(...libAst.implBlocks)
|
|
263
|
-
parsedAst.enums.push(...libAst.enums)
|
|
264
|
-
parsedAst.consts.push(...libAst.consts)
|
|
265
|
-
parsedAst.globals.push(...libAst.globals)
|
|
266
|
-
}
|
|
267
|
-
const dceResult = shouldRunDce ? eliminateDeadCode(parsedAst) : { program: parsedAst, warnings: [] }
|
|
268
|
-
const ast = dceResult.program
|
|
269
|
-
|
|
270
|
-
// Configure scoreboard objective for this compilation.
|
|
271
|
-
// Default: use the datapack namespace so each datapack gets its own objective
|
|
272
|
-
// automatically, preventing variable collisions when multiple datapacks coexist.
|
|
273
|
-
const scoreboardObj = options.scoreboardObjective ?? `__${namespace}`
|
|
274
|
-
setScoreboardObjective(scoreboardObj)
|
|
275
|
-
|
|
276
|
-
// Lowering
|
|
277
|
-
const ir = new Lowering(namespace, preprocessed.ranges).lower(ast)
|
|
278
|
-
|
|
279
|
-
// Optimization
|
|
280
|
-
const optimized: IRModule = shouldOptimize
|
|
281
|
-
? { ...ir, functions: ir.functions.map(fn => optimize(fn)) }
|
|
282
|
-
: ir
|
|
283
|
-
|
|
284
|
-
// Code generation — mangle=true by default to prevent cross-function
|
|
285
|
-
// scoreboard variable collisions in the global MC scoreboard namespace.
|
|
286
|
-
const generated = generateDatapackWithStats(optimized, {
|
|
287
|
-
mangle: options.mangle ?? true,
|
|
288
|
-
scoreboardObjective: scoreboardObj,
|
|
289
|
-
})
|
|
290
|
-
|
|
291
|
-
return {
|
|
292
|
-
success: true,
|
|
293
|
-
files: [...generated.files, ...generated.advancements],
|
|
294
|
-
advancements: generated.advancements,
|
|
295
|
-
ast,
|
|
296
|
-
ir: optimized,
|
|
297
|
-
}
|
|
298
|
-
} catch (err) {
|
|
299
|
-
// Already a DiagnosticError
|
|
300
|
-
if (err instanceof DiagnosticError) {
|
|
301
|
-
return { success: false, error: err }
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// Try to parse the error message for line/col info
|
|
305
|
-
if (err instanceof Error) {
|
|
306
|
-
const diagnostic = parseErrorMessage(
|
|
307
|
-
'ParseError',
|
|
308
|
-
err.message,
|
|
309
|
-
sourceLines,
|
|
310
|
-
filePath
|
|
311
|
-
)
|
|
312
|
-
return { success: false, error: diagnostic }
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Unknown error
|
|
316
|
-
return {
|
|
317
|
-
success: false,
|
|
318
|
-
error: new DiagnosticError(
|
|
319
|
-
'ParseError',
|
|
320
|
-
String(err),
|
|
321
|
-
{ file: filePath, line: 1, col: 1 },
|
|
322
|
-
sourceLines
|
|
323
|
-
)
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
// ---------------------------------------------------------------------------
|
|
329
|
-
// Format Compile Error
|
|
330
|
-
// ---------------------------------------------------------------------------
|
|
331
|
-
|
|
332
|
-
export function formatCompileError(result: CompileResult): string {
|
|
333
|
-
if (result.success) {
|
|
334
|
-
return 'Compilation successful'
|
|
335
|
-
}
|
|
336
|
-
if (result.error) {
|
|
337
|
-
return formatError(result.error, result.error.sourceLines?.join('\n'))
|
|
338
|
-
}
|
|
339
|
-
return 'Unknown error'
|
|
340
|
-
}
|