@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.
Files changed (193) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/ir/builder/exports.d.ts.map +1 -1
  7. package/dist/ir/builder/exports.js +8 -6
  8. package/dist/ir/builder/exports.js.map +1 -1
  9. package/dist/ir/builder/imports.d.ts.map +1 -1
  10. package/dist/ir/builder/imports.js +6 -6
  11. package/dist/ir/builder/imports.js.map +1 -1
  12. package/dist/ir/builder/statements.d.ts +7 -1
  13. package/dist/ir/builder/statements.d.ts.map +1 -1
  14. package/dist/ir/builder/statements.js +18 -5
  15. package/dist/ir/builder/statements.js.map +1 -1
  16. package/dist/ir/builder.test.js +70 -5
  17. package/dist/ir/builder.test.js.map +1 -1
  18. package/dist/ir/converters/anonymous-synthesis.d.ts +76 -0
  19. package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -0
  20. package/dist/ir/converters/anonymous-synthesis.js +307 -0
  21. package/dist/ir/converters/anonymous-synthesis.js.map +1 -0
  22. package/dist/ir/converters/expressions/access.d.ts.map +1 -1
  23. package/dist/ir/converters/expressions/access.js +65 -2
  24. package/dist/ir/converters/expressions/access.js.map +1 -1
  25. package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
  26. package/dist/ir/converters/expressions/calls.js +96 -1
  27. package/dist/ir/converters/expressions/calls.js.map +1 -1
  28. package/dist/ir/converters/expressions/collections.d.ts +3 -0
  29. package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
  30. package/dist/ir/converters/expressions/collections.js +43 -2
  31. package/dist/ir/converters/expressions/collections.js.map +1 -1
  32. package/dist/ir/converters/expressions/functions.d.ts.map +1 -1
  33. package/dist/ir/converters/expressions/functions.js +52 -5
  34. package/dist/ir/converters/expressions/functions.js.map +1 -1
  35. package/dist/ir/converters/expressions/helpers.d.ts +10 -0
  36. package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
  37. package/dist/ir/converters/expressions/helpers.js +173 -7
  38. package/dist/ir/converters/expressions/helpers.js.map +1 -1
  39. package/dist/ir/converters/expressions/index.d.ts +1 -1
  40. package/dist/ir/converters/expressions/index.d.ts.map +1 -1
  41. package/dist/ir/converters/expressions/index.js +1 -1
  42. package/dist/ir/converters/expressions/index.js.map +1 -1
  43. package/dist/ir/converters/expressions/literals.d.ts.map +1 -1
  44. package/dist/ir/converters/expressions/literals.js +2 -1
  45. package/dist/ir/converters/expressions/literals.js.map +1 -1
  46. package/dist/ir/converters/expressions/numeric-recovery.test.d.ts +14 -0
  47. package/dist/ir/converters/expressions/numeric-recovery.test.d.ts.map +1 -0
  48. package/dist/ir/converters/expressions/numeric-recovery.test.js +286 -0
  49. package/dist/ir/converters/expressions/numeric-recovery.test.js.map +1 -0
  50. package/dist/ir/converters/expressions/operators.d.ts.map +1 -1
  51. package/dist/ir/converters/expressions/operators.js +16 -2
  52. package/dist/ir/converters/expressions/operators.js.map +1 -1
  53. package/dist/ir/converters/expressions/other.d.ts.map +1 -1
  54. package/dist/ir/converters/expressions/other.js +4 -1
  55. package/dist/ir/converters/expressions/other.js.map +1 -1
  56. package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
  57. package/dist/ir/converters/statements/control/conditionals.js +4 -6
  58. package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
  59. package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
  60. package/dist/ir/converters/statements/control/loops.js +6 -5
  61. package/dist/ir/converters/statements/control/loops.js.map +1 -1
  62. package/dist/ir/converters/statements/declarations/interfaces.d.ts +4 -3
  63. package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
  64. package/dist/ir/converters/statements/declarations/interfaces.js +55 -1
  65. package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
  66. package/dist/ir/converters/statements/declarations/type-aliases.d.ts +8 -3
  67. package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
  68. package/dist/ir/converters/statements/declarations/type-aliases.js +12 -2
  69. package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
  70. package/dist/ir/converters/synthetic-types.d.ts +38 -0
  71. package/dist/ir/converters/synthetic-types.d.ts.map +1 -0
  72. package/dist/ir/converters/synthetic-types.js +123 -0
  73. package/dist/ir/converters/synthetic-types.js.map +1 -0
  74. package/dist/ir/expression-converter.d.ts.map +1 -1
  75. package/dist/ir/expression-converter.js +81 -9
  76. package/dist/ir/expression-converter.js.map +1 -1
  77. package/dist/ir/statement-converter.d.ts +16 -1
  78. package/dist/ir/statement-converter.d.ts.map +1 -1
  79. package/dist/ir/statement-converter.js +32 -0
  80. package/dist/ir/statement-converter.js.map +1 -1
  81. package/dist/ir/type-converter/arrays.d.ts.map +1 -1
  82. package/dist/ir/type-converter/arrays.js +1 -0
  83. package/dist/ir/type-converter/arrays.js.map +1 -1
  84. package/dist/ir/type-converter/index.d.ts +1 -1
  85. package/dist/ir/type-converter/index.d.ts.map +1 -1
  86. package/dist/ir/type-converter/index.js +1 -1
  87. package/dist/ir/type-converter/index.js.map +1 -1
  88. package/dist/ir/type-converter/inference.d.ts +12 -0
  89. package/dist/ir/type-converter/inference.d.ts.map +1 -1
  90. package/dist/ir/type-converter/inference.js +172 -23
  91. package/dist/ir/type-converter/inference.js.map +1 -1
  92. package/dist/ir/type-converter/literals.d.ts.map +1 -1
  93. package/dist/ir/type-converter/literals.js +2 -1
  94. package/dist/ir/type-converter/literals.js.map +1 -1
  95. package/dist/ir/type-converter/objects.d.ts.map +1 -1
  96. package/dist/ir/type-converter/objects.js +2 -1
  97. package/dist/ir/type-converter/objects.js.map +1 -1
  98. package/dist/ir/type-converter/orchestrator.d.ts +2 -2
  99. package/dist/ir/type-converter/orchestrator.d.ts.map +1 -1
  100. package/dist/ir/type-converter/orchestrator.js +55 -1
  101. package/dist/ir/type-converter/orchestrator.js.map +1 -1
  102. package/dist/ir/type-converter/references.d.ts.map +1 -1
  103. package/dist/ir/type-converter/references.js +14 -18
  104. package/dist/ir/type-converter/references.js.map +1 -1
  105. package/dist/ir/type-converter.d.ts +1 -1
  106. package/dist/ir/type-converter.d.ts.map +1 -1
  107. package/dist/ir/type-converter.js +1 -1
  108. package/dist/ir/type-converter.js.map +1 -1
  109. package/dist/ir/types/expressions.d.ts +110 -1
  110. package/dist/ir/types/expressions.d.ts.map +1 -1
  111. package/dist/ir/types/guards.d.ts.map +1 -1
  112. package/dist/ir/types/guards.js +2 -0
  113. package/dist/ir/types/guards.js.map +1 -1
  114. package/dist/ir/types/index.d.ts +5 -3
  115. package/dist/ir/types/index.d.ts.map +1 -1
  116. package/dist/ir/types/index.js +1 -0
  117. package/dist/ir/types/index.js.map +1 -1
  118. package/dist/ir/types/ir-types.d.ts +33 -1
  119. package/dist/ir/types/ir-types.d.ts.map +1 -1
  120. package/dist/ir/types/numeric-kind.d.ts +68 -0
  121. package/dist/ir/types/numeric-kind.d.ts.map +1 -0
  122. package/dist/ir/types/numeric-kind.js +170 -0
  123. package/dist/ir/types/numeric-kind.js.map +1 -0
  124. package/dist/ir/types/statements.d.ts +38 -1
  125. package/dist/ir/types/statements.d.ts.map +1 -1
  126. package/dist/ir/types.d.ts +2 -1
  127. package/dist/ir/types.d.ts.map +1 -1
  128. package/dist/ir/types.js +2 -0
  129. package/dist/ir/types.js.map +1 -1
  130. package/dist/ir/validation/index.d.ts +7 -0
  131. package/dist/ir/validation/index.d.ts.map +1 -0
  132. package/dist/ir/validation/index.js +7 -0
  133. package/dist/ir/validation/index.js.map +1 -0
  134. package/dist/ir/validation/numeric-invariants.test.d.ts +15 -0
  135. package/dist/ir/validation/numeric-invariants.test.d.ts.map +1 -0
  136. package/dist/ir/validation/numeric-invariants.test.js +598 -0
  137. package/dist/ir/validation/numeric-invariants.test.js.map +1 -0
  138. package/dist/ir/validation/numeric-proof-pass.d.ts +37 -0
  139. package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -0
  140. package/dist/ir/validation/numeric-proof-pass.js +889 -0
  141. package/dist/ir/validation/numeric-proof-pass.js.map +1 -0
  142. package/dist/ir/validation/soundness-gate.d.ts +26 -0
  143. package/dist/ir/validation/soundness-gate.d.ts.map +1 -0
  144. package/dist/ir/validation/soundness-gate.js +551 -0
  145. package/dist/ir/validation/soundness-gate.js.map +1 -0
  146. package/dist/ir/validation/soundness-gate.test.d.ts +13 -0
  147. package/dist/ir/validation/soundness-gate.test.d.ts.map +1 -0
  148. package/dist/ir/validation/soundness-gate.test.js +315 -0
  149. package/dist/ir/validation/soundness-gate.test.js.map +1 -0
  150. package/dist/ir/validation/yield-lowering-pass.d.ts +40 -0
  151. package/dist/ir/validation/yield-lowering-pass.d.ts.map +1 -0
  152. package/dist/ir/validation/yield-lowering-pass.js +548 -0
  153. package/dist/ir/validation/yield-lowering-pass.js.map +1 -0
  154. package/dist/ir/validation/yield-lowering-pass.test.d.ts +12 -0
  155. package/dist/ir/validation/yield-lowering-pass.test.d.ts.map +1 -0
  156. package/dist/ir/validation/yield-lowering-pass.test.js +761 -0
  157. package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -0
  158. package/dist/program/bindings.d.ts +5 -0
  159. package/dist/program/bindings.d.ts.map +1 -1
  160. package/dist/program/bindings.js +12 -1
  161. package/dist/program/bindings.js.map +1 -1
  162. package/dist/program/dependency-graph.d.ts +3 -0
  163. package/dist/program/dependency-graph.d.ts.map +1 -1
  164. package/dist/program/dependency-graph.js +28 -4
  165. package/dist/program/dependency-graph.js.map +1 -1
  166. package/dist/program/index.d.ts +1 -1
  167. package/dist/program/index.d.ts.map +1 -1
  168. package/dist/program/index.js.map +1 -1
  169. package/dist/program.d.ts +1 -0
  170. package/dist/program.d.ts.map +1 -1
  171. package/dist/program.js.map +1 -1
  172. package/dist/resolver/clr-bindings-resolver.d.ts +9 -0
  173. package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
  174. package/dist/resolver/clr-bindings-resolver.js +52 -3
  175. package/dist/resolver/clr-bindings-resolver.js.map +1 -1
  176. package/dist/types/diagnostic.d.ts +1 -1
  177. package/dist/types/diagnostic.d.ts.map +1 -1
  178. package/dist/types/diagnostic.js.map +1 -1
  179. package/dist/validation/static-safety.d.ts +6 -1
  180. package/dist/validation/static-safety.d.ts.map +1 -1
  181. package/dist/validation/static-safety.js +144 -36
  182. package/dist/validation/static-safety.js.map +1 -1
  183. package/dist/validation/unsupported-utility-types.d.ts +38 -0
  184. package/dist/validation/unsupported-utility-types.d.ts.map +1 -0
  185. package/dist/validation/unsupported-utility-types.js +53 -0
  186. package/dist/validation/unsupported-utility-types.js.map +1 -0
  187. package/dist/validator.test.js +304 -14
  188. package/dist/validator.test.js.map +1 -1
  189. package/package.json +1 -1
  190. package/dist/types/parameter-modifiers.d.ts +0 -55
  191. package/dist/types/parameter-modifiers.d.ts.map +0 -1
  192. package/dist/types/parameter-modifiers.js +0 -148
  193. 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,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA8B1C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,EAAE,CAAC,UAAU,EACnB,SAAS,EAAE,CAAC,WAAW,KACtB,YA4JF,CAAC;AAGF,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,qCAAqC,CAAC"}
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 { kind: "literal", value: null, raw: "null", inferredType };
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 { kind: "identifier", name: node.text, inferredType };
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(ts.isAsExpression(node) ? node.expression : node.expression, checker);
157
- // Preserve the asserted type - this is needed for casts like `x as int`
158
- const assertedTypeNode = ts.isAsExpression(node) ? node.type : node.type;
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
- return { ...innerExpr, inferredType: assertedType };
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 { kind: "identifier", name: node.getText(), inferredType };
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;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,wDAAwD;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAEtE;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAmB,EACnB,OAAuB,EACT,EAAE;IAChB,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEpD,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,OAAO,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,IACE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;QACvC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,EACxC,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;YAC9C,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE;YACnB,YAAY;SACb,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACrE,CAAC;IACD,IACE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB;QAC5C,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EACzB,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,WAAW;YAChB,YAAY;SACb,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,8EAA8E;QAC9E,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO;gBACL,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,YAAY;gBACZ,eAAe,EAAE,OAAO,CAAC,IAAI;gBAC7B,gBAAgB,EAAE,OAAO,CAAC,QAAQ;gBAClC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,gCAAgC;aACjE,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,IACE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC;QACnC,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAClC,CAAC;QACD,OAAO,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YACvD,YAAY;SACb,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YACvD,YAAY;SACb,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YACvD,YAAY;SACb,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,IACE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAC7B,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC,EACxC,CAAC;QACD,OAAO,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YACvD,YAAY;SACb,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YACvD,YAAY;SACb,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,IAAI,CAAC,UAAU;gBACzB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;gBAC7C,CAAC,CAAC,SAAS;YACb,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa;YAC9B,YAAY;SACb,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,+BAA+B;QAC/B,MAAM,SAAS,GAAG,iBAAiB,CACjC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAC3D,OAAO,CACR,CAAC;QACF,wEAAwE;QACxE,MAAM,gBAAgB,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACzE,MAAM,YAAY,GAAG,WAAW,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,EAAE,GAAG,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;IACtD,CAAC;IAED,iCAAiC;IACjC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC;AACpE,CAAC,CAAC;AAEF,+DAA+D;AAC/D,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,qCAAqC,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) => 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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"}
@@ -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,MAKF,CAAC"}
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"}
@@ -8,6 +8,7 @@ export const convertArrayType = (node, checker, convertType) => {
8
8
  return {
9
9
  kind: "arrayType",
10
10
  elementType: convertType(node.elementType, checker),
11
+ origin: "explicit",
11
12
  };
12
13
  };
13
14
  //# sourceMappingURL=arrays.js.map
@@ -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;KACpD,CAAC;AACJ,CAAC,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,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,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 callable signatures (function types)
57
- const callSignatures = type.getCallSignatures();
58
- if (callSignatures.length > 0) {
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
- if (objectType.symbol) {
65
- const name = objectType.symbol.name;
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
- return undefined;
69
- }
70
- // For named types, return as reference type with type arguments if generic
71
- if (name && name !== "Object" && name !== "Array") {
72
- // Extract type arguments for generic types
73
- const typeRef = type;
74
- const typeArgs = checker.getTypeArguments(typeRef);
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 and unknown
96
- if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) {
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
- // Union and intersection types - too complex for simple inference
100
- if (flags & ts.TypeFlags.Union || flags & ts.TypeFlags.Intersection) {
101
- return undefined;
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
  };