redscript-mc 1.2.30 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/build-test.md +10 -0
- package/.claude/commands/deploy-demo.md +12 -0
- package/.claude/commands/stage-status.md +13 -0
- package/.claude/settings.json +12 -0
- package/.github/workflows/ci.yml +1 -0
- package/CLAUDE.md +231 -0
- 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/lowering/index.js +5 -3
- package/dist/src/__tests__/cli.test.d.ts +1 -0
- package/dist/src/__tests__/cli.test.js +104 -0
- package/dist/src/__tests__/codegen.test.d.ts +1 -0
- package/dist/src/__tests__/codegen.test.js +152 -0
- package/dist/src/__tests__/compile-all.test.d.ts +10 -0
- package/dist/src/__tests__/compile-all.test.js +108 -0
- package/dist/src/__tests__/dce.test.d.ts +1 -0
- package/dist/src/__tests__/dce.test.js +102 -0
- package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
- package/dist/src/__tests__/diagnostics.test.js +177 -0
- package/dist/src/__tests__/e2e.test.d.ts +6 -0
- package/dist/src/__tests__/e2e.test.js +1789 -0
- package/dist/src/__tests__/entity-types.test.d.ts +1 -0
- package/dist/src/__tests__/entity-types.test.js +203 -0
- package/dist/src/__tests__/formatter.test.d.ts +1 -0
- package/dist/src/__tests__/formatter.test.js +40 -0
- package/dist/src/__tests__/lexer.test.d.ts +1 -0
- package/dist/src/__tests__/lexer.test.js +343 -0
- package/dist/src/__tests__/lowering.test.d.ts +1 -0
- package/dist/src/__tests__/lowering.test.js +1015 -0
- package/dist/src/__tests__/macro.test.d.ts +8 -0
- package/dist/src/__tests__/macro.test.js +306 -0
- package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
- package/dist/src/__tests__/mc-integration.test.js +817 -0
- package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
- package/dist/src/__tests__/mc-syntax.test.js +124 -0
- package/dist/src/__tests__/nbt.test.d.ts +1 -0
- package/dist/src/__tests__/nbt.test.js +82 -0
- package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
- package/dist/src/__tests__/optimizer.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer.test.js +149 -0
- package/dist/src/__tests__/parser.test.d.ts +1 -0
- package/dist/src/__tests__/parser.test.js +807 -0
- package/dist/src/__tests__/repl.test.d.ts +1 -0
- package/dist/src/__tests__/repl.test.js +27 -0
- package/dist/src/__tests__/runtime.test.d.ts +1 -0
- package/dist/src/__tests__/runtime.test.js +289 -0
- package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
- package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
- package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
- package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
- package/dist/src/__tests__/stdlib-math.test.js +351 -0
- package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib-vec.test.js +263 -0
- package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
- package/dist/src/__tests__/structure-optimizer.test.js +33 -0
- package/dist/src/__tests__/typechecker.test.d.ts +1 -0
- package/dist/src/__tests__/typechecker.test.js +552 -0
- package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
- package/dist/src/__tests__/var-allocator.test.js +69 -0
- package/dist/src/ast/types.d.ts +515 -0
- package/dist/src/ast/types.js +9 -0
- package/dist/src/builtins/metadata.d.ts +36 -0
- package/dist/src/builtins/metadata.js +1014 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.js +443 -0
- package/dist/src/codegen/cmdblock/index.d.ts +26 -0
- package/dist/src/codegen/cmdblock/index.js +45 -0
- package/dist/src/codegen/mcfunction/index.d.ts +40 -0
- package/dist/src/codegen/mcfunction/index.js +606 -0
- package/dist/src/codegen/structure/index.d.ts +24 -0
- package/dist/src/codegen/structure/index.js +279 -0
- package/dist/src/codegen/var-allocator.d.ts +45 -0
- package/dist/src/codegen/var-allocator.js +104 -0
- package/dist/src/compile.d.ts +37 -0
- package/dist/src/compile.js +165 -0
- package/dist/src/diagnostics/index.d.ts +44 -0
- package/dist/src/diagnostics/index.js +140 -0
- package/dist/src/events/types.d.ts +35 -0
- package/dist/src/events/types.js +59 -0
- package/dist/src/formatter/index.d.ts +1 -0
- package/dist/src/formatter/index.js +26 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.js +45 -0
- package/dist/src/ir/builder.d.ts +33 -0
- package/dist/src/ir/builder.js +99 -0
- package/dist/src/ir/types.d.ts +132 -0
- package/dist/src/ir/types.js +15 -0
- package/dist/src/lexer/index.d.ts +37 -0
- package/dist/src/lexer/index.js +569 -0
- package/dist/src/lowering/index.d.ts +188 -0
- package/dist/src/lowering/index.js +3405 -0
- package/dist/src/mc-test/client.d.ts +128 -0
- package/dist/src/mc-test/client.js +174 -0
- package/dist/src/mc-test/runner.d.ts +28 -0
- package/dist/src/mc-test/runner.js +151 -0
- package/dist/src/mc-test/setup.d.ts +11 -0
- package/dist/src/mc-test/setup.js +98 -0
- package/dist/src/mc-validator/index.d.ts +17 -0
- package/dist/src/mc-validator/index.js +322 -0
- package/dist/src/nbt/index.d.ts +86 -0
- package/dist/src/nbt/index.js +250 -0
- package/dist/src/optimizer/commands.d.ts +38 -0
- package/dist/src/optimizer/commands.js +451 -0
- package/dist/src/optimizer/dce.d.ts +34 -0
- package/dist/src/optimizer/dce.js +639 -0
- package/dist/src/optimizer/passes.d.ts +34 -0
- package/dist/src/optimizer/passes.js +243 -0
- package/dist/src/optimizer/structure.d.ts +9 -0
- package/dist/src/optimizer/structure.js +356 -0
- package/dist/src/parser/index.d.ts +93 -0
- package/dist/src/parser/index.js +1687 -0
- package/dist/src/repl.d.ts +16 -0
- package/dist/src/repl.js +165 -0
- package/dist/src/runtime/index.d.ts +107 -0
- package/dist/src/runtime/index.js +1409 -0
- package/dist/src/typechecker/index.d.ts +61 -0
- package/dist/src/typechecker/index.js +1034 -0
- package/dist/src/types/entity-hierarchy.d.ts +29 -0
- package/dist/src/types/entity-hierarchy.js +107 -0
- package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
- package/dist/src2/__tests__/e2e/basic.test.js +140 -0
- package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
- package/dist/src2/__tests__/e2e/macros.test.js +182 -0
- package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
- package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
- package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
- package/dist/src2/__tests__/hir/desugar.test.js +234 -0
- package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/lower.test.js +559 -0
- package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/types.test.js +185 -0
- package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
- package/dist/src2/__tests__/lir/verify.test.js +221 -0
- package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
- package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
- package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
- package/dist/src2/__tests__/mir/verify.test.js +223 -0
- package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
- package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
- package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
- package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
- package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
- package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
- package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
- package/dist/src2/emit/compile.d.ts +19 -0
- package/dist/src2/emit/compile.js +80 -0
- package/dist/src2/emit/index.d.ts +17 -0
- package/dist/src2/emit/index.js +172 -0
- package/dist/src2/hir/lower.d.ts +15 -0
- package/dist/src2/hir/lower.js +378 -0
- package/dist/src2/hir/types.d.ts +373 -0
- package/dist/src2/hir/types.js +16 -0
- package/dist/src2/lir/lower.d.ts +15 -0
- package/dist/src2/lir/lower.js +453 -0
- package/dist/src2/lir/types.d.ts +136 -0
- package/dist/src2/lir/types.js +11 -0
- package/dist/src2/lir/verify.d.ts +14 -0
- package/dist/src2/lir/verify.js +113 -0
- package/dist/src2/mir/lower.d.ts +9 -0
- package/dist/src2/mir/lower.js +1030 -0
- package/dist/src2/mir/macro.d.ts +22 -0
- package/dist/src2/mir/macro.js +168 -0
- package/dist/src2/mir/types.d.ts +183 -0
- package/dist/src2/mir/types.js +11 -0
- package/dist/src2/mir/verify.d.ts +16 -0
- package/dist/src2/mir/verify.js +216 -0
- package/dist/src2/optimizer/block_merge.d.ts +12 -0
- package/dist/src2/optimizer/block_merge.js +84 -0
- package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
- package/dist/src2/optimizer/branch_simplify.js +28 -0
- package/dist/src2/optimizer/constant_fold.d.ts +10 -0
- package/dist/src2/optimizer/constant_fold.js +85 -0
- package/dist/src2/optimizer/copy_prop.d.ts +9 -0
- package/dist/src2/optimizer/copy_prop.js +113 -0
- package/dist/src2/optimizer/dce.d.ts +8 -0
- package/dist/src2/optimizer/dce.js +155 -0
- package/dist/src2/optimizer/pipeline.d.ts +10 -0
- package/dist/src2/optimizer/pipeline.js +42 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/compiler-pipeline-redesign.md +2243 -0
- package/docs/optimization-ideas.md +1076 -0
- package/editors/vscode/package-lock.json +3 -3
- package/editors/vscode/package.json +1 -1
- package/jest.config.js +1 -1
- package/package.json +6 -5
- package/scripts/postbuild.js +15 -0
- package/src/__tests__/cli.test.ts +8 -220
- package/src/__tests__/dce.test.ts +11 -56
- package/src/__tests__/diagnostics.test.ts +59 -38
- package/src/__tests__/mc-integration.test.ts +1 -2
- package/src/ast/types.ts +6 -1
- package/src/cli.ts +29 -156
- package/src/compile.ts +6 -162
- package/src/index.ts +14 -178
- package/src/mc-test/runner.ts +4 -3
- package/src/parser/index.ts +1 -1
- package/src/repl.ts +1 -1
- package/src/runtime/index.ts +1 -1
- package/src2/__tests__/e2e/basic.test.ts +154 -0
- package/src2/__tests__/e2e/macros.test.ts +199 -0
- package/src2/__tests__/e2e/migrate.test.ts +3008 -0
- package/src2/__tests__/hir/desugar.test.ts +263 -0
- package/src2/__tests__/lir/lower.test.ts +619 -0
- package/src2/__tests__/lir/types.test.ts +207 -0
- package/src2/__tests__/lir/verify.test.ts +249 -0
- package/src2/__tests__/mir/arithmetic.test.ts +156 -0
- package/src2/__tests__/mir/control-flow.test.ts +242 -0
- package/src2/__tests__/mir/verify.test.ts +254 -0
- package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
- package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
- package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
- package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
- package/src2/__tests__/optimizer/dce.test.ts +83 -0
- package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
- package/src2/emit/compile.ts +99 -0
- package/src2/emit/index.ts +222 -0
- package/src2/hir/lower.ts +428 -0
- package/src2/hir/types.ts +216 -0
- package/src2/lir/lower.ts +556 -0
- package/src2/lir/types.ts +109 -0
- package/src2/lir/verify.ts +129 -0
- package/src2/mir/lower.ts +1160 -0
- package/src2/mir/macro.ts +167 -0
- package/src2/mir/types.ts +106 -0
- package/src2/mir/verify.ts +218 -0
- package/src2/optimizer/block_merge.ts +93 -0
- package/src2/optimizer/branch_simplify.ts +27 -0
- package/src2/optimizer/constant_fold.ts +88 -0
- package/src2/optimizer/copy_prop.ts +106 -0
- package/src2/optimizer/dce.ts +133 -0
- package/src2/optimizer/pipeline.ts +44 -0
- package/tsconfig.json +2 -2
- 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/dce.ts +0 -679
- package/src/optimizer/passes.ts +0 -250
- package/src/optimizer/structure.ts +0 -450
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DatapackFile } from '../src2/emit/index';
|
|
2
|
+
export interface ReplEvaluation {
|
|
3
|
+
source: string;
|
|
4
|
+
files: DatapackFile[];
|
|
5
|
+
output: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ReplSession {
|
|
8
|
+
private readonly namespace;
|
|
9
|
+
private declarations;
|
|
10
|
+
private statements;
|
|
11
|
+
constructor(namespace?: string);
|
|
12
|
+
clear(): void;
|
|
13
|
+
getSource(): string;
|
|
14
|
+
evaluate(input: string): ReplEvaluation;
|
|
15
|
+
}
|
|
16
|
+
export declare function startRepl(namespace?: string): Promise<void>;
|
package/dist/src/repl.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ReplSession = void 0;
|
|
37
|
+
exports.startRepl = startRepl;
|
|
38
|
+
const readline = __importStar(require("readline"));
|
|
39
|
+
const index_1 = require("./index");
|
|
40
|
+
const REPL_FN = '__repl';
|
|
41
|
+
class ReplSession {
|
|
42
|
+
constructor(namespace = 'repl') {
|
|
43
|
+
this.namespace = namespace;
|
|
44
|
+
this.declarations = [];
|
|
45
|
+
this.statements = [];
|
|
46
|
+
}
|
|
47
|
+
clear() {
|
|
48
|
+
this.declarations = [];
|
|
49
|
+
this.statements = [];
|
|
50
|
+
}
|
|
51
|
+
getSource() {
|
|
52
|
+
const sections = [];
|
|
53
|
+
if (this.declarations.length > 0) {
|
|
54
|
+
sections.push(this.declarations.join('\n\n'));
|
|
55
|
+
}
|
|
56
|
+
const body = this.statements.map(stmt => ` ${stmt}`).join('\n');
|
|
57
|
+
sections.push(`fn ${REPL_FN}() {\n${body}${body ? '\n' : ''}}`);
|
|
58
|
+
return sections.join('\n\n');
|
|
59
|
+
}
|
|
60
|
+
evaluate(input) {
|
|
61
|
+
const trimmed = input.trim();
|
|
62
|
+
if (!trimmed) {
|
|
63
|
+
return { source: this.getSource(), files: [], output: '' };
|
|
64
|
+
}
|
|
65
|
+
const declaration = isTopLevelDeclaration(trimmed);
|
|
66
|
+
const normalized = declaration ? trimmed : normalizeStatement(trimmed);
|
|
67
|
+
const nextDeclarations = declaration ? [...this.declarations, normalized] : [...this.declarations];
|
|
68
|
+
const nextStatements = declaration ? [...this.statements] : [...this.statements, normalized];
|
|
69
|
+
const source = buildSource(nextDeclarations, nextStatements);
|
|
70
|
+
const result = (0, index_1.compile)(source, { namespace: this.namespace });
|
|
71
|
+
const files = selectRelevantFiles(result.files, this.namespace, declaration);
|
|
72
|
+
this.declarations = nextDeclarations;
|
|
73
|
+
this.statements = nextStatements;
|
|
74
|
+
return {
|
|
75
|
+
source,
|
|
76
|
+
files,
|
|
77
|
+
output: formatFiles(files, declaration),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.ReplSession = ReplSession;
|
|
82
|
+
async function startRepl(namespace = 'repl') {
|
|
83
|
+
const session = new ReplSession(namespace);
|
|
84
|
+
const rl = readline.createInterface({
|
|
85
|
+
input: process.stdin,
|
|
86
|
+
output: process.stdout,
|
|
87
|
+
terminal: true,
|
|
88
|
+
});
|
|
89
|
+
console.log('RedScript REPL. Type :help for commands.');
|
|
90
|
+
try {
|
|
91
|
+
while (true) {
|
|
92
|
+
const line = await question(rl, 'rs> ');
|
|
93
|
+
const trimmed = line.trim();
|
|
94
|
+
if (trimmed === ':quit') {
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
if (trimmed === ':help') {
|
|
98
|
+
console.log([
|
|
99
|
+
'Commands:',
|
|
100
|
+
' :help Show REPL commands',
|
|
101
|
+
' :clear Reset declarations and statements',
|
|
102
|
+
' :quit Exit the REPL',
|
|
103
|
+
].join('\n'));
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (trimmed === ':clear') {
|
|
107
|
+
session.clear();
|
|
108
|
+
console.log('State cleared.');
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const evaluation = session.evaluate(line);
|
|
113
|
+
if (evaluation.output) {
|
|
114
|
+
console.log(evaluation.output);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
rl.close();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function question(rl, prompt) {
|
|
127
|
+
return new Promise(resolve => rl.question(prompt, resolve));
|
|
128
|
+
}
|
|
129
|
+
function buildSource(declarations, statements) {
|
|
130
|
+
const sections = [];
|
|
131
|
+
if (declarations.length > 0) {
|
|
132
|
+
sections.push(declarations.join('\n\n'));
|
|
133
|
+
}
|
|
134
|
+
const body = statements.map(stmt => ` ${stmt}`).join('\n');
|
|
135
|
+
sections.push(`fn ${REPL_FN}() {\n${body}${body ? '\n' : ''}}`);
|
|
136
|
+
return sections.join('\n\n');
|
|
137
|
+
}
|
|
138
|
+
function isTopLevelDeclaration(line) {
|
|
139
|
+
return /^(?:@\w+(?:\([^)]*\))?\s*)*(fn|struct|enum)\b/.test(line);
|
|
140
|
+
}
|
|
141
|
+
function normalizeStatement(line) {
|
|
142
|
+
if (/[;}]$/.test(line)) {
|
|
143
|
+
return line;
|
|
144
|
+
}
|
|
145
|
+
return `${line};`;
|
|
146
|
+
}
|
|
147
|
+
function selectRelevantFiles(files, namespace, declaration) {
|
|
148
|
+
if (declaration) {
|
|
149
|
+
const functionFiles = files.filter(file => file.path.startsWith(`data/${namespace}/function/`) &&
|
|
150
|
+
file.path.endsWith('.mcfunction') &&
|
|
151
|
+
!file.path.includes(`/${REPL_FN}/`) &&
|
|
152
|
+
!file.path.endsWith('/__load.mcfunction') &&
|
|
153
|
+
!file.path.endsWith('/__tick.mcfunction'));
|
|
154
|
+
return functionFiles;
|
|
155
|
+
}
|
|
156
|
+
return files.filter(file => file.path.startsWith(`data/${namespace}/function/${REPL_FN}`) &&
|
|
157
|
+
file.path.endsWith('.mcfunction'));
|
|
158
|
+
}
|
|
159
|
+
function formatFiles(files, declaration) {
|
|
160
|
+
if (files.length === 0) {
|
|
161
|
+
return declaration ? 'Accepted. No mcfunction output for this declaration yet.' : '';
|
|
162
|
+
}
|
|
163
|
+
return files.map(file => `${file.path}\n${file.content}`).join('\n\n');
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=repl.js.map
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCRuntime - Minecraft Command Runtime Simulator
|
|
3
|
+
*
|
|
4
|
+
* A TypeScript interpreter that simulates the subset of MC commands that
|
|
5
|
+
* RedScript generates, allowing behavioral testing without a real server.
|
|
6
|
+
*/
|
|
7
|
+
export interface Entity {
|
|
8
|
+
id: string;
|
|
9
|
+
tags: Set<string>;
|
|
10
|
+
scores: Map<string, number>;
|
|
11
|
+
selector: string;
|
|
12
|
+
type?: string;
|
|
13
|
+
position?: {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
z: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
interface Range {
|
|
20
|
+
min: number;
|
|
21
|
+
max: number;
|
|
22
|
+
}
|
|
23
|
+
declare function parseRange(s: string): Range;
|
|
24
|
+
declare function matchesRange(value: number, range: Range): boolean;
|
|
25
|
+
declare function parseSelector(sel: string, entities: Entity[], executor?: Entity): Entity[];
|
|
26
|
+
export declare class MCRuntime {
|
|
27
|
+
scoreboard: Map<string, Map<string, number>>;
|
|
28
|
+
storage: Map<string, any>;
|
|
29
|
+
entities: Entity[];
|
|
30
|
+
functions: Map<string, string[]>;
|
|
31
|
+
chatLog: string[];
|
|
32
|
+
world: Map<string, string>;
|
|
33
|
+
weather: string;
|
|
34
|
+
worldTime: number;
|
|
35
|
+
effects: Map<string, {
|
|
36
|
+
effect: string;
|
|
37
|
+
duration: number;
|
|
38
|
+
amplifier: number;
|
|
39
|
+
}[]>;
|
|
40
|
+
xp: Map<string, number>;
|
|
41
|
+
tickCount: number;
|
|
42
|
+
namespace: string;
|
|
43
|
+
private entityIdCounter;
|
|
44
|
+
private returnValue;
|
|
45
|
+
private shouldReturn;
|
|
46
|
+
private currentMacroContext;
|
|
47
|
+
constructor(namespace: string);
|
|
48
|
+
loadDatapack(dir: string): void;
|
|
49
|
+
loadFunction(name: string, lines: string[]): void;
|
|
50
|
+
load(): void;
|
|
51
|
+
tick(): void;
|
|
52
|
+
ticks(n: number): void;
|
|
53
|
+
execFunction(name: string, executor?: Entity): void;
|
|
54
|
+
private execFunctionLines;
|
|
55
|
+
execCommand(cmd: string, executor?: Entity): boolean;
|
|
56
|
+
private execScoreboard;
|
|
57
|
+
private execExecute;
|
|
58
|
+
private parseNextSelector;
|
|
59
|
+
private execFunctionCmd;
|
|
60
|
+
/** Expand MC macro placeholders: $(key) → value from currentMacroContext */
|
|
61
|
+
private expandMacro;
|
|
62
|
+
private execData;
|
|
63
|
+
private parseDataValue;
|
|
64
|
+
/** Return the whole storage compound at storagePath as a flat key→value map.
|
|
65
|
+
* Used by 'function ... with storage' to provide macro context. */
|
|
66
|
+
private getStorageCompound;
|
|
67
|
+
private getStorageField;
|
|
68
|
+
private setStorageField;
|
|
69
|
+
private removeStorageField;
|
|
70
|
+
private parseStoragePath;
|
|
71
|
+
private execTag;
|
|
72
|
+
private execSay;
|
|
73
|
+
private execTellraw;
|
|
74
|
+
private execTitle;
|
|
75
|
+
private extractJsonText;
|
|
76
|
+
private execSetblock;
|
|
77
|
+
private execFill;
|
|
78
|
+
private execTp;
|
|
79
|
+
private execWeather;
|
|
80
|
+
private execTime;
|
|
81
|
+
private execKill;
|
|
82
|
+
private execEffect;
|
|
83
|
+
private execXp;
|
|
84
|
+
private execSummon;
|
|
85
|
+
private execReturn;
|
|
86
|
+
getScore(player: string, objective: string): number;
|
|
87
|
+
setScore(player: string, objective: string, value: number): void;
|
|
88
|
+
addScore(player: string, objective: string, delta: number): void;
|
|
89
|
+
getStorage(path: string): any;
|
|
90
|
+
setStorage(path: string, value: any): void;
|
|
91
|
+
spawnEntity(tags: string[], type?: string, position?: {
|
|
92
|
+
x: number;
|
|
93
|
+
y: number;
|
|
94
|
+
z: number;
|
|
95
|
+
}): Entity;
|
|
96
|
+
killEntity(tag: string): void;
|
|
97
|
+
getEntities(selector: string): Entity[];
|
|
98
|
+
private positionKey;
|
|
99
|
+
private parseAbsolutePosition;
|
|
100
|
+
private resolvePosition;
|
|
101
|
+
private parseTimeValue;
|
|
102
|
+
private resolveTargetKeys;
|
|
103
|
+
getLastSaid(): string;
|
|
104
|
+
getChatLog(): string[];
|
|
105
|
+
compileAndLoad(source: string): void;
|
|
106
|
+
}
|
|
107
|
+
export { parseRange, matchesRange, parseSelector };
|