@tsonic/frontend 0.0.14 → 0.0.16

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 (507) 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 +3 -2
  8. package/dist/graph/extraction/orchestrator.js.map +1 -1
  9. package/dist/ir/binding/index.d.ts +155 -0
  10. package/dist/ir/binding/index.d.ts.map +1 -0
  11. package/dist/ir/binding/index.js +1035 -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/bindings-disambiguation.test.d.ts +11 -0
  16. package/dist/ir/bindings-disambiguation.test.d.ts.map +1 -0
  17. package/dist/ir/bindings-disambiguation.test.js +416 -0
  18. package/dist/ir/bindings-disambiguation.test.js.map +1 -0
  19. package/dist/ir/builder/exports.d.ts +20 -2
  20. package/dist/ir/builder/exports.d.ts.map +1 -1
  21. package/dist/ir/builder/exports.js +65 -6
  22. package/dist/ir/builder/exports.js.map +1 -1
  23. package/dist/ir/builder/imports.d.ts +9 -5
  24. package/dist/ir/builder/imports.d.ts.map +1 -1
  25. package/dist/ir/builder/imports.js +20 -31
  26. package/dist/ir/builder/imports.js.map +1 -1
  27. package/dist/ir/builder/orchestrator.d.ts +10 -1
  28. package/dist/ir/builder/orchestrator.d.ts.map +1 -1
  29. package/dist/ir/builder/orchestrator.js +32 -15
  30. package/dist/ir/builder/orchestrator.js.map +1 -1
  31. package/dist/ir/builder/statements.d.ts +7 -1
  32. package/dist/ir/builder/statements.d.ts.map +1 -1
  33. package/dist/ir/builder/statements.js +7 -2
  34. package/dist/ir/builder/statements.js.map +1 -1
  35. package/dist/ir/builder/types.d.ts +2 -0
  36. package/dist/ir/builder/types.d.ts.map +1 -1
  37. package/dist/ir/builder/validation.d.ts +4 -1
  38. package/dist/ir/builder/validation.d.ts.map +1 -1
  39. package/dist/ir/builder/validation.js +37 -37
  40. package/dist/ir/builder/validation.js.map +1 -1
  41. package/dist/ir/builder.test.js +55 -112
  42. package/dist/ir/builder.test.js.map +1 -1
  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 +25 -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 +389 -43
  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 +674 -397
  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 +158 -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 +183 -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/flow-narrowing.d.ts +27 -0
  92. package/dist/ir/converters/flow-narrowing.d.ts.map +1 -0
  93. package/dist/ir/converters/flow-narrowing.js +73 -0
  94. package/dist/ir/converters/flow-narrowing.js.map +1 -0
  95. package/dist/ir/converters/statements/control/blocks.d.ts +8 -2
  96. package/dist/ir/converters/statements/control/blocks.d.ts.map +1 -1
  97. package/dist/ir/converters/statements/control/blocks.js +7 -2
  98. package/dist/ir/converters/statements/control/blocks.js.map +1 -1
  99. package/dist/ir/converters/statements/control/conditionals.d.ts +14 -4
  100. package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
  101. package/dist/ir/converters/statements/control/conditionals.js +36 -10
  102. package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
  103. package/dist/ir/converters/statements/control/exceptions.d.ts +10 -3
  104. package/dist/ir/converters/statements/control/exceptions.d.ts.map +1 -1
  105. package/dist/ir/converters/statements/control/exceptions.js +13 -7
  106. package/dist/ir/converters/statements/control/exceptions.js.map +1 -1
  107. package/dist/ir/converters/statements/control/loops.d.ts +16 -5
  108. package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
  109. package/dist/ir/converters/statements/control/loops.js +25 -15
  110. package/dist/ir/converters/statements/control/loops.js.map +1 -1
  111. package/dist/ir/converters/statements/declarations/classes/constructors.d.ts +3 -2
  112. package/dist/ir/converters/statements/declarations/classes/constructors.d.ts.map +1 -1
  113. package/dist/ir/converters/statements/declarations/classes/constructors.js +11 -7
  114. package/dist/ir/converters/statements/declarations/classes/constructors.js.map +1 -1
  115. package/dist/ir/converters/statements/declarations/classes/methods.d.ts +2 -1
  116. package/dist/ir/converters/statements/declarations/classes/methods.d.ts.map +1 -1
  117. package/dist/ir/converters/statements/declarations/classes/methods.js +63 -11
  118. package/dist/ir/converters/statements/declarations/classes/methods.js.map +1 -1
  119. package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts +2 -1
  120. package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts.map +1 -1
  121. package/dist/ir/converters/statements/declarations/classes/orchestrator.js +60 -40
  122. package/dist/ir/converters/statements/declarations/classes/orchestrator.js.map +1 -1
  123. package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts +6 -2
  124. package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts.map +1 -1
  125. package/dist/ir/converters/statements/declarations/classes/override-detection.js +49 -50
  126. package/dist/ir/converters/statements/declarations/classes/override-detection.js.map +1 -1
  127. package/dist/ir/converters/statements/declarations/classes/properties.d.ts +9 -1
  128. package/dist/ir/converters/statements/declarations/classes/properties.d.ts.map +1 -1
  129. package/dist/ir/converters/statements/declarations/classes/properties.js +119 -16
  130. package/dist/ir/converters/statements/declarations/classes/properties.js.map +1 -1
  131. package/dist/ir/converters/statements/declarations/enums.d.ts +2 -1
  132. package/dist/ir/converters/statements/declarations/enums.d.ts.map +1 -1
  133. package/dist/ir/converters/statements/declarations/enums.js +8 -2
  134. package/dist/ir/converters/statements/declarations/enums.js.map +1 -1
  135. package/dist/ir/converters/statements/declarations/functions.d.ts +2 -1
  136. package/dist/ir/converters/statements/declarations/functions.d.ts.map +1 -1
  137. package/dist/ir/converters/statements/declarations/functions.js +11 -6
  138. package/dist/ir/converters/statements/declarations/functions.js.map +1 -1
  139. package/dist/ir/converters/statements/declarations/index.d.ts +3 -1
  140. package/dist/ir/converters/statements/declarations/index.d.ts.map +1 -1
  141. package/dist/ir/converters/statements/declarations/index.js +3 -1
  142. package/dist/ir/converters/statements/declarations/index.js.map +1 -1
  143. package/dist/ir/converters/statements/declarations/interfaces.d.ts +3 -2
  144. package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
  145. package/dist/ir/converters/statements/declarations/interfaces.js +26 -20
  146. package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
  147. package/dist/ir/converters/statements/declarations/registry.d.ts +72 -0
  148. package/dist/ir/converters/statements/declarations/registry.d.ts.map +1 -1
  149. package/dist/ir/converters/statements/declarations/registry.js +92 -0
  150. package/dist/ir/converters/statements/declarations/registry.js.map +1 -1
  151. package/dist/ir/converters/statements/declarations/type-aliases.d.ts +2 -1
  152. package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
  153. package/dist/ir/converters/statements/declarations/type-aliases.js +6 -4
  154. package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
  155. package/dist/ir/converters/statements/declarations/variables.d.ts +11 -1
  156. package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
  157. package/dist/ir/converters/statements/declarations/variables.js +123 -19
  158. package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
  159. package/dist/ir/converters/statements/declarations.d.ts +4 -1
  160. package/dist/ir/converters/statements/declarations.d.ts.map +1 -1
  161. package/dist/ir/converters/statements/declarations.js +4 -1
  162. package/dist/ir/converters/statements/declarations.js.map +1 -1
  163. package/dist/ir/converters/statements/helpers.d.ts +4 -3
  164. package/dist/ir/converters/statements/helpers.d.ts.map +1 -1
  165. package/dist/ir/converters/statements/helpers.js +55 -31
  166. package/dist/ir/converters/statements/helpers.js.map +1 -1
  167. package/dist/ir/converters/statements/index.d.ts +1 -1
  168. package/dist/ir/converters/statements/index.d.ts.map +1 -1
  169. package/dist/ir/converters/statements/index.js +2 -1
  170. package/dist/ir/converters/statements/index.js.map +1 -1
  171. package/dist/ir/expression-converter.d.ts +10 -3
  172. package/dist/ir/expression-converter.d.ts.map +1 -1
  173. package/dist/ir/expression-converter.js +139 -57
  174. package/dist/ir/expression-converter.js.map +1 -1
  175. package/dist/ir/hierarchical-bindings-e2e.test.js +10 -6
  176. package/dist/ir/hierarchical-bindings-e2e.test.js.map +1 -1
  177. package/dist/ir/index.d.ts +5 -0
  178. package/dist/ir/index.d.ts.map +1 -1
  179. package/dist/ir/index.js +5 -0
  180. package/dist/ir/index.js.map +1 -1
  181. package/dist/ir/no-ts-type-inference.test.d.ts +17 -0
  182. package/dist/ir/no-ts-type-inference.test.d.ts.map +1 -0
  183. package/dist/ir/no-ts-type-inference.test.js +171 -0
  184. package/dist/ir/no-ts-type-inference.test.js.map +1 -0
  185. package/dist/ir/program-context.d.ts +87 -0
  186. package/dist/ir/program-context.d.ts.map +1 -0
  187. package/dist/ir/program-context.js +289 -0
  188. package/dist/ir/program-context.js.map +1 -0
  189. package/dist/ir/statement-converter.d.ts +14 -4
  190. package/dist/ir/statement-converter.d.ts.map +1 -1
  191. package/dist/ir/statement-converter.js +31 -21
  192. package/dist/ir/statement-converter.js.map +1 -1
  193. package/dist/ir/syntax/binding-patterns.d.ts +22 -0
  194. package/dist/ir/syntax/binding-patterns.d.ts.map +1 -0
  195. package/dist/ir/{type-converter/patterns.js → syntax/binding-patterns.js} +34 -8
  196. package/dist/ir/syntax/binding-patterns.js.map +1 -0
  197. package/dist/ir/thisarg-inference.test.d.ts +8 -0
  198. package/dist/ir/thisarg-inference.test.d.ts.map +1 -0
  199. package/dist/ir/thisarg-inference.test.js +94 -0
  200. package/dist/ir/thisarg-inference.test.js.map +1 -0
  201. package/dist/ir/type-system/index.d.ts +21 -0
  202. package/dist/ir/type-system/index.d.ts.map +1 -0
  203. package/dist/ir/type-system/index.js +43 -0
  204. package/dist/ir/type-system/index.js.map +1 -0
  205. package/dist/ir/type-system/internal/handle-types.d.ts +105 -0
  206. package/dist/ir/type-system/internal/handle-types.d.ts.map +1 -0
  207. package/dist/ir/type-system/internal/handle-types.js +13 -0
  208. package/dist/ir/type-system/internal/handle-types.js.map +1 -0
  209. package/dist/ir/type-system/internal/nominal-env.d.ts +66 -0
  210. package/dist/ir/type-system/internal/nominal-env.d.ts.map +1 -0
  211. package/dist/ir/type-system/internal/nominal-env.js +301 -0
  212. package/dist/ir/type-system/internal/nominal-env.js.map +1 -0
  213. package/dist/ir/type-system/internal/type-converter/arrays.d.ts +11 -0
  214. package/dist/ir/type-system/internal/type-converter/arrays.d.ts.map +1 -0
  215. package/dist/ir/{type-converter → type-system/internal/type-converter}/arrays.js +2 -2
  216. package/dist/ir/type-system/internal/type-converter/arrays.js.map +1 -0
  217. package/dist/ir/type-system/internal/type-converter/converter.d.ts +17 -0
  218. package/dist/ir/type-system/internal/type-converter/converter.d.ts.map +1 -0
  219. package/dist/ir/type-system/internal/type-converter/converter.js +16 -0
  220. package/dist/ir/type-system/internal/type-converter/converter.js.map +1 -0
  221. package/dist/ir/type-system/internal/type-converter/functions.d.ts +14 -0
  222. package/dist/ir/type-system/internal/type-converter/functions.d.ts.map +1 -0
  223. package/dist/ir/type-system/internal/type-converter/functions.js +66 -0
  224. package/dist/ir/type-system/internal/type-converter/functions.js.map +1 -0
  225. package/dist/ir/type-system/internal/type-converter/index.d.ts +11 -0
  226. package/dist/ir/type-system/internal/type-converter/index.d.ts.map +1 -0
  227. package/dist/ir/type-system/internal/type-converter/index.js +11 -0
  228. package/dist/ir/type-system/internal/type-converter/index.js.map +1 -0
  229. package/dist/ir/type-system/internal/type-converter/inference.d.ts +37 -0
  230. package/dist/ir/type-system/internal/type-converter/inference.d.ts.map +1 -0
  231. package/dist/ir/type-system/internal/type-converter/inference.js +32 -0
  232. package/dist/ir/type-system/internal/type-converter/inference.js.map +1 -0
  233. package/dist/ir/{type-converter → type-system/internal/type-converter}/literals.d.ts +1 -1
  234. package/dist/ir/type-system/internal/type-converter/literals.d.ts.map +1 -0
  235. package/dist/ir/type-system/internal/type-converter/literals.js.map +1 -0
  236. package/dist/ir/type-system/internal/type-converter/objects.d.ts +20 -0
  237. package/dist/ir/type-system/internal/type-converter/objects.d.ts.map +1 -0
  238. package/dist/ir/{type-converter → type-system/internal/type-converter}/objects.js +56 -6
  239. package/dist/ir/type-system/internal/type-converter/objects.js.map +1 -0
  240. package/dist/ir/{type-converter → type-system/internal/type-converter}/orchestrator.d.ts +3 -2
  241. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts.map +1 -0
  242. package/dist/ir/{type-converter → type-system/internal/type-converter}/orchestrator.js +63 -21
  243. package/dist/ir/type-system/internal/type-converter/orchestrator.js.map +1 -0
  244. package/dist/ir/{type-converter → type-system/internal/type-converter}/primitives.d.ts +4 -4
  245. package/dist/ir/type-system/internal/type-converter/primitives.d.ts.map +1 -0
  246. package/dist/ir/{type-converter → type-system/internal/type-converter}/primitives.js +2 -2
  247. package/dist/ir/type-system/internal/type-converter/primitives.js.map +1 -0
  248. package/dist/ir/{type-converter → type-system/internal/type-converter}/references.d.ts +3 -2
  249. package/dist/ir/type-system/internal/type-converter/references.d.ts.map +1 -0
  250. package/dist/ir/type-system/internal/type-converter/references.js +545 -0
  251. package/dist/ir/type-system/internal/type-converter/references.js.map +1 -0
  252. package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts +15 -0
  253. package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts.map +1 -0
  254. package/dist/ir/type-system/internal/type-converter/unions-intersections.js +22 -0
  255. package/dist/ir/type-system/internal/type-converter/unions-intersections.js.map +1 -0
  256. package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.d.ts +23 -36
  257. package/dist/ir/type-system/internal/type-converter/utility-types.d.ts.map +1 -0
  258. package/dist/ir/type-system/internal/type-converter/utility-types.js +879 -0
  259. package/dist/ir/type-system/internal/type-converter/utility-types.js.map +1 -0
  260. package/dist/ir/type-system/internal/type-converter/utility-types.test.d.ts.map +1 -0
  261. package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.test.js +398 -120
  262. package/dist/ir/type-system/internal/type-converter/utility-types.test.js.map +1 -0
  263. package/dist/ir/type-system/internal/type-converter.d.ts +9 -0
  264. package/dist/ir/type-system/internal/type-converter.d.ts.map +1 -0
  265. package/dist/ir/type-system/internal/type-converter.js +9 -0
  266. package/dist/ir/type-system/internal/type-converter.js.map +1 -0
  267. package/dist/ir/type-system/internal/type-registry.d.ts +112 -0
  268. package/dist/ir/type-system/internal/type-registry.d.ts.map +1 -0
  269. package/dist/ir/type-system/internal/type-registry.js +535 -0
  270. package/dist/ir/type-system/internal/type-registry.js.map +1 -0
  271. package/dist/ir/type-system/internal/universe/alias-table.d.ts +92 -0
  272. package/dist/ir/type-system/internal/universe/alias-table.d.ts.map +1 -0
  273. package/dist/ir/type-system/internal/universe/alias-table.js +222 -0
  274. package/dist/ir/type-system/internal/universe/alias-table.js.map +1 -0
  275. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts +44 -0
  276. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts.map +1 -0
  277. package/dist/ir/type-system/internal/universe/clr-catalog.js +1192 -0
  278. package/dist/ir/type-system/internal/universe/clr-catalog.js.map +1 -0
  279. package/dist/ir/type-system/internal/universe/index.d.ts +26 -0
  280. package/dist/ir/type-system/internal/universe/index.d.ts.map +1 -0
  281. package/dist/ir/type-system/internal/universe/index.js +30 -0
  282. package/dist/ir/type-system/internal/universe/index.js.map +1 -0
  283. package/dist/ir/type-system/internal/universe/resolution.d.ts +115 -0
  284. package/dist/ir/type-system/internal/universe/resolution.d.ts.map +1 -0
  285. package/dist/ir/type-system/internal/universe/resolution.js +181 -0
  286. package/dist/ir/type-system/internal/universe/resolution.js.map +1 -0
  287. package/dist/ir/type-system/internal/universe/source-catalog.d.ts +64 -0
  288. package/dist/ir/type-system/internal/universe/source-catalog.d.ts.map +1 -0
  289. package/dist/ir/type-system/internal/universe/source-catalog.js +96 -0
  290. package/dist/ir/type-system/internal/universe/source-catalog.js.map +1 -0
  291. package/dist/ir/type-system/internal/universe/types.d.ts +436 -0
  292. package/dist/ir/type-system/internal/universe/types.d.ts.map +1 -0
  293. package/dist/ir/type-system/internal/universe/types.js +69 -0
  294. package/dist/ir/type-system/internal/universe/types.js.map +1 -0
  295. package/dist/ir/type-system/internal/universe/unified-universe.d.ts +70 -0
  296. package/dist/ir/type-system/internal/universe/unified-universe.d.ts.map +1 -0
  297. package/dist/ir/type-system/internal/universe/unified-universe.js +319 -0
  298. package/dist/ir/type-system/internal/universe/unified-universe.js.map +1 -0
  299. package/dist/ir/type-system/type-system.d.ts +617 -0
  300. package/dist/ir/type-system/type-system.d.ts.map +1 -0
  301. package/dist/ir/type-system/type-system.js +2579 -0
  302. package/dist/ir/type-system/type-system.js.map +1 -0
  303. package/dist/ir/type-system/types.d.ts +176 -0
  304. package/dist/ir/type-system/types.d.ts.map +1 -0
  305. package/dist/ir/type-system/types.js +80 -0
  306. package/dist/ir/type-system/types.js.map +1 -0
  307. package/dist/ir/types/expressions.d.ts +35 -7
  308. package/dist/ir/types/expressions.d.ts.map +1 -1
  309. package/dist/ir/types/helpers.d.ts +22 -2
  310. package/dist/ir/types/helpers.d.ts.map +1 -1
  311. package/dist/ir/types/index.d.ts +4 -2
  312. package/dist/ir/types/index.d.ts.map +1 -1
  313. package/dist/ir/types/index.js +1 -0
  314. package/dist/ir/types/index.js.map +1 -1
  315. package/dist/ir/types/ir-substitution.d.ts +144 -0
  316. package/dist/ir/types/ir-substitution.d.ts.map +1 -0
  317. package/dist/ir/types/ir-substitution.js +569 -0
  318. package/dist/ir/types/ir-substitution.js.map +1 -0
  319. package/dist/ir/types/ir-types.d.ts +10 -4
  320. package/dist/ir/types/ir-types.d.ts.map +1 -1
  321. package/dist/ir/types/numeric-helpers.d.ts +2 -1
  322. package/dist/ir/types/numeric-helpers.d.ts.map +1 -1
  323. package/dist/ir/types/numeric-helpers.js +9 -3
  324. package/dist/ir/types/numeric-helpers.js.map +1 -1
  325. package/dist/ir/types/statements.d.ts +22 -1
  326. package/dist/ir/types/statements.d.ts.map +1 -1
  327. package/dist/ir/types.d.ts +1 -1
  328. package/dist/ir/types.d.ts.map +1 -1
  329. package/dist/ir/types.js.map +1 -1
  330. package/dist/ir/validation/anonymous-type-lowering-pass.d.ts.map +1 -1
  331. package/dist/ir/validation/anonymous-type-lowering-pass.js +153 -8
  332. package/dist/ir/validation/anonymous-type-lowering-pass.js.map +1 -1
  333. package/dist/ir/validation/arrow-return-finalization-pass.d.ts +28 -0
  334. package/dist/ir/validation/arrow-return-finalization-pass.d.ts.map +1 -0
  335. package/dist/ir/validation/arrow-return-finalization-pass.js +416 -0
  336. package/dist/ir/validation/arrow-return-finalization-pass.js.map +1 -0
  337. package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -1
  338. package/dist/ir/validation/attribute-collection-pass.js +40 -6
  339. package/dist/ir/validation/attribute-collection-pass.js.map +1 -1
  340. package/dist/ir/validation/attribute-collection-pass.test.js +43 -36
  341. package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -1
  342. package/dist/ir/validation/char-validation-pass.d.ts +26 -0
  343. package/dist/ir/validation/char-validation-pass.d.ts.map +1 -0
  344. package/dist/ir/validation/char-validation-pass.js +495 -0
  345. package/dist/ir/validation/char-validation-pass.js.map +1 -0
  346. package/dist/ir/validation/index.d.ts +3 -0
  347. package/dist/ir/validation/index.d.ts.map +1 -1
  348. package/dist/ir/validation/index.js +3 -0
  349. package/dist/ir/validation/index.js.map +1 -1
  350. package/dist/ir/validation/numeric-coercion-pass.d.ts +22 -16
  351. package/dist/ir/validation/numeric-coercion-pass.d.ts.map +1 -1
  352. package/dist/ir/validation/numeric-coercion-pass.js +159 -51
  353. package/dist/ir/validation/numeric-coercion-pass.js.map +1 -1
  354. package/dist/ir/validation/numeric-invariants.test.js +72 -108
  355. package/dist/ir/validation/numeric-invariants.test.js.map +1 -1
  356. package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -1
  357. package/dist/ir/validation/numeric-proof-pass.js +71 -23
  358. package/dist/ir/validation/numeric-proof-pass.js.map +1 -1
  359. package/dist/ir/validation/rest-type-synthesis-pass.d.ts +24 -0
  360. package/dist/ir/validation/rest-type-synthesis-pass.d.ts.map +1 -0
  361. package/dist/ir/validation/rest-type-synthesis-pass.js +417 -0
  362. package/dist/ir/validation/rest-type-synthesis-pass.js.map +1 -0
  363. package/dist/ir/validation/soundness-gate.d.ts +11 -1
  364. package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
  365. package/dist/ir/validation/soundness-gate.js +42 -10
  366. package/dist/ir/validation/soundness-gate.js.map +1 -1
  367. package/dist/ir/validation/soundness-gate.test.js +19 -2
  368. package/dist/ir/validation/soundness-gate.test.js.map +1 -1
  369. package/dist/ir/validation/virtual-marking-pass.d.ts +16 -0
  370. package/dist/ir/validation/virtual-marking-pass.d.ts.map +1 -0
  371. package/dist/ir/validation/virtual-marking-pass.js +77 -0
  372. package/dist/ir/validation/virtual-marking-pass.js.map +1 -0
  373. package/dist/ir/validation/yield-lowering-pass.test.js +2 -2
  374. package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
  375. package/dist/program/bindings.d.ts +44 -0
  376. package/dist/program/bindings.d.ts.map +1 -1
  377. package/dist/program/bindings.js +248 -2
  378. package/dist/program/bindings.js.map +1 -1
  379. package/dist/program/bindings.test.js +30 -0
  380. package/dist/program/bindings.test.js.map +1 -1
  381. package/dist/program/creation.d.ts.map +1 -1
  382. package/dist/program/creation.js +158 -4
  383. package/dist/program/creation.js.map +1 -1
  384. package/dist/program/dependency-graph.d.ts.map +1 -1
  385. package/dist/program/dependency-graph.js +33 -26
  386. package/dist/program/dependency-graph.js.map +1 -1
  387. package/dist/program/index.d.ts +1 -1
  388. package/dist/program/index.d.ts.map +1 -1
  389. package/dist/program/types.d.ts +7 -8
  390. package/dist/program/types.d.ts.map +1 -1
  391. package/dist/resolver/clr-bindings-resolver.d.ts +6 -0
  392. package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
  393. package/dist/resolver/clr-bindings-resolver.js +185 -39
  394. package/dist/resolver/clr-bindings-resolver.js.map +1 -1
  395. package/dist/resolver/clr-bindings-resolver.test.d.ts +2 -0
  396. package/dist/resolver/clr-bindings-resolver.test.d.ts.map +1 -0
  397. package/dist/resolver/clr-bindings-resolver.test.js +161 -0
  398. package/dist/resolver/clr-bindings-resolver.test.js.map +1 -0
  399. package/dist/resolver/import-resolution.d.ts +16 -1
  400. package/dist/resolver/import-resolution.d.ts.map +1 -1
  401. package/dist/resolver/import-resolution.js +29 -12
  402. package/dist/resolver/import-resolution.js.map +1 -1
  403. package/dist/resolver/namespace.d.ts +2 -1
  404. package/dist/resolver/namespace.d.ts.map +1 -1
  405. package/dist/resolver/namespace.js +5 -2
  406. package/dist/resolver/namespace.js.map +1 -1
  407. package/dist/resolver/namespace.test.js +6 -6
  408. package/dist/resolver/naming-policy.d.ts +20 -0
  409. package/dist/resolver/naming-policy.d.ts.map +1 -0
  410. package/dist/resolver/naming-policy.js +40 -0
  411. package/dist/resolver/naming-policy.js.map +1 -0
  412. package/dist/resolver/naming.d.ts +2 -5
  413. package/dist/resolver/naming.d.ts.map +1 -1
  414. package/dist/resolver/naming.js +3 -20
  415. package/dist/resolver/naming.js.map +1 -1
  416. package/dist/resolver.d.ts +2 -0
  417. package/dist/resolver.d.ts.map +1 -1
  418. package/dist/resolver.js +1 -0
  419. package/dist/resolver.js.map +1 -1
  420. package/dist/resolver.test.js +8 -3
  421. package/dist/resolver.test.js.map +1 -1
  422. package/dist/symbol-table/builder.d.ts +3 -1
  423. package/dist/symbol-table/builder.d.ts.map +1 -1
  424. package/dist/symbol-table/builder.js +9 -8
  425. package/dist/symbol-table/builder.js.map +1 -1
  426. package/dist/symbol-table/types.d.ts +2 -2
  427. package/dist/symbol-table/types.d.ts.map +1 -1
  428. package/dist/types/diagnostic.d.ts +12 -2
  429. package/dist/types/diagnostic.d.ts.map +1 -1
  430. package/dist/types/diagnostic.js +5 -1
  431. package/dist/types/diagnostic.js.map +1 -1
  432. package/dist/validation/core-intrinsics.d.ts +18 -0
  433. package/dist/validation/core-intrinsics.d.ts.map +1 -0
  434. package/dist/validation/core-intrinsics.js +186 -0
  435. package/dist/validation/core-intrinsics.js.map +1 -0
  436. package/dist/validation/extension-methods.d.ts +17 -0
  437. package/dist/validation/extension-methods.d.ts.map +1 -0
  438. package/dist/validation/extension-methods.js +133 -0
  439. package/dist/validation/extension-methods.js.map +1 -0
  440. package/dist/validation/generics.d.ts.map +1 -1
  441. package/dist/validation/generics.js +1 -129
  442. package/dist/validation/generics.js.map +1 -1
  443. package/dist/validation/imports.js +1 -1
  444. package/dist/validation/imports.js.map +1 -1
  445. package/dist/validation/index.d.ts +2 -0
  446. package/dist/validation/index.d.ts.map +1 -1
  447. package/dist/validation/index.js +2 -0
  448. package/dist/validation/index.js.map +1 -1
  449. package/dist/validation/orchestrator.d.ts.map +1 -1
  450. package/dist/validation/orchestrator.js +4 -0
  451. package/dist/validation/orchestrator.js.map +1 -1
  452. package/dist/validation/static-safety.d.ts +1 -0
  453. package/dist/validation/static-safety.d.ts.map +1 -1
  454. package/dist/validation/static-safety.js +366 -96
  455. package/dist/validation/static-safety.js.map +1 -1
  456. package/dist/validator.test.js +123 -1
  457. package/dist/validator.test.js.map +1 -1
  458. package/package.json +2 -2
  459. package/dist/ir/type-converter/arrays.d.ts +0 -10
  460. package/dist/ir/type-converter/arrays.d.ts.map +0 -1
  461. package/dist/ir/type-converter/arrays.js.map +0 -1
  462. package/dist/ir/type-converter/converter.d.ts +0 -6
  463. package/dist/ir/type-converter/converter.d.ts.map +0 -1
  464. package/dist/ir/type-converter/converter.js +0 -6
  465. package/dist/ir/type-converter/converter.js.map +0 -1
  466. package/dist/ir/type-converter/functions.d.ts +0 -10
  467. package/dist/ir/type-converter/functions.d.ts.map +0 -1
  468. package/dist/ir/type-converter/functions.js +0 -15
  469. package/dist/ir/type-converter/functions.js.map +0 -1
  470. package/dist/ir/type-converter/index.d.ts +0 -7
  471. package/dist/ir/type-converter/index.d.ts.map +0 -1
  472. package/dist/ir/type-converter/index.js +0 -7
  473. package/dist/ir/type-converter/index.js.map +0 -1
  474. package/dist/ir/type-converter/inference.d.ts +0 -32
  475. package/dist/ir/type-converter/inference.d.ts.map +0 -1
  476. package/dist/ir/type-converter/inference.js +0 -297
  477. package/dist/ir/type-converter/inference.js.map +0 -1
  478. package/dist/ir/type-converter/literals.d.ts.map +0 -1
  479. package/dist/ir/type-converter/literals.js.map +0 -1
  480. package/dist/ir/type-converter/objects.d.ts +0 -16
  481. package/dist/ir/type-converter/objects.d.ts.map +0 -1
  482. package/dist/ir/type-converter/objects.js.map +0 -1
  483. package/dist/ir/type-converter/orchestrator.d.ts.map +0 -1
  484. package/dist/ir/type-converter/orchestrator.js.map +0 -1
  485. package/dist/ir/type-converter/patterns.d.ts +0 -10
  486. package/dist/ir/type-converter/patterns.d.ts.map +0 -1
  487. package/dist/ir/type-converter/patterns.js.map +0 -1
  488. package/dist/ir/type-converter/primitives.d.ts.map +0 -1
  489. package/dist/ir/type-converter/primitives.js.map +0 -1
  490. package/dist/ir/type-converter/references.d.ts.map +0 -1
  491. package/dist/ir/type-converter/references.js +0 -371
  492. package/dist/ir/type-converter/references.js.map +0 -1
  493. package/dist/ir/type-converter/unions-intersections.d.ts +0 -14
  494. package/dist/ir/type-converter/unions-intersections.d.ts.map +0 -1
  495. package/dist/ir/type-converter/unions-intersections.js +0 -22
  496. package/dist/ir/type-converter/unions-intersections.js.map +0 -1
  497. package/dist/ir/type-converter/utility-types.d.ts.map +0 -1
  498. package/dist/ir/type-converter/utility-types.js +0 -528
  499. package/dist/ir/type-converter/utility-types.js.map +0 -1
  500. package/dist/ir/type-converter/utility-types.test.d.ts.map +0 -1
  501. package/dist/ir/type-converter/utility-types.test.js.map +0 -1
  502. package/dist/ir/type-converter.d.ts +0 -6
  503. package/dist/ir/type-converter.d.ts.map +0 -1
  504. package/dist/ir/type-converter.js +0 -6
  505. package/dist/ir/type-converter.js.map +0 -1
  506. /package/dist/ir/{type-converter → type-system/internal/type-converter}/literals.js +0 -0
  507. /package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.test.d.ts +0 -0
@@ -0,0 +1,1035 @@
1
+ /**
2
+ * Binding Layer — TS Symbol Resolution with Opaque Handles
3
+ *
4
+ * This module wraps TypeScript's symbol resolution APIs and returns opaque
5
+ * handles (DeclId, SignatureId, MemberId) instead of ts.Symbol/ts.Signature.
6
+ *
7
+ * ALLOWED APIs (symbol resolution only):
8
+ * - checker.getSymbolAtLocation(node) — Find symbol at AST node
9
+ * - checker.getAliasedSymbol(symbol) — Resolve import alias
10
+ * - checker.getExportSymbolOfSymbol(symbol) — Resolve export
11
+ * - symbol.getDeclarations() — Get AST declaration nodes
12
+ * - checker.getResolvedSignature(call) — Pick overload (type from declaration)
13
+ *
14
+ * BANNED APIs (these produce ts.Type, which violates INV-0):
15
+ * - checker.getTypeAtLocation
16
+ * - checker.getTypeOfSymbolAtLocation
17
+ * - checker.getContextualType
18
+ * - checker.typeToTypeNode
19
+ */
20
+ import ts from "typescript";
21
+ import { makeDeclId, makeSignatureId, makeMemberId, makeTypeSyntaxId, } from "../type-system/types.js";
22
+ // ═══════════════════════════════════════════════════════════════════════════
23
+ // BINDING IMPLEMENTATION
24
+ // ═══════════════════════════════════════════════════════════════════════════
25
+ /**
26
+ * Create a Binding instance for a TypeScript program.
27
+ *
28
+ * Returns BindingInternal which includes _getHandleRegistry() for TypeSystem.
29
+ * Cast to Binding when passing to regular converters.
30
+ */
31
+ export const createBinding = (checker) => {
32
+ // Internal registries mapping handles to underlying TS objects
33
+ const declMap = new Map();
34
+ const signatureMap = new Map();
35
+ const memberMap = new Map(); // key: "declId:name"
36
+ const typeSyntaxMap = new Map(); // TypeSyntaxId → TypeNode
37
+ // Auto-increment IDs
38
+ const nextDeclId = { value: 0 };
39
+ const nextSignatureId = { value: 0 };
40
+ const nextTypeSyntaxId = { value: 0 };
41
+ // Symbol to DeclId cache (avoid duplicate DeclIds for same symbol)
42
+ const symbolToDeclId = new Map();
43
+ const signatureToId = new Map();
44
+ // ─────────────────────────────────────────────────────────────────────────
45
+ // INTERNAL HELPERS
46
+ // ─────────────────────────────────────────────────────────────────────────
47
+ const getOrCreateDeclId = (symbol) => {
48
+ const existing = symbolToDeclId.get(symbol);
49
+ if (existing)
50
+ return existing;
51
+ const id = makeDeclId(nextDeclId.value++);
52
+ symbolToDeclId.set(symbol, id);
53
+ // Get declaration info.
54
+ //
55
+ // IMPORTANT:
56
+ // Some symbols (notably tsbindgen facades) intentionally merge a value export
57
+ // and a type export under the same name, e.g.:
58
+ // export const Task: typeof Internal.Task;
59
+ // export type Task<T1 = __> = ... Internal.Task_1<T1> ...
60
+ //
61
+ // For expression identifiers we want the value declaration, while for type
62
+ // references we must be able to access the type declaration. We capture both.
63
+ const decls = symbol.getDeclarations() ?? [];
64
+ const valueDecl = decls.find((d) => ts.isVariableDeclaration(d) ||
65
+ ts.isFunctionDeclaration(d) ||
66
+ ts.isParameter(d) ||
67
+ ts.isPropertyDeclaration(d) ||
68
+ ts.isPropertySignature(d) ||
69
+ ts.isMethodDeclaration(d) ||
70
+ ts.isMethodSignature(d));
71
+ const typeDecl = decls.find((d) => ts.isTypeAliasDeclaration(d) ||
72
+ ts.isInterfaceDeclaration(d) ||
73
+ ts.isClassDeclaration(d) ||
74
+ ts.isEnumDeclaration(d) ||
75
+ ts.isTypeParameterDeclaration(d));
76
+ const decl = valueDecl ?? typeDecl ?? decls[0];
77
+ // Capture class member names for override detection (TS-version safe)
78
+ const classMemberNames = decl && ts.isClassDeclaration(decl)
79
+ ? extractClassMemberNames(decl)
80
+ : undefined;
81
+ const entry = {
82
+ symbol,
83
+ decl,
84
+ typeDeclNode: typeDecl,
85
+ valueDeclNode: valueDecl,
86
+ typeNode: decl ? getTypeNodeFromDeclaration(decl) : undefined,
87
+ kind: decl ? getDeclKind(decl) : "variable",
88
+ fqName: symbol.getName(),
89
+ classMemberNames,
90
+ };
91
+ declMap.set(id.id, entry);
92
+ return id;
93
+ };
94
+ const getOrCreateSignatureId = (signature) => {
95
+ const existing = signatureToId.get(signature);
96
+ if (existing)
97
+ return existing;
98
+ const id = makeSignatureId(nextSignatureId.value++);
99
+ signatureToId.set(signature, id);
100
+ // Extract signature info from declaration
101
+ const decl = signature.getDeclaration();
102
+ // Extract declaring identity (CRITICAL for Alice's spec: resolveCall needs this)
103
+ const declaringIdentity = extractDeclaringIdentity(decl, checker);
104
+ // Extract type predicate from return type (ALICE'S SPEC: pure syntax inspection)
105
+ const returnTypeNode = getReturnTypeNode(decl);
106
+ const typePredicate = extractTypePredicate(returnTypeNode, decl);
107
+ const entry = {
108
+ signature,
109
+ decl,
110
+ parameters: extractParameterNodes(decl),
111
+ returnTypeNode,
112
+ typeParameters: extractTypeParameterNodes(decl),
113
+ declaringTypeTsName: declaringIdentity?.typeTsName,
114
+ declaringMemberName: declaringIdentity?.memberName,
115
+ typePredicate,
116
+ };
117
+ signatureMap.set(id.id, entry);
118
+ return id;
119
+ };
120
+ const getOrCreateMemberId = (ownerDeclId, memberName, memberSymbol) => {
121
+ const key = `${ownerDeclId.id}:${memberName}`;
122
+ const existing = memberMap.get(key);
123
+ if (existing)
124
+ return existing.memberId;
125
+ const id = makeMemberId(ownerDeclId, memberName);
126
+ const decl = memberSymbol.getDeclarations()?.[0];
127
+ const entry = {
128
+ memberId: id,
129
+ symbol: memberSymbol,
130
+ decl,
131
+ name: memberName,
132
+ typeNode: decl ? getMemberTypeAnnotation(decl) : undefined,
133
+ isOptional: isOptionalMember(memberSymbol),
134
+ isReadonly: isReadonlyMember(decl),
135
+ };
136
+ memberMap.set(key, entry);
137
+ return id;
138
+ };
139
+ // ─────────────────────────────────────────────────────────────────────────
140
+ // BINDING IMPLEMENTATION
141
+ // ─────────────────────────────────────────────────────────────────────────
142
+ const resolveIdentifier = (node) => {
143
+ const symbol = checker.getSymbolAtLocation(node);
144
+ if (!symbol)
145
+ return undefined;
146
+ // Follow aliases for imports
147
+ const resolvedSymbol = symbol.flags & ts.SymbolFlags.Alias
148
+ ? checker.getAliasedSymbol(symbol)
149
+ : symbol;
150
+ return getOrCreateDeclId(resolvedSymbol);
151
+ };
152
+ const resolveTypeReference = (node) => {
153
+ const typeName = node.typeName;
154
+ const symbol = ts.isIdentifier(typeName)
155
+ ? checker.getSymbolAtLocation(typeName)
156
+ : checker.getSymbolAtLocation(typeName.right);
157
+ if (!symbol)
158
+ return undefined;
159
+ // Follow aliases
160
+ const resolvedSymbol = symbol.flags & ts.SymbolFlags.Alias
161
+ ? checker.getAliasedSymbol(symbol)
162
+ : symbol;
163
+ return getOrCreateDeclId(resolvedSymbol);
164
+ };
165
+ const resolvePropertyAccess = (node) => {
166
+ const rawPropSymbol = checker.getSymbolAtLocation(node.name);
167
+ if (!rawPropSymbol)
168
+ return undefined;
169
+ const propSymbol = rawPropSymbol.flags & ts.SymbolFlags.Alias
170
+ ? checker.getAliasedSymbol(rawPropSymbol)
171
+ : rawPropSymbol;
172
+ // Get owner type's declaration
173
+ const rawOwnerSymbol = checker.getSymbolAtLocation(node.expression);
174
+ // Note: `getSymbolAtLocation(node.expression)` can be undefined for receivers
175
+ // that are not identifiers/member-accesses (e.g., `xs.where(...).select`).
176
+ // In that case we still want a stable MemberId for the member symbol itself,
177
+ // so we key the member entry off the member symbol's own DeclId.
178
+ const ownerSymbol = rawOwnerSymbol
179
+ ? rawOwnerSymbol.flags & ts.SymbolFlags.Alias
180
+ ? checker.getAliasedSymbol(rawOwnerSymbol)
181
+ : rawOwnerSymbol
182
+ : undefined;
183
+ const ownerDeclId = getOrCreateDeclId(ownerSymbol ?? propSymbol);
184
+ return getOrCreateMemberId(ownerDeclId, node.name.text, propSymbol);
185
+ };
186
+ const resolveElementAccess = (_node) => {
187
+ // Element access member resolution requires type-level analysis
188
+ // Return undefined (member not resolved via handles)
189
+ return undefined;
190
+ };
191
+ const resolveCallSignature = (node) => {
192
+ const signature = checker.getResolvedSignature(node);
193
+ if (!signature)
194
+ return undefined;
195
+ // TypeScript can produce a resolved signature without a declaration for
196
+ // implicit default constructors (e.g., `super()` when the base class has
197
+ // no explicit constructor). We still want a SignatureId so TypeSystem can
198
+ // treat this call deterministically as `void`.
199
+ if (signature.declaration === undefined) {
200
+ // Special case: `super()` implicit base constructor
201
+ if (node.expression.kind === ts.SyntaxKind.SuperKeyword) {
202
+ return getOrCreateSignatureId(signature);
203
+ }
204
+ // Recovery: calls through variables/properties typed as functions can
205
+ // yield signatures without declarations. Attempt to re-anchor to a
206
+ // function-like declaration we can capture syntactically.
207
+ const symbol = (() => {
208
+ const expr = node.expression;
209
+ if (ts.isIdentifier(expr))
210
+ return checker.getSymbolAtLocation(expr);
211
+ if (ts.isPropertyAccessExpression(expr)) {
212
+ return checker.getSymbolAtLocation(expr.name);
213
+ }
214
+ return undefined;
215
+ })();
216
+ const resolvedSymbol = symbol && symbol.flags & ts.SymbolFlags.Alias
217
+ ? checker.getAliasedSymbol(symbol)
218
+ : symbol;
219
+ const decls = resolvedSymbol?.getDeclarations() ?? [];
220
+ for (const decl of decls) {
221
+ // Direct function-like declarations (function/method/signature)
222
+ if (ts.isFunctionLike(decl)) {
223
+ const sig = checker.getSignatureFromDeclaration(decl);
224
+ if (sig)
225
+ return getOrCreateSignatureId(sig);
226
+ continue;
227
+ }
228
+ // Variable initializers: const f = (x) => ...
229
+ if (ts.isVariableDeclaration(decl)) {
230
+ const init = decl.initializer;
231
+ if (init && (ts.isArrowFunction(init) || ts.isFunctionExpression(init))) {
232
+ const sig = checker.getSignatureFromDeclaration(init);
233
+ if (sig)
234
+ return getOrCreateSignatureId(sig);
235
+ }
236
+ }
237
+ }
238
+ return undefined;
239
+ }
240
+ const resolvedId = getOrCreateSignatureId(signature);
241
+ // Airplane-grade overload selection for erased TS types:
242
+ // In TypeScript, `char` is `string`, so overload sets that differ only by
243
+ // `char` vs `string` can be resolved "wrong" due to declaration order
244
+ // (e.g., string.split("/") picking the `char` overload).
245
+ //
246
+ // We apply a deterministic, syntax-driven tie-breaker:
247
+ // - Prefer `string` parameters for non-charish arguments (string literals, etc.)
248
+ // - Prefer `char` parameters only when the argument is explicitly marked char
249
+ // (e.g., `expr as char`, or identifier declared `: char`).
250
+ const candidates = resolveCallSignatureCandidates(node);
251
+ if (!candidates || candidates.length < 2)
252
+ return resolvedId;
253
+ const stripParens = (expr) => {
254
+ let current = expr;
255
+ while (ts.isParenthesizedExpression(current)) {
256
+ current = current.expression;
257
+ }
258
+ return current;
259
+ };
260
+ const isCharTypeNode = (typeNode) => {
261
+ if (ts.isTypeReferenceNode(typeNode)) {
262
+ const tn = typeNode.typeName;
263
+ if (ts.isIdentifier(tn))
264
+ return tn.text === "char";
265
+ return tn.right.text === "char";
266
+ }
267
+ return false;
268
+ };
269
+ const isCharishArgument = (arg) => {
270
+ const expr = stripParens(arg);
271
+ // Explicit `as char` / `<char>` assertions.
272
+ if (ts.isAsExpression(expr) || ts.isTypeAssertionExpression(expr)) {
273
+ return isCharTypeNode(expr.type);
274
+ }
275
+ // Identifier declared with `: char`.
276
+ if (ts.isIdentifier(expr)) {
277
+ const sym = checker.getSymbolAtLocation(expr);
278
+ if (!sym)
279
+ return false;
280
+ const resolvedSym = sym.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(sym) : sym;
281
+ const decls = resolvedSym.getDeclarations() ?? [];
282
+ for (const decl of decls) {
283
+ const typeNode = getTypeNodeFromDeclaration(decl);
284
+ if (typeNode && isCharTypeNode(typeNode))
285
+ return true;
286
+ }
287
+ }
288
+ return false;
289
+ };
290
+ const prefersStringOverChar = (arg) => {
291
+ const expr = stripParens(arg);
292
+ if (isCharishArgument(expr))
293
+ return false;
294
+ return ts.isStringLiteral(expr) || ts.isNoSubstitutionTemplateLiteral(expr);
295
+ };
296
+ const classifyParamTypeNode = (typeNode) => {
297
+ if (!typeNode)
298
+ return "other";
299
+ const node = typeNode;
300
+ if (node.kind === ts.SyntaxKind.StringKeyword)
301
+ return "string";
302
+ if (isCharTypeNode(node))
303
+ return "char";
304
+ if (ts.isArrayTypeNode(node)) {
305
+ return isCharTypeNode(node.elementType) ? "char" : "other";
306
+ }
307
+ return "other";
308
+ };
309
+ const paramClassForArgIndex = (entry, argIndex) => {
310
+ const params = entry.parameters;
311
+ const direct = params[argIndex];
312
+ if (direct)
313
+ return classifyParamTypeNode(direct.typeNode);
314
+ // Rest parameter: map extra args to last param if it is rest.
315
+ const last = params[params.length - 1];
316
+ if (last && last.isRest)
317
+ return classifyParamTypeNode(last.typeNode);
318
+ return "other";
319
+ };
320
+ const args = node.arguments;
321
+ const wantsStringAt = [];
322
+ const wantsCharAt = [];
323
+ for (let i = 0; i < args.length; i++) {
324
+ const arg = args[i];
325
+ if (!arg)
326
+ continue;
327
+ if (ts.isSpreadElement(arg))
328
+ continue;
329
+ if (isCharishArgument(arg)) {
330
+ wantsCharAt.push(i);
331
+ }
332
+ else if (prefersStringOverChar(arg)) {
333
+ wantsStringAt.push(i);
334
+ }
335
+ }
336
+ if (wantsStringAt.length === 0 && wantsCharAt.length === 0)
337
+ return resolvedId;
338
+ const scoreSignature = (sigId) => {
339
+ const entry = signatureMap.get(sigId.id);
340
+ if (!entry)
341
+ return 0;
342
+ let score = 0;
343
+ for (const i of wantsStringAt) {
344
+ const pc = paramClassForArgIndex(entry, i);
345
+ if (pc === "string")
346
+ score += 2;
347
+ if (pc === "char")
348
+ score -= 2;
349
+ }
350
+ for (const i of wantsCharAt) {
351
+ const pc = paramClassForArgIndex(entry, i);
352
+ if (pc === "char")
353
+ score += 2;
354
+ if (pc === "string")
355
+ score -= 2;
356
+ }
357
+ return score;
358
+ };
359
+ const resolvedScore = scoreSignature(resolvedId);
360
+ let bestId = resolvedId;
361
+ let bestScore = resolvedScore;
362
+ for (const candidate of candidates) {
363
+ const s = scoreSignature(candidate);
364
+ if (s > bestScore) {
365
+ bestScore = s;
366
+ bestId = candidate;
367
+ }
368
+ }
369
+ return bestId;
370
+ };
371
+ const resolveCallSignatureCandidates = (node) => {
372
+ const expr = node.expression;
373
+ const symbol = (() => {
374
+ if (ts.isIdentifier(expr))
375
+ return checker.getSymbolAtLocation(expr);
376
+ if (ts.isPropertyAccessExpression(expr)) {
377
+ return checker.getSymbolAtLocation(expr.name);
378
+ }
379
+ return undefined;
380
+ })();
381
+ if (!symbol)
382
+ return undefined;
383
+ const resolvedSymbol = symbol.flags & ts.SymbolFlags.Alias
384
+ ? checker.getAliasedSymbol(symbol)
385
+ : symbol;
386
+ const decls = resolvedSymbol.getDeclarations();
387
+ if (!decls || decls.length === 0)
388
+ return undefined;
389
+ const argCount = node.arguments.length;
390
+ const candidates = [];
391
+ for (const decl of decls) {
392
+ if (!ts.isFunctionLike(decl))
393
+ continue;
394
+ // Exclude construct signatures / constructors for call expressions.
395
+ if (ts.isConstructSignatureDeclaration(decl) || ts.isConstructorDeclaration(decl)) {
396
+ continue;
397
+ }
398
+ // Arity filtering (optional/rest aware)
399
+ const params = extractParameterNodes(decl);
400
+ const required = params.filter((p) => !p.isOptional && !p.isRest).length;
401
+ const hasRest = params.some((p) => p.isRest);
402
+ if (argCount < required)
403
+ continue;
404
+ if (!hasRest && argCount > params.length)
405
+ continue;
406
+ const sig = checker.getSignatureFromDeclaration(decl);
407
+ if (!sig)
408
+ continue;
409
+ candidates.push(getOrCreateSignatureId(sig));
410
+ }
411
+ return candidates.length > 0 ? candidates : undefined;
412
+ };
413
+ const resolveConstructorSignature = (node) => {
414
+ const signature = checker.getResolvedSignature(node);
415
+ if (!signature)
416
+ return undefined;
417
+ const sigId = getOrCreateSignatureId(signature);
418
+ // For implicit default constructors, TypeScript may return a signature with no declaration.
419
+ // We still need a SignatureEntry that identifies the constructed type so TypeSystem can
420
+ // synthesize the constructor return type deterministically.
421
+ const entry = signatureMap.get(sigId.id);
422
+ if (entry && !entry.decl) {
423
+ const expr = node.expression;
424
+ const symbol = (() => {
425
+ if (ts.isIdentifier(expr))
426
+ return checker.getSymbolAtLocation(expr);
427
+ if (ts.isPropertyAccessExpression(expr)) {
428
+ return checker.getSymbolAtLocation(expr.name);
429
+ }
430
+ return undefined;
431
+ })();
432
+ const resolvedSymbol = symbol && symbol.flags & ts.SymbolFlags.Alias
433
+ ? checker.getAliasedSymbol(symbol)
434
+ : symbol;
435
+ const decl = resolvedSymbol?.getDeclarations()?.[0];
436
+ const declaringTypeTsName = (() => {
437
+ if (decl && ts.isClassDeclaration(decl) && decl.name)
438
+ return decl.name.text;
439
+ if (resolvedSymbol)
440
+ return resolvedSymbol.getName();
441
+ if (ts.isIdentifier(expr))
442
+ return expr.text;
443
+ if (ts.isPropertyAccessExpression(expr))
444
+ return expr.name.text;
445
+ return undefined;
446
+ })();
447
+ if (declaringTypeTsName) {
448
+ signatureMap.set(sigId.id, {
449
+ ...entry,
450
+ declaringTypeTsName,
451
+ declaringMemberName: "constructor",
452
+ typeParameters: decl && ts.isClassDeclaration(decl)
453
+ ? convertTypeParameterDeclarations(decl.typeParameters)
454
+ : undefined,
455
+ });
456
+ }
457
+ }
458
+ return sigId;
459
+ };
460
+ const resolveConstructorSignatureCandidates = (node) => {
461
+ const expr = node.expression;
462
+ const symbol = (() => {
463
+ if (ts.isIdentifier(expr))
464
+ return checker.getSymbolAtLocation(expr);
465
+ if (ts.isPropertyAccessExpression(expr)) {
466
+ return checker.getSymbolAtLocation(expr.name);
467
+ }
468
+ return undefined;
469
+ })();
470
+ if (!symbol)
471
+ return undefined;
472
+ const resolvedSymbol = symbol.flags & ts.SymbolFlags.Alias
473
+ ? checker.getAliasedSymbol(symbol)
474
+ : symbol;
475
+ const decls = resolvedSymbol.getDeclarations();
476
+ if (!decls || decls.length === 0)
477
+ return undefined;
478
+ const argCount = node.arguments?.length ?? 0;
479
+ const candidates = [];
480
+ for (const decl of decls) {
481
+ if (!ts.isFunctionLike(decl))
482
+ continue;
483
+ // Only include construct signatures / constructors for new expressions.
484
+ if (!ts.isConstructSignatureDeclaration(decl) && !ts.isConstructorDeclaration(decl)) {
485
+ continue;
486
+ }
487
+ const params = extractParameterNodes(decl);
488
+ const required = params.filter((p) => !p.isOptional && !p.isRest).length;
489
+ const hasRest = params.some((p) => p.isRest);
490
+ if (argCount < required)
491
+ continue;
492
+ if (!hasRest && argCount > params.length)
493
+ continue;
494
+ const sig = checker.getSignatureFromDeclaration(decl);
495
+ if (!sig)
496
+ continue;
497
+ candidates.push(getOrCreateSignatureId(sig));
498
+ }
499
+ return candidates.length > 0 ? candidates : undefined;
500
+ };
501
+ const resolveImport = (node) => {
502
+ const symbol = checker.getSymbolAtLocation(node.name);
503
+ if (!symbol)
504
+ return undefined;
505
+ const aliased = checker.getAliasedSymbol(symbol);
506
+ return getOrCreateDeclId(aliased);
507
+ };
508
+ const resolveShorthandAssignment = (node) => {
509
+ const symbol = checker.getShorthandAssignmentValueSymbol(node);
510
+ if (!symbol)
511
+ return undefined;
512
+ return getOrCreateDeclId(symbol);
513
+ };
514
+ const getDeclaringTypeNameOfMember = (member) => {
515
+ const key = `${member.declId.id}:${member.name}`;
516
+ const entry = memberMap.get(key);
517
+ const decl = entry?.decl;
518
+ if (!decl)
519
+ return undefined;
520
+ const parent = decl.parent;
521
+ if (ts.isInterfaceDeclaration(parent) && parent.name)
522
+ return parent.name.text;
523
+ if (ts.isClassDeclaration(parent) && parent.name)
524
+ return parent.name.text;
525
+ if (ts.isTypeAliasDeclaration(parent) && parent.name)
526
+ return parent.name.text;
527
+ // tsbindgen static containers can be emitted as:
528
+ // export const Foo: { bar(...): ... }
529
+ //
530
+ // In this case, member declarations live under a TypeLiteralNode whose parent
531
+ // is the VariableDeclaration for `Foo`. We treat `Foo` as the declaring "type"
532
+ // name for binding disambiguation purposes.
533
+ if (ts.isTypeLiteralNode(parent)) {
534
+ const container = parent.parent;
535
+ if (ts.isVariableDeclaration(container) && ts.isIdentifier(container.name)) {
536
+ return container.name.text;
537
+ }
538
+ }
539
+ return undefined;
540
+ };
541
+ const getSourceFilePathOfMember = (member) => {
542
+ const key = `${member.declId.id}:${member.name}`;
543
+ const entry = memberMap.get(key);
544
+ const decl = entry?.decl;
545
+ if (!decl)
546
+ return undefined;
547
+ return decl.getSourceFile().fileName;
548
+ };
549
+ const getFullyQualifiedName = (declId) => {
550
+ const entry = declMap.get(declId.id);
551
+ if (!entry)
552
+ return undefined;
553
+ return checker.getFullyQualifiedName(entry.symbol);
554
+ };
555
+ const getTypePredicateOfSignature = (sigId) => {
556
+ const entry = signatureMap.get(sigId.id);
557
+ if (!entry)
558
+ return undefined;
559
+ const predicate = checker.getTypePredicateOfSignature(entry.signature);
560
+ if (!predicate || predicate.kind !== ts.TypePredicateKind.Identifier) {
561
+ return undefined;
562
+ }
563
+ return {
564
+ kind: "typePredicate",
565
+ parameterIndex: predicate.parameterIndex ?? 0,
566
+ typeNode: predicate.type
567
+ ? checker.typeToTypeNode(predicate.type, undefined, ts.NodeBuilderFlags.None)
568
+ : undefined,
569
+ };
570
+ };
571
+ // ─────────────────────────────────────────────────────────────────────────
572
+ // HANDLE REGISTRY IMPLEMENTATION
573
+ // ─────────────────────────────────────────────────────────────────────────
574
+ const handleRegistry = {
575
+ getDecl: (id) => {
576
+ const entry = declMap.get(id.id);
577
+ if (!entry)
578
+ return undefined;
579
+ return {
580
+ typeNode: entry.typeNode,
581
+ kind: entry.kind,
582
+ fqName: entry.fqName,
583
+ declNode: entry.decl,
584
+ typeDeclNode: entry.typeDeclNode,
585
+ valueDeclNode: entry.valueDeclNode,
586
+ classMemberNames: entry.classMemberNames,
587
+ };
588
+ },
589
+ getSignature: (id) => {
590
+ const entry = signatureMap.get(id.id);
591
+ if (!entry)
592
+ return undefined;
593
+ return {
594
+ parameters: entry.parameters,
595
+ returnTypeNode: entry.returnTypeNode,
596
+ typeParameters: entry.typeParameters,
597
+ // CRITICAL for Alice's spec: declaring identity for resolveCall()
598
+ // Uses simple TS name, resolved via UnifiedTypeCatalog.resolveTsName()
599
+ declaringTypeTsName: entry.declaringTypeTsName,
600
+ declaringMemberName: entry.declaringMemberName,
601
+ // Type predicate extracted at registration time (Alice's spec)
602
+ typePredicate: entry.typePredicate,
603
+ };
604
+ },
605
+ getMember: (id) => {
606
+ const key = `${id.declId.id}:${id.name}`;
607
+ const entry = memberMap.get(key);
608
+ if (!entry)
609
+ return undefined;
610
+ return {
611
+ name: entry.name,
612
+ declNode: entry.decl,
613
+ typeNode: entry.typeNode,
614
+ isOptional: entry.isOptional,
615
+ isReadonly: entry.isReadonly,
616
+ };
617
+ },
618
+ getTypeSyntax: (id) => {
619
+ const entry = typeSyntaxMap.get(id.id);
620
+ if (!entry)
621
+ return undefined;
622
+ return {
623
+ typeNode: entry.typeNode,
624
+ };
625
+ },
626
+ };
627
+ // ─────────────────────────────────────────────────────────────────────────
628
+ // TYPE SYNTAX CAPTURE (Phase 2: TypeSyntaxId)
629
+ // ─────────────────────────────────────────────────────────────────────────
630
+ /**
631
+ * Capture a type syntax node for later conversion.
632
+ *
633
+ * This creates an opaque TypeSyntaxId handle that can be passed to
634
+ * TypeSystem.typeFromSyntax() for conversion. Used for inline type syntax
635
+ * that cannot be captured at catalog-build time.
636
+ */
637
+ const captureTypeSyntax = (node) => {
638
+ const id = makeTypeSyntaxId(nextTypeSyntaxId.value++);
639
+ typeSyntaxMap.set(id.id, { typeNode: node });
640
+ return id;
641
+ };
642
+ /**
643
+ * Capture multiple type arguments.
644
+ *
645
+ * Convenience method for capturing generic type arguments.
646
+ */
647
+ const captureTypeArgs = (nodes) => {
648
+ return nodes.map((node) => captureTypeSyntax(node));
649
+ };
650
+ return {
651
+ resolveIdentifier,
652
+ resolveTypeReference,
653
+ resolvePropertyAccess,
654
+ resolveElementAccess,
655
+ resolveCallSignature,
656
+ resolveCallSignatureCandidates,
657
+ resolveConstructorSignature,
658
+ resolveConstructorSignatureCandidates,
659
+ resolveImport,
660
+ resolveShorthandAssignment,
661
+ getDeclaringTypeNameOfMember,
662
+ getSourceFilePathOfMember,
663
+ getFullyQualifiedName,
664
+ getTypePredicateOfSignature,
665
+ // Type syntax capture (Phase 2: TypeSyntaxId)
666
+ captureTypeSyntax,
667
+ captureTypeArgs,
668
+ // Internal method for TypeSystem construction only
669
+ _getHandleRegistry: () => handleRegistry,
670
+ };
671
+ };
672
+ // ═══════════════════════════════════════════════════════════════════════════
673
+ // HELPER FUNCTIONS
674
+ // ═══════════════════════════════════════════════════════════════════════════
675
+ const getTypeNodeFromDeclaration = (decl) => {
676
+ if (ts.isVariableDeclaration(decl) && decl.type) {
677
+ return decl.type;
678
+ }
679
+ if (ts.isFunctionDeclaration(decl) || ts.isMethodDeclaration(decl)) {
680
+ return decl.type;
681
+ }
682
+ if (ts.isParameter(decl) && decl.type) {
683
+ return decl.type;
684
+ }
685
+ if (ts.isPropertyDeclaration(decl) && decl.type) {
686
+ return decl.type;
687
+ }
688
+ if (ts.isPropertySignature(decl) && decl.type) {
689
+ return decl.type;
690
+ }
691
+ if (ts.isTypeAliasDeclaration(decl)) {
692
+ return decl.type;
693
+ }
694
+ return undefined;
695
+ };
696
+ const getMemberTypeAnnotation = (decl) => {
697
+ if (ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl)) {
698
+ return decl.type;
699
+ }
700
+ if (ts.isMethodDeclaration(decl) || ts.isMethodSignature(decl)) {
701
+ // For methods, we could return a function type node if needed
702
+ return decl.type;
703
+ }
704
+ if (ts.isGetAccessorDeclaration(decl)) {
705
+ return decl.type;
706
+ }
707
+ if (ts.isSetAccessorDeclaration(decl)) {
708
+ // Setter declarations have no return type; use the value parameter type.
709
+ const valueParam = decl.parameters[0];
710
+ return valueParam?.type;
711
+ }
712
+ return undefined;
713
+ };
714
+ const getDeclKind = (decl) => {
715
+ if (ts.isVariableDeclaration(decl))
716
+ return "variable";
717
+ if (ts.isFunctionDeclaration(decl))
718
+ return "function";
719
+ if (ts.isClassDeclaration(decl))
720
+ return "class";
721
+ if (ts.isInterfaceDeclaration(decl))
722
+ return "interface";
723
+ if (ts.isTypeAliasDeclaration(decl))
724
+ return "typeAlias";
725
+ if (ts.isEnumDeclaration(decl))
726
+ return "enum";
727
+ if (ts.isParameter(decl))
728
+ return "parameter";
729
+ if (ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl))
730
+ return "property";
731
+ if (ts.isGetAccessorDeclaration(decl) || ts.isSetAccessorDeclaration(decl))
732
+ return "property";
733
+ if (ts.isMethodDeclaration(decl) || ts.isMethodSignature(decl))
734
+ return "method";
735
+ return "variable";
736
+ };
737
+ const getReturnTypeNode = (decl) => {
738
+ if (!decl)
739
+ return undefined;
740
+ return decl.type;
741
+ };
742
+ /**
743
+ * Extract and normalize parameter nodes from a signature declaration.
744
+ *
745
+ * ALICE'S SPEC: Parameter mode detection happens HERE during signature registration.
746
+ * If the parameter type is `ref<T>`, `out<T>`, or `in<T>`:
747
+ * - Set `mode` to that keyword
748
+ * - Set `typeNode` to the INNER T node (unwrapped)
749
+ *
750
+ * This is PURE SYNTAX inspection, no TS type inference.
751
+ */
752
+ const extractParameterNodes = (decl) => {
753
+ if (!decl)
754
+ return [];
755
+ return decl.parameters.map((p) => {
756
+ const normalized = normalizeParameterTypeNode(p.type);
757
+ return {
758
+ name: ts.isIdentifier(p.name) ? p.name.text : "param",
759
+ typeNode: normalized.typeNode,
760
+ isOptional: !!p.questionToken || !!p.initializer,
761
+ isRest: !!p.dotDotDotToken,
762
+ mode: normalized.mode,
763
+ };
764
+ });
765
+ };
766
+ /**
767
+ * Normalize a parameter type node by detecting ref<T>/out<T>/in<T> wrappers.
768
+ *
769
+ * This is PURE SYNTAX analysis - we look at the TypeNode AST structure:
770
+ * - If it's a TypeReferenceNode with identifier name "ref"/"out"/"in"
771
+ * - And exactly one type argument
772
+ * - Then unwrap to get the inner type
773
+ *
774
+ * @param typeNode The parameter's type node
775
+ * @returns { mode, typeNode } where typeNode is unwrapped if wrapper detected
776
+ */
777
+ const normalizeParameterTypeNode = (typeNode) => {
778
+ if (!typeNode) {
779
+ return { mode: "value", typeNode: undefined };
780
+ }
781
+ // Mirror IR conversion rules: wrappers may be nested and may appear in any order.
782
+ // - thisarg<T> marks an extension-method receiver parameter (erases for typing)
783
+ // - ref<T>/out<T>/in<T>/inref<T> set passing mode and erase to T for typing
784
+ let mode = "value";
785
+ let current = typeNode;
786
+ while (current) {
787
+ if (ts.isParenthesizedTypeNode(current)) {
788
+ current = current.type;
789
+ continue;
790
+ }
791
+ if (!ts.isTypeReferenceNode(current))
792
+ break;
793
+ if (!ts.isIdentifier(current.typeName))
794
+ break;
795
+ if (!current.typeArguments || current.typeArguments.length !== 1)
796
+ break;
797
+ const inner = current.typeArguments[0];
798
+ if (!inner)
799
+ break;
800
+ const wrapperName = current.typeName.text;
801
+ if (wrapperName === "thisarg") {
802
+ current = inner;
803
+ continue;
804
+ }
805
+ if (wrapperName === "ref" || wrapperName === "out") {
806
+ mode = wrapperName;
807
+ current = inner;
808
+ continue;
809
+ }
810
+ if (wrapperName === "in" || wrapperName === "inref") {
811
+ mode = "in";
812
+ current = inner;
813
+ continue;
814
+ }
815
+ break;
816
+ }
817
+ // No wrapper detected - regular parameter
818
+ return { mode, typeNode: current ?? typeNode };
819
+ };
820
+ const convertTypeParameterDeclarations = (typeParameters) => {
821
+ if (!typeParameters || typeParameters.length === 0)
822
+ return undefined;
823
+ return typeParameters.map((tp) => ({
824
+ name: tp.name.text,
825
+ constraintNode: tp.constraint,
826
+ defaultNode: tp.default,
827
+ }));
828
+ };
829
+ const extractTypeParameterNodes = (decl) => {
830
+ if (!decl)
831
+ return undefined;
832
+ // Constructor declarations don't have their own type parameters in TS syntax,
833
+ // but the enclosing class may be generic (class Box<T> { constructor(x: T) {} }).
834
+ // For constructor signature typing/inference, the relevant type parameters are the
835
+ // class type parameters.
836
+ if (ts.isConstructorDeclaration(decl)) {
837
+ const parent = decl.parent;
838
+ if (ts.isClassDeclaration(parent)) {
839
+ return convertTypeParameterDeclarations(parent.typeParameters);
840
+ }
841
+ return undefined;
842
+ }
843
+ return convertTypeParameterDeclarations(decl.typeParameters);
844
+ };
845
+ /**
846
+ * Extract type predicate from a signature's return type.
847
+ *
848
+ * ALICE'S SPEC: This is PURE SYNTAX inspection at registration time.
849
+ * We check if the return TypeNode is a TypePredicateNode (x is T or this is T).
850
+ * No TS type inference is used.
851
+ *
852
+ * @param returnTypeNode The signature's return type node
853
+ * @param decl The signature declaration (to find parameter index)
854
+ * @returns SignatureTypePredicate or undefined if not a predicate
855
+ */
856
+ const extractTypePredicate = (returnTypeNode, decl) => {
857
+ // Return type must be a TypePredicateNode
858
+ if (!returnTypeNode || !ts.isTypePredicateNode(returnTypeNode)) {
859
+ return undefined;
860
+ }
861
+ const predNode = returnTypeNode;
862
+ // Must have a target type
863
+ if (!predNode.type) {
864
+ return undefined;
865
+ }
866
+ // Check if it's "this is T" predicate
867
+ if (predNode.parameterName.kind === ts.SyntaxKind.ThisType) {
868
+ return {
869
+ kind: "this",
870
+ targetTypeNode: predNode.type,
871
+ };
872
+ }
873
+ // Check if it's "param is T" predicate
874
+ if (ts.isIdentifier(predNode.parameterName)) {
875
+ const paramName = predNode.parameterName.text;
876
+ // Find parameter index
877
+ const paramIndex = decl?.parameters.findIndex((p) => ts.isIdentifier(p.name) && p.name.text === paramName) ?? -1;
878
+ if (paramIndex >= 0) {
879
+ return {
880
+ kind: "param",
881
+ parameterName: paramName,
882
+ parameterIndex: paramIndex,
883
+ targetTypeNode: predNode.type,
884
+ };
885
+ }
886
+ }
887
+ return undefined;
888
+ };
889
+ const isOptionalMember = (symbol) => {
890
+ return (symbol.flags & ts.SymbolFlags.Optional) !== 0;
891
+ };
892
+ const isReadonlyMember = (decl) => {
893
+ if (!decl)
894
+ return false;
895
+ if (ts.isPropertyDeclaration(decl) || ts.isPropertySignature(decl)) {
896
+ return (decl.modifiers?.some((m) => m.kind === ts.SyntaxKind.ReadonlyKeyword) ??
897
+ false);
898
+ }
899
+ return false;
900
+ };
901
+ /**
902
+ * Extract declaring identity from a signature declaration.
903
+ *
904
+ * CRITICAL for Alice's spec: Without this, resolveCall() cannot compute
905
+ * inheritance substitution. It would have to "guess" the method name
906
+ * from the signature, which breaks on overloads, aliases, etc.
907
+ *
908
+ * DESIGN (Phase 5 Step 4): Store the declaring type as a **simple TS name**
909
+ * (identifier text like "Box"), NOT a TS "fully qualified name". TypeSystem
910
+ * uses UnifiedTypeCatalog.resolveTsName() to resolve this to the proper
911
+ * CLR FQ name for inheritance substitution.
912
+ *
913
+ * @param decl The signature declaration (method, function, etc.)
914
+ * @param _checker TypeChecker (kept for backwards compatibility, unused)
915
+ * @returns { typeTsName, memberName } or undefined if not a member
916
+ */
917
+ const extractDeclaringIdentity = (decl, _checker) => {
918
+ if (!decl)
919
+ return undefined;
920
+ const normalizeTsbindgenTypeName = (name) => {
921
+ if (name.endsWith("$instance")) {
922
+ return name.slice(0, -"$instance".length);
923
+ }
924
+ if (name.startsWith("__") && name.endsWith("$views")) {
925
+ return name.slice(2, -"$views".length);
926
+ }
927
+ return name;
928
+ };
929
+ // Check if this is a method (class or interface member)
930
+ if (ts.isMethodDeclaration(decl) || ts.isMethodSignature(decl)) {
931
+ const parent = decl.parent;
932
+ // Get the method name
933
+ const memberName = ts.isIdentifier(decl.name)
934
+ ? decl.name.text
935
+ : (decl.name?.getText() ?? "unknown");
936
+ // Get the containing type's simple name (identifier text)
937
+ if (ts.isClassDeclaration(parent) || ts.isInterfaceDeclaration(parent)) {
938
+ if (parent.name) {
939
+ // Use the simple identifier text, not checker.getFullyQualifiedName
940
+ const typeTsName = normalizeTsbindgenTypeName(parent.name.text);
941
+ return { typeTsName, memberName };
942
+ }
943
+ }
944
+ // tsbindgen static containers are commonly emitted as:
945
+ // export const Foo: { bar(...): ... }
946
+ //
947
+ // In this case, method signatures live under a TypeLiteralNode whose parent is
948
+ // the variable declaration for `Foo`. We still need declaring identity so
949
+ // TypeSystem can apply airplane-grade overload correction using CLR metadata.
950
+ if (ts.isTypeLiteralNode(parent)) {
951
+ const container = parent.parent;
952
+ if (ts.isVariableDeclaration(container) && ts.isIdentifier(container.name)) {
953
+ const typeTsName = normalizeTsbindgenTypeName(container.name.text);
954
+ return { typeTsName, memberName };
955
+ }
956
+ }
957
+ // Object literal method - use parent context
958
+ if (ts.isObjectLiteralExpression(parent)) {
959
+ // For object literals, we don't have a named type
960
+ return undefined;
961
+ }
962
+ }
963
+ // Constructor declarations
964
+ if (ts.isConstructorDeclaration(decl)) {
965
+ const parent = decl.parent;
966
+ if (ts.isClassDeclaration(parent) && parent.name) {
967
+ // Use the simple identifier text
968
+ const typeTsName = normalizeTsbindgenTypeName(parent.name.text);
969
+ return { typeTsName, memberName: "constructor" };
970
+ }
971
+ }
972
+ // Getter/setter declarations
973
+ if (ts.isGetAccessorDeclaration(decl) || ts.isSetAccessorDeclaration(decl)) {
974
+ const parent = decl.parent;
975
+ const memberName = ts.isIdentifier(decl.name)
976
+ ? decl.name.text
977
+ : (decl.name?.getText() ?? "unknown");
978
+ if (ts.isClassDeclaration(parent) || ts.isInterfaceDeclaration(parent)) {
979
+ if (parent.name) {
980
+ // Use the simple identifier text
981
+ const typeTsName = normalizeTsbindgenTypeName(parent.name.text);
982
+ return { typeTsName, memberName };
983
+ }
984
+ }
985
+ }
986
+ // Standalone functions don't have a declaring type
987
+ return undefined;
988
+ };
989
+ /**
990
+ * Extract class member names from a ClassDeclaration.
991
+ *
992
+ * ALICE'S SPEC: This is PURE SYNTAX inspection at registration time.
993
+ * We iterate class members and collect method/property names.
994
+ * This data is used by TypeSystem.checkTsClassMemberOverride without
995
+ * needing to inspect TS AST nodes or use hardcoded SyntaxKind numbers.
996
+ *
997
+ * @param classDecl The class declaration node
998
+ * @returns ClassMemberNames with method and property name sets
999
+ */
1000
+ const extractClassMemberNames = (classDecl) => {
1001
+ const methods = new Set();
1002
+ const properties = new Set();
1003
+ for (const member of classDecl.members) {
1004
+ // Get member name if it has an identifier
1005
+ const name = ts.isMethodDeclaration(member)
1006
+ ? ts.isIdentifier(member.name)
1007
+ ? member.name.text
1008
+ : undefined
1009
+ : ts.isPropertyDeclaration(member)
1010
+ ? ts.isIdentifier(member.name)
1011
+ ? member.name.text
1012
+ : undefined
1013
+ : ts.isGetAccessorDeclaration(member) ||
1014
+ ts.isSetAccessorDeclaration(member)
1015
+ ? ts.isIdentifier(member.name)
1016
+ ? member.name.text
1017
+ : undefined
1018
+ : undefined;
1019
+ if (!name)
1020
+ continue;
1021
+ if (ts.isMethodDeclaration(member)) {
1022
+ methods.add(name);
1023
+ }
1024
+ else if (ts.isPropertyDeclaration(member)) {
1025
+ properties.add(name);
1026
+ }
1027
+ else if (ts.isGetAccessorDeclaration(member) ||
1028
+ ts.isSetAccessorDeclaration(member)) {
1029
+ // Accessors are treated as properties for override detection
1030
+ properties.add(name);
1031
+ }
1032
+ }
1033
+ return { methods, properties };
1034
+ };
1035
+ //# sourceMappingURL=index.js.map