edict-lang 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.
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/ast/nodes.d.ts +248 -0
- package/dist/ast/nodes.d.ts.map +1 -0
- package/dist/ast/nodes.js +95 -0
- package/dist/ast/nodes.js.map +1 -0
- package/dist/ast/types.d.ts +78 -0
- package/dist/ast/types.d.ts.map +1 -0
- package/dist/ast/types.js +7 -0
- package/dist/ast/types.js.map +1 -0
- package/dist/check.d.ts +19 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +49 -0
- package/dist/check.js.map +1 -0
- package/dist/checker/check.d.ts +7 -0
- package/dist/checker/check.d.ts.map +1 -0
- package/dist/checker/check.js +548 -0
- package/dist/checker/check.js.map +1 -0
- package/dist/checker/type-env.d.ts +24 -0
- package/dist/checker/type-env.d.ts.map +1 -0
- package/dist/checker/type-env.js +67 -0
- package/dist/checker/type-env.js.map +1 -0
- package/dist/checker/types-equal.d.ts +18 -0
- package/dist/checker/types-equal.d.ts.map +1 -0
- package/dist/checker/types-equal.js +79 -0
- package/dist/checker/types-equal.js.map +1 -0
- package/dist/codegen/builtins.d.ts +27 -0
- package/dist/codegen/builtins.d.ts.map +1 -0
- package/dist/codegen/builtins.js +54 -0
- package/dist/codegen/builtins.js.map +1 -0
- package/dist/codegen/codegen.d.ts +32 -0
- package/dist/codegen/codegen.d.ts.map +1 -0
- package/dist/codegen/codegen.js +1192 -0
- package/dist/codegen/codegen.js.map +1 -0
- package/dist/codegen/runner.d.ts +16 -0
- package/dist/codegen/runner.d.ts.map +1 -0
- package/dist/codegen/runner.js +82 -0
- package/dist/codegen/runner.js.map +1 -0
- package/dist/codegen/string-table.d.ts +35 -0
- package/dist/codegen/string-table.d.ts.map +1 -0
- package/dist/codegen/string-table.js +62 -0
- package/dist/codegen/string-table.js.map +1 -0
- package/dist/compile.d.ts +18 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +40 -0
- package/dist/compile.js.map +1 -0
- package/dist/contracts/translate.d.ts +39 -0
- package/dist/contracts/translate.d.ts.map +1 -0
- package/dist/contracts/translate.js +372 -0
- package/dist/contracts/translate.js.map +1 -0
- package/dist/contracts/verify.d.ts +8 -0
- package/dist/contracts/verify.d.ts.map +1 -0
- package/dist/contracts/verify.js +400 -0
- package/dist/contracts/verify.js.map +1 -0
- package/dist/contracts/z3-context.d.ts +14 -0
- package/dist/contracts/z3-context.d.ts.map +1 -0
- package/dist/contracts/z3-context.js +24 -0
- package/dist/contracts/z3-context.js.map +1 -0
- package/dist/effects/call-graph.d.ts +21 -0
- package/dist/effects/call-graph.d.ts.map +1 -0
- package/dist/effects/call-graph.js +135 -0
- package/dist/effects/call-graph.js.map +1 -0
- package/dist/effects/effect-check.d.ts +13 -0
- package/dist/effects/effect-check.d.ts.map +1 -0
- package/dist/effects/effect-check.js +48 -0
- package/dist/effects/effect-check.js.map +1 -0
- package/dist/errors/structured-errors.d.ts +193 -0
- package/dist/errors/structured-errors.d.ts.map +1 -0
- package/dist/errors/structured-errors.js +96 -0
- package/dist/errors/structured-errors.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/create-server.d.ts +3 -0
- package/dist/mcp/create-server.d.ts.map +1 -0
- package/dist/mcp/create-server.js +157 -0
- package/dist/mcp/create-server.js.map +1 -0
- package/dist/mcp/handlers.d.ts +44 -0
- package/dist/mcp/handlers.d.ts.map +1 -0
- package/dist/mcp/handlers.js +112 -0
- package/dist/mcp/handlers.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +129 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/resolver/levenshtein.d.ts +12 -0
- package/dist/resolver/levenshtein.d.ts.map +1 -0
- package/dist/resolver/levenshtein.js +54 -0
- package/dist/resolver/levenshtein.js.map +1 -0
- package/dist/resolver/resolve.d.ts +7 -0
- package/dist/resolver/resolve.d.ts.map +1 -0
- package/dist/resolver/resolve.js +393 -0
- package/dist/resolver/resolve.js.map +1 -0
- package/dist/resolver/scope.d.ts +34 -0
- package/dist/resolver/scope.d.ts.map +1 -0
- package/dist/resolver/scope.js +51 -0
- package/dist/resolver/scope.js.map +1 -0
- package/dist/validator/id-tracker.d.ts +14 -0
- package/dist/validator/id-tracker.d.ts.map +1 -0
- package/dist/validator/id-tracker.js +28 -0
- package/dist/validator/id-tracker.js.map +1 -0
- package/dist/validator/node-validators.d.ts +6 -0
- package/dist/validator/node-validators.d.ts.map +1 -0
- package/dist/validator/node-validators.js +808 -0
- package/dist/validator/node-validators.js.map +1 -0
- package/dist/validator/validate.d.ts +17 -0
- package/dist/validator/validate.d.ts.map +1 -0
- package/dist/validator/validate.js +27 -0
- package/dist/validator/validate.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Name Resolution — resolve(module) → StructuredError[]
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Walks a validated AST and checks that every name reference resolves.
|
|
5
|
+
// Two passes: (1) collect top-level defs, (2) resolve all expressions/patterns.
|
|
6
|
+
import { undefinedReference } from "../errors/structured-errors.js";
|
|
7
|
+
import { findCandidates } from "./levenshtein.js";
|
|
8
|
+
import { Scope } from "./scope.js";
|
|
9
|
+
import { BUILTIN_FUNCTIONS } from "../codegen/builtins.js";
|
|
10
|
+
/**
|
|
11
|
+
* Entry point: resolve all names in a validated Edict module.
|
|
12
|
+
*/
|
|
13
|
+
export function resolve(module) {
|
|
14
|
+
const errors = [];
|
|
15
|
+
// Built-in functions live in a parent scope so user imports/defs shadow them
|
|
16
|
+
const builtinScope = new Scope();
|
|
17
|
+
for (const [name, builtin] of BUILTIN_FUNCTIONS) {
|
|
18
|
+
builtinScope.define(name, {
|
|
19
|
+
name,
|
|
20
|
+
kind: "function",
|
|
21
|
+
nodeId: null,
|
|
22
|
+
type: builtin.type,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const moduleScope = new Scope(builtinScope);
|
|
26
|
+
// =========================================================================
|
|
27
|
+
// Pass 1 — Register top-level definitions + imports
|
|
28
|
+
// =========================================================================
|
|
29
|
+
// Register imports (trusted/opaque — typed as unknown)
|
|
30
|
+
for (const imp of module.imports) {
|
|
31
|
+
for (const name of imp.names) {
|
|
32
|
+
const err = moduleScope.define(name, {
|
|
33
|
+
name,
|
|
34
|
+
kind: "import",
|
|
35
|
+
nodeId: imp.id,
|
|
36
|
+
});
|
|
37
|
+
if (err)
|
|
38
|
+
errors.push(err);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Register definitions
|
|
42
|
+
for (const def of module.definitions) {
|
|
43
|
+
const info = defToSymbolInfo(def);
|
|
44
|
+
const err = moduleScope.define(def.name, info);
|
|
45
|
+
if (err)
|
|
46
|
+
errors.push(err);
|
|
47
|
+
}
|
|
48
|
+
// =========================================================================
|
|
49
|
+
// Pass 2 — Resolve expressions and patterns
|
|
50
|
+
// =========================================================================
|
|
51
|
+
for (const def of module.definitions) {
|
|
52
|
+
switch (def.kind) {
|
|
53
|
+
case "fn":
|
|
54
|
+
resolveFunctionDef(def, moduleScope, errors);
|
|
55
|
+
break;
|
|
56
|
+
case "const":
|
|
57
|
+
resolveConstDef(def, moduleScope, errors);
|
|
58
|
+
break;
|
|
59
|
+
case "record":
|
|
60
|
+
resolveRecordDef(def, moduleScope, errors);
|
|
61
|
+
break;
|
|
62
|
+
case "type":
|
|
63
|
+
resolveTypeExpr(def.definition, moduleScope, errors);
|
|
64
|
+
break;
|
|
65
|
+
case "enum":
|
|
66
|
+
resolveEnumDef(def, moduleScope, errors);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return errors;
|
|
71
|
+
}
|
|
72
|
+
// =============================================================================
|
|
73
|
+
// Helpers
|
|
74
|
+
// =============================================================================
|
|
75
|
+
function defToSymbolInfo(def) {
|
|
76
|
+
switch (def.kind) {
|
|
77
|
+
case "fn":
|
|
78
|
+
return {
|
|
79
|
+
name: def.name,
|
|
80
|
+
kind: "function",
|
|
81
|
+
nodeId: def.id,
|
|
82
|
+
type: {
|
|
83
|
+
kind: "fn_type",
|
|
84
|
+
params: def.params.map((p) => p.type),
|
|
85
|
+
effects: [...def.effects],
|
|
86
|
+
returnType: def.returnType,
|
|
87
|
+
},
|
|
88
|
+
definition: def,
|
|
89
|
+
};
|
|
90
|
+
case "type":
|
|
91
|
+
return { name: def.name, kind: "type", nodeId: def.id, definition: def };
|
|
92
|
+
case "record":
|
|
93
|
+
return { name: def.name, kind: "record", nodeId: def.id, definition: def };
|
|
94
|
+
case "enum":
|
|
95
|
+
return { name: def.name, kind: "enum", nodeId: def.id, definition: def };
|
|
96
|
+
case "const":
|
|
97
|
+
return { name: def.name, kind: "const", nodeId: def.id, type: def.type, definition: def };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function resolveFunctionDef(fn, parentScope, errors) {
|
|
101
|
+
// Create body scope with params
|
|
102
|
+
const bodyScope = parentScope.child();
|
|
103
|
+
for (const param of fn.params) {
|
|
104
|
+
const err = bodyScope.define(param.name, {
|
|
105
|
+
name: param.name,
|
|
106
|
+
kind: "param",
|
|
107
|
+
nodeId: param.id,
|
|
108
|
+
type: param.type,
|
|
109
|
+
});
|
|
110
|
+
if (err)
|
|
111
|
+
errors.push(err);
|
|
112
|
+
}
|
|
113
|
+
// Resolve param types
|
|
114
|
+
for (const param of fn.params) {
|
|
115
|
+
resolveTypeExpr(param.type, parentScope, errors);
|
|
116
|
+
}
|
|
117
|
+
// Resolve return type
|
|
118
|
+
resolveTypeExpr(fn.returnType, parentScope, errors);
|
|
119
|
+
// Resolve contracts
|
|
120
|
+
for (const contract of fn.contracts) {
|
|
121
|
+
resolveContract(contract, fn, bodyScope, errors);
|
|
122
|
+
}
|
|
123
|
+
// Resolve body expressions sequentially (let bindings accumulate in scope)
|
|
124
|
+
resolveExpressionList(fn.body, bodyScope, errors);
|
|
125
|
+
}
|
|
126
|
+
function resolveContract(contract, fn, bodyScope, errors) {
|
|
127
|
+
if (contract.kind === "post") {
|
|
128
|
+
// Post-contracts have implicit `result` binding typed as returnType
|
|
129
|
+
const postScope = bodyScope.child();
|
|
130
|
+
postScope.define("result", {
|
|
131
|
+
name: "result",
|
|
132
|
+
kind: "result",
|
|
133
|
+
nodeId: null,
|
|
134
|
+
type: fn.returnType,
|
|
135
|
+
});
|
|
136
|
+
resolveExpression(contract.condition, postScope, errors);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Pre-contracts share the body scope (params visible)
|
|
140
|
+
resolveExpression(contract.condition, bodyScope, errors);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function resolveConstDef(def, scope, errors) {
|
|
144
|
+
resolveTypeExpr(def.type, scope, errors);
|
|
145
|
+
resolveExpression(def.value, scope, errors);
|
|
146
|
+
}
|
|
147
|
+
function resolveRecordDef(def, scope, errors) {
|
|
148
|
+
for (const field of def.fields) {
|
|
149
|
+
resolveRecordField(field, scope, errors);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function resolveRecordField(field, scope, errors) {
|
|
153
|
+
resolveTypeExpr(field.type, scope, errors);
|
|
154
|
+
if (field.defaultValue) {
|
|
155
|
+
resolveExpression(field.defaultValue, scope, errors);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function resolveEnumDef(def, scope, errors) {
|
|
159
|
+
for (const variant of def.variants) {
|
|
160
|
+
for (const field of variant.fields) {
|
|
161
|
+
resolveRecordField(field, scope, errors);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Resolve named types. Only `named` and `refined` types reference names.
|
|
167
|
+
*/
|
|
168
|
+
function resolveTypeExpr(type, scope, errors) {
|
|
169
|
+
switch (type.kind) {
|
|
170
|
+
case "named": {
|
|
171
|
+
const sym = scope.lookup(type.name);
|
|
172
|
+
if (!sym) {
|
|
173
|
+
errors.push(undefinedReference(null, type.name, findCandidates(type.name, scope.allNames())));
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
case "refined":
|
|
178
|
+
resolveRefinedType(type, scope, errors);
|
|
179
|
+
break;
|
|
180
|
+
case "array":
|
|
181
|
+
resolveTypeExpr(type.element, scope, errors);
|
|
182
|
+
break;
|
|
183
|
+
case "option":
|
|
184
|
+
resolveTypeExpr(type.inner, scope, errors);
|
|
185
|
+
break;
|
|
186
|
+
case "result":
|
|
187
|
+
resolveTypeExpr(type.ok, scope, errors);
|
|
188
|
+
resolveTypeExpr(type.err, scope, errors);
|
|
189
|
+
break;
|
|
190
|
+
case "fn_type":
|
|
191
|
+
for (const p of type.params)
|
|
192
|
+
resolveTypeExpr(p, scope, errors);
|
|
193
|
+
resolveTypeExpr(type.returnType, scope, errors);
|
|
194
|
+
break;
|
|
195
|
+
case "tuple":
|
|
196
|
+
for (const el of type.elements)
|
|
197
|
+
resolveTypeExpr(el, scope, errors);
|
|
198
|
+
break;
|
|
199
|
+
case "basic":
|
|
200
|
+
case "unit_type":
|
|
201
|
+
// No names to resolve
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function resolveRefinedType(type, scope, errors) {
|
|
206
|
+
resolveTypeExpr(type.base, scope, errors);
|
|
207
|
+
// The variable introduces a new binding for the predicate expression
|
|
208
|
+
const predicateScope = scope.child();
|
|
209
|
+
predicateScope.define(type.variable, {
|
|
210
|
+
name: type.variable,
|
|
211
|
+
kind: "param",
|
|
212
|
+
nodeId: type.id,
|
|
213
|
+
type: type.base,
|
|
214
|
+
});
|
|
215
|
+
resolveExpression(type.predicate, predicateScope, errors);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Resolve a list of expressions sequentially.
|
|
219
|
+
* Let bindings accumulate into the scope for subsequent expressions.
|
|
220
|
+
*/
|
|
221
|
+
function resolveExpressionList(exprs, scope, errors) {
|
|
222
|
+
// We use a mutable current scope so let-bindings are visible to later siblings
|
|
223
|
+
let currentScope = scope;
|
|
224
|
+
for (const expr of exprs) {
|
|
225
|
+
resolveExpression(expr, currentScope, errors);
|
|
226
|
+
if (expr.kind === "let") {
|
|
227
|
+
// Let binding adds to a child scope for subsequent siblings
|
|
228
|
+
currentScope = currentScope.child();
|
|
229
|
+
const err = currentScope.define(expr.name, {
|
|
230
|
+
name: expr.name,
|
|
231
|
+
kind: "let",
|
|
232
|
+
nodeId: expr.id,
|
|
233
|
+
type: expr.type,
|
|
234
|
+
});
|
|
235
|
+
if (err)
|
|
236
|
+
errors.push(err);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function resolveExpression(expr, scope, errors) {
|
|
241
|
+
switch (expr.kind) {
|
|
242
|
+
case "literal":
|
|
243
|
+
// Optionally annotated — resolve type if present
|
|
244
|
+
if (expr.type)
|
|
245
|
+
resolveTypeExpr(expr.type, scope, errors);
|
|
246
|
+
break;
|
|
247
|
+
case "ident": {
|
|
248
|
+
const sym = scope.lookup(expr.name);
|
|
249
|
+
if (!sym) {
|
|
250
|
+
errors.push(undefinedReference(expr.id, expr.name, findCandidates(expr.name, scope.allNames())));
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
case "binop":
|
|
255
|
+
resolveExpression(expr.left, scope, errors);
|
|
256
|
+
resolveExpression(expr.right, scope, errors);
|
|
257
|
+
break;
|
|
258
|
+
case "unop":
|
|
259
|
+
resolveExpression(expr.operand, scope, errors);
|
|
260
|
+
break;
|
|
261
|
+
case "call":
|
|
262
|
+
resolveExpression(expr.fn, scope, errors);
|
|
263
|
+
for (const arg of expr.args)
|
|
264
|
+
resolveExpression(arg, scope, errors);
|
|
265
|
+
break;
|
|
266
|
+
case "if":
|
|
267
|
+
resolveExpression(expr.condition, scope, errors);
|
|
268
|
+
resolveExpressionList(expr.then, scope, errors);
|
|
269
|
+
if (expr.else)
|
|
270
|
+
resolveExpressionList(expr.else, scope, errors);
|
|
271
|
+
break;
|
|
272
|
+
case "let":
|
|
273
|
+
// Type annotation
|
|
274
|
+
if (expr.type)
|
|
275
|
+
resolveTypeExpr(expr.type, scope, errors);
|
|
276
|
+
// Value (the name itself is NOT in scope for its own value)
|
|
277
|
+
resolveExpression(expr.value, scope, errors);
|
|
278
|
+
// Binding is registered by resolveExpressionList
|
|
279
|
+
break;
|
|
280
|
+
case "match":
|
|
281
|
+
resolveExpression(expr.target, scope, errors);
|
|
282
|
+
for (const arm of expr.arms) {
|
|
283
|
+
const armScope = scope.child();
|
|
284
|
+
resolvePattern(arm.pattern, armScope, scope, errors);
|
|
285
|
+
resolveExpressionList(arm.body, armScope, errors);
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
case "array":
|
|
289
|
+
for (const el of expr.elements)
|
|
290
|
+
resolveExpression(el, scope, errors);
|
|
291
|
+
break;
|
|
292
|
+
case "tuple_expr":
|
|
293
|
+
for (const el of expr.elements)
|
|
294
|
+
resolveExpression(el, scope, errors);
|
|
295
|
+
break;
|
|
296
|
+
case "record_expr":
|
|
297
|
+
// We don't error on unknown records here — that's the type checker's job.
|
|
298
|
+
// We DO resolve the field value expressions.
|
|
299
|
+
for (const f of expr.fields)
|
|
300
|
+
resolveExpression(f.value, scope, errors);
|
|
301
|
+
break;
|
|
302
|
+
case "enum_constructor":
|
|
303
|
+
// Same as record_expr — type checker validates enum/variant existence
|
|
304
|
+
for (const f of expr.fields)
|
|
305
|
+
resolveExpression(f.value, scope, errors);
|
|
306
|
+
break;
|
|
307
|
+
case "access":
|
|
308
|
+
resolveExpression(expr.target, scope, errors);
|
|
309
|
+
break;
|
|
310
|
+
case "lambda": {
|
|
311
|
+
const lamScope = scope.child();
|
|
312
|
+
for (const param of expr.params) {
|
|
313
|
+
resolveTypeExpr(param.type, scope, errors);
|
|
314
|
+
const err = lamScope.define(param.name, {
|
|
315
|
+
name: param.name,
|
|
316
|
+
kind: "param",
|
|
317
|
+
nodeId: param.id,
|
|
318
|
+
type: param.type,
|
|
319
|
+
});
|
|
320
|
+
if (err)
|
|
321
|
+
errors.push(err);
|
|
322
|
+
}
|
|
323
|
+
resolveExpressionList(expr.body, lamScope, errors);
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case "block":
|
|
327
|
+
resolveExpressionList(expr.body, scope.child(), errors);
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
function resolvePattern(pattern, armScope, moduleScope, errors) {
|
|
332
|
+
switch (pattern.kind) {
|
|
333
|
+
case "binding": {
|
|
334
|
+
const err = armScope.define(pattern.name, {
|
|
335
|
+
name: pattern.name,
|
|
336
|
+
kind: "let",
|
|
337
|
+
nodeId: null,
|
|
338
|
+
});
|
|
339
|
+
if (err)
|
|
340
|
+
errors.push(err);
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
case "constructor": {
|
|
344
|
+
// Verify the constructor name exists as an enum variant in module scope
|
|
345
|
+
// We check ALL enum defs to find a matching variant
|
|
346
|
+
const found = findVariantInScope(pattern.name, moduleScope);
|
|
347
|
+
if (!found) {
|
|
348
|
+
errors.push(undefinedReference(null, pattern.name, findCandidates(pattern.name, collectAllVariantNames(moduleScope))));
|
|
349
|
+
}
|
|
350
|
+
// Recursively resolve sub-patterns
|
|
351
|
+
for (const sub of pattern.fields) {
|
|
352
|
+
resolvePattern(sub, armScope, moduleScope, errors);
|
|
353
|
+
}
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
case "literal_pattern":
|
|
357
|
+
case "wildcard":
|
|
358
|
+
// No names to resolve
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Search all enum definitions in scope for a variant with the given name.
|
|
364
|
+
*/
|
|
365
|
+
function findVariantInScope(variantName, scope) {
|
|
366
|
+
// Walk all names and check if any enum has this variant
|
|
367
|
+
for (const name of scope.allNames()) {
|
|
368
|
+
const sym = scope.lookup(name);
|
|
369
|
+
if (sym?.definition?.kind === "enum") {
|
|
370
|
+
for (const v of sym.definition.variants) {
|
|
371
|
+
if (v.name === variantName)
|
|
372
|
+
return true;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Collect all variant names from all enums in scope.
|
|
380
|
+
*/
|
|
381
|
+
function collectAllVariantNames(scope) {
|
|
382
|
+
const names = [];
|
|
383
|
+
for (const name of scope.allNames()) {
|
|
384
|
+
const sym = scope.lookup(name);
|
|
385
|
+
if (sym?.definition?.kind === "enum") {
|
|
386
|
+
for (const v of sym.definition.variants) {
|
|
387
|
+
names.push(v.name);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return names;
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/resolver/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { TypeExpr } from "../ast/types.js";
|
|
2
|
+
import type { Definition } from "../ast/nodes.js";
|
|
3
|
+
import { type DuplicateDefinitionError } from "../errors/structured-errors.js";
|
|
4
|
+
export type SymbolKind = "function" | "param" | "let" | "const" | "type" | "record" | "enum" | "import" | "result";
|
|
5
|
+
export interface SymbolInfo {
|
|
6
|
+
name: string;
|
|
7
|
+
kind: SymbolKind;
|
|
8
|
+
nodeId: string | null;
|
|
9
|
+
type?: TypeExpr;
|
|
10
|
+
definition?: Definition;
|
|
11
|
+
}
|
|
12
|
+
export declare class Scope {
|
|
13
|
+
private symbols;
|
|
14
|
+
private parent;
|
|
15
|
+
constructor(parent?: Scope | null);
|
|
16
|
+
/**
|
|
17
|
+
* Define a symbol in this scope.
|
|
18
|
+
* Returns a DuplicateDefinitionError if the name already exists in THIS scope.
|
|
19
|
+
*/
|
|
20
|
+
define(name: string, info: SymbolInfo): DuplicateDefinitionError | null;
|
|
21
|
+
/**
|
|
22
|
+
* Look up a symbol by walking the scope chain (current → parent → …).
|
|
23
|
+
*/
|
|
24
|
+
lookup(name: string): SymbolInfo | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Collect all names visible from this scope (for Levenshtein suggestions).
|
|
27
|
+
*/
|
|
28
|
+
allNames(): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Create a child scope that inherits from this one.
|
|
31
|
+
*/
|
|
32
|
+
child(): Scope;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/resolver/scope.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAuB,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAEpG,MAAM,MAAM,UAAU,GAChB,UAAU,GACV,OAAO,GACP,KAAK,GACL,OAAO,GACP,MAAM,GACN,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,QAAQ,CAAC;AAEf,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,qBAAa,KAAK;IACd,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,GAAE,KAAK,GAAG,IAAW;IAIvC;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,wBAAwB,GAAG,IAAI;IASvE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAM5C;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE;IAUpB;;OAEG;IACH,KAAK,IAAI,KAAK;CAGjB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Scope — Nested symbol table for name resolution
|
|
3
|
+
// =============================================================================
|
|
4
|
+
import { duplicateDefinition } from "../errors/structured-errors.js";
|
|
5
|
+
export class Scope {
|
|
6
|
+
symbols = new Map();
|
|
7
|
+
parent;
|
|
8
|
+
constructor(parent = null) {
|
|
9
|
+
this.parent = parent;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Define a symbol in this scope.
|
|
13
|
+
* Returns a DuplicateDefinitionError if the name already exists in THIS scope.
|
|
14
|
+
*/
|
|
15
|
+
define(name, info) {
|
|
16
|
+
const existing = this.symbols.get(name);
|
|
17
|
+
if (existing) {
|
|
18
|
+
return duplicateDefinition(info.nodeId, name, existing.nodeId);
|
|
19
|
+
}
|
|
20
|
+
this.symbols.set(name, info);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Look up a symbol by walking the scope chain (current → parent → …).
|
|
25
|
+
*/
|
|
26
|
+
lookup(name) {
|
|
27
|
+
const local = this.symbols.get(name);
|
|
28
|
+
if (local)
|
|
29
|
+
return local;
|
|
30
|
+
return this.parent?.lookup(name);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Collect all names visible from this scope (for Levenshtein suggestions).
|
|
34
|
+
*/
|
|
35
|
+
allNames() {
|
|
36
|
+
const names = new Set(this.symbols.keys());
|
|
37
|
+
if (this.parent) {
|
|
38
|
+
for (const n of this.parent.allNames()) {
|
|
39
|
+
names.add(n);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return [...names];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a child scope that inherits from this one.
|
|
46
|
+
*/
|
|
47
|
+
child() {
|
|
48
|
+
return new Scope(this);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/resolver/scope.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kDAAkD;AAClD,gFAAgF;AAIhF,OAAO,EAAE,mBAAmB,EAAiC,MAAM,gCAAgC,CAAC;AAqBpG,MAAM,OAAO,KAAK;IACN,OAAO,GAA4B,IAAI,GAAG,EAAE,CAAC;IAC7C,MAAM,CAAe;IAE7B,YAAY,SAAuB,IAAI;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAY,EAAE,IAAgB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAY;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACrC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACL,CAAC;QACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACJ"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { StructuredError } from "../errors/structured-errors.js";
|
|
2
|
+
export declare class IdTracker {
|
|
3
|
+
private seen;
|
|
4
|
+
private errors;
|
|
5
|
+
/**
|
|
6
|
+
* Register an ID at a given AST path. If duplicate, records an error.
|
|
7
|
+
*/
|
|
8
|
+
track(id: string, path: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Return all duplicate ID errors found.
|
|
11
|
+
*/
|
|
12
|
+
getErrors(): StructuredError[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=id-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-tracker.d.ts","sourceRoot":"","sources":["../../src/validator/id-tracker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGtE,qBAAa,SAAS;IAClB,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,MAAM,CAAyB;IAEvC;;OAEG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IASrC;;OAEG;IACH,SAAS,IAAI,eAAe,EAAE;CAGjC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// ID Tracker — Duplicate ID Detection
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Walks the AST and collects all `id` fields, detecting duplicates.
|
|
5
|
+
import { duplicateId } from "../errors/structured-errors.js";
|
|
6
|
+
export class IdTracker {
|
|
7
|
+
seen = new Map(); // id -> first path
|
|
8
|
+
errors = [];
|
|
9
|
+
/**
|
|
10
|
+
* Register an ID at a given AST path. If duplicate, records an error.
|
|
11
|
+
*/
|
|
12
|
+
track(id, path) {
|
|
13
|
+
const existing = this.seen.get(id);
|
|
14
|
+
if (existing !== undefined) {
|
|
15
|
+
this.errors.push(duplicateId(id, existing, path));
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
this.seen.set(id, path);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Return all duplicate ID errors found.
|
|
23
|
+
*/
|
|
24
|
+
getErrors() {
|
|
25
|
+
return this.errors;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=id-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-tracker.js","sourceRoot":"","sources":["../../src/validator/id-tracker.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,sCAAsC;AACtC,gFAAgF;AAChF,oEAAoE;AAGpE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,MAAM,OAAO,SAAS;IACV,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,mBAAmB;IACrD,MAAM,GAAsB,EAAE,CAAC;IAEvC;;OAEG;IACH,KAAK,CAAC,EAAU,EAAE,IAAY;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;CACJ"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { StructuredError } from "../errors/structured-errors.js";
|
|
2
|
+
import type { IdTracker } from "./id-tracker.js";
|
|
3
|
+
export declare function validateModule(node: unknown, path: string, errors: StructuredError[], idTracker: IdTracker): void;
|
|
4
|
+
export declare function validateTypeExpr(node: unknown, path: string, errors: StructuredError[], idTracker: IdTracker): void;
|
|
5
|
+
export declare function validateExpression(node: unknown, path: string, errors: StructuredError[], idTracker: IdTracker): void;
|
|
6
|
+
//# sourceMappingURL=node-validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-validators.d.ts","sourceRoot":"","sources":["../../src/validator/node-validators.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAUtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA0JjD,wBAAgB,cAAc,CAC1B,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EAAE,EACzB,SAAS,EAAE,SAAS,GACrB,IAAI,CAuCN;AAoWD,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EAAE,EACzB,SAAS,EAAE,SAAS,GACrB,IAAI,CA2CN;AAsKD,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EAAE,EACzB,SAAS,EAAE,SAAS,GACrB,IAAI,CA6DN"}
|