@tsonic/frontend 0.0.61 → 0.0.63

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