@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.
Files changed (70) hide show
  1. package/bin/zeno-codegen.mjs +79 -31
  2. package/bin/zeno-diff-layout.mjs +60 -0
  3. package/bin/zeno-inspect.mjs +67 -0
  4. package/dist/analyzer.d.ts.map +1 -1
  5. package/dist/analyzer.js +48 -26
  6. package/dist/analyzer.js.map +1 -1
  7. package/dist/emitter-ast.d.ts +8 -0
  8. package/dist/emitter-ast.d.ts.map +1 -0
  9. package/dist/emitter-ast.js +34 -0
  10. package/dist/emitter-ast.js.map +1 -0
  11. package/dist/emitter-capabilities.d.ts +8 -0
  12. package/dist/emitter-capabilities.d.ts.map +1 -0
  13. package/dist/emitter-capabilities.js +59 -0
  14. package/dist/emitter-capabilities.js.map +1 -0
  15. package/dist/emitter-fields.d.ts +3 -0
  16. package/dist/emitter-fields.d.ts.map +1 -0
  17. package/dist/emitter-fields.js +180 -0
  18. package/dist/emitter-fields.js.map +1 -0
  19. package/dist/emitter-input.d.ts +3 -0
  20. package/dist/emitter-input.d.ts.map +1 -0
  21. package/dist/emitter-input.js +45 -0
  22. package/dist/emitter-input.js.map +1 -0
  23. package/dist/emitter-names.d.ts +5 -0
  24. package/dist/emitter-names.d.ts.map +1 -0
  25. package/dist/emitter-names.js +10 -0
  26. package/dist/emitter-names.js.map +1 -0
  27. package/dist/emitter-runtime-imports.d.ts +3 -0
  28. package/dist/emitter-runtime-imports.d.ts.map +1 -0
  29. package/dist/emitter-runtime-imports.js +73 -0
  30. package/dist/emitter-runtime-imports.js.map +1 -0
  31. package/dist/emitter-scan-kernels.d.ts +10 -0
  32. package/dist/emitter-scan-kernels.d.ts.map +1 -0
  33. package/dist/emitter-scan-kernels.js +174 -0
  34. package/dist/emitter-scan-kernels.js.map +1 -0
  35. package/dist/emitter-static-accessors.d.ts +4 -0
  36. package/dist/emitter-static-accessors.d.ts.map +1 -0
  37. package/dist/emitter-static-accessors.js +114 -0
  38. package/dist/emitter-static-accessors.js.map +1 -0
  39. package/dist/emitter-template.d.ts +7 -0
  40. package/dist/emitter-template.d.ts.map +1 -1
  41. package/dist/emitter-template.js +8 -3
  42. package/dist/emitter-template.js.map +1 -1
  43. package/dist/emitter-writers.d.ts +4 -0
  44. package/dist/emitter-writers.d.ts.map +1 -0
  45. package/dist/emitter-writers.js +246 -0
  46. package/dist/emitter-writers.js.map +1 -0
  47. package/dist/emitter.d.ts +9 -1
  48. package/dist/emitter.d.ts.map +1 -1
  49. package/dist/emitter.js +31 -660
  50. package/dist/emitter.js.map +1 -1
  51. package/dist/index.d.ts +5 -2
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +5 -2
  54. package/dist/index.js.map +1 -1
  55. package/dist/layout-manifest.d.ts +37 -0
  56. package/dist/layout-manifest.d.ts.map +1 -0
  57. package/dist/layout-manifest.js +251 -0
  58. package/dist/layout-manifest.js.map +1 -0
  59. package/dist/lowering.d.ts +5 -2
  60. package/dist/lowering.d.ts.map +1 -1
  61. package/dist/lowering.js +86 -27
  62. package/dist/lowering.js.map +1 -1
  63. package/dist/source-map.d.ts +10 -0
  64. package/dist/source-map.d.ts.map +1 -0
  65. package/dist/source-map.js +371 -0
  66. package/dist/source-map.js.map +1 -0
  67. package/dist/validator.d.ts.map +1 -1
  68. package/dist/validator.js +34 -16
  69. package/dist/validator.js.map +1 -1
  70. package/package.json +5 -3
@@ -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 optimizeCursorOffsets = false;
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 = diagnosticsArg === undefined
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 = "Usage: zeno-codegen <input.ts> <output.view.ts> [--optimize-cursor-offsets experimental] [--endian=little|big] [--diagnostics=text|json]";
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(JSON.stringify({
25
- event: "Codegen_Failed",
26
- code,
27
- message,
28
- details,
29
- }, null, 2));
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 (const arg of args) {
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 === "--optimize-cursor-offsets") {
43
- optimizeCursorOffsets = true;
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
- "INVALID_ENDIANNESS",
72
- `Invalid endianness: ${endianness}. Expected "little" or "big".`,
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(`${formatDiagnosticLocation(diagnostic)} ${diagnostic.code}: ${diagnostic.message}`);
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
- await writeFile(
114
- path.resolve(outputPath),
115
- emitProjectionFile(result.layouts, { optimizeCursorOffsets }),
116
- "utf8",
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
+ }
@@ -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,EAEL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAM1B,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;AAWD,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,CAsBf"}
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, } from "./diagnostics.js";
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
- state.diagnostics.push(result.error);
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: [...state.diagnostics, ...validateLayouts(layouts)],
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(schemaStatementDiagnostic(sourceFile, statement, "import"));
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
- return createDiagnostic(sourceFile, node, "UNSUPPORTED_SCHEMA_STATEMENT", "Zeno schema files only support type-only imports plus interface/type declarations.", {
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 (state.activeStack.has(name)) {
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
- state.activeStack.add(name);
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
- state.diagnostics.push(createDiagnostic(state.sourceFile, member, "UNSUPPORTED_MEMBER", `Struct "${name}" only supports property signatures.`, {
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) => lowerStruct(refName, state, 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
- state.diagnostics.push(lowered.error);
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
- state.layouts.set(name, layout);
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
@@ -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,EACL,gBAAgB,GAEjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAoBjD,MAAM,UAAU,qBAAqB,CACnC,QAAgC,EAChC,UAAyB,EACzB,UAA0B,EAAE;IAE5B,OAAO,2BAA2B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,UAAyB,EACzB,UAA0B,EAAE;IAE5B,MAAM,KAAK,GAAkB;QAC3B,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,QAAQ;QAC1C,YAAY,EAAE,4BAA4B,CAAC,UAAU,CAAC;QACtD,OAAO,EAAE,IAAI,GAAG,EAAwB;QACxC,WAAW,EAAE,oBAAoB,CAAC,UAAU,CAAC;QAC7C,WAAW,EAAE,IAAI,GAAG,EAAU;KAC/B,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,OAAO;QACL,OAAO;QACP,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CACnC,UAAyB;IAEzB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmC,CAAC;IAEhE,UAAU,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAyB;IACrD,MAAM,WAAW,GAAuB,EAAE,CAAC;IAE3C,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxC,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC/E,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjF,SAAS;QACX,CAAC;QAED,IAAI,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,SAAS;QACX,CAAC;QAED,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,uBAAuB,CAAC,SAA+B;IAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;IAC5C,OAAO,YAAY,EAAE,UAAU,KAAK,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,yBAAyB,CAChC,UAAyB,EACzB,IAAa,EACb,SAAiB;IAEjB,OAAO,gBAAgB,CACrB,UAAU,EACV,IAAI,EACJ,8BAA8B,EAC9B,oFAAoF,EACpF;QACE,WAAW,EAAE,OAAO,CAAC,UAAU,SAAS,EAAE,EAAE,mBAAmB,EAAE,SAAS,CAAC;QAC3E,KAAK,EAAE,kBAAkB,CAAC,UAAU,SAAS,EAAE,EAAE,SAAS,CAAC;KAC5D,CACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,SAAuB;IAC5C,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,IAAI,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,IAAI,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1E,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,OAAO,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAClB,IAAY,EACZ,KAAoB,EACpB,IAAa;IAEb,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,GAAG,CACR,gBAAgB,CACd,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,gBAAgB,EAChB,wBAAwB,IAAI,IAAI,EAChC;YACE,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,kBAAkB,CAAC,mBAAmB,IAAI,GAAG,EAAE,SAAS,CAAC;SACjE,CACF,CACF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,CACR,gBAAgB,CACd,KAAK,CAAC,UAAU,EAChB,WAAW,CAAC,IAAI,EAChB,kBAAkB,EAClB,qBAAqB,IAAI,yBAAyB,EAClD;YACE,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,kBAAkB,CAAC,qBAAqB,IAAI,GAAG,EAAE,SAAS,CAAC;SACnE,CACF,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAE5B,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,WAAW,CAAC,IAAI,CACpB,gBAAgB,CACd,KAAK,CAAC,UAAU,EAChB,MAAM,EACN,oBAAoB,EACpB,WAAW,IAAI,sCAAsC,EACrD;gBACE,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC;aACvE,CACF,CACF,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE;YACjC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;SAC9E,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtC,SAAS;QACX,CAAC;QAED,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAChD,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1C,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAiB;QAC3B,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,MAAM;QACN,SAAS;QACT,UAAU,EAAE,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC;QAC7C,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC"}
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,3 @@
1
+ import { type FieldLayout, type StructLayout } from "@exornea/zeno-schema";
2
+ export declare function emitField(layout: StructLayout, field: FieldLayout): string[];
3
+ //# sourceMappingURL=emitter-fields.d.ts.map
@@ -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"}