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/dist/src/cli.js
ADDED
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* RedScript CLI
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* redscript compile <file> [-o <out>] [--namespace <ns>]
|
|
8
|
+
* redscript check <file>
|
|
9
|
+
* redscript repl
|
|
10
|
+
* redscript version
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
const index_1 = require("./index");
|
|
47
|
+
const diagnostics_1 = require("./diagnostics");
|
|
48
|
+
const mc_version_1 = require("./types/mc-version");
|
|
49
|
+
const repl_1 = require("./repl");
|
|
50
|
+
const metadata_1 = require("./builtins/metadata");
|
|
51
|
+
const index_2 = require("./cache/index");
|
|
52
|
+
const deps_1 = require("./cache/deps");
|
|
53
|
+
const incremental_1 = require("./cache/incremental");
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const https = __importStar(require("https"));
|
|
57
|
+
const child_process_1 = require("child_process");
|
|
58
|
+
// Parse command line arguments
|
|
59
|
+
const args = process.argv.slice(2);
|
|
60
|
+
function printUsage() {
|
|
61
|
+
console.log(`
|
|
62
|
+
RedScript Compiler v2
|
|
63
|
+
|
|
64
|
+
Usage:
|
|
65
|
+
redscript compile <file> [-o <out>] [--namespace <ns>]
|
|
66
|
+
redscript watch <dir> [-o <outdir>] [--namespace <ns>] [--hot-reload <url>]
|
|
67
|
+
redscript check <file>
|
|
68
|
+
redscript fmt <file.mcrs> [file2.mcrs ...]
|
|
69
|
+
redscript generate-dts [-o <file>]
|
|
70
|
+
redscript repl
|
|
71
|
+
redscript version
|
|
72
|
+
|
|
73
|
+
Commands:
|
|
74
|
+
compile Compile a RedScript file to a Minecraft datapack
|
|
75
|
+
watch Watch a directory for .mcrs file changes, recompile, and hot reload
|
|
76
|
+
check Check a RedScript file for errors without generating output
|
|
77
|
+
fmt Auto-format RedScript source files
|
|
78
|
+
generate-dts Generate builtin function declaration file (builtins.d.mcrs)
|
|
79
|
+
repl Start an interactive RedScript REPL
|
|
80
|
+
version Print the RedScript version
|
|
81
|
+
upgrade Upgrade to the latest version (npm install -g redscript-mc@latest)
|
|
82
|
+
|
|
83
|
+
Options:
|
|
84
|
+
-o, --output <path> Output directory or file path
|
|
85
|
+
--namespace <ns> Datapack namespace (default: derived from filename)
|
|
86
|
+
--hot-reload <url> After each successful compile, POST to <url>/reload
|
|
87
|
+
(use with redscript-testharness; e.g. http://localhost:25561)
|
|
88
|
+
--source-map Generate .sourcemap.json files alongside .mcfunction output
|
|
89
|
+
--mc-version <ver> Target Minecraft version (default: 1.21). Affects codegen features.
|
|
90
|
+
e.g. --mc-version 1.20.2, --mc-version 1.19
|
|
91
|
+
--lenient Treat type errors as warnings instead of blocking compilation
|
|
92
|
+
-h, --help Show this help message
|
|
93
|
+
`);
|
|
94
|
+
}
|
|
95
|
+
function getLocalVersion() {
|
|
96
|
+
const packagePath = path.join(__dirname, '..', 'package.json');
|
|
97
|
+
try {
|
|
98
|
+
const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
|
|
99
|
+
return pkg.version ?? '0.0.0';
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return '0.0.0';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function printVersion() {
|
|
106
|
+
console.log(`RedScript v${getLocalVersion()}`);
|
|
107
|
+
}
|
|
108
|
+
/** Fetch latest version from npm registry (non-blocking, best-effort). */
|
|
109
|
+
function fetchLatestVersion() {
|
|
110
|
+
return new Promise(resolve => {
|
|
111
|
+
const req = https.get('https://registry.npmjs.org/redscript-mc/latest', { timeout: 3000 }, res => {
|
|
112
|
+
let data = '';
|
|
113
|
+
res.on('data', chunk => { data += chunk; });
|
|
114
|
+
res.on('end', () => {
|
|
115
|
+
try {
|
|
116
|
+
const json = JSON.parse(data);
|
|
117
|
+
resolve(json.version ?? null);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
resolve(null);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
req.on('error', () => resolve(null));
|
|
125
|
+
req.on('timeout', () => { req.destroy(); resolve(null); });
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/** Compare semver strings. Returns true if b > a. */
|
|
129
|
+
function isNewer(current, latest) {
|
|
130
|
+
const parse = (v) => v.replace(/^v/, '').split('.').map(Number);
|
|
131
|
+
const [ca, cb, cc] = parse(current);
|
|
132
|
+
const [la, lb, lc] = parse(latest);
|
|
133
|
+
if (la !== ca)
|
|
134
|
+
return la > ca;
|
|
135
|
+
if (lb !== cb)
|
|
136
|
+
return lb > cb;
|
|
137
|
+
return lc > cc;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check for a newer version and print a notice if one exists.
|
|
141
|
+
* Runs in background — does NOT block normal CLI operation.
|
|
142
|
+
*/
|
|
143
|
+
async function checkForUpdates(silent = false) {
|
|
144
|
+
const current = getLocalVersion();
|
|
145
|
+
const latest = await fetchLatestVersion();
|
|
146
|
+
if (latest && isNewer(current, latest)) {
|
|
147
|
+
console.log(`\n💡 New version available: v${current} → v${latest}`);
|
|
148
|
+
console.log(` Run: redscript upgrade\n`);
|
|
149
|
+
}
|
|
150
|
+
else if (!silent && latest) {
|
|
151
|
+
// Only print when explicitly running 'version' or 'upgrade'
|
|
152
|
+
// No output for normal commands — keep startup noise-free
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Run npm install -g to upgrade to latest. */
|
|
156
|
+
function upgradeCommand() {
|
|
157
|
+
const current = getLocalVersion();
|
|
158
|
+
console.log(`Current version: v${current}`);
|
|
159
|
+
console.log('Checking latest version...');
|
|
160
|
+
fetchLatestVersion().then(latest => {
|
|
161
|
+
if (!latest) {
|
|
162
|
+
console.error('Could not fetch latest version from npm.');
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
if (!isNewer(current, latest)) {
|
|
166
|
+
console.log(`✅ Already up to date (v${current})`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
console.log(`Upgrading v${current} → v${latest}...`);
|
|
170
|
+
try {
|
|
171
|
+
(0, child_process_1.execSync)('npm install -g redscript-mc@latest', { stdio: 'inherit' });
|
|
172
|
+
console.log(`✅ Upgraded to v${latest}`);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
console.error('Upgrade failed. Try manually: npm install -g redscript-mc@latest');
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
function parseArgs(args) {
|
|
181
|
+
const result = {};
|
|
182
|
+
let i = 0;
|
|
183
|
+
while (i < args.length) {
|
|
184
|
+
const arg = args[i];
|
|
185
|
+
if (arg === '-h' || arg === '--help') {
|
|
186
|
+
result.help = true;
|
|
187
|
+
i++;
|
|
188
|
+
}
|
|
189
|
+
else if (arg === '-o' || arg === '--output') {
|
|
190
|
+
result.output = args[++i];
|
|
191
|
+
i++;
|
|
192
|
+
}
|
|
193
|
+
else if (arg === '--namespace') {
|
|
194
|
+
result.namespace = args[++i];
|
|
195
|
+
i++;
|
|
196
|
+
}
|
|
197
|
+
else if (arg === '--hot-reload') {
|
|
198
|
+
result.hotReload = args[++i];
|
|
199
|
+
i++;
|
|
200
|
+
}
|
|
201
|
+
else if (arg === '--source-map') {
|
|
202
|
+
result.sourceMap = true;
|
|
203
|
+
i++;
|
|
204
|
+
}
|
|
205
|
+
else if (arg === '--mc-version') {
|
|
206
|
+
result.mcVersionStr = args[++i];
|
|
207
|
+
i++;
|
|
208
|
+
}
|
|
209
|
+
else if (arg === '--lenient') {
|
|
210
|
+
result.lenient = true;
|
|
211
|
+
i++;
|
|
212
|
+
}
|
|
213
|
+
else if (!result.command) {
|
|
214
|
+
result.command = arg;
|
|
215
|
+
i++;
|
|
216
|
+
}
|
|
217
|
+
else if (!result.file) {
|
|
218
|
+
result.file = arg;
|
|
219
|
+
i++;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
i++;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
function deriveNamespace(filePath) {
|
|
228
|
+
const basename = path.basename(filePath, path.extname(filePath));
|
|
229
|
+
// Convert to valid identifier: lowercase, replace non-alphanumeric with underscore
|
|
230
|
+
return basename.toLowerCase().replace(/[^a-z0-9]/g, '_');
|
|
231
|
+
}
|
|
232
|
+
function compileCommand(file, output, namespace, sourceMap = false, mcVersionStr, lenient = false) {
|
|
233
|
+
// Read source file
|
|
234
|
+
if (!fs.existsSync(file)) {
|
|
235
|
+
console.error(`Error: File not found: ${file}`);
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
let mcVersion = mc_version_1.DEFAULT_MC_VERSION;
|
|
239
|
+
if (mcVersionStr) {
|
|
240
|
+
try {
|
|
241
|
+
mcVersion = (0, mc_version_1.parseMcVersion)(mcVersionStr);
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
console.error(`Error: ${e.message}`);
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const source = fs.readFileSync(file, 'utf-8');
|
|
249
|
+
try {
|
|
250
|
+
const result = (0, index_1.compile)(source, { namespace, filePath: file, generateSourceMap: sourceMap, mcVersion, lenient });
|
|
251
|
+
for (const w of result.warnings) {
|
|
252
|
+
console.error(`Warning: ${w}`);
|
|
253
|
+
}
|
|
254
|
+
// Create output directory
|
|
255
|
+
fs.mkdirSync(output, { recursive: true });
|
|
256
|
+
// Write all files
|
|
257
|
+
for (const dataFile of result.files) {
|
|
258
|
+
const filePath = path.join(output, dataFile.path);
|
|
259
|
+
const dir = path.dirname(filePath);
|
|
260
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
261
|
+
fs.writeFileSync(filePath, dataFile.content);
|
|
262
|
+
}
|
|
263
|
+
console.log(`✓ Compiled ${file} to ${output}/`);
|
|
264
|
+
console.log(` Namespace: ${namespace}`);
|
|
265
|
+
console.log(` Files: ${result.files.length}`);
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
console.error((0, diagnostics_1.formatError)(err, source, file));
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function checkCommand(file, namespace) {
|
|
273
|
+
// Read source file
|
|
274
|
+
if (!fs.existsSync(file)) {
|
|
275
|
+
console.error(`Error: File not found: ${file}`);
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
const source = fs.readFileSync(file, 'utf-8');
|
|
279
|
+
const ns = namespace ?? deriveNamespace(file);
|
|
280
|
+
const result = (0, index_1.checkWithWarnings)(source, ns, file);
|
|
281
|
+
for (const w of result.warnings) {
|
|
282
|
+
console.error(`Warning: ${w}`);
|
|
283
|
+
}
|
|
284
|
+
if (result.error) {
|
|
285
|
+
console.error((0, diagnostics_1.formatError)(result.error, source, file));
|
|
286
|
+
process.exit(1);
|
|
287
|
+
}
|
|
288
|
+
console.log(`✓ No errors found`);
|
|
289
|
+
}
|
|
290
|
+
async function hotReload(url) {
|
|
291
|
+
try {
|
|
292
|
+
const res = await fetch(`${url}/reload`, { method: 'POST' });
|
|
293
|
+
if (res.ok) {
|
|
294
|
+
console.log(`🔄 Hot reload sent → ${url}`);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
console.warn(`⚠ Hot reload failed: HTTP ${res.status}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch (e) {
|
|
301
|
+
console.warn(`⚠ Hot reload failed (is the server running?): ${e.message}`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function watchCommand(dir, output, namespace, hotReloadUrl) {
|
|
305
|
+
// Check if directory exists
|
|
306
|
+
if (!fs.existsSync(dir)) {
|
|
307
|
+
console.error(`Error: Directory not found: ${dir}`);
|
|
308
|
+
process.exit(1);
|
|
309
|
+
}
|
|
310
|
+
const stat = fs.statSync(dir);
|
|
311
|
+
if (!stat.isDirectory()) {
|
|
312
|
+
console.error(`Error: ${dir} is not a directory`);
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
console.log(`👁 Watching ${dir} for .mcrs file changes...`);
|
|
316
|
+
console.log(` Output: ${output}`);
|
|
317
|
+
if (hotReloadUrl)
|
|
318
|
+
console.log(` Hot reload: ${hotReloadUrl}`);
|
|
319
|
+
console.log(` Incremental compilation enabled`);
|
|
320
|
+
console.log(` Press Ctrl+C to stop\n`);
|
|
321
|
+
// Set up incremental compilation infrastructure
|
|
322
|
+
const cacheDir = path.join(dir, '.redscript-cache');
|
|
323
|
+
const cache = new index_2.FileCache(cacheDir);
|
|
324
|
+
cache.load();
|
|
325
|
+
const depGraph = new deps_1.DependencyGraph();
|
|
326
|
+
// Debounce timer
|
|
327
|
+
let debounceTimer = null;
|
|
328
|
+
// Compile all .mcrs files in directory (incrementally)
|
|
329
|
+
async function compileAllIncremental() {
|
|
330
|
+
const files = findRsFiles(dir);
|
|
331
|
+
if (files.length === 0) {
|
|
332
|
+
console.log(`⚠ No .mcrs files found in ${dir}`);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const incResult = (0, incremental_1.compileIncremental)(files, cache, depGraph, {
|
|
336
|
+
namespace,
|
|
337
|
+
output,
|
|
338
|
+
});
|
|
339
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
340
|
+
// Print warnings from recompiled files
|
|
341
|
+
for (const [file, compileResult] of incResult.results) {
|
|
342
|
+
for (const w of compileResult.warnings) {
|
|
343
|
+
console.error(`Warning: ${w}`);
|
|
344
|
+
}
|
|
345
|
+
console.log(`✓ [${timestamp}] Compiled ${path.relative(dir, file)} (${compileResult.files.length} files)`);
|
|
346
|
+
}
|
|
347
|
+
if (incResult.cached > 0) {
|
|
348
|
+
console.log(` [${timestamp}] ${incResult.cached} file(s) unchanged (cached)`);
|
|
349
|
+
}
|
|
350
|
+
// Print errors
|
|
351
|
+
for (const [file, errMsg] of incResult.errors) {
|
|
352
|
+
console.error(`✗ [${timestamp}] ${path.relative(dir, file)}: ${errMsg}`);
|
|
353
|
+
}
|
|
354
|
+
// Persist cache
|
|
355
|
+
cache.save();
|
|
356
|
+
if (incResult.errors.size === 0 && hotReloadUrl)
|
|
357
|
+
await hotReload(hotReloadUrl);
|
|
358
|
+
console.log('');
|
|
359
|
+
}
|
|
360
|
+
// Find all .mcrs files recursively
|
|
361
|
+
function findRsFiles(directory) {
|
|
362
|
+
const results = [];
|
|
363
|
+
const entries = fs.readdirSync(directory, { withFileTypes: true });
|
|
364
|
+
for (const entry of entries) {
|
|
365
|
+
const fullPath = path.join(directory, entry.name);
|
|
366
|
+
if (entry.isDirectory() && entry.name !== '.redscript-cache') {
|
|
367
|
+
results.push(...findRsFiles(fullPath));
|
|
368
|
+
}
|
|
369
|
+
else if (entry.isFile() && entry.name.endsWith('.mcrs')) {
|
|
370
|
+
results.push(fullPath);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return results;
|
|
374
|
+
}
|
|
375
|
+
// Initial compile
|
|
376
|
+
void compileAllIncremental();
|
|
377
|
+
// Watch for changes
|
|
378
|
+
fs.watch(dir, { recursive: true }, (eventType, filename) => {
|
|
379
|
+
if (filename && filename.endsWith('.mcrs')) {
|
|
380
|
+
// Debounce rapid changes
|
|
381
|
+
if (debounceTimer) {
|
|
382
|
+
clearTimeout(debounceTimer);
|
|
383
|
+
}
|
|
384
|
+
debounceTimer = setTimeout(() => {
|
|
385
|
+
console.log(`📝 Change detected: ${filename}`);
|
|
386
|
+
void compileAllIncremental();
|
|
387
|
+
}, 100);
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
// Main
|
|
392
|
+
const parsed = parseArgs(args);
|
|
393
|
+
async function main() {
|
|
394
|
+
if (parsed.help || !parsed.command) {
|
|
395
|
+
printUsage();
|
|
396
|
+
process.exit(parsed.help ? 0 : 1);
|
|
397
|
+
}
|
|
398
|
+
// Background update check — non-blocking, only shows notice if newer version exists
|
|
399
|
+
// Skip for repl/upgrade/version to avoid double-printing
|
|
400
|
+
const noCheckCmds = new Set(['upgrade', 'update', 'version', 'repl']);
|
|
401
|
+
if (!noCheckCmds.has(parsed.command ?? '')) {
|
|
402
|
+
checkForUpdates().catch(() => { });
|
|
403
|
+
}
|
|
404
|
+
switch (parsed.command) {
|
|
405
|
+
case 'compile':
|
|
406
|
+
if (!parsed.file) {
|
|
407
|
+
console.error('Error: No input file specified');
|
|
408
|
+
printUsage();
|
|
409
|
+
process.exit(1);
|
|
410
|
+
}
|
|
411
|
+
{
|
|
412
|
+
const namespace = parsed.namespace ?? deriveNamespace(parsed.file);
|
|
413
|
+
const output = parsed.output ?? './dist';
|
|
414
|
+
compileCommand(parsed.file, output, namespace, parsed.sourceMap, parsed.mcVersionStr, parsed.lenient);
|
|
415
|
+
}
|
|
416
|
+
break;
|
|
417
|
+
case 'watch':
|
|
418
|
+
if (!parsed.file) {
|
|
419
|
+
console.error('Error: No directory specified');
|
|
420
|
+
printUsage();
|
|
421
|
+
process.exit(1);
|
|
422
|
+
}
|
|
423
|
+
watchCommand(parsed.file, parsed.output ?? './dist', parsed.namespace, parsed.hotReload);
|
|
424
|
+
break;
|
|
425
|
+
case 'check':
|
|
426
|
+
if (!parsed.file) {
|
|
427
|
+
console.error('Error: No input file specified');
|
|
428
|
+
printUsage();
|
|
429
|
+
process.exit(1);
|
|
430
|
+
}
|
|
431
|
+
checkCommand(parsed.file, parsed.namespace);
|
|
432
|
+
break;
|
|
433
|
+
case 'fmt':
|
|
434
|
+
case 'format': {
|
|
435
|
+
const files = args.filter(a => a.endsWith('.mcrs'));
|
|
436
|
+
if (files.length === 0) {
|
|
437
|
+
console.error('Usage: redscript fmt <file.mcrs> [file2.mcrs ...]');
|
|
438
|
+
process.exit(1);
|
|
439
|
+
}
|
|
440
|
+
const { format } = require('./formatter');
|
|
441
|
+
for (const file of files) {
|
|
442
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
443
|
+
const formatted = format(content);
|
|
444
|
+
fs.writeFileSync(file, formatted);
|
|
445
|
+
console.log(`Formatted: ${file}`);
|
|
446
|
+
}
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
case 'generate-dts': {
|
|
450
|
+
const output = parsed.output ?? 'builtins.d.mcrs';
|
|
451
|
+
const dtsContent = (0, metadata_1.generateDts)();
|
|
452
|
+
fs.writeFileSync(output, dtsContent, 'utf-8');
|
|
453
|
+
console.log(`Generated ${output}`);
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
case 'repl':
|
|
457
|
+
await (0, repl_1.startRepl)(parsed.namespace ?? 'repl');
|
|
458
|
+
break;
|
|
459
|
+
case 'version':
|
|
460
|
+
printVersion();
|
|
461
|
+
await checkForUpdates();
|
|
462
|
+
break;
|
|
463
|
+
case 'upgrade':
|
|
464
|
+
case 'update':
|
|
465
|
+
upgradeCommand();
|
|
466
|
+
break;
|
|
467
|
+
default:
|
|
468
|
+
console.error(`Error: Unknown command '${parsed.command}'`);
|
|
469
|
+
printUsage();
|
|
470
|
+
process.exit(1);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
void main();
|
|
474
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RedScript Compile API
|
|
3
|
+
*
|
|
4
|
+
* Preprocessing utilities and v2 compile re-export.
|
|
5
|
+
*/
|
|
6
|
+
export { compile, CompileOptions, CompileResult } from './emit/compile';
|
|
7
|
+
export type { DatapackFile } from './emit/index';
|
|
8
|
+
export interface SourceRange {
|
|
9
|
+
startLine: number;
|
|
10
|
+
endLine: number;
|
|
11
|
+
filePath: string;
|
|
12
|
+
}
|
|
13
|
+
export interface PreprocessedSource {
|
|
14
|
+
source: string;
|
|
15
|
+
ranges: SourceRange[];
|
|
16
|
+
/** Imported files that declared `module library;` — parsed separately
|
|
17
|
+
* in library mode so their functions are DCE-eligible. Never concatenated
|
|
18
|
+
* into `source`. */
|
|
19
|
+
libraryImports?: Array<{
|
|
20
|
+
source: string;
|
|
21
|
+
filePath: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve a combined-source line number back to the original file and line.
|
|
26
|
+
* Returns { filePath, line } if a mapping is found, otherwise returns the input unchanged.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveSourceLine(combinedLine: number, ranges: SourceRange[], fallbackFile?: string): {
|
|
29
|
+
filePath?: string;
|
|
30
|
+
line: number;
|
|
31
|
+
};
|
|
32
|
+
interface PreprocessOptions {
|
|
33
|
+
filePath?: string;
|
|
34
|
+
seen?: Set<string>;
|
|
35
|
+
}
|
|
36
|
+
export declare function preprocessSourceWithMetadata(source: string, options?: PreprocessOptions): PreprocessedSource;
|
|
37
|
+
export declare function preprocessSource(source: string, options?: PreprocessOptions): string;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RedScript Compile API
|
|
4
|
+
*
|
|
5
|
+
* Preprocessing utilities and v2 compile re-export.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.compile = void 0;
|
|
42
|
+
exports.resolveSourceLine = resolveSourceLine;
|
|
43
|
+
exports.preprocessSourceWithMetadata = preprocessSourceWithMetadata;
|
|
44
|
+
exports.preprocessSource = preprocessSource;
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const diagnostics_1 = require("./diagnostics");
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Re-export v2 compile
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
var compile_1 = require("./emit/compile");
|
|
52
|
+
Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_1.compile; } });
|
|
53
|
+
/**
|
|
54
|
+
* Resolve a combined-source line number back to the original file and line.
|
|
55
|
+
* Returns { filePath, line } if a mapping is found, otherwise returns the input unchanged.
|
|
56
|
+
*/
|
|
57
|
+
function resolveSourceLine(combinedLine, ranges, fallbackFile) {
|
|
58
|
+
for (const range of ranges) {
|
|
59
|
+
if (combinedLine >= range.startLine && combinedLine <= range.endLine) {
|
|
60
|
+
const localLine = combinedLine - range.startLine + 1;
|
|
61
|
+
return { filePath: range.filePath, line: localLine };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { filePath: fallbackFile, line: combinedLine };
|
|
65
|
+
}
|
|
66
|
+
const IMPORT_RE = /^\s*import\s+"([^"]+)"\s*;?\s*$/;
|
|
67
|
+
/** Returns true if the source file declares `module library;` at its top
|
|
68
|
+
* (before any non-comment/non-blank lines). */
|
|
69
|
+
function isLibrarySource(source) {
|
|
70
|
+
for (const line of source.split('\n')) {
|
|
71
|
+
const trimmed = line.trim();
|
|
72
|
+
if (!trimmed || trimmed.startsWith('//'))
|
|
73
|
+
continue;
|
|
74
|
+
return /^module\s+library\s*;/.test(trimmed);
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
function countLines(source) {
|
|
79
|
+
return source === '' ? 0 : source.split('\n').length;
|
|
80
|
+
}
|
|
81
|
+
function offsetRanges(ranges, lineOffset) {
|
|
82
|
+
return ranges.map(range => ({
|
|
83
|
+
startLine: range.startLine + lineOffset,
|
|
84
|
+
endLine: range.endLine + lineOffset,
|
|
85
|
+
filePath: range.filePath,
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
function preprocessSourceWithMetadata(source, options = {}) {
|
|
89
|
+
const { filePath } = options;
|
|
90
|
+
const seen = options.seen ?? new Set();
|
|
91
|
+
if (filePath) {
|
|
92
|
+
seen.add(path.resolve(filePath));
|
|
93
|
+
}
|
|
94
|
+
const lines = source.split('\n');
|
|
95
|
+
const imports = [];
|
|
96
|
+
/** Library imports: `module library;` files routed here instead of concatenated. */
|
|
97
|
+
const libraryImports = [];
|
|
98
|
+
const bodyLines = [];
|
|
99
|
+
let parsingHeader = true;
|
|
100
|
+
for (let i = 0; i < lines.length; i++) {
|
|
101
|
+
const line = lines[i];
|
|
102
|
+
const trimmed = line.trim();
|
|
103
|
+
const match = line.match(IMPORT_RE);
|
|
104
|
+
if (parsingHeader && match) {
|
|
105
|
+
if (!filePath) {
|
|
106
|
+
throw new diagnostics_1.DiagnosticError('ParseError', 'Import statements require a file path', { line: i + 1, col: 1 }, lines);
|
|
107
|
+
}
|
|
108
|
+
const importPath = path.resolve(path.dirname(filePath), match[1]);
|
|
109
|
+
if (!seen.has(importPath)) {
|
|
110
|
+
seen.add(importPath);
|
|
111
|
+
let importedSource;
|
|
112
|
+
try {
|
|
113
|
+
importedSource = fs.readFileSync(importPath, 'utf-8');
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new diagnostics_1.DiagnosticError('ParseError', `Cannot import '${match[1]}'`, { file: filePath, line: i + 1, col: 1 }, lines);
|
|
117
|
+
}
|
|
118
|
+
if (isLibrarySource(importedSource)) {
|
|
119
|
+
// Library file: parse separately so its functions are DCE-eligible.
|
|
120
|
+
// Also collect any transitive library imports inside it.
|
|
121
|
+
const nested = preprocessSourceWithMetadata(importedSource, { filePath: importPath, seen });
|
|
122
|
+
libraryImports.push({ source: importedSource, filePath: importPath });
|
|
123
|
+
// Propagate transitive library imports (e.g. math.mcrs imports vec.mcrs)
|
|
124
|
+
if (nested.libraryImports)
|
|
125
|
+
libraryImports.push(...nested.libraryImports);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
imports.push(preprocessSourceWithMetadata(importedSource, { filePath: importPath, seen }));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (parsingHeader && (trimmed === '' || trimmed.startsWith('//'))) {
|
|
134
|
+
bodyLines.push(line);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
parsingHeader = false;
|
|
138
|
+
bodyLines.push(line);
|
|
139
|
+
}
|
|
140
|
+
const body = bodyLines.join('\n');
|
|
141
|
+
const parts = [...imports.map(entry => entry.source), body].filter(Boolean);
|
|
142
|
+
const combined = parts.join('\n');
|
|
143
|
+
const ranges = [];
|
|
144
|
+
let lineOffset = 0;
|
|
145
|
+
for (const entry of imports) {
|
|
146
|
+
ranges.push(...offsetRanges(entry.ranges, lineOffset));
|
|
147
|
+
lineOffset += countLines(entry.source);
|
|
148
|
+
}
|
|
149
|
+
if (filePath && body) {
|
|
150
|
+
ranges.push({
|
|
151
|
+
startLine: lineOffset + 1,
|
|
152
|
+
endLine: lineOffset + countLines(body),
|
|
153
|
+
filePath: path.resolve(filePath),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
source: combined,
|
|
158
|
+
ranges,
|
|
159
|
+
libraryImports: libraryImports.length > 0 ? libraryImports : undefined,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function preprocessSource(source, options = {}) {
|
|
163
|
+
return preprocessSourceWithMetadata(source, options).source;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -41,4 +41,4 @@ export declare class DiagnosticCollector {
|
|
|
41
41
|
* e.g., "Expected ';' at line 5, col 12"
|
|
42
42
|
*/
|
|
43
43
|
export declare function parseErrorMessage(kind: DiagnosticKind, rawMessage: string, sourceLines?: string[], filePath?: string): DiagnosticError;
|
|
44
|
-
export declare function formatError(error: Error | DiagnosticError, source?: string): string;
|
|
44
|
+
export declare function formatError(error: Error | DiagnosticError, source?: string, filePath?: string): string;
|