@nudojs/core 0.3.0 → 0.3.1
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/dist/chunk-BU4A6XJ3.js +6856 -0
- package/dist/exec.d.ts +2 -0
- package/dist/exec.js +168 -0
- package/dist/index-CVYjXnwU.d.ts +902 -0
- package/dist/index.d.ts +64 -710
- package/dist/index.js +3258 -8426
- package/package.json +18 -5
- package/CHANGELOG.md +0 -34
- package/src/__tests__/environment.test.ts +0 -48
- package/src/__tests__/fn-sig-impl.test.ts +0 -57
- package/src/__tests__/ops-refined.test.ts +0 -196
- package/src/__tests__/ops.test.ts +0 -84
- package/src/__tests__/type-value-phase2.test.ts +0 -117
- package/src/__tests__/type-value-phase3.test.ts +0 -94
- package/src/__tests__/type-value-refined.test.ts +0 -210
- package/src/__tests__/type-value.test.ts +0 -319
- package/src/algebra/__tests__/abs-native.test.ts +0 -176
- package/src/algebra/__tests__/arithmetic.test.ts +0 -170
- package/src/algebra/__tests__/ast-eval.test.ts +0 -154
- package/src/algebra/__tests__/bridge.test.ts +0 -160
- package/src/algebra/__tests__/call-budget.test.ts +0 -117
- package/src/algebra/__tests__/check-case-consistency.test.ts +0 -69
- package/src/algebra/__tests__/check-gold.test.ts +0 -290
- package/src/algebra/__tests__/check-json.test.ts +0 -57
- package/src/algebra/__tests__/check-mini-repo.test.ts +0 -49
- package/src/algebra/__tests__/check-real-commander.test.ts +0 -43
- package/src/algebra/__tests__/check-real-packages.test.ts +0 -165
- package/src/algebra/__tests__/check-recall-gold.test.ts +0 -1024
- package/src/algebra/__tests__/check-require-dep-memo.test.ts +0 -45
- package/src/algebra/__tests__/check-return-contract.test.ts +0 -90
- package/src/algebra/__tests__/check-shape-gold.test.ts +0 -303
- package/src/algebra/__tests__/check-source-memo.test.ts +0 -204
- package/src/algebra/__tests__/check.test.ts +0 -69
- package/src/algebra/__tests__/denote.test.ts +0 -77
- package/src/algebra/__tests__/diagnostics.test.ts +0 -64
- package/src/algebra/__tests__/differential.test.ts +0 -124
- package/src/algebra/__tests__/div-mod.test.ts +0 -38
- package/src/algebra/__tests__/example0.test.ts +0 -103
- package/src/algebra/__tests__/exec-analyze-throws.test.ts +0 -60
- package/src/algebra/__tests__/exec-async.test.ts +0 -46
- package/src/algebra/__tests__/exec-bpath.test.ts +0 -193
- package/src/algebra/__tests__/exec-class.test.ts +0 -56
- package/src/algebra/__tests__/exec-e2e.test.ts +0 -97
- package/src/algebra/__tests__/exec-generator.test.ts +0 -53
- package/src/algebra/__tests__/exec-inherit-default.test.ts +0 -111
- package/src/algebra/__tests__/exec-optional-nested.test.ts +0 -87
- package/src/algebra/__tests__/exec-rest.test.ts +0 -55
- package/src/algebra/__tests__/exec-spread-forof.test.ts +0 -85
- package/src/algebra/__tests__/exec-static-computed.test.ts +0 -61
- package/src/algebra/__tests__/exec-switch.test.ts +0 -74
- package/src/algebra/__tests__/exec-trycatch.test.ts +0 -71
- package/src/algebra/__tests__/fn-fp-memo.test.ts +0 -166
- package/src/algebra/__tests__/fn-fp-multidecl.test.ts +0 -49
- package/src/algebra/__tests__/format.test.ts +0 -34
- package/src/algebra/__tests__/generalize-memo.test.ts +0 -285
- package/src/algebra/__tests__/generalize.test.ts +0 -113
- package/src/algebra/__tests__/hash-source.test.ts +0 -19
- package/src/algebra/__tests__/hof.test.ts +0 -80
- package/src/algebra/__tests__/inlay.test.ts +0 -30
- package/src/algebra/__tests__/language.test.ts +0 -77
- package/src/algebra/__tests__/leq.test.ts +0 -109
- package/src/algebra/__tests__/load-deps-fp-memo.test.ts +0 -132
- package/src/algebra/__tests__/methods.test.ts +0 -37
- package/src/algebra/__tests__/node-types.test.ts +0 -26
- package/src/algebra/__tests__/nudo-constraints.ts +0 -46
- package/src/algebra/__tests__/objects.test.ts +0 -117
- package/src/algebra/__tests__/parse-source-cache.test.ts +0 -42
- package/src/algebra/__tests__/refine-import.test.ts +0 -109
- package/src/algebra/__tests__/stable-source-key-block.test.ts +0 -23
- package/src/algebra/__tests__/stable-source-key.test.ts +0 -31
- package/src/algebra/__tests__/surface.test.ts +0 -41
- package/src/algebra/__tests__/this-inherit.test.ts +0 -130
- package/src/algebra/abs-fn.ts +0 -49
- package/src/algebra/abs-modules.ts +0 -139
- package/src/algebra/abs.ts +0 -206
- package/src/algebra/arithmetic.ts +0 -691
- package/src/algebra/ast-eval.ts +0 -1763
- package/src/algebra/bridge.ts +0 -350
- package/src/algebra/builtins.ts +0 -373
- package/src/algebra/check-report.ts +0 -150
- package/src/algebra/check.ts +0 -1867
- package/src/algebra/constraint.ts +0 -304
- package/src/algebra/denote.ts +0 -166
- package/src/algebra/diagnostics.ts +0 -210
- package/src/algebra/exec/call.ts +0 -29
- package/src/algebra/exec/calls.ts +0 -96
- package/src/algebra/exec/class-registry.ts +0 -29
- package/src/algebra/exec/class.ts +0 -329
- package/src/algebra/exec/index.ts +0 -6
- package/src/algebra/exec/member-diag.ts +0 -141
- package/src/algebra/exec/run.ts +0 -341
- package/src/algebra/exec/runtime.ts +0 -583
- package/src/algebra/exec/transpile.ts +0 -993
- package/src/algebra/fn-fp.ts +0 -294
- package/src/algebra/format.ts +0 -91
- package/src/algebra/generalize.ts +0 -776
- package/src/algebra/hash-source.ts +0 -27
- package/src/algebra/index.ts +0 -34
- package/src/algebra/inlay.ts +0 -198
- package/src/algebra/language.ts +0 -289
- package/src/algebra/leak.ts +0 -68
- package/src/algebra/leq.ts +0 -301
- package/src/algebra/load-deps-fp.ts +0 -97
- package/src/algebra/methods.ts +0 -128
- package/src/algebra/objects.ts +0 -251
- package/src/algebra/parse-source.ts +0 -64
- package/src/algebra/phi.ts +0 -42
- package/src/algebra/pred.ts +0 -395
- package/src/algebra/refine.ts +0 -227
- package/src/algebra/stable-source-key.ts +0 -81
- package/src/algebra/surface.ts +0 -206
- package/src/algebra/template.ts +0 -143
- package/src/algebra/term.ts +0 -119
- package/src/environment.ts +0 -74
- package/src/index.ts +0 -73
- package/src/mock-helpers.ts +0 -166
- package/src/ops.ts +0 -191
- package/src/refinements/range.ts +0 -86
- package/src/refinements/template-predicates.ts +0 -11
- package/src/refinements/template.ts +0 -176
- package/src/strip-types.ts +0 -236
- package/src/type-value.ts +0 -513
- package/tsconfig.json +0 -8
package/src/algebra/bridge.ts
DELETED
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abs ⇄ TypeValue 桥。
|
|
3
|
-
*
|
|
4
|
-
* 纪律:
|
|
5
|
-
* - absToTypeValue 有损:丢 term/pred 时 conf 降为 widened,禁止假装 exact
|
|
6
|
-
* - typeValueToAbs 尽量恢复 term=lit
|
|
7
|
-
* - 下游(dts/lsp/service)吃 TypeValue;代数运算吃 Abs
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { TypeValue, LiteralValue as CoreLit } from "../type-value.ts";
|
|
11
|
-
import { T, typeValueToString } from "../type-value.ts";
|
|
12
|
-
import { createTemplate, getTemplateParts } from "../refinements/template.ts";
|
|
13
|
-
|
|
14
|
-
import type { Abs, Shape, Confidence } from "./abs.ts";
|
|
15
|
-
import { abs, confJoin, litValue } from "./abs.ts";
|
|
16
|
-
import type { Term } from "./term.ts";
|
|
17
|
-
import { lit, v as termVar, termToString } from "./term.ts";
|
|
18
|
-
import type { Pred } from "./pred.ts";
|
|
19
|
-
import { pTrue, predToString, gt, ge, lt, le } from "./pred.ts";
|
|
20
|
-
import { isTemplateLike, templatePartsOf, createTemplateAbs } from "./template.ts";
|
|
21
|
-
|
|
22
|
-
/** TypeValue 上的置信度旁路(零侵入 core) */
|
|
23
|
-
const confByTv = new WeakMap<object, Confidence>();
|
|
24
|
-
|
|
25
|
-
export function setTvConfidence(tv: TypeValue, conf: Confidence): void {
|
|
26
|
-
if (tv && typeof tv === "object") confByTv.set(tv as object, conf);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function getTvConfidence(tv: TypeValue): Confidence | undefined {
|
|
30
|
-
if (tv && typeof tv === "object") return confByTv.get(tv as object);
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Abs → TypeValue(给下游)。
|
|
36
|
-
* 有损:非 lit term 丢弃;pred 尽量 encode 成 refined,否则丢。
|
|
37
|
-
*/
|
|
38
|
-
export function absToTypeValue(a: Abs): TypeValue {
|
|
39
|
-
let conf = a.conf;
|
|
40
|
-
let result: TypeValue;
|
|
41
|
-
|
|
42
|
-
switch (a.shape.k) {
|
|
43
|
-
case "never":
|
|
44
|
-
result = T.never;
|
|
45
|
-
break;
|
|
46
|
-
case "unknown":
|
|
47
|
-
result = T.unknown;
|
|
48
|
-
break;
|
|
49
|
-
case "any":
|
|
50
|
-
// any ≠ unknown:任意 JS 值,不是分析失败。conf 保留(通常 path)
|
|
51
|
-
result = T.unknown;
|
|
52
|
-
break;
|
|
53
|
-
case "prim": {
|
|
54
|
-
const lv = litValue(a);
|
|
55
|
-
if (lv !== undefined) {
|
|
56
|
-
result = T.literal(lv as CoreLit);
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
// template string:parts → core createTemplate
|
|
60
|
-
if (isTemplateLike(a) && a.shape.k === "prim" && a.shape.type === "string") {
|
|
61
|
-
const parts = templatePartsOf(a).map(absToTypeValue);
|
|
62
|
-
result = createTemplate(parts);
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
// 有 pred 无 lit → refined 尽力,否则 primitive
|
|
66
|
-
const prim = primToT(a.shape.type);
|
|
67
|
-
if (a.pred && a.pred.op !== "true") {
|
|
68
|
-
const refined = tryEncodeRefined(prim, a);
|
|
69
|
-
if (refined) {
|
|
70
|
-
result = refined;
|
|
71
|
-
} else {
|
|
72
|
-
result = prim;
|
|
73
|
-
conf = confJoin(conf, "widened");
|
|
74
|
-
}
|
|
75
|
-
} else {
|
|
76
|
-
result = prim;
|
|
77
|
-
if (a.term && a.term.op !== "lit") conf = confJoin(conf, "widened");
|
|
78
|
-
}
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
case "obj": {
|
|
82
|
-
const props: Record<string, TypeValue> = {};
|
|
83
|
-
for (const [k, slot] of Object.entries(a.shape.slots)) {
|
|
84
|
-
let v = absToTypeValue(slot.value);
|
|
85
|
-
if (slot.optional) {
|
|
86
|
-
v = T.union(v, T.undefined);
|
|
87
|
-
}
|
|
88
|
-
props[k] = v;
|
|
89
|
-
}
|
|
90
|
-
result = T.object(props);
|
|
91
|
-
if (a.shape.open) conf = confJoin(conf, "widened");
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
case "arr":
|
|
95
|
-
result = T.array(absToTypeValue(a.shape.element));
|
|
96
|
-
break;
|
|
97
|
-
case "tuple":
|
|
98
|
-
result = T.tuple(a.shape.elements.map(absToTypeValue));
|
|
99
|
-
break;
|
|
100
|
-
case "fn": {
|
|
101
|
-
// 无 body 闭包:造 dummy function
|
|
102
|
-
const body = { type: "BlockStatement", body: [], directives: [] } as any;
|
|
103
|
-
result = T.fn(a.shape.params, body, null as any);
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
case "brand":
|
|
107
|
-
result = T.instanceOf(a.shape.name, brandProps(a.shape.shape));
|
|
108
|
-
break;
|
|
109
|
-
case "eff":
|
|
110
|
-
result = T.promise(absToTypeValue(a.shape.inner));
|
|
111
|
-
break;
|
|
112
|
-
case "sum":
|
|
113
|
-
result = T.union(...a.shape.members.map(absToTypeValue));
|
|
114
|
-
break;
|
|
115
|
-
default:
|
|
116
|
-
result = T.unknown;
|
|
117
|
-
conf = confJoin(conf, "partial");
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
setTvConfidence(result, conf);
|
|
121
|
-
return result;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function primToT(type: string): TypeValue {
|
|
125
|
-
switch (type) {
|
|
126
|
-
case "number":
|
|
127
|
-
return T.number;
|
|
128
|
-
case "string":
|
|
129
|
-
return T.string;
|
|
130
|
-
case "boolean":
|
|
131
|
-
return T.boolean;
|
|
132
|
-
case "bigint":
|
|
133
|
-
return T.bigint;
|
|
134
|
-
case "symbol":
|
|
135
|
-
return T.symbol;
|
|
136
|
-
default:
|
|
137
|
-
return T.unknown;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function brandProps(shape: Abs): Record<string, TypeValue> {
|
|
142
|
-
if (shape.shape.k === "obj") {
|
|
143
|
-
const out: Record<string, TypeValue> = {};
|
|
144
|
-
for (const [k, slot] of Object.entries(shape.shape.slots)) {
|
|
145
|
-
out[k] = absToTypeValue(slot.value);
|
|
146
|
-
}
|
|
147
|
-
return out;
|
|
148
|
-
}
|
|
149
|
-
return {};
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* 尝试把简单数值 pred 编码为 refined。
|
|
154
|
-
* 仅支持:term > n / >= n / < n / <= n,且 term 是 var 或相对自身。
|
|
155
|
-
* 返回 undefined 表示无法编码。
|
|
156
|
-
*/
|
|
157
|
-
function tryEncodeRefined(base: TypeValue, a: Abs): TypeValue | undefined {
|
|
158
|
-
// 比较结果等 boolean 上的 pred 是路径事实,不是数值 refine
|
|
159
|
-
if (base.kind !== "primitive" || base.type !== "number") return undefined;
|
|
160
|
-
const p = a.pred;
|
|
161
|
-
if (!p) return undefined;
|
|
162
|
-
// 仅处理原子比较,且右侧字面量
|
|
163
|
-
if (
|
|
164
|
-
(p.op === "gt" || p.op === "ge" || p.op === "lt" || p.op === "le") &&
|
|
165
|
-
p.b.op === "lit" &&
|
|
166
|
-
typeof p.b.value === "number"
|
|
167
|
-
) {
|
|
168
|
-
const n = p.b.value;
|
|
169
|
-
const op = p.op;
|
|
170
|
-
const check = (value: unknown): boolean => {
|
|
171
|
-
if (typeof value !== "number") return false;
|
|
172
|
-
switch (op) {
|
|
173
|
-
case "gt":
|
|
174
|
-
return value > n;
|
|
175
|
-
case "ge":
|
|
176
|
-
return value >= n;
|
|
177
|
-
case "lt":
|
|
178
|
-
return value < n;
|
|
179
|
-
case "le":
|
|
180
|
-
return value <= n;
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
const opSym = op === "gt" ? ">" : op === "ge" ? ">=" : op === "lt" ? "<" : "<=";
|
|
184
|
-
return T.refine(base, {
|
|
185
|
-
name: `number (${opSym} ${n})`,
|
|
186
|
-
meta: { op, n, pred: predToString(p) },
|
|
187
|
-
check,
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
return undefined;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* TypeValue → Abs(给代数运算)。
|
|
195
|
-
* 置信度:优先读 abs→tv 时挂上的 conf 旁路,避免 #widened 回升 #exact。
|
|
196
|
-
*/
|
|
197
|
-
export function typeValueToAbs(tv: TypeValue): Abs {
|
|
198
|
-
if (!tv) return abs({ k: "unknown" }, undefined, undefined, "partial");
|
|
199
|
-
|
|
200
|
-
/** abs→tv 时挂的 conf;无则用 fallback */
|
|
201
|
-
const confOr = (fallback: Confidence): Confidence => getTvConfidence(tv) ?? fallback;
|
|
202
|
-
|
|
203
|
-
switch (tv.kind) {
|
|
204
|
-
case "never":
|
|
205
|
-
return abs({ k: "never" }, undefined, undefined, confOr("exact"));
|
|
206
|
-
case "unknown":
|
|
207
|
-
// TypeValue 无 any kind:unknown+path 约定为「任意值」投影
|
|
208
|
-
return abs(
|
|
209
|
-
{ k: "unknown" },
|
|
210
|
-
undefined,
|
|
211
|
-
undefined,
|
|
212
|
-
confOr("partial"),
|
|
213
|
-
);
|
|
214
|
-
case "literal":
|
|
215
|
-
if (typeof tv.value === "bigint") {
|
|
216
|
-
// Abs term 不建模 bigint 字面量:只保留 prim 形状,放弃 literal identity
|
|
217
|
-
return abs(
|
|
218
|
-
{ k: "prim", type: "bigint" },
|
|
219
|
-
undefined,
|
|
220
|
-
undefined,
|
|
221
|
-
confOr("exact"),
|
|
222
|
-
);
|
|
223
|
-
}
|
|
224
|
-
return abs(
|
|
225
|
-
shapeOfLit(tv.value),
|
|
226
|
-
lit(tv.value),
|
|
227
|
-
pTrue,
|
|
228
|
-
confOr("exact"),
|
|
229
|
-
);
|
|
230
|
-
case "primitive":
|
|
231
|
-
return abs({ k: "prim", type: tv.type }, undefined, undefined, confOr("exact"));
|
|
232
|
-
case "refined": {
|
|
233
|
-
// template refined → 恢复 parts,便于链式拼接
|
|
234
|
-
const tplParts = getTemplateParts(tv);
|
|
235
|
-
if (tplParts) {
|
|
236
|
-
return createTemplateAbs(tplParts.map(typeValueToAbs));
|
|
237
|
-
}
|
|
238
|
-
const base = typeValueToAbs(tv.base);
|
|
239
|
-
const decoded = tryDecodeRefinedPred(tv, base.term);
|
|
240
|
-
return abs(
|
|
241
|
-
base.shape,
|
|
242
|
-
base.term ?? (decoded ? termVar("_r") : undefined),
|
|
243
|
-
decoded ?? base.pred,
|
|
244
|
-
confOr(confJoin(base.conf, "path")),
|
|
245
|
-
);
|
|
246
|
-
}
|
|
247
|
-
case "object": {
|
|
248
|
-
const slots: Record<string, { value: Abs }> = {};
|
|
249
|
-
for (const [k, v] of Object.entries(tv.properties)) {
|
|
250
|
-
slots[k] = { value: typeValueToAbs(v) };
|
|
251
|
-
}
|
|
252
|
-
return abs({ k: "obj", slots }, undefined, undefined, confOr("exact"));
|
|
253
|
-
}
|
|
254
|
-
case "array":
|
|
255
|
-
return abs(
|
|
256
|
-
{ k: "arr", element: typeValueToAbs(tv.element) },
|
|
257
|
-
undefined,
|
|
258
|
-
undefined,
|
|
259
|
-
confOr("exact"),
|
|
260
|
-
);
|
|
261
|
-
case "tuple":
|
|
262
|
-
return abs(
|
|
263
|
-
{ k: "tuple", elements: tv.elements.map(typeValueToAbs) },
|
|
264
|
-
undefined,
|
|
265
|
-
undefined,
|
|
266
|
-
confOr("exact"),
|
|
267
|
-
);
|
|
268
|
-
case "function": {
|
|
269
|
-
const params = tv.params ?? [];
|
|
270
|
-
return abs({ k: "fn", params }, undefined, undefined, confOr("exact"));
|
|
271
|
-
}
|
|
272
|
-
case "promise":
|
|
273
|
-
return abs(
|
|
274
|
-
{ k: "eff", eff: "promise", inner: typeValueToAbs(tv.value) },
|
|
275
|
-
undefined,
|
|
276
|
-
undefined,
|
|
277
|
-
confOr("exact"),
|
|
278
|
-
);
|
|
279
|
-
case "instance": {
|
|
280
|
-
const slots: Record<string, { value: Abs }> = {};
|
|
281
|
-
for (const [k, v] of Object.entries(tv.properties ?? {})) {
|
|
282
|
-
slots[k] = { value: typeValueToAbs(v) };
|
|
283
|
-
}
|
|
284
|
-
const inner = abs({ k: "obj", slots }, undefined, undefined, confOr("exact"));
|
|
285
|
-
return abs(
|
|
286
|
-
{ k: "brand", name: tv.className, shape: inner },
|
|
287
|
-
undefined,
|
|
288
|
-
undefined,
|
|
289
|
-
confOr("exact"),
|
|
290
|
-
);
|
|
291
|
-
}
|
|
292
|
-
case "union":
|
|
293
|
-
return abs(
|
|
294
|
-
{ k: "sum", members: tv.members.map(typeValueToAbs) },
|
|
295
|
-
undefined,
|
|
296
|
-
undefined,
|
|
297
|
-
confOr("path"),
|
|
298
|
-
);
|
|
299
|
-
default:
|
|
300
|
-
return abs({ k: "unknown" }, undefined, undefined, confOr("partial"));
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/** 从 refined.meta 反 encode 数值比较 pred(tryEncodeRefined 的逆) */
|
|
305
|
-
function tryDecodeRefinedPred(tv: TypeValue, term: Term | undefined): Pred | undefined {
|
|
306
|
-
if (tv.kind !== "refined") return undefined;
|
|
307
|
-
const meta = tv.refinement.meta as { op?: unknown; n?: unknown };
|
|
308
|
-
const op = meta?.op;
|
|
309
|
-
const n = meta?.n;
|
|
310
|
-
if (typeof n !== "number") return undefined;
|
|
311
|
-
if (op !== "gt" && op !== "ge" && op !== "lt" && op !== "le") return undefined;
|
|
312
|
-
const t = term ?? termVar("_r");
|
|
313
|
-
const b = lit(n);
|
|
314
|
-
switch (op) {
|
|
315
|
-
case "gt":
|
|
316
|
-
return gt(t, b);
|
|
317
|
-
case "ge":
|
|
318
|
-
return ge(t, b);
|
|
319
|
-
case "lt":
|
|
320
|
-
return lt(t, b);
|
|
321
|
-
case "le":
|
|
322
|
-
return le(t, b);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
function shapeOfLit(v: CoreLit): Shape {
|
|
327
|
-
if (typeof v === "number") return { k: "prim", type: "number" };
|
|
328
|
-
if (typeof v === "string") return { k: "prim", type: "string" };
|
|
329
|
-
if (typeof v === "boolean") return { k: "prim", type: "boolean" };
|
|
330
|
-
if (typeof v === "bigint") return { k: "prim", type: "bigint" };
|
|
331
|
-
return { k: "unknown" };
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* 有损检查:Abs 转 TypeValue 后是否丢了 term/pred。
|
|
336
|
-
* 用于金标与调试。
|
|
337
|
-
*/
|
|
338
|
-
export function bridgeIsLossy(a: Abs): { lossy: boolean; reasons: string[] } {
|
|
339
|
-
const reasons: string[] = [];
|
|
340
|
-
if (a.term && a.term.op !== "lit") {
|
|
341
|
-
reasons.push(`dropped term ${termToString(a.term)}`);
|
|
342
|
-
}
|
|
343
|
-
if (a.pred && a.pred.op !== "true") {
|
|
344
|
-
const tv = absToTypeValue(a);
|
|
345
|
-
if (tv.kind !== "refined") {
|
|
346
|
-
reasons.push(`dropped pred ${predToString(a.pred)}`);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
return { lossy: reasons.length > 0, reasons };
|
|
350
|
-
}
|