@exornea/zeno-compiler 1.7.0 → 2.3.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/bin/zeno-codegen.mjs +79 -31
- package/bin/zeno-diff-layout.mjs +60 -0
- package/bin/zeno-inspect.mjs +67 -0
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +48 -26
- package/dist/analyzer.js.map +1 -1
- package/dist/emitter-ast.d.ts +8 -0
- package/dist/emitter-ast.d.ts.map +1 -0
- package/dist/emitter-ast.js +34 -0
- package/dist/emitter-ast.js.map +1 -0
- package/dist/emitter-capabilities.d.ts +8 -0
- package/dist/emitter-capabilities.d.ts.map +1 -0
- package/dist/emitter-capabilities.js +59 -0
- package/dist/emitter-capabilities.js.map +1 -0
- package/dist/emitter-fields.d.ts +3 -0
- package/dist/emitter-fields.d.ts.map +1 -0
- package/dist/emitter-fields.js +180 -0
- package/dist/emitter-fields.js.map +1 -0
- package/dist/emitter-input.d.ts +3 -0
- package/dist/emitter-input.d.ts.map +1 -0
- package/dist/emitter-input.js +45 -0
- package/dist/emitter-input.js.map +1 -0
- package/dist/emitter-names.d.ts +5 -0
- package/dist/emitter-names.d.ts.map +1 -0
- package/dist/emitter-names.js +10 -0
- package/dist/emitter-names.js.map +1 -0
- package/dist/emitter-runtime-imports.d.ts +3 -0
- package/dist/emitter-runtime-imports.d.ts.map +1 -0
- package/dist/emitter-runtime-imports.js +73 -0
- package/dist/emitter-runtime-imports.js.map +1 -0
- package/dist/emitter-scan-kernels.d.ts +10 -0
- package/dist/emitter-scan-kernels.d.ts.map +1 -0
- package/dist/emitter-scan-kernels.js +174 -0
- package/dist/emitter-scan-kernels.js.map +1 -0
- package/dist/emitter-static-accessors.d.ts +4 -0
- package/dist/emitter-static-accessors.d.ts.map +1 -0
- package/dist/emitter-static-accessors.js +114 -0
- package/dist/emitter-static-accessors.js.map +1 -0
- package/dist/emitter-template.d.ts +7 -0
- package/dist/emitter-template.d.ts.map +1 -1
- package/dist/emitter-template.js +8 -3
- package/dist/emitter-template.js.map +1 -1
- package/dist/emitter-writers.d.ts +4 -0
- package/dist/emitter-writers.d.ts.map +1 -0
- package/dist/emitter-writers.js +246 -0
- package/dist/emitter-writers.js.map +1 -0
- package/dist/emitter.d.ts +9 -1
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +31 -660
- package/dist/emitter.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/layout-manifest.d.ts +37 -0
- package/dist/layout-manifest.d.ts.map +1 -0
- package/dist/layout-manifest.js +251 -0
- package/dist/layout-manifest.js.map +1 -0
- package/dist/lowering.d.ts +5 -2
- package/dist/lowering.d.ts.map +1 -1
- package/dist/lowering.js +86 -27
- package/dist/lowering.js.map +1 -1
- package/dist/source-map.d.ts +10 -0
- package/dist/source-map.d.ts.map +1 -0
- package/dist/source-map.js +371 -0
- package/dist/source-map.js.map +1 -0
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +34 -16
- package/dist/validator.js.map +1 -1
- package/package.json +5 -3
package/bin/zeno-codegen.mjs
CHANGED
|
@@ -5,42 +5,69 @@ import ts from "typescript";
|
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
7
|
analyzeProjectionSourceFile,
|
|
8
|
+
createLayoutManifest,
|
|
8
9
|
emitProjectionFile,
|
|
10
|
+
emitProjectionFileWithSourceMap,
|
|
9
11
|
formatDiagnosticLocation,
|
|
12
|
+
parseScanKernelMode,
|
|
10
13
|
} from "../dist/index.js";
|
|
11
14
|
|
|
12
15
|
const args = process.argv.slice(2);
|
|
13
|
-
let
|
|
16
|
+
let sourceMap = false;
|
|
14
17
|
let endianness = "little";
|
|
18
|
+
let manifestPath;
|
|
19
|
+
let scanKernels = "full";
|
|
15
20
|
const diagnosticsArg = args.find((arg) => arg.startsWith("--diagnostics="));
|
|
16
|
-
let diagnosticsFormat =
|
|
17
|
-
? "text"
|
|
18
|
-
: diagnosticsArg.slice("--diagnostics=".length);
|
|
21
|
+
let diagnosticsFormat =
|
|
22
|
+
diagnosticsArg === undefined ? "text" : diagnosticsArg.slice("--diagnostics=".length);
|
|
19
23
|
const positionalArgs = [];
|
|
20
|
-
const usage =
|
|
24
|
+
const usage =
|
|
25
|
+
"Usage: zeno-codegen <input.ts> <output.view.ts> [--source-map] [--manifest <layout.json>] [--scan-kernels=none|sum|basic|full] [--endian=little|big] [--diagnostics=text|json]";
|
|
21
26
|
|
|
22
27
|
function fail(code, message, details = {}) {
|
|
23
28
|
if (diagnosticsFormat === "json") {
|
|
24
|
-
console.error(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
console.error(
|
|
30
|
+
JSON.stringify(
|
|
31
|
+
{
|
|
32
|
+
event: "Codegen_Failed",
|
|
33
|
+
code,
|
|
34
|
+
message,
|
|
35
|
+
details,
|
|
36
|
+
},
|
|
37
|
+
null,
|
|
38
|
+
2,
|
|
39
|
+
),
|
|
40
|
+
);
|
|
30
41
|
} else {
|
|
31
42
|
console.error(message);
|
|
32
43
|
}
|
|
33
44
|
process.exit(1);
|
|
34
45
|
}
|
|
35
46
|
|
|
36
|
-
for (
|
|
47
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
48
|
+
const arg = args[index];
|
|
37
49
|
if (arg === "--help" || arg === "-h") {
|
|
38
50
|
console.log(usage);
|
|
39
51
|
process.exit(0);
|
|
40
52
|
}
|
|
41
53
|
|
|
42
|
-
if (arg === "--
|
|
43
|
-
|
|
54
|
+
if (arg === "--source-map") {
|
|
55
|
+
sourceMap = true;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (arg === "--manifest") {
|
|
60
|
+
const next = args[index + 1];
|
|
61
|
+
if (next === undefined || next.startsWith("--")) {
|
|
62
|
+
fail("INVALID_ARGUMENTS", "Missing path after --manifest.");
|
|
63
|
+
}
|
|
64
|
+
manifestPath = next;
|
|
65
|
+
index += 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (arg.startsWith("--manifest=")) {
|
|
70
|
+
manifestPath = arg.slice("--manifest=".length);
|
|
44
71
|
continue;
|
|
45
72
|
}
|
|
46
73
|
|
|
@@ -49,6 +76,11 @@ for (const arg of args) {
|
|
|
49
76
|
continue;
|
|
50
77
|
}
|
|
51
78
|
|
|
79
|
+
if (arg.startsWith("--scan-kernels=")) {
|
|
80
|
+
scanKernels = arg.slice("--scan-kernels=".length);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
52
84
|
if (arg.startsWith("--diagnostics=")) {
|
|
53
85
|
continue;
|
|
54
86
|
}
|
|
@@ -67,11 +99,9 @@ if (inputPath === undefined || outputPath === undefined) {
|
|
|
67
99
|
}
|
|
68
100
|
|
|
69
101
|
if (endianness !== "little" && endianness !== "big") {
|
|
70
|
-
fail(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
{ endianness },
|
|
74
|
-
);
|
|
102
|
+
fail("INVALID_ENDIANNESS", `Invalid endianness: ${endianness}. Expected "little" or "big".`, {
|
|
103
|
+
endianness,
|
|
104
|
+
});
|
|
75
105
|
}
|
|
76
106
|
|
|
77
107
|
if (diagnosticsFormat !== "text" && diagnosticsFormat !== "json") {
|
|
@@ -79,6 +109,15 @@ if (diagnosticsFormat !== "text" && diagnosticsFormat !== "json") {
|
|
|
79
109
|
process.exit(1);
|
|
80
110
|
}
|
|
81
111
|
|
|
112
|
+
const scanKernelMode = parseScanKernelMode(scanKernels);
|
|
113
|
+
if (scanKernelMode === null) {
|
|
114
|
+
fail(
|
|
115
|
+
"INVALID_SCAN_KERNEL_MODE",
|
|
116
|
+
`Invalid scan kernel mode: ${scanKernels}. Expected "none", "sum", "basic", or "full".`,
|
|
117
|
+
{ scanKernels },
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
82
121
|
const rootName = path.resolve(inputPath);
|
|
83
122
|
|
|
84
123
|
let sourceText;
|
|
@@ -90,12 +129,7 @@ try {
|
|
|
90
129
|
});
|
|
91
130
|
}
|
|
92
131
|
|
|
93
|
-
const sourceFile = ts.createSourceFile(
|
|
94
|
-
rootName,
|
|
95
|
-
sourceText,
|
|
96
|
-
ts.ScriptTarget.ES2022,
|
|
97
|
-
true,
|
|
98
|
-
);
|
|
132
|
+
const sourceFile = ts.createSourceFile(rootName, sourceText, ts.ScriptTarget.ES2022, true);
|
|
99
133
|
|
|
100
134
|
const result = analyzeProjectionSourceFile(sourceFile, { endianness });
|
|
101
135
|
|
|
@@ -104,14 +138,28 @@ if (result.diagnostics.length > 0) {
|
|
|
104
138
|
console.error(JSON.stringify({ diagnostics: result.diagnostics }, null, 2));
|
|
105
139
|
} else {
|
|
106
140
|
for (const diagnostic of result.diagnostics) {
|
|
107
|
-
console.error(
|
|
141
|
+
console.error(
|
|
142
|
+
`${formatDiagnosticLocation(diagnostic)} ${diagnostic.code}: ${diagnostic.message}`,
|
|
143
|
+
);
|
|
108
144
|
}
|
|
109
145
|
}
|
|
110
146
|
process.exit(1);
|
|
111
147
|
}
|
|
112
148
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
);
|
|
149
|
+
const resolvedOutputPath = path.resolve(outputPath);
|
|
150
|
+
const emitOptions = { scanKernels: scanKernelMode };
|
|
151
|
+
if (sourceMap) {
|
|
152
|
+
const emitted = emitProjectionFileWithSourceMap(result.layouts, resolvedOutputPath, emitOptions);
|
|
153
|
+
await writeFile(resolvedOutputPath, emitted.code, "utf8");
|
|
154
|
+
await writeFile(`${resolvedOutputPath}.map`, JSON.stringify(emitted.sourceMap, null, 2), "utf8");
|
|
155
|
+
} else {
|
|
156
|
+
await writeFile(resolvedOutputPath, emitProjectionFile(result.layouts, emitOptions), "utf8");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (manifestPath !== undefined) {
|
|
160
|
+
await writeFile(
|
|
161
|
+
path.resolve(manifestPath),
|
|
162
|
+
`${JSON.stringify(createLayoutManifest(result.layouts), null, 2)}\n`,
|
|
163
|
+
"utf8",
|
|
164
|
+
);
|
|
165
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
import { diffLayoutManifests, formatLayoutDiff, isLayoutManifest } from "../dist/index.js";
|
|
6
|
+
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
const usage = "Usage: zeno-diff-layout <old.layout.json> <new.layout.json> [--json]";
|
|
9
|
+
let json = false;
|
|
10
|
+
const positionalArgs = [];
|
|
11
|
+
|
|
12
|
+
for (const arg of args) {
|
|
13
|
+
if (arg === "--help" || arg === "-h") {
|
|
14
|
+
console.log(usage);
|
|
15
|
+
process.exit(0);
|
|
16
|
+
}
|
|
17
|
+
if (arg === "--json") {
|
|
18
|
+
json = true;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (arg.startsWith("--")) {
|
|
22
|
+
fail(`Unknown option: ${arg}`);
|
|
23
|
+
}
|
|
24
|
+
positionalArgs.push(arg);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const [previousPath, nextPath] = positionalArgs;
|
|
28
|
+
if (previousPath === undefined || nextPath === undefined) {
|
|
29
|
+
fail(usage);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const previous = await readManifest(previousPath, "old");
|
|
33
|
+
const next = await readManifest(nextPath, "new");
|
|
34
|
+
const diff = diffLayoutManifests(previous, next);
|
|
35
|
+
|
|
36
|
+
console.log(json ? JSON.stringify(diff, null, 2) : formatLayoutDiff(diff));
|
|
37
|
+
if (diff.breaking.length > 0) {
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function fail(message) {
|
|
42
|
+
console.error(message);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function readManifest(filePath, label) {
|
|
47
|
+
const resolvedPath = path.resolve(filePath);
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(await readFile(resolvedPath, "utf8"));
|
|
51
|
+
} catch (error) {
|
|
52
|
+
fail(`Could not read ${label} layout manifest: ${resolvedPath}\n${error.message}`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!isLayoutManifest(parsed)) {
|
|
56
|
+
fail(`Invalid ${label} layout manifest: ${resolvedPath}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import ts from "typescript";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
analyzeProjectionSourceFile,
|
|
8
|
+
createLayoutManifest,
|
|
9
|
+
formatDiagnosticLocation,
|
|
10
|
+
formatLayoutInspection,
|
|
11
|
+
} from "../dist/index.js";
|
|
12
|
+
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
const usage = "Usage: zeno-inspect <schema.zeno.ts> [--endian=little|big] [--json]";
|
|
15
|
+
let endianness = "little";
|
|
16
|
+
let json = false;
|
|
17
|
+
const positionalArgs = [];
|
|
18
|
+
|
|
19
|
+
for (const arg of args) {
|
|
20
|
+
if (arg === "--help" || arg === "-h") {
|
|
21
|
+
console.log(usage);
|
|
22
|
+
process.exit(0);
|
|
23
|
+
}
|
|
24
|
+
if (arg === "--json") {
|
|
25
|
+
json = true;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (arg.startsWith("--endian=")) {
|
|
29
|
+
endianness = arg.slice("--endian=".length);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (arg.startsWith("--")) {
|
|
33
|
+
fail(`Unknown option: ${arg}`);
|
|
34
|
+
}
|
|
35
|
+
positionalArgs.push(arg);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (endianness !== "little" && endianness !== "big") {
|
|
39
|
+
fail(`Invalid endianness: ${endianness}. Expected "little" or "big".`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const [inputPath] = positionalArgs;
|
|
43
|
+
if (inputPath === undefined) {
|
|
44
|
+
fail(usage);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const fileName = path.resolve(inputPath);
|
|
48
|
+
const sourceText = await readFile(fileName, "utf8");
|
|
49
|
+
const sourceFile = ts.createSourceFile(fileName, sourceText, ts.ScriptTarget.ES2022, true);
|
|
50
|
+
const result = analyzeProjectionSourceFile(sourceFile, { endianness });
|
|
51
|
+
|
|
52
|
+
if (result.diagnostics.length > 0) {
|
|
53
|
+
for (const diagnostic of result.diagnostics) {
|
|
54
|
+
console.error(
|
|
55
|
+
`${formatDiagnosticLocation(diagnostic)} ${diagnostic.code}: ${diagnostic.message}`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const manifest = createLayoutManifest(result.layouts);
|
|
62
|
+
console.log(json ? JSON.stringify(manifest, null, 2) : formatLayoutInspection(manifest));
|
|
63
|
+
|
|
64
|
+
function fail(message) {
|
|
65
|
+
console.error(message);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
package/dist/analyzer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAW,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,OAAO,
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAW,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAM3E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC;CAC1C;AAaD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,EAAE,CAAC,OAAO,GAAG,SAAS,EAChC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAEf;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAuBf"}
|
package/dist/analyzer.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import ts from "typescript";
|
|
2
2
|
import { alignTo } from "@exornea/zeno-schema";
|
|
3
|
-
import { createDiagnostic
|
|
3
|
+
import { createDiagnostic } from "./diagnostics.js";
|
|
4
4
|
import { measure, unsupportedAtPhase } from "./measurement.js";
|
|
5
5
|
import { err, ok } from "./result.js";
|
|
6
|
-
import { lowerField } from "./lowering.js";
|
|
6
|
+
import { attachSourceLocation, lowerField, sourceLocation } from "./lowering.js";
|
|
7
7
|
import { validateLayouts } from "./validator.js";
|
|
8
8
|
export function analyzeProjectionFile(_program, sourceFile, options = {}) {
|
|
9
9
|
return analyzeProjectionSourceFile(sourceFile, options);
|
|
@@ -13,20 +13,21 @@ export function analyzeProjectionSourceFile(sourceFile, options = {}) {
|
|
|
13
13
|
sourceFile,
|
|
14
14
|
endianness: options.endianness ?? "little",
|
|
15
15
|
declarations: collectInterfaceDeclarations(sourceFile),
|
|
16
|
-
layouts: new Map(),
|
|
17
|
-
diagnostics: validateSchemaSource(sourceFile),
|
|
18
|
-
activeStack: new Set(),
|
|
19
16
|
};
|
|
17
|
+
const diagnostics = validateSchemaSource(sourceFile);
|
|
18
|
+
const layouts = [];
|
|
20
19
|
for (const structName of state.declarations.keys()) {
|
|
21
20
|
const result = lowerStruct(structName, state, sourceFile);
|
|
22
21
|
if (!result.ok) {
|
|
23
|
-
|
|
22
|
+
diagnostics.push(result.error);
|
|
23
|
+
continue;
|
|
24
24
|
}
|
|
25
|
+
diagnostics.push(...result.value.diagnostics);
|
|
26
|
+
layouts.push(result.value.layout);
|
|
25
27
|
}
|
|
26
|
-
const layouts = Array.from(state.layouts.values());
|
|
27
28
|
return {
|
|
28
29
|
layouts,
|
|
29
|
-
diagnostics: [...
|
|
30
|
+
diagnostics: [...diagnostics, ...validateLayouts(layouts)],
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
33
|
function collectInterfaceDeclarations(sourceFile) {
|
|
@@ -43,7 +44,7 @@ function validateSchemaSource(sourceFile) {
|
|
|
43
44
|
for (const statement of sourceFile.statements) {
|
|
44
45
|
if (ts.isImportDeclaration(statement)) {
|
|
45
46
|
if (!isAllowedTypeOnlyImport(statement)) {
|
|
46
|
-
diagnostics.push(
|
|
47
|
+
diagnostics.push(schemaImportDiagnostic(sourceFile, statement));
|
|
47
48
|
}
|
|
48
49
|
continue;
|
|
49
50
|
}
|
|
@@ -69,11 +70,30 @@ function isAllowedTypeOnlyImport(statement) {
|
|
|
69
70
|
return importClause?.isTypeOnly === true;
|
|
70
71
|
}
|
|
71
72
|
function schemaStatementDiagnostic(sourceFile, node, construct) {
|
|
72
|
-
|
|
73
|
+
const message = construct === "value export"
|
|
74
|
+
? ".zeno.ts schema files must not export runtime values."
|
|
75
|
+
: "Zeno schema files only support type-only imports plus interface/type declarations.";
|
|
76
|
+
return createDiagnostic(sourceFile, node, "UNSUPPORTED_SCHEMA_STATEMENT", message, {
|
|
73
77
|
measurement: measure(`schema ${construct}`, "typescript-syntax", "phase-0"),
|
|
74
78
|
error: unsupportedAtPhase(`schema ${construct}`, "phase-0"),
|
|
75
79
|
});
|
|
76
80
|
}
|
|
81
|
+
function schemaImportDiagnostic(sourceFile, node) {
|
|
82
|
+
return createDiagnostic(sourceFile, node, "UNSUPPORTED_SCHEMA_STATEMENT", schemaImportMessage(node), {
|
|
83
|
+
measurement: measure("schema import", "typescript-syntax", "phase-0"),
|
|
84
|
+
error: unsupportedAtPhase("schema import", "phase-0"),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function schemaImportMessage(node) {
|
|
88
|
+
const moduleName = node.moduleSpecifier;
|
|
89
|
+
if (!ts.isStringLiteral(moduleName)) {
|
|
90
|
+
return "Zeno schema imports must use a string literal module specifier.";
|
|
91
|
+
}
|
|
92
|
+
if (moduleName.text === "@exornea/zeno-runtime") {
|
|
93
|
+
return ".zeno.ts schema files must not import runtime values.";
|
|
94
|
+
}
|
|
95
|
+
return "Zeno schema files must use type-only imports.";
|
|
96
|
+
}
|
|
77
97
|
function statementKind(statement) {
|
|
78
98
|
if (ts.isVariableStatement(statement)) {
|
|
79
99
|
return "value export";
|
|
@@ -92,11 +112,7 @@ function statementKind(statement) {
|
|
|
92
112
|
}
|
|
93
113
|
return ts.SyntaxKind[statement.kind] ?? "statement";
|
|
94
114
|
}
|
|
95
|
-
function lowerStruct(name, state, node) {
|
|
96
|
-
const existing = state.layouts.get(name);
|
|
97
|
-
if (existing !== undefined) {
|
|
98
|
-
return ok(existing);
|
|
99
|
-
}
|
|
115
|
+
function lowerStruct(name, state, node, activeStack = new Set()) {
|
|
100
116
|
const declaration = state.declarations.get(name);
|
|
101
117
|
if (declaration === undefined) {
|
|
102
118
|
return err(createDiagnostic(state.sourceFile, node, "UNKNOWN_STRUCT", `Unknown struct type "${name}".`, {
|
|
@@ -104,19 +120,21 @@ function lowerStruct(name, state, node) {
|
|
|
104
120
|
error: unsupportedAtPhase(`type reference "${name}"`, "phase-0"),
|
|
105
121
|
}));
|
|
106
122
|
}
|
|
107
|
-
if (
|
|
123
|
+
if (activeStack.has(name)) {
|
|
108
124
|
return err(createDiagnostic(state.sourceFile, declaration.name, "RECURSIVE_STRUCT", `Recursive struct "${name}" is not supported yet.`, {
|
|
109
125
|
structName: name,
|
|
110
126
|
error: unsupportedAtPhase(`recursive struct "${name}"`, "phase-0"),
|
|
111
127
|
}));
|
|
112
128
|
}
|
|
113
|
-
|
|
129
|
+
const nextActiveStack = new Set(activeStack);
|
|
130
|
+
nextActiveStack.add(name);
|
|
114
131
|
const fields = [];
|
|
132
|
+
const diagnostics = [];
|
|
115
133
|
let runningOffset = 0;
|
|
116
134
|
let alignment = 1;
|
|
117
135
|
for (const member of declaration.members) {
|
|
118
136
|
if (!ts.isPropertySignature(member)) {
|
|
119
|
-
|
|
137
|
+
diagnostics.push(createDiagnostic(state.sourceFile, member, "UNSUPPORTED_MEMBER", `Struct "${name}" only supports property signatures.`, {
|
|
120
138
|
structName: name,
|
|
121
139
|
error: unsupportedAtPhase(member.getText(state.sourceFile), "phase-0"),
|
|
122
140
|
}));
|
|
@@ -125,12 +143,18 @@ function lowerStruct(name, state, node) {
|
|
|
125
143
|
const lowered = lowerField(member, {
|
|
126
144
|
sourceFile: state.sourceFile,
|
|
127
145
|
endianness: state.endianness,
|
|
128
|
-
diagnostics: state.diagnostics,
|
|
129
146
|
structName: name,
|
|
130
|
-
lowerStructByName: (refName, refNode) =>
|
|
147
|
+
lowerStructByName: (refName, refNode) => {
|
|
148
|
+
const result = lowerStruct(refName, state, refNode, nextActiveStack);
|
|
149
|
+
if (!result.ok) {
|
|
150
|
+
return err(result.error);
|
|
151
|
+
}
|
|
152
|
+
diagnostics.push(...result.value.diagnostics);
|
|
153
|
+
return ok(result.value.layout);
|
|
154
|
+
},
|
|
131
155
|
});
|
|
132
156
|
if (!lowered.ok) {
|
|
133
|
-
|
|
157
|
+
diagnostics.push(lowered.error);
|
|
134
158
|
continue;
|
|
135
159
|
}
|
|
136
160
|
runningOffset = alignTo(runningOffset, lowered.value.alignment);
|
|
@@ -138,16 +162,14 @@ function lowerStruct(name, state, node) {
|
|
|
138
162
|
runningOffset += lowered.value.byteLength;
|
|
139
163
|
alignment = Math.max(alignment, lowered.value.alignment);
|
|
140
164
|
}
|
|
141
|
-
const layout = {
|
|
165
|
+
const layout = attachSourceLocation({
|
|
142
166
|
kind: "struct",
|
|
143
167
|
name,
|
|
144
168
|
fields,
|
|
145
169
|
alignment,
|
|
146
170
|
byteLength: alignTo(runningOffset, alignment),
|
|
147
171
|
endianness: state.endianness,
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
state.activeStack.delete(name);
|
|
151
|
-
return ok(layout);
|
|
172
|
+
}, sourceLocation(state.sourceFile, declaration.name));
|
|
173
|
+
return ok({ layout, diagnostics });
|
|
152
174
|
}
|
|
153
175
|
//# sourceMappingURL=analyzer.js.map
|
package/dist/analyzer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,OAAO,EAAsC,MAAM,sBAAsB,CAAC;AAEnF,OAAO,
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
export interface AstCheckedGeneratedSource {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly sourceFile: ts.SourceFile;
|
|
5
|
+
}
|
|
6
|
+
export declare function emitAstCheckedSource(sourceText: string, fileName: string): AstCheckedGeneratedSource;
|
|
7
|
+
export declare function emitSyntheticSource(sourceText: string, fileName: string): AstCheckedGeneratedSource;
|
|
8
|
+
//# sourceMappingURL=emitter-ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-ast.d.ts","sourceRoot":"","sources":["../src/emitter-ast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAM5B,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;CACpC;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,yBAAyB,CAiB3B;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,yBAAyB,CAW3B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
export function emitAstCheckedSource(sourceText, fileName) {
|
|
3
|
+
const sourceFile = ts.createSourceFile(fileName, sourceText, ts.ScriptTarget.ES2022, true, ts.ScriptKind.TS);
|
|
4
|
+
if (sourceFile.parseDiagnostics.length > 0) {
|
|
5
|
+
throw new Error(formatParseDiagnostics(sourceFile));
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
code: sourceText,
|
|
9
|
+
sourceFile,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function emitSyntheticSource(sourceText, fileName) {
|
|
13
|
+
const checked = emitAstCheckedSource(sourceText, fileName);
|
|
14
|
+
const printer = ts.createPrinter({
|
|
15
|
+
newLine: ts.NewLineKind.LineFeed,
|
|
16
|
+
removeComments: false,
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
code: `${printer.printFile(checked.sourceFile)}\n`,
|
|
20
|
+
sourceFile: checked.sourceFile,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function formatParseDiagnostics(sourceFile) {
|
|
24
|
+
const diagnostics = sourceFile.parseDiagnostics.map((diagnostic) => {
|
|
25
|
+
const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
|
|
26
|
+
if (diagnostic.start === undefined) {
|
|
27
|
+
return message;
|
|
28
|
+
}
|
|
29
|
+
const position = sourceFile.getLineAndCharacterOfPosition(diagnostic.start);
|
|
30
|
+
return `${sourceFile.fileName}:${position.line + 1}:${position.character + 1} ${message}`;
|
|
31
|
+
});
|
|
32
|
+
return `Generated TypeScript failed to parse:\n${diagnostics.join("\n")}`;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=emitter-ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-ast.js","sourceRoot":"","sources":["../src/emitter-ast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAW5B,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,QAAgB;IAEhB,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CACpC,QAAQ,EACR,UAAU,EACV,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,IAAI,EACJ,EAAE,CAAC,UAAU,CAAC,EAAE,CACG,CAAC;IAEtB,IAAI,UAAU,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,QAAgB;IAEhB,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC;QAC/B,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ;QAChC,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI;QAClD,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,UAA4B;IAC1D,MAAM,WAAW,GAAG,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACjE,MAAM,OAAO,GAAG,EAAE,CAAC,4BAA4B,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9E,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,6BAA6B,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO,GAAG,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,OAAO,0CAA0C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FieldLayout, StructLayout, VectorElementLayout } from "@exornea/zeno-schema";
|
|
2
|
+
export declare function hasTailWriterFields(layout: StructLayout, layoutMap: ReadonlyMap<string, StructLayout>): boolean;
|
|
3
|
+
export declare function isTailWriterField(field: FieldLayout, layoutMap: ReadonlyMap<string, StructLayout>): boolean;
|
|
4
|
+
export declare function canEmitObjectWriter(layout: StructLayout, layoutMap: ReadonlyMap<string, StructLayout>): boolean;
|
|
5
|
+
export declare function canWriteObjectField(field: FieldLayout, layoutMap: ReadonlyMap<string, StructLayout>): boolean;
|
|
6
|
+
export declare function canWriteStructVectorElement(element: VectorElementLayout, layoutMap: ReadonlyMap<string, StructLayout>): boolean;
|
|
7
|
+
export declare function structFieldHasTailFields(layoutMap: ReadonlyMap<string, StructLayout>, typeName: string): boolean;
|
|
8
|
+
//# sourceMappingURL=emitter-capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-capabilities.d.ts","sourceRoot":"","sources":["../src/emitter-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAI3F,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAET;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAkBT;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAET;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAqBT;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GAC3C,OAAO,CAaT;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,QAAQ,EAAE,MAAM,GACf,OAAO,CAGT"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { canWriteFixedArrayStructElement } from "./emitter-fixed-array.js";
|
|
2
|
+
export function hasTailWriterFields(layout, layoutMap) {
|
|
3
|
+
return layout.fields.some((field) => isTailWriterField(field, layoutMap));
|
|
4
|
+
}
|
|
5
|
+
export function isTailWriterField(field, layoutMap) {
|
|
6
|
+
switch (field.kind) {
|
|
7
|
+
case "dynamic-string":
|
|
8
|
+
case "dynamic-bytes":
|
|
9
|
+
return true;
|
|
10
|
+
case "vector":
|
|
11
|
+
return (field.element.kind === "scalar" ||
|
|
12
|
+
field.element.kind === "fixed-bytes" ||
|
|
13
|
+
field.element.kind === "fixed-string" ||
|
|
14
|
+
field.element.kind === "dynamic-string" ||
|
|
15
|
+
field.element.kind === "dynamic-bytes" ||
|
|
16
|
+
field.element.kind === "pointer" ||
|
|
17
|
+
canWriteStructVectorElement(field.element, layoutMap));
|
|
18
|
+
default:
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function canEmitObjectWriter(layout, layoutMap) {
|
|
23
|
+
return layout.fields.every((field) => canWriteObjectField(field, layoutMap));
|
|
24
|
+
}
|
|
25
|
+
export function canWriteObjectField(field, layoutMap) {
|
|
26
|
+
switch (field.kind) {
|
|
27
|
+
case "scalar":
|
|
28
|
+
case "fixed-bytes":
|
|
29
|
+
case "fixed-string":
|
|
30
|
+
case "dynamic-string":
|
|
31
|
+
case "dynamic-bytes":
|
|
32
|
+
case "struct":
|
|
33
|
+
case "pointer":
|
|
34
|
+
return true;
|
|
35
|
+
case "fixed-array":
|
|
36
|
+
return (field.element.kind !== "struct" ||
|
|
37
|
+
canWriteFixedArrayStructElement(field.element, layoutMap, hasTailWriterFields));
|
|
38
|
+
case "vector":
|
|
39
|
+
return ((field.element.kind !== "struct" && field.element.kind !== "dynamic-struct") ||
|
|
40
|
+
canWriteStructVectorElement(field.element, layoutMap));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function canWriteStructVectorElement(element, layoutMap) {
|
|
44
|
+
if (element.kind !== "struct" && element.kind !== "dynamic-struct") {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const elementLayout = layoutMap.get(element.typeName);
|
|
48
|
+
if (elementLayout === undefined) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return element.kind === "dynamic-struct"
|
|
52
|
+
? canEmitObjectWriter(elementLayout, layoutMap)
|
|
53
|
+
: !hasTailWriterFields(elementLayout, layoutMap);
|
|
54
|
+
}
|
|
55
|
+
export function structFieldHasTailFields(layoutMap, typeName) {
|
|
56
|
+
const layout = layoutMap.get(typeName);
|
|
57
|
+
return layout !== undefined && hasTailWriterFields(layout, layoutMap);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=emitter-capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-capabilities.js","sourceRoot":"","sources":["../src/emitter-capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-fields.d.ts","sourceRoot":"","sources":["../src/emitter-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAM9B,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CA2G5E"}
|