@tsonic/frontend 0.0.4 → 0.0.5
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/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 -1
- 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 +10 -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/calls.d.ts.map +1 -1
- package/dist/ir/converters/expressions/calls.js +47 -0
- 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 +39 -1
- 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 +49 -4
- package/dist/ir/converters/expressions/functions.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.js +5 -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/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/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 +141 -3
- package/dist/ir/type-converter/inference.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 +37 -0
- package/dist/ir/type-converter/orchestrator.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 +8 -0
- package/dist/ir/types/expressions.d.ts.map +1 -1
- package/dist/ir/types/index.d.ts +1 -1
- package/dist/ir/types/index.d.ts.map +1 -1
- package/dist/ir/types/index.js.map +1 -1
- package/dist/ir/types/ir-types.d.ts +14 -1
- package/dist/ir/types/ir-types.d.ts.map +1 -1
- package/dist/ir/types.d.ts +1 -1
- package/dist/ir/types.d.ts.map +1 -1
- package/dist/ir/types.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
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthetic Type Generation for Union-of-Object-Literals
|
|
3
|
+
*
|
|
4
|
+
* When a type alias contains a union of object literal types, we generate
|
|
5
|
+
* synthetic nominal interfaces for each object member. This enables:
|
|
6
|
+
* - TSN7403 compliance (object literals have contextual nominal types)
|
|
7
|
+
* - Proper C# emission (nominal types instead of anonymous objects)
|
|
8
|
+
*
|
|
9
|
+
* Example:
|
|
10
|
+
* type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };
|
|
11
|
+
*
|
|
12
|
+
* Generates:
|
|
13
|
+
* interface Result__0<T, E> { ok: true; value: T }
|
|
14
|
+
* interface Result__1<T, E> { ok: false; error: E }
|
|
15
|
+
* type Result<T, E> = Result__0<T, E> | Result__1<T, E>
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Check if a type is an object type (inline object literal)
|
|
19
|
+
*/
|
|
20
|
+
const isObjectType = (type) => type.kind === "objectType";
|
|
21
|
+
/**
|
|
22
|
+
* Check if a union type contains any object literal types
|
|
23
|
+
*/
|
|
24
|
+
const unionContainsObjectTypes = (union) => union.types.some(isObjectType);
|
|
25
|
+
/**
|
|
26
|
+
* Generate a synthetic interface name for a union member
|
|
27
|
+
*
|
|
28
|
+
* Format: {AliasName}__{index}
|
|
29
|
+
* Example: Result__0, Result__1
|
|
30
|
+
*/
|
|
31
|
+
const generateSyntheticName = (aliasName, index) => `${aliasName}__${index}`;
|
|
32
|
+
/**
|
|
33
|
+
* Create type arguments from type parameters (for referencing synthetics)
|
|
34
|
+
*
|
|
35
|
+
* Example: [T, E] type params -> [{ kind: "typeParameterType", name: "T" }, ...]
|
|
36
|
+
*/
|
|
37
|
+
const typeParamsToTypeArgs = (typeParams) => {
|
|
38
|
+
if (!typeParams || typeParams.length === 0) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return typeParams.map((tp) => ({
|
|
42
|
+
kind: "typeParameterType",
|
|
43
|
+
name: tp.name,
|
|
44
|
+
}));
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Create a synthetic interface declaration from an object type
|
|
48
|
+
*/
|
|
49
|
+
const createSyntheticInterface = (objectType, name, typeParameters, isExported) => ({
|
|
50
|
+
kind: "interfaceDeclaration",
|
|
51
|
+
name,
|
|
52
|
+
typeParameters,
|
|
53
|
+
extends: [],
|
|
54
|
+
members: objectType.members,
|
|
55
|
+
isExported,
|
|
56
|
+
isStruct: false,
|
|
57
|
+
});
|
|
58
|
+
/**
|
|
59
|
+
* Create a reference type to a synthetic interface
|
|
60
|
+
*/
|
|
61
|
+
const createSyntheticReference = (name, typeArgs) => ({
|
|
62
|
+
kind: "referenceType",
|
|
63
|
+
name,
|
|
64
|
+
typeArguments: typeArgs,
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* Process a type alias declaration and generate synthetic interfaces if needed.
|
|
68
|
+
*
|
|
69
|
+
* If the type alias is a union containing object literal types, this will:
|
|
70
|
+
* 1. Generate a synthetic interface for each object literal member
|
|
71
|
+
* 2. Rewrite the union to use reference types to the synthetics
|
|
72
|
+
* 3. Return both the rewritten alias and the synthetic interfaces
|
|
73
|
+
*
|
|
74
|
+
* If no object literals are found, returns the original alias unchanged.
|
|
75
|
+
*/
|
|
76
|
+
export const processTypeAliasForSynthetics = (typeAlias) => {
|
|
77
|
+
const { type, name, typeParameters, isExported } = typeAlias;
|
|
78
|
+
// Only process union types
|
|
79
|
+
if (type.kind !== "unionType") {
|
|
80
|
+
return { typeAlias, syntheticInterfaces: [] };
|
|
81
|
+
}
|
|
82
|
+
const union = type;
|
|
83
|
+
// Check if union contains any object types
|
|
84
|
+
if (!unionContainsObjectTypes(union)) {
|
|
85
|
+
return { typeAlias, syntheticInterfaces: [] };
|
|
86
|
+
}
|
|
87
|
+
// Generate synthetic interfaces and rewrite union members
|
|
88
|
+
const syntheticInterfaces = [];
|
|
89
|
+
const rewrittenUnionTypes = [];
|
|
90
|
+
const typeArgs = typeParamsToTypeArgs(typeParameters);
|
|
91
|
+
let objectIndex = 0;
|
|
92
|
+
for (const memberType of union.types) {
|
|
93
|
+
if (isObjectType(memberType)) {
|
|
94
|
+
// Generate synthetic interface for this object type
|
|
95
|
+
const syntheticName = generateSyntheticName(name, objectIndex);
|
|
96
|
+
const syntheticInterface = createSyntheticInterface(memberType, syntheticName, typeParameters, isExported // Synthetic interfaces inherit export status
|
|
97
|
+
);
|
|
98
|
+
syntheticInterfaces.push(syntheticInterface);
|
|
99
|
+
// Replace object type with reference to synthetic
|
|
100
|
+
const reference = createSyntheticReference(syntheticName, typeArgs);
|
|
101
|
+
rewrittenUnionTypes.push(reference);
|
|
102
|
+
objectIndex++;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Keep non-object types as-is
|
|
106
|
+
rewrittenUnionTypes.push(memberType);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Create rewritten type alias with new union
|
|
110
|
+
const rewrittenUnion = {
|
|
111
|
+
kind: "unionType",
|
|
112
|
+
types: rewrittenUnionTypes,
|
|
113
|
+
};
|
|
114
|
+
const rewrittenAlias = {
|
|
115
|
+
...typeAlias,
|
|
116
|
+
type: rewrittenUnion,
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
typeAlias: rewrittenAlias,
|
|
120
|
+
syntheticInterfaces,
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=synthetic-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthetic-types.js","sourceRoot":"","sources":["../../../src/ir/converters/synthetic-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAsBH;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC,IAAY,EAAwB,EAAE,CAC1D,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;AAE7B;;GAEG;AACH,MAAM,wBAAwB,GAAG,CAAC,KAAkB,EAAW,EAAE,CAC/D,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,CAAC,SAAiB,EAAE,KAAa,EAAU,EAAE,CACzE,GAAG,SAAS,KAAK,KAAK,EAAE,CAAC;AAE3B;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,CAC3B,UAAkD,EACnB,EAAE;IACjC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,UAAU,CAAC,GAAG,CACnB,CAAC,EAAE,EAAU,EAAE,CAAC,CAAC;QACf,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,EAAE,CAAC,IAAI;KACd,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,wBAAwB,GAAG,CAC/B,UAAwB,EACxB,IAAY,EACZ,cAAsD,EACtD,UAAmB,EACK,EAAE,CAAC,CAAC;IAC5B,IAAI,EAAE,sBAAsB;IAC5B,IAAI;IACJ,cAAc;IACd,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,UAAU,CAAC,OAAO;IAC3B,UAAU;IACV,QAAQ,EAAE,KAAK;CAChB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,wBAAwB,GAAG,CAC/B,IAAY,EACZ,QAAuC,EACtB,EAAE,CAAC,CAAC;IACrB,IAAI,EAAE,eAAe;IACrB,IAAI;IACJ,aAAa,EAAE,QAAQ;CACxB,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,SAAiC,EACZ,EAAE;IACvB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IAE7D,2BAA2B;IAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,IAAmB,CAAC;IAElC,2CAA2C;IAC3C,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,0DAA0D;IAC1D,MAAM,mBAAmB,GAA6B,EAAE,CAAC;IACzD,MAAM,mBAAmB,GAAa,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAEtD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,oDAAoD;YACpD,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC/D,MAAM,kBAAkB,GAAG,wBAAwB,CACjD,UAAU,EACV,aAAa,EACb,cAAc,EACd,UAAU,CAAC,6CAA6C;aACzD,CAAC;YACF,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAE7C,kDAAkD;YAClD,MAAM,SAAS,GAAG,wBAAwB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACpE,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEpC,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,MAAM,cAAc,GAAgB;QAClC,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,mBAAmB;KAC3B,CAAC;IAEF,MAAM,cAAc,GAA2B;QAC7C,GAAG,SAAS;QACZ,IAAI,EAAE,cAAc;KACrB,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,cAAc;QACzB,mBAAmB;KACpB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -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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"}
|
|
@@ -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,SAiHX,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.
|
|
@@ -96,9 +214,29 @@ export const convertTsTypeToIr = (type, checker) => {
|
|
|
96
214
|
if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) {
|
|
97
215
|
return { kind: "anyType" };
|
|
98
216
|
}
|
|
99
|
-
// Union
|
|
100
|
-
if (flags & ts.TypeFlags.Union
|
|
101
|
-
|
|
217
|
+
// Union types - convert each member, require all to succeed
|
|
218
|
+
if (flags & ts.TypeFlags.Union) {
|
|
219
|
+
const unionType = type;
|
|
220
|
+
const memberTypes = unionType.types
|
|
221
|
+
.map((t) => convertTsTypeToIr(t, checker))
|
|
222
|
+
.filter((t) => t !== undefined);
|
|
223
|
+
// If any member failed conversion, return undefined (keep TSN7405 strict)
|
|
224
|
+
if (memberTypes.length !== unionType.types.length) {
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
return { kind: "unionType", types: memberTypes };
|
|
228
|
+
}
|
|
229
|
+
// Intersection types - convert each member, require all to succeed
|
|
230
|
+
if (flags & ts.TypeFlags.Intersection) {
|
|
231
|
+
const intersectionType = type;
|
|
232
|
+
const memberTypes = intersectionType.types
|
|
233
|
+
.map((t) => convertTsTypeToIr(t, checker))
|
|
234
|
+
.filter((t) => t !== undefined);
|
|
235
|
+
// If any member failed conversion, return undefined (keep TSN7405 strict)
|
|
236
|
+
if (memberTypes.length !== intersectionType.types.length) {
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
return { kind: "intersectionType", types: memberTypes };
|
|
102
240
|
}
|
|
103
241
|
return undefined;
|
|
104
242
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../../src/ir/type-converter/inference.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../../src/ir/type-converter/inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Type conversion orchestrator
|
|
3
3
|
*/
|
|
4
4
|
import * as ts from "typescript";
|
|
5
|
-
import { IrType, IrFunctionType, IrObjectType, IrDictionaryType } from "../types.js";
|
|
5
|
+
import { IrType, IrFunctionType, IrObjectType, IrDictionaryType, IrTupleType } from "../types.js";
|
|
6
6
|
/**
|
|
7
7
|
* Convert TypeScript type node to IR type
|
|
8
8
|
*/
|
|
9
9
|
export declare const convertType: (typeNode: ts.TypeNode, checker: ts.TypeChecker) => IrType;
|
|
10
10
|
export { convertFunctionType } from "./functions.js";
|
|
11
11
|
export { convertObjectType } from "./objects.js";
|
|
12
|
-
export type { IrFunctionType, IrObjectType, IrDictionaryType };
|
|
12
|
+
export type { IrFunctionType, IrObjectType, IrDictionaryType, IrTupleType };
|
|
13
13
|
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/ir/type-converter/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,MAAM,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/ir/type-converter/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,MAAM,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACZ,MAAM,aAAa,CAAC;AAYrB;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,EAAE,CAAC,QAAQ,EACrB,SAAS,EAAE,CAAC,WAAW,KACtB,MA4FF,CAAC;AAGF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -26,6 +26,38 @@ export const convertType = (typeNode, checker) => {
|
|
|
26
26
|
if (ts.isArrayTypeNode(typeNode)) {
|
|
27
27
|
return convertArrayType(typeNode, checker, convertType);
|
|
28
28
|
}
|
|
29
|
+
// Tuple types
|
|
30
|
+
if (ts.isTupleTypeNode(typeNode)) {
|
|
31
|
+
// Check for rest elements - not fully supported in C# ValueTuple
|
|
32
|
+
const hasRest = typeNode.elements.some((el) => ts.isRestTypeNode(el));
|
|
33
|
+
if (hasRest) {
|
|
34
|
+
// If tuple is just [...T[]] (pure variadic), treat as array type
|
|
35
|
+
// If tuple has both fixed and rest elements, fall through to anyType
|
|
36
|
+
// (TODO: add proper diagnostic for mixed variadic tuples)
|
|
37
|
+
const firstElement = typeNode.elements[0];
|
|
38
|
+
if (typeNode.elements.length === 1 &&
|
|
39
|
+
firstElement &&
|
|
40
|
+
ts.isRestTypeNode(firstElement)) {
|
|
41
|
+
if (ts.isArrayTypeNode(firstElement.type)) {
|
|
42
|
+
// [...T[]] → T[]
|
|
43
|
+
return {
|
|
44
|
+
kind: "arrayType",
|
|
45
|
+
elementType: convertType(firstElement.type.elementType, checker),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Mixed variadic tuples not supported - fall through to anyType
|
|
50
|
+
return { kind: "anyType" };
|
|
51
|
+
}
|
|
52
|
+
const elementTypes = typeNode.elements.map((element) => {
|
|
53
|
+
// Handle named tuple elements (e.g., [name: string, age: number])
|
|
54
|
+
if (ts.isNamedTupleMember(element)) {
|
|
55
|
+
return convertType(element.type, checker);
|
|
56
|
+
}
|
|
57
|
+
return convertType(element, checker);
|
|
58
|
+
});
|
|
59
|
+
return { kind: "tupleType", elementTypes };
|
|
60
|
+
}
|
|
29
61
|
// Function types
|
|
30
62
|
if (ts.isFunctionTypeNode(typeNode)) {
|
|
31
63
|
return convertFunctionType(typeNode, checker, convertType);
|
|
@@ -50,6 +82,11 @@ export const convertType = (typeNode, checker) => {
|
|
|
50
82
|
if (ts.isParenthesizedTypeNode(typeNode)) {
|
|
51
83
|
return convertType(typeNode.type, checker);
|
|
52
84
|
}
|
|
85
|
+
// Type predicate return types: (x is T) has no direct C# type-level equivalent.
|
|
86
|
+
// MVP: lower to boolean so we can emit valid C# and avoid anyType/ICE.
|
|
87
|
+
if (ts.isTypePredicateNode(typeNode)) {
|
|
88
|
+
return { kind: "primitiveType", name: "boolean" };
|
|
89
|
+
}
|
|
53
90
|
// Default to any type for unsupported types
|
|
54
91
|
return { kind: "anyType" };
|
|
55
92
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/ir/type-converter/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/ir/type-converter/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAQjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,QAAqB,EACrB,OAAuB,EACf,EAAE;IACV,mDAAmD;IACnD,IAAI,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,OAAO,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED,qBAAqB;IACrB,MAAM,aAAa,GAAG,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,cAAc;IACd,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED,cAAc;IACd,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,iEAAiE;QACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtE,IAAI,OAAO,EAAE,CAAC;YACZ,iEAAiE;YACjE,qEAAqE;YACrE,0DAA0D;YAC1D,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1C,IACE,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAC9B,YAAY;gBACZ,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,EAC/B,CAAC;gBACD,IAAI,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,iBAAiB;oBACjB,OAAO;wBACL,IAAI,EAAE,WAAW;wBACjB,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;qBACjE,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,gEAAgE;YAChE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACrD,kEAAkE;YAClE,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAiB,CAAC;IAC5D,CAAC;IAED,iBAAiB;IACjB,IAAI,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED,yBAAyB;IACzB,IAAI,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED,cAAc;IACd,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED,qBAAqB;IACrB,IAAI,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,OAAO,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;IAED,gBAAgB;IAChB,IAAI,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,sBAAsB;IACtB,IAAI,EAAE,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,gFAAgF;IAChF,uEAAuE;IACvE,IAAI,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IAED,4CAA4C;IAC5C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC,CAAC;AAEF,8DAA8D;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Type converter - TypeScript types to IR types
|
|
3
3
|
* Main dispatcher - re-exports from type-converter/ subdirectory
|
|
4
4
|
*/
|
|
5
|
-
export { convertType, convertFunctionType, convertObjectType, convertBindingName, inferType, convertTsTypeToIr, } from "./type-converter/index.js";
|
|
5
|
+
export { convertType, convertFunctionType, convertObjectType, convertBindingName, inferType, convertTsTypeToIr, inferLambdaParamTypes, type LambdaParamInferenceResult, } from "./type-converter/index.js";
|
|
6
6
|
//# sourceMappingURL=type-converter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-converter.d.ts","sourceRoot":"","sources":["../../src/ir/type-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,iBAAiB,
|
|
1
|
+
{"version":3,"file":"type-converter.d.ts","sourceRoot":"","sources":["../../src/ir/type-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,2BAA2B,CAAC"}
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Type converter - TypeScript types to IR types
|
|
3
3
|
* Main dispatcher - re-exports from type-converter/ subdirectory
|
|
4
4
|
*/
|
|
5
|
-
export { convertType, convertFunctionType, convertObjectType, convertBindingName, inferType, convertTsTypeToIr, } from "./type-converter/index.js";
|
|
5
|
+
export { convertType, convertFunctionType, convertObjectType, convertBindingName, inferType, convertTsTypeToIr, inferLambdaParamTypes, } from "./type-converter/index.js";
|
|
6
6
|
//# sourceMappingURL=type-converter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-converter.js","sourceRoot":"","sources":["../../src/ir/type-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,iBAAiB,
|
|
1
|
+
{"version":3,"file":"type-converter.js","sourceRoot":"","sources":["../../src/ir/type-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,2BAA2B,CAAC"}
|
|
@@ -35,6 +35,8 @@ export type IrObjectExpression = {
|
|
|
35
35
|
readonly inferredType?: IrType;
|
|
36
36
|
/** Contextual type for object literals in typed positions (return, assignment, etc.) */
|
|
37
37
|
readonly contextualType?: IrType;
|
|
38
|
+
/** True if this object literal contains spread expressions (for IIFE lowering) */
|
|
39
|
+
readonly hasSpreads?: boolean;
|
|
38
40
|
};
|
|
39
41
|
export type IrObjectProperty = {
|
|
40
42
|
readonly kind: "property";
|
|
@@ -85,6 +87,12 @@ export type IrCallExpression = {
|
|
|
85
87
|
readonly typeArguments?: readonly IrType[];
|
|
86
88
|
readonly requiresSpecialization?: boolean;
|
|
87
89
|
readonly argumentPassing?: readonly ("value" | "ref" | "out" | "in")[];
|
|
90
|
+
/** Type predicate narrowing metadata (for `x is T` predicates) */
|
|
91
|
+
readonly narrowing?: {
|
|
92
|
+
readonly kind: "typePredicate";
|
|
93
|
+
readonly argIndex: number;
|
|
94
|
+
readonly targetType: IrType;
|
|
95
|
+
};
|
|
88
96
|
};
|
|
89
97
|
export type IrNewExpression = {
|
|
90
98
|
readonly kind: "new";
|