@tsonic/frontend 0.0.4 → 0.0.11
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/.tsbuildinfo +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ir/builder/exports.d.ts.map +1 -1
- package/dist/ir/builder/exports.js +8 -6
- package/dist/ir/builder/exports.js.map +1 -1
- package/dist/ir/builder/imports.d.ts.map +1 -1
- package/dist/ir/builder/imports.js +6 -6
- package/dist/ir/builder/imports.js.map +1 -1
- package/dist/ir/builder/statements.d.ts +7 -1
- package/dist/ir/builder/statements.d.ts.map +1 -1
- package/dist/ir/builder/statements.js +18 -5
- package/dist/ir/builder/statements.js.map +1 -1
- package/dist/ir/builder.test.js +70 -5
- package/dist/ir/builder.test.js.map +1 -1
- package/dist/ir/converters/anonymous-synthesis.d.ts +76 -0
- package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -0
- package/dist/ir/converters/anonymous-synthesis.js +307 -0
- package/dist/ir/converters/anonymous-synthesis.js.map +1 -0
- package/dist/ir/converters/expressions/access.d.ts.map +1 -1
- package/dist/ir/converters/expressions/access.js +65 -2
- package/dist/ir/converters/expressions/access.js.map +1 -1
- package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
- package/dist/ir/converters/expressions/calls.js +96 -1
- package/dist/ir/converters/expressions/calls.js.map +1 -1
- package/dist/ir/converters/expressions/collections.d.ts +3 -0
- package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
- package/dist/ir/converters/expressions/collections.js +43 -2
- package/dist/ir/converters/expressions/collections.js.map +1 -1
- package/dist/ir/converters/expressions/functions.d.ts.map +1 -1
- package/dist/ir/converters/expressions/functions.js +52 -5
- package/dist/ir/converters/expressions/functions.js.map +1 -1
- package/dist/ir/converters/expressions/helpers.d.ts +10 -0
- package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
- package/dist/ir/converters/expressions/helpers.js +173 -7
- package/dist/ir/converters/expressions/helpers.js.map +1 -1
- package/dist/ir/converters/expressions/index.d.ts +1 -1
- package/dist/ir/converters/expressions/index.d.ts.map +1 -1
- package/dist/ir/converters/expressions/index.js +1 -1
- package/dist/ir/converters/expressions/index.js.map +1 -1
- package/dist/ir/converters/expressions/literals.d.ts.map +1 -1
- package/dist/ir/converters/expressions/literals.js +2 -1
- package/dist/ir/converters/expressions/literals.js.map +1 -1
- package/dist/ir/converters/expressions/numeric-recovery.test.d.ts +14 -0
- package/dist/ir/converters/expressions/numeric-recovery.test.d.ts.map +1 -0
- package/dist/ir/converters/expressions/numeric-recovery.test.js +286 -0
- package/dist/ir/converters/expressions/numeric-recovery.test.js.map +1 -0
- package/dist/ir/converters/expressions/operators.d.ts.map +1 -1
- package/dist/ir/converters/expressions/operators.js +16 -2
- package/dist/ir/converters/expressions/operators.js.map +1 -1
- package/dist/ir/converters/expressions/other.d.ts.map +1 -1
- package/dist/ir/converters/expressions/other.js +4 -1
- package/dist/ir/converters/expressions/other.js.map +1 -1
- package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/conditionals.js +4 -6
- package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
- package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
- package/dist/ir/converters/statements/control/loops.js +6 -5
- package/dist/ir/converters/statements/control/loops.js.map +1 -1
- package/dist/ir/converters/statements/declarations/interfaces.d.ts +4 -3
- package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/interfaces.js +55 -1
- package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
- package/dist/ir/converters/statements/declarations/type-aliases.d.ts +8 -3
- package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/type-aliases.js +12 -2
- package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
- package/dist/ir/converters/synthetic-types.d.ts +38 -0
- package/dist/ir/converters/synthetic-types.d.ts.map +1 -0
- package/dist/ir/converters/synthetic-types.js +123 -0
- package/dist/ir/converters/synthetic-types.js.map +1 -0
- package/dist/ir/expression-converter.d.ts.map +1 -1
- package/dist/ir/expression-converter.js +81 -9
- package/dist/ir/expression-converter.js.map +1 -1
- package/dist/ir/statement-converter.d.ts +16 -1
- package/dist/ir/statement-converter.d.ts.map +1 -1
- package/dist/ir/statement-converter.js +32 -0
- package/dist/ir/statement-converter.js.map +1 -1
- package/dist/ir/type-converter/arrays.d.ts.map +1 -1
- package/dist/ir/type-converter/arrays.js +1 -0
- package/dist/ir/type-converter/arrays.js.map +1 -1
- package/dist/ir/type-converter/index.d.ts +1 -1
- package/dist/ir/type-converter/index.d.ts.map +1 -1
- package/dist/ir/type-converter/index.js +1 -1
- package/dist/ir/type-converter/index.js.map +1 -1
- package/dist/ir/type-converter/inference.d.ts +12 -0
- package/dist/ir/type-converter/inference.d.ts.map +1 -1
- package/dist/ir/type-converter/inference.js +172 -23
- package/dist/ir/type-converter/inference.js.map +1 -1
- package/dist/ir/type-converter/literals.d.ts.map +1 -1
- package/dist/ir/type-converter/literals.js +2 -1
- package/dist/ir/type-converter/literals.js.map +1 -1
- package/dist/ir/type-converter/objects.d.ts.map +1 -1
- package/dist/ir/type-converter/objects.js +2 -1
- package/dist/ir/type-converter/objects.js.map +1 -1
- package/dist/ir/type-converter/orchestrator.d.ts +2 -2
- package/dist/ir/type-converter/orchestrator.d.ts.map +1 -1
- package/dist/ir/type-converter/orchestrator.js +55 -1
- package/dist/ir/type-converter/orchestrator.js.map +1 -1
- package/dist/ir/type-converter/references.d.ts.map +1 -1
- package/dist/ir/type-converter/references.js +14 -18
- package/dist/ir/type-converter/references.js.map +1 -1
- package/dist/ir/type-converter.d.ts +1 -1
- package/dist/ir/type-converter.d.ts.map +1 -1
- package/dist/ir/type-converter.js +1 -1
- package/dist/ir/type-converter.js.map +1 -1
- package/dist/ir/types/expressions.d.ts +110 -1
- package/dist/ir/types/expressions.d.ts.map +1 -1
- package/dist/ir/types/guards.d.ts.map +1 -1
- package/dist/ir/types/guards.js +2 -0
- package/dist/ir/types/guards.js.map +1 -1
- package/dist/ir/types/index.d.ts +5 -3
- package/dist/ir/types/index.d.ts.map +1 -1
- package/dist/ir/types/index.js +1 -0
- package/dist/ir/types/index.js.map +1 -1
- package/dist/ir/types/ir-types.d.ts +33 -1
- package/dist/ir/types/ir-types.d.ts.map +1 -1
- package/dist/ir/types/numeric-kind.d.ts +68 -0
- package/dist/ir/types/numeric-kind.d.ts.map +1 -0
- package/dist/ir/types/numeric-kind.js +170 -0
- package/dist/ir/types/numeric-kind.js.map +1 -0
- package/dist/ir/types/statements.d.ts +38 -1
- package/dist/ir/types/statements.d.ts.map +1 -1
- package/dist/ir/types.d.ts +2 -1
- package/dist/ir/types.d.ts.map +1 -1
- package/dist/ir/types.js +2 -0
- package/dist/ir/types.js.map +1 -1
- package/dist/ir/validation/index.d.ts +7 -0
- package/dist/ir/validation/index.d.ts.map +1 -0
- package/dist/ir/validation/index.js +7 -0
- package/dist/ir/validation/index.js.map +1 -0
- package/dist/ir/validation/numeric-invariants.test.d.ts +15 -0
- package/dist/ir/validation/numeric-invariants.test.d.ts.map +1 -0
- package/dist/ir/validation/numeric-invariants.test.js +598 -0
- package/dist/ir/validation/numeric-invariants.test.js.map +1 -0
- package/dist/ir/validation/numeric-proof-pass.d.ts +37 -0
- package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -0
- package/dist/ir/validation/numeric-proof-pass.js +889 -0
- package/dist/ir/validation/numeric-proof-pass.js.map +1 -0
- package/dist/ir/validation/soundness-gate.d.ts +26 -0
- package/dist/ir/validation/soundness-gate.d.ts.map +1 -0
- package/dist/ir/validation/soundness-gate.js +551 -0
- package/dist/ir/validation/soundness-gate.js.map +1 -0
- package/dist/ir/validation/soundness-gate.test.d.ts +13 -0
- package/dist/ir/validation/soundness-gate.test.d.ts.map +1 -0
- package/dist/ir/validation/soundness-gate.test.js +315 -0
- package/dist/ir/validation/soundness-gate.test.js.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.d.ts +40 -0
- package/dist/ir/validation/yield-lowering-pass.d.ts.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.js +548 -0
- package/dist/ir/validation/yield-lowering-pass.js.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.test.d.ts +12 -0
- package/dist/ir/validation/yield-lowering-pass.test.d.ts.map +1 -0
- package/dist/ir/validation/yield-lowering-pass.test.js +761 -0
- package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -0
- package/dist/program/bindings.d.ts +5 -0
- package/dist/program/bindings.d.ts.map +1 -1
- package/dist/program/bindings.js +12 -1
- package/dist/program/bindings.js.map +1 -1
- package/dist/program/dependency-graph.d.ts +3 -0
- package/dist/program/dependency-graph.d.ts.map +1 -1
- package/dist/program/dependency-graph.js +28 -4
- package/dist/program/dependency-graph.js.map +1 -1
- package/dist/program/index.d.ts +1 -1
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js.map +1 -1
- package/dist/program.d.ts +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js.map +1 -1
- package/dist/resolver/clr-bindings-resolver.d.ts +9 -0
- package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
- package/dist/resolver/clr-bindings-resolver.js +52 -3
- package/dist/resolver/clr-bindings-resolver.js.map +1 -1
- package/dist/types/diagnostic.d.ts +1 -1
- package/dist/types/diagnostic.d.ts.map +1 -1
- package/dist/types/diagnostic.js.map +1 -1
- package/dist/validation/static-safety.d.ts +6 -1
- package/dist/validation/static-safety.d.ts.map +1 -1
- package/dist/validation/static-safety.js +144 -36
- package/dist/validation/static-safety.js.map +1 -1
- package/dist/validation/unsupported-utility-types.d.ts +38 -0
- package/dist/validation/unsupported-utility-types.d.ts.map +1 -0
- package/dist/validation/unsupported-utility-types.js +53 -0
- package/dist/validation/unsupported-utility-types.js.map +1 -0
- package/dist/validator.test.js +304 -14
- package/dist/validator.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/types/parameter-modifiers.d.ts +0 -55
- package/dist/types/parameter-modifiers.d.ts.map +0 -1
- package/dist/types/parameter-modifiers.js +0 -148
- package/dist/types/parameter-modifiers.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthetic-types.js","sourceRoot":"","sources":["../../../src/ir/converters/synthetic-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-converter.d.ts","sourceRoot":"","sources":["../../src/ir/expression-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"expression-converter.d.ts","sourceRoot":"","sources":["../../src/ir/expression-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,YAAY,EAIb,MAAM,YAAY,CAAC;AA6DpB;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,EAAE,CAAC,UAAU,EACnB,SAAS,EAAE,CAAC,WAAW,KACtB,YA2MF,CAAC;AAGF,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,qCAAqC,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Main dispatcher - delegates to specialized modules
|
|
4
4
|
*/
|
|
5
5
|
import * as ts from "typescript";
|
|
6
|
+
import { TSONIC_TO_NUMERIC_KIND, } from "./types.js";
|
|
6
7
|
import { getBindingRegistry } from "./converters/statements/declarations/registry.js";
|
|
7
8
|
import { convertType } from "./type-converter.js";
|
|
8
9
|
// Import expression converters from specialized modules
|
|
@@ -13,7 +14,31 @@ import { convertCallExpression, convertNewExpression, } from "./converters/expre
|
|
|
13
14
|
import { convertBinaryExpression, convertUnaryExpression, convertUpdateExpression, } from "./converters/expressions/operators.js";
|
|
14
15
|
import { convertFunctionExpression, convertArrowFunction, } from "./converters/expressions/functions.js";
|
|
15
16
|
import { convertConditionalExpression, convertTemplateLiteral, } from "./converters/expressions/other.js";
|
|
16
|
-
import { getInferredType } from "./converters/expressions/helpers.js";
|
|
17
|
+
import { getInferredType, getSourceSpan, } from "./converters/expressions/helpers.js";
|
|
18
|
+
/**
|
|
19
|
+
* Extract the NumericKind from a type node if it references a known numeric alias.
|
|
20
|
+
*
|
|
21
|
+
* Examples:
|
|
22
|
+
* - `int` → "Int32"
|
|
23
|
+
* - `byte` → "Byte"
|
|
24
|
+
* - `long` → "Int64"
|
|
25
|
+
* - `string` → undefined (not numeric)
|
|
26
|
+
*/
|
|
27
|
+
const getNumericKindFromTypeNode = (typeNode) => {
|
|
28
|
+
// Handle type reference nodes (e.g., `int`, `byte`, `Int32`)
|
|
29
|
+
if (ts.isTypeReferenceNode(typeNode)) {
|
|
30
|
+
const typeName = typeNode.typeName;
|
|
31
|
+
if (ts.isIdentifier(typeName)) {
|
|
32
|
+
const name = typeName.text;
|
|
33
|
+
// Look up the type alias name in our mapping
|
|
34
|
+
const kind = TSONIC_TO_NUMERIC_KIND.get(name);
|
|
35
|
+
if (kind !== undefined) {
|
|
36
|
+
return kind;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
};
|
|
17
42
|
/**
|
|
18
43
|
* Main expression conversion dispatcher
|
|
19
44
|
* Converts TypeScript expression nodes to IR expressions
|
|
@@ -30,10 +55,17 @@ export const convertExpression = (node, checker) => {
|
|
|
30
55
|
value: node.kind === ts.SyntaxKind.TrueKeyword,
|
|
31
56
|
raw: node.getText(),
|
|
32
57
|
inferredType,
|
|
58
|
+
sourceSpan: getSourceSpan(node),
|
|
33
59
|
};
|
|
34
60
|
}
|
|
35
61
|
if (node.kind === ts.SyntaxKind.NullKeyword) {
|
|
36
|
-
return {
|
|
62
|
+
return {
|
|
63
|
+
kind: "literal",
|
|
64
|
+
value: null,
|
|
65
|
+
raw: "null",
|
|
66
|
+
inferredType,
|
|
67
|
+
sourceSpan: getSourceSpan(node),
|
|
68
|
+
};
|
|
37
69
|
}
|
|
38
70
|
if (node.kind === ts.SyntaxKind.UndefinedKeyword ||
|
|
39
71
|
ts.isVoidExpression(node)) {
|
|
@@ -42,6 +74,7 @@ export const convertExpression = (node, checker) => {
|
|
|
42
74
|
value: undefined,
|
|
43
75
|
raw: "undefined",
|
|
44
76
|
inferredType,
|
|
77
|
+
sourceSpan: getSourceSpan(node),
|
|
45
78
|
};
|
|
46
79
|
}
|
|
47
80
|
if (ts.isIdentifier(node)) {
|
|
@@ -52,12 +85,18 @@ export const convertExpression = (node, checker) => {
|
|
|
52
85
|
kind: "identifier",
|
|
53
86
|
name: node.text,
|
|
54
87
|
inferredType,
|
|
88
|
+
sourceSpan: getSourceSpan(node),
|
|
55
89
|
resolvedClrType: binding.type,
|
|
56
90
|
resolvedAssembly: binding.assembly,
|
|
57
91
|
csharpName: binding.csharpName, // Optional C# name from binding
|
|
58
92
|
};
|
|
59
93
|
}
|
|
60
|
-
return {
|
|
94
|
+
return {
|
|
95
|
+
kind: "identifier",
|
|
96
|
+
name: node.text,
|
|
97
|
+
inferredType,
|
|
98
|
+
sourceSpan: getSourceSpan(node),
|
|
99
|
+
};
|
|
61
100
|
}
|
|
62
101
|
if (ts.isArrayLiteralExpression(node)) {
|
|
63
102
|
return convertArrayLiteral(node, checker);
|
|
@@ -90,6 +129,7 @@ export const convertExpression = (node, checker) => {
|
|
|
90
129
|
operator: "typeof",
|
|
91
130
|
expression: convertExpression(node.expression, checker),
|
|
92
131
|
inferredType,
|
|
132
|
+
sourceSpan: getSourceSpan(node),
|
|
93
133
|
};
|
|
94
134
|
}
|
|
95
135
|
if (ts.isVoidExpression(node)) {
|
|
@@ -98,6 +138,7 @@ export const convertExpression = (node, checker) => {
|
|
|
98
138
|
operator: "void",
|
|
99
139
|
expression: convertExpression(node.expression, checker),
|
|
100
140
|
inferredType,
|
|
141
|
+
sourceSpan: getSourceSpan(node),
|
|
101
142
|
};
|
|
102
143
|
}
|
|
103
144
|
if (ts.isDeleteExpression(node)) {
|
|
@@ -106,6 +147,7 @@ export const convertExpression = (node, checker) => {
|
|
|
106
147
|
operator: "delete",
|
|
107
148
|
expression: convertExpression(node.expression, checker),
|
|
108
149
|
inferredType,
|
|
150
|
+
sourceSpan: getSourceSpan(node),
|
|
109
151
|
};
|
|
110
152
|
}
|
|
111
153
|
if (ts.isConditionalExpression(node)) {
|
|
@@ -126,16 +168,18 @@ export const convertExpression = (node, checker) => {
|
|
|
126
168
|
kind: "spread",
|
|
127
169
|
expression: convertExpression(node.expression, checker),
|
|
128
170
|
inferredType,
|
|
171
|
+
sourceSpan: getSourceSpan(node),
|
|
129
172
|
};
|
|
130
173
|
}
|
|
131
174
|
if (node.kind === ts.SyntaxKind.ThisKeyword) {
|
|
132
|
-
return { kind: "this", inferredType };
|
|
175
|
+
return { kind: "this", inferredType, sourceSpan: getSourceSpan(node) };
|
|
133
176
|
}
|
|
134
177
|
if (ts.isAwaitExpression(node)) {
|
|
135
178
|
return {
|
|
136
179
|
kind: "await",
|
|
137
180
|
expression: convertExpression(node.expression, checker),
|
|
138
181
|
inferredType,
|
|
182
|
+
sourceSpan: getSourceSpan(node),
|
|
139
183
|
};
|
|
140
184
|
}
|
|
141
185
|
if (ts.isYieldExpression(node)) {
|
|
@@ -146,6 +190,7 @@ export const convertExpression = (node, checker) => {
|
|
|
146
190
|
: undefined,
|
|
147
191
|
delegate: !!node.asteriskToken,
|
|
148
192
|
inferredType,
|
|
193
|
+
sourceSpan: getSourceSpan(node),
|
|
149
194
|
};
|
|
150
195
|
}
|
|
151
196
|
if (ts.isParenthesizedExpression(node)) {
|
|
@@ -153,14 +198,41 @@ export const convertExpression = (node, checker) => {
|
|
|
153
198
|
}
|
|
154
199
|
if (ts.isAsExpression(node) || ts.isTypeAssertionExpression(node)) {
|
|
155
200
|
// Convert the inner expression
|
|
156
|
-
const innerExpr = convertExpression(
|
|
157
|
-
//
|
|
158
|
-
const assertedTypeNode =
|
|
201
|
+
const innerExpr = convertExpression(node.expression, checker);
|
|
202
|
+
// Get the asserted type
|
|
203
|
+
const assertedTypeNode = node.type;
|
|
159
204
|
const assertedType = convertType(assertedTypeNode, checker);
|
|
160
|
-
|
|
205
|
+
// Check if this is a numeric narrowing (e.g., `as int`, `as byte`)
|
|
206
|
+
const numericKind = getNumericKindFromTypeNode(assertedTypeNode);
|
|
207
|
+
if (numericKind !== undefined) {
|
|
208
|
+
// Create a numeric narrowing expression that preserves the inner expression
|
|
209
|
+
const narrowingExpr = {
|
|
210
|
+
kind: "numericNarrowing",
|
|
211
|
+
expression: innerExpr,
|
|
212
|
+
targetKind: numericKind,
|
|
213
|
+
inferredType: {
|
|
214
|
+
kind: "primitiveType",
|
|
215
|
+
name: "number",
|
|
216
|
+
numericIntent: numericKind,
|
|
217
|
+
},
|
|
218
|
+
sourceSpan: getSourceSpan(node),
|
|
219
|
+
};
|
|
220
|
+
return narrowingExpr;
|
|
221
|
+
}
|
|
222
|
+
// Non-numeric assertion - keep existing behavior (overwrite inferredType)
|
|
223
|
+
return {
|
|
224
|
+
...innerExpr,
|
|
225
|
+
inferredType: assertedType,
|
|
226
|
+
sourceSpan: getSourceSpan(node),
|
|
227
|
+
};
|
|
161
228
|
}
|
|
162
229
|
// Fallback - treat as identifier
|
|
163
|
-
return {
|
|
230
|
+
return {
|
|
231
|
+
kind: "identifier",
|
|
232
|
+
name: node.getText(),
|
|
233
|
+
inferredType,
|
|
234
|
+
sourceSpan: getSourceSpan(node),
|
|
235
|
+
};
|
|
164
236
|
};
|
|
165
237
|
// Re-export commonly used functions for backward compatibility
|
|
166
238
|
export { getInferredType, extractTypeArguments, checkIfRequiresSpecialization, } from "./converters/expressions/helpers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-converter.js","sourceRoot":"","sources":["../../src/ir/expression-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"expression-converter.js","sourceRoot":"","sources":["../../src/ir/expression-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,25 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import * as ts from "typescript";
|
|
6
6
|
import { IrStatement } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Result type for statement conversion.
|
|
9
|
+
* Some converters (like type aliases with synthetic types) return multiple statements.
|
|
10
|
+
*/
|
|
11
|
+
export type ConvertStatementResult = IrStatement | readonly IrStatement[] | null;
|
|
7
12
|
/**
|
|
8
13
|
* Main statement converter dispatcher
|
|
9
14
|
*/
|
|
10
|
-
export declare const convertStatement: (node: ts.Node, checker: ts.TypeChecker) =>
|
|
15
|
+
export declare const convertStatement: (node: ts.Node, checker: ts.TypeChecker) => ConvertStatementResult;
|
|
16
|
+
/**
|
|
17
|
+
* Flatten a convert statement result into an array of statements.
|
|
18
|
+
* Handles both single statements and arrays.
|
|
19
|
+
*/
|
|
20
|
+
export declare const flattenStatementResult: (result: ConvertStatementResult) => readonly IrStatement[];
|
|
21
|
+
/**
|
|
22
|
+
* Convert a statement and return a single statement (for contexts where arrays not expected).
|
|
23
|
+
* Type aliases inside control flow will return the first statement (usually the only one).
|
|
24
|
+
*/
|
|
25
|
+
export declare const convertStatementSingle: (node: ts.Node, checker: ts.TypeChecker) => IrStatement | null;
|
|
11
26
|
export { convertBlockStatement } from "./converters/statements/control.js";
|
|
12
27
|
export { convertParameters } from "./converters/statements/helpers.js";
|
|
13
28
|
export { setMetadataRegistry, setBindingRegistry, } from "./converters/statements/declarations.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statement-converter.d.ts","sourceRoot":"","sources":["../../src/ir/statement-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwBzC;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,KACtB,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"statement-converter.d.ts","sourceRoot":"","sources":["../../src/ir/statement-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwBzC;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAC9B,WAAW,GACX,SAAS,WAAW,EAAE,GACtB,IAAI,CAAC;AAET;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,KACtB,sBAoFF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GACjC,QAAQ,sBAAsB,KAC7B,SAAS,WAAW,EAStB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,KACtB,WAAW,GAAG,IAYhB,CAAC;AAGF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,yCAAyC,CAAC"}
|
|
@@ -26,6 +26,7 @@ export const convertStatement = (node, checker) => {
|
|
|
26
26
|
if (ts.isEnumDeclaration(node)) {
|
|
27
27
|
return convertEnumDeclaration(node, checker);
|
|
28
28
|
}
|
|
29
|
+
// Type alias declarations may return multiple statements (synthetic interfaces + alias)
|
|
29
30
|
if (ts.isTypeAliasDeclaration(node)) {
|
|
30
31
|
return convertTypeAliasDeclaration(node, checker);
|
|
31
32
|
}
|
|
@@ -93,6 +94,37 @@ export const convertStatement = (node, checker) => {
|
|
|
93
94
|
}
|
|
94
95
|
return null;
|
|
95
96
|
};
|
|
97
|
+
/**
|
|
98
|
+
* Flatten a convert statement result into an array of statements.
|
|
99
|
+
* Handles both single statements and arrays.
|
|
100
|
+
*/
|
|
101
|
+
export const flattenStatementResult = (result) => {
|
|
102
|
+
if (result === null) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
if (Array.isArray(result)) {
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
// At this point, result is IrStatement (not array, not null)
|
|
109
|
+
return [result];
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Convert a statement and return a single statement (for contexts where arrays not expected).
|
|
113
|
+
* Type aliases inside control flow will return the first statement (usually the only one).
|
|
114
|
+
*/
|
|
115
|
+
export const convertStatementSingle = (node, checker) => {
|
|
116
|
+
const result = convertStatement(node, checker);
|
|
117
|
+
if (result === null) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
if (Array.isArray(result)) {
|
|
121
|
+
// In control flow contexts, we expect single statements
|
|
122
|
+
// Return first statement (type aliases in control flow are rare)
|
|
123
|
+
return result[0] ?? null;
|
|
124
|
+
}
|
|
125
|
+
// At this point, result is IrStatement (not array, not null)
|
|
126
|
+
return result;
|
|
127
|
+
};
|
|
96
128
|
// Re-export commonly used functions for backward compatibility
|
|
97
129
|
export { convertBlockStatement } from "./converters/statements/control.js";
|
|
98
130
|
export { convertParameters } from "./converters/statements/helpers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statement-converter.js","sourceRoot":"","sources":["../../src/ir/statement-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,6CAA6C;AAC7C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,2BAA2B,EAC3B,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"statement-converter.js","sourceRoot":"","sources":["../../src/ir/statement-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../../../src/ir/type-converter/arrays.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,EAAE,CAAC,aAAa,EACtB,SAAS,EAAE,CAAC,WAAW,EACvB,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,KAAK,MAAM,KAClE,
|
|
1
|
+
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../../../src/ir/type-converter/arrays.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,EAAE,CAAC,aAAa,EACtB,SAAS,EAAE,CAAC,WAAW,EACvB,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,KAAK,MAAM,KAClE,MAMF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../../../src/ir/type-converter/arrays.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAsB,EACtB,OAAuB,EACvB,WAAmE,EAC3D,EAAE;IACV,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../../../src/ir/type-converter/arrays.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAsB,EACtB,OAAuB,EACvB,WAAmE,EAC3D,EAAE;IACV,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;QACnD,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { convertType, convertFunctionType, convertObjectType, } from "./converter.js";
|
|
5
5
|
export { convertBindingName } from "./patterns.js";
|
|
6
|
-
export { inferType, convertTsTypeToIr } from "./inference.js";
|
|
6
|
+
export { inferType, convertTsTypeToIr, inferLambdaParamTypes, type LambdaParamInferenceResult, } from "./inference.js";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ir/type-converter/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ir/type-converter/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,gBAAgB,CAAC"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { convertType, convertFunctionType, convertObjectType, } from "./converter.js";
|
|
5
5
|
export { convertBindingName } from "./patterns.js";
|
|
6
|
-
export { inferType, convertTsTypeToIr } from "./inference.js";
|
|
6
|
+
export { inferType, convertTsTypeToIr, inferLambdaParamTypes, } from "./inference.js";
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ir/type-converter/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ir/type-converter/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,gBAAgB,CAAC"}
|
|
@@ -4,9 +4,21 @@
|
|
|
4
4
|
* This uses the TypeChecker to get the inferred type and converts it to IR.
|
|
5
5
|
* Used for declarations without explicit type annotations where the type
|
|
6
6
|
* must be inferred from the initializer.
|
|
7
|
+
*
|
|
8
|
+
* Also provides contextual signature inference for lambda parameters.
|
|
7
9
|
*/
|
|
8
10
|
import * as ts from "typescript";
|
|
9
11
|
import type { IrType } from "../types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Result of inferring lambda parameter types from contextual signature.
|
|
14
|
+
* Returns array of IrType (one per parameter) if all params can be inferred,
|
|
15
|
+
* or undefined if inference fails for any parameter.
|
|
16
|
+
*/
|
|
17
|
+
export type LambdaParamInferenceResult = {
|
|
18
|
+
readonly paramTypes: readonly (IrType | undefined)[];
|
|
19
|
+
readonly allInferred: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare const inferLambdaParamTypes: (node: ts.ArrowFunction | ts.FunctionExpression, checker: ts.TypeChecker) => LambdaParamInferenceResult | undefined;
|
|
10
22
|
/**
|
|
11
23
|
* Infer IR type from a declaration node using the TypeChecker.
|
|
12
24
|
* Returns undefined for complex types that cannot be easily represented.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../../src/ir/type-converter/inference.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../../src/ir/type-converter/inference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,CAAC;AA4CF,eAAO,MAAM,qBAAqB,GAChC,MAAM,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EAC9C,SAAS,EAAE,CAAC,WAAW,KACtB,0BAA0B,GAAG,SAkG/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,GACpB,MAAM,EAAE,CAAC,mBAAmB,GAAG,EAAE,CAAC,mBAAmB,EACrD,SAAS,EAAE,CAAC,WAAW,KACtB,MAAM,GAAG,SAGX,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,WAAW,KACtB,MAAM,GAAG,SAiIX,CAAC"}
|
|
@@ -4,8 +4,126 @@
|
|
|
4
4
|
* This uses the TypeChecker to get the inferred type and converts it to IR.
|
|
5
5
|
* Used for declarations without explicit type annotations where the type
|
|
6
6
|
* must be inferred from the initializer.
|
|
7
|
+
*
|
|
8
|
+
* Also provides contextual signature inference for lambda parameters.
|
|
7
9
|
*/
|
|
8
10
|
import * as ts from "typescript";
|
|
11
|
+
import { convertType } from "./converter.js";
|
|
12
|
+
/**
|
|
13
|
+
* Infer parameter types for a lambda (arrow function or function expression)
|
|
14
|
+
* from its contextual signature.
|
|
15
|
+
*
|
|
16
|
+
* Uses checker.getContextualType() + getCallSignatures() to find the contextual
|
|
17
|
+
* signature for the lambda.
|
|
18
|
+
*
|
|
19
|
+
* Returns undefined if no contextual signature exists (free-floating lambda).
|
|
20
|
+
* Returns paramTypes array where each element is IrType if inferred, or undefined if not.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Extract the non-nullish callable type from a contextual type.
|
|
24
|
+
* For optional callbacks like sort's comparator, the contextual type is
|
|
25
|
+
* `((a: T, b: T) => number) | undefined`. We need to extract the function type.
|
|
26
|
+
*/
|
|
27
|
+
const extractCallableType = (type) => {
|
|
28
|
+
// If type has call signatures directly, use it
|
|
29
|
+
if (type.getCallSignatures().length > 0) {
|
|
30
|
+
return type;
|
|
31
|
+
}
|
|
32
|
+
// If it's a union, try to find a callable member (excluding undefined/null)
|
|
33
|
+
if (type.flags & ts.TypeFlags.Union) {
|
|
34
|
+
const unionType = type;
|
|
35
|
+
for (const member of unionType.types) {
|
|
36
|
+
// Skip undefined and null
|
|
37
|
+
if (member.flags & ts.TypeFlags.Undefined ||
|
|
38
|
+
member.flags & ts.TypeFlags.Null) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// Check if this member has call signatures
|
|
42
|
+
if (member.getCallSignatures().length > 0) {
|
|
43
|
+
return member;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
};
|
|
49
|
+
export const inferLambdaParamTypes = (node, checker) => {
|
|
50
|
+
// Get contextual type for the lambda
|
|
51
|
+
const contextualType = checker.getContextualType(node);
|
|
52
|
+
if (!contextualType) {
|
|
53
|
+
return undefined; // No contextual type - can't infer
|
|
54
|
+
}
|
|
55
|
+
// Extract callable type (handles union with undefined for optional callbacks)
|
|
56
|
+
const callableType = extractCallableType(contextualType);
|
|
57
|
+
if (!callableType) {
|
|
58
|
+
return undefined; // No callable type found
|
|
59
|
+
}
|
|
60
|
+
// Get call signatures from callable type
|
|
61
|
+
const signatures = callableType.getCallSignatures();
|
|
62
|
+
if (signatures.length === 0) {
|
|
63
|
+
return undefined; // No call signature - can't infer
|
|
64
|
+
}
|
|
65
|
+
// Pick signature that can cover lambda arity (avoid overload mismatches)
|
|
66
|
+
const signature = signatures.find((s) => s.getParameters().length >= node.parameters.length) ?? signatures[0];
|
|
67
|
+
if (!signature) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const sigParams = signature.getParameters();
|
|
71
|
+
const paramTypes = [];
|
|
72
|
+
let allInferred = true;
|
|
73
|
+
for (let i = 0; i < node.parameters.length; i++) {
|
|
74
|
+
const param = node.parameters[i];
|
|
75
|
+
if (!param) {
|
|
76
|
+
paramTypes.push(undefined);
|
|
77
|
+
allInferred = false;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// If param has explicit type annotation, don't need inference
|
|
81
|
+
if (param.type) {
|
|
82
|
+
paramTypes.push(undefined); // Will use explicit type
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// Get the corresponding signature parameter
|
|
86
|
+
const sigParam = sigParams[i];
|
|
87
|
+
if (!sigParam) {
|
|
88
|
+
// Lambda has more params than signature provides
|
|
89
|
+
paramTypes.push(undefined);
|
|
90
|
+
allInferred = false;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// Get the TS type for this parameter from the signature
|
|
94
|
+
const tsType = checker.getTypeOfSymbolAtLocation(sigParam, sigParam.valueDeclaration ?? node);
|
|
95
|
+
// A1: Contextual any/unknown from lib.d.ts is acceptable - map to unknownType
|
|
96
|
+
// This enables Promise executor inference where reject has `any`
|
|
97
|
+
if (tsType.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
|
|
98
|
+
paramTypes.push({ kind: "unknownType" });
|
|
99
|
+
continue; // Don't set allInferred=false - we did infer something safe
|
|
100
|
+
}
|
|
101
|
+
// A2: Prefer typeToTypeNode → convertType (handles function types)
|
|
102
|
+
// convertTsTypeToIr returns undefined for callable signatures
|
|
103
|
+
const typeNode = checker.typeToTypeNode(tsType, param ?? node, ts.NodeBuilderFlags.None);
|
|
104
|
+
let irType;
|
|
105
|
+
if (typeNode) {
|
|
106
|
+
// Guard: if typeToTypeNode produced AnyKeyword, use unknownType
|
|
107
|
+
if (typeNode.kind === ts.SyntaxKind.AnyKeyword) {
|
|
108
|
+
irType = { kind: "unknownType" };
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
irType = convertType(typeNode, checker);
|
|
112
|
+
// Extra safety: if convertType somehow produced anyType, coerce to unknownType
|
|
113
|
+
if (irType && irType.kind === "anyType") {
|
|
114
|
+
irType = { kind: "unknownType" };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Fallback to convertTsTypeToIr for cases TS can't produce a node
|
|
120
|
+
irType = convertTsTypeToIr(tsType, checker);
|
|
121
|
+
}
|
|
122
|
+
// Final fallback: use unknownType rather than failing inference
|
|
123
|
+
paramTypes.push(irType ?? { kind: "unknownType" });
|
|
124
|
+
}
|
|
125
|
+
return { paramTypes, allInferred };
|
|
126
|
+
};
|
|
9
127
|
/**
|
|
10
128
|
* Infer IR type from a declaration node using the TypeChecker.
|
|
11
129
|
* Returns undefined for complex types that cannot be easily represented.
|
|
@@ -51,29 +169,30 @@ export const convertTsTypeToIr = (type, checker) => {
|
|
|
51
169
|
return { kind: "arrayType", elementType };
|
|
52
170
|
}
|
|
53
171
|
}
|
|
172
|
+
// Cannot convert element type - use anyType as marker
|
|
173
|
+
// The IR soundness gate will catch this and emit TSN7414
|
|
54
174
|
return { kind: "arrayType", elementType: { kind: "anyType" } };
|
|
55
175
|
}
|
|
56
|
-
// Check for
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
// Function types need complex handling - return undefined for now
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
// Check for symbol with name (class, interface, etc.)
|
|
176
|
+
// Check for symbol with name FIRST (class, interface, delegate types like Action)
|
|
177
|
+
// This must come before callable check because delegates like Action have call signatures
|
|
178
|
+
// but should be returned as named reference types
|
|
63
179
|
const objectType = type;
|
|
64
|
-
|
|
65
|
-
|
|
180
|
+
// First check aliasSymbol (for type aliases like Action = () => void)
|
|
181
|
+
// Then check symbol (for interfaces/classes)
|
|
182
|
+
const typeSymbol = type.aliasSymbol ?? objectType.symbol;
|
|
183
|
+
if (typeSymbol) {
|
|
184
|
+
const name = typeSymbol.name;
|
|
66
185
|
// Skip internal TypeScript symbol names
|
|
67
|
-
if (name.startsWith("__")
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
//
|
|
73
|
-
const
|
|
74
|
-
|
|
186
|
+
if (!name.startsWith("__") &&
|
|
187
|
+
name &&
|
|
188
|
+
name !== "Object" &&
|
|
189
|
+
name !== "Array") {
|
|
190
|
+
// For named types, return as reference type with type arguments if generic
|
|
191
|
+
// Use aliasTypeArguments for type aliases, getTypeArguments for others
|
|
192
|
+
const typeArgs = type.aliasTypeArguments ??
|
|
193
|
+
checker.getTypeArguments(type);
|
|
75
194
|
if (typeArgs && typeArgs.length > 0) {
|
|
76
|
-
const irTypeArgs = typeArgs
|
|
195
|
+
const irTypeArgs = Array.from(typeArgs)
|
|
77
196
|
.map((arg) => convertTsTypeToIr(arg, checker))
|
|
78
197
|
.filter((t) => t !== undefined);
|
|
79
198
|
if (irTypeArgs.length === typeArgs.length) {
|
|
@@ -83,6 +202,12 @@ export const convertTsTypeToIr = (type, checker) => {
|
|
|
83
202
|
return { kind: "referenceType", name };
|
|
84
203
|
}
|
|
85
204
|
}
|
|
205
|
+
// Check for callable signatures (anonymous function types)
|
|
206
|
+
const callSignatures = type.getCallSignatures();
|
|
207
|
+
if (callSignatures.length > 0) {
|
|
208
|
+
// Anonymous function types need complex handling - return undefined for now
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
86
211
|
// Anonymous object type
|
|
87
212
|
return undefined;
|
|
88
213
|
}
|
|
@@ -92,13 +217,37 @@ export const convertTsTypeToIr = (type, checker) => {
|
|
|
92
217
|
const name = typeParam.symbol?.name ?? "T";
|
|
93
218
|
return { kind: "typeParameterType", name };
|
|
94
219
|
}
|
|
95
|
-
// Any
|
|
96
|
-
if (flags & ts.TypeFlags.Any
|
|
220
|
+
// Any type - keep as anyType so validation can catch it (TSN7401)
|
|
221
|
+
if (flags & ts.TypeFlags.Any) {
|
|
97
222
|
return { kind: "anyType" };
|
|
98
223
|
}
|
|
99
|
-
//
|
|
100
|
-
if (flags & ts.TypeFlags.
|
|
101
|
-
return
|
|
224
|
+
// Unknown type - this is legitimate, user explicitly wrote 'unknown'
|
|
225
|
+
if (flags & ts.TypeFlags.Unknown) {
|
|
226
|
+
return { kind: "unknownType" };
|
|
227
|
+
}
|
|
228
|
+
// Union types - convert each member, require all to succeed
|
|
229
|
+
if (flags & ts.TypeFlags.Union) {
|
|
230
|
+
const unionType = type;
|
|
231
|
+
const memberTypes = unionType.types
|
|
232
|
+
.map((t) => convertTsTypeToIr(t, checker))
|
|
233
|
+
.filter((t) => t !== undefined);
|
|
234
|
+
// If any member failed conversion, return undefined (keep TSN7405 strict)
|
|
235
|
+
if (memberTypes.length !== unionType.types.length) {
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
return { kind: "unionType", types: memberTypes };
|
|
239
|
+
}
|
|
240
|
+
// Intersection types - convert each member, require all to succeed
|
|
241
|
+
if (flags & ts.TypeFlags.Intersection) {
|
|
242
|
+
const intersectionType = type;
|
|
243
|
+
const memberTypes = intersectionType.types
|
|
244
|
+
.map((t) => convertTsTypeToIr(t, checker))
|
|
245
|
+
.filter((t) => t !== undefined);
|
|
246
|
+
// If any member failed conversion, return undefined (keep TSN7405 strict)
|
|
247
|
+
if (memberTypes.length !== intersectionType.types.length) {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
return { kind: "intersectionType", types: memberTypes };
|
|
102
251
|
}
|
|
103
252
|
return undefined;
|
|
104
253
|
};
|