@jsprismarine/mcfunction 0.0.0-stage → 0.16.0-unstable-20261029132853
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/CHANGELOG.md +48 -0
- package/LICENSE +373 -0
- package/README.md +181 -2
- package/dist/compile.cjs.cjs +166 -0
- package/dist/compile.d.ts +91 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.es.js +162 -0
- package/dist/diagnostics.cjs.cjs +19 -0
- package/dist/diagnostics.d.ts +62 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.es.js +17 -0
- package/dist/executor.cjs.cjs +302 -0
- package/dist/executor.d.ts +140 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.es.js +298 -0
- package/dist/identifiers.cjs.cjs +79 -0
- package/dist/identifiers.d.ts +44 -0
- package/dist/identifiers.d.ts.map +1 -0
- package/dist/identifiers.es.js +72 -0
- package/dist/index.cjs.cjs +36 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +10 -0
- package/dist/macro.cjs.cjs +119 -0
- package/dist/macro.d.ts +59 -0
- package/dist/macro.d.ts.map +1 -0
- package/dist/macro.es.js +115 -0
- package/dist/parse.cjs.cjs +107 -0
- package/dist/parse.d.ts +40 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.es.js +104 -0
- package/dist/registry.cjs.cjs +135 -0
- package/dist/registry.d.ts +53 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.es.js +132 -0
- package/dist/runner.cjs.cjs +42 -0
- package/dist/runner.d.ts +83 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.es.js +40 -0
- package/dist/tags.cjs.cjs +113 -0
- package/dist/tags.d.ts +70 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.es.js +108 -0
- package/package.json +61 -3
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const require_macro = require("./macro.cjs.cjs");
|
|
4
|
+
const require_parse = require("./parse.cjs.cjs");
|
|
5
|
+
// src/compile.ts
|
|
6
|
+
/**
|
|
7
|
+
* How many argument sets one macro function remembers. Java's
|
|
8
|
+
* `MacroFunction` carries 8 as its only integer constant, and caches only the
|
|
9
|
+
* values the macro actually references, so extra entries in the compound do
|
|
10
|
+
* not split the cache.
|
|
11
|
+
*/
|
|
12
|
+
var MACRO_CACHE_ENTRIES = 8;
|
|
13
|
+
/**
|
|
14
|
+
* A function file ready to run. Instances come from {@link compileFunction}
|
|
15
|
+
* and are shared by every call, including the macro cache.
|
|
16
|
+
*/
|
|
17
|
+
var CompiledFunction = class {
|
|
18
|
+
id;
|
|
19
|
+
lines;
|
|
20
|
+
/** Whether any line of the function is a macro line, so calls need arguments. */
|
|
21
|
+
macro;
|
|
22
|
+
/** Every variable the function substitutes, once each, in first-use order. */
|
|
23
|
+
variables;
|
|
24
|
+
cache = /* @__PURE__ */ new Map();
|
|
25
|
+
plain;
|
|
26
|
+
constructor(id, lines) {
|
|
27
|
+
this.id = id;
|
|
28
|
+
this.lines = lines;
|
|
29
|
+
this.macro = lines.some((line) => "template" in line);
|
|
30
|
+
const variables = [];
|
|
31
|
+
for (const line of lines) {
|
|
32
|
+
if (!("template" in line)) continue;
|
|
33
|
+
for (const variable of line.template.variables) if (!variables.includes(variable)) variables.push(variable);
|
|
34
|
+
}
|
|
35
|
+
this.variables = variables;
|
|
36
|
+
this.plain = this.macro ? void 0 : lines.flatMap((line) => "command" in line ? [{
|
|
37
|
+
command: line.command,
|
|
38
|
+
line: line.line
|
|
39
|
+
}] : []);
|
|
40
|
+
}
|
|
41
|
+
/** How many commands the function declares. */
|
|
42
|
+
get length() {
|
|
43
|
+
return this.lines.length;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Produces the commands one call runs.
|
|
47
|
+
*
|
|
48
|
+
* A plain function ignores the arguments, the way the Java server
|
|
49
|
+
* silently ignores a compound passed to a non-macro function. A macro
|
|
50
|
+
* function needs one entry per variable it substitutes and reports the
|
|
51
|
+
* first entry it is missing; the Java server skips the whole call in that
|
|
52
|
+
* case, and so does {@link FunctionExecutor}.
|
|
53
|
+
*/
|
|
54
|
+
instantiate(args) {
|
|
55
|
+
if (this.plain) return {
|
|
56
|
+
ok: true,
|
|
57
|
+
commands: this.plain
|
|
58
|
+
};
|
|
59
|
+
if (args === void 0) return {
|
|
60
|
+
ok: false,
|
|
61
|
+
message: `${this.id} is a macro function and was called without arguments`
|
|
62
|
+
};
|
|
63
|
+
for (const variable of this.variables) {
|
|
64
|
+
const value = args[variable];
|
|
65
|
+
if (value === void 0 || value === null) return {
|
|
66
|
+
ok: false,
|
|
67
|
+
message: `the macro arguments have no entry for '${variable}'`
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const key = JSON.stringify(this.variables.map((variable) => args[variable] ?? null));
|
|
71
|
+
const cached = this.cache.get(key);
|
|
72
|
+
if (cached) {
|
|
73
|
+
this.cache.delete(key);
|
|
74
|
+
this.cache.set(key, cached);
|
|
75
|
+
return {
|
|
76
|
+
ok: true,
|
|
77
|
+
commands: cached
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const commands = [];
|
|
81
|
+
for (const line of this.lines) {
|
|
82
|
+
if ("command" in line) {
|
|
83
|
+
commands.push({
|
|
84
|
+
command: line.command,
|
|
85
|
+
line: line.line
|
|
86
|
+
});
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const substituted = require_macro.substituteMacro(line.template, args);
|
|
90
|
+
if (!substituted.ok) return {
|
|
91
|
+
ok: false,
|
|
92
|
+
message: substituted.message,
|
|
93
|
+
line: line.line
|
|
94
|
+
};
|
|
95
|
+
commands.push({
|
|
96
|
+
command: substituted.command,
|
|
97
|
+
line: line.line
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
this.cache.set(key, commands);
|
|
101
|
+
if (this.cache.size > 8) {
|
|
102
|
+
const oldest = this.cache.keys().next();
|
|
103
|
+
if (!oldest.done) this.cache.delete(oldest.value);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
ok: true,
|
|
107
|
+
commands
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/** How many argument sets the macro cache currently holds. */
|
|
111
|
+
get cachedArgumentSets() {
|
|
112
|
+
return this.cache.size;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Compiles one function file.
|
|
117
|
+
*
|
|
118
|
+
* A file with any error does not produce a function, matching the Java
|
|
119
|
+
* server, where a file that fails `CommandFunction.fromLines` is logged and
|
|
120
|
+
* left out of the function library rather than partly loaded.
|
|
121
|
+
*
|
|
122
|
+
* @param id - The namespaced id the file loads under.
|
|
123
|
+
* @param source - The text of the `.mcfunction` file.
|
|
124
|
+
*/
|
|
125
|
+
var compileFunction = (id, source) => {
|
|
126
|
+
const parsed = require_parse.parseFunctionSource(source);
|
|
127
|
+
const diagnostics = parsed.diagnostics.map((diagnostic) => ({
|
|
128
|
+
...diagnostic,
|
|
129
|
+
functionId: id
|
|
130
|
+
}));
|
|
131
|
+
const lines = [];
|
|
132
|
+
for (const line of parsed.lines) {
|
|
133
|
+
if (!line.macro) {
|
|
134
|
+
lines.push({
|
|
135
|
+
line: line.line,
|
|
136
|
+
command: line.command
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const compiled = require_macro.compileMacroLine(line.command);
|
|
141
|
+
if (!compiled.ok) {
|
|
142
|
+
diagnostics.push({
|
|
143
|
+
severity: "error",
|
|
144
|
+
code: "macro.invalid",
|
|
145
|
+
functionId: id,
|
|
146
|
+
line: line.line,
|
|
147
|
+
message: compiled.message
|
|
148
|
+
});
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
lines.push({
|
|
152
|
+
line: line.line,
|
|
153
|
+
template: compiled.template
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) return { diagnostics };
|
|
157
|
+
return {
|
|
158
|
+
function: new CompiledFunction(id, lines),
|
|
159
|
+
diagnostics
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
exports.CompiledFunction = CompiledFunction;
|
|
163
|
+
exports.MACRO_CACHE_ENTRIES = MACRO_CACHE_ENTRIES;
|
|
164
|
+
exports.compileFunction = compileFunction;
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5janMuY2pzIiwibmFtZXMiOlsic3Vic3RpdHV0ZU1hY3JvIiwicGFyc2VGdW5jdGlvblNvdXJjZSIsImNvbXBpbGVNYWNyb0xpbmUiXSwic291cmNlcyI6WyIuLi9zcmMvY29tcGlsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZnVuY3Rpb24gZmlsZSBjb21waWxlZCBvbmNlIGludG8gdGhlIGNvbW1hbmRzIGEgY2FsbCBydW5zLiBBIHBsYWluXG4gKiBmdW5jdGlvbiBpcyBpbnN0YW50aWF0ZWQgZm9yIGZyZWUsIGV2ZXJ5IGNhbGwgc2hhcmluZyB0aGUgc2FtZSBsaW5lcy4gQVxuICogbWFjcm8gZnVuY3Rpb24gcmUtaW5zdGFudGlhdGVzIHBlciBhcmd1bWVudCBzZXQsIHNvIGl0IGtlZXBzIGEgc21hbGwgY2FjaGVcbiAqIG9mIHJlY2VudCBzZXRzLCB3aGljaCBpcyB3aGF0IG1ha2VzIHJlcGVhdGVkIGNhbGxzIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzXG4gKiBjaGVhcGVyIHRoYW4gbmV3IG9uZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljIH0gZnJvbSAnLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQgdHlwZSB7IE1hY3JvQXJndW1lbnRzLCBNYWNyb1RlbXBsYXRlIH0gZnJvbSAnLi9tYWNybyc7XG5pbXBvcnQgeyBjb21waWxlTWFjcm9MaW5lLCBzdWJzdGl0dXRlTWFjcm8gfSBmcm9tICcuL21hY3JvJztcbmltcG9ydCB7IHBhcnNlRnVuY3Rpb25Tb3VyY2UgfSBmcm9tICcuL3BhcnNlJztcblxuLyoqXG4gKiBIb3cgbWFueSBhcmd1bWVudCBzZXRzIG9uZSBtYWNybyBmdW5jdGlvbiByZW1lbWJlcnMuIEphdmEnc1xuICogYE1hY3JvRnVuY3Rpb25gIGNhcnJpZXMgOCBhcyBpdHMgb25seSBpbnRlZ2VyIGNvbnN0YW50LCBhbmQgY2FjaGVzIG9ubHkgdGhlXG4gKiB2YWx1ZXMgdGhlIG1hY3JvIGFjdHVhbGx5IHJlZmVyZW5jZXMsIHNvIGV4dHJhIGVudHJpZXMgaW4gdGhlIGNvbXBvdW5kIGRvXG4gKiBub3Qgc3BsaXQgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgY29uc3QgTUFDUk9fQ0FDSEVfRU5UUklFUyA9IDg7XG5cbi8qKiBPbmUgY29tbWFuZCBhIGNhbGwgaXMgYWJvdXQgdG8gcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW50aWF0ZWRDb21tYW5kIHtcbiAgICAvKiogVGhlIGNvbW1hbmQgdGV4dCwgd2l0aCBldmVyeSBtYWNybyBzdWJzdGl0dXRpb24gYWxyZWFkeSBmaWxsZWQgaW4uICovXG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBmdW5jdGlvbiBmaWxlIHRoZSBjb21tYW5kIGNhbWUgZnJvbS4gKi9cbiAgICBsaW5lOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgb3V0Y29tZSBvZiBpbnN0YW50aWF0aW5nIGEgZnVuY3Rpb24gZm9yIG9uZSBjYWxsLiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFudGlhdGlvblJlc3VsdCA9XG4gICAgeyBvazogdHJ1ZTsgY29tbWFuZHM6IHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXSB9IHwgeyBvazogZmFsc2U7IG1lc3NhZ2U6IHN0cmluZzsgbGluZT86IG51bWJlciB9O1xuXG4vKiogT25lIGNvbXBpbGVkIGxpbmU6IGZpeGVkIHRleHQsIG9yIGEgdGVtcGxhdGUgd2FpdGluZyBmb3IgYXJndW1lbnRzLiAqL1xudHlwZSBDb21waWxlZExpbmUgPSB7IGxpbmU6IG51bWJlcjsgY29tbWFuZDogc3RyaW5nIH0gfCB7IGxpbmU6IG51bWJlcjsgdGVtcGxhdGU6IE1hY3JvVGVtcGxhdGUgfTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIGZpbGUgcmVhZHkgdG8gcnVuLiBJbnN0YW5jZXMgY29tZSBmcm9tIHtAbGluayBjb21waWxlRnVuY3Rpb259XG4gKiBhbmQgYXJlIHNoYXJlZCBieSBldmVyeSBjYWxsLCBpbmNsdWRpbmcgdGhlIG1hY3JvIGNhY2hlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcGlsZWRGdW5jdGlvbiB7XG4gICAgLyoqIFdoZXRoZXIgYW55IGxpbmUgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgbWFjcm8gbGluZSwgc28gY2FsbHMgbmVlZCBhcmd1bWVudHMuICovXG4gICAgcHVibGljIHJlYWRvbmx5IG1hY3JvOiBib29sZWFuO1xuXG4gICAgLyoqIEV2ZXJ5IHZhcmlhYmxlIHRoZSBmdW5jdGlvbiBzdWJzdGl0dXRlcywgb25jZSBlYWNoLCBpbiBmaXJzdC11c2Ugb3JkZXIuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZhcmlhYmxlczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXT4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGxhaW46IHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXSB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgLyoqIFRoZSBuYW1lc3BhY2VkIGlkIHRoZSBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHVuZGVyLiAqL1xuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsaW5lczogcmVhZG9ubHkgQ29tcGlsZWRMaW5lW11cbiAgICApIHtcbiAgICAgICAgdGhpcy5tYWNybyA9IGxpbmVzLnNvbWUoKGxpbmUpID0+ICd0ZW1wbGF0ZScgaW4gbGluZSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoISgndGVtcGxhdGUnIGluIGxpbmUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgbGluZS50ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlcy5pbmNsdWRlcyh2YXJpYWJsZSkpIHZhcmlhYmxlcy5wdXNoKHZhcmlhYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcztcbiAgICAgICAgdGhpcy5wbGFpbiA9IHRoaXMubWFjcm9cbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGxpbmVzLmZsYXRNYXAoKGxpbmUpID0+ICgnY29tbWFuZCcgaW4gbGluZSA/IFt7IGNvbW1hbmQ6IGxpbmUuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH1dIDogW10pKTtcbiAgICB9XG5cbiAgICAvKiogSG93IG1hbnkgY29tbWFuZHMgdGhlIGZ1bmN0aW9uIGRlY2xhcmVzLiAqL1xuICAgIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0aGUgY29tbWFuZHMgb25lIGNhbGwgcnVucy5cbiAgICAgKlxuICAgICAqIEEgcGxhaW4gZnVuY3Rpb24gaWdub3JlcyB0aGUgYXJndW1lbnRzLCB0aGUgd2F5IHRoZSBKYXZhIHNlcnZlclxuICAgICAqIHNpbGVudGx5IGlnbm9yZXMgYSBjb21wb3VuZCBwYXNzZWQgdG8gYSBub24tbWFjcm8gZnVuY3Rpb24uIEEgbWFjcm9cbiAgICAgKiBmdW5jdGlvbiBuZWVkcyBvbmUgZW50cnkgcGVyIHZhcmlhYmxlIGl0IHN1YnN0aXR1dGVzIGFuZCByZXBvcnRzIHRoZVxuICAgICAqIGZpcnN0IGVudHJ5IGl0IGlzIG1pc3Npbmc7IHRoZSBKYXZhIHNlcnZlciBza2lwcyB0aGUgd2hvbGUgY2FsbCBpbiB0aGF0XG4gICAgICogY2FzZSwgYW5kIHNvIGRvZXMge0BsaW5rIEZ1bmN0aW9uRXhlY3V0b3J9LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0YW50aWF0ZShhcmdzPzogTWFjcm9Bcmd1bWVudHMpOiBJbnN0YW50aWF0aW9uUmVzdWx0IHtcbiAgICAgICAgaWYgKHRoaXMucGxhaW4pIHJldHVybiB7IG9rOiB0cnVlLCBjb21tYW5kczogdGhpcy5wbGFpbiB9O1xuXG4gICAgICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RoaXMuaWR9IGlzIGEgbWFjcm8gZnVuY3Rpb24gYW5kIHdhcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNgXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB0aGlzLnZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW3ZhcmlhYmxlXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgdGhlIG1hY3JvIGFyZ3VtZW50cyBoYXZlIG5vIGVudHJ5IGZvciAnJHt2YXJpYWJsZX0nYCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkodGhpcy52YXJpYWJsZXMubWFwKCh2YXJpYWJsZSkgPT4gYXJnc1t2YXJpYWJsZV0gPz8gbnVsbCkpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAvLyBSZS1pbnNlcnQgdG8gbWFrZSB0aGlzIHRoZSBtb3N0IHJlY2VudCBzZXQsIHNvIHRoZSBldmljdGlvbiBiZWxvd1xuICAgICAgICAgICAgLy8gZHJvcHMgdGhlIHNldCB0aGF0IGhhcyBnb25lIHVudXNlZCB0aGUgbG9uZ2VzdC5cbiAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIGNhY2hlZCk7XG4gICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgY29tbWFuZHM6IGNhY2hlZCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbWFuZHM6IEluc3RhbnRpYXRlZENvbW1hbmRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5saW5lcykge1xuICAgICAgICAgICAgaWYgKCdjb21tYW5kJyBpbiBsaW5lKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbmUuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRlZCA9IHN1YnN0aXR1dGVNYWNybyhsaW5lLnRlbXBsYXRlLCBhcmdzKTtcbiAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWQub2spIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogc3Vic3RpdHV0ZWQubWVzc2FnZSwgbGluZTogbGluZS5saW5lIH07XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogc3Vic3RpdHV0ZWQuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCBjb21tYW5kcyk7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLnNpemUgPiBNQUNST19DQUNIRV9FTlRSSUVTKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLmNhY2hlLmtleXMoKS5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoIW9sZGVzdC5kb25lKSB0aGlzLmNhY2hlLmRlbGV0ZShvbGRlc3QudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGNvbW1hbmRzIH07XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGFyZ3VtZW50IHNldHMgdGhlIG1hY3JvIGNhY2hlIGN1cnJlbnRseSBob2xkcy4gKi9cbiAgICBwdWJsaWMgZ2V0IGNhY2hlZEFyZ3VtZW50U2V0cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5zaXplO1xuICAgIH1cbn1cblxuLyoqIFdoYXQge0BsaW5rIGNvbXBpbGVGdW5jdGlvbn0gcHJvZHVjZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVSZXN1bHQge1xuICAgIC8qKiBUaGUgY29tcGlsZWQgZnVuY3Rpb24sIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRpZCBub3QgY29tcGlsZS4gKi9cbiAgICBmdW5jdGlvbj86IENvbXBpbGVkRnVuY3Rpb247XG4gICAgZGlhZ25vc3RpY3M6IHJlYWRvbmx5IERpYWdub3N0aWNbXTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyBvbmUgZnVuY3Rpb24gZmlsZS5cbiAqXG4gKiBBIGZpbGUgd2l0aCBhbnkgZXJyb3IgZG9lcyBub3QgcHJvZHVjZSBhIGZ1bmN0aW9uLCBtYXRjaGluZyB0aGUgSmF2YVxuICogc2VydmVyLCB3aGVyZSBhIGZpbGUgdGhhdCBmYWlscyBgQ29tbWFuZEZ1bmN0aW9uLmZyb21MaW5lc2AgaXMgbG9nZ2VkIGFuZFxuICogbGVmdCBvdXQgb2YgdGhlIGZ1bmN0aW9uIGxpYnJhcnkgcmF0aGVyIHRoYW4gcGFydGx5IGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgbmFtZXNwYWNlZCBpZCB0aGUgZmlsZSBsb2FkcyB1bmRlci5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgdGV4dCBvZiB0aGUgYC5tY2Z1bmN0aW9uYCBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgY29tcGlsZUZ1bmN0aW9uID0gKGlkOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogQ29tcGlsZVJlc3VsdCA9PiB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGdW5jdGlvblNvdXJjZShzb3VyY2UpO1xuICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBwYXJzZWQuZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiAoeyAuLi5kaWFnbm9zdGljLCBmdW5jdGlvbklkOiBpZCB9KSk7XG4gICAgY29uc3QgbGluZXM6IENvbXBpbGVkTGluZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcGFyc2VkLmxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS5tYWNybykge1xuICAgICAgICAgICAgbGluZXMucHVzaCh7IGxpbmU6IGxpbmUubGluZSwgY29tbWFuZDogbGluZS5jb21tYW5kIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVNYWNyb0xpbmUobGluZS5jb21tYW5kKTtcbiAgICAgICAgaWYgKCFjb21waWxlZC5vaykge1xuICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ21hY3JvLmludmFsaWQnLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGlkLFxuICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUubGluZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjb21waWxlZC5tZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZXMucHVzaCh7IGxpbmU6IGxpbmUubGluZSwgdGVtcGxhdGU6IGNvbXBpbGVkLnRlbXBsYXRlIH0pO1xuICAgIH1cblxuICAgIGlmIChkaWFnbm9zdGljcy5zb21lKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLnNldmVyaXR5ID09PSAnZXJyb3InKSkgcmV0dXJuIHsgZGlhZ25vc3RpY3MgfTtcbiAgICByZXR1cm4geyBmdW5jdGlvbjogbmV3IENvbXBpbGVkRnVuY3Rpb24oaWQsIGxpbmVzKSwgZGlhZ25vc3RpY3MgfTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBbUJBLElBQWEsc0JBQXNCOzs7OztBQXFCbkMsSUFBYSxtQkFBYixNQUE4QjtDQWFOO0NBQ0M7O0NBWnJCOztDQUdBO0NBRUEsd0JBQXlCLElBQUksSUFBNEM7Q0FFekU7Q0FFQSxZQUVJLElBQ0EsT0FDRjtFQUZrQixLQUFBLEtBQUE7RUFDQyxLQUFBLFFBQUE7RUFFakIsS0FBSyxRQUFRLE1BQU0sTUFBTSxTQUFTLGNBQWMsSUFBSTtFQUNwRCxNQUFNLFlBQXNCLENBQUM7RUFDN0IsS0FBSyxNQUFNLFFBQVEsT0FBTztHQUN0QixJQUFJLEVBQUUsY0FBYyxPQUFPO0dBQzNCLEtBQUssTUFBTSxZQUFZLEtBQUssU0FBUyxXQUNqQyxJQUFJLENBQUMsVUFBVSxTQUFTLFFBQVEsR0FBRyxVQUFVLEtBQUssUUFBUTtFQUVsRTtFQUNBLEtBQUssWUFBWTtFQUNqQixLQUFLLFFBQVEsS0FBSyxRQUNaLEtBQUEsSUFDQSxNQUFNLFNBQVMsU0FBVSxhQUFhLE9BQU8sQ0FBQztHQUFFLFNBQVMsS0FBSztHQUFTLE1BQU0sS0FBSztFQUFLLENBQUMsSUFBSSxDQUFDLENBQUU7Q0FDekc7O0NBR0EsSUFBVyxTQUFpQjtFQUN4QixPQUFPLEtBQUssTUFBTTtDQUN0Qjs7Ozs7Ozs7OztDQVdBLFlBQW1CLE1BQTRDO0VBQzNELElBQUksS0FBSyxPQUFPLE9BQU87R0FBRSxJQUFJO0dBQU0sVUFBVSxLQUFLO0VBQU07RUFFeEQsSUFBSSxTQUFTLEtBQUEsR0FDVCxPQUFPO0dBQ0gsSUFBSTtHQUNKLFNBQVMsR0FBRyxLQUFLLEdBQUc7RUFDeEI7RUFHSixLQUFLLE1BQU0sWUFBWSxLQUFLLFdBQVc7R0FDbkMsTUFBTSxRQUFRLEtBQUs7R0FDbkIsSUFBSSxVQUFVLEtBQUEsS0FBYSxVQUFVLE1BQ2pDLE9BQU87SUFBRSxJQUFJO0lBQU8sU0FBUywwQ0FBMEMsU0FBUztHQUFHO0VBRTNGO0VBRUEsTUFBTSxNQUFNLEtBQUssVUFBVSxLQUFLLFVBQVUsS0FBSyxhQUFhLEtBQUssYUFBYSxJQUFJLENBQUM7RUFDbkYsTUFBTSxTQUFTLEtBQUssTUFBTSxJQUFJLEdBQUc7RUFDakMsSUFBSSxRQUFRO0dBR1IsS0FBSyxNQUFNLE9BQU8sR0FBRztHQUNyQixLQUFLLE1BQU0sSUFBSSxLQUFLLE1BQU07R0FDMUIsT0FBTztJQUFFLElBQUk7SUFBTSxVQUFVO0dBQU87RUFDeEM7RUFFQSxNQUFNLFdBQWtDLENBQUM7RUFDekMsS0FBSyxNQUFNLFFBQVEsS0FBSyxPQUFPO0dBQzNCLElBQUksYUFBYSxNQUFNO0lBQ25CLFNBQVMsS0FBSztLQUFFLFNBQVMsS0FBSztLQUFTLE1BQU0sS0FBSztJQUFLLENBQUM7SUFDeEQ7R0FDSjtHQUVBLE1BQU0sY0FBY0EsY0FBQUEsZ0JBQWdCLEtBQUssVUFBVSxJQUFJO0dBQ3ZELElBQUksQ0FBQyxZQUFZLElBQUksT0FBTztJQUFFLElBQUk7SUFBTyxTQUFTLFlBQVk7SUFBUyxNQUFNLEtBQUs7R0FBSztHQUN2RixTQUFTLEtBQUs7SUFBRSxTQUFTLFlBQVk7SUFBUyxNQUFNLEtBQUs7R0FBSyxDQUFDO0VBQ25FO0VBRUEsS0FBSyxNQUFNLElBQUksS0FBSyxRQUFRO0VBQzVCLElBQUksS0FBSyxNQUFNLE9BQUEsR0FBNEI7R0FDdkMsTUFBTSxTQUFTLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLO0dBQ3RDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxNQUFNLE9BQU8sT0FBTyxLQUFLO0VBQ3BEO0VBRUEsT0FBTztHQUFFLElBQUk7R0FBTTtFQUFTO0NBQ2hDOztDQUdBLElBQVcscUJBQTZCO0VBQ3BDLE9BQU8sS0FBSyxNQUFNO0NBQ3RCO0FBQ0o7Ozs7Ozs7Ozs7O0FBbUJBLElBQWEsbUJBQW1CLElBQVksV0FBa0M7Q0FDMUUsTUFBTSxTQUFTQyxjQUFBQSxvQkFBb0IsTUFBTTtDQUN6QyxNQUFNLGNBQTRCLE9BQU8sWUFBWSxLQUFLLGdCQUFnQjtFQUFFLEdBQUc7RUFBWSxZQUFZO0NBQUcsRUFBRTtDQUM1RyxNQUFNLFFBQXdCLENBQUM7Q0FFL0IsS0FBSyxNQUFNLFFBQVEsT0FBTyxPQUFPO0VBQzdCLElBQUksQ0FBQyxLQUFLLE9BQU87R0FDYixNQUFNLEtBQUs7SUFBRSxNQUFNLEtBQUs7SUFBTSxTQUFTLEtBQUs7R0FBUSxDQUFDO0dBQ3JEO0VBQ0o7RUFFQSxNQUFNLFdBQVdDLGNBQUFBLGlCQUFpQixLQUFLLE9BQU87RUFDOUMsSUFBSSxDQUFDLFNBQVMsSUFBSTtHQUNkLFlBQVksS0FBSztJQUNiLFVBQVU7SUFDVixNQUFNO0lBQ04sWUFBWTtJQUNaLE1BQU0sS0FBSztJQUNYLFNBQVMsU0FBUztHQUN0QixDQUFDO0dBQ0Q7RUFDSjtFQUVBLE1BQU0sS0FBSztHQUFFLE1BQU0sS0FBSztHQUFNLFVBQVUsU0FBUztFQUFTLENBQUM7Q0FDL0Q7Q0FFQSxJQUFJLFlBQVksTUFBTSxlQUFlLFdBQVcsYUFBYSxPQUFPLEdBQUcsT0FBTyxFQUFFLFlBQVk7Q0FDNUYsT0FBTztFQUFFLFVBQVUsSUFBSSxpQkFBaUIsSUFBSSxLQUFLO0VBQUc7Q0FBWTtBQUNwRSJ9
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A function file compiled once into the commands a call runs. A plain
|
|
3
|
+
* function is instantiated for free, every call sharing the same lines. A
|
|
4
|
+
* macro function re-instantiates per argument set, so it keeps a small cache
|
|
5
|
+
* of recent sets, which is what makes repeated calls with the same arguments
|
|
6
|
+
* cheaper than new ones.
|
|
7
|
+
*/
|
|
8
|
+
import type { Diagnostic } from './diagnostics';
|
|
9
|
+
import type { MacroArguments, MacroTemplate } from './macro';
|
|
10
|
+
/**
|
|
11
|
+
* How many argument sets one macro function remembers. Java's
|
|
12
|
+
* `MacroFunction` carries 8 as its only integer constant, and caches only the
|
|
13
|
+
* values the macro actually references, so extra entries in the compound do
|
|
14
|
+
* not split the cache.
|
|
15
|
+
*/
|
|
16
|
+
export declare const MACRO_CACHE_ENTRIES = 8;
|
|
17
|
+
/** One command a call is about to run. */
|
|
18
|
+
export interface InstantiatedCommand {
|
|
19
|
+
/** The command text, with every macro substitution already filled in. */
|
|
20
|
+
command: string;
|
|
21
|
+
/** The 1-based line of the function file the command came from. */
|
|
22
|
+
line: number;
|
|
23
|
+
}
|
|
24
|
+
/** The outcome of instantiating a function for one call. */
|
|
25
|
+
export type InstantiationResult = {
|
|
26
|
+
ok: true;
|
|
27
|
+
commands: readonly InstantiatedCommand[];
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
message: string;
|
|
31
|
+
line?: number;
|
|
32
|
+
};
|
|
33
|
+
/** One compiled line: fixed text, or a template waiting for arguments. */
|
|
34
|
+
type CompiledLine = {
|
|
35
|
+
line: number;
|
|
36
|
+
command: string;
|
|
37
|
+
} | {
|
|
38
|
+
line: number;
|
|
39
|
+
template: MacroTemplate;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* A function file ready to run. Instances come from {@link compileFunction}
|
|
43
|
+
* and are shared by every call, including the macro cache.
|
|
44
|
+
*/
|
|
45
|
+
export declare class CompiledFunction {
|
|
46
|
+
/** The namespaced id the function is registered under. */
|
|
47
|
+
readonly id: string;
|
|
48
|
+
private readonly lines;
|
|
49
|
+
/** Whether any line of the function is a macro line, so calls need arguments. */
|
|
50
|
+
readonly macro: boolean;
|
|
51
|
+
/** Every variable the function substitutes, once each, in first-use order. */
|
|
52
|
+
readonly variables: readonly string[];
|
|
53
|
+
private readonly cache;
|
|
54
|
+
private readonly plain;
|
|
55
|
+
constructor(
|
|
56
|
+
/** The namespaced id the function is registered under. */
|
|
57
|
+
id: string, lines: readonly CompiledLine[]);
|
|
58
|
+
/** How many commands the function declares. */
|
|
59
|
+
get length(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Produces the commands one call runs.
|
|
62
|
+
*
|
|
63
|
+
* A plain function ignores the arguments, the way the Java server
|
|
64
|
+
* silently ignores a compound passed to a non-macro function. A macro
|
|
65
|
+
* function needs one entry per variable it substitutes and reports the
|
|
66
|
+
* first entry it is missing; the Java server skips the whole call in that
|
|
67
|
+
* case, and so does {@link FunctionExecutor}.
|
|
68
|
+
*/
|
|
69
|
+
instantiate(args?: MacroArguments): InstantiationResult;
|
|
70
|
+
/** How many argument sets the macro cache currently holds. */
|
|
71
|
+
get cachedArgumentSets(): number;
|
|
72
|
+
}
|
|
73
|
+
/** What {@link compileFunction} produces. */
|
|
74
|
+
export interface CompileResult {
|
|
75
|
+
/** The compiled function, or undefined when the file did not compile. */
|
|
76
|
+
function?: CompiledFunction;
|
|
77
|
+
diagnostics: readonly Diagnostic[];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Compiles one function file.
|
|
81
|
+
*
|
|
82
|
+
* A file with any error does not produce a function, matching the Java
|
|
83
|
+
* server, where a file that fails `CommandFunction.fromLines` is logged and
|
|
84
|
+
* left out of the function library rather than partly loaded.
|
|
85
|
+
*
|
|
86
|
+
* @param id - The namespaced id the file loads under.
|
|
87
|
+
* @param source - The text of the `.mcfunction` file.
|
|
88
|
+
*/
|
|
89
|
+
export declare const compileFunction: (id: string, source: string) => CompileResult;
|
|
90
|
+
export {};
|
|
91
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAChC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3G,0EAA0E;AAC1E,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,CAAC;AAElG;;;GAGG;AACH,qBAAa,gBAAgB;IAYrB,0DAA0D;aAC1C,EAAE,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAb1B,iFAAiF;IACjF,SAAgB,KAAK,EAAE,OAAO,CAAC;IAE/B,8EAA8E;IAC9E,SAAgB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAE7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqD;IAE3E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IAEnE;IACI,0DAA0D;IAC1C,EAAE,EAAE,MAAM,EACT,KAAK,EAAE,SAAS,YAAY,EAAE,EAclD;IAED,+CAA+C;IAC/C,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED;;;;;;;;OAQG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,mBAAmB,CA8C7D;IAED,8DAA8D;IAC9D,IAAW,kBAAkB,IAAI,MAAM,CAEtC;CACJ;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CACtC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,OAAQ,MAAM,UAAU,MAAM,KAAG,aA4B5D,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { compileMacroLine, substituteMacro } from "./macro.es.js";
|
|
2
|
+
import { parseFunctionSource } from "./parse.es.js";
|
|
3
|
+
// src/compile.ts
|
|
4
|
+
/**
|
|
5
|
+
* How many argument sets one macro function remembers. Java's
|
|
6
|
+
* `MacroFunction` carries 8 as its only integer constant, and caches only the
|
|
7
|
+
* values the macro actually references, so extra entries in the compound do
|
|
8
|
+
* not split the cache.
|
|
9
|
+
*/
|
|
10
|
+
var MACRO_CACHE_ENTRIES = 8;
|
|
11
|
+
/**
|
|
12
|
+
* A function file ready to run. Instances come from {@link compileFunction}
|
|
13
|
+
* and are shared by every call, including the macro cache.
|
|
14
|
+
*/
|
|
15
|
+
var CompiledFunction = class {
|
|
16
|
+
id;
|
|
17
|
+
lines;
|
|
18
|
+
/** Whether any line of the function is a macro line, so calls need arguments. */
|
|
19
|
+
macro;
|
|
20
|
+
/** Every variable the function substitutes, once each, in first-use order. */
|
|
21
|
+
variables;
|
|
22
|
+
cache = /* @__PURE__ */ new Map();
|
|
23
|
+
plain;
|
|
24
|
+
constructor(id, lines) {
|
|
25
|
+
this.id = id;
|
|
26
|
+
this.lines = lines;
|
|
27
|
+
this.macro = lines.some((line) => "template" in line);
|
|
28
|
+
const variables = [];
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
if (!("template" in line)) continue;
|
|
31
|
+
for (const variable of line.template.variables) if (!variables.includes(variable)) variables.push(variable);
|
|
32
|
+
}
|
|
33
|
+
this.variables = variables;
|
|
34
|
+
this.plain = this.macro ? void 0 : lines.flatMap((line) => "command" in line ? [{
|
|
35
|
+
command: line.command,
|
|
36
|
+
line: line.line
|
|
37
|
+
}] : []);
|
|
38
|
+
}
|
|
39
|
+
/** How many commands the function declares. */
|
|
40
|
+
get length() {
|
|
41
|
+
return this.lines.length;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Produces the commands one call runs.
|
|
45
|
+
*
|
|
46
|
+
* A plain function ignores the arguments, the way the Java server
|
|
47
|
+
* silently ignores a compound passed to a non-macro function. A macro
|
|
48
|
+
* function needs one entry per variable it substitutes and reports the
|
|
49
|
+
* first entry it is missing; the Java server skips the whole call in that
|
|
50
|
+
* case, and so does {@link FunctionExecutor}.
|
|
51
|
+
*/
|
|
52
|
+
instantiate(args) {
|
|
53
|
+
if (this.plain) return {
|
|
54
|
+
ok: true,
|
|
55
|
+
commands: this.plain
|
|
56
|
+
};
|
|
57
|
+
if (args === void 0) return {
|
|
58
|
+
ok: false,
|
|
59
|
+
message: `${this.id} is a macro function and was called without arguments`
|
|
60
|
+
};
|
|
61
|
+
for (const variable of this.variables) {
|
|
62
|
+
const value = args[variable];
|
|
63
|
+
if (value === void 0 || value === null) return {
|
|
64
|
+
ok: false,
|
|
65
|
+
message: `the macro arguments have no entry for '${variable}'`
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const key = JSON.stringify(this.variables.map((variable) => args[variable] ?? null));
|
|
69
|
+
const cached = this.cache.get(key);
|
|
70
|
+
if (cached) {
|
|
71
|
+
this.cache.delete(key);
|
|
72
|
+
this.cache.set(key, cached);
|
|
73
|
+
return {
|
|
74
|
+
ok: true,
|
|
75
|
+
commands: cached
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const commands = [];
|
|
79
|
+
for (const line of this.lines) {
|
|
80
|
+
if ("command" in line) {
|
|
81
|
+
commands.push({
|
|
82
|
+
command: line.command,
|
|
83
|
+
line: line.line
|
|
84
|
+
});
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const substituted = substituteMacro(line.template, args);
|
|
88
|
+
if (!substituted.ok) return {
|
|
89
|
+
ok: false,
|
|
90
|
+
message: substituted.message,
|
|
91
|
+
line: line.line
|
|
92
|
+
};
|
|
93
|
+
commands.push({
|
|
94
|
+
command: substituted.command,
|
|
95
|
+
line: line.line
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
this.cache.set(key, commands);
|
|
99
|
+
if (this.cache.size > 8) {
|
|
100
|
+
const oldest = this.cache.keys().next();
|
|
101
|
+
if (!oldest.done) this.cache.delete(oldest.value);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
ok: true,
|
|
105
|
+
commands
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** How many argument sets the macro cache currently holds. */
|
|
109
|
+
get cachedArgumentSets() {
|
|
110
|
+
return this.cache.size;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Compiles one function file.
|
|
115
|
+
*
|
|
116
|
+
* A file with any error does not produce a function, matching the Java
|
|
117
|
+
* server, where a file that fails `CommandFunction.fromLines` is logged and
|
|
118
|
+
* left out of the function library rather than partly loaded.
|
|
119
|
+
*
|
|
120
|
+
* @param id - The namespaced id the file loads under.
|
|
121
|
+
* @param source - The text of the `.mcfunction` file.
|
|
122
|
+
*/
|
|
123
|
+
var compileFunction = (id, source) => {
|
|
124
|
+
const parsed = parseFunctionSource(source);
|
|
125
|
+
const diagnostics = parsed.diagnostics.map((diagnostic) => ({
|
|
126
|
+
...diagnostic,
|
|
127
|
+
functionId: id
|
|
128
|
+
}));
|
|
129
|
+
const lines = [];
|
|
130
|
+
for (const line of parsed.lines) {
|
|
131
|
+
if (!line.macro) {
|
|
132
|
+
lines.push({
|
|
133
|
+
line: line.line,
|
|
134
|
+
command: line.command
|
|
135
|
+
});
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const compiled = compileMacroLine(line.command);
|
|
139
|
+
if (!compiled.ok) {
|
|
140
|
+
diagnostics.push({
|
|
141
|
+
severity: "error",
|
|
142
|
+
code: "macro.invalid",
|
|
143
|
+
functionId: id,
|
|
144
|
+
line: line.line,
|
|
145
|
+
message: compiled.message
|
|
146
|
+
});
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
lines.push({
|
|
150
|
+
line: line.line,
|
|
151
|
+
template: compiled.template
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) return { diagnostics };
|
|
155
|
+
return {
|
|
156
|
+
function: new CompiledFunction(id, lines),
|
|
157
|
+
diagnostics
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
export { CompiledFunction, MACRO_CACHE_ENTRIES, compileFunction };
|
|
161
|
+
|
|
162
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvY29tcGlsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZnVuY3Rpb24gZmlsZSBjb21waWxlZCBvbmNlIGludG8gdGhlIGNvbW1hbmRzIGEgY2FsbCBydW5zLiBBIHBsYWluXG4gKiBmdW5jdGlvbiBpcyBpbnN0YW50aWF0ZWQgZm9yIGZyZWUsIGV2ZXJ5IGNhbGwgc2hhcmluZyB0aGUgc2FtZSBsaW5lcy4gQVxuICogbWFjcm8gZnVuY3Rpb24gcmUtaW5zdGFudGlhdGVzIHBlciBhcmd1bWVudCBzZXQsIHNvIGl0IGtlZXBzIGEgc21hbGwgY2FjaGVcbiAqIG9mIHJlY2VudCBzZXRzLCB3aGljaCBpcyB3aGF0IG1ha2VzIHJlcGVhdGVkIGNhbGxzIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzXG4gKiBjaGVhcGVyIHRoYW4gbmV3IG9uZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljIH0gZnJvbSAnLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQgdHlwZSB7IE1hY3JvQXJndW1lbnRzLCBNYWNyb1RlbXBsYXRlIH0gZnJvbSAnLi9tYWNybyc7XG5pbXBvcnQgeyBjb21waWxlTWFjcm9MaW5lLCBzdWJzdGl0dXRlTWFjcm8gfSBmcm9tICcuL21hY3JvJztcbmltcG9ydCB7IHBhcnNlRnVuY3Rpb25Tb3VyY2UgfSBmcm9tICcuL3BhcnNlJztcblxuLyoqXG4gKiBIb3cgbWFueSBhcmd1bWVudCBzZXRzIG9uZSBtYWNybyBmdW5jdGlvbiByZW1lbWJlcnMuIEphdmEnc1xuICogYE1hY3JvRnVuY3Rpb25gIGNhcnJpZXMgOCBhcyBpdHMgb25seSBpbnRlZ2VyIGNvbnN0YW50LCBhbmQgY2FjaGVzIG9ubHkgdGhlXG4gKiB2YWx1ZXMgdGhlIG1hY3JvIGFjdHVhbGx5IHJlZmVyZW5jZXMsIHNvIGV4dHJhIGVudHJpZXMgaW4gdGhlIGNvbXBvdW5kIGRvXG4gKiBub3Qgc3BsaXQgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgY29uc3QgTUFDUk9fQ0FDSEVfRU5UUklFUyA9IDg7XG5cbi8qKiBPbmUgY29tbWFuZCBhIGNhbGwgaXMgYWJvdXQgdG8gcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW50aWF0ZWRDb21tYW5kIHtcbiAgICAvKiogVGhlIGNvbW1hbmQgdGV4dCwgd2l0aCBldmVyeSBtYWNybyBzdWJzdGl0dXRpb24gYWxyZWFkeSBmaWxsZWQgaW4uICovXG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBmdW5jdGlvbiBmaWxlIHRoZSBjb21tYW5kIGNhbWUgZnJvbS4gKi9cbiAgICBsaW5lOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgb3V0Y29tZSBvZiBpbnN0YW50aWF0aW5nIGEgZnVuY3Rpb24gZm9yIG9uZSBjYWxsLiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFudGlhdGlvblJlc3VsdCA9XG4gICAgeyBvazogdHJ1ZTsgY29tbWFuZHM6IHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXSB9IHwgeyBvazogZmFsc2U7IG1lc3NhZ2U6IHN0cmluZzsgbGluZT86IG51bWJlciB9O1xuXG4vKiogT25lIGNvbXBpbGVkIGxpbmU6IGZpeGVkIHRleHQsIG9yIGEgdGVtcGxhdGUgd2FpdGluZyBmb3IgYXJndW1lbnRzLiAqL1xudHlwZSBDb21waWxlZExpbmUgPSB7IGxpbmU6IG51bWJlcjsgY29tbWFuZDogc3RyaW5nIH0gfCB7IGxpbmU6IG51bWJlcjsgdGVtcGxhdGU6IE1hY3JvVGVtcGxhdGUgfTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIGZpbGUgcmVhZHkgdG8gcnVuLiBJbnN0YW5jZXMgY29tZSBmcm9tIHtAbGluayBjb21waWxlRnVuY3Rpb259XG4gKiBhbmQgYXJlIHNoYXJlZCBieSBldmVyeSBjYWxsLCBpbmNsdWRpbmcgdGhlIG1hY3JvIGNhY2hlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcGlsZWRGdW5jdGlvbiB7XG4gICAgLyoqIFdoZXRoZXIgYW55IGxpbmUgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgbWFjcm8gbGluZSwgc28gY2FsbHMgbmVlZCBhcmd1bWVudHMuICovXG4gICAgcHVibGljIHJlYWRvbmx5IG1hY3JvOiBib29sZWFuO1xuXG4gICAgLyoqIEV2ZXJ5IHZhcmlhYmxlIHRoZSBmdW5jdGlvbiBzdWJzdGl0dXRlcywgb25jZSBlYWNoLCBpbiBmaXJzdC11c2Ugb3JkZXIuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZhcmlhYmxlczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXT4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGxhaW46IHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXSB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgLyoqIFRoZSBuYW1lc3BhY2VkIGlkIHRoZSBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHVuZGVyLiAqL1xuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsaW5lczogcmVhZG9ubHkgQ29tcGlsZWRMaW5lW11cbiAgICApIHtcbiAgICAgICAgdGhpcy5tYWNybyA9IGxpbmVzLnNvbWUoKGxpbmUpID0+ICd0ZW1wbGF0ZScgaW4gbGluZSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoISgndGVtcGxhdGUnIGluIGxpbmUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgbGluZS50ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlcy5pbmNsdWRlcyh2YXJpYWJsZSkpIHZhcmlhYmxlcy5wdXNoKHZhcmlhYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcztcbiAgICAgICAgdGhpcy5wbGFpbiA9IHRoaXMubWFjcm9cbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGxpbmVzLmZsYXRNYXAoKGxpbmUpID0+ICgnY29tbWFuZCcgaW4gbGluZSA/IFt7IGNvbW1hbmQ6IGxpbmUuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH1dIDogW10pKTtcbiAgICB9XG5cbiAgICAvKiogSG93IG1hbnkgY29tbWFuZHMgdGhlIGZ1bmN0aW9uIGRlY2xhcmVzLiAqL1xuICAgIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0aGUgY29tbWFuZHMgb25lIGNhbGwgcnVucy5cbiAgICAgKlxuICAgICAqIEEgcGxhaW4gZnVuY3Rpb24gaWdub3JlcyB0aGUgYXJndW1lbnRzLCB0aGUgd2F5IHRoZSBKYXZhIHNlcnZlclxuICAgICAqIHNpbGVudGx5IGlnbm9yZXMgYSBjb21wb3VuZCBwYXNzZWQgdG8gYSBub24tbWFjcm8gZnVuY3Rpb24uIEEgbWFjcm9cbiAgICAgKiBmdW5jdGlvbiBuZWVkcyBvbmUgZW50cnkgcGVyIHZhcmlhYmxlIGl0IHN1YnN0aXR1dGVzIGFuZCByZXBvcnRzIHRoZVxuICAgICAqIGZpcnN0IGVudHJ5IGl0IGlzIG1pc3Npbmc7IHRoZSBKYXZhIHNlcnZlciBza2lwcyB0aGUgd2hvbGUgY2FsbCBpbiB0aGF0XG4gICAgICogY2FzZSwgYW5kIHNvIGRvZXMge0BsaW5rIEZ1bmN0aW9uRXhlY3V0b3J9LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0YW50aWF0ZShhcmdzPzogTWFjcm9Bcmd1bWVudHMpOiBJbnN0YW50aWF0aW9uUmVzdWx0IHtcbiAgICAgICAgaWYgKHRoaXMucGxhaW4pIHJldHVybiB7IG9rOiB0cnVlLCBjb21tYW5kczogdGhpcy5wbGFpbiB9O1xuXG4gICAgICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RoaXMuaWR9IGlzIGEgbWFjcm8gZnVuY3Rpb24gYW5kIHdhcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNgXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB0aGlzLnZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW3ZhcmlhYmxlXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgdGhlIG1hY3JvIGFyZ3VtZW50cyBoYXZlIG5vIGVudHJ5IGZvciAnJHt2YXJpYWJsZX0nYCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkodGhpcy52YXJpYWJsZXMubWFwKCh2YXJpYWJsZSkgPT4gYXJnc1t2YXJpYWJsZV0gPz8gbnVsbCkpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAvLyBSZS1pbnNlcnQgdG8gbWFrZSB0aGlzIHRoZSBtb3N0IHJlY2VudCBzZXQsIHNvIHRoZSBldmljdGlvbiBiZWxvd1xuICAgICAgICAgICAgLy8gZHJvcHMgdGhlIHNldCB0aGF0IGhhcyBnb25lIHVudXNlZCB0aGUgbG9uZ2VzdC5cbiAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIGNhY2hlZCk7XG4gICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgY29tbWFuZHM6IGNhY2hlZCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbWFuZHM6IEluc3RhbnRpYXRlZENvbW1hbmRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5saW5lcykge1xuICAgICAgICAgICAgaWYgKCdjb21tYW5kJyBpbiBsaW5lKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbmUuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRlZCA9IHN1YnN0aXR1dGVNYWNybyhsaW5lLnRlbXBsYXRlLCBhcmdzKTtcbiAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWQub2spIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogc3Vic3RpdHV0ZWQubWVzc2FnZSwgbGluZTogbGluZS5saW5lIH07XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogc3Vic3RpdHV0ZWQuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCBjb21tYW5kcyk7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLnNpemUgPiBNQUNST19DQUNIRV9FTlRSSUVTKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLmNhY2hlLmtleXMoKS5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoIW9sZGVzdC5kb25lKSB0aGlzLmNhY2hlLmRlbGV0ZShvbGRlc3QudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGNvbW1hbmRzIH07XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGFyZ3VtZW50IHNldHMgdGhlIG1hY3JvIGNhY2hlIGN1cnJlbnRseSBob2xkcy4gKi9cbiAgICBwdWJsaWMgZ2V0IGNhY2hlZEFyZ3VtZW50U2V0cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5zaXplO1xuICAgIH1cbn1cblxuLyoqIFdoYXQge0BsaW5rIGNvbXBpbGVGdW5jdGlvbn0gcHJvZHVjZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVSZXN1bHQge1xuICAgIC8qKiBUaGUgY29tcGlsZWQgZnVuY3Rpb24sIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRpZCBub3QgY29tcGlsZS4gKi9cbiAgICBmdW5jdGlvbj86IENvbXBpbGVkRnVuY3Rpb247XG4gICAgZGlhZ25vc3RpY3M6IHJlYWRvbmx5IERpYWdub3N0aWNbXTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyBvbmUgZnVuY3Rpb24gZmlsZS5cbiAqXG4gKiBBIGZpbGUgd2l0aCBhbnkgZXJyb3IgZG9lcyBub3QgcHJvZHVjZSBhIGZ1bmN0aW9uLCBtYXRjaGluZyB0aGUgSmF2YVxuICogc2VydmVyLCB3aGVyZSBhIGZpbGUgdGhhdCBmYWlscyBgQ29tbWFuZEZ1bmN0aW9uLmZyb21MaW5lc2AgaXMgbG9nZ2VkIGFuZFxuICogbGVmdCBvdXQgb2YgdGhlIGZ1bmN0aW9uIGxpYnJhcnkgcmF0aGVyIHRoYW4gcGFydGx5IGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgbmFtZXNwYWNlZCBpZCB0aGUgZmlsZSBsb2FkcyB1bmRlci5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgdGV4dCBvZiB0aGUgYC5tY2Z1bmN0aW9uYCBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgY29tcGlsZUZ1bmN0aW9uID0gKGlkOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogQ29tcGlsZVJlc3VsdCA9PiB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGdW5jdGlvblNvdXJjZShzb3VyY2UpO1xuICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBwYXJzZWQuZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiAoeyAuLi5kaWFnbm9zdGljLCBmdW5jdGlvbklkOiBpZCB9KSk7XG4gICAgY29uc3QgbGluZXM6IENvbXBpbGVkTGluZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcGFyc2VkLmxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS5tYWNybykge1xuICAgICAgICAgICAgbGluZXMucHVzaCh7IGxpbmU6IGxpbmUubGluZSwgY29tbWFuZDogbGluZS5jb21tYW5kIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVNYWNyb0xpbmUobGluZS5jb21tYW5kKTtcbiAgICAgICAgaWYgKCFjb21waWxlZC5vaykge1xuICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ21hY3JvLmludmFsaWQnLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGlkLFxuICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUubGluZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjb21waWxlZC5tZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZXMucHVzaCh7IGxpbmU6IGxpbmUubGluZSwgdGVtcGxhdGU6IGNvbXBpbGVkLnRlbXBsYXRlIH0pO1xuICAgIH1cblxuICAgIGlmIChkaWFnbm9zdGljcy5zb21lKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLnNldmVyaXR5ID09PSAnZXJyb3InKSkgcmV0dXJuIHsgZGlhZ25vc3RpY3MgfTtcbiAgICByZXR1cm4geyBmdW5jdGlvbjogbmV3IENvbXBpbGVkRnVuY3Rpb24oaWQsIGxpbmVzKSwgZGlhZ25vc3RpY3MgfTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQW1CQSxJQUFhLHNCQUFzQjs7Ozs7QUFxQm5DLElBQWEsbUJBQWIsTUFBOEI7Q0FhTjtDQUNDOztDQVpyQjs7Q0FHQTtDQUVBLHdCQUF5QixJQUFJLElBQTRDO0NBRXpFO0NBRUEsWUFFSSxJQUNBLE9BQ0Y7RUFGa0IsS0FBQSxLQUFBO0VBQ0MsS0FBQSxRQUFBO0VBRWpCLEtBQUssUUFBUSxNQUFNLE1BQU0sU0FBUyxjQUFjLElBQUk7RUFDcEQsTUFBTSxZQUFzQixDQUFDO0VBQzdCLEtBQUssTUFBTSxRQUFRLE9BQU87R0FDdEIsSUFBSSxFQUFFLGNBQWMsT0FBTztHQUMzQixLQUFLLE1BQU0sWUFBWSxLQUFLLFNBQVMsV0FDakMsSUFBSSxDQUFDLFVBQVUsU0FBUyxRQUFRLEdBQUcsVUFBVSxLQUFLLFFBQVE7RUFFbEU7RUFDQSxLQUFLLFlBQVk7RUFDakIsS0FBSyxRQUFRLEtBQUssUUFDWixLQUFBLElBQ0EsTUFBTSxTQUFTLFNBQVUsYUFBYSxPQUFPLENBQUM7R0FBRSxTQUFTLEtBQUs7R0FBUyxNQUFNLEtBQUs7RUFBSyxDQUFDLElBQUksQ0FBQyxDQUFFO0NBQ3pHOztDQUdBLElBQVcsU0FBaUI7RUFDeEIsT0FBTyxLQUFLLE1BQU07Q0FDdEI7Ozs7Ozs7Ozs7Q0FXQSxZQUFtQixNQUE0QztFQUMzRCxJQUFJLEtBQUssT0FBTyxPQUFPO0dBQUUsSUFBSTtHQUFNLFVBQVUsS0FBSztFQUFNO0VBRXhELElBQUksU0FBUyxLQUFBLEdBQ1QsT0FBTztHQUNILElBQUk7R0FDSixTQUFTLEdBQUcsS0FBSyxHQUFHO0VBQ3hCO0VBR0osS0FBSyxNQUFNLFlBQVksS0FBSyxXQUFXO0dBQ25DLE1BQU0sUUFBUSxLQUFLO0dBQ25CLElBQUksVUFBVSxLQUFBLEtBQWEsVUFBVSxNQUNqQyxPQUFPO0lBQUUsSUFBSTtJQUFPLFNBQVMsMENBQTBDLFNBQVM7R0FBRztFQUUzRjtFQUVBLE1BQU0sTUFBTSxLQUFLLFVBQVUsS0FBSyxVQUFVLEtBQUssYUFBYSxLQUFLLGFBQWEsSUFBSSxDQUFDO0VBQ25GLE1BQU0sU0FBUyxLQUFLLE1BQU0sSUFBSSxHQUFHO0VBQ2pDLElBQUksUUFBUTtHQUdSLEtBQUssTUFBTSxPQUFPLEdBQUc7R0FDckIsS0FBSyxNQUFNLElBQUksS0FBSyxNQUFNO0dBQzFCLE9BQU87SUFBRSxJQUFJO0lBQU0sVUFBVTtHQUFPO0VBQ3hDO0VBRUEsTUFBTSxXQUFrQyxDQUFDO0VBQ3pDLEtBQUssTUFBTSxRQUFRLEtBQUssT0FBTztHQUMzQixJQUFJLGFBQWEsTUFBTTtJQUNuQixTQUFTLEtBQUs7S0FBRSxTQUFTLEtBQUs7S0FBUyxNQUFNLEtBQUs7SUFBSyxDQUFDO0lBQ3hEO0dBQ0o7R0FFQSxNQUFNLGNBQWMsZ0JBQWdCLEtBQUssVUFBVSxJQUFJO0dBQ3ZELElBQUksQ0FBQyxZQUFZLElBQUksT0FBTztJQUFFLElBQUk7SUFBTyxTQUFTLFlBQVk7SUFBUyxNQUFNLEtBQUs7R0FBSztHQUN2RixTQUFTLEtBQUs7SUFBRSxTQUFTLFlBQVk7SUFBUyxNQUFNLEtBQUs7R0FBSyxDQUFDO0VBQ25FO0VBRUEsS0FBSyxNQUFNLElBQUksS0FBSyxRQUFRO0VBQzVCLElBQUksS0FBSyxNQUFNLE9BQUEsR0FBNEI7R0FDdkMsTUFBTSxTQUFTLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLO0dBQ3RDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxNQUFNLE9BQU8sT0FBTyxLQUFLO0VBQ3BEO0VBRUEsT0FBTztHQUFFLElBQUk7R0FBTTtFQUFTO0NBQ2hDOztDQUdBLElBQVcscUJBQTZCO0VBQ3BDLE9BQU8sS0FBSyxNQUFNO0NBQ3RCO0FBQ0o7Ozs7Ozs7Ozs7O0FBbUJBLElBQWEsbUJBQW1CLElBQVksV0FBa0M7Q0FDMUUsTUFBTSxTQUFTLG9CQUFvQixNQUFNO0NBQ3pDLE1BQU0sY0FBNEIsT0FBTyxZQUFZLEtBQUssZ0JBQWdCO0VBQUUsR0FBRztFQUFZLFlBQVk7Q0FBRyxFQUFFO0NBQzVHLE1BQU0sUUFBd0IsQ0FBQztDQUUvQixLQUFLLE1BQU0sUUFBUSxPQUFPLE9BQU87RUFDN0IsSUFBSSxDQUFDLEtBQUssT0FBTztHQUNiLE1BQU0sS0FBSztJQUFFLE1BQU0sS0FBSztJQUFNLFNBQVMsS0FBSztHQUFRLENBQUM7R0FDckQ7RUFDSjtFQUVBLE1BQU0sV0FBVyxpQkFBaUIsS0FBSyxPQUFPO0VBQzlDLElBQUksQ0FBQyxTQUFTLElBQUk7R0FDZCxZQUFZLEtBQUs7SUFDYixVQUFVO0lBQ1YsTUFBTTtJQUNOLFlBQVk7SUFDWixNQUFNLEtBQUs7SUFDWCxTQUFTLFNBQVM7R0FDdEIsQ0FBQztHQUNEO0VBQ0o7RUFFQSxNQUFNLEtBQUs7R0FBRSxNQUFNLEtBQUs7R0FBTSxVQUFVLFNBQVM7RUFBUyxDQUFDO0NBQy9EO0NBRUEsSUFBSSxZQUFZLE1BQU0sZUFBZSxXQUFXLGFBQWEsT0FBTyxHQUFHLE9BQU8sRUFBRSxZQUFZO0NBQzVGLE9BQU87RUFBRSxVQUFVLElBQUksaUJBQWlCLElBQUksS0FBSztFQUFHO0NBQVk7QUFDcEUifQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
// src/diagnostics.ts
|
|
4
|
+
/** Collects diagnostics in report order. */
|
|
5
|
+
var DiagnosticCollector = class {
|
|
6
|
+
/** Everything reported so far, in the order it was reported. */
|
|
7
|
+
diagnostics = [];
|
|
8
|
+
/** Records one diagnostic. */
|
|
9
|
+
add(diagnostic) {
|
|
10
|
+
this.diagnostics.push(diagnostic);
|
|
11
|
+
}
|
|
12
|
+
/** Whether any recorded diagnostic is an error. */
|
|
13
|
+
get hasErrors() {
|
|
14
|
+
return this.diagnostics.some((diagnostic) => diagnostic.severity === "error");
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
exports.DiagnosticCollector = DiagnosticCollector;
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuY2pzLmNqcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvZGlhZ25vc3RpY3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXaGF0IHRoaXMgcnVudGltZSByZXBvcnRzIGluc3RlYWQgb2YgdGhyb3dpbmcuIExvYWRpbmcgYSBwYWNrLCBjb21waWxpbmcgYVxuICogZnVuY3Rpb24gYW5kIHJ1bm5pbmcgb25lIGFyZSBhbGwgYmVzdC1lZmZvcnQ6IGEgYnJva2VuIGZpbGUgb3IgYSB0cmlwcGVkXG4gKiBsaW1pdCBwcm9kdWNlcyBhIGRpYWdub3N0aWMgYW5kIHRoZSByZXN0IG9mIHRoZSB3b3JrIGNvbnRpbnVlcywgdGhlIHdheSB0aGVcbiAqIEphdmEgc2VydmVyIGxvZ3MgYSBmdW5jdGlvbiBpdCBjb3VsZCBub3QgbG9hZCBhbmQga2VlcHMgdGhlIHNlcnZlciBydW5uaW5nLlxuICovXG5cbi8qKiBIb3cgc2VyaW91cyBhIGRpYWdub3N0aWMgaXMuIEFuIGVycm9yIG1lYW5zIHRoZSBhZmZlY3RlZCBmdW5jdGlvbiBkaWQgbm90IGxvYWQgb3IgZGlkIG5vdCBydW4uICovXG5leHBvcnQgdHlwZSBEaWFnbm9zdGljU2V2ZXJpdHkgPSAnZXJyb3InIHwgJ3dhcm5pbmcnO1xuXG4vKiogVGhlIHByb2JsZW1zIHRoaXMgcGFja2FnZSByZXBvcnRzLiAqL1xuZXhwb3J0IHR5cGUgRGlhZ25vc3RpY0NvZGUgPVxuICAgIC8qKiBBIGxpbmUgc3RhcnRlZCB3aXRoIGAvL2AsIHdoaWNoIGlzIG5vdCBhIGNvbW1lbnQgbWFya2VyIGluIG1jZnVuY3Rpb24uICovXG4gICAgfCAnbGluZS5kb3VibGUtc2xhc2gtY29tbWVudCdcbiAgICAvKiogQSBsaW5lIHN0YXJ0ZWQgd2l0aCBgL2AsIHdoaWNoIG1jZnVuY3Rpb24gZG9lcyBub3QgdXNlLiAqL1xuICAgIHwgJ2xpbmUubGVhZGluZy1zbGFzaCdcbiAgICAvKiogQSBsaW5lIHdhcyBsb25nZXIgdGhhbiB7QGxpbmsgTUFYX0NPTU1BTkRfTEVOR1RIfS4gKi9cbiAgICB8ICdsaW5lLnRvby1sb25nJ1xuICAgIC8qKiBUaGUgZmlsZSBlbmRlZCB3aXRoIGEgbGluZSBjb250aW51YXRpb24gdGhhdCBoYWQgbm90aGluZyB0byBjb250aW51ZSBpbnRvLiAqL1xuICAgIHwgJ2xpbmUuZGFuZ2xpbmctY29udGludWF0aW9uJ1xuICAgIC8qKiBBIG1hY3JvIGxpbmUgd2FzIG1hbGZvcm1lZDogYSBiYWQgdmFyaWFibGUgbmFtZSwgYW4gdW50ZXJtaW5hdGVkIGAkKGAsIG9yIG5vIHN1YnN0aXR1dGlvbiBhdCBhbGwuICovXG4gICAgfCAnbWFjcm8uaW52YWxpZCdcbiAgICAvKiogQSBtYWNybyBmdW5jdGlvbiB3YXMgY2FsbGVkIHdpdGhvdXQgdGhlIGFyZ3VtZW50cyBpdHMgc3Vic3RpdHV0aW9ucyBuZWVkLiAqL1xuICAgIHwgJ21hY3JvLm1pc3NpbmctYXJndW1lbnRzJ1xuICAgIC8qKiBBIGBmdW5jdGlvbmAgbGluZSBuYW1lZCBhIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQuICovXG4gICAgfCAnY2FsbC51bmtub3duLWZ1bmN0aW9uJ1xuICAgIC8qKiBBIGBmdW5jdGlvbmAgbGluZSBuYW1lZCBhIHRhZyB0aGF0IHRoZSB0YWcgbG9va3VwIGRvZXMgbm90IGtub3cuICovXG4gICAgfCAnY2FsbC51bmtub3duLXRhZydcbiAgICAvKiogQSBgZnVuY3Rpb25gIGxpbmUgY2FycmllZCBhbiBhcmd1bWVudCBjb21wb3VuZCB0aGF0IGNvdWxkIG5vdCBiZSBwYXJzZWQuICovXG4gICAgfCAnY2FsbC5pbnZhbGlkLWFyZ3VtZW50cydcbiAgICAvKiogVGhlIGNvbW1hbmQgcnVubmVyIHRocmV3IHdoaWxlIHJ1bm5pbmcgYSBsaW5lLiAqL1xuICAgIHwgJ2NvbW1hbmQuZmFpbGVkJ1xuICAgIC8qKiBBIGZ1bmN0aW9uIHRhZyByZWZlcmVuY2VkIGl0c2VsZiB0aHJvdWdoIGEgY2hhaW4gb2YgdGFncy4gKi9cbiAgICB8ICd0YWcuY3ljbGUnXG4gICAgLyoqIEEgdGFnIGVudHJ5IG5hbWVkIGEgcmVxdWlyZWQgZnVuY3Rpb24gb3IgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QuICovXG4gICAgfCAndGFnLm1pc3NpbmctZW50cnknXG4gICAgLyoqIEV4ZWN1dGlvbiBzdG9wcGVkIGJlY2F1c2UgaXQgcmVhY2hlZCBgbWF4Q29tbWFuZFNlcXVlbmNlTGVuZ3RoYC4gKi9cbiAgICB8ICdsaW1pdC5jb21tYW5kLXNlcXVlbmNlLWxlbmd0aCdcbiAgICAvKiogRXhlY3V0aW9uIHN0b3BwZWQgYmVjYXVzZSBpdCByZWFjaGVkIGBtYXhDb21tYW5kRm9ya3NgLiAqL1xuICAgIHwgJ2xpbWl0LmNvbW1hbmQtZm9ya3MnXG4gICAgLyoqIEEgZmlsZSB1bmRlciBgZnVuY3Rpb24vYCBjb3VsZCBub3QgYmUgZGVjb2RlZCBvciByb3V0ZWQgdG8gYW4gaWRlbnRpZmllci4gKi9cbiAgICB8ICdsb2FkLmludmFsaWQtZmlsZSc7XG5cbi8qKiBPbmUgcmVwb3J0ZWQgcHJvYmxlbSwgY2FycnlpbmcgZW5vdWdoIGxvY2F0aW9uIHRvIGZpbmQgaXQgaW4gYSBwYWNrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljIHtcbiAgICBzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5O1xuICAgIGNvZGU6IERpYWdub3N0aWNDb2RlO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAvKiogVGhlIG5hbWVzcGFjZWQgaWQgb2YgdGhlIGZ1bmN0aW9uIHRoZSBwcm9ibGVtIGlzIGluLCB3aGVuIHRoZXJlIGlzIG9uZS4gKi9cbiAgICBmdW5jdGlvbklkPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgMS1iYXNlZCBsaW5lIG51bWJlciBpbnNpZGUgdGhhdCBmdW5jdGlvbiwgd2hlbiB0aGUgcHJvYmxlbSBoYXMgb25lLiAqL1xuICAgIGxpbmU/OiBudW1iZXI7XG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBwYWNrIHRoZSBmaWxlIGNhbWUgZnJvbSwgZm9yIHByb2JsZW1zIGZvdW5kIHdoaWxlIGxvYWRpbmcuICovXG4gICAgcGFjaz86IHN0cmluZztcbn1cblxuLyoqIENvbGxlY3RzIGRpYWdub3N0aWNzIGluIHJlcG9ydCBvcmRlci4gKi9cbmV4cG9ydCBjbGFzcyBEaWFnbm9zdGljQ29sbGVjdG9yIHtcbiAgICAvKiogRXZlcnl0aGluZyByZXBvcnRlZCBzbyBmYXIsIGluIHRoZSBvcmRlciBpdCB3YXMgcmVwb3J0ZWQuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcblxuICAgIC8qKiBSZWNvcmRzIG9uZSBkaWFnbm9zdGljLiAqL1xuICAgIHB1YmxpYyBhZGQoZGlhZ25vc3RpYzogRGlhZ25vc3RpYyk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWdub3N0aWNzLnB1c2goZGlhZ25vc3RpYyk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgYW55IHJlY29yZGVkIGRpYWdub3N0aWMgaXMgYW4gZXJyb3IuICovXG4gICAgcHVibGljIGdldCBoYXNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNzLnNvbWUoKGRpYWdub3N0aWMpID0+IGRpYWdub3N0aWMuc2V2ZXJpdHkgPT09ICdlcnJvcicpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQXlEQSxJQUFhLHNCQUFiLE1BQWlDOztDQUU3QixjQUE0QyxDQUFDOztDQUc3QyxJQUFXLFlBQThCO0VBQ3JDLEtBQUssWUFBWSxLQUFLLFVBQVU7Q0FDcEM7O0NBR0EsSUFBVyxZQUFxQjtFQUM1QixPQUFPLEtBQUssWUFBWSxNQUFNLGVBQWUsV0FBVyxhQUFhLE9BQU87Q0FDaEY7QUFDSiJ9
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What this runtime reports instead of throwing. Loading a pack, compiling a
|
|
3
|
+
* function and running one are all best-effort: a broken file or a tripped
|
|
4
|
+
* limit produces a diagnostic and the rest of the work continues, the way the
|
|
5
|
+
* Java server logs a function it could not load and keeps the server running.
|
|
6
|
+
*/
|
|
7
|
+
/** How serious a diagnostic is. An error means the affected function did not load or did not run. */
|
|
8
|
+
export type DiagnosticSeverity = 'error' | 'warning';
|
|
9
|
+
/** The problems this package reports. */
|
|
10
|
+
export type DiagnosticCode =
|
|
11
|
+
/** A line started with `//`, which is not a comment marker in mcfunction. */
|
|
12
|
+
'line.double-slash-comment'
|
|
13
|
+
/** A line started with `/`, which mcfunction does not use. */
|
|
14
|
+
| 'line.leading-slash'
|
|
15
|
+
/** A line was longer than {@link MAX_COMMAND_LENGTH}. */
|
|
16
|
+
| 'line.too-long'
|
|
17
|
+
/** The file ended with a line continuation that had nothing to continue into. */
|
|
18
|
+
| 'line.dangling-continuation'
|
|
19
|
+
/** A macro line was malformed: a bad variable name, an unterminated `$(`, or no substitution at all. */
|
|
20
|
+
| 'macro.invalid'
|
|
21
|
+
/** A macro function was called without the arguments its substitutions need. */
|
|
22
|
+
| 'macro.missing-arguments'
|
|
23
|
+
/** A `function` line named a function that is not registered. */
|
|
24
|
+
| 'call.unknown-function'
|
|
25
|
+
/** A `function` line named a tag that the tag lookup does not know. */
|
|
26
|
+
| 'call.unknown-tag'
|
|
27
|
+
/** A `function` line carried an argument compound that could not be parsed. */
|
|
28
|
+
| 'call.invalid-arguments'
|
|
29
|
+
/** The command runner threw while running a line. */
|
|
30
|
+
| 'command.failed'
|
|
31
|
+
/** A function tag referenced itself through a chain of tags. */
|
|
32
|
+
| 'tag.cycle'
|
|
33
|
+
/** A tag entry named a required function or tag that does not exist. */
|
|
34
|
+
| 'tag.missing-entry'
|
|
35
|
+
/** Execution stopped because it reached `maxCommandSequenceLength`. */
|
|
36
|
+
| 'limit.command-sequence-length'
|
|
37
|
+
/** Execution stopped because it reached `maxCommandForks`. */
|
|
38
|
+
| 'limit.command-forks'
|
|
39
|
+
/** A file under `function/` could not be decoded or routed to an identifier. */
|
|
40
|
+
| 'load.invalid-file';
|
|
41
|
+
/** One reported problem, carrying enough location to find it in a pack. */
|
|
42
|
+
export interface Diagnostic {
|
|
43
|
+
severity: DiagnosticSeverity;
|
|
44
|
+
code: DiagnosticCode;
|
|
45
|
+
message: string;
|
|
46
|
+
/** The namespaced id of the function the problem is in, when there is one. */
|
|
47
|
+
functionId?: string;
|
|
48
|
+
/** The 1-based line number inside that function, when the problem has one. */
|
|
49
|
+
line?: number;
|
|
50
|
+
/** The name of the pack the file came from, for problems found while loading. */
|
|
51
|
+
pack?: string;
|
|
52
|
+
}
|
|
53
|
+
/** Collects diagnostics in report order. */
|
|
54
|
+
export declare class DiagnosticCollector {
|
|
55
|
+
/** Everything reported so far, in the order it was reported. */
|
|
56
|
+
readonly diagnostics: Diagnostic[];
|
|
57
|
+
/** Records one diagnostic. */
|
|
58
|
+
add(diagnostic: Diagnostic): void;
|
|
59
|
+
/** Whether any recorded diagnostic is an error. */
|
|
60
|
+
get hasErrors(): boolean;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qGAAqG;AACrG,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,yCAAyC;AACzC,MAAM,MAAM,cAAc;AACtB,6EAA6E;AAC3E,2BAA2B;AAC7B,8DAA8D;GAC5D,oBAAoB;AACtB,yDAAyD;GACvD,eAAe;AACjB,iFAAiF;GAC/E,4BAA4B;AAC9B,wGAAwG;GACtG,eAAe;AACjB,gFAAgF;GAC9E,yBAAyB;AAC3B,iEAAiE;GAC/D,uBAAuB;AACzB,uEAAuE;GACrE,kBAAkB;AACpB,+EAA+E;GAC7E,wBAAwB;AAC1B,qDAAqD;GACnD,gBAAgB;AAClB,gEAAgE;GAC9D,WAAW;AACb,wEAAwE;GACtE,mBAAmB;AACrB,uEAAuE;GACrE,+BAA+B;AACjC,8DAA8D;GAC5D,qBAAqB;AACvB,gFAAgF;GAC9E,mBAAmB,CAAC;AAE1B,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,4CAA4C;AAC5C,qBAAa,mBAAmB;IAC5B,gEAAgE;IAChE,SAAgB,WAAW,EAAE,UAAU,EAAE,CAAM;IAE/C,8BAA8B;IACvB,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAEvC;IAED,mDAAmD;IACnD,IAAW,SAAS,IAAI,OAAO,CAE9B;CACJ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/diagnostics.ts
|
|
2
|
+
/** Collects diagnostics in report order. */
|
|
3
|
+
var DiagnosticCollector = class {
|
|
4
|
+
/** Everything reported so far, in the order it was reported. */
|
|
5
|
+
diagnostics = [];
|
|
6
|
+
/** Records one diagnostic. */
|
|
7
|
+
add(diagnostic) {
|
|
8
|
+
this.diagnostics.push(diagnostic);
|
|
9
|
+
}
|
|
10
|
+
/** Whether any recorded diagnostic is an error. */
|
|
11
|
+
get hasErrors() {
|
|
12
|
+
return this.diagnostics.some((diagnostic) => diagnostic.severity === "error");
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export { DiagnosticCollector };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2RpYWdub3N0aWNzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2hhdCB0aGlzIHJ1bnRpbWUgcmVwb3J0cyBpbnN0ZWFkIG9mIHRocm93aW5nLiBMb2FkaW5nIGEgcGFjaywgY29tcGlsaW5nIGFcbiAqIGZ1bmN0aW9uIGFuZCBydW5uaW5nIG9uZSBhcmUgYWxsIGJlc3QtZWZmb3J0OiBhIGJyb2tlbiBmaWxlIG9yIGEgdHJpcHBlZFxuICogbGltaXQgcHJvZHVjZXMgYSBkaWFnbm9zdGljIGFuZCB0aGUgcmVzdCBvZiB0aGUgd29yayBjb250aW51ZXMsIHRoZSB3YXkgdGhlXG4gKiBKYXZhIHNlcnZlciBsb2dzIGEgZnVuY3Rpb24gaXQgY291bGQgbm90IGxvYWQgYW5kIGtlZXBzIHRoZSBzZXJ2ZXIgcnVubmluZy5cbiAqL1xuXG4vKiogSG93IHNlcmlvdXMgYSBkaWFnbm9zdGljIGlzLiBBbiBlcnJvciBtZWFucyB0aGUgYWZmZWN0ZWQgZnVuY3Rpb24gZGlkIG5vdCBsb2FkIG9yIGRpZCBub3QgcnVuLiAqL1xuZXhwb3J0IHR5cGUgRGlhZ25vc3RpY1NldmVyaXR5ID0gJ2Vycm9yJyB8ICd3YXJuaW5nJztcblxuLyoqIFRoZSBwcm9ibGVtcyB0aGlzIHBhY2thZ2UgcmVwb3J0cy4gKi9cbmV4cG9ydCB0eXBlIERpYWdub3N0aWNDb2RlID1cbiAgICAvKiogQSBsaW5lIHN0YXJ0ZWQgd2l0aCBgLy9gLCB3aGljaCBpcyBub3QgYSBjb21tZW50IG1hcmtlciBpbiBtY2Z1bmN0aW9uLiAqL1xuICAgIHwgJ2xpbmUuZG91YmxlLXNsYXNoLWNvbW1lbnQnXG4gICAgLyoqIEEgbGluZSBzdGFydGVkIHdpdGggYC9gLCB3aGljaCBtY2Z1bmN0aW9uIGRvZXMgbm90IHVzZS4gKi9cbiAgICB8ICdsaW5lLmxlYWRpbmctc2xhc2gnXG4gICAgLyoqIEEgbGluZSB3YXMgbG9uZ2VyIHRoYW4ge0BsaW5rIE1BWF9DT01NQU5EX0xFTkdUSH0uICovXG4gICAgfCAnbGluZS50b28tbG9uZydcbiAgICAvKiogVGhlIGZpbGUgZW5kZWQgd2l0aCBhIGxpbmUgY29udGludWF0aW9uIHRoYXQgaGFkIG5vdGhpbmcgdG8gY29udGludWUgaW50by4gKi9cbiAgICB8ICdsaW5lLmRhbmdsaW5nLWNvbnRpbnVhdGlvbidcbiAgICAvKiogQSBtYWNybyBsaW5lIHdhcyBtYWxmb3JtZWQ6IGEgYmFkIHZhcmlhYmxlIG5hbWUsIGFuIHVudGVybWluYXRlZCBgJChgLCBvciBubyBzdWJzdGl0dXRpb24gYXQgYWxsLiAqL1xuICAgIHwgJ21hY3JvLmludmFsaWQnXG4gICAgLyoqIEEgbWFjcm8gZnVuY3Rpb24gd2FzIGNhbGxlZCB3aXRob3V0IHRoZSBhcmd1bWVudHMgaXRzIHN1YnN0aXR1dGlvbnMgbmVlZC4gKi9cbiAgICB8ICdtYWNyby5taXNzaW5nLWFyZ3VtZW50cydcbiAgICAvKiogQSBgZnVuY3Rpb25gIGxpbmUgbmFtZWQgYSBmdW5jdGlvbiB0aGF0IGlzIG5vdCByZWdpc3RlcmVkLiAqL1xuICAgIHwgJ2NhbGwudW5rbm93bi1mdW5jdGlvbidcbiAgICAvKiogQSBgZnVuY3Rpb25gIGxpbmUgbmFtZWQgYSB0YWcgdGhhdCB0aGUgdGFnIGxvb2t1cCBkb2VzIG5vdCBrbm93LiAqL1xuICAgIHwgJ2NhbGwudW5rbm93bi10YWcnXG4gICAgLyoqIEEgYGZ1bmN0aW9uYCBsaW5lIGNhcnJpZWQgYW4gYXJndW1lbnQgY29tcG91bmQgdGhhdCBjb3VsZCBub3QgYmUgcGFyc2VkLiAqL1xuICAgIHwgJ2NhbGwuaW52YWxpZC1hcmd1bWVudHMnXG4gICAgLyoqIFRoZSBjb21tYW5kIHJ1bm5lciB0aHJldyB3aGlsZSBydW5uaW5nIGEgbGluZS4gKi9cbiAgICB8ICdjb21tYW5kLmZhaWxlZCdcbiAgICAvKiogQSBmdW5jdGlvbiB0YWcgcmVmZXJlbmNlZCBpdHNlbGYgdGhyb3VnaCBhIGNoYWluIG9mIHRhZ3MuICovXG4gICAgfCAndGFnLmN5Y2xlJ1xuICAgIC8qKiBBIHRhZyBlbnRyeSBuYW1lZCBhIHJlcXVpcmVkIGZ1bmN0aW9uIG9yIHRhZyB0aGF0IGRvZXMgbm90IGV4aXN0LiAqL1xuICAgIHwgJ3RhZy5taXNzaW5nLWVudHJ5J1xuICAgIC8qKiBFeGVjdXRpb24gc3RvcHBlZCBiZWNhdXNlIGl0IHJlYWNoZWQgYG1heENvbW1hbmRTZXF1ZW5jZUxlbmd0aGAuICovXG4gICAgfCAnbGltaXQuY29tbWFuZC1zZXF1ZW5jZS1sZW5ndGgnXG4gICAgLyoqIEV4ZWN1dGlvbiBzdG9wcGVkIGJlY2F1c2UgaXQgcmVhY2hlZCBgbWF4Q29tbWFuZEZvcmtzYC4gKi9cbiAgICB8ICdsaW1pdC5jb21tYW5kLWZvcmtzJ1xuICAgIC8qKiBBIGZpbGUgdW5kZXIgYGZ1bmN0aW9uL2AgY291bGQgbm90IGJlIGRlY29kZWQgb3Igcm91dGVkIHRvIGFuIGlkZW50aWZpZXIuICovXG4gICAgfCAnbG9hZC5pbnZhbGlkLWZpbGUnO1xuXG4vKiogT25lIHJlcG9ydGVkIHByb2JsZW0sIGNhcnJ5aW5nIGVub3VnaCBsb2NhdGlvbiB0byBmaW5kIGl0IGluIGEgcGFjay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlhZ25vc3RpYyB7XG4gICAgc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eTtcbiAgICBjb2RlOiBEaWFnbm9zdGljQ29kZTtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBuYW1lc3BhY2VkIGlkIG9mIHRoZSBmdW5jdGlvbiB0aGUgcHJvYmxlbSBpcyBpbiwgd2hlbiB0aGVyZSBpcyBvbmUuICovXG4gICAgZnVuY3Rpb25JZD86IHN0cmluZztcbiAgICAvKiogVGhlIDEtYmFzZWQgbGluZSBudW1iZXIgaW5zaWRlIHRoYXQgZnVuY3Rpb24sIHdoZW4gdGhlIHByb2JsZW0gaGFzIG9uZS4gKi9cbiAgICBsaW5lPzogbnVtYmVyO1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgcGFjayB0aGUgZmlsZSBjYW1lIGZyb20sIGZvciBwcm9ibGVtcyBmb3VuZCB3aGlsZSBsb2FkaW5nLiAqL1xuICAgIHBhY2s/OiBzdHJpbmc7XG59XG5cbi8qKiBDb2xsZWN0cyBkaWFnbm9zdGljcyBpbiByZXBvcnQgb3JkZXIuICovXG5leHBvcnQgY2xhc3MgRGlhZ25vc3RpY0NvbGxlY3RvciB7XG4gICAgLyoqIEV2ZXJ5dGhpbmcgcmVwb3J0ZWQgc28gZmFyLCBpbiB0aGUgb3JkZXIgaXQgd2FzIHJlcG9ydGVkLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG5cbiAgICAvKiogUmVjb3JkcyBvbmUgZGlhZ25vc3RpYy4gKi9cbiAgICBwdWJsaWMgYWRkKGRpYWdub3N0aWM6IERpYWdub3N0aWMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFnbm9zdGljcy5wdXNoKGRpYWdub3N0aWMpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIGFueSByZWNvcmRlZCBkaWFnbm9zdGljIGlzIGFuIGVycm9yLiAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWFnbm9zdGljcy5zb21lKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLnNldmVyaXR5ID09PSAnZXJyb3InKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBeURBLElBQWEsc0JBQWIsTUFBaUM7O0NBRTdCLGNBQTRDLENBQUM7O0NBRzdDLElBQVcsWUFBOEI7RUFDckMsS0FBSyxZQUFZLEtBQUssVUFBVTtDQUNwQzs7Q0FHQSxJQUFXLFlBQXFCO0VBQzVCLE9BQU8sS0FBSyxZQUFZLE1BQU0sZUFBZSxXQUFXLGFBQWEsT0FBTztDQUNoRjtBQUNKIn0=
|