@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
@@ -14,1035 +14,12 @@
14
14
  */
15
15
  import * as fs from "fs";
16
16
  import * as path from "path";
17
- import * as ts from "typescript";
18
- import { tsbindgenClrTypeNameToTsTypeName } from "../../../../tsbindgen/names.js";
19
- import { makeTypeId, parseStableId } from "./types.js";
17
+ import { convertRawType, enrichAssemblyEntriesFromTsBindgenDts, } from "./clr-entry-converter.js";
20
18
  // ═══════════════════════════════════════════════════════════════════════════
21
- // CLR TYPE STRING PARSING
19
+ // BARREL RE-EXPORTS
22
20
  // ═══════════════════════════════════════════════════════════════════════════
23
- /**
24
- * Parse a CLR type string from normalized signature into IrType.
25
- *
26
- * Examples:
27
- * - "System.String" → { kind: "primitiveType", name: "string" }
28
- * - "System.Int32" → { kind: "primitiveType", name: "int" }
29
- * - "System.Double" → { kind: "primitiveType", name: "number" }
30
- * - "System.Boolean" → { kind: "primitiveType", name: "boolean" }
31
- * - "System.Char" → { kind: "primitiveType", name: "char" }
32
- * - "System.Void" → { kind: "voidType" }
33
- * - "System.Object" → { kind: "referenceType", name: "object" }
34
- * - "T" → { kind: "typeParameterType", name: "T" }
35
- * - "System.Collections.Generic.List`1[[T]]" → array type or reference
36
- * - "T[]" → { kind: "arrayType", elementType: ... }
37
- */
38
- const parseClrTypeString = (clrType) => {
39
- // Handle void
40
- if (clrType === "System.Void" || clrType === "void") {
41
- return { kind: "voidType" };
42
- }
43
- // Handle primitive mappings
44
- const primitiveMap = {
45
- "System.String": { kind: "primitiveType", name: "string" },
46
- string: { kind: "primitiveType", name: "string" },
47
- "System.Int32": { kind: "primitiveType", name: "int" },
48
- int: { kind: "primitiveType", name: "int" },
49
- // Distinct CLR numeric aliases from @tsonic/core
50
- "System.SByte": { kind: "referenceType", name: "sbyte" },
51
- sbyte: { kind: "referenceType", name: "sbyte" },
52
- "System.Byte": { kind: "referenceType", name: "byte" },
53
- byte: { kind: "referenceType", name: "byte" },
54
- "System.Int16": { kind: "referenceType", name: "short" },
55
- short: { kind: "referenceType", name: "short" },
56
- "System.UInt16": { kind: "referenceType", name: "ushort" },
57
- ushort: { kind: "referenceType", name: "ushort" },
58
- "System.UInt32": { kind: "referenceType", name: "uint" },
59
- uint: { kind: "referenceType", name: "uint" },
60
- "System.Int64": { kind: "referenceType", name: "long" },
61
- long: { kind: "referenceType", name: "long" },
62
- "System.UInt64": { kind: "referenceType", name: "ulong" },
63
- ulong: { kind: "referenceType", name: "ulong" },
64
- "System.IntPtr": { kind: "referenceType", name: "nint" },
65
- nint: { kind: "referenceType", name: "nint" },
66
- "System.UIntPtr": { kind: "referenceType", name: "nuint" },
67
- nuint: { kind: "referenceType", name: "nuint" },
68
- "System.Int128": { kind: "referenceType", name: "int128" },
69
- int128: { kind: "referenceType", name: "int128" },
70
- "System.UInt128": { kind: "referenceType", name: "uint128" },
71
- uint128: { kind: "referenceType", name: "uint128" },
72
- "System.Double": { kind: "primitiveType", name: "number" },
73
- double: { kind: "primitiveType", name: "number" },
74
- "System.Single": { kind: "referenceType", name: "float" },
75
- float: { kind: "referenceType", name: "float" },
76
- "System.Half": { kind: "referenceType", name: "half" },
77
- half: { kind: "referenceType", name: "half" },
78
- "System.Decimal": { kind: "referenceType", name: "decimal" },
79
- decimal: { kind: "referenceType", name: "decimal" },
80
- "System.Boolean": { kind: "primitiveType", name: "boolean" },
81
- bool: { kind: "primitiveType", name: "boolean" },
82
- "System.Char": { kind: "primitiveType", name: "char" },
83
- char: { kind: "primitiveType", name: "char" },
84
- // System.Object is the CLR "top" reference type. Treat it as C# `object`,
85
- // not TypeScript `any` (airplane-grade: no implicit "any" in IR).
86
- "System.Object": { kind: "referenceType", name: "object" },
87
- object: { kind: "referenceType", name: "object" },
88
- };
89
- const primitive = primitiveMap[clrType];
90
- if (primitive)
91
- return primitive;
92
- // Handle array types: T[] or System.Array`1[[T]]
93
- if (clrType.endsWith("[]")) {
94
- const elementType = clrType.slice(0, -2);
95
- return {
96
- kind: "arrayType",
97
- elementType: parseClrTypeString(elementType),
98
- };
99
- }
100
- // Handle pointer types (convert to ref semantics - just use the base type)
101
- if (clrType.endsWith("*")) {
102
- return parseClrTypeString(clrType.slice(0, -1));
103
- }
104
- // Handle nullable: Nullable<T> or T?
105
- if (clrType.startsWith("System.Nullable`1")) {
106
- // Extract inner type
107
- const innerMatch = clrType.match(/System\.Nullable`1\[\[([^\]]+)\]\]/);
108
- if (innerMatch && innerMatch[1]) {
109
- const innerType = parseClrTypeString(innerMatch[1]);
110
- return {
111
- kind: "unionType",
112
- types: [innerType, { kind: "primitiveType", name: "undefined" }],
113
- };
114
- }
115
- }
116
- // Handle type parameters (single uppercase letter or common patterns)
117
- if (/^T\d*$/.test(clrType) || /^T[A-Z][a-zA-Z]*$/.test(clrType)) {
118
- return { kind: "typeParameterType", name: clrType };
119
- }
120
- // Handle tsbindgen-style generic instantiations using underscore arity:
121
- // KeyValuePair_2[[TKey,TValue]]
122
- // This format is used in bindings.json for inheritance type arguments.
123
- const underscoreInstantiationMatch = clrType.match(/^(.+?)_(\d+)\[\[(.+)\]\]$/);
124
- if (underscoreInstantiationMatch &&
125
- underscoreInstantiationMatch[1] &&
126
- underscoreInstantiationMatch[2] &&
127
- underscoreInstantiationMatch[3]) {
128
- const baseName = underscoreInstantiationMatch[1];
129
- const arity = parseInt(underscoreInstantiationMatch[2], 10);
130
- const typeArgsStr = underscoreInstantiationMatch[3];
131
- // NOTE: CLR type strings inside normalized signatures often use assembly-qualified
132
- // type arguments (commas for AssemblyName/Version/Culture/PublicKeyToken).
133
- // Those commas are not type-argument separators. Only parse `[[...]]` payloads
134
- // that follow our deterministic tsbindgen encoding for bindings.json heritage
135
- // (no assembly identity segments).
136
- //
137
- // If we mis-parse assembly-qualified args, we break signatureKey matching which
138
- // hydrates optional/rest flags from tsbindgen .d.ts (airplane-grade determinism).
139
- const looksAssemblyQualified = /\bVersion=|\bCulture=|\bPublicKeyToken=/.test(typeArgsStr);
140
- const args = looksAssemblyQualified ? [] : splitTypeArguments(typeArgsStr);
141
- // Airplane-grade safety: only attach parsed typeArguments when we can prove
142
- // the arity matches. Otherwise, preserve only the generic *definition* arity
143
- // and keep the raw CLR string for later resolution.
144
- const typeArguments = !looksAssemblyQualified && args.length === arity
145
- ? args.map((arg) => parseClrTypeString(arg.trim()))
146
- : undefined;
147
- return {
148
- kind: "referenceType",
149
- name: `${baseName}_${arity}`,
150
- typeArguments,
151
- resolvedClrType: clrType,
152
- };
153
- }
154
- // Handle generic types: Name`N[[TypeArgs]]
155
- const genericMatch = clrType.match(/^(.+)`(\d+)(?:\[\[(.+)\]\])?$/);
156
- if (genericMatch && genericMatch[1] && genericMatch[2]) {
157
- const baseName = genericMatch[1];
158
- const arity = parseInt(genericMatch[2], 10);
159
- const typeArgsStr = genericMatch[3]; // May be undefined
160
- // Extract type arguments if present
161
- const typeArguments = [];
162
- if (typeArgsStr) {
163
- // Parse comma-separated type args (this is simplified, may need proper parsing)
164
- const args = splitTypeArguments(typeArgsStr);
165
- for (const arg of args) {
166
- typeArguments.push(parseClrTypeString(arg.trim()));
167
- }
168
- }
169
- else {
170
- // Generate placeholder type parameters
171
- for (let i = 0; i < arity; i++) {
172
- typeArguments.push({
173
- kind: "typeParameterType",
174
- name: i === 0 ? "T" : `T${i + 1}`,
175
- });
176
- }
177
- }
178
- return {
179
- kind: "referenceType",
180
- name: baseName,
181
- typeArguments: typeArguments.length > 0 ? typeArguments : undefined,
182
- resolvedClrType: clrType,
183
- };
184
- }
185
- // Default: treat as reference type
186
- return {
187
- kind: "referenceType",
188
- name: clrType,
189
- resolvedClrType: clrType,
190
- };
191
- };
192
- /**
193
- * Split type arguments handling nested brackets.
194
- */
195
- const splitTypeArguments = (str) => {
196
- const result = [];
197
- let depth = 0;
198
- let current = "";
199
- for (const char of str) {
200
- if (char === "[") {
201
- depth++;
202
- current += char;
203
- }
204
- else if (char === "]") {
205
- depth--;
206
- current += char;
207
- }
208
- else if (char === "," && depth === 0) {
209
- result.push(current.trim());
210
- current = "";
211
- }
212
- else {
213
- current += char;
214
- }
215
- }
216
- if (current.trim()) {
217
- result.push(current.trim());
218
- }
219
- return result;
220
- };
221
- // ═══════════════════════════════════════════════════════════════════════════
222
- // TSBINDGEN .D.TS HERITAGE EXTRACTION
223
- // ═══════════════════════════════════════════════════════════════════════════
224
- const INSTANCE_SUFFIX = "$instance";
225
- const VIEWS_PREFIX = "__";
226
- const VIEWS_SUFFIX = "$views";
227
- const stripTsBindgenInstanceSuffix = (name) => {
228
- return name.endsWith(INSTANCE_SUFFIX)
229
- ? name.slice(0, -INSTANCE_SUFFIX.length)
230
- : name;
231
- };
232
- const stripTsBindgenViewsWrapper = (name) => {
233
- if (!name.startsWith(VIEWS_PREFIX))
234
- return undefined;
235
- if (!name.endsWith(VIEWS_SUFFIX))
236
- return undefined;
237
- return name.slice(VIEWS_PREFIX.length, -VIEWS_SUFFIX.length);
238
- };
239
- const getRightmostQualifiedNameText = (name) => {
240
- if (ts.isIdentifier(name))
241
- return name.text;
242
- return getRightmostQualifiedNameText(name.right);
243
- };
244
- const getRightmostPropertyAccessText = (expr) => {
245
- if (ts.isIdentifier(expr))
246
- return expr.text;
247
- if (ts.isPropertyAccessExpression(expr))
248
- return expr.name.text;
249
- if (ts.isCallExpression(expr))
250
- return getRightmostPropertyAccessText(expr.expression);
251
- if (ts.isParenthesizedExpression(expr))
252
- return getRightmostPropertyAccessText(expr.expression);
253
- return undefined;
254
- };
255
- const dtsTypeNodeToIrType = (node, inScopeTypeParams, tsNameToTypeId) => {
256
- // Parenthesized type
257
- if (ts.isParenthesizedTypeNode(node)) {
258
- return dtsTypeNodeToIrType(node.type, inScopeTypeParams, tsNameToTypeId);
259
- }
260
- // Type references (including type parameters)
261
- if (ts.isTypeReferenceNode(node)) {
262
- const rawName = getRightmostQualifiedNameText(node.typeName);
263
- const baseName = stripTsBindgenInstanceSuffix(rawName);
264
- // tsbindgen imports CLR numeric aliases from @tsonic/core as type references.
265
- // For IR purposes, `int` is a distinct primitive type (not referenceType).
266
- if (baseName === "int" && !node.typeArguments?.length) {
267
- return { kind: "primitiveType", name: "int" };
268
- }
269
- // Type parameter reference: `T` (no type args) where T is in scope
270
- if (inScopeTypeParams.has(baseName) && !node.typeArguments?.length) {
271
- return { kind: "typeParameterType", name: baseName };
272
- }
273
- const typeArguments = node.typeArguments?.map((a) => dtsTypeNodeToIrType(a, inScopeTypeParams, tsNameToTypeId));
274
- const resolvedName = typeArguments && typeArguments.length > 0
275
- ? (() => {
276
- const arityName = `${baseName}_${typeArguments.length}`;
277
- return tsNameToTypeId.has(arityName) ? arityName : baseName;
278
- })()
279
- : baseName;
280
- return {
281
- kind: "referenceType",
282
- name: resolvedName,
283
- typeArguments: typeArguments && typeArguments.length > 0 ? typeArguments : undefined,
284
- };
285
- }
286
- // Array types
287
- if (ts.isArrayTypeNode(node)) {
288
- return {
289
- kind: "arrayType",
290
- elementType: dtsTypeNodeToIrType(node.elementType, inScopeTypeParams, tsNameToTypeId),
291
- };
292
- }
293
- // Union / intersection
294
- if (ts.isUnionTypeNode(node)) {
295
- return {
296
- kind: "unionType",
297
- types: node.types.map((t) => dtsTypeNodeToIrType(t, inScopeTypeParams, tsNameToTypeId)),
298
- };
299
- }
300
- if (ts.isIntersectionTypeNode(node)) {
301
- return {
302
- kind: "intersectionType",
303
- types: node.types.map((t) => dtsTypeNodeToIrType(t, inScopeTypeParams, tsNameToTypeId)),
304
- };
305
- }
306
- // Literal types
307
- if (ts.isLiteralTypeNode(node)) {
308
- const lit = node.literal;
309
- if (ts.isStringLiteral(lit))
310
- return { kind: "literalType", value: lit.text };
311
- if (ts.isNumericLiteral(lit))
312
- return { kind: "literalType", value: Number(lit.text) };
313
- if (lit.kind === ts.SyntaxKind.TrueKeyword)
314
- return { kind: "literalType", value: true };
315
- if (lit.kind === ts.SyntaxKind.FalseKeyword)
316
- return { kind: "literalType", value: false };
317
- }
318
- // Keywords
319
- switch (node.kind) {
320
- case ts.SyntaxKind.StringKeyword:
321
- return { kind: "primitiveType", name: "string" };
322
- case ts.SyntaxKind.NumberKeyword:
323
- return { kind: "primitiveType", name: "number" };
324
- case ts.SyntaxKind.BooleanKeyword:
325
- return { kind: "primitiveType", name: "boolean" };
326
- case ts.SyntaxKind.VoidKeyword:
327
- return { kind: "voidType" };
328
- case ts.SyntaxKind.AnyKeyword:
329
- return { kind: "anyType" };
330
- case ts.SyntaxKind.UnknownKeyword:
331
- return { kind: "unknownType" };
332
- case ts.SyntaxKind.NeverKeyword:
333
- return { kind: "neverType" };
334
- case ts.SyntaxKind.NullKeyword:
335
- return { kind: "primitiveType", name: "null" };
336
- case ts.SyntaxKind.UndefinedKeyword:
337
- return { kind: "primitiveType", name: "undefined" };
338
- default:
339
- return { kind: "unknownType" };
340
- }
341
- };
342
- const irTypeToSignatureKey = (type) => {
343
- switch (type.kind) {
344
- case "primitiveType":
345
- return `p:${type.name}`;
346
- case "literalType":
347
- return `lit:${JSON.stringify(type.value)}`;
348
- case "voidType":
349
- return "void";
350
- case "neverType":
351
- return "never";
352
- case "unknownType":
353
- return "unknown";
354
- case "anyType":
355
- return "any";
356
- case "typeParameterType":
357
- // Canonicalize all type parameters to a stable placeholder so tsbindgen's
358
- // `TContext` matches metadata's `T0`/`T` deterministically.
359
- return "T";
360
- case "arrayType":
361
- return `${irTypeToSignatureKey(type.elementType)}[]`;
362
- case "tupleType":
363
- return `[${type.elementTypes
364
- .map((t) => (t ? irTypeToSignatureKey(t) : "unknown"))
365
- .join(",")}]`;
366
- case "unionType": {
367
- const parts = type.types
368
- .map((t) => (t ? irTypeToSignatureKey(t) : "unknown"))
369
- .sort();
370
- return `(${parts.join("|")})`;
371
- }
372
- case "intersectionType": {
373
- const parts = type.types
374
- .map((t) => (t ? irTypeToSignatureKey(t) : "unknown"))
375
- .sort();
376
- return `(${parts.join("&")})`;
377
- }
378
- case "dictionaryType":
379
- return `{[${irTypeToSignatureKey(type.keyType)}]:${irTypeToSignatureKey(type.valueType)}}`;
380
- case "functionType": {
381
- const params = type.parameters
382
- .map((p) => (p.type ? irTypeToSignatureKey(p.type) : "unknown"))
383
- .join(",");
384
- return `fn(${params})->${irTypeToSignatureKey(type.returnType)}`;
385
- }
386
- case "objectType":
387
- return "object";
388
- case "referenceType": {
389
- const raw = type.resolvedClrType ?? type.name;
390
- const withoutArgs = raw.includes("[[") ? raw.split("[[")[0] ?? raw : raw;
391
- const lastSep = Math.max(withoutArgs.lastIndexOf("."), withoutArgs.lastIndexOf("+"));
392
- let simple = lastSep >= 0 ? withoutArgs.slice(lastSep + 1) : withoutArgs;
393
- // Canonicalize CLR backtick arity: `Action`1` -> `Action_1`.
394
- const backtickMatch = simple.match(/`(\d+)$/);
395
- if (backtickMatch && backtickMatch[1]) {
396
- simple = `${simple.slice(0, -backtickMatch[0].length)}_${backtickMatch[1]}`;
397
- }
398
- const underscoreMatch = simple.match(/_(\d+)$/);
399
- const arity = underscoreMatch && underscoreMatch[1] ? Number(underscoreMatch[1]) : undefined;
400
- const argCount = type.typeArguments?.length ?? arity ?? 0;
401
- // Signature matching is used only to hydrate optional/rest flags from tsbindgen .d.ts
402
- // into CLR metadata signatures. To keep matching robust across:
403
- // - CLR names vs TS names
404
- // - generic instantiation encodings (Action_1[[...]] vs Action_1<T>)
405
- // we intentionally ignore concrete type argument *identities* and retain only arity.
406
- if (argCount <= 0)
407
- return simple;
408
- return `${simple}<${Array.from({ length: argCount }, () => "*").join(",")}>`;
409
- }
410
- default:
411
- return "unknown";
412
- }
413
- };
414
- const makeMethodSignatureKey = (args) => {
415
- const params = args.parameters
416
- .map((p) => `${p.isRest ? "..." : ""}${irTypeToSignatureKey(p.type)}`)
417
- .join(",");
418
- return `${args.isStatic ? "static" : "instance"}|${args.name}|${args.typeParamCount}|(${params})->${irTypeToSignatureKey(args.returnType)}`;
419
- };
420
- const extractHeritageFromTsBindgenDts = (dtsPath, tsNameToTypeId, entries) => {
421
- const typeParametersByTsName = new Map();
422
- const heritageByTsName = new Map();
423
- const memberTypesByTsName = new Map();
424
- const methodSignatureOptionalsByTsName = new Map();
425
- const content = fs.readFileSync(dtsPath, "utf-8");
426
- const sf = ts.createSourceFile(dtsPath, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
427
- const getEntry = (tsName) => {
428
- const id = tsNameToTypeId.get(tsName);
429
- return id ? entries.get(id.stableId) : undefined;
430
- };
431
- const addEdge = (sourceTsName, edge) => {
432
- const list = heritageByTsName.get(sourceTsName) ?? [];
433
- list.push(edge);
434
- heritageByTsName.set(sourceTsName, list);
435
- };
436
- const recordMemberType = (sourceTsName, memberName, type) => {
437
- const map = memberTypesByTsName.get(sourceTsName) ?? new Map();
438
- // Prefer first-seen type for determinism; later duplicates are ignored.
439
- if (!map.has(memberName)) {
440
- map.set(memberName, type);
441
- memberTypesByTsName.set(sourceTsName, map);
442
- }
443
- };
444
- const recordMethodSignatureOptionals = (sourceTsName, signatureKey, optionals) => {
445
- const map = methodSignatureOptionalsByTsName.get(sourceTsName) ??
446
- new Map();
447
- // Prefer first-seen for determinism; later duplicates are ignored.
448
- if (!map.has(signatureKey)) {
449
- map.set(signatureKey, optionals);
450
- methodSignatureOptionalsByTsName.set(sourceTsName, map);
451
- }
452
- };
453
- const getPropertyNameText = (name) => {
454
- if (ts.isIdentifier(name))
455
- return name.text;
456
- if (ts.isStringLiteral(name))
457
- return name.text;
458
- if (ts.isNumericLiteral(name))
459
- return name.text;
460
- return undefined;
461
- };
462
- const extractMethodSignatureOptionalsFromMembers = (baseTsName, members, typeTypeParams, staticOverride) => {
463
- const typeScope = new Set(typeTypeParams);
464
- for (const member of members) {
465
- if (!ts.isMethodSignature(member) && !ts.isMethodDeclaration(member))
466
- continue;
467
- const methodName = member.name && ts.isIdentifier(member.name) ? member.name.text : undefined;
468
- if (!methodName)
469
- continue;
470
- const methodTypeParams = (member.typeParameters ?? []).map((p) => p.name.text);
471
- const inScopeTypeParams = new Set([
472
- ...Array.from(typeScope),
473
- ...methodTypeParams,
474
- ]);
475
- const params = [];
476
- for (const param of member.parameters) {
477
- if (!param.type) {
478
- // Deterministic: without an explicit type, we can't match this overload to metadata.
479
- params.length = 0;
480
- break;
481
- }
482
- params.push({
483
- type: dtsTypeNodeToIrType(param.type, inScopeTypeParams, tsNameToTypeId),
484
- isRest: param.dotDotDotToken !== undefined,
485
- isOptional: param.questionToken !== undefined || param.initializer !== undefined,
486
- });
487
- }
488
- if (params.length === 0 && member.parameters.length > 0) {
489
- continue;
490
- }
491
- const returnType = member.type
492
- ? dtsTypeNodeToIrType(member.type, inScopeTypeParams, tsNameToTypeId)
493
- : { kind: "voidType" };
494
- const isStatic = staticOverride ??
495
- (ts.isMethodDeclaration(member) &&
496
- (member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword) ??
497
- false));
498
- const signatureKey = makeMethodSignatureKey({
499
- isStatic,
500
- name: methodName,
501
- typeParamCount: methodTypeParams.length,
502
- parameters: params.map((p) => ({ type: p.type, isRest: p.isRest })),
503
- returnType,
504
- });
505
- recordMethodSignatureOptionals(baseTsName, signatureKey, params.map((p) => p.isOptional));
506
- }
507
- };
508
- const extractMemberTypesFromInstanceDecl = (baseTsName, members, inScopeTypeParams) => {
509
- for (const member of members) {
510
- if (ts.isPropertySignature(member)) {
511
- const nameText = member.name ? getPropertyNameText(member.name) : undefined;
512
- if (!nameText || !member.type)
513
- continue;
514
- recordMemberType(baseTsName, nameText, dtsTypeNodeToIrType(member.type, inScopeTypeParams, tsNameToTypeId));
515
- continue;
516
- }
517
- if (ts.isPropertyDeclaration(member)) {
518
- const nameText = member.name ? getPropertyNameText(member.name) : undefined;
519
- if (!nameText || !member.type)
520
- continue;
521
- recordMemberType(baseTsName, nameText, dtsTypeNodeToIrType(member.type, inScopeTypeParams, tsNameToTypeId));
522
- continue;
523
- }
524
- if (ts.isGetAccessorDeclaration(member)) {
525
- const nameText = member.name ? getPropertyNameText(member.name) : undefined;
526
- if (!nameText || !member.type)
527
- continue;
528
- recordMemberType(baseTsName, nameText, dtsTypeNodeToIrType(member.type, inScopeTypeParams, tsNameToTypeId));
529
- continue;
530
- }
531
- }
532
- };
533
- const computeEdgeKind = (source, target, preferred) => {
534
- if (preferred)
535
- return preferred;
536
- if (source.kind === "interface")
537
- return "extends";
538
- return target.kind === "interface" ? "implements" : "extends";
539
- };
540
- const addHeritageFromHeritageClauses = (sourceTsName, sourceEntry, inScopeTypeParams, clauses, forceKind) => {
541
- if (!clauses)
542
- return;
543
- for (const clause of clauses) {
544
- for (const t of clause.types) {
545
- const rawTarget = getRightmostPropertyAccessText(t.expression);
546
- if (!rawTarget)
547
- continue;
548
- const targetTsName = stripTsBindgenInstanceSuffix(rawTarget);
549
- const targetTypeId = tsNameToTypeId.get(targetTsName);
550
- if (!targetTypeId)
551
- continue;
552
- const targetEntry = entries.get(targetTypeId.stableId);
553
- if (!targetEntry)
554
- continue;
555
- const typeArguments = (t.typeArguments ?? []).map((a) => dtsTypeNodeToIrType(a, inScopeTypeParams, tsNameToTypeId));
556
- addEdge(sourceTsName, {
557
- kind: computeEdgeKind(sourceEntry, targetEntry, forceKind),
558
- targetStableId: targetTypeId.stableId,
559
- typeArguments,
560
- });
561
- }
562
- }
563
- };
564
- const addHeritageFromViewsInterface = (viewsDecl) => {
565
- const baseTsName = stripTsBindgenViewsWrapper(viewsDecl.name.text);
566
- if (!baseTsName)
567
- return;
568
- const sourceEntry = getEntry(baseTsName);
569
- if (!sourceEntry)
570
- return;
571
- const inScopeTypeParams = new Set((viewsDecl.typeParameters ?? []).map((p) => p.name.text));
572
- for (const m of viewsDecl.members) {
573
- if (!ts.isMethodSignature(m))
574
- continue;
575
- const methodName = m.name && ts.isIdentifier(m.name) ? m.name.text : undefined;
576
- if (!methodName || !methodName.startsWith("As_"))
577
- continue;
578
- if (!m.type)
579
- continue;
580
- const returnType = dtsTypeNodeToIrType(m.type, inScopeTypeParams, tsNameToTypeId);
581
- if (returnType.kind !== "referenceType")
582
- continue;
583
- const targetTsName = returnType.name;
584
- const targetTypeId = tsNameToTypeId.get(targetTsName);
585
- if (!targetTypeId)
586
- continue;
587
- const targetEntry = entries.get(targetTypeId.stableId);
588
- if (!targetEntry)
589
- continue;
590
- addEdge(baseTsName, {
591
- kind: computeEdgeKind(sourceEntry, targetEntry, "implements"),
592
- targetStableId: targetTypeId.stableId,
593
- typeArguments: returnType.typeArguments ?? [],
594
- });
595
- }
596
- };
597
- for (const stmt of sf.statements) {
598
- // export interface Foo$instance<T> ...
599
- if (ts.isInterfaceDeclaration(stmt) && stmt.name) {
600
- const nameText = stmt.name.text;
601
- // Views wrapper: __Foo$views<T> { As_IEnumerable_1(): IEnumerable_1$instance<T> }
602
- if (nameText.startsWith(VIEWS_PREFIX) && nameText.endsWith(VIEWS_SUFFIX)) {
603
- addHeritageFromViewsInterface(stmt);
604
- continue;
605
- }
606
- if (!nameText.endsWith(INSTANCE_SUFFIX))
607
- continue;
608
- const baseTsName = stripTsBindgenInstanceSuffix(nameText);
609
- const sourceEntry = getEntry(baseTsName);
610
- if (!sourceEntry)
611
- continue;
612
- const typeParams = (stmt.typeParameters ?? []).map((p) => p.name.text);
613
- if (!typeParametersByTsName.has(baseTsName)) {
614
- typeParametersByTsName.set(baseTsName, typeParams);
615
- }
616
- const inScopeTypeParams = new Set(typeParams);
617
- addHeritageFromHeritageClauses(baseTsName, sourceEntry, inScopeTypeParams, stmt.heritageClauses);
618
- extractMemberTypesFromInstanceDecl(baseTsName, stmt.members, inScopeTypeParams);
619
- extractMethodSignatureOptionalsFromMembers(baseTsName, stmt.members, typeParams);
620
- continue;
621
- }
622
- // export abstract class Foo$instance { ... } (static namespaces)
623
- if (ts.isClassDeclaration(stmt) && stmt.name) {
624
- const nameText = stmt.name.text;
625
- if (!nameText.endsWith(INSTANCE_SUFFIX))
626
- continue;
627
- const baseTsName = stripTsBindgenInstanceSuffix(nameText);
628
- const sourceEntry = getEntry(baseTsName);
629
- if (!sourceEntry)
630
- continue;
631
- const typeParams = (stmt.typeParameters ?? []).map((p) => p.name.text);
632
- if (!typeParametersByTsName.has(baseTsName)) {
633
- typeParametersByTsName.set(baseTsName, typeParams);
634
- }
635
- const inScopeTypeParams = new Set(typeParams);
636
- // In a class declaration, TS encodes extends/implements explicitly.
637
- if (stmt.heritageClauses) {
638
- for (const clause of stmt.heritageClauses) {
639
- if (clause.token === ts.SyntaxKind.ExtendsKeyword) {
640
- addHeritageFromHeritageClauses(baseTsName, sourceEntry, inScopeTypeParams, [clause], "extends");
641
- }
642
- else if (clause.token === ts.SyntaxKind.ImplementsKeyword) {
643
- addHeritageFromHeritageClauses(baseTsName, sourceEntry, inScopeTypeParams, [clause], "implements");
644
- }
645
- }
646
- }
647
- extractMemberTypesFromInstanceDecl(baseTsName, stmt.members, inScopeTypeParams);
648
- extractMethodSignatureOptionalsFromMembers(baseTsName, stmt.members, typeParams);
649
- }
650
- // tsbindgen emits static members and constructors as top-level const containers:
651
- // export const JsonValue: { create(...): JsonValue; new<T>(...): List_1<T>; ... }
652
- //
653
- // CLR metadata lacks optional parameter flags, so we hydrate them from the d.ts
654
- // surface to support deterministic arity checks (and thus overload correction).
655
- if (ts.isVariableStatement(stmt)) {
656
- for (const decl of stmt.declarationList.declarations) {
657
- if (!ts.isIdentifier(decl.name))
658
- continue;
659
- if (!decl.type || !ts.isTypeLiteralNode(decl.type))
660
- continue;
661
- const baseTsName = stripTsBindgenInstanceSuffix(decl.name.text);
662
- extractMethodSignatureOptionalsFromMembers(baseTsName, decl.type.members, [], true);
663
- }
664
- }
665
- }
666
- // Dedup + stable sort per type (determinism)
667
- const dedupedHeritageByTsName = new Map();
668
- for (const [tsName, edges] of heritageByTsName) {
669
- const seen = new Set();
670
- const unique = [];
671
- for (const e of edges) {
672
- const key = `${e.kind}|${e.targetStableId}|${JSON.stringify(e.typeArguments)}`;
673
- if (seen.has(key))
674
- continue;
675
- seen.add(key);
676
- unique.push(e);
677
- }
678
- unique.sort((a, b) => {
679
- const rank = (k) => (k === "extends" ? 0 : 1);
680
- const ra = rank(a.kind);
681
- const rb = rank(b.kind);
682
- if (ra !== rb)
683
- return ra - rb;
684
- const stable = a.targetStableId.localeCompare(b.targetStableId);
685
- if (stable !== 0)
686
- return stable;
687
- return JSON.stringify(a.typeArguments).localeCompare(JSON.stringify(b.typeArguments));
688
- });
689
- dedupedHeritageByTsName.set(tsName, unique);
690
- }
691
- return {
692
- typeParametersByTsName,
693
- heritageByTsName: dedupedHeritageByTsName,
694
- memberTypesByTsName,
695
- methodSignatureOptionalsByTsName,
696
- };
697
- };
698
- const enrichAssemblyEntriesFromTsBindgenDts = (entries, tsNameToTypeId, dtsPaths) => {
699
- const mergedMemberTypes = new Map();
700
- const mergedMethodSignatureOptionals = new Map();
701
- for (const dtsPath of dtsPaths) {
702
- try {
703
- const info = extractHeritageFromTsBindgenDts(dtsPath, tsNameToTypeId, entries);
704
- for (const [tsName, memberTypes] of info.memberTypesByTsName) {
705
- const merged = mergedMemberTypes.get(tsName) ?? new Map();
706
- for (const [memberName, type] of memberTypes) {
707
- if (!merged.has(memberName)) {
708
- merged.set(memberName, type);
709
- }
710
- }
711
- mergedMemberTypes.set(tsName, merged);
712
- }
713
- for (const [tsName, signatureOptionals] of info.methodSignatureOptionalsByTsName) {
714
- const merged = mergedMethodSignatureOptionals.get(tsName) ??
715
- new Map();
716
- for (const [sigKey, optionals] of signatureOptionals) {
717
- if (!merged.has(sigKey)) {
718
- merged.set(sigKey, optionals);
719
- }
720
- }
721
- mergedMethodSignatureOptionals.set(tsName, merged);
722
- }
723
- }
724
- catch (e) {
725
- console.warn(`Failed to parse tsbindgen d.ts for enrichment: ${dtsPath}`, e);
726
- }
727
- }
728
- // Apply merged info to entries
729
- for (const [tsName, typeId] of tsNameToTypeId) {
730
- const entry = entries.get(typeId.stableId);
731
- if (!entry)
732
- continue;
733
- const memberTypes = mergedMemberTypes.get(tsName);
734
- const signatureOptionals = mergedMethodSignatureOptionals.get(tsName);
735
- let updatedMembers;
736
- if (memberTypes) {
737
- for (const [memberName, type] of memberTypes) {
738
- const member = entry.members.get(memberName);
739
- if (!member)
740
- continue;
741
- if (!updatedMembers) {
742
- updatedMembers = new Map(entry.members);
743
- }
744
- updatedMembers.set(memberName, { ...member, type });
745
- }
746
- }
747
- if (signatureOptionals) {
748
- const currentMembers = updatedMembers ?? entry.members;
749
- for (const [memberName, member] of currentMembers) {
750
- if (member.memberKind !== "method" || !member.signatures)
751
- continue;
752
- let memberChanged = false;
753
- const updatedSignatures = member.signatures.map((sig) => {
754
- const signatureKey = makeMethodSignatureKey({
755
- isStatic: sig.isStatic,
756
- name: memberName,
757
- typeParamCount: sig.typeParameters.length,
758
- parameters: sig.parameters.map((p) => ({
759
- type: p.type,
760
- isRest: p.isRest,
761
- })),
762
- returnType: sig.returnType,
763
- });
764
- const optionals = signatureOptionals.get(signatureKey);
765
- if (!optionals)
766
- return sig;
767
- if (optionals.length !== sig.parameters.length)
768
- return sig;
769
- const updatedParams = sig.parameters.map((p, idx) => {
770
- const isOptional = optionals[idx];
771
- return isOptional === undefined || isOptional === p.isOptional
772
- ? p
773
- : { ...p, isOptional };
774
- });
775
- if (updatedParams.every((p, idx) => p === sig.parameters[idx])) {
776
- return sig;
777
- }
778
- memberChanged = true;
779
- return { ...sig, parameters: updatedParams };
780
- });
781
- if (!memberChanged)
782
- continue;
783
- if (!updatedMembers) {
784
- updatedMembers = new Map(entry.members);
785
- }
786
- updatedMembers.set(memberName, { ...member, signatures: updatedSignatures });
787
- }
788
- }
789
- if (!updatedMembers)
790
- continue;
791
- entries.set(typeId.stableId, { ...entry, members: updatedMembers });
792
- }
793
- };
794
- // ═══════════════════════════════════════════════════════════════════════════
795
- // NORMALIZED SIGNATURE PARSING
796
- // ═══════════════════════════════════════════════════════════════════════════
797
- /**
798
- * Parse type from normalized signature for properties.
799
- *
800
- * Format for regular properties: "Name|:ReturnType|static=bool|accessor=get"
801
- * Example: "Length|:System.Int32|static=false|accessor=get"
802
- *
803
- * Format for indexer properties: "Name|[IndexType]:ReturnType|static=bool|accessor=get"
804
- * Example: "Chars|[System.Int32]:System.Char|static=false|accessor=get"
805
- */
806
- const parsePropertyType = (normalizedSig) => {
807
- // Try indexer format first: Chars|[System.Int32]:System.Char|...
808
- const indexerMatch = normalizedSig.match(/\|\[[^\]]*\]:([^|]+)\|/);
809
- if (indexerMatch && indexerMatch[1]) {
810
- return parseClrTypeString(indexerMatch[1]);
811
- }
812
- // Try regular property format: Length|:System.Int32|...
813
- const colonMatch = normalizedSig.match(/\|:([^|]+)\|/);
814
- if (colonMatch && colonMatch[1]) {
815
- return parseClrTypeString(colonMatch[1]);
816
- }
817
- return { kind: "unknownType" };
818
- };
819
- /**
820
- * Parse type from normalized signature for fields.
821
- *
822
- * Format: "Name|Type|static=bool|const=bool"
823
- * Example: "Empty|System.String|static=true|const=false"
824
- */
825
- const parseFieldType = (normalizedSig) => {
826
- const parts = normalizedSig.split("|");
827
- if (parts.length >= 2 && parts[1]) {
828
- return parseClrTypeString(parts[1]);
829
- }
830
- return { kind: "unknownType" };
831
- };
832
- /**
833
- * Parse method signature from normalized signature.
834
- *
835
- * Format: "Name|(ParamTypes):ReturnType|static=bool"
836
- * Example: "Substring|(System.Int32,System.Int32):System.String|static=false"
837
- */
838
- const parseMethodSignature = (normalizedSig, method) => {
839
- // Parse return type
840
- const returnMatch = normalizedSig.match(/\):([^|]+)\|/);
841
- const returnType = returnMatch && returnMatch[1]
842
- ? parseClrTypeString(returnMatch[1])
843
- : { kind: "voidType" };
844
- // Parse parameter types
845
- const paramsMatch = normalizedSig.match(/\|\(([^)]*)\):/);
846
- const parameters = [];
847
- const modifierByIndex = new Map();
848
- for (const m of method.parameterModifiers ?? []) {
849
- if (m.modifier === "ref" || m.modifier === "out" || m.modifier === "in") {
850
- modifierByIndex.set(m.index, m.modifier);
851
- }
852
- }
853
- if (paramsMatch && paramsMatch[1]) {
854
- const paramTypes = splitTypeArguments(paramsMatch[1]);
855
- for (let i = 0; i < paramTypes.length; i++) {
856
- const rawParamType = paramTypes[i];
857
- if (!rawParamType)
858
- continue;
859
- let paramType = rawParamType.trim();
860
- let mode = modifierByIndex.get(i) ?? "value";
861
- // Handle ref/out/in modifiers
862
- if (paramType.endsWith("&")) {
863
- // tsbindgen normalized signatures mark byref with '&'. Use the more
864
- // precise modifier metadata when available.
865
- mode = modifierByIndex.get(i) ?? "ref";
866
- paramType = paramType.slice(0, -1);
867
- }
868
- parameters.push({
869
- name: `p${i}`, // We don't have parameter names in normalized signature
870
- type: parseClrTypeString(paramType),
871
- mode,
872
- isOptional: false,
873
- isRest: false,
874
- });
875
- }
876
- }
877
- const typeParameters = method.arity > 0
878
- ? Array.from({ length: method.arity }, (_, i) => ({ name: `T${i}` }))
879
- : [];
880
- return {
881
- stableId: method.stableId,
882
- parameters,
883
- returnType,
884
- typeParameters,
885
- parameterCount: method.parameterCount,
886
- isStatic: method.isStatic,
887
- isExtensionMethod: method.isExtensionMethod,
888
- sourceInterface: method.sourceInterface,
889
- normalizedSignature: normalizedSig,
890
- };
891
- };
892
- // ═══════════════════════════════════════════════════════════════════════════
893
- // RAW TYPE → NOMINAL ENTRY CONVERSION
894
- // ═══════════════════════════════════════════════════════════════════════════
895
- /**
896
- * Convert raw metadata type to NominalEntry.
897
- */
898
- const convertRawType = (rawType, _namespace) => {
899
- // Parse stableId
900
- const parsed = parseStableId(rawType.stableId);
901
- if (!parsed) {
902
- throw new Error(`Invalid stableId: ${rawType.stableId}`);
903
- }
904
- const typeId = makeTypeId(rawType.stableId, rawType.clrName, parsed.assemblyName, tsbindgenClrTypeNameToTsTypeName(rawType.clrName));
905
- // Convert kind
906
- const kindMap = {
907
- Class: "class",
908
- Interface: "interface",
909
- Struct: "struct",
910
- Enum: "enum",
911
- Delegate: "delegate",
912
- };
913
- const kind = kindMap[rawType.kind] ?? "class";
914
- // Convert properties to members
915
- const members = new Map();
916
- for (const prop of rawType.properties) {
917
- const propTsName = prop.clrName;
918
- const memberEntry = {
919
- tsName: propTsName,
920
- clrName: prop.clrName,
921
- memberKind: "property",
922
- type: parsePropertyType(prop.normalizedSignature),
923
- isStatic: prop.isStatic,
924
- isReadonly: !prop.hasSetter,
925
- isAbstract: prop.isAbstract,
926
- isVirtual: prop.isVirtual,
927
- isOverride: prop.isOverride,
928
- isIndexer: prop.isIndexer,
929
- hasGetter: prop.hasGetter,
930
- hasSetter: prop.hasSetter,
931
- stableId: prop.stableId,
932
- };
933
- members.set(propTsName, memberEntry);
934
- }
935
- // Convert fields to members
936
- for (const field of rawType.fields) {
937
- const fieldTsName = field.clrName;
938
- const memberEntry = {
939
- tsName: fieldTsName,
940
- clrName: field.clrName,
941
- memberKind: "field",
942
- type: parseFieldType(field.normalizedSignature),
943
- isStatic: field.isStatic,
944
- isReadonly: field.isReadOnly || field.isLiteral,
945
- isAbstract: false,
946
- isVirtual: false,
947
- isOverride: false,
948
- isIndexer: false,
949
- hasGetter: true,
950
- hasSetter: !field.isReadOnly && !field.isLiteral,
951
- stableId: field.stableId,
952
- };
953
- members.set(fieldTsName, memberEntry);
954
- }
955
- // Convert methods to members (grouped by name for overloads)
956
- const methodsByName = new Map();
957
- for (const method of rawType.methods) {
958
- const existing = methodsByName.get(method.clrName) ?? [];
959
- existing.push(method);
960
- methodsByName.set(method.clrName, existing);
961
- }
962
- for (const [methodName, overloads] of methodsByName) {
963
- const signatures = overloads.map((m) => parseMethodSignature(m.normalizedSignature, m));
964
- const first = overloads[0];
965
- if (!first)
966
- continue; // Should never happen since we only add non-empty arrays
967
- const memberEntry = {
968
- tsName: methodName,
969
- clrName: first.clrName,
970
- memberKind: "method",
971
- signatures,
972
- isStatic: first.isStatic,
973
- isReadonly: true, // methods are readonly
974
- isAbstract: first.isAbstract,
975
- isVirtual: first.isVirtual,
976
- isOverride: first.isOverride,
977
- isIndexer: false,
978
- hasGetter: false,
979
- hasSetter: false,
980
- stableId: first.stableId,
981
- };
982
- members.set(methodName, memberEntry);
983
- }
984
- const typeParameters = rawType.typeParameters && rawType.typeParameters.length === rawType.arity
985
- ? rawType.typeParameters.map((name) => ({ name }))
986
- : Array.from({ length: rawType.arity }, (_, i) => ({
987
- name: i === 0 ? "T" : `T${i + 1}`,
988
- }));
989
- const heritage = [];
990
- if (rawType.baseType) {
991
- heritage.push({
992
- kind: "extends",
993
- targetStableId: rawType.baseType.stableId,
994
- typeArguments: (rawType.baseType.typeArguments ?? []).map(parseClrTypeString),
995
- });
996
- }
997
- for (const iface of rawType.interfaces ?? []) {
998
- heritage.push({
999
- kind: "implements",
1000
- targetStableId: iface.stableId,
1001
- typeArguments: (iface.typeArguments ?? []).map(parseClrTypeString),
1002
- });
1003
- }
1004
- // Dedup + stable sort (airplane-grade determinism)
1005
- const heritageSeen = new Set();
1006
- const heritageDeduped = [];
1007
- for (const edge of heritage) {
1008
- const key = `${edge.kind}|${edge.targetStableId}|${JSON.stringify(edge.typeArguments)}`;
1009
- if (heritageSeen.has(key))
1010
- continue;
1011
- heritageSeen.add(key);
1012
- heritageDeduped.push(edge);
1013
- }
1014
- heritageDeduped.sort((a, b) => {
1015
- const rank = (k) => (k === "extends" ? 0 : 1);
1016
- const ra = rank(a.kind);
1017
- const rb = rank(b.kind);
1018
- if (ra !== rb)
1019
- return ra - rb;
1020
- const stable = a.targetStableId.localeCompare(b.targetStableId);
1021
- if (stable !== 0)
1022
- return stable;
1023
- return JSON.stringify(a.typeArguments).localeCompare(JSON.stringify(b.typeArguments));
1024
- });
1025
- // Convert accessibility
1026
- const accessibilityMap = {
1027
- Public: "public",
1028
- Internal: "internal",
1029
- Private: "private",
1030
- Protected: "protected",
1031
- };
1032
- const accessibility = accessibilityMap[rawType.accessibility] ?? "public";
1033
- return {
1034
- typeId,
1035
- kind,
1036
- typeParameters,
1037
- heritage: heritageDeduped,
1038
- members,
1039
- origin: "assembly",
1040
- accessibility,
1041
- isAbstract: rawType.isAbstract,
1042
- isSealed: rawType.isSealed,
1043
- isStatic: rawType.isStatic,
1044
- };
1045
- };
21
+ export { parseClrTypeString, splitTypeArguments, dtsTypeNodeToIrType, irTypeToSignatureKey, makeMethodSignatureKey, INSTANCE_SUFFIX, VIEWS_PREFIX, VIEWS_SUFFIX, stripTsBindgenInstanceSuffix, stripTsBindgenViewsWrapper, getRightmostQualifiedNameText, getRightmostPropertyAccessText, } from "./clr-type-parser.js";
22
+ export { extractHeritageFromTsBindgenDts, enrichAssemblyEntriesFromTsBindgenDts, parsePropertyType, parseFieldType, parseMethodSignature, convertRawType, } from "./clr-entry-converter.js";
1046
23
  // ═══════════════════════════════════════════════════════════════════════════
1047
24
  // FILE DISCOVERY AND LOADING
1048
25
  // ═══════════════════════════════════════════════════════════════════════════