@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.
Files changed (92) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ir/builder/exports.d.ts.map +1 -1
  3. package/dist/ir/builder/exports.js +8 -6
  4. package/dist/ir/builder/exports.js.map +1 -1
  5. package/dist/ir/builder/imports.d.ts.map +1 -1
  6. package/dist/ir/builder/imports.js +6 -1
  7. package/dist/ir/builder/imports.js.map +1 -1
  8. package/dist/ir/builder/statements.d.ts +7 -1
  9. package/dist/ir/builder/statements.d.ts.map +1 -1
  10. package/dist/ir/builder/statements.js +18 -5
  11. package/dist/ir/builder/statements.js.map +1 -1
  12. package/dist/ir/builder.test.js +10 -5
  13. package/dist/ir/builder.test.js.map +1 -1
  14. package/dist/ir/converters/anonymous-synthesis.d.ts +76 -0
  15. package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -0
  16. package/dist/ir/converters/anonymous-synthesis.js +307 -0
  17. package/dist/ir/converters/anonymous-synthesis.js.map +1 -0
  18. package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
  19. package/dist/ir/converters/expressions/calls.js +47 -0
  20. package/dist/ir/converters/expressions/calls.js.map +1 -1
  21. package/dist/ir/converters/expressions/collections.d.ts +3 -0
  22. package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
  23. package/dist/ir/converters/expressions/collections.js +39 -1
  24. package/dist/ir/converters/expressions/collections.js.map +1 -1
  25. package/dist/ir/converters/expressions/functions.d.ts.map +1 -1
  26. package/dist/ir/converters/expressions/functions.js +49 -4
  27. package/dist/ir/converters/expressions/functions.js.map +1 -1
  28. package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
  29. package/dist/ir/converters/statements/control/conditionals.js +4 -6
  30. package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
  31. package/dist/ir/converters/statements/control/loops.js +5 -5
  32. package/dist/ir/converters/statements/control/loops.js.map +1 -1
  33. package/dist/ir/converters/statements/declarations/interfaces.d.ts +4 -3
  34. package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
  35. package/dist/ir/converters/statements/declarations/interfaces.js +55 -1
  36. package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
  37. package/dist/ir/converters/statements/declarations/type-aliases.d.ts +8 -3
  38. package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
  39. package/dist/ir/converters/statements/declarations/type-aliases.js +12 -2
  40. package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
  41. package/dist/ir/converters/synthetic-types.d.ts +38 -0
  42. package/dist/ir/converters/synthetic-types.d.ts.map +1 -0
  43. package/dist/ir/converters/synthetic-types.js +123 -0
  44. package/dist/ir/converters/synthetic-types.js.map +1 -0
  45. package/dist/ir/statement-converter.d.ts +16 -1
  46. package/dist/ir/statement-converter.d.ts.map +1 -1
  47. package/dist/ir/statement-converter.js +32 -0
  48. package/dist/ir/statement-converter.js.map +1 -1
  49. package/dist/ir/type-converter/index.d.ts +1 -1
  50. package/dist/ir/type-converter/index.d.ts.map +1 -1
  51. package/dist/ir/type-converter/index.js +1 -1
  52. package/dist/ir/type-converter/index.js.map +1 -1
  53. package/dist/ir/type-converter/inference.d.ts +12 -0
  54. package/dist/ir/type-converter/inference.d.ts.map +1 -1
  55. package/dist/ir/type-converter/inference.js +141 -3
  56. package/dist/ir/type-converter/inference.js.map +1 -1
  57. package/dist/ir/type-converter/orchestrator.d.ts +2 -2
  58. package/dist/ir/type-converter/orchestrator.d.ts.map +1 -1
  59. package/dist/ir/type-converter/orchestrator.js +37 -0
  60. package/dist/ir/type-converter/orchestrator.js.map +1 -1
  61. package/dist/ir/type-converter.d.ts +1 -1
  62. package/dist/ir/type-converter.d.ts.map +1 -1
  63. package/dist/ir/type-converter.js +1 -1
  64. package/dist/ir/type-converter.js.map +1 -1
  65. package/dist/ir/types/expressions.d.ts +8 -0
  66. package/dist/ir/types/expressions.d.ts.map +1 -1
  67. package/dist/ir/types/index.d.ts +1 -1
  68. package/dist/ir/types/index.d.ts.map +1 -1
  69. package/dist/ir/types/index.js.map +1 -1
  70. package/dist/ir/types/ir-types.d.ts +14 -1
  71. package/dist/ir/types/ir-types.d.ts.map +1 -1
  72. package/dist/ir/types.d.ts +1 -1
  73. package/dist/ir/types.d.ts.map +1 -1
  74. package/dist/ir/types.js.map +1 -1
  75. package/dist/resolver/clr-bindings-resolver.d.ts +9 -0
  76. package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
  77. package/dist/resolver/clr-bindings-resolver.js +52 -3
  78. package/dist/resolver/clr-bindings-resolver.js.map +1 -1
  79. package/dist/types/diagnostic.d.ts +1 -1
  80. package/dist/types/diagnostic.d.ts.map +1 -1
  81. package/dist/types/diagnostic.js.map +1 -1
  82. package/dist/validation/static-safety.d.ts +6 -1
  83. package/dist/validation/static-safety.d.ts.map +1 -1
  84. package/dist/validation/static-safety.js +144 -36
  85. package/dist/validation/static-safety.js.map +1 -1
  86. package/dist/validation/unsupported-utility-types.d.ts +38 -0
  87. package/dist/validation/unsupported-utility-types.d.ts.map +1 -0
  88. package/dist/validation/unsupported-utility-types.js +53 -0
  89. package/dist/validation/unsupported-utility-types.js.map +1 -0
  90. package/dist/validator.test.js +304 -14
  91. package/dist/validator.test.js.map +1 -1
  92. 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":"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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) => IrStatement | null;
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,IAmFhB,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"}
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":"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"}
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,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
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,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
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;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;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,SA4FX,CAAC"}
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 and intersection types - too complex for simple inference
100
- if (flags & ts.TypeFlags.Union || flags & ts.TypeFlags.Intersection) {
101
- return undefined;
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":"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"}
1
+ {"version":3,"file":"inference.js","sourceRoot":"","sources":["../../../src/ir/type-converter/inference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAY7C;;;;;;;;;GASG;AACH;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,IAAa,EAAuB,EAAE;IACjE,+CAA+C;IAC/C,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,IAAoB,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACrC,0BAA0B;YAC1B,IACE,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS;gBACrC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAChC,CAAC;gBACD,SAAS;YACX,CAAC;YACD,2CAA2C;YAC3C,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAA8C,EAC9C,OAAuB,EACiB,EAAE;IAC1C,qCAAqC;IACrC,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC,CAAC,mCAAmC;IACvD,CAAC;IAED,8EAA8E;IAC9E,MAAM,YAAY,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC,CAAC,yBAAyB;IAC7C,CAAC;IAED,yCAAyC;IACzC,MAAM,UAAU,GAAG,YAAY,CAAC,iBAAiB,EAAE,CAAC;IACpD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC,CAAC,kCAAkC;IACtD,CAAC;IAED,yEAAyE;IACzE,MAAM,SAAS,GACb,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAC1D,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IAC5C,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,WAAW,GAAG,KAAK,CAAC;YACpB,SAAS;QACX,CAAC;QAED,8DAA8D;QAC9D,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB;YACrD,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,iDAAiD;YACjD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,WAAW,GAAG,KAAK,CAAC;YACpB,SAAS;QACX,CAAC;QAED,wDAAwD;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAC9C,QAAQ,EACR,QAAQ,CAAC,gBAAgB,IAAI,IAAI,CAClC,CAAC;QAEF,8EAA8E;QAC9E,iEAAiE;QACjE,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;YACzC,SAAS,CAAC,4DAA4D;QACxE,CAAC;QAED,mEAAmE;QACnE,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CACrC,MAAM,EACN,KAAK,IAAI,IAAI,EACb,EAAE,CAAC,gBAAgB,CAAC,IAAI,CACzB,CAAC;QAEF,IAAI,MAA0B,CAAC;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,gEAAgE;YAChE,IAAI,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC/C,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACxC,+EAA+E;gBAC/E,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACxC,MAAM,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kEAAkE;YAClE,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,gEAAgE;QAChE,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAqD,EACrD,OAAuB,EACH,EAAE;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAa,EACb,OAAuB,EACH,EAAE;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAEzB,aAAa;IACb,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;QACtE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;QACtE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACtD,CAAC;IAED,uCAAuC;IACvC,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAChC,uBAAuB;QACvB,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAwB,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACzD,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;QACjE,CAAC;QAED,iDAAiD;QACjD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,kEAAkE;YAClE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,sDAAsD;QACtD,MAAM,UAAU,GAAG,IAAqB,CAAC;QACzC,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;YACpC,wCAAwC;YACxC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,2EAA2E;YAC3E,IAAI,IAAI,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClD,2CAA2C;gBAC3C,MAAM,OAAO,GAAG,IAAwB,CAAC;gBACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACnD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,UAAU,GAAG,QAAQ;yBACxB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;yBAC7C,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;oBAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;wBAC1C,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;oBACpE,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,4CAA4C;IAC5C,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAwB,CAAC;QAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IAED,4DAA4D;IAC5D,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAoB,CAAC;QACvC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;aACzC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC/C,0EAA0E;QAC1E,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IACnD,CAAC;IAED,mEAAmE;IACnE,IAAI,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,gBAAgB,GAAG,IAA2B,CAAC;QACrD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK;aACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;aACzC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC/C,0EAA0E;QAC1E,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
@@ -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,EACjB,MAAM,aAAa,CAAC;AAYrB;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,EAAE,CAAC,QAAQ,EACrB,SAAS,EAAE,CAAC,WAAW,KACtB,MAiDF,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,CAAC"}
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;AAOjC,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,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,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"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/ir/type-converter/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -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,GAClB,MAAM,2BAA2B,CAAC"}
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,GAClB,MAAM,2BAA2B,CAAC"}
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";