semantifold 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +71 -0
  3. package/build/index.d.ts +54 -0
  4. package/build/index.d.ts.map +1 -0
  5. package/build/index.js +45 -0
  6. package/build/src/backends/identifiers.d.ts +19 -0
  7. package/build/src/backends/identifiers.d.ts.map +1 -0
  8. package/build/src/backends/identifiers.js +93 -0
  9. package/build/src/backends/index.d.ts +35 -0
  10. package/build/src/backends/index.d.ts.map +1 -0
  11. package/build/src/backends/index.js +149 -0
  12. package/build/src/backends/java.d.ts +8 -0
  13. package/build/src/backends/java.d.ts.map +1 -0
  14. package/build/src/backends/java.js +172 -0
  15. package/build/src/backends/javascript.d.ts +8 -0
  16. package/build/src/backends/javascript.d.ts.map +1 -0
  17. package/build/src/backends/javascript.js +173 -0
  18. package/build/src/backends/php.d.ts +8 -0
  19. package/build/src/backends/php.d.ts.map +1 -0
  20. package/build/src/backends/php.js +175 -0
  21. package/build/src/backends/ruby.d.ts +8 -0
  22. package/build/src/backends/ruby.d.ts.map +1 -0
  23. package/build/src/backends/ruby.js +155 -0
  24. package/build/src/backends/scalars.d.ts +15 -0
  25. package/build/src/backends/scalars.d.ts.map +1 -0
  26. package/build/src/backends/scalars.js +138 -0
  27. package/build/src/backends/shared.d.ts +26 -0
  28. package/build/src/backends/shared.d.ts.map +1 -0
  29. package/build/src/backends/shared.js +424 -0
  30. package/build/src/backends/typescript.d.ts +8 -0
  31. package/build/src/backends/typescript.d.ts.map +1 -0
  32. package/build/src/backends/typescript.js +160 -0
  33. package/build/src/backends/writer.d.ts +87 -0
  34. package/build/src/backends/writer.d.ts.map +1 -0
  35. package/build/src/backends/writer.js +207 -0
  36. package/build/src/diagnostic.d.ts +67 -0
  37. package/build/src/diagnostic.d.ts.map +1 -0
  38. package/build/src/diagnostic.js +96 -0
  39. package/build/src/frontends/index.d.ts +14 -0
  40. package/build/src/frontends/index.d.ts.map +1 -0
  41. package/build/src/frontends/index.js +36 -0
  42. package/build/src/frontends/java.d.ts +12 -0
  43. package/build/src/frontends/java.d.ts.map +1 -0
  44. package/build/src/frontends/java.js +630 -0
  45. package/build/src/frontends/javascript-typescript.d.ts +19 -0
  46. package/build/src/frontends/javascript-typescript.d.ts.map +1 -0
  47. package/build/src/frontends/javascript-typescript.js +633 -0
  48. package/build/src/frontends/php.d.ts +12 -0
  49. package/build/src/frontends/php.d.ts.map +1 -0
  50. package/build/src/frontends/php.js +523 -0
  51. package/build/src/frontends/ruby.d.ts +12 -0
  52. package/build/src/frontends/ruby.d.ts.map +1 -0
  53. package/build/src/frontends/ruby.js +515 -0
  54. package/build/src/frontends/scalars.d.ts +19 -0
  55. package/build/src/frontends/scalars.d.ts.map +1 -0
  56. package/build/src/frontends/scalars.js +71 -0
  57. package/build/src/mapping.d.ts +160 -0
  58. package/build/src/mapping.d.ts.map +1 -0
  59. package/build/src/mapping.js +1120 -0
  60. package/build/src/semantic/location.d.ts +61 -0
  61. package/build/src/semantic/location.d.ts.map +1 -0
  62. package/build/src/semantic/location.js +142 -0
  63. package/build/src/semantic/operators.d.ts +16 -0
  64. package/build/src/semantic/operators.d.ts.map +1 -0
  65. package/build/src/semantic/operators.js +24 -0
  66. package/build/src/semantic/provenance.d.ts +74 -0
  67. package/build/src/semantic/provenance.d.ts.map +1 -0
  68. package/build/src/semantic/provenance.js +577 -0
  69. package/build/src/semantic/scalars.d.ts +19 -0
  70. package/build/src/semantic/scalars.d.ts.map +1 -0
  71. package/build/src/semantic/scalars.js +40 -0
  72. package/build/src/semantic/types.d.ts +1003 -0
  73. package/build/src/semantic/types.d.ts.map +1 -0
  74. package/build/src/semantic/types.js +279 -0
  75. package/build/src/semantic/validate.d.ts +60 -0
  76. package/build/src/semantic/validate.d.ts.map +1 -0
  77. package/build/src/semantic/validate.js +472 -0
  78. package/docs/architecture.md +39 -0
  79. package/docs/coding-standards.md +7 -0
  80. package/docs/goals.md +7 -0
  81. package/docs/language-support.md +69 -0
  82. package/docs/plans/2026-09-02-initial-toolchain.md +54 -0
  83. package/docs/source-maps.md +134 -0
  84. package/docs/testing.md +25 -0
  85. package/index.js +63 -0
  86. package/package.json +69 -0
  87. package/src/backends/identifiers.js +101 -0
  88. package/src/backends/index.js +159 -0
  89. package/src/backends/java.js +182 -0
  90. package/src/backends/javascript.js +184 -0
  91. package/src/backends/php.js +184 -0
  92. package/src/backends/ruby.js +163 -0
  93. package/src/backends/scalars.js +120 -0
  94. package/src/backends/shared.js +456 -0
  95. package/src/backends/typescript.js +168 -0
  96. package/src/backends/writer.js +224 -0
  97. package/src/diagnostic.js +103 -0
  98. package/src/frontends/index.js +36 -0
  99. package/src/frontends/java.js +735 -0
  100. package/src/frontends/javascript-typescript.js +718 -0
  101. package/src/frontends/php.js +593 -0
  102. package/src/frontends/ruby.js +622 -0
  103. package/src/frontends/scalars.js +77 -0
  104. package/src/mapping.js +1260 -0
  105. package/src/semantic/location.js +154 -0
  106. package/src/semantic/operators.js +28 -0
  107. package/src/semantic/provenance.js +629 -0
  108. package/src/semantic/scalars.js +44 -0
  109. package/src/semantic/types.js +319 -0
  110. package/src/semantic/validate.js +529 -0
  111. package/tsconfig.json +16 -0
@@ -0,0 +1,160 @@
1
+ // @ts-check
2
+ import { emitExpression, requiresCanonicalZeroRendering } from "./shared.js";
3
+ import { emitScalarType } from "./scalars.js";
4
+ /**
5
+ * Emits an independently executable TypeScript program through the source-aware writer.
6
+ * @param {import("../semantic/types.js").SemanticModule} module - Semantic module.
7
+ * @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
8
+ * @returns {void}
9
+ */
10
+ export function generateTypeScript(module, writer) {
11
+ const canonicalizeZero = requiresCanonicalZeroRendering(module);
12
+ module.functions.forEach((declaration, functionIndex) => {
13
+ if (functionIndex > 0)
14
+ writer.synthetic("\n\n", "declaration separator", [declaration]);
15
+ writer.mapped("function", { mappingKind: "anchor", node: declaration });
16
+ writer.synthetic(" ", "function spacing", [declaration]);
17
+ writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, role: "name" });
18
+ writer.mapped("(", { mappingKind: "anchor", node: declaration });
19
+ declaration.parameters.forEach((parameter, index) => {
20
+ const parameterPath = `/functions/${functionIndex}/parameters/${index}`;
21
+ if (index > 0)
22
+ writer.synthetic(", ", "parameter separator", [declaration]);
23
+ writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
24
+ writer.synthetic(": ", "type separator", [parameter], [parameterPath]);
25
+ writer.mapped(emitScalarType("typescript", parameter.type), {
26
+ mappingKind: "exact",
27
+ node: parameter.type,
28
+ path: `${parameterPath}/type`,
29
+ role: "type"
30
+ });
31
+ });
32
+ writer.mapped(")", { mappingKind: "anchor", node: declaration });
33
+ writer.synthetic(": ", "return type separator", [declaration]);
34
+ writer.mapped(emitScalarType("typescript", declaration.returnType), {
35
+ mappingKind: "exact",
36
+ node: declaration.returnType,
37
+ path: `/functions/${functionIndex}/returnType`,
38
+ role: "type"
39
+ });
40
+ writer.synthetic(" ", "function spacing", [declaration]);
41
+ writer.mapped("{", { mappingKind: "anchor", node: declaration });
42
+ writer.synthetic("\n", "line break", [declaration]);
43
+ emitBlock(writer, declaration.body, " ", `/functions/${functionIndex}/body`, canonicalizeZero);
44
+ writer.mapped("}", { mappingKind: "anchor", node: declaration });
45
+ });
46
+ writer.synthetic("\n\n", "entry-point separator", [module.entryPoint]);
47
+ emitBlock(writer, module.entryPoint.body, "", "/entryPoint/body", canonicalizeZero);
48
+ }
49
+ /**
50
+ * Emits one ordered TypeScript block body.
51
+ * @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
52
+ * @param {import("../semantic/types.js").Block} block - Semantic block.
53
+ * @param {string} indent - Indentation.
54
+ * @param {string} path - Exact block path.
55
+ * @param {boolean} canonicalizeZero - Whether printed integer zero must be canonicalized.
56
+ * @returns {void}
57
+ */
58
+ function emitBlock(writer, block, indent, path, canonicalizeZero) {
59
+ block.statements.forEach((statement, index) => emitStatement(writer, statement, indent, `${path}/statements/${index}`, canonicalizeZero));
60
+ }
61
+ /**
62
+ * Emits one TypeScript statement.
63
+ * @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
64
+ * @param {import("../semantic/types.js").Statement} statement - Semantic statement.
65
+ * @param {string} indent - Indentation.
66
+ * @param {string} path - Exact statement path.
67
+ * @param {boolean} canonicalizeZero - Whether printed integer zero must be canonicalized.
68
+ * @returns {void}
69
+ */
70
+ function emitStatement(writer, statement, indent, path, canonicalizeZero) {
71
+ if (statement.kind == "LocalDeclaration" || statement.kind == "AssignmentStatement") {
72
+ emitLocal(writer, statement, indent, path);
73
+ writer.synthetic("\n", "line break", [statement], [path]);
74
+ return;
75
+ }
76
+ writer.synthetic(indent, "indentation", [statement], [path]);
77
+ if (statement.kind == "ReturnStatement") {
78
+ writer.mapped("return", { mappingKind: "anchor", node: statement, path });
79
+ writer.synthetic(" ", "return spacing", [statement], [path]);
80
+ emitExpression(writer, statement.expression, `${path}/expression`, "typescript", identity);
81
+ writer.synthetic("\n", "line break", [statement], [path]);
82
+ return;
83
+ }
84
+ if (statement.kind == "PrintStatement") {
85
+ writer.mapped("console.log", { mappingKind: "anchor", node: statement, path });
86
+ writer.mapped("(", { mappingKind: "anchor", node: statement, path });
87
+ if (canonicalizeZero)
88
+ writer.synthetic("(", "canonical integer output", [statement], [path]);
89
+ emitExpression(writer, statement.expression, `${path}/expression`, "typescript", identity);
90
+ if (canonicalizeZero)
91
+ writer.synthetic(").toString()", "canonical integer output", [statement], [path]);
92
+ writer.mapped(")", { mappingKind: "anchor", node: statement, path });
93
+ writer.synthetic("\n", "line break", [statement], [path]);
94
+ return;
95
+ }
96
+ writer.mapped("if", { mappingKind: "anchor", node: statement, path });
97
+ writer.synthetic(" ", "conditional spacing", [statement], [path]);
98
+ writer.mapped("(", { mappingKind: "anchor", node: statement, path });
99
+ emitExpression(writer, statement.condition, `${path}/condition`, "typescript", identity);
100
+ writer.mapped(")", { mappingKind: "anchor", node: statement, path });
101
+ writer.synthetic(" ", "conditional spacing", [statement], [path]);
102
+ writer.mapped("{", { mappingKind: "anchor", node: statement.consequent, path: `${path}/consequent` });
103
+ writer.synthetic("\n", "line break", [statement], [path]);
104
+ emitBlock(writer, statement.consequent, `${indent} `, `${path}/consequent`, canonicalizeZero);
105
+ writer.synthetic(indent, "indentation", [statement], [path]);
106
+ writer.mapped("}", { mappingKind: "anchor", node: statement.consequent, path: `${path}/consequent` });
107
+ if (statement.alternate) {
108
+ writer.synthetic(" ", "conditional spacing", [statement], [path]);
109
+ writer.mapped("else", { mappingKind: "anchor", node: statement, path });
110
+ writer.synthetic(" ", "conditional spacing", [statement], [path]);
111
+ writer.mapped("{", { mappingKind: "anchor", node: statement.alternate, path: `${path}/alternate` });
112
+ writer.synthetic("\n", "line break", [statement], [path]);
113
+ emitBlock(writer, statement.alternate, `${indent} `, `${path}/alternate`, canonicalizeZero);
114
+ writer.synthetic(indent, "indentation", [statement], [path]);
115
+ writer.mapped("}", { mappingKind: "anchor", node: statement.alternate, path: `${path}/alternate` });
116
+ }
117
+ writer.synthetic("\n", "line break", [statement], [path]);
118
+ }
119
+ /**
120
+ * Emits one TypeScript local statement.
121
+ * @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
122
+ * @param {import("../semantic/types.js").LocalStatement} statement - Local statement.
123
+ * @param {string} indent - Leading indentation.
124
+ * @param {string} statementPath - Exact JSON Pointer for this statement occurrence.
125
+ * @returns {void}
126
+ */
127
+ function emitLocal(writer, statement, indent, statementPath) {
128
+ writer.synthetic(indent, "indentation", [statement], [statementPath]);
129
+ if (statement.kind == "AssignmentStatement") {
130
+ writer.mapped(statement.target.name, { mappingKind: "exact", node: statement.target, path: `${statementPath}/target`, role: "name" });
131
+ writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
132
+ writer.mapped("=", { mappingKind: "exact", node: statement, path: statementPath, role: "operator" });
133
+ writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
134
+ emitExpression(writer, statement.expression, `${statementPath}/expression`, "typescript", identity);
135
+ return;
136
+ }
137
+ writer.mapped(statement.mutable ? "let" : "const", { mappingKind: "anchor", node: statement, path: statementPath });
138
+ writer.synthetic(" ", "declaration spacing", [statement], [statementPath]);
139
+ writer.mapped(statement.name, { mappingKind: "exact", node: statement, path: statementPath, role: "name" });
140
+ writer.synthetic(": ", "type separator", [statement], [statementPath]);
141
+ writer.mapped(emitScalarType("typescript", statement.type), {
142
+ mappingKind: "exact",
143
+ node: statement.type,
144
+ path: `${statementPath}/type`,
145
+ role: "type"
146
+ });
147
+ writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
148
+ writer.mapped("=", { mappingKind: "exact", node: statement, path: statementPath, role: "operator" });
149
+ writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
150
+ emitExpression(writer, statement.initializer, `${statementPath}/initializer`, "typescript", identity);
151
+ }
152
+ /**
153
+ * Returns an unchanged TypeScript identifier.
154
+ * @param {string} name - Identifier.
155
+ * @returns {string} Identifier.
156
+ */
157
+ function identity(name) {
158
+ return name;
159
+ }
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy90eXBlc2NyaXB0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsY0FBYyxFQUFFLDhCQUE4QixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU07SUFDL0MsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUvRCxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRTtRQUN0RCxJQUFJLGFBQWEsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRXZGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUNyRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUM5RCxXQUFXLENBQUMsVUFBVSxDQUFD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QUFDLENBQUE7SUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUNsRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN6RSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxhQUFhLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDdkcsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxJQUFJO0lBQ3BCLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2VtaXRFeHByZXNzaW9uLCByZXF1aXJlc0Nhbm9uaWNhbFplcm9SZW5kZXJpbmd9IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge2VtaXRTY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcblxuLyoqXG4gKiBFbWl0cyBhbiBpbmRlcGVuZGVudGx5IGV4ZWN1dGFibGUgVHlwZVNjcmlwdCBwcm9ncmFtIHRocm91Z2ggdGhlIHNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlU2NyaXB0KG1vZHVsZSwgd3JpdGVyKSB7XG4gIGNvbnN0IGNhbm9uaWNhbGl6ZVplcm8gPSByZXF1aXJlc0Nhbm9uaWNhbFplcm9SZW5kZXJpbmcobW9kdWxlKVxuXG4gIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGZ1bmN0aW9uSW5kZXgpID0+IHtcbiAgICBpZiAoZnVuY3Rpb25JbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSlcblxuICAgIHdyaXRlci5tYXBwZWQoXCJmdW5jdGlvblwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImZ1bmN0aW9uIHNwYWNpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5tYXBwZWQoXCIoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcGFyYW1ldGVycy8ke2luZGV4fWBcblxuICAgICAgaWYgKGluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwicGFyYW1ldGVyIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIjogXCIsIFwidHlwZSBzZXBhcmF0b3JcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICAgIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJ0eXBlc2NyaXB0XCIsIHBhcmFtZXRlci50eXBlKSwge1xuICAgICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgICAgICBub2RlOiBwYXJhbWV0ZXIudHlwZSxcbiAgICAgICAgcGF0aDogYCR7cGFyYW1ldGVyUGF0aH0vdHlwZWAsXG4gICAgICAgIHJvbGU6IFwidHlwZVwiXG4gICAgICB9KVxuICAgIH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIjogXCIsIFwicmV0dXJuIHR5cGUgc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgd3JpdGVyLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcInR5cGVzY3JpcHRcIiwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSksIHtcbiAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgICBub2RlOiBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLFxuICAgICAgcGF0aDogYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9yZXR1cm5UeXBlYCxcbiAgICAgIHJvbGU6IFwidHlwZVwiXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImZ1bmN0aW9uIHNwYWNpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dKVxuXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgZGVjbGFyYXRpb24uYm9keSwgXCIgIFwiLCBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L2JvZHlgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICB9KVxuXG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJlbnRyeS1wb2ludCBzZXBhcmF0b3JcIiwgW21vZHVsZS5lbnRyeVBvaW50XSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgbW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCJcIiwgXCIvZW50cnlQb2ludC9ib2R5XCIsIGNhbm9uaWNhbGl6ZVplcm8pXG59XG5cbi8qKlxuICogRW1pdHMgb25lIG9yZGVyZWQgVHlwZVNjcmlwdCBibG9jayBib2R5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBFeGFjdCBibG9jayBwYXRoLlxuICogQHBhcmFtIHtib29sZWFufSBjYW5vbmljYWxpemVaZXJvIC0gV2hldGhlciBwcmludGVkIGludGVnZXIgemVybyBtdXN0IGJlIGNhbm9uaWNhbGl6ZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdEJsb2NrKHdyaXRlciwgYmxvY2ssIGluZGVudCwgcGF0aCwgY2Fub25pY2FsaXplWmVybykge1xuICBibG9jay5zdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCwgaW5kZXgpID0+IGVtaXRTdGF0ZW1lbnQod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgYCR7cGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWAsIGNhbm9uaWNhbGl6ZVplcm8pKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBUeXBlU2NyaXB0IHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFNlbWFudGljIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBJbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhhY3Qgc3RhdGVtZW50IHBhdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNhbm9uaWNhbGl6ZVplcm8gLSBXaGV0aGVyIHByaW50ZWQgaW50ZWdlciB6ZXJvIG11c3QgYmUgY2Fub25pY2FsaXplZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0U3RhdGVtZW50KHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHBhdGgsIGNhbm9uaWNhbGl6ZVplcm8pIHtcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgZW1pdExvY2FsKHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHBhdGgpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJyZXR1cm5cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwicmV0dXJuIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJjb25zb2xlLmxvZ1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIGlmIChjYW5vbmljYWxpemVaZXJvKSB3cml0ZXIuc3ludGhldGljKFwiKFwiLCBcImNhbm9uaWNhbCBpbnRlZ2VyIG91dHB1dFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcInR5cGVzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgaWYgKGNhbm9uaWNhbGl6ZVplcm8pIHdyaXRlci5zeW50aGV0aWMoXCIpLnRvU3RyaW5nKClcIiwgXCJjYW5vbmljYWwgaW50ZWdlciBvdXRwdXRcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICB3cml0ZXIubWFwcGVkKFwiaWZcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5jb25kaXRpb24sIGAke3BhdGh9L2NvbmRpdGlvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuY29uc2VxdWVudCwgcGF0aDogYCR7cGF0aH0vY29uc2VxdWVudGB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY29uc2VxdWVudCwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vY29uc2VxdWVudGAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNvbnNlcXVlbnQsIHBhdGg6IGAke3BhdGh9L2NvbnNlcXVlbnRgfSlcbiAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZWxzZVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBwYXRoOiBgJHtwYXRofS9hbHRlcm5hdGVgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5hbHRlcm5hdGUsIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2FsdGVybmF0ZWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5hbHRlcm5hdGUsIHBhdGg6IGAke3BhdGh9L2FsdGVybmF0ZWB9KVxuICB9XG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG59XG5cbi8qKlxuICogRW1pdHMgb25lIFR5cGVTY3JpcHQgbG9jYWwgc3RhdGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBMb2NhbCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gTGVhZGluZyBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZW1lbnRQYXRoIC0gRXhhY3QgSlNPTiBQb2ludGVyIGZvciB0aGlzIHN0YXRlbWVudCBvY2N1cnJlbmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBzdGF0ZW1lbnRQYXRoKSB7XG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG5cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudGFyZ2V0LCBwYXRoOiBgJHtzdGF0ZW1lbnRQYXRofS90YXJnZXRgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiPVwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm9wZXJhdG9yXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50Lm11dGFibGUgPyBcImxldFwiIDogXCJjb25zdFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcInR5cGUgc2VwYXJhdG9yXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJ0eXBlc2NyaXB0XCIsIHN0YXRlbWVudC50eXBlKSwge1xuICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgbm9kZTogc3RhdGVtZW50LnR5cGUsXG4gICAgcGF0aDogYCR7c3RhdGVtZW50UGF0aH0vdHlwZWAsXG4gICAgcm9sZTogXCJ0eXBlXCJcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGAke3N0YXRlbWVudFBhdGh9L2luaXRpYWxpemVyYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gdW5jaGFuZ2VkIFR5cGVTY3JpcHQgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gSWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IElkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KG5hbWUpIHtcbiAgcmV0dXJuIG5hbWVcbn1cbiJdfQ==
@@ -0,0 +1,87 @@
1
+ /** Source-aware deterministic generated-output builder. */
2
+ export declare class SourceWriter {
3
+ #private;
4
+ filename: string;
5
+ language: import("../semantic/types.js").SemanticLanguage;
6
+ index: {
7
+ provenance: import("../semantic/types.js").SemanticProvenance;
8
+ recordFor: (node: import("../semantic/types.js").SemanticNode, path?: string) => import("../semantic/types.js").SemanticNodeProvenance;
9
+ };
10
+ /** @type {string[]} */
11
+ parts: string[];
12
+ /** @type {import("../semantic/types.js").SemantifoldMappingSpan[]} */
13
+ spans: import("../semantic/types.js").SemantifoldMappingSpan[];
14
+ offset: number;
15
+ line: number;
16
+ column: number;
17
+ /**
18
+ * Creates a source-aware writer.
19
+ * @param {object} options - Writer options.
20
+ * @param {string} options.filename - Output filename.
21
+ * @param {import("../semantic/types.js").SemanticLanguage} options.language - Output language.
22
+ * @param {import("../semantic/types.js").SemanticModule} options.module - Semantic module.
23
+ * @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [options.sources] - Caller-provided sources.
24
+ */
25
+ constructor({ filename, language, module, sources }: {
26
+ filename: string;
27
+ language: import("../semantic/types.js").SemanticLanguage;
28
+ module: import("../semantic/types.js").SemanticModule;
29
+ sources?: {
30
+ filename: string;
31
+ content: string;
32
+ language?: import("../semantic/types.js").SemanticLanguage;
33
+ }[];
34
+ });
35
+ /**
36
+ * Returns generated content so far.
37
+ * @returns {string} Generated content.
38
+ */
39
+ get code(): string;
40
+ /**
41
+ * Returns the current JSON Pointer for one unambiguous semantic occurrence.
42
+ * @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
43
+ * @returns {string} Current occurrence path.
44
+ */
45
+ occurrencePath(node: import("../semantic/types.js").SemanticNode): string;
46
+ /**
47
+ * Reports whether an exact parser-owned role range is available.
48
+ * @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
49
+ * @param {string} path - JSON Pointer for a shared node occurrence.
50
+ * @param {string} role - Semantic token role.
51
+ * @returns {boolean} Whether the role has an exact source range.
52
+ */
53
+ hasRange(node: import("../semantic/types.js").SemanticNode, path: string, role: string): boolean;
54
+ /**
55
+ * Writes text mapped to a semantic node.
56
+ * @param {string} text - Generated text.
57
+ * @param {object} annotation - Mapping annotation.
58
+ * @param {import("../semantic/types.js").SemanticNode} annotation.node - Semantic node.
59
+ * @param {"exact" | "anchor"} annotation.mappingKind - Mapping precision.
60
+ * @param {string} [annotation.role] - Semantic token role.
61
+ * @param {string} [annotation.name] - Source Map name.
62
+ * @param {string} [annotation.path] - JSON Pointer for a shared node occurrence.
63
+ * @returns {void}
64
+ */
65
+ mapped(text: string, { mappingKind, name, node, path, role }: {
66
+ node: import("../semantic/types.js").SemanticNode;
67
+ mappingKind: "exact" | "anchor";
68
+ role?: string;
69
+ name?: string;
70
+ path?: string;
71
+ }): void;
72
+ /**
73
+ * Writes source-free scaffolding with optional semantic context.
74
+ * @param {string} text - Generated text.
75
+ * @param {string} reason - Stable reason.
76
+ * @param {import("../semantic/types.js").SemanticNode[]} [relatedNodes] - Related nodes.
77
+ * @param {(string | undefined)[]} [relatedPaths] - Occurrence paths for shared related nodes.
78
+ * @returns {void}
79
+ */
80
+ synthetic(text: string, reason: string, relatedNodes?: import("../semantic/types.js").SemanticNode[], relatedPaths?: (string | undefined)[]): void;
81
+ /**
82
+ * Returns the authoritative rich map for the current content.
83
+ * @returns {import("../semantic/types.js").SemantifoldMapping} Mapping.
84
+ */
85
+ finish(): import("../semantic/types.js").SemantifoldMapping;
86
+ }
87
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/backends/writer.js"],"names":[],"mappings":"AAIA,2DAA2D;AAC3D,qBAAa,YAAY;;IAYhB,QAAQ;IACR,QAAQ;IACR,KAAK;;;;IACV,uBAAuB;IAClB,KAAK,EADC,MAAM,EAAE;IAEnB,sEAAsE;IACjE,KAAK,EADC,OAAO,sBAAsB,EAAE,sBAAsB,EAAE;IAE7D,MAAM;IACN,IAAI;IACJ,MAAM;IApBb;;;;;;;OAOG;IACH,YAAY,EAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAC,EAL9C;QAAwB,QAAQ,EAAxB,MAAM,CACd;QAAiE,QAAQ,EAAjE,OAAO,sBAAsB,EAAE,gBAAgB,CACvD;QAA+D,MAAM,EAA7D,OAAO,sBAAsB,EAAE,cAAc,CACrD;QAAoH,OAAO,AAA3H,CACF,EADU;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;SAAC,EAAE,CAC3G;KACgD,EAahD;IAED;;;OAGG;IACH,IAAI,IAAI,IAFK,MAAM,CAIlB;IAED;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAHR,OAAO,sBAAsB,EAAE,YAGvB,GAFN,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EALF,OAAO,sBAAsB,EAAE,YAK7B,EAAE,IAAI,EAJR,MAIQ,EAAE,IAAI,EAHd,MAGc,GAFZ,OAAO,CAInB;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,IAAI,EATA,MASA,EAAE,EAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,EAP/C;QAAgE,IAAI,EAA5D,OAAO,sBAAsB,EAAE,YAAY,CACnD;QAAuC,WAAW,EAA1C,OAAO,GAAG,QAAQ,CAC1B;QAA4B,IAAI,AAAhC,CACA,EADQ,MAAM,CACd;QAA4B,IAAI,AAAhC,CACA,EADQ,MAAM,CACd;QAA4B,IAAI,AAAhC,CACA,EADQ,MAAM,CACd;KAE+C,GAFrC,IAAI,CAqBhB;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,IAAI,EANH,MAMG,EAAE,MAAM,EALX,MAKW,EAAE,YAAY,AAJjC,CACA,EADQ,OAAO,sBAAsB,EAAE,YAAY,EAIb,EAAE,YAAY,AAHpD,CACA,EADQ,CAAC,MAAM,GAAG,SAAS,CAAC,EAG6B,GAF/C,IAAI,CA0BhB;IAED;;;OAGG;IACH,MAAM,IAFO,OAAO,sBAAsB,EAAE,kBAAkB,CAa7D;CAwDF"}
@@ -0,0 +1,207 @@
1
+ // @ts-check
2
+ import { createGenerationIndex } from "../semantic/provenance.js";
3
+ /** Source-aware deterministic generated-output builder. */
4
+ export class SourceWriter {
5
+ /**
6
+ * Creates a source-aware writer.
7
+ * @param {object} options - Writer options.
8
+ * @param {string} options.filename - Output filename.
9
+ * @param {import("../semantic/types.js").SemanticLanguage} options.language - Output language.
10
+ * @param {import("../semantic/types.js").SemanticModule} options.module - Semantic module.
11
+ * @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [options.sources] - Caller-provided sources.
12
+ */
13
+ constructor({ filename, language, module, sources }) {
14
+ const index = createGenerationIndex(module, sources);
15
+ this.filename = filename;
16
+ this.language = language;
17
+ this.index = index;
18
+ /** @type {string[]} */
19
+ this.parts = [];
20
+ /** @type {import("../semantic/types.js").SemantifoldMappingSpan[]} */
21
+ this.spans = [];
22
+ this.offset = 0;
23
+ this.line = 1;
24
+ this.column = 1;
25
+ }
26
+ /**
27
+ * Returns generated content so far.
28
+ * @returns {string} Generated content.
29
+ */
30
+ get code() {
31
+ return this.parts.join("");
32
+ }
33
+ /**
34
+ * Returns the current JSON Pointer for one unambiguous semantic occurrence.
35
+ * @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
36
+ * @returns {string} Current occurrence path.
37
+ */
38
+ occurrencePath(node) {
39
+ return this.index.recordFor(node).path;
40
+ }
41
+ /**
42
+ * Reports whether an exact parser-owned role range is available.
43
+ * @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
44
+ * @param {string} path - JSON Pointer for a shared node occurrence.
45
+ * @param {string} role - Semantic token role.
46
+ * @returns {boolean} Whether the role has an exact source range.
47
+ */
48
+ hasRange(node, path, role) {
49
+ return this.index.recordFor(node, path).ranges[role] !== undefined;
50
+ }
51
+ /**
52
+ * Writes text mapped to a semantic node.
53
+ * @param {string} text - Generated text.
54
+ * @param {object} annotation - Mapping annotation.
55
+ * @param {import("../semantic/types.js").SemanticNode} annotation.node - Semantic node.
56
+ * @param {"exact" | "anchor"} annotation.mappingKind - Mapping precision.
57
+ * @param {string} [annotation.role] - Semantic token role.
58
+ * @param {string} [annotation.name] - Source Map name.
59
+ * @param {string} [annotation.path] - JSON Pointer for a shared node occurrence.
60
+ * @returns {void}
61
+ */
62
+ mapped(text, { mappingKind, name, node, path, role }) {
63
+ if (text.length == 0)
64
+ return;
65
+ const record = this.index.recordFor(node, path);
66
+ const roleLocation = role ? record.ranges[role] : undefined;
67
+ const origin = roleLocation ? this.#sourceOrigin(roleLocation, record.origin) : record.origin;
68
+ const precision = mappingKind == "exact" && role && !roleLocation ? "anchor" : mappingKind;
69
+ const symbol = record.symbolId
70
+ ? this.index.provenance.symbols.find((candidate) => candidate.id == record.symbolId)
71
+ : undefined;
72
+ this.#append(text, {
73
+ mappingKind: precision,
74
+ name: name ?? symbol?.name,
75
+ nodeId: record.id,
76
+ origin,
77
+ role,
78
+ symbolId: record.symbolId
79
+ });
80
+ }
81
+ /**
82
+ * Writes source-free scaffolding with optional semantic context.
83
+ * @param {string} text - Generated text.
84
+ * @param {string} reason - Stable reason.
85
+ * @param {import("../semantic/types.js").SemanticNode[]} [relatedNodes] - Related nodes.
86
+ * @param {(string | undefined)[]} [relatedPaths] - Occurrence paths for shared related nodes.
87
+ * @returns {void}
88
+ */
89
+ synthetic(text, reason, relatedNodes = [], relatedPaths = []) {
90
+ if (text.length == 0)
91
+ return;
92
+ /** @type {Set<string>} */
93
+ const seen = new Set();
94
+ const relatedOrigins = relatedNodes.flatMap((node, index) => {
95
+ const record = this.index.recordFor(node, relatedPaths[index]);
96
+ return relatedOriginsFor(record.origin).flatMap((related) => {
97
+ const contextual = {
98
+ ...related,
99
+ nodeId: related.nodeId ?? record.id,
100
+ role: related.role ?? "context"
101
+ };
102
+ const key = relatedOriginKey(contextual);
103
+ if (seen.has(key))
104
+ return [];
105
+ seen.add(key);
106
+ return [contextual];
107
+ });
108
+ });
109
+ this.#append(text, { mappingKind: "synthetic", origin: { kind: "synthetic", reason, relatedOrigins } });
110
+ }
111
+ /**
112
+ * Returns the authoritative rich map for the current content.
113
+ * @returns {import("../semantic/types.js").SemantifoldMapping} Mapping.
114
+ */
115
+ finish() {
116
+ return {
117
+ coordinateSystem: "utf16",
118
+ generated: { content: this.code, filename: this.filename, language: this.language },
119
+ nodes: [...this.index.provenance.nodes],
120
+ schema: "SemantifoldMapping",
121
+ sources: [...this.index.provenance.sources],
122
+ spans: [...this.spans],
123
+ symbols: [...this.index.provenance.symbols],
124
+ version: 1
125
+ };
126
+ }
127
+ /**
128
+ * Appends one mapped span.
129
+ * @param {string} text - Generated text.
130
+ * @param {Omit<import("../semantic/types.js").SemantifoldMappingSpan, "generated">} annotation - Span annotation.
131
+ * @returns {void}
132
+ */
133
+ #append(text, annotation) {
134
+ if (text.includes("\r"))
135
+ throw new TypeError("Generated output must use deterministic LF line endings.");
136
+ const start = { column: this.column, line: this.line, offset: this.offset };
137
+ this.parts.push(text);
138
+ for (let index = 0; index < text.length; index++) {
139
+ this.offset++;
140
+ if (text[index] == "\n") {
141
+ this.line++;
142
+ this.column = 1;
143
+ }
144
+ else
145
+ this.column++;
146
+ }
147
+ const compact = /** @type {Omit<import("../semantic/types.js").SemantifoldMappingSpan, "generated">} */ (Object.fromEntries(Object.entries(annotation).filter(([, value]) => value !== undefined)));
148
+ this.spans.push({
149
+ ...compact,
150
+ generated: {
151
+ end: { column: this.column, line: this.line, offset: this.offset },
152
+ filename: this.filename,
153
+ start
154
+ }
155
+ });
156
+ }
157
+ /**
158
+ * Creates a direct role origin using canonical source identities.
159
+ * @param {import("../semantic/types.js").SourceLocation} location - Exact role range.
160
+ * @param {import("../semantic/types.js").SemanticOrigin} fallback - Owning origin.
161
+ * @returns {import("../semantic/types.js").SemanticOrigin} Role origin.
162
+ */
163
+ #sourceOrigin(location, fallback) {
164
+ /** @type {string | undefined} */
165
+ let fallbackSourceId;
166
+ if (fallback.kind == "source" && fallback.location.filename == location.filename)
167
+ fallbackSourceId = fallback.sourceId;
168
+ else if (fallback.kind == "derived") {
169
+ fallbackSourceId = fallback.origins.find((origin) => origin.location.filename == location.filename)?.sourceId;
170
+ }
171
+ else if (fallback.kind == "synthetic") {
172
+ fallbackSourceId = fallback.relatedOrigins.find((origin) => origin.location.filename == location.filename)?.sourceId;
173
+ }
174
+ const source = this.index.provenance.sources.find((candidate) => candidate.id == fallbackSourceId) ??
175
+ this.index.provenance.sources.find((candidate) => candidate.filename == location.filename);
176
+ return source ? { kind: "source", location, sourceId: source.id } : fallback;
177
+ }
178
+ }
179
+ /**
180
+ * Expands every closed provenance range in semantic order.
181
+ * @param {import("../semantic/types.js").SemanticOrigin} origin - Closed provenance.
182
+ * @returns {import("../semantic/types.js").RelatedOrigin[]} Related ranges.
183
+ */
184
+ function relatedOriginsFor(origin) {
185
+ if (origin.kind == "source")
186
+ return [{ location: origin.location, sourceId: origin.sourceId }];
187
+ if (origin.kind == "derived")
188
+ return origin.origins;
189
+ return origin.relatedOrigins;
190
+ }
191
+ /**
192
+ * Builds a deterministic identity for one contextual related origin.
193
+ * @param {import("../semantic/types.js").RelatedOrigin} origin - Related origin.
194
+ * @returns {string} Stable identity.
195
+ */
196
+ function relatedOriginKey(origin) {
197
+ return JSON.stringify([
198
+ origin.sourceId,
199
+ origin.location.filename,
200
+ origin.location.start.offset,
201
+ origin.location.end.offset,
202
+ origin.nodeId ?? null,
203
+ origin.symbolId ?? null,
204
+ origin.role ?? null
205
+ ]);
206
+ }
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0QsMkRBQTJEO0FBQzNELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVwRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsSUFBSTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLElBQUksRUFBRSxJ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QUFTLGlCQUFpQixDQUFDLE1BQU07SUFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFBRSxPQUFPLENBQUMsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDNUYsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUE7SUFFbkQsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFBO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNO0lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQixNQUFNLENBQUMsUUFBUTtRQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUTtRQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQzVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU07UUFDMUIsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQ3JCLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN2QixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUk7S0FDcEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRpb25JbmRleH0gZnJvbSBcIi4uL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuXG4vKiogU291cmNlLWF3YXJlIGRldGVybWluaXN0aWMgZ2VuZXJhdGVkLW91dHB1dCBidWlsZGVyLiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVdyaXRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc291cmNlLWF3YXJlIHdyaXRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBXcml0ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZmlsZW5hbWUgLSBPdXRwdXQgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gb3B0aW9ucy5sYW5ndWFnZSAtIE91dHB1dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBzb3VyY2VzfSkge1xuICAgIGNvbnN0IGluZGV4ID0gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSwgc291cmNlcylcblxuICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZVxuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZVxuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5wYXJ0cyA9IFtdXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gICAgdGhpcy5zcGFucyA9IFtdXG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5saW5lID0gMVxuICAgIHRoaXMuY29sdW1uID0gMVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ2VuZXJhdGVkIGNvbnRlbnQgc28gZmFyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBHZW5lcmF0ZWQgY29udGVudC5cbiAgICovXG4gIGdldCBjb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEpTT04gUG9pbnRlciBmb3Igb25lIHVuYW1iaWd1b3VzIHNlbWFudGljIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDdXJyZW50IG9jY3VycmVuY2UgcGF0aC5cbiAgICovXG4gIG9jY3VycmVuY2VQYXRoKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSkucGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbiBleGFjdCBwYXJzZXItb3duZWQgcm9sZSByYW5nZSBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByb2xlIGhhcyBhbiBleGFjdCBzb3VyY2UgcmFuZ2UuXG4gICAqL1xuICBoYXNSYW5nZShub2RlLCBwYXRoLCByb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpLnJhbmdlc1tyb2xlXSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRleHQgbWFwcGVkIHRvIGEgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFubm90YXRpb24gLSBNYXBwaW5nIGFubm90YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBhbm5vdGF0aW9uLm5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCJ9IGFubm90YXRpb24ubWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLnJvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLm5hbWVdIC0gU291cmNlIE1hcCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucGF0aF0gLSBKU09OIFBvaW50ZXIgZm9yIGEgc2hhcmVkIG5vZGUgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwge21hcHBpbmdLaW5kLCBuYW1lLCBub2RlLCBwYXRoLCByb2xlfSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpXG4gICAgY29uc3Qgcm9sZUxvY2F0aW9uID0gcm9sZSA/IHJlY29yZC5yYW5nZXNbcm9sZV0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSByb2xlTG9jYXRpb24gPyB0aGlzLiNzb3VyY2VPcmlnaW4ocm9sZUxvY2F0aW9uLCByZWNvcmQub3JpZ2luKSA6IHJlY29yZC5vcmlnaW5cbiAgICBjb25zdCBwcmVjaXNpb24gPSBtYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcm9sZSAmJiAhcm9sZUxvY2F0aW9uID8gXCJhbmNob3JcIiA6IG1hcHBpbmdLaW5kXG4gICAgY29uc3Qgc3ltYm9sID0gcmVjb3JkLnN5bWJvbElkXG4gICAgICA/IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHJlY29yZC5zeW1ib2xJZClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLiNhcHBlbmQodGV4dCwge1xuICAgICAgbWFwcGluZ0tpbmQ6IHByZWNpc2lvbixcbiAgICAgIG5hbWU6IG5hbWUgPz8gc3ltYm9sPy5uYW1lLFxuICAgICAgbm9kZUlkOiByZWNvcmQuaWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlLFxuICAgICAgc3ltYm9sSWQ6IHJlY29yZC5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHNvdXJjZS1mcmVlIHNjYWZmb2xkaW5nIHdpdGggb3B0aW9uYWwgc2VtYW50aWMgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSByZWFzb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlW119IFtyZWxhdGVkTm9kZXNdIC0gUmVsYXRlZCBub2Rlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKVtdfSBbcmVsYXRlZFBhdGhzXSAtIE9jY3VycmVuY2UgcGF0aHMgZm9yIHNoYXJlZCByZWxhdGVkIG5vZGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIHJlbGF0ZWROb2RlcyA9IFtdLCByZWxhdGVkUGF0aHMgPSBbXSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcmVsYXRlZE5vZGVzLmZsYXRNYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlLCByZWxhdGVkUGF0aHNbaW5kZXhdKVxuXG4gICAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3IocmVjb3JkLm9yaWdpbikuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0ge1xuICAgICAgICAgIC4uLnJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiByZWxhdGVkLm5vZGVJZCA/PyByZWNvcmQuaWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IFwiY29udGV4dFwiXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gcmVsYXRlZE9yaWdpbktleShjb250ZXh0dWFsKVxuXG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gW11cbiAgICAgICAgc2Vlbi5hZGQoa2V5KVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dHVhbF1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbiwgcmVsYXRlZE9yaWdpbnN9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdGF0aXZlIHJpY2ggbWFwIGZvciB0aGUgY3VycmVudCBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBNYXBwaW5nLlxuICAgKi9cbiAgZmluaXNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgICBnZW5lcmF0ZWQ6IHtjb250ZW50OiB0aGlzLmNvZGUsIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLCBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZX0sXG4gICAgICBub2RlczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5ub2Rlc10sXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgICBzb3VyY2VzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXNdLFxuICAgICAgc3BhbnM6IFsuLi50aGlzLnNwYW5zXSxcbiAgICAgIHN5bWJvbHM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc3ltYm9sc10sXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG1hcHBlZCBzcGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59IGFubm90YXRpb24gLSBTcGFuIGFubm90YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgI2FwcGVuZCh0ZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0ZWQgb3V0cHV0IG11c3QgdXNlIGRldGVybWluaXN0aWMgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gICAgY29uc3Qgc3RhcnQgPSB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fVxuXG4gICAgdGhpcy5wYXJ0cy5wdXNoKHRleHQpXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm9mZnNldCsrXG4gICAgICBpZiAodGV4dFtpbmRleF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0aGlzLmxpbmUrK1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDFcbiAgICAgIH0gZWxzZSB0aGlzLmNvbHVtbisrXG4gICAgfVxuICAgIGNvbnN0IGNvbXBhY3QgPSAvKiogQHR5cGUge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59ICovIChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgKVxuXG4gICAgdGhpcy5zcGFucy5wdXNoKHtcbiAgICAgIC4uLmNvbXBhY3QsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgZW5kOiB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fSxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIHN0YXJ0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0IHJvbGUgb3JpZ2luIHVzaW5nIGNhbm9uaWNhbCBzb3VyY2UgaWRlbnRpdGllcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByb2xlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBmYWxsYmFjayAtIE93bmluZyBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUm9sZSBvcmlnaW4uXG4gICAqL1xuICAjc291cmNlT3JpZ2luKGxvY2F0aW9uLCBmYWxsYmFjaykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmYWxsYmFja1NvdXJjZUlkXG5cbiAgICBpZiAoZmFsbGJhY2sua2luZCA9PSBcInNvdXJjZVwiICYmIGZhbGxiYWNrLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2suc291cmNlSWRcbiAgICBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwiZGVyaXZlZFwiKSB7XG4gICAgICBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2sub3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfSBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5yZWxhdGVkT3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGZhbGxiYWNrU291cmNlSWQpID8/XG4gICAgICB0aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICAgIHJldHVybiBzb3VyY2UgPyB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9IDogZmFsbGJhY2tcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZHMgZXZlcnkgY2xvc2VkIHByb3ZlbmFuY2UgcmFuZ2UgaW4gc2VtYW50aWMgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvcihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGlkZW50aXR5IGZvciBvbmUgY29udGV4dHVhbCByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gb3JpZ2luIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5LZXkob3JpZ2luKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgb3JpZ2luLnNvdXJjZUlkLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSxcbiAgICBvcmlnaW4ubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgIG9yaWdpbi5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgIG9yaWdpbi5ub2RlSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4uc3ltYm9sSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4ucm9sZSA/PyBudWxsXG4gIF0pXG59XG4iXX0=
@@ -0,0 +1,67 @@
1
+ /** A clear parser, semantic, or backend capability diagnostic. */
2
+ export declare class SemantifoldDiagnostic extends Error {
3
+ code: string;
4
+ detail: string;
5
+ generatedLocation: import("./semantic/types.js").SourceLocation | undefined;
6
+ language: import("./semantic/types.js").SemanticLanguage;
7
+ location: import("./semantic/types.js").SourceLocation | undefined;
8
+ /**
9
+ * Creates a diagnostic.
10
+ * @param {object} options - Diagnostic fields.
11
+ * @param {string} options.code - Stable diagnostic code.
12
+ * @param {string} options.message - Human-readable message.
13
+ * @param {import("./semantic/types.js").SemanticLanguage} options.language - Related language.
14
+ * @param {import("./semantic/types.js").SourceLocation | undefined} [options.location] - Related location.
15
+ * @param {import("./semantic/types.js").SourceLocation | undefined} [options.generatedLocation] - Pre-remapping generated location.
16
+ * @param {Error | undefined} [options.cause] - Preserved parser error.
17
+ */
18
+ constructor({ cause, code, generatedLocation, language, location, message }: {
19
+ code: string;
20
+ message: string;
21
+ language: import("./semantic/types.js").SemanticLanguage;
22
+ location?: import("./semantic/types.js").SourceLocation | undefined;
23
+ generatedLocation?: import("./semantic/types.js").SourceLocation | undefined;
24
+ cause?: Error | undefined;
25
+ });
26
+ }
27
+ /**
28
+ * Throws a normalized parser diagnostic while preserving the parser error.
29
+ * @param {import("./semantic/types.js").SemanticLanguage} language - Frontend language.
30
+ * @param {unknown} error - Opaque parser error, narrowed immediately.
31
+ * @returns {never} Always throws.
32
+ */
33
+ export declare function parseFailure(language: import("./semantic/types.js").SemanticLanguage, error: unknown): never;
34
+ /**
35
+ * Throws an unsupported-syntax diagnostic.
36
+ * @param {import("./semantic/types.js").SemanticLanguage} language - Frontend language.
37
+ * @param {string} syntax - Parser syntax kind.
38
+ * @param {import("./semantic/types.js").SourceLocation | undefined} location - Source location.
39
+ * @returns {never} Always throws.
40
+ */
41
+ export declare function unsupportedSyntax(language: import("./semantic/types.js").SemanticLanguage, syntax: string, location: import("./semantic/types.js").SourceLocation | undefined): never;
42
+ /**
43
+ * Throws a missing-type diagnostic.
44
+ * @param {import("./semantic/types.js").SemanticLanguage} language - Frontend language.
45
+ * @param {string} subject - Untyped subject.
46
+ * @param {import("./semantic/types.js").SourceLocation | undefined} location - Source location.
47
+ * @returns {never} Always throws.
48
+ */
49
+ export declare function missingType(language: import("./semantic/types.js").SemanticLanguage, subject: string, location: import("./semantic/types.js").SourceLocation | undefined): never;
50
+ /**
51
+ * Throws a language-neutral semantic diagnostic discovered after adaptation.
52
+ * @param {import("./semantic/types.js").SemanticLanguage} language - Source language.
53
+ * @param {string} code - Stable semantic diagnostic code.
54
+ * @param {string} detail - Human-readable semantic failure.
55
+ * @param {import("./semantic/types.js").SourceLocation | undefined} location - Source location.
56
+ * @returns {never} Always throws.
57
+ */
58
+ export declare function semanticFailure(language: import("./semantic/types.js").SemanticLanguage, code: string, detail: string, location: import("./semantic/types.js").SourceLocation | undefined): never;
59
+ /**
60
+ * Throws an unsupported backend-capability diagnostic.
61
+ * @param {import("./semantic/types.js").SemanticLanguage} language - Backend language.
62
+ * @param {string} capability - Unsupported semantic capability.
63
+ * @param {import("./semantic/types.js").SourceLocation | undefined} location - Semantic source location.
64
+ * @returns {never} Always throws.
65
+ */
66
+ export declare function unsupportedCapability(language: import("./semantic/types.js").SemanticLanguage, capability: string, location: import("./semantic/types.js").SourceLocation | undefined): never;
67
+ //# sourceMappingURL=diagnostic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/diagnostic.js"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,qBAAa,qBAAsB,SAAQ,KAAK;IAgBvC,IAAI;IACJ,MAAM;IACN,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IAnBf;;;;;;;;;OASG;IACH,YAAY,EAAC,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,EAPtE;QAAwB,IAAI,EAApB,MAAM,CACd;QAAwB,OAAO,EAAvB,MAAM,CACd;QAAgE,QAAQ,EAAhE,OAAO,qBAAqB,EAAE,gBAAgB,CACtD;QAA2E,QAAQ,AAAnF,CACA,EADQ,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAAS,CAChE;QAA2E,iBAAiB,AAA5F,CACA,EADQ,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAAS,CAChE;QAAoC,KAAK,AAAzC,CACF,EADU,KAAK,GAAG,SAAS,CAC3B;KACwE,EAUxE;CACF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAJ1B,OAAO,qBAAqB,EAAE,gBAIJ,EAAE,KAAK,EAHjC,OAGiC,GAF/B,KAAK,CAWjB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAL/B,OAAO,qBAAqB,EAAE,gBAKC,EAAE,MAAM,EAJvC,MAIuC,EAAE,QAAQ,EAHjD,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAGE,GAF/C,KAAK,CASjB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EALzB,OAAO,qBAAqB,EAAE,gBAKL,EAAE,OAAO,EAJlC,MAIkC,EAAE,QAAQ,EAH5C,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAGH,GAF1C,KAAK,CASjB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAN7B,OAAO,qBAAqB,EAAE,gBAMD,EAAE,IAAI,EALnC,MAKmC,EAAE,MAAM,EAJ3C,MAI2C,EAAE,QAAQ,EAHrD,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAGM,GAFnD,KAAK,CAIjB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EALnC,OAAO,qBAAqB,EAAE,gBAKK,EAAE,UAAU,EAJ/C,MAI+C,EAAE,QAAQ,EAHzD,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAGU,GAFvD,KAAK,CASjB"}