@tsonic/frontend 0.0.13 → 0.0.15

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 (513) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/graph/builder.js +2 -2
  3. package/dist/graph/builder.js.map +1 -1
  4. package/dist/graph/extraction/imports.js +1 -1
  5. package/dist/graph/extraction/imports.js.map +1 -1
  6. package/dist/graph/extraction/orchestrator.d.ts.map +1 -1
  7. package/dist/graph/extraction/orchestrator.js +1 -1
  8. package/dist/graph/extraction/orchestrator.js.map +1 -1
  9. package/dist/ir/binding/index.d.ts +134 -0
  10. package/dist/ir/binding/index.d.ts.map +1 -0
  11. package/dist/ir/binding/index.js +725 -0
  12. package/dist/ir/binding/index.js.map +1 -0
  13. package/dist/ir/binding-resolution.test.js +193 -52
  14. package/dist/ir/binding-resolution.test.js.map +1 -1
  15. package/dist/ir/builder/exports.d.ts +20 -2
  16. package/dist/ir/builder/exports.d.ts.map +1 -1
  17. package/dist/ir/builder/exports.js +65 -6
  18. package/dist/ir/builder/exports.js.map +1 -1
  19. package/dist/ir/builder/imports.d.ts +9 -5
  20. package/dist/ir/builder/imports.d.ts.map +1 -1
  21. package/dist/ir/builder/imports.js +20 -31
  22. package/dist/ir/builder/imports.js.map +1 -1
  23. package/dist/ir/builder/orchestrator.d.ts +10 -1
  24. package/dist/ir/builder/orchestrator.d.ts.map +1 -1
  25. package/dist/ir/builder/orchestrator.js +25 -14
  26. package/dist/ir/builder/orchestrator.js.map +1 -1
  27. package/dist/ir/builder/statements.d.ts +7 -1
  28. package/dist/ir/builder/statements.d.ts.map +1 -1
  29. package/dist/ir/builder/statements.js +7 -2
  30. package/dist/ir/builder/statements.js.map +1 -1
  31. package/dist/ir/builder/types.d.ts +3 -0
  32. package/dist/ir/builder/types.d.ts.map +1 -1
  33. package/dist/ir/builder/validation.d.ts +4 -1
  34. package/dist/ir/builder/validation.d.ts.map +1 -1
  35. package/dist/ir/builder/validation.js +37 -37
  36. package/dist/ir/builder/validation.js.map +1 -1
  37. package/dist/ir/builder.test.js +54 -111
  38. package/dist/ir/builder.test.js.map +1 -1
  39. package/dist/ir/clr-type-mappings.d.ts +42 -0
  40. package/dist/ir/clr-type-mappings.d.ts.map +1 -0
  41. package/dist/ir/clr-type-mappings.js +139 -0
  42. package/dist/ir/clr-type-mappings.js.map +1 -0
  43. package/dist/ir/converters/anonymous-synthesis.d.ts +30 -8
  44. package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -1
  45. package/dist/ir/converters/anonymous-synthesis.js +46 -55
  46. package/dist/ir/converters/anonymous-synthesis.js.map +1 -1
  47. package/dist/ir/converters/context.d.ts +40 -0
  48. package/dist/ir/converters/context.d.ts.map +1 -0
  49. package/dist/ir/converters/context.js +24 -0
  50. package/dist/ir/converters/context.js.map +1 -0
  51. package/dist/ir/converters/expressions/access.d.ts +6 -1
  52. package/dist/ir/converters/expressions/access.d.ts.map +1 -1
  53. package/dist/ir/converters/expressions/access.js +239 -15
  54. package/dist/ir/converters/expressions/access.js.map +1 -1
  55. package/dist/ir/converters/expressions/calls.d.ts +24 -3
  56. package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
  57. package/dist/ir/converters/expressions/calls.js +450 -385
  58. package/dist/ir/converters/expressions/calls.js.map +1 -1
  59. package/dist/ir/converters/expressions/collections.d.ts +16 -3
  60. package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
  61. package/dist/ir/converters/expressions/collections.js +300 -46
  62. package/dist/ir/converters/expressions/collections.js.map +1 -1
  63. package/dist/ir/converters/expressions/functions.d.ts +10 -3
  64. package/dist/ir/converters/expressions/functions.d.ts.map +1 -1
  65. package/dist/ir/converters/expressions/functions.js +140 -32
  66. package/dist/ir/converters/expressions/functions.js.map +1 -1
  67. package/dist/ir/converters/expressions/helpers.d.ts +22 -23
  68. package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
  69. package/dist/ir/converters/expressions/helpers.js +242 -239
  70. package/dist/ir/converters/expressions/helpers.js.map +1 -1
  71. package/dist/ir/converters/expressions/index.d.ts +1 -1
  72. package/dist/ir/converters/expressions/index.d.ts.map +1 -1
  73. package/dist/ir/converters/expressions/index.js +1 -1
  74. package/dist/ir/converters/expressions/index.js.map +1 -1
  75. package/dist/ir/converters/expressions/literals.d.ts +12 -12
  76. package/dist/ir/converters/expressions/literals.d.ts.map +1 -1
  77. package/dist/ir/converters/expressions/literals.js +62 -17
  78. package/dist/ir/converters/expressions/literals.js.map +1 -1
  79. package/dist/ir/converters/expressions/numeric-recovery.test.d.ts +5 -2
  80. package/dist/ir/converters/expressions/numeric-recovery.test.d.ts.map +1 -1
  81. package/dist/ir/converters/expressions/numeric-recovery.test.js +62 -49
  82. package/dist/ir/converters/expressions/numeric-recovery.test.js.map +1 -1
  83. package/dist/ir/converters/expressions/operators.d.ts +13 -4
  84. package/dist/ir/converters/expressions/operators.d.ts.map +1 -1
  85. package/dist/ir/converters/expressions/operators.js +179 -33
  86. package/dist/ir/converters/expressions/operators.js.map +1 -1
  87. package/dist/ir/converters/expressions/other.d.ts +11 -3
  88. package/dist/ir/converters/expressions/other.d.ts.map +1 -1
  89. package/dist/ir/converters/expressions/other.js +26 -10
  90. package/dist/ir/converters/expressions/other.js.map +1 -1
  91. package/dist/ir/converters/statements/control/blocks.d.ts +8 -2
  92. package/dist/ir/converters/statements/control/blocks.d.ts.map +1 -1
  93. package/dist/ir/converters/statements/control/blocks.js +7 -2
  94. package/dist/ir/converters/statements/control/blocks.js.map +1 -1
  95. package/dist/ir/converters/statements/control/conditionals.d.ts +14 -4
  96. package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
  97. package/dist/ir/converters/statements/control/conditionals.js +19 -10
  98. package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
  99. package/dist/ir/converters/statements/control/exceptions.d.ts +10 -3
  100. package/dist/ir/converters/statements/control/exceptions.d.ts.map +1 -1
  101. package/dist/ir/converters/statements/control/exceptions.js +13 -7
  102. package/dist/ir/converters/statements/control/exceptions.js.map +1 -1
  103. package/dist/ir/converters/statements/control/loops.d.ts +16 -5
  104. package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
  105. package/dist/ir/converters/statements/control/loops.js +25 -15
  106. package/dist/ir/converters/statements/control/loops.js.map +1 -1
  107. package/dist/ir/converters/statements/declarations/classes/constructors.d.ts +3 -2
  108. package/dist/ir/converters/statements/declarations/classes/constructors.d.ts.map +1 -1
  109. package/dist/ir/converters/statements/declarations/classes/constructors.js +11 -7
  110. package/dist/ir/converters/statements/declarations/classes/constructors.js.map +1 -1
  111. package/dist/ir/converters/statements/declarations/classes/methods.d.ts +2 -1
  112. package/dist/ir/converters/statements/declarations/classes/methods.d.ts.map +1 -1
  113. package/dist/ir/converters/statements/declarations/classes/methods.js +63 -11
  114. package/dist/ir/converters/statements/declarations/classes/methods.js.map +1 -1
  115. package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts +2 -1
  116. package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts.map +1 -1
  117. package/dist/ir/converters/statements/declarations/classes/orchestrator.js +60 -40
  118. package/dist/ir/converters/statements/declarations/classes/orchestrator.js.map +1 -1
  119. package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts +6 -2
  120. package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts.map +1 -1
  121. package/dist/ir/converters/statements/declarations/classes/override-detection.js +49 -50
  122. package/dist/ir/converters/statements/declarations/classes/override-detection.js.map +1 -1
  123. package/dist/ir/converters/statements/declarations/classes/properties.d.ts +9 -1
  124. package/dist/ir/converters/statements/declarations/classes/properties.d.ts.map +1 -1
  125. package/dist/ir/converters/statements/declarations/classes/properties.js +119 -16
  126. package/dist/ir/converters/statements/declarations/classes/properties.js.map +1 -1
  127. package/dist/ir/converters/statements/declarations/enums.d.ts +2 -1
  128. package/dist/ir/converters/statements/declarations/enums.d.ts.map +1 -1
  129. package/dist/ir/converters/statements/declarations/enums.js +8 -2
  130. package/dist/ir/converters/statements/declarations/enums.js.map +1 -1
  131. package/dist/ir/converters/statements/declarations/functions.d.ts +2 -1
  132. package/dist/ir/converters/statements/declarations/functions.d.ts.map +1 -1
  133. package/dist/ir/converters/statements/declarations/functions.js +11 -6
  134. package/dist/ir/converters/statements/declarations/functions.js.map +1 -1
  135. package/dist/ir/converters/statements/declarations/index.d.ts +3 -1
  136. package/dist/ir/converters/statements/declarations/index.d.ts.map +1 -1
  137. package/dist/ir/converters/statements/declarations/index.js +3 -1
  138. package/dist/ir/converters/statements/declarations/index.js.map +1 -1
  139. package/dist/ir/converters/statements/declarations/interfaces.d.ts +3 -2
  140. package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
  141. package/dist/ir/converters/statements/declarations/interfaces.js +26 -20
  142. package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
  143. package/dist/ir/converters/statements/declarations/registry.d.ts +72 -0
  144. package/dist/ir/converters/statements/declarations/registry.d.ts.map +1 -1
  145. package/dist/ir/converters/statements/declarations/registry.js +92 -0
  146. package/dist/ir/converters/statements/declarations/registry.js.map +1 -1
  147. package/dist/ir/converters/statements/declarations/type-aliases.d.ts +2 -1
  148. package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
  149. package/dist/ir/converters/statements/declarations/type-aliases.js +6 -4
  150. package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
  151. package/dist/ir/converters/statements/declarations/variables.d.ts +11 -1
  152. package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
  153. package/dist/ir/converters/statements/declarations/variables.js +123 -19
  154. package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
  155. package/dist/ir/converters/statements/declarations.d.ts +4 -1
  156. package/dist/ir/converters/statements/declarations.d.ts.map +1 -1
  157. package/dist/ir/converters/statements/declarations.js +4 -1
  158. package/dist/ir/converters/statements/declarations.js.map +1 -1
  159. package/dist/ir/converters/statements/helpers.d.ts +4 -3
  160. package/dist/ir/converters/statements/helpers.d.ts.map +1 -1
  161. package/dist/ir/converters/statements/helpers.js +55 -31
  162. package/dist/ir/converters/statements/helpers.js.map +1 -1
  163. package/dist/ir/converters/statements/index.d.ts +1 -1
  164. package/dist/ir/converters/statements/index.d.ts.map +1 -1
  165. package/dist/ir/converters/statements/index.js +2 -1
  166. package/dist/ir/converters/statements/index.js.map +1 -1
  167. package/dist/ir/expression-converter.d.ts +10 -3
  168. package/dist/ir/expression-converter.d.ts.map +1 -1
  169. package/dist/ir/expression-converter.js +150 -56
  170. package/dist/ir/expression-converter.js.map +1 -1
  171. package/dist/ir/hierarchical-bindings-e2e.test.js +10 -6
  172. package/dist/ir/hierarchical-bindings-e2e.test.js.map +1 -1
  173. package/dist/ir/index.d.ts +5 -0
  174. package/dist/ir/index.d.ts.map +1 -1
  175. package/dist/ir/index.js +5 -0
  176. package/dist/ir/index.js.map +1 -1
  177. package/dist/ir/no-ts-type-inference.test.d.ts +17 -0
  178. package/dist/ir/no-ts-type-inference.test.d.ts.map +1 -0
  179. package/dist/ir/no-ts-type-inference.test.js +171 -0
  180. package/dist/ir/no-ts-type-inference.test.js.map +1 -0
  181. package/dist/ir/program-context.d.ts +74 -0
  182. package/dist/ir/program-context.d.ts.map +1 -0
  183. package/dist/ir/program-context.js +286 -0
  184. package/dist/ir/program-context.js.map +1 -0
  185. package/dist/ir/statement-converter.d.ts +14 -4
  186. package/dist/ir/statement-converter.d.ts.map +1 -1
  187. package/dist/ir/statement-converter.js +31 -21
  188. package/dist/ir/statement-converter.js.map +1 -1
  189. package/dist/ir/syntax/binding-patterns.d.ts +22 -0
  190. package/dist/ir/syntax/binding-patterns.d.ts.map +1 -0
  191. package/dist/ir/syntax/binding-patterns.js +92 -0
  192. package/dist/ir/syntax/binding-patterns.js.map +1 -0
  193. package/dist/ir/thisarg-inference.test.d.ts +8 -0
  194. package/dist/ir/thisarg-inference.test.d.ts.map +1 -0
  195. package/dist/ir/thisarg-inference.test.js +94 -0
  196. package/dist/ir/thisarg-inference.test.js.map +1 -0
  197. package/dist/ir/type-converter.d.ts +5 -2
  198. package/dist/ir/type-converter.d.ts.map +1 -1
  199. package/dist/ir/type-converter.js +5 -2
  200. package/dist/ir/type-converter.js.map +1 -1
  201. package/dist/ir/type-system/core.d.ts +29 -0
  202. package/dist/ir/type-system/core.d.ts.map +1 -0
  203. package/dist/ir/type-system/core.js +456 -0
  204. package/dist/ir/type-system/core.js.map +1 -0
  205. package/dist/ir/type-system/index.d.ts +21 -0
  206. package/dist/ir/type-system/index.d.ts.map +1 -0
  207. package/dist/ir/type-system/index.js +43 -0
  208. package/dist/ir/type-system/index.js.map +1 -0
  209. package/dist/ir/type-system/internal/handle-types.d.ts +98 -0
  210. package/dist/ir/type-system/internal/handle-types.d.ts.map +1 -0
  211. package/dist/ir/type-system/internal/handle-types.js +13 -0
  212. package/dist/ir/type-system/internal/handle-types.js.map +1 -0
  213. package/dist/ir/type-system/internal/nominal-env.d.ts +66 -0
  214. package/dist/ir/type-system/internal/nominal-env.d.ts.map +1 -0
  215. package/dist/ir/type-system/internal/nominal-env.js +301 -0
  216. package/dist/ir/type-system/internal/nominal-env.js.map +1 -0
  217. package/dist/ir/type-system/internal/type-converter/arrays.d.ts +11 -0
  218. package/dist/ir/type-system/internal/type-converter/arrays.d.ts.map +1 -0
  219. package/dist/ir/{type-converter → type-system/internal/type-converter}/arrays.js +2 -2
  220. package/dist/ir/type-system/internal/type-converter/arrays.js.map +1 -0
  221. package/dist/ir/type-system/internal/type-converter/converter.d.ts +17 -0
  222. package/dist/ir/type-system/internal/type-converter/converter.d.ts.map +1 -0
  223. package/dist/ir/type-system/internal/type-converter/converter.js +16 -0
  224. package/dist/ir/type-system/internal/type-converter/converter.js.map +1 -0
  225. package/dist/ir/type-system/internal/type-converter/functions.d.ts +14 -0
  226. package/dist/ir/type-system/internal/type-converter/functions.d.ts.map +1 -0
  227. package/dist/ir/type-system/internal/type-converter/functions.js +66 -0
  228. package/dist/ir/type-system/internal/type-converter/functions.js.map +1 -0
  229. package/dist/ir/type-system/internal/type-converter/index.d.ts +11 -0
  230. package/dist/ir/type-system/internal/type-converter/index.d.ts.map +1 -0
  231. package/dist/ir/type-system/internal/type-converter/index.js +11 -0
  232. package/dist/ir/type-system/internal/type-converter/index.js.map +1 -0
  233. package/dist/ir/type-system/internal/type-converter/inference.d.ts +37 -0
  234. package/dist/ir/type-system/internal/type-converter/inference.d.ts.map +1 -0
  235. package/dist/ir/type-system/internal/type-converter/inference.js +32 -0
  236. package/dist/ir/type-system/internal/type-converter/inference.js.map +1 -0
  237. package/dist/ir/{type-converter → type-system/internal/type-converter}/literals.d.ts +1 -1
  238. package/dist/ir/type-system/internal/type-converter/literals.d.ts.map +1 -0
  239. package/dist/ir/type-system/internal/type-converter/literals.js.map +1 -0
  240. package/dist/ir/type-system/internal/type-converter/objects.d.ts +20 -0
  241. package/dist/ir/type-system/internal/type-converter/objects.d.ts.map +1 -0
  242. package/dist/ir/{type-converter → type-system/internal/type-converter}/objects.js +56 -6
  243. package/dist/ir/type-system/internal/type-converter/objects.js.map +1 -0
  244. package/dist/ir/{type-converter → type-system/internal/type-converter}/orchestrator.d.ts +3 -2
  245. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts.map +1 -0
  246. package/dist/ir/{type-converter → type-system/internal/type-converter}/orchestrator.js +63 -21
  247. package/dist/ir/type-system/internal/type-converter/orchestrator.js.map +1 -0
  248. package/dist/ir/type-system/internal/type-converter/patterns.d.ts +12 -0
  249. package/dist/ir/type-system/internal/type-converter/patterns.d.ts.map +1 -0
  250. package/dist/ir/{type-converter → type-system/internal/type-converter}/patterns.js +22 -6
  251. package/dist/ir/type-system/internal/type-converter/patterns.js.map +1 -0
  252. package/dist/ir/{type-converter → type-system/internal/type-converter}/primitives.d.ts +1 -1
  253. package/dist/ir/type-system/internal/type-converter/primitives.d.ts.map +1 -0
  254. package/dist/ir/type-system/internal/type-converter/primitives.js.map +1 -0
  255. package/dist/ir/{type-converter → type-system/internal/type-converter}/references.d.ts +3 -2
  256. package/dist/ir/type-system/internal/type-converter/references.d.ts.map +1 -0
  257. package/dist/ir/type-system/internal/type-converter/references.js +551 -0
  258. package/dist/ir/type-system/internal/type-converter/references.js.map +1 -0
  259. package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts +15 -0
  260. package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts.map +1 -0
  261. package/dist/ir/type-system/internal/type-converter/unions-intersections.js +22 -0
  262. package/dist/ir/type-system/internal/type-converter/unions-intersections.js.map +1 -0
  263. package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.d.ts +23 -36
  264. package/dist/ir/type-system/internal/type-converter/utility-types.d.ts.map +1 -0
  265. package/dist/ir/type-system/internal/type-converter/utility-types.js +879 -0
  266. package/dist/ir/type-system/internal/type-converter/utility-types.js.map +1 -0
  267. package/dist/ir/type-system/internal/type-converter/utility-types.test.d.ts.map +1 -0
  268. package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.test.js +398 -120
  269. package/dist/ir/type-system/internal/type-converter/utility-types.test.js.map +1 -0
  270. package/dist/ir/type-system/internal/type-converter.d.ts +9 -0
  271. package/dist/ir/type-system/internal/type-converter.d.ts.map +1 -0
  272. package/dist/ir/type-system/internal/type-converter.js +9 -0
  273. package/dist/ir/type-system/internal/type-converter.js.map +1 -0
  274. package/dist/ir/type-system/internal/type-registry.d.ts +107 -0
  275. package/dist/ir/type-system/internal/type-registry.d.ts.map +1 -0
  276. package/dist/ir/type-system/internal/type-registry.js +534 -0
  277. package/dist/ir/type-system/internal/type-registry.js.map +1 -0
  278. package/dist/ir/type-system/internal/universe/alias-table.d.ts +92 -0
  279. package/dist/ir/type-system/internal/universe/alias-table.d.ts.map +1 -0
  280. package/dist/ir/type-system/internal/universe/alias-table.js +222 -0
  281. package/dist/ir/type-system/internal/universe/alias-table.js.map +1 -0
  282. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts +44 -0
  283. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts.map +1 -0
  284. package/dist/ir/type-system/internal/universe/clr-catalog.js +1176 -0
  285. package/dist/ir/type-system/internal/universe/clr-catalog.js.map +1 -0
  286. package/dist/ir/type-system/internal/universe/index.d.ts +26 -0
  287. package/dist/ir/type-system/internal/universe/index.d.ts.map +1 -0
  288. package/dist/ir/type-system/internal/universe/index.js +30 -0
  289. package/dist/ir/type-system/internal/universe/index.js.map +1 -0
  290. package/dist/ir/type-system/internal/universe/resolution.d.ts +115 -0
  291. package/dist/ir/type-system/internal/universe/resolution.d.ts.map +1 -0
  292. package/dist/ir/type-system/internal/universe/resolution.js +181 -0
  293. package/dist/ir/type-system/internal/universe/resolution.js.map +1 -0
  294. package/dist/ir/type-system/internal/universe/source-catalog.d.ts +62 -0
  295. package/dist/ir/type-system/internal/universe/source-catalog.d.ts.map +1 -0
  296. package/dist/ir/type-system/internal/universe/source-catalog.js +91 -0
  297. package/dist/ir/type-system/internal/universe/source-catalog.js.map +1 -0
  298. package/dist/ir/type-system/internal/universe/types.d.ts +436 -0
  299. package/dist/ir/type-system/internal/universe/types.d.ts.map +1 -0
  300. package/dist/ir/type-system/internal/universe/types.js +69 -0
  301. package/dist/ir/type-system/internal/universe/types.js.map +1 -0
  302. package/dist/ir/type-system/internal/universe/unified-universe.d.ts +70 -0
  303. package/dist/ir/type-system/internal/universe/unified-universe.d.ts.map +1 -0
  304. package/dist/ir/type-system/internal/universe/unified-universe.js +319 -0
  305. package/dist/ir/type-system/internal/universe/unified-universe.js.map +1 -0
  306. package/dist/ir/type-system/type-system.d.ts +617 -0
  307. package/dist/ir/type-system/type-system.d.ts.map +1 -0
  308. package/dist/ir/type-system/type-system.js +2420 -0
  309. package/dist/ir/type-system/type-system.js.map +1 -0
  310. package/dist/ir/type-system/types.d.ts +176 -0
  311. package/dist/ir/type-system/types.d.ts.map +1 -0
  312. package/dist/ir/type-system/types.js +80 -0
  313. package/dist/ir/type-system/types.js.map +1 -0
  314. package/dist/ir/type-universe/assembly-catalog.d.ts +44 -0
  315. package/dist/ir/type-universe/assembly-catalog.d.ts.map +1 -0
  316. package/dist/ir/type-universe/assembly-catalog.js +532 -0
  317. package/dist/ir/type-universe/assembly-catalog.js.map +1 -0
  318. package/dist/ir/type-universe/assembly-catalog.test.d.ts +7 -0
  319. package/dist/ir/type-universe/assembly-catalog.test.d.ts.map +1 -0
  320. package/dist/ir/type-universe/assembly-catalog.test.js +105 -0
  321. package/dist/ir/type-universe/assembly-catalog.test.js.map +1 -0
  322. package/dist/ir/type-universe/index.d.ts +19 -0
  323. package/dist/ir/type-universe/index.d.ts.map +1 -0
  324. package/dist/ir/type-universe/index.js +21 -0
  325. package/dist/ir/type-universe/index.js.map +1 -0
  326. package/dist/ir/type-universe/types.d.ts +436 -0
  327. package/dist/ir/type-universe/types.d.ts.map +1 -0
  328. package/dist/ir/type-universe/types.js +69 -0
  329. package/dist/ir/type-universe/types.js.map +1 -0
  330. package/dist/ir/type-universe/unified-catalog.d.ts +70 -0
  331. package/dist/ir/type-universe/unified-catalog.d.ts.map +1 -0
  332. package/dist/ir/type-universe/unified-catalog.js +319 -0
  333. package/dist/ir/type-universe/unified-catalog.js.map +1 -0
  334. package/dist/ir/type-universe/unified-catalog.test.d.ts +7 -0
  335. package/dist/ir/type-universe/unified-catalog.test.d.ts.map +1 -0
  336. package/dist/ir/type-universe/unified-catalog.test.js +135 -0
  337. package/dist/ir/type-universe/unified-catalog.test.js.map +1 -0
  338. package/dist/ir/types/expressions.d.ts +74 -2
  339. package/dist/ir/types/expressions.d.ts.map +1 -1
  340. package/dist/ir/types/helpers.d.ts +22 -2
  341. package/dist/ir/types/helpers.d.ts.map +1 -1
  342. package/dist/ir/types/index.d.ts +4 -2
  343. package/dist/ir/types/index.d.ts.map +1 -1
  344. package/dist/ir/types/index.js +1 -0
  345. package/dist/ir/types/index.js.map +1 -1
  346. package/dist/ir/types/ir-substitution.d.ts +144 -0
  347. package/dist/ir/types/ir-substitution.d.ts.map +1 -0
  348. package/dist/ir/types/ir-substitution.js +569 -0
  349. package/dist/ir/types/ir-substitution.js.map +1 -0
  350. package/dist/ir/types/ir-types.d.ts +9 -3
  351. package/dist/ir/types/ir-types.d.ts.map +1 -1
  352. package/dist/ir/types/numeric-helpers.d.ts +2 -1
  353. package/dist/ir/types/numeric-helpers.d.ts.map +1 -1
  354. package/dist/ir/types/numeric-helpers.js +9 -3
  355. package/dist/ir/types/numeric-helpers.js.map +1 -1
  356. package/dist/ir/types/statements.d.ts +13 -1
  357. package/dist/ir/types/statements.d.ts.map +1 -1
  358. package/dist/ir/types.d.ts +1 -1
  359. package/dist/ir/types.d.ts.map +1 -1
  360. package/dist/ir/types.js.map +1 -1
  361. package/dist/ir/validation/anonymous-type-lowering-pass.d.ts.map +1 -1
  362. package/dist/ir/validation/anonymous-type-lowering-pass.js +165 -7
  363. package/dist/ir/validation/anonymous-type-lowering-pass.js.map +1 -1
  364. package/dist/ir/validation/arrow-return-finalization-pass.d.ts +28 -0
  365. package/dist/ir/validation/arrow-return-finalization-pass.d.ts.map +1 -0
  366. package/dist/ir/validation/arrow-return-finalization-pass.js +416 -0
  367. package/dist/ir/validation/arrow-return-finalization-pass.js.map +1 -0
  368. package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -1
  369. package/dist/ir/validation/attribute-collection-pass.js +40 -6
  370. package/dist/ir/validation/attribute-collection-pass.js.map +1 -1
  371. package/dist/ir/validation/attribute-collection-pass.test.js +43 -36
  372. package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -1
  373. package/dist/ir/validation/index.d.ts +3 -0
  374. package/dist/ir/validation/index.d.ts.map +1 -1
  375. package/dist/ir/validation/index.js +3 -0
  376. package/dist/ir/validation/index.js.map +1 -1
  377. package/dist/ir/validation/numeric-coercion-pass.d.ts +22 -16
  378. package/dist/ir/validation/numeric-coercion-pass.d.ts.map +1 -1
  379. package/dist/ir/validation/numeric-coercion-pass.js +159 -51
  380. package/dist/ir/validation/numeric-coercion-pass.js.map +1 -1
  381. package/dist/ir/validation/numeric-invariants.test.js +72 -108
  382. package/dist/ir/validation/numeric-invariants.test.js.map +1 -1
  383. package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -1
  384. package/dist/ir/validation/numeric-proof-pass.js +71 -23
  385. package/dist/ir/validation/numeric-proof-pass.js.map +1 -1
  386. package/dist/ir/validation/rest-type-synthesis-pass.d.ts +24 -0
  387. package/dist/ir/validation/rest-type-synthesis-pass.d.ts.map +1 -0
  388. package/dist/ir/validation/rest-type-synthesis-pass.js +417 -0
  389. package/dist/ir/validation/rest-type-synthesis-pass.js.map +1 -0
  390. package/dist/ir/validation/soundness-gate.d.ts +11 -1
  391. package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
  392. package/dist/ir/validation/soundness-gate.js +42 -10
  393. package/dist/ir/validation/soundness-gate.js.map +1 -1
  394. package/dist/ir/validation/soundness-gate.test.js +19 -2
  395. package/dist/ir/validation/soundness-gate.test.js.map +1 -1
  396. package/dist/ir/validation/virtual-marking-pass.d.ts +16 -0
  397. package/dist/ir/validation/virtual-marking-pass.d.ts.map +1 -0
  398. package/dist/ir/validation/virtual-marking-pass.js +77 -0
  399. package/dist/ir/validation/virtual-marking-pass.js.map +1 -0
  400. package/dist/ir/validation/yield-lowering-pass.test.js +2 -2
  401. package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
  402. package/dist/program/bindings.d.ts +28 -0
  403. package/dist/program/bindings.d.ts.map +1 -1
  404. package/dist/program/bindings.js +204 -2
  405. package/dist/program/bindings.js.map +1 -1
  406. package/dist/program/bindings.test.js +30 -0
  407. package/dist/program/bindings.test.js.map +1 -1
  408. package/dist/program/creation.d.ts.map +1 -1
  409. package/dist/program/creation.js +251 -4
  410. package/dist/program/creation.js.map +1 -1
  411. package/dist/program/dependency-graph.d.ts.map +1 -1
  412. package/dist/program/dependency-graph.js +25 -25
  413. package/dist/program/dependency-graph.js.map +1 -1
  414. package/dist/program/diagnostics.d.ts.map +1 -1
  415. package/dist/program/diagnostics.js +6 -0
  416. package/dist/program/diagnostics.js.map +1 -1
  417. package/dist/program/index.d.ts +1 -1
  418. package/dist/program/index.d.ts.map +1 -1
  419. package/dist/program/types.d.ts +8 -8
  420. package/dist/program/types.d.ts.map +1 -1
  421. package/dist/resolver/clr-bindings-resolver.d.ts +1 -0
  422. package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
  423. package/dist/resolver/clr-bindings-resolver.js +90 -34
  424. package/dist/resolver/clr-bindings-resolver.js.map +1 -1
  425. package/dist/resolver/import-resolution.d.ts +16 -1
  426. package/dist/resolver/import-resolution.d.ts.map +1 -1
  427. package/dist/resolver/import-resolution.js +29 -12
  428. package/dist/resolver/import-resolution.js.map +1 -1
  429. package/dist/resolver/naming.d.ts +1 -1
  430. package/dist/resolver/naming.d.ts.map +1 -1
  431. package/dist/resolver/naming.js +13 -2
  432. package/dist/resolver/naming.js.map +1 -1
  433. package/dist/resolver.test.js +4 -0
  434. package/dist/resolver.test.js.map +1 -1
  435. package/dist/symbol-table/builder.d.ts +3 -1
  436. package/dist/symbol-table/builder.d.ts.map +1 -1
  437. package/dist/symbol-table/builder.js +9 -8
  438. package/dist/symbol-table/builder.js.map +1 -1
  439. package/dist/symbol-table/types.d.ts +2 -2
  440. package/dist/symbol-table/types.d.ts.map +1 -1
  441. package/dist/types/diagnostic.d.ts +12 -2
  442. package/dist/types/diagnostic.d.ts.map +1 -1
  443. package/dist/types/diagnostic.js +5 -1
  444. package/dist/types/diagnostic.js.map +1 -1
  445. package/dist/validation/extension-methods.d.ts +17 -0
  446. package/dist/validation/extension-methods.d.ts.map +1 -0
  447. package/dist/validation/extension-methods.js +133 -0
  448. package/dist/validation/extension-methods.js.map +1 -0
  449. package/dist/validation/generics.d.ts.map +1 -1
  450. package/dist/validation/generics.js +1 -129
  451. package/dist/validation/generics.js.map +1 -1
  452. package/dist/validation/imports.js +1 -1
  453. package/dist/validation/imports.js.map +1 -1
  454. package/dist/validation/index.d.ts +1 -0
  455. package/dist/validation/index.d.ts.map +1 -1
  456. package/dist/validation/index.js +1 -0
  457. package/dist/validation/index.js.map +1 -1
  458. package/dist/validation/orchestrator.d.ts.map +1 -1
  459. package/dist/validation/orchestrator.js +2 -0
  460. package/dist/validation/orchestrator.js.map +1 -1
  461. package/dist/validation/static-safety.d.ts +1 -0
  462. package/dist/validation/static-safety.d.ts.map +1 -1
  463. package/dist/validation/static-safety.js +366 -96
  464. package/dist/validation/static-safety.js.map +1 -1
  465. package/dist/validator.test.js +77 -1
  466. package/dist/validator.test.js.map +1 -1
  467. package/package.json +2 -2
  468. package/dist/ir/type-converter/arrays.d.ts +0 -10
  469. package/dist/ir/type-converter/arrays.d.ts.map +0 -1
  470. package/dist/ir/type-converter/arrays.js.map +0 -1
  471. package/dist/ir/type-converter/converter.d.ts +0 -6
  472. package/dist/ir/type-converter/converter.d.ts.map +0 -1
  473. package/dist/ir/type-converter/converter.js +0 -6
  474. package/dist/ir/type-converter/converter.js.map +0 -1
  475. package/dist/ir/type-converter/functions.d.ts +0 -10
  476. package/dist/ir/type-converter/functions.d.ts.map +0 -1
  477. package/dist/ir/type-converter/functions.js +0 -15
  478. package/dist/ir/type-converter/functions.js.map +0 -1
  479. package/dist/ir/type-converter/index.d.ts +0 -7
  480. package/dist/ir/type-converter/index.d.ts.map +0 -1
  481. package/dist/ir/type-converter/index.js +0 -7
  482. package/dist/ir/type-converter/index.js.map +0 -1
  483. package/dist/ir/type-converter/inference.d.ts +0 -32
  484. package/dist/ir/type-converter/inference.d.ts.map +0 -1
  485. package/dist/ir/type-converter/inference.js +0 -297
  486. package/dist/ir/type-converter/inference.js.map +0 -1
  487. package/dist/ir/type-converter/literals.d.ts.map +0 -1
  488. package/dist/ir/type-converter/literals.js.map +0 -1
  489. package/dist/ir/type-converter/objects.d.ts +0 -16
  490. package/dist/ir/type-converter/objects.d.ts.map +0 -1
  491. package/dist/ir/type-converter/objects.js.map +0 -1
  492. package/dist/ir/type-converter/orchestrator.d.ts.map +0 -1
  493. package/dist/ir/type-converter/orchestrator.js.map +0 -1
  494. package/dist/ir/type-converter/patterns.d.ts +0 -10
  495. package/dist/ir/type-converter/patterns.d.ts.map +0 -1
  496. package/dist/ir/type-converter/patterns.js.map +0 -1
  497. package/dist/ir/type-converter/primitives.d.ts.map +0 -1
  498. package/dist/ir/type-converter/primitives.js.map +0 -1
  499. package/dist/ir/type-converter/references.d.ts.map +0 -1
  500. package/dist/ir/type-converter/references.js +0 -371
  501. package/dist/ir/type-converter/references.js.map +0 -1
  502. package/dist/ir/type-converter/unions-intersections.d.ts +0 -14
  503. package/dist/ir/type-converter/unions-intersections.d.ts.map +0 -1
  504. package/dist/ir/type-converter/unions-intersections.js +0 -22
  505. package/dist/ir/type-converter/unions-intersections.js.map +0 -1
  506. package/dist/ir/type-converter/utility-types.d.ts.map +0 -1
  507. package/dist/ir/type-converter/utility-types.js +0 -528
  508. package/dist/ir/type-converter/utility-types.js.map +0 -1
  509. package/dist/ir/type-converter/utility-types.test.d.ts.map +0 -1
  510. package/dist/ir/type-converter/utility-types.test.js.map +0 -1
  511. /package/dist/ir/{type-converter → type-system/internal/type-converter}/literals.js +0 -0
  512. /package/dist/ir/{type-converter → type-system/internal/type-converter}/primitives.js +0 -0
  513. /package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.test.d.ts +0 -0
@@ -1,380 +1,149 @@
1
1
  /**
2
2
  * Call and new expression converters
3
+ *
4
+ * ALICE'S SPEC: All call resolution goes through TypeSystem.resolveCall().
5
+ * NO FALLBACKS ALLOWED. If TypeSystem can't resolve, return unknownType.
3
6
  */
4
7
  import * as ts from "typescript";
5
- import { getInferredType, getSourceSpan, extractTypeArguments, checkIfRequiresSpecialization, } from "./helpers.js";
8
+ import { getSourceSpan, extractTypeArguments, checkIfRequiresSpecialization, } from "./helpers.js";
6
9
  import { convertExpression } from "../../expression-converter.js";
7
- import { convertType, convertTsTypeToIr } from "../../type-converter.js";
8
- /**
9
- * Extract argument passing modes from resolved signature
10
- * Returns array aligned with arguments, indicating ref/out/in/value for each
11
- */
12
- const extractArgumentPassing = (node, checker) => {
13
- try {
14
- const signature = checker.getResolvedSignature(node);
15
- if (!signature || !signature.declaration) {
16
- return undefined;
17
- }
18
- const decl = signature.declaration;
19
- let parameters = [];
20
- // Extract parameters from declaration
21
- if (ts.isFunctionDeclaration(decl) ||
22
- ts.isMethodDeclaration(decl) ||
23
- ts.isConstructorDeclaration(decl) ||
24
- ts.isArrowFunction(decl) ||
25
- ts.isFunctionExpression(decl)) {
26
- parameters = decl.parameters;
27
- }
28
- if (parameters.length === 0) {
29
- return undefined;
30
- }
31
- // Build passing mode for each parameter
32
- const passingModes = [];
33
- for (const param of parameters) {
34
- let passing = "value";
35
- // Check if parameter type is ref<T>, out<T>, or in<T>
36
- if (param.type &&
37
- ts.isTypeReferenceNode(param.type) &&
38
- ts.isIdentifier(param.type.typeName)) {
39
- const typeName = param.type.typeName.text;
40
- if ((typeName === "ref" || typeName === "out" || typeName === "in") &&
41
- param.type.typeArguments &&
42
- param.type.typeArguments.length > 0) {
43
- passing = typeName === "in" ? "in" : typeName;
44
- }
45
- }
46
- passingModes.push(passing);
47
- }
48
- return passingModes;
49
- }
50
- catch {
51
- return undefined;
52
- }
53
- };
54
10
  /**
55
- * Safely convert a ts.Type to IrType
11
+ * Extract argument passing modes from resolved signature.
12
+ * Returns array aligned with arguments, indicating ref/out/in/value for each.
13
+ *
14
+ * ALICE'S SPEC: Uses TypeSystem to get parameter modes.
15
+ * Parameter modes were normalized in Binding at registration time.
56
16
  */
57
- const convertTsTypeToIrSafe = (tsType, node, checker) => {
58
- try {
59
- const typeNode = checker.typeToTypeNode(tsType, node, ts.NodeBuilderFlags.None);
60
- return typeNode
61
- ? convertType(typeNode, checker)
62
- : convertTsTypeToIr(tsType, checker);
63
- }
64
- catch {
17
+ const extractArgumentPassing = (node, ctx) => {
18
+ // Get the TypeSystem
19
+ const typeSystem = ctx.typeSystem;
20
+ // Handle both CallExpression and NewExpression
21
+ const sigId = ts.isCallExpression(node)
22
+ ? ctx.binding.resolveCallSignature(node)
23
+ : ctx.binding.resolveConstructorSignature(node);
24
+ if (!sigId)
65
25
  return undefined;
66
- }
26
+ // Use TypeSystem.resolveCall() to get parameter modes
27
+ const resolved = typeSystem.resolveCall({
28
+ sigId,
29
+ argumentCount: ts.isCallExpression(node)
30
+ ? node.arguments.length
31
+ : (node.arguments?.length ?? 0),
32
+ });
33
+ // Return parameter modes from TypeSystem (already normalized in Binding)
34
+ return resolved.parameterModes;
67
35
  };
68
36
  /**
69
- * Extract type predicate narrowing metadata from a call expression.
70
- * Returns narrowing info if the callee is a type predicate function (x is T).
71
- */
72
- const extractNarrowing = (node, checker) => {
73
- try {
74
- const sig = checker.getResolvedSignature(node);
75
- if (!sig)
76
- return undefined;
77
- const pred = checker.getTypePredicateOfSignature(sig);
78
- // We only handle "param is T" predicates (not "this is T")
79
- if (pred &&
80
- pred.kind === ts.TypePredicateKind.Identifier &&
81
- pred.parameterIndex !== undefined &&
82
- pred.type) {
83
- const targetType = convertTsTypeToIrSafe(pred.type, node, checker);
84
- if (targetType) {
85
- return {
86
- kind: "typePredicate",
87
- argIndex: pred.parameterIndex,
88
- targetType,
89
- };
90
- }
91
- }
92
- return undefined;
93
- }
94
- catch {
95
- return undefined;
96
- }
97
- };
98
- /**
99
- * Build a substitution map from type parameter names to their instantiated TypeNodes.
37
+ * Get the declared return type from a call or new expression's signature.
38
+ *
39
+ * This function extracts the return type from the **signature declaration's TypeNode**,
40
+ * NOT from TypeScript's inferred type. This is critical for preserving CLR type aliases.
100
41
  *
101
- * For a call like `dict.add(key, value)` where `dict: Dictionary<int, Todo>`,
102
- * this returns a map: { "TKey" -> int TypeNode, "TValue" -> Todo TypeNode }
42
+ * For generic methods, type parameters are substituted using the receiver's type arguments.
43
+ * For example: `dict.get(key)` where `dict: Dictionary<int, Todo>` returns `Todo | undefined`,
44
+ * not `TValue | undefined`.
103
45
  *
104
- * The key insight is that the RECEIVER's type (Dictionary<int, Todo>) preserves
105
- * the type arguments as TypeNodes, which in turn preserve CLR type aliases.
106
- * TypeScript's type instantiation mechanism loses aliasSymbol, but TypeNodes don't.
46
+ * Returns undefined if:
47
+ * - No signature found
48
+ * - No declaration on signature
49
+ * - No return type annotation on declaration
107
50
  */
108
- const buildTypeParameterSubstitutionMap = (node, checker) => {
109
- // For method calls, get the receiver's type arguments
110
- // e.g., for dict.add(...), get Dictionary<int, Todo>'s type arguments
111
- if (ts.isCallExpression(node) &&
112
- ts.isPropertyAccessExpression(node.expression)) {
113
- const receiver = node.expression.expression;
114
- const receiverType = checker.getTypeAtLocation(receiver);
115
- // Get the class/interface/type alias declaration that defines the type parameters
116
- // For type aliases like Dictionary_2<TKey, TValue>, use aliasSymbol
117
- // For classes/interfaces, use getSymbol()
118
- const symbol = receiverType.aliasSymbol ?? receiverType.getSymbol();
119
- if (!symbol)
120
- return undefined;
121
- const declarations = symbol.getDeclarations();
122
- if (!declarations || declarations.length === 0)
123
- return undefined;
124
- // Find the class/interface/type alias declaration with type parameters
125
- let typeParamDecls;
126
- for (const decl of declarations) {
127
- if (ts.isClassDeclaration(decl) && decl.typeParameters) {
128
- typeParamDecls = decl.typeParameters;
129
- break;
130
- }
131
- if (ts.isInterfaceDeclaration(decl) && decl.typeParameters) {
132
- typeParamDecls = decl.typeParameters;
133
- break;
134
- }
135
- if (ts.isTypeAliasDeclaration(decl) && decl.typeParameters) {
136
- typeParamDecls = decl.typeParameters;
137
- break;
138
- }
139
- }
140
- if (!typeParamDecls || typeParamDecls.length === 0)
141
- return undefined;
142
- // Get the type arguments from the receiver's type
143
- // IMPORTANT: We must trace back to the ORIGINAL source code AST to preserve
144
- // CLR type aliases like `int`. TypeScript's typeToTypeNode() does NOT preserve
145
- // type aliases - it synthesizes primitive keywords like NumberKeyword instead.
146
- //
147
- // Look for the variable declaration that has type arguments in:
148
- // 1. Explicit type annotation: const dict: Dictionary<int, Todo> = ...
149
- // 2. NewExpression initializer: const dict = new Dictionary<int, Todo>()
150
- // 3. Other declaration forms (property, parameter)
151
- const receiverSymbol = checker.getSymbolAtLocation(receiver);
152
- if (receiverSymbol) {
153
- const receiverDecls = receiverSymbol.getDeclarations();
154
- if (receiverDecls) {
155
- for (const decl of receiverDecls) {
156
- // Helper to build substitution map from type argument nodes
157
- const buildMapFromTypeArgs = (typeArgNodes) => {
158
- if (typeParamDecls &&
159
- typeArgNodes.length === typeParamDecls.length) {
160
- const substitutionMap = new Map();
161
- for (let i = 0; i < typeParamDecls.length; i++) {
162
- const paramDecl = typeParamDecls[i];
163
- const argNode = typeArgNodes[i];
164
- if (paramDecl && argNode) {
165
- substitutionMap.set(paramDecl.name.text, argNode);
166
- }
167
- }
168
- return substitutionMap;
169
- }
170
- return undefined;
171
- };
172
- // Check explicit type annotation first
173
- if (ts.isVariableDeclaration(decl) && decl.type) {
174
- if (ts.isTypeReferenceNode(decl.type) && decl.type.typeArguments) {
175
- const result = buildMapFromTypeArgs(decl.type.typeArguments);
176
- if (result)
177
- return result;
178
- }
179
- }
180
- // Check initializer: new Dictionary<int, Todo>()
181
- // This handles: const todos = new Dictionary<int, Todo>();
182
- if (ts.isVariableDeclaration(decl) && decl.initializer) {
183
- // Handle direct NewExpression
184
- if (ts.isNewExpression(decl.initializer) &&
185
- decl.initializer.typeArguments) {
186
- const result = buildMapFromTypeArgs(decl.initializer.typeArguments);
187
- if (result)
188
- return result;
189
- }
190
- // Handle AsExpression (type assertion): new List<int>() as List<int>
191
- // The type arguments are in the AsExpression's type, not the NewExpression
192
- if (ts.isAsExpression(decl.initializer)) {
193
- const asType = decl.initializer.type;
194
- if (ts.isTypeReferenceNode(asType) && asType.typeArguments) {
195
- const result = buildMapFromTypeArgs(asType.typeArguments);
196
- if (result)
197
- return result;
198
- }
199
- }
200
- }
201
- // Also check property declarations with type annotation
202
- if (ts.isPropertyDeclaration(decl) &&
203
- decl.type &&
204
- ts.isTypeReferenceNode(decl.type) &&
205
- decl.type.typeArguments) {
206
- const result = buildMapFromTypeArgs(decl.type.typeArguments);
207
- if (result)
208
- return result;
209
- }
210
- // Check property declaration initializer
211
- if (ts.isPropertyDeclaration(decl) && decl.initializer) {
212
- if (ts.isNewExpression(decl.initializer) &&
213
- decl.initializer.typeArguments) {
214
- const result = buildMapFromTypeArgs(decl.initializer.typeArguments);
215
- if (result)
216
- return result;
217
- }
218
- }
219
- // Check parameter declarations
220
- if (ts.isParameter(decl) &&
221
- decl.type &&
222
- ts.isTypeReferenceNode(decl.type) &&
223
- decl.type.typeArguments) {
224
- const result = buildMapFromTypeArgs(decl.type.typeArguments);
225
- if (result)
226
- return result;
227
- }
228
- }
229
- }
230
- }
231
- }
232
- return undefined;
233
- };
51
+ // DELETED: getReturnTypeFromFunctionType - Was part of fallback path
52
+ // DELETED: getCalleesDeclaredType - Was part of fallback path
53
+ // Alice's spec: TypeSystem.resolveCall() is the single source of truth.
234
54
  /**
235
- * Substitute type parameters in a TypeNode using the substitution map.
236
- * For a type like `TKey`, returns the substituted TypeNode (e.g., `int`).
237
- * For complex types like `List<TKey>`, recursively substitutes.
238
- *
239
- * Returns the substituted TypeNode, or undefined if no substitution needed.
55
+ * Walk a property access chain and build a qualified name.
56
+ * For `Foo.Bar.Baz`, returns "Foo.Bar.Baz" by walking the AST identifiers.
57
+ * This avoids getText() which bakes source formatting into type identity.
240
58
  */
241
- const substituteTypeNode = (typeNode, substitutionMap, checker) => {
242
- // Handle type reference nodes (most common case)
243
- if (ts.isTypeReferenceNode(typeNode)) {
244
- const typeName = ts.isIdentifier(typeNode.typeName)
245
- ? typeNode.typeName.text
246
- : typeNode.typeName.getText();
247
- // Direct substitution: if this is a type parameter, substitute it
248
- const substitution = substitutionMap.get(typeName);
249
- if (substitution) {
250
- return substitution;
251
- }
252
- // Recursive substitution: if this is a generic type, substitute its type arguments
253
- if (typeNode.typeArguments && typeNode.typeArguments.length > 0) {
254
- let anySubstituted = false;
255
- const newTypeArgs = [];
256
- for (const arg of typeNode.typeArguments) {
257
- const substituted = substituteTypeNode(arg, substitutionMap, checker);
258
- if (substituted) {
259
- newTypeArgs.push(substituted);
260
- anySubstituted = true;
261
- }
262
- else {
263
- newTypeArgs.push(arg);
264
- }
265
- }
266
- if (anySubstituted) {
267
- // Create a new type reference with substituted type arguments
268
- // We use the factory to create a new node
269
- return ts.factory.createTypeReferenceNode(typeNode.typeName, newTypeArgs);
270
- }
271
- }
59
+ const buildQualifiedName = (expr) => {
60
+ if (ts.isIdentifier(expr)) {
61
+ return expr.text;
272
62
  }
273
- // Handle array types: T[] -> int[]
274
- if (ts.isArrayTypeNode(typeNode)) {
275
- const substituted = substituteTypeNode(typeNode.elementType, substitutionMap, checker);
276
- if (substituted) {
277
- return ts.factory.createArrayTypeNode(substituted);
63
+ if (ts.isPropertyAccessExpression(expr)) {
64
+ const parts = [];
65
+ let current = expr;
66
+ while (ts.isPropertyAccessExpression(current)) {
67
+ parts.unshift(current.name.text);
68
+ current = current.expression;
278
69
  }
279
- }
280
- // Handle union types: T | null -> int | null
281
- if (ts.isUnionTypeNode(typeNode)) {
282
- let anySubstituted = false;
283
- const newTypes = [];
284
- for (const member of typeNode.types) {
285
- const substituted = substituteTypeNode(member, substitutionMap, checker);
286
- if (substituted) {
287
- newTypes.push(substituted);
288
- anySubstituted = true;
289
- }
290
- else {
291
- newTypes.push(member);
292
- }
293
- }
294
- if (anySubstituted) {
295
- return ts.factory.createUnionTypeNode(newTypes);
70
+ if (ts.isIdentifier(current)) {
71
+ parts.unshift(current.text);
72
+ return parts.join(".");
296
73
  }
297
74
  }
298
75
  return undefined;
299
76
  };
77
+ // DELETED: getDeclaredReturnTypeFallback - Alice's spec: no fallbacks allowed
78
+ // TypeSystem.resolveCall() is the single source of truth.
79
+ // DELETED: normalizeReceiverToNominal - No longer needed without NominalEnv fallback
80
+ // DELETED: getDeclaredReturnTypeNominalEnvFallback - Alice's spec: no fallbacks allowed
81
+ // TypeSystem.resolveCall() is the single source of truth.
300
82
  /**
301
- * Extract parameter types from resolved signature.
302
- * Used for threading expectedType to array literal arguments etc.
303
- *
304
- * Uses the resolved signature to get INSTANTIATED parameter types.
305
- * For example, for `dict.add(key, value)` where `dict: Dictionary<int, Todo>`,
306
- * this returns the instantiated types [int, Todo], not the formal types [TKey, TValue].
307
- *
308
- * CLR type aliases (like `int`) are preserved by:
309
- * 1. For non-type-parameter declarations: use the declaration's type node directly
310
- * 2. For type parameters: use TypeNode substitution to preserve CLR aliases
83
+ * Get the declared return type from a call or new expression's signature.
311
84
  *
312
- * The key insight is that TypeScript's type instantiation mechanism loses
313
- * aliasSymbol, but the original TypeNodes in variable declarations preserve
314
- * the type aliases. We trace back to those TypeNodes and substitute.
85
+ * ALICE'S SPEC: Uses TypeSystem.resolveCall() EXCLUSIVELY.
86
+ * NO FALLBACKS. If TypeSystem can't resolve, return unknownType.
87
+ * This ensures any missing TypeSystem functionality surfaces as test failures.
315
88
  */
316
- const extractParameterTypes = (node, checker) => {
317
- try {
318
- const signature = checker.getResolvedSignature(node);
319
- if (!signature) {
320
- return undefined;
321
- }
322
- const sigParams = signature.getParameters();
323
- if (sigParams.length === 0) {
324
- return undefined;
325
- }
326
- // Build type parameter substitution map from receiver's type arguments
327
- // This preserves CLR type aliases through generic instantiation
328
- const substitutionMap = buildTypeParameterSubstitutionMap(node, checker);
329
- // Build parameter type array using instantiated types from signature
330
- const paramTypes = [];
331
- for (const sigParam of sigParams) {
332
- const decl = sigParam.valueDeclaration;
333
- // Get the declaration's type node if available
334
- if (decl && ts.isParameter(decl) && decl.type) {
335
- // Check if the declaration type is a type parameter
336
- const declType = checker.getTypeAtLocation(decl.type);
337
- const isTypeParameter = Boolean(declType.flags & ts.TypeFlags.TypeParameter);
338
- if (isTypeParameter) {
339
- if (substitutionMap) {
340
- // Type parameter case: use substitution map to preserve CLR aliases
341
- const substituted = substituteTypeNode(decl.type, substitutionMap, checker);
342
- if (substituted) {
343
- const irType = convertType(substituted, checker);
344
- if (irType) {
345
- paramTypes.push(irType);
346
- continue;
347
- }
348
- }
349
- }
350
- // Type parameter without substitution (e.g., generic function call with inferred types)
351
- // The type parameter is INFERRED from the argument, so don't validate against
352
- // TypeScript's instantiated type (which loses CLR type aliases like `int`).
353
- // Push undefined to skip validation for this parameter.
354
- paramTypes.push(undefined);
355
- continue;
356
- }
357
- else {
358
- // Non-type-parameter: use declaration type node directly
359
- // This preserves imported CLR type aliases like `int`
360
- const irType = convertType(decl.type, checker);
361
- if (irType) {
362
- paramTypes.push(irType);
363
- continue;
364
- }
365
- }
89
+ export const getDeclaredReturnType = (node, ctx, receiverIrType) => {
90
+ const DEBUG = process.env.DEBUG_RETURN_TYPE === "1";
91
+ const methodName = ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)
92
+ ? node.expression.name.text
93
+ : undefined;
94
+ if (DEBUG && methodName) {
95
+ console.log("[getDeclaredReturnType]", methodName, "receiver:", receiverIrType);
96
+ }
97
+ // Handle new expressions specially - they construct the type from the expression
98
+ if (ts.isNewExpression(node)) {
99
+ // For new expressions with explicit type arguments
100
+ if (node.typeArguments && node.typeArguments.length > 0) {
101
+ const typeName = buildQualifiedName(node.expression);
102
+ if (typeName) {
103
+ // PHASE 4 (Alice's spec): Use captureTypeSyntax + typeFromSyntax
104
+ const typeSystem = ctx.typeSystem;
105
+ return {
106
+ kind: "referenceType",
107
+ name: typeName,
108
+ typeArguments: node.typeArguments.map((ta) => typeSystem.typeFromSyntax(ctx.binding.captureTypeSyntax(ta))),
109
+ };
366
110
  }
367
- // Fallback: Use instantiated type from getTypeOfSymbolAtLocation
368
- // This handles cases where we couldn't get the declaration type
369
- const paramType = checker.getTypeOfSymbolAtLocation(sigParam, decl ?? node);
370
- const irType = convertTsTypeToIr(paramType, checker);
371
- paramTypes.push(irType);
372
111
  }
373
- return paramTypes;
112
+ // For constructors without type arguments, use the class name
113
+ const typeName = buildQualifiedName(node.expression);
114
+ if (typeName) {
115
+ return { kind: "referenceType", name: typeName };
116
+ }
117
+ return undefined;
374
118
  }
375
- catch {
119
+ // For call expressions, use TypeSystem.resolveCall() EXCLUSIVELY
120
+ const typeSystem = ctx.typeSystem;
121
+ const sigId = ctx.binding.resolveCallSignature(node);
122
+ if (!sigId) {
123
+ if (DEBUG && methodName)
124
+ console.log("[getDeclaredReturnType]", methodName, "No signature resolved");
376
125
  return undefined;
377
126
  }
127
+ // Get argument count for totality
128
+ const argumentCount = node.arguments.length;
129
+ // Extract explicit type arguments from call site if any
130
+ // PHASE 4 (Alice's spec): Use captureTypeSyntax + typeFromSyntax
131
+ const explicitTypeArgs = node.typeArguments
132
+ ? node.typeArguments.map((ta) => typeSystem.typeFromSyntax(ctx.binding.captureTypeSyntax(ta)))
133
+ : undefined;
134
+ // Use TypeSystem.resolveCall() - guaranteed to return a result
135
+ // NO FALLBACK: If TypeSystem returns unknownType, that's the answer
136
+ const resolved = typeSystem.resolveCall({
137
+ sigId,
138
+ argumentCount,
139
+ receiverType: receiverIrType,
140
+ explicitTypeArgs,
141
+ });
142
+ if (DEBUG && methodName) {
143
+ console.log("[getDeclaredReturnType]", methodName, "TypeSystem returned:", resolved.returnType);
144
+ }
145
+ // Return TypeSystem's answer directly - no fallbacks
146
+ return resolved.returnType;
378
147
  };
379
148
  /**
380
149
  * Extract argument passing modes from member binding's parameter modifiers.
@@ -404,33 +173,216 @@ const extractArgumentPassingFromBinding = (callee, argCount) => {
404
173
  /**
405
174
  * Convert call expression
406
175
  */
407
- export const convertCallExpression = (node, checker) => {
176
+ export const convertCallExpression = (node, ctx) => {
177
+ // Check for trycast<T>(x) - special intrinsic for safe casting
178
+ // trycast<T>(x) compiles to C#: x as T (safe cast, returns null on failure)
179
+ if (ts.isIdentifier(node.expression) &&
180
+ node.expression.text === "trycast" &&
181
+ node.typeArguments &&
182
+ node.typeArguments.length === 1 &&
183
+ node.arguments.length === 1) {
184
+ // We've verified length === 1 above, so these are guaranteed to exist
185
+ const targetTypeNode = node.typeArguments[0];
186
+ const argNode = node.arguments[0];
187
+ if (!targetTypeNode || !argNode) {
188
+ throw new Error("ICE: trycast requires exactly 1 type argument and 1 argument");
189
+ }
190
+ // PHASE 4 (Alice's spec): Use captureTypeSyntax + typeFromSyntax
191
+ const typeSystem = ctx.typeSystem;
192
+ const targetType = typeSystem.typeFromSyntax(ctx.binding.captureTypeSyntax(targetTypeNode));
193
+ const argExpr = convertExpression(argNode, ctx, undefined);
194
+ // Build union type T | null for inferredType
195
+ const nullType = { kind: "primitiveType", name: "null" };
196
+ const unionType = {
197
+ kind: "unionType",
198
+ types: [targetType, nullType],
199
+ };
200
+ return {
201
+ kind: "trycast",
202
+ expression: argExpr,
203
+ targetType,
204
+ inferredType: unionType,
205
+ sourceSpan: getSourceSpan(node),
206
+ };
207
+ }
208
+ // Check for stackalloc<T>(size) - language intrinsic for stack allocation.
209
+ // stackalloc<T>(size) compiles to C#: stackalloc T[size]
210
+ if (ts.isIdentifier(node.expression) &&
211
+ node.expression.text === "stackalloc" &&
212
+ node.typeArguments &&
213
+ node.typeArguments.length === 1 &&
214
+ node.arguments.length === 1) {
215
+ const elementTypeNode = node.typeArguments[0];
216
+ const sizeNode = node.arguments[0];
217
+ if (!elementTypeNode || !sizeNode) {
218
+ throw new Error("ICE: stackalloc requires exactly 1 type argument and 1 argument");
219
+ }
220
+ const typeSystem = ctx.typeSystem;
221
+ const elementType = typeSystem.typeFromSyntax(ctx.binding.captureTypeSyntax(elementTypeNode));
222
+ const sizeExpr = convertExpression(sizeNode, ctx, {
223
+ kind: "primitiveType",
224
+ name: "int",
225
+ });
226
+ return {
227
+ kind: "stackalloc",
228
+ elementType,
229
+ size: sizeExpr,
230
+ inferredType: {
231
+ kind: "referenceType",
232
+ name: "Span",
233
+ typeArguments: [elementType],
234
+ },
235
+ sourceSpan: getSourceSpan(node),
236
+ };
237
+ }
408
238
  // Extract type arguments from the call signature
409
- const typeArguments = extractTypeArguments(node, checker);
410
- const requiresSpecialization = checkIfRequiresSpecialization(node, checker);
411
- const narrowing = extractNarrowing(node, checker);
412
- const parameterTypes = extractParameterTypes(node, checker);
413
- // Convert callee first so we can access its memberBinding
414
- const callee = convertExpression(node.expression, checker);
239
+ const typeArguments = extractTypeArguments(node, ctx);
240
+ const requiresSpecialization = checkIfRequiresSpecialization(node, ctx);
241
+ // Convert callee first so we can access memberBinding and receiver type
242
+ const callee = convertExpression(node.expression, ctx, undefined);
243
+ // Extract receiver type for member method calls (e.g., dict.get() → dict's type)
244
+ const receiverIrType = callee.kind === "memberAccess" ? callee.object.inferredType : undefined;
245
+ // Resolve call (two-pass):
246
+ // 1) Resolve parameter types (for expectedType threading)
247
+ // 2) Convert arguments, then re-resolve with argTypes to infer generics deterministically
248
+ const typeSystem = ctx.typeSystem;
249
+ const sigId = ctx.binding.resolveCallSignature(node);
250
+ const argumentCount = node.arguments.length;
251
+ const explicitTypeArgs = node.typeArguments
252
+ ? node.typeArguments.map((ta) => typeSystem.typeFromSyntax(ctx.binding.captureTypeSyntax(ta)))
253
+ : undefined;
254
+ const initialResolved = sigId
255
+ ? typeSystem.resolveCall({
256
+ sigId,
257
+ argumentCount,
258
+ receiverType: receiverIrType,
259
+ explicitTypeArgs,
260
+ })
261
+ : undefined;
262
+ const initialParameterTypes = initialResolved?.parameterTypes;
415
263
  // Try to get argument passing from binding's parameter modifiers first (tsbindgen format),
416
264
  // then fall back to TypeScript declaration analysis (ref<T>/out<T>/in<T> wrapper types)
417
- const argumentPassing = extractArgumentPassingFromBinding(callee, node.arguments.length) ??
418
- extractArgumentPassing(node, checker);
265
+ const argumentPassingFromBinding = extractArgumentPassingFromBinding(callee, node.arguments.length);
266
+ const isLambdaArg = (expr) => {
267
+ if (ts.isArrowFunction(expr) || ts.isFunctionExpression(expr))
268
+ return true;
269
+ if (ts.isParenthesizedExpression(expr))
270
+ return isLambdaArg(expr.expression);
271
+ return false;
272
+ };
273
+ const isExplicitlyTypedLambdaArg = (expr) => {
274
+ if (ts.isParenthesizedExpression(expr)) {
275
+ return isExplicitlyTypedLambdaArg(expr.expression);
276
+ }
277
+ if (!ts.isArrowFunction(expr) && !ts.isFunctionExpression(expr)) {
278
+ return false;
279
+ }
280
+ if (expr.type)
281
+ return true;
282
+ if (expr.typeParameters && expr.typeParameters.length > 0)
283
+ return true;
284
+ return expr.parameters.some((p) => p.type !== undefined);
285
+ };
286
+ const shouldDeferLambdaForInference = (expr) => isLambdaArg(expr) && !isExplicitlyTypedLambdaArg(expr);
287
+ // Pass 1: convert non-lambda arguments and infer type args from them.
288
+ const argsWorking = new Array(node.arguments.length);
289
+ const argTypesForInference = Array(node.arguments.length).fill(undefined);
290
+ for (let index = 0; index < node.arguments.length; index++) {
291
+ const arg = node.arguments[index];
292
+ if (!arg)
293
+ continue;
294
+ const expectedType = initialParameterTypes?.[index];
295
+ if (ts.isSpreadElement(arg)) {
296
+ const spreadExpr = convertExpression(arg.expression, ctx, undefined);
297
+ argsWorking[index] = {
298
+ kind: "spread",
299
+ expression: spreadExpr,
300
+ inferredType: spreadExpr.inferredType,
301
+ sourceSpan: getSourceSpan(arg),
302
+ };
303
+ continue;
304
+ }
305
+ if (shouldDeferLambdaForInference(arg)) {
306
+ // Defer *untyped* lambda conversion until after we infer generic type args
307
+ // from other arguments. Explicitly typed lambdas are safe to convert early
308
+ // and often provide the only deterministic inference signal.
309
+ continue;
310
+ }
311
+ const converted = convertExpression(arg, ctx, expectedType);
312
+ argsWorking[index] = converted;
313
+ argTypesForInference[index] = converted.inferredType;
314
+ }
315
+ const lambdaContextResolved = sigId
316
+ ? typeSystem.resolveCall({
317
+ sigId,
318
+ argumentCount,
319
+ receiverType: receiverIrType,
320
+ explicitTypeArgs,
321
+ argTypes: argTypesForInference,
322
+ })
323
+ : initialResolved;
324
+ const parameterTypesForLambdaContext = lambdaContextResolved?.parameterTypes ?? initialParameterTypes;
325
+ // Pass 2: convert lambda arguments with inferred parameter types in scope.
326
+ for (let index = 0; index < node.arguments.length; index++) {
327
+ if (argsWorking[index])
328
+ continue;
329
+ const arg = node.arguments[index];
330
+ if (!arg)
331
+ continue;
332
+ if (ts.isSpreadElement(arg))
333
+ continue;
334
+ if (!isLambdaArg(arg))
335
+ continue;
336
+ const expectedType = parameterTypesForLambdaContext?.[index];
337
+ const lambdaExpectedType = expectedType?.kind === "functionType"
338
+ ? expectedType
339
+ : expectedType
340
+ ? typeSystem.delegateToFunctionType(expectedType) ?? expectedType
341
+ : undefined;
342
+ argsWorking[index] = convertExpression(arg, ctx, lambdaExpectedType);
343
+ }
344
+ const convertedArgs = argsWorking.map((a) => {
345
+ if (!a) {
346
+ throw new Error("ICE: call argument conversion produced a hole");
347
+ }
348
+ return a;
349
+ });
350
+ const argTypes = convertedArgs.map((a) => a.kind === "spread" ? undefined : a.inferredType);
351
+ const finalResolved = sigId
352
+ ? typeSystem.resolveCall({
353
+ sigId,
354
+ argumentCount,
355
+ receiverType: receiverIrType,
356
+ explicitTypeArgs,
357
+ argTypes,
358
+ })
359
+ : lambdaContextResolved;
360
+ const parameterTypes = finalResolved?.parameterTypes ?? initialParameterTypes;
361
+ const inferredType = finalResolved?.returnType ?? { kind: "unknownType" };
362
+ const argumentPassing = argumentPassingFromBinding ??
363
+ (finalResolved
364
+ ? finalResolved.parameterModes.slice(0, node.arguments.length)
365
+ : extractArgumentPassing(node, ctx));
366
+ const narrowing = (() => {
367
+ const pred = finalResolved?.typePredicate;
368
+ if (!pred)
369
+ return undefined;
370
+ if (pred.kind !== "param")
371
+ return undefined;
372
+ return {
373
+ kind: "typePredicate",
374
+ argIndex: pred.parameterIndex,
375
+ targetType: pred.targetType,
376
+ };
377
+ })();
419
378
  return {
420
379
  kind: "call",
421
380
  callee,
422
- arguments: node.arguments.map((arg) => {
423
- if (ts.isSpreadElement(arg)) {
424
- return {
425
- kind: "spread",
426
- expression: convertExpression(arg.expression, checker),
427
- sourceSpan: getSourceSpan(arg),
428
- };
429
- }
430
- return convertExpression(arg, checker);
431
- }),
381
+ // Pass parameter types as expectedType for deterministic contextual typing
382
+ // This ensures `spreadArray([1,2,3], [4,5,6])` with `number[]` params produces `double[]`
383
+ arguments: convertedArgs,
432
384
  isOptional: node.questionDotToken !== undefined,
433
- inferredType: getInferredType(node, checker),
385
+ inferredType,
434
386
  sourceSpan: getSourceSpan(node),
435
387
  typeArguments,
436
388
  requiresSpecialization,
@@ -439,29 +391,142 @@ export const convertCallExpression = (node, checker) => {
439
391
  narrowing,
440
392
  };
441
393
  };
394
+ // DELETED: getConstructedType - Phase 15 uses resolveCall.returnType instead
442
395
  /**
443
396
  * Convert new expression
397
+ *
398
+ * Phase 15 (Alice's spec): Two-pass resolution for deterministic constructor typing.
399
+ * 1) Resolve once (without argTypes) to get parameter types for expected-type threading.
400
+ * 2) Convert non-lambda arguments first, collecting argTypes for inference.
401
+ * 3) Re-resolve with argTypes to infer constructor type parameters.
402
+ * 4) Convert lambda arguments using instantiated parameter types.
403
+ * 5) Final resolve with full argTypes.
404
+ * 6) inferredType MUST be finalResolved.returnType.
444
405
  */
445
- export const convertNewExpression = (node, checker) => {
446
- // Extract type arguments from the constructor signature
447
- const typeArguments = extractTypeArguments(node, checker);
448
- const requiresSpecialization = checkIfRequiresSpecialization(node, checker);
406
+ export const convertNewExpression = (node, ctx) => {
407
+ // Extract explicit type arguments (for IR output, not inference)
408
+ const typeArguments = extractTypeArguments(node, ctx);
409
+ const requiresSpecialization = checkIfRequiresSpecialization(node, ctx);
410
+ // Convert callee (the constructor expression)
411
+ const callee = convertExpression(node.expression, ctx, undefined);
412
+ // Two-pass resolution (matching convertCallExpression pattern)
413
+ const typeSystem = ctx.typeSystem;
414
+ const sigId = ctx.binding.resolveConstructorSignature(node);
415
+ const argumentCount = node.arguments?.length ?? 0;
416
+ // Extract explicit type arguments from call site
417
+ const explicitTypeArgs = node.typeArguments
418
+ ? node.typeArguments.map((ta) => typeSystem.typeFromSyntax(ctx.binding.captureTypeSyntax(ta)))
419
+ : undefined;
420
+ // Initial resolution (without argTypes) for parameter type threading
421
+ const initialResolved = sigId
422
+ ? typeSystem.resolveCall({
423
+ sigId,
424
+ argumentCount,
425
+ explicitTypeArgs,
426
+ })
427
+ : undefined;
428
+ const initialParameterTypes = initialResolved?.parameterTypes;
429
+ const isLambdaArg = (expr) => {
430
+ if (ts.isArrowFunction(expr) || ts.isFunctionExpression(expr))
431
+ return true;
432
+ if (ts.isParenthesizedExpression(expr))
433
+ return isLambdaArg(expr.expression);
434
+ return false;
435
+ };
436
+ // Pass 1: convert non-lambda arguments and collect argTypes for inference
437
+ const argsWorking = new Array(argumentCount);
438
+ const argTypesForInference = Array(argumentCount).fill(undefined);
439
+ const args = node.arguments ?? [];
440
+ for (let index = 0; index < args.length; index++) {
441
+ const arg = args[index];
442
+ if (!arg)
443
+ continue;
444
+ const expectedType = initialParameterTypes?.[index];
445
+ if (ts.isSpreadElement(arg)) {
446
+ const spreadExpr = convertExpression(arg.expression, ctx, undefined);
447
+ argsWorking[index] = {
448
+ kind: "spread",
449
+ expression: spreadExpr,
450
+ inferredType: spreadExpr.inferredType,
451
+ sourceSpan: getSourceSpan(arg),
452
+ };
453
+ continue;
454
+ }
455
+ if (isLambdaArg(arg)) {
456
+ // Defer lambda conversion until after generic type arg inference
457
+ continue;
458
+ }
459
+ const converted = convertExpression(arg, ctx, expectedType);
460
+ argsWorking[index] = converted;
461
+ argTypesForInference[index] = converted.inferredType;
462
+ }
463
+ // Re-resolve with argTypes to infer constructor type parameters
464
+ const lambdaContextResolved = sigId
465
+ ? typeSystem.resolveCall({
466
+ sigId,
467
+ argumentCount,
468
+ explicitTypeArgs,
469
+ argTypes: argTypesForInference,
470
+ })
471
+ : initialResolved;
472
+ const parameterTypesForLambdaContext = lambdaContextResolved?.parameterTypes ?? initialParameterTypes;
473
+ // Pass 2: convert lambda arguments with inferred parameter types
474
+ for (let index = 0; index < args.length; index++) {
475
+ if (argsWorking[index])
476
+ continue;
477
+ const arg = args[index];
478
+ if (!arg)
479
+ continue;
480
+ if (ts.isSpreadElement(arg))
481
+ continue;
482
+ if (!isLambdaArg(arg))
483
+ continue;
484
+ const expectedType = parameterTypesForLambdaContext?.[index];
485
+ const lambdaExpectedType = expectedType?.kind === "functionType"
486
+ ? expectedType
487
+ : expectedType
488
+ ? typeSystem.delegateToFunctionType(expectedType) ?? expectedType
489
+ : undefined;
490
+ argsWorking[index] = convertExpression(arg, ctx, lambdaExpectedType);
491
+ }
492
+ // Fill any remaining undefined slots (shouldn't happen, but be safe)
493
+ const convertedArgs = argsWorking.map((a, index) => {
494
+ if (a)
495
+ return a;
496
+ const arg = args[index];
497
+ if (!arg) {
498
+ throw new Error("ICE: new expression argument conversion produced a hole");
499
+ }
500
+ return convertExpression(arg, ctx, undefined);
501
+ });
502
+ // Collect final argTypes
503
+ const argTypes = convertedArgs.map((a) => a.kind === "spread" ? undefined : a.inferredType);
504
+ // Final resolution with full argTypes
505
+ const finalResolved = sigId
506
+ ? typeSystem.resolveCall({
507
+ sigId,
508
+ argumentCount,
509
+ explicitTypeArgs,
510
+ argTypes,
511
+ })
512
+ : lambdaContextResolved;
513
+ // Phase 15: inferredType MUST be finalResolved.returnType
514
+ // If sigId is missing, use unknownType (do not fabricate a nominal type)
515
+ const inferredType = finalResolved?.returnType ?? { kind: "unknownType" };
516
+ // Phase 18: IrNewExpression.typeArguments must include inferred type arguments.
517
+ // The emitter relies on this field to emit generic constructor calls (e.g., new Box<int>(...)).
518
+ const inferredTypeArguments = inferredType.kind === "referenceType" ? inferredType.typeArguments : undefined;
519
+ const typeArgumentsForIr = typeArguments ??
520
+ (inferredTypeArguments && inferredTypeArguments.length > 0
521
+ ? inferredTypeArguments
522
+ : undefined);
449
523
  return {
450
524
  kind: "new",
451
- callee: convertExpression(node.expression, checker),
452
- arguments: node.arguments?.map((arg) => {
453
- if (ts.isSpreadElement(arg)) {
454
- return {
455
- kind: "spread",
456
- expression: convertExpression(arg.expression, checker),
457
- sourceSpan: getSourceSpan(arg),
458
- };
459
- }
460
- return convertExpression(arg, checker);
461
- }) ?? [],
462
- inferredType: getInferredType(node, checker),
525
+ callee,
526
+ arguments: convertedArgs,
527
+ inferredType,
463
528
  sourceSpan: getSourceSpan(node),
464
- typeArguments,
529
+ typeArguments: typeArgumentsForIr,
465
530
  requiresSpecialization,
466
531
  };
467
532
  };