@tsonic/frontend 0.0.14 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/graph/builder.js +2 -2
  3. package/dist/graph/builder.js.map +1 -1
  4. package/dist/graph/extraction/imports.js +1 -1
  5. package/dist/graph/extraction/imports.js.map +1 -1
  6. package/dist/graph/extraction/orchestrator.d.ts.map +1 -1
  7. package/dist/graph/extraction/orchestrator.js +1 -1
  8. package/dist/graph/extraction/orchestrator.js.map +1 -1
  9. package/dist/ir/binding/index.d.ts +134 -0
  10. package/dist/ir/binding/index.d.ts.map +1 -0
  11. package/dist/ir/binding/index.js +725 -0
  12. package/dist/ir/binding/index.js.map +1 -0
  13. package/dist/ir/binding-resolution.test.js +193 -52
  14. package/dist/ir/binding-resolution.test.js.map +1 -1
  15. package/dist/ir/builder/exports.d.ts +20 -2
  16. package/dist/ir/builder/exports.d.ts.map +1 -1
  17. package/dist/ir/builder/exports.js +65 -6
  18. package/dist/ir/builder/exports.js.map +1 -1
  19. package/dist/ir/builder/imports.d.ts +9 -5
  20. package/dist/ir/builder/imports.d.ts.map +1 -1
  21. package/dist/ir/builder/imports.js +20 -31
  22. package/dist/ir/builder/imports.js.map +1 -1
  23. package/dist/ir/builder/orchestrator.d.ts +10 -1
  24. package/dist/ir/builder/orchestrator.d.ts.map +1 -1
  25. package/dist/ir/builder/orchestrator.js +25 -14
  26. package/dist/ir/builder/orchestrator.js.map +1 -1
  27. package/dist/ir/builder/statements.d.ts +7 -1
  28. package/dist/ir/builder/statements.d.ts.map +1 -1
  29. package/dist/ir/builder/statements.js +7 -2
  30. package/dist/ir/builder/statements.js.map +1 -1
  31. package/dist/ir/builder/types.d.ts +3 -0
  32. package/dist/ir/builder/types.d.ts.map +1 -1
  33. package/dist/ir/builder/validation.d.ts +4 -1
  34. package/dist/ir/builder/validation.d.ts.map +1 -1
  35. package/dist/ir/builder/validation.js +37 -37
  36. package/dist/ir/builder/validation.js.map +1 -1
  37. package/dist/ir/builder.test.js +54 -111
  38. package/dist/ir/builder.test.js.map +1 -1
  39. package/dist/ir/clr-type-mappings.d.ts +42 -0
  40. package/dist/ir/clr-type-mappings.d.ts.map +1 -0
  41. package/dist/ir/clr-type-mappings.js +139 -0
  42. package/dist/ir/clr-type-mappings.js.map +1 -0
  43. package/dist/ir/converters/anonymous-synthesis.d.ts +30 -8
  44. package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -1
  45. package/dist/ir/converters/anonymous-synthesis.js +46 -55
  46. package/dist/ir/converters/anonymous-synthesis.js.map +1 -1
  47. package/dist/ir/converters/context.d.ts +40 -0
  48. package/dist/ir/converters/context.d.ts.map +1 -0
  49. package/dist/ir/converters/context.js +24 -0
  50. package/dist/ir/converters/context.js.map +1 -0
  51. package/dist/ir/converters/expressions/access.d.ts +6 -1
  52. package/dist/ir/converters/expressions/access.d.ts.map +1 -1
  53. package/dist/ir/converters/expressions/access.js +239 -15
  54. package/dist/ir/converters/expressions/access.js.map +1 -1
  55. package/dist/ir/converters/expressions/calls.d.ts +24 -3
  56. package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
  57. package/dist/ir/converters/expressions/calls.js +431 -391
  58. package/dist/ir/converters/expressions/calls.js.map +1 -1
  59. package/dist/ir/converters/expressions/collections.d.ts +16 -3
  60. package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
  61. package/dist/ir/converters/expressions/collections.js +300 -46
  62. package/dist/ir/converters/expressions/collections.js.map +1 -1
  63. package/dist/ir/converters/expressions/functions.d.ts +10 -3
  64. package/dist/ir/converters/expressions/functions.d.ts.map +1 -1
  65. package/dist/ir/converters/expressions/functions.js +140 -32
  66. package/dist/ir/converters/expressions/functions.js.map +1 -1
  67. package/dist/ir/converters/expressions/helpers.d.ts +22 -23
  68. package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
  69. package/dist/ir/converters/expressions/helpers.js +242 -239
  70. package/dist/ir/converters/expressions/helpers.js.map +1 -1
  71. package/dist/ir/converters/expressions/index.d.ts +1 -1
  72. package/dist/ir/converters/expressions/index.d.ts.map +1 -1
  73. package/dist/ir/converters/expressions/index.js +1 -1
  74. package/dist/ir/converters/expressions/index.js.map +1 -1
  75. package/dist/ir/converters/expressions/literals.d.ts +12 -12
  76. package/dist/ir/converters/expressions/literals.d.ts.map +1 -1
  77. package/dist/ir/converters/expressions/literals.js +62 -17
  78. package/dist/ir/converters/expressions/literals.js.map +1 -1
  79. package/dist/ir/converters/expressions/numeric-recovery.test.d.ts +5 -2
  80. package/dist/ir/converters/expressions/numeric-recovery.test.d.ts.map +1 -1
  81. package/dist/ir/converters/expressions/numeric-recovery.test.js +62 -49
  82. package/dist/ir/converters/expressions/numeric-recovery.test.js.map +1 -1
  83. package/dist/ir/converters/expressions/operators.d.ts +13 -4
  84. package/dist/ir/converters/expressions/operators.d.ts.map +1 -1
  85. package/dist/ir/converters/expressions/operators.js +179 -33
  86. package/dist/ir/converters/expressions/operators.js.map +1 -1
  87. package/dist/ir/converters/expressions/other.d.ts +11 -3
  88. package/dist/ir/converters/expressions/other.d.ts.map +1 -1
  89. package/dist/ir/converters/expressions/other.js +26 -10
  90. package/dist/ir/converters/expressions/other.js.map +1 -1
  91. package/dist/ir/converters/statements/control/blocks.d.ts +8 -2
  92. package/dist/ir/converters/statements/control/blocks.d.ts.map +1 -1
  93. package/dist/ir/converters/statements/control/blocks.js +7 -2
  94. package/dist/ir/converters/statements/control/blocks.js.map +1 -1
  95. package/dist/ir/converters/statements/control/conditionals.d.ts +14 -4
  96. package/dist/ir/converters/statements/control/conditionals.d.ts.map +1 -1
  97. package/dist/ir/converters/statements/control/conditionals.js +19 -10
  98. package/dist/ir/converters/statements/control/conditionals.js.map +1 -1
  99. package/dist/ir/converters/statements/control/exceptions.d.ts +10 -3
  100. package/dist/ir/converters/statements/control/exceptions.d.ts.map +1 -1
  101. package/dist/ir/converters/statements/control/exceptions.js +13 -7
  102. package/dist/ir/converters/statements/control/exceptions.js.map +1 -1
  103. package/dist/ir/converters/statements/control/loops.d.ts +16 -5
  104. package/dist/ir/converters/statements/control/loops.d.ts.map +1 -1
  105. package/dist/ir/converters/statements/control/loops.js +25 -15
  106. package/dist/ir/converters/statements/control/loops.js.map +1 -1
  107. package/dist/ir/converters/statements/declarations/classes/constructors.d.ts +3 -2
  108. package/dist/ir/converters/statements/declarations/classes/constructors.d.ts.map +1 -1
  109. package/dist/ir/converters/statements/declarations/classes/constructors.js +11 -7
  110. package/dist/ir/converters/statements/declarations/classes/constructors.js.map +1 -1
  111. package/dist/ir/converters/statements/declarations/classes/methods.d.ts +2 -1
  112. package/dist/ir/converters/statements/declarations/classes/methods.d.ts.map +1 -1
  113. package/dist/ir/converters/statements/declarations/classes/methods.js +63 -11
  114. package/dist/ir/converters/statements/declarations/classes/methods.js.map +1 -1
  115. package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts +2 -1
  116. package/dist/ir/converters/statements/declarations/classes/orchestrator.d.ts.map +1 -1
  117. package/dist/ir/converters/statements/declarations/classes/orchestrator.js +60 -40
  118. package/dist/ir/converters/statements/declarations/classes/orchestrator.js.map +1 -1
  119. package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts +6 -2
  120. package/dist/ir/converters/statements/declarations/classes/override-detection.d.ts.map +1 -1
  121. package/dist/ir/converters/statements/declarations/classes/override-detection.js +49 -50
  122. package/dist/ir/converters/statements/declarations/classes/override-detection.js.map +1 -1
  123. package/dist/ir/converters/statements/declarations/classes/properties.d.ts +9 -1
  124. package/dist/ir/converters/statements/declarations/classes/properties.d.ts.map +1 -1
  125. package/dist/ir/converters/statements/declarations/classes/properties.js +119 -16
  126. package/dist/ir/converters/statements/declarations/classes/properties.js.map +1 -1
  127. package/dist/ir/converters/statements/declarations/enums.d.ts +2 -1
  128. package/dist/ir/converters/statements/declarations/enums.d.ts.map +1 -1
  129. package/dist/ir/converters/statements/declarations/enums.js +8 -2
  130. package/dist/ir/converters/statements/declarations/enums.js.map +1 -1
  131. package/dist/ir/converters/statements/declarations/functions.d.ts +2 -1
  132. package/dist/ir/converters/statements/declarations/functions.d.ts.map +1 -1
  133. package/dist/ir/converters/statements/declarations/functions.js +11 -6
  134. package/dist/ir/converters/statements/declarations/functions.js.map +1 -1
  135. package/dist/ir/converters/statements/declarations/index.d.ts +3 -1
  136. package/dist/ir/converters/statements/declarations/index.d.ts.map +1 -1
  137. package/dist/ir/converters/statements/declarations/index.js +3 -1
  138. package/dist/ir/converters/statements/declarations/index.js.map +1 -1
  139. package/dist/ir/converters/statements/declarations/interfaces.d.ts +3 -2
  140. package/dist/ir/converters/statements/declarations/interfaces.d.ts.map +1 -1
  141. package/dist/ir/converters/statements/declarations/interfaces.js +26 -20
  142. package/dist/ir/converters/statements/declarations/interfaces.js.map +1 -1
  143. package/dist/ir/converters/statements/declarations/registry.d.ts +72 -0
  144. package/dist/ir/converters/statements/declarations/registry.d.ts.map +1 -1
  145. package/dist/ir/converters/statements/declarations/registry.js +92 -0
  146. package/dist/ir/converters/statements/declarations/registry.js.map +1 -1
  147. package/dist/ir/converters/statements/declarations/type-aliases.d.ts +2 -1
  148. package/dist/ir/converters/statements/declarations/type-aliases.d.ts.map +1 -1
  149. package/dist/ir/converters/statements/declarations/type-aliases.js +6 -4
  150. package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
  151. package/dist/ir/converters/statements/declarations/variables.d.ts +11 -1
  152. package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
  153. package/dist/ir/converters/statements/declarations/variables.js +123 -19
  154. package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
  155. package/dist/ir/converters/statements/declarations.d.ts +4 -1
  156. package/dist/ir/converters/statements/declarations.d.ts.map +1 -1
  157. package/dist/ir/converters/statements/declarations.js +4 -1
  158. package/dist/ir/converters/statements/declarations.js.map +1 -1
  159. package/dist/ir/converters/statements/helpers.d.ts +4 -3
  160. package/dist/ir/converters/statements/helpers.d.ts.map +1 -1
  161. package/dist/ir/converters/statements/helpers.js +55 -31
  162. package/dist/ir/converters/statements/helpers.js.map +1 -1
  163. package/dist/ir/converters/statements/index.d.ts +1 -1
  164. package/dist/ir/converters/statements/index.d.ts.map +1 -1
  165. package/dist/ir/converters/statements/index.js +2 -1
  166. package/dist/ir/converters/statements/index.js.map +1 -1
  167. package/dist/ir/expression-converter.d.ts +10 -3
  168. package/dist/ir/expression-converter.d.ts.map +1 -1
  169. package/dist/ir/expression-converter.js +132 -57
  170. package/dist/ir/expression-converter.js.map +1 -1
  171. package/dist/ir/hierarchical-bindings-e2e.test.js +10 -6
  172. package/dist/ir/hierarchical-bindings-e2e.test.js.map +1 -1
  173. package/dist/ir/index.d.ts +5 -0
  174. package/dist/ir/index.d.ts.map +1 -1
  175. package/dist/ir/index.js +5 -0
  176. package/dist/ir/index.js.map +1 -1
  177. package/dist/ir/no-ts-type-inference.test.d.ts +17 -0
  178. package/dist/ir/no-ts-type-inference.test.d.ts.map +1 -0
  179. package/dist/ir/no-ts-type-inference.test.js +171 -0
  180. package/dist/ir/no-ts-type-inference.test.js.map +1 -0
  181. package/dist/ir/program-context.d.ts +74 -0
  182. package/dist/ir/program-context.d.ts.map +1 -0
  183. package/dist/ir/program-context.js +286 -0
  184. package/dist/ir/program-context.js.map +1 -0
  185. package/dist/ir/statement-converter.d.ts +14 -4
  186. package/dist/ir/statement-converter.d.ts.map +1 -1
  187. package/dist/ir/statement-converter.js +31 -21
  188. package/dist/ir/statement-converter.js.map +1 -1
  189. package/dist/ir/syntax/binding-patterns.d.ts +22 -0
  190. package/dist/ir/syntax/binding-patterns.d.ts.map +1 -0
  191. package/dist/ir/syntax/binding-patterns.js +92 -0
  192. package/dist/ir/syntax/binding-patterns.js.map +1 -0
  193. package/dist/ir/thisarg-inference.test.d.ts +8 -0
  194. package/dist/ir/thisarg-inference.test.d.ts.map +1 -0
  195. package/dist/ir/thisarg-inference.test.js +94 -0
  196. package/dist/ir/thisarg-inference.test.js.map +1 -0
  197. package/dist/ir/type-converter.d.ts +5 -2
  198. package/dist/ir/type-converter.d.ts.map +1 -1
  199. package/dist/ir/type-converter.js +5 -2
  200. package/dist/ir/type-converter.js.map +1 -1
  201. package/dist/ir/type-system/core.d.ts +29 -0
  202. package/dist/ir/type-system/core.d.ts.map +1 -0
  203. package/dist/ir/type-system/core.js +456 -0
  204. package/dist/ir/type-system/core.js.map +1 -0
  205. package/dist/ir/type-system/index.d.ts +21 -0
  206. package/dist/ir/type-system/index.d.ts.map +1 -0
  207. package/dist/ir/type-system/index.js +43 -0
  208. package/dist/ir/type-system/index.js.map +1 -0
  209. package/dist/ir/type-system/internal/handle-types.d.ts +98 -0
  210. package/dist/ir/type-system/internal/handle-types.d.ts.map +1 -0
  211. package/dist/ir/type-system/internal/handle-types.js +13 -0
  212. package/dist/ir/type-system/internal/handle-types.js.map +1 -0
  213. package/dist/ir/type-system/internal/nominal-env.d.ts +66 -0
  214. package/dist/ir/type-system/internal/nominal-env.d.ts.map +1 -0
  215. package/dist/ir/type-system/internal/nominal-env.js +301 -0
  216. package/dist/ir/type-system/internal/nominal-env.js.map +1 -0
  217. package/dist/ir/type-system/internal/type-converter/arrays.d.ts +11 -0
  218. package/dist/ir/type-system/internal/type-converter/arrays.d.ts.map +1 -0
  219. package/dist/ir/{type-converter → type-system/internal/type-converter}/arrays.js +2 -2
  220. package/dist/ir/type-system/internal/type-converter/arrays.js.map +1 -0
  221. package/dist/ir/type-system/internal/type-converter/converter.d.ts +17 -0
  222. package/dist/ir/type-system/internal/type-converter/converter.d.ts.map +1 -0
  223. package/dist/ir/type-system/internal/type-converter/converter.js +16 -0
  224. package/dist/ir/type-system/internal/type-converter/converter.js.map +1 -0
  225. package/dist/ir/type-system/internal/type-converter/functions.d.ts +14 -0
  226. package/dist/ir/type-system/internal/type-converter/functions.d.ts.map +1 -0
  227. package/dist/ir/type-system/internal/type-converter/functions.js +66 -0
  228. package/dist/ir/type-system/internal/type-converter/functions.js.map +1 -0
  229. package/dist/ir/type-system/internal/type-converter/index.d.ts +11 -0
  230. package/dist/ir/type-system/internal/type-converter/index.d.ts.map +1 -0
  231. package/dist/ir/type-system/internal/type-converter/index.js +11 -0
  232. package/dist/ir/type-system/internal/type-converter/index.js.map +1 -0
  233. package/dist/ir/type-system/internal/type-converter/inference.d.ts +37 -0
  234. package/dist/ir/type-system/internal/type-converter/inference.d.ts.map +1 -0
  235. package/dist/ir/type-system/internal/type-converter/inference.js +32 -0
  236. package/dist/ir/type-system/internal/type-converter/inference.js.map +1 -0
  237. package/dist/ir/{type-converter → type-system/internal/type-converter}/literals.d.ts +1 -1
  238. package/dist/ir/type-system/internal/type-converter/literals.d.ts.map +1 -0
  239. package/dist/ir/type-system/internal/type-converter/literals.js.map +1 -0
  240. package/dist/ir/type-system/internal/type-converter/objects.d.ts +20 -0
  241. package/dist/ir/type-system/internal/type-converter/objects.d.ts.map +1 -0
  242. package/dist/ir/{type-converter → type-system/internal/type-converter}/objects.js +56 -6
  243. package/dist/ir/type-system/internal/type-converter/objects.js.map +1 -0
  244. package/dist/ir/{type-converter → type-system/internal/type-converter}/orchestrator.d.ts +3 -2
  245. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts.map +1 -0
  246. package/dist/ir/{type-converter → type-system/internal/type-converter}/orchestrator.js +63 -21
  247. package/dist/ir/type-system/internal/type-converter/orchestrator.js.map +1 -0
  248. package/dist/ir/type-system/internal/type-converter/patterns.d.ts +12 -0
  249. package/dist/ir/type-system/internal/type-converter/patterns.d.ts.map +1 -0
  250. package/dist/ir/{type-converter → type-system/internal/type-converter}/patterns.js +22 -6
  251. package/dist/ir/type-system/internal/type-converter/patterns.js.map +1 -0
  252. package/dist/ir/{type-converter → type-system/internal/type-converter}/primitives.d.ts +1 -1
  253. package/dist/ir/type-system/internal/type-converter/primitives.d.ts.map +1 -0
  254. package/dist/ir/type-system/internal/type-converter/primitives.js.map +1 -0
  255. package/dist/ir/{type-converter → type-system/internal/type-converter}/references.d.ts +3 -2
  256. package/dist/ir/type-system/internal/type-converter/references.d.ts.map +1 -0
  257. package/dist/ir/type-system/internal/type-converter/references.js +551 -0
  258. package/dist/ir/type-system/internal/type-converter/references.js.map +1 -0
  259. package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts +15 -0
  260. package/dist/ir/type-system/internal/type-converter/unions-intersections.d.ts.map +1 -0
  261. package/dist/ir/type-system/internal/type-converter/unions-intersections.js +22 -0
  262. package/dist/ir/type-system/internal/type-converter/unions-intersections.js.map +1 -0
  263. package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.d.ts +23 -36
  264. package/dist/ir/type-system/internal/type-converter/utility-types.d.ts.map +1 -0
  265. package/dist/ir/type-system/internal/type-converter/utility-types.js +879 -0
  266. package/dist/ir/type-system/internal/type-converter/utility-types.js.map +1 -0
  267. package/dist/ir/type-system/internal/type-converter/utility-types.test.d.ts.map +1 -0
  268. package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.test.js +398 -120
  269. package/dist/ir/type-system/internal/type-converter/utility-types.test.js.map +1 -0
  270. package/dist/ir/type-system/internal/type-converter.d.ts +9 -0
  271. package/dist/ir/type-system/internal/type-converter.d.ts.map +1 -0
  272. package/dist/ir/type-system/internal/type-converter.js +9 -0
  273. package/dist/ir/type-system/internal/type-converter.js.map +1 -0
  274. package/dist/ir/type-system/internal/type-registry.d.ts +107 -0
  275. package/dist/ir/type-system/internal/type-registry.d.ts.map +1 -0
  276. package/dist/ir/type-system/internal/type-registry.js +534 -0
  277. package/dist/ir/type-system/internal/type-registry.js.map +1 -0
  278. package/dist/ir/type-system/internal/universe/alias-table.d.ts +92 -0
  279. package/dist/ir/type-system/internal/universe/alias-table.d.ts.map +1 -0
  280. package/dist/ir/type-system/internal/universe/alias-table.js +222 -0
  281. package/dist/ir/type-system/internal/universe/alias-table.js.map +1 -0
  282. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts +44 -0
  283. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts.map +1 -0
  284. package/dist/ir/type-system/internal/universe/clr-catalog.js +1176 -0
  285. package/dist/ir/type-system/internal/universe/clr-catalog.js.map +1 -0
  286. package/dist/ir/type-system/internal/universe/index.d.ts +26 -0
  287. package/dist/ir/type-system/internal/universe/index.d.ts.map +1 -0
  288. package/dist/ir/type-system/internal/universe/index.js +30 -0
  289. package/dist/ir/type-system/internal/universe/index.js.map +1 -0
  290. package/dist/ir/type-system/internal/universe/resolution.d.ts +115 -0
  291. package/dist/ir/type-system/internal/universe/resolution.d.ts.map +1 -0
  292. package/dist/ir/type-system/internal/universe/resolution.js +181 -0
  293. package/dist/ir/type-system/internal/universe/resolution.js.map +1 -0
  294. package/dist/ir/type-system/internal/universe/source-catalog.d.ts +62 -0
  295. package/dist/ir/type-system/internal/universe/source-catalog.d.ts.map +1 -0
  296. package/dist/ir/type-system/internal/universe/source-catalog.js +91 -0
  297. package/dist/ir/type-system/internal/universe/source-catalog.js.map +1 -0
  298. package/dist/ir/type-system/internal/universe/types.d.ts +436 -0
  299. package/dist/ir/type-system/internal/universe/types.d.ts.map +1 -0
  300. package/dist/ir/type-system/internal/universe/types.js +69 -0
  301. package/dist/ir/type-system/internal/universe/types.js.map +1 -0
  302. package/dist/ir/type-system/internal/universe/unified-universe.d.ts +70 -0
  303. package/dist/ir/type-system/internal/universe/unified-universe.d.ts.map +1 -0
  304. package/dist/ir/type-system/internal/universe/unified-universe.js +319 -0
  305. package/dist/ir/type-system/internal/universe/unified-universe.js.map +1 -0
  306. package/dist/ir/type-system/type-system.d.ts +617 -0
  307. package/dist/ir/type-system/type-system.d.ts.map +1 -0
  308. package/dist/ir/type-system/type-system.js +2420 -0
  309. package/dist/ir/type-system/type-system.js.map +1 -0
  310. package/dist/ir/type-system/types.d.ts +176 -0
  311. package/dist/ir/type-system/types.d.ts.map +1 -0
  312. package/dist/ir/type-system/types.js +80 -0
  313. package/dist/ir/type-system/types.js.map +1 -0
  314. package/dist/ir/type-universe/assembly-catalog.d.ts +44 -0
  315. package/dist/ir/type-universe/assembly-catalog.d.ts.map +1 -0
  316. package/dist/ir/type-universe/assembly-catalog.js +532 -0
  317. package/dist/ir/type-universe/assembly-catalog.js.map +1 -0
  318. package/dist/ir/type-universe/assembly-catalog.test.d.ts +7 -0
  319. package/dist/ir/type-universe/assembly-catalog.test.d.ts.map +1 -0
  320. package/dist/ir/type-universe/assembly-catalog.test.js +105 -0
  321. package/dist/ir/type-universe/assembly-catalog.test.js.map +1 -0
  322. package/dist/ir/type-universe/index.d.ts +19 -0
  323. package/dist/ir/type-universe/index.d.ts.map +1 -0
  324. package/dist/ir/type-universe/index.js +21 -0
  325. package/dist/ir/type-universe/index.js.map +1 -0
  326. package/dist/ir/type-universe/types.d.ts +436 -0
  327. package/dist/ir/type-universe/types.d.ts.map +1 -0
  328. package/dist/ir/type-universe/types.js +69 -0
  329. package/dist/ir/type-universe/types.js.map +1 -0
  330. package/dist/ir/type-universe/unified-catalog.d.ts +70 -0
  331. package/dist/ir/type-universe/unified-catalog.d.ts.map +1 -0
  332. package/dist/ir/type-universe/unified-catalog.js +319 -0
  333. package/dist/ir/type-universe/unified-catalog.js.map +1 -0
  334. package/dist/ir/type-universe/unified-catalog.test.d.ts +7 -0
  335. package/dist/ir/type-universe/unified-catalog.test.d.ts.map +1 -0
  336. package/dist/ir/type-universe/unified-catalog.test.js +135 -0
  337. package/dist/ir/type-universe/unified-catalog.test.js.map +1 -0
  338. package/dist/ir/types/expressions.d.ts +33 -7
  339. package/dist/ir/types/expressions.d.ts.map +1 -1
  340. package/dist/ir/types/helpers.d.ts +22 -2
  341. package/dist/ir/types/helpers.d.ts.map +1 -1
  342. package/dist/ir/types/index.d.ts +4 -2
  343. package/dist/ir/types/index.d.ts.map +1 -1
  344. package/dist/ir/types/index.js +1 -0
  345. package/dist/ir/types/index.js.map +1 -1
  346. package/dist/ir/types/ir-substitution.d.ts +144 -0
  347. package/dist/ir/types/ir-substitution.d.ts.map +1 -0
  348. package/dist/ir/types/ir-substitution.js +569 -0
  349. package/dist/ir/types/ir-substitution.js.map +1 -0
  350. package/dist/ir/types/ir-types.d.ts +9 -3
  351. package/dist/ir/types/ir-types.d.ts.map +1 -1
  352. package/dist/ir/types/numeric-helpers.d.ts +2 -1
  353. package/dist/ir/types/numeric-helpers.d.ts.map +1 -1
  354. package/dist/ir/types/numeric-helpers.js +9 -3
  355. package/dist/ir/types/numeric-helpers.js.map +1 -1
  356. package/dist/ir/types/statements.d.ts +13 -1
  357. package/dist/ir/types/statements.d.ts.map +1 -1
  358. package/dist/ir/types.d.ts +1 -1
  359. package/dist/ir/types.d.ts.map +1 -1
  360. package/dist/ir/types.js.map +1 -1
  361. package/dist/ir/validation/anonymous-type-lowering-pass.d.ts.map +1 -1
  362. package/dist/ir/validation/anonymous-type-lowering-pass.js +152 -8
  363. package/dist/ir/validation/anonymous-type-lowering-pass.js.map +1 -1
  364. package/dist/ir/validation/arrow-return-finalization-pass.d.ts +28 -0
  365. package/dist/ir/validation/arrow-return-finalization-pass.d.ts.map +1 -0
  366. package/dist/ir/validation/arrow-return-finalization-pass.js +416 -0
  367. package/dist/ir/validation/arrow-return-finalization-pass.js.map +1 -0
  368. package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -1
  369. package/dist/ir/validation/attribute-collection-pass.js +40 -6
  370. package/dist/ir/validation/attribute-collection-pass.js.map +1 -1
  371. package/dist/ir/validation/attribute-collection-pass.test.js +43 -36
  372. package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -1
  373. package/dist/ir/validation/index.d.ts +3 -0
  374. package/dist/ir/validation/index.d.ts.map +1 -1
  375. package/dist/ir/validation/index.js +3 -0
  376. package/dist/ir/validation/index.js.map +1 -1
  377. package/dist/ir/validation/numeric-coercion-pass.d.ts +22 -16
  378. package/dist/ir/validation/numeric-coercion-pass.d.ts.map +1 -1
  379. package/dist/ir/validation/numeric-coercion-pass.js +159 -51
  380. package/dist/ir/validation/numeric-coercion-pass.js.map +1 -1
  381. package/dist/ir/validation/numeric-invariants.test.js +72 -108
  382. package/dist/ir/validation/numeric-invariants.test.js.map +1 -1
  383. package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -1
  384. package/dist/ir/validation/numeric-proof-pass.js +71 -23
  385. package/dist/ir/validation/numeric-proof-pass.js.map +1 -1
  386. package/dist/ir/validation/rest-type-synthesis-pass.d.ts +24 -0
  387. package/dist/ir/validation/rest-type-synthesis-pass.d.ts.map +1 -0
  388. package/dist/ir/validation/rest-type-synthesis-pass.js +417 -0
  389. package/dist/ir/validation/rest-type-synthesis-pass.js.map +1 -0
  390. package/dist/ir/validation/soundness-gate.d.ts +11 -1
  391. package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
  392. package/dist/ir/validation/soundness-gate.js +42 -10
  393. package/dist/ir/validation/soundness-gate.js.map +1 -1
  394. package/dist/ir/validation/soundness-gate.test.js +19 -2
  395. package/dist/ir/validation/soundness-gate.test.js.map +1 -1
  396. package/dist/ir/validation/virtual-marking-pass.d.ts +16 -0
  397. package/dist/ir/validation/virtual-marking-pass.d.ts.map +1 -0
  398. package/dist/ir/validation/virtual-marking-pass.js +77 -0
  399. package/dist/ir/validation/virtual-marking-pass.js.map +1 -0
  400. package/dist/ir/validation/yield-lowering-pass.test.js +2 -2
  401. package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
  402. package/dist/program/bindings.d.ts +28 -0
  403. package/dist/program/bindings.d.ts.map +1 -1
  404. package/dist/program/bindings.js +204 -2
  405. package/dist/program/bindings.js.map +1 -1
  406. package/dist/program/bindings.test.js +30 -0
  407. package/dist/program/bindings.test.js.map +1 -1
  408. package/dist/program/creation.d.ts.map +1 -1
  409. package/dist/program/creation.js +251 -4
  410. package/dist/program/creation.js.map +1 -1
  411. package/dist/program/dependency-graph.d.ts.map +1 -1
  412. package/dist/program/dependency-graph.js +25 -25
  413. package/dist/program/dependency-graph.js.map +1 -1
  414. package/dist/program/diagnostics.d.ts.map +1 -1
  415. package/dist/program/diagnostics.js +6 -0
  416. package/dist/program/diagnostics.js.map +1 -1
  417. package/dist/program/index.d.ts +1 -1
  418. package/dist/program/index.d.ts.map +1 -1
  419. package/dist/program/types.d.ts +8 -8
  420. package/dist/program/types.d.ts.map +1 -1
  421. package/dist/resolver/clr-bindings-resolver.d.ts +1 -0
  422. package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
  423. package/dist/resolver/clr-bindings-resolver.js +90 -34
  424. package/dist/resolver/clr-bindings-resolver.js.map +1 -1
  425. package/dist/resolver/import-resolution.d.ts +16 -1
  426. package/dist/resolver/import-resolution.d.ts.map +1 -1
  427. package/dist/resolver/import-resolution.js +29 -12
  428. package/dist/resolver/import-resolution.js.map +1 -1
  429. package/dist/resolver/naming.d.ts +1 -1
  430. package/dist/resolver/naming.d.ts.map +1 -1
  431. package/dist/resolver/naming.js +13 -2
  432. package/dist/resolver/naming.js.map +1 -1
  433. package/dist/resolver.test.js +4 -0
  434. package/dist/resolver.test.js.map +1 -1
  435. package/dist/symbol-table/builder.d.ts +3 -1
  436. package/dist/symbol-table/builder.d.ts.map +1 -1
  437. package/dist/symbol-table/builder.js +9 -8
  438. package/dist/symbol-table/builder.js.map +1 -1
  439. package/dist/symbol-table/types.d.ts +2 -2
  440. package/dist/symbol-table/types.d.ts.map +1 -1
  441. package/dist/types/diagnostic.d.ts +12 -2
  442. package/dist/types/diagnostic.d.ts.map +1 -1
  443. package/dist/types/diagnostic.js +5 -1
  444. package/dist/types/diagnostic.js.map +1 -1
  445. package/dist/validation/extension-methods.d.ts +17 -0
  446. package/dist/validation/extension-methods.d.ts.map +1 -0
  447. package/dist/validation/extension-methods.js +133 -0
  448. package/dist/validation/extension-methods.js.map +1 -0
  449. package/dist/validation/generics.d.ts.map +1 -1
  450. package/dist/validation/generics.js +1 -129
  451. package/dist/validation/generics.js.map +1 -1
  452. package/dist/validation/imports.js +1 -1
  453. package/dist/validation/imports.js.map +1 -1
  454. package/dist/validation/index.d.ts +1 -0
  455. package/dist/validation/index.d.ts.map +1 -1
  456. package/dist/validation/index.js +1 -0
  457. package/dist/validation/index.js.map +1 -1
  458. package/dist/validation/orchestrator.d.ts.map +1 -1
  459. package/dist/validation/orchestrator.js +2 -0
  460. package/dist/validation/orchestrator.js.map +1 -1
  461. package/dist/validation/static-safety.d.ts +1 -0
  462. package/dist/validation/static-safety.d.ts.map +1 -1
  463. package/dist/validation/static-safety.js +366 -96
  464. package/dist/validation/static-safety.js.map +1 -1
  465. package/dist/validator.test.js +77 -1
  466. package/dist/validator.test.js.map +1 -1
  467. package/package.json +2 -2
  468. package/dist/ir/type-converter/arrays.d.ts +0 -10
  469. package/dist/ir/type-converter/arrays.d.ts.map +0 -1
  470. package/dist/ir/type-converter/arrays.js.map +0 -1
  471. package/dist/ir/type-converter/converter.d.ts +0 -6
  472. package/dist/ir/type-converter/converter.d.ts.map +0 -1
  473. package/dist/ir/type-converter/converter.js +0 -6
  474. package/dist/ir/type-converter/converter.js.map +0 -1
  475. package/dist/ir/type-converter/functions.d.ts +0 -10
  476. package/dist/ir/type-converter/functions.d.ts.map +0 -1
  477. package/dist/ir/type-converter/functions.js +0 -15
  478. package/dist/ir/type-converter/functions.js.map +0 -1
  479. package/dist/ir/type-converter/index.d.ts +0 -7
  480. package/dist/ir/type-converter/index.d.ts.map +0 -1
  481. package/dist/ir/type-converter/index.js +0 -7
  482. package/dist/ir/type-converter/index.js.map +0 -1
  483. package/dist/ir/type-converter/inference.d.ts +0 -32
  484. package/dist/ir/type-converter/inference.d.ts.map +0 -1
  485. package/dist/ir/type-converter/inference.js +0 -297
  486. package/dist/ir/type-converter/inference.js.map +0 -1
  487. package/dist/ir/type-converter/literals.d.ts.map +0 -1
  488. package/dist/ir/type-converter/literals.js.map +0 -1
  489. package/dist/ir/type-converter/objects.d.ts +0 -16
  490. package/dist/ir/type-converter/objects.d.ts.map +0 -1
  491. package/dist/ir/type-converter/objects.js.map +0 -1
  492. package/dist/ir/type-converter/orchestrator.d.ts.map +0 -1
  493. package/dist/ir/type-converter/orchestrator.js.map +0 -1
  494. package/dist/ir/type-converter/patterns.d.ts +0 -10
  495. package/dist/ir/type-converter/patterns.d.ts.map +0 -1
  496. package/dist/ir/type-converter/patterns.js.map +0 -1
  497. package/dist/ir/type-converter/primitives.d.ts.map +0 -1
  498. package/dist/ir/type-converter/primitives.js.map +0 -1
  499. package/dist/ir/type-converter/references.d.ts.map +0 -1
  500. package/dist/ir/type-converter/references.js +0 -371
  501. package/dist/ir/type-converter/references.js.map +0 -1
  502. package/dist/ir/type-converter/unions-intersections.d.ts +0 -14
  503. package/dist/ir/type-converter/unions-intersections.d.ts.map +0 -1
  504. package/dist/ir/type-converter/unions-intersections.js +0 -22
  505. package/dist/ir/type-converter/unions-intersections.js.map +0 -1
  506. package/dist/ir/type-converter/utility-types.d.ts.map +0 -1
  507. package/dist/ir/type-converter/utility-types.js +0 -528
  508. package/dist/ir/type-converter/utility-types.js.map +0 -1
  509. package/dist/ir/type-converter/utility-types.test.d.ts.map +0 -1
  510. package/dist/ir/type-converter/utility-types.test.js.map +0 -1
  511. /package/dist/ir/{type-converter → type-system/internal/type-converter}/literals.js +0 -0
  512. /package/dist/ir/{type-converter → type-system/internal/type-converter}/primitives.js +0 -0
  513. /package/dist/ir/{type-converter → type-system/internal/type-converter}/utility-types.test.d.ts +0 -0
@@ -0,0 +1,1176 @@
1
+ /**
2
+ * CLR Type Catalog Loader
3
+ *
4
+ * Loads CLR type metadata from bindings.json and metadata.json files
5
+ * into a queryable catalog structure.
6
+ *
7
+ * INVARIANT INV-CLR: All assembly types loaded here become part of the
8
+ * unified type catalog. No parallel lookup paths allowed.
9
+ *
10
+ * The loader:
11
+ * 1. Scans node_modules/@tsonic/* packages for metadata files
12
+ * 2. Parses metadata.json for type definitions, members, signatures
13
+ * 3. Parses bindings.json for TS ↔ CLR name mappings
14
+ * 4. Converts to NominalEntry structures with proper IrType members
15
+ */
16
+ import * as fs from "fs";
17
+ import * as path from "path";
18
+ import * as ts from "typescript";
19
+ import { makeTypeId, parseStableId } from "./types.js";
20
+ // ═══════════════════════════════════════════════════════════════════════════
21
+ // CLR TYPE STRING PARSING
22
+ // ═══════════════════════════════════════════════════════════════════════════
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": { kind: "anyType" }, // object → any in TS
85
+ object: { kind: "anyType" },
86
+ };
87
+ const primitive = primitiveMap[clrType];
88
+ if (primitive)
89
+ return primitive;
90
+ // Handle array types: T[] or System.Array`1[[T]]
91
+ if (clrType.endsWith("[]")) {
92
+ const elementType = clrType.slice(0, -2);
93
+ return {
94
+ kind: "arrayType",
95
+ elementType: parseClrTypeString(elementType),
96
+ };
97
+ }
98
+ // Handle pointer types (convert to ref semantics - just use the base type)
99
+ if (clrType.endsWith("*")) {
100
+ return parseClrTypeString(clrType.slice(0, -1));
101
+ }
102
+ // Handle nullable: Nullable<T> or T?
103
+ if (clrType.startsWith("System.Nullable`1")) {
104
+ // Extract inner type
105
+ const innerMatch = clrType.match(/System\.Nullable`1\[\[([^\]]+)\]\]/);
106
+ if (innerMatch && innerMatch[1]) {
107
+ const innerType = parseClrTypeString(innerMatch[1]);
108
+ return {
109
+ kind: "unionType",
110
+ types: [innerType, { kind: "primitiveType", name: "undefined" }],
111
+ };
112
+ }
113
+ }
114
+ // Handle type parameters (single uppercase letter or common patterns)
115
+ if (/^T\d*$/.test(clrType) || /^T[A-Z][a-zA-Z]*$/.test(clrType)) {
116
+ return { kind: "typeParameterType", name: clrType };
117
+ }
118
+ // Handle generic types: Name`N[[TypeArgs]]
119
+ const genericMatch = clrType.match(/^(.+)`(\d+)(?:\[\[(.+)\]\])?$/);
120
+ if (genericMatch && genericMatch[1] && genericMatch[2]) {
121
+ const baseName = genericMatch[1];
122
+ const arity = parseInt(genericMatch[2], 10);
123
+ const typeArgsStr = genericMatch[3]; // May be undefined
124
+ // Extract type arguments if present
125
+ const typeArguments = [];
126
+ if (typeArgsStr) {
127
+ // Parse comma-separated type args (this is simplified, may need proper parsing)
128
+ const args = splitTypeArguments(typeArgsStr);
129
+ for (const arg of args) {
130
+ typeArguments.push(parseClrTypeString(arg.trim()));
131
+ }
132
+ }
133
+ else {
134
+ // Generate placeholder type parameters
135
+ for (let i = 0; i < arity; i++) {
136
+ typeArguments.push({
137
+ kind: "typeParameterType",
138
+ name: i === 0 ? "T" : `T${i + 1}`,
139
+ });
140
+ }
141
+ }
142
+ return {
143
+ kind: "referenceType",
144
+ name: baseName,
145
+ typeArguments: typeArguments.length > 0 ? typeArguments : undefined,
146
+ resolvedClrType: clrType,
147
+ };
148
+ }
149
+ // Default: treat as reference type
150
+ return {
151
+ kind: "referenceType",
152
+ name: clrType,
153
+ resolvedClrType: clrType,
154
+ };
155
+ };
156
+ /**
157
+ * Split type arguments handling nested brackets.
158
+ */
159
+ const splitTypeArguments = (str) => {
160
+ const result = [];
161
+ let depth = 0;
162
+ let current = "";
163
+ for (const char of str) {
164
+ if (char === "[") {
165
+ depth++;
166
+ current += char;
167
+ }
168
+ else if (char === "]") {
169
+ depth--;
170
+ current += char;
171
+ }
172
+ else if (char === "," && depth === 0) {
173
+ result.push(current.trim());
174
+ current = "";
175
+ }
176
+ else {
177
+ current += char;
178
+ }
179
+ }
180
+ if (current.trim()) {
181
+ result.push(current.trim());
182
+ }
183
+ return result;
184
+ };
185
+ // ═══════════════════════════════════════════════════════════════════════════
186
+ // TSBINDGEN .D.TS HERITAGE EXTRACTION
187
+ // ═══════════════════════════════════════════════════════════════════════════
188
+ const INSTANCE_SUFFIX = "$instance";
189
+ const VIEWS_PREFIX = "__";
190
+ const VIEWS_SUFFIX = "$views";
191
+ const stripTsBindgenInstanceSuffix = (name) => {
192
+ return name.endsWith(INSTANCE_SUFFIX)
193
+ ? name.slice(0, -INSTANCE_SUFFIX.length)
194
+ : name;
195
+ };
196
+ const stripTsBindgenViewsWrapper = (name) => {
197
+ if (!name.startsWith(VIEWS_PREFIX))
198
+ return undefined;
199
+ if (!name.endsWith(VIEWS_SUFFIX))
200
+ return undefined;
201
+ return name.slice(VIEWS_PREFIX.length, -VIEWS_SUFFIX.length);
202
+ };
203
+ const getRightmostQualifiedNameText = (name) => {
204
+ if (ts.isIdentifier(name))
205
+ return name.text;
206
+ return getRightmostQualifiedNameText(name.right);
207
+ };
208
+ const getRightmostPropertyAccessText = (expr) => {
209
+ if (ts.isIdentifier(expr))
210
+ return expr.text;
211
+ if (ts.isPropertyAccessExpression(expr))
212
+ return expr.name.text;
213
+ if (ts.isCallExpression(expr))
214
+ return getRightmostPropertyAccessText(expr.expression);
215
+ if (ts.isParenthesizedExpression(expr))
216
+ return getRightmostPropertyAccessText(expr.expression);
217
+ return undefined;
218
+ };
219
+ const dtsTypeNodeToIrType = (node, inScopeTypeParams, tsNameToTypeId) => {
220
+ // Parenthesized type
221
+ if (ts.isParenthesizedTypeNode(node)) {
222
+ return dtsTypeNodeToIrType(node.type, inScopeTypeParams, tsNameToTypeId);
223
+ }
224
+ // Type references (including type parameters)
225
+ if (ts.isTypeReferenceNode(node)) {
226
+ const rawName = getRightmostQualifiedNameText(node.typeName);
227
+ const baseName = stripTsBindgenInstanceSuffix(rawName);
228
+ // tsbindgen imports CLR numeric aliases from @tsonic/core as type references.
229
+ // For IR purposes, `int` is a distinct primitive type (not referenceType).
230
+ if (baseName === "int" && !node.typeArguments?.length) {
231
+ return { kind: "primitiveType", name: "int" };
232
+ }
233
+ // Type parameter reference: `T` (no type args) where T is in scope
234
+ if (inScopeTypeParams.has(baseName) && !node.typeArguments?.length) {
235
+ return { kind: "typeParameterType", name: baseName };
236
+ }
237
+ const typeArguments = node.typeArguments?.map((a) => dtsTypeNodeToIrType(a, inScopeTypeParams, tsNameToTypeId));
238
+ const resolvedName = typeArguments && typeArguments.length > 0
239
+ ? (() => {
240
+ const arityName = `${baseName}_${typeArguments.length}`;
241
+ return tsNameToTypeId.has(arityName) ? arityName : baseName;
242
+ })()
243
+ : baseName;
244
+ return {
245
+ kind: "referenceType",
246
+ name: resolvedName,
247
+ typeArguments: typeArguments && typeArguments.length > 0 ? typeArguments : undefined,
248
+ };
249
+ }
250
+ // Array types
251
+ if (ts.isArrayTypeNode(node)) {
252
+ return {
253
+ kind: "arrayType",
254
+ elementType: dtsTypeNodeToIrType(node.elementType, inScopeTypeParams, tsNameToTypeId),
255
+ };
256
+ }
257
+ // Union / intersection
258
+ if (ts.isUnionTypeNode(node)) {
259
+ return {
260
+ kind: "unionType",
261
+ types: node.types.map((t) => dtsTypeNodeToIrType(t, inScopeTypeParams, tsNameToTypeId)),
262
+ };
263
+ }
264
+ if (ts.isIntersectionTypeNode(node)) {
265
+ return {
266
+ kind: "intersectionType",
267
+ types: node.types.map((t) => dtsTypeNodeToIrType(t, inScopeTypeParams, tsNameToTypeId)),
268
+ };
269
+ }
270
+ // Literal types
271
+ if (ts.isLiteralTypeNode(node)) {
272
+ const lit = node.literal;
273
+ if (ts.isStringLiteral(lit))
274
+ return { kind: "literalType", value: lit.text };
275
+ if (ts.isNumericLiteral(lit))
276
+ return { kind: "literalType", value: Number(lit.text) };
277
+ if (lit.kind === ts.SyntaxKind.TrueKeyword)
278
+ return { kind: "literalType", value: true };
279
+ if (lit.kind === ts.SyntaxKind.FalseKeyword)
280
+ return { kind: "literalType", value: false };
281
+ }
282
+ // Keywords
283
+ switch (node.kind) {
284
+ case ts.SyntaxKind.StringKeyword:
285
+ return { kind: "primitiveType", name: "string" };
286
+ case ts.SyntaxKind.NumberKeyword:
287
+ return { kind: "primitiveType", name: "number" };
288
+ case ts.SyntaxKind.BooleanKeyword:
289
+ return { kind: "primitiveType", name: "boolean" };
290
+ case ts.SyntaxKind.VoidKeyword:
291
+ return { kind: "voidType" };
292
+ case ts.SyntaxKind.AnyKeyword:
293
+ return { kind: "anyType" };
294
+ case ts.SyntaxKind.UnknownKeyword:
295
+ return { kind: "unknownType" };
296
+ case ts.SyntaxKind.NeverKeyword:
297
+ return { kind: "neverType" };
298
+ case ts.SyntaxKind.NullKeyword:
299
+ return { kind: "primitiveType", name: "null" };
300
+ case ts.SyntaxKind.UndefinedKeyword:
301
+ return { kind: "primitiveType", name: "undefined" };
302
+ default:
303
+ return { kind: "unknownType" };
304
+ }
305
+ };
306
+ const irTypeToSignatureKey = (type) => {
307
+ switch (type.kind) {
308
+ case "primitiveType":
309
+ return `p:${type.name}`;
310
+ case "literalType":
311
+ return `lit:${JSON.stringify(type.value)}`;
312
+ case "voidType":
313
+ return "void";
314
+ case "neverType":
315
+ return "never";
316
+ case "unknownType":
317
+ return "unknown";
318
+ case "anyType":
319
+ return "any";
320
+ case "typeParameterType":
321
+ // Canonicalize all type parameters to a stable placeholder so tsbindgen's
322
+ // `TContext` matches metadata's `T0`/`T` deterministically.
323
+ return "T";
324
+ case "arrayType":
325
+ return `${irTypeToSignatureKey(type.elementType)}[]`;
326
+ case "tupleType":
327
+ return `[${type.elementTypes
328
+ .map((t) => (t ? irTypeToSignatureKey(t) : "unknown"))
329
+ .join(",")}]`;
330
+ case "unionType": {
331
+ const parts = type.types
332
+ .map((t) => (t ? irTypeToSignatureKey(t) : "unknown"))
333
+ .sort();
334
+ return `(${parts.join("|")})`;
335
+ }
336
+ case "intersectionType": {
337
+ const parts = type.types
338
+ .map((t) => (t ? irTypeToSignatureKey(t) : "unknown"))
339
+ .sort();
340
+ return `(${parts.join("&")})`;
341
+ }
342
+ case "dictionaryType":
343
+ return `{[${irTypeToSignatureKey(type.keyType)}]:${irTypeToSignatureKey(type.valueType)}}`;
344
+ case "functionType": {
345
+ const params = type.parameters
346
+ .map((p) => (p.type ? irTypeToSignatureKey(p.type) : "unknown"))
347
+ .join(",");
348
+ return `fn(${params})->${irTypeToSignatureKey(type.returnType)}`;
349
+ }
350
+ case "objectType":
351
+ return "object";
352
+ case "referenceType": {
353
+ const raw = type.resolvedClrType ?? type.name;
354
+ const withoutArgs = raw.includes("[[") ? raw.split("[[")[0] ?? raw : raw;
355
+ const lastSep = Math.max(withoutArgs.lastIndexOf("."), withoutArgs.lastIndexOf("+"));
356
+ let simple = lastSep >= 0 ? withoutArgs.slice(lastSep + 1) : withoutArgs;
357
+ // Canonicalize CLR backtick arity: `Action`1` -> `Action_1`.
358
+ const backtickMatch = simple.match(/`(\d+)$/);
359
+ if (backtickMatch && backtickMatch[1]) {
360
+ simple = `${simple.slice(0, -backtickMatch[0].length)}_${backtickMatch[1]}`;
361
+ }
362
+ const underscoreMatch = simple.match(/_(\d+)$/);
363
+ const arity = underscoreMatch && underscoreMatch[1] ? Number(underscoreMatch[1]) : undefined;
364
+ const argCount = type.typeArguments?.length ?? arity ?? 0;
365
+ // Signature matching is used only to hydrate optional/rest flags from tsbindgen .d.ts
366
+ // into CLR metadata signatures. To keep matching robust across:
367
+ // - CLR names vs TS names
368
+ // - generic instantiation encodings (Action_1[[...]] vs Action_1<T>)
369
+ // we intentionally ignore concrete type argument *identities* and retain only arity.
370
+ if (argCount <= 0)
371
+ return simple;
372
+ return `${simple}<${Array.from({ length: argCount }, () => "*").join(",")}>`;
373
+ }
374
+ default:
375
+ return "unknown";
376
+ }
377
+ };
378
+ const makeMethodSignatureKey = (args) => {
379
+ const params = args.parameters
380
+ .map((p) => `${p.isRest ? "..." : ""}${irTypeToSignatureKey(p.type)}`)
381
+ .join(",");
382
+ return `${args.isStatic ? "static" : "instance"}|${args.name}|${args.typeParamCount}|(${params})->${irTypeToSignatureKey(args.returnType)}`;
383
+ };
384
+ const extractHeritageFromTsBindgenDts = (dtsPath, tsNameToTypeId, entries) => {
385
+ const typeParametersByTsName = new Map();
386
+ const heritageByTsName = new Map();
387
+ const memberTypesByTsName = new Map();
388
+ const methodSignatureOptionalsByTsName = new Map();
389
+ const content = fs.readFileSync(dtsPath, "utf-8");
390
+ const sf = ts.createSourceFile(dtsPath, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
391
+ const getEntry = (tsName) => {
392
+ const id = tsNameToTypeId.get(tsName);
393
+ return id ? entries.get(id.stableId) : undefined;
394
+ };
395
+ const addEdge = (sourceTsName, edge) => {
396
+ const list = heritageByTsName.get(sourceTsName) ?? [];
397
+ list.push(edge);
398
+ heritageByTsName.set(sourceTsName, list);
399
+ };
400
+ const recordMemberType = (sourceTsName, memberName, type) => {
401
+ const map = memberTypesByTsName.get(sourceTsName) ?? new Map();
402
+ // Prefer first-seen type for determinism; later duplicates are ignored.
403
+ if (!map.has(memberName)) {
404
+ map.set(memberName, type);
405
+ memberTypesByTsName.set(sourceTsName, map);
406
+ }
407
+ };
408
+ const recordMethodSignatureOptionals = (sourceTsName, signatureKey, optionals) => {
409
+ const map = methodSignatureOptionalsByTsName.get(sourceTsName) ??
410
+ new Map();
411
+ // Prefer first-seen for determinism; later duplicates are ignored.
412
+ if (!map.has(signatureKey)) {
413
+ map.set(signatureKey, optionals);
414
+ methodSignatureOptionalsByTsName.set(sourceTsName, map);
415
+ }
416
+ };
417
+ const getPropertyNameText = (name) => {
418
+ if (ts.isIdentifier(name))
419
+ return name.text;
420
+ if (ts.isStringLiteral(name))
421
+ return name.text;
422
+ if (ts.isNumericLiteral(name))
423
+ return name.text;
424
+ return undefined;
425
+ };
426
+ const extractMethodSignatureOptionalsFromMembers = (baseTsName, members, typeTypeParams) => {
427
+ const typeScope = new Set(typeTypeParams);
428
+ for (const member of members) {
429
+ if (!ts.isMethodSignature(member) && !ts.isMethodDeclaration(member))
430
+ continue;
431
+ const methodName = member.name && ts.isIdentifier(member.name) ? member.name.text : undefined;
432
+ if (!methodName)
433
+ continue;
434
+ const methodTypeParams = (member.typeParameters ?? []).map((p) => p.name.text);
435
+ const inScopeTypeParams = new Set([
436
+ ...Array.from(typeScope),
437
+ ...methodTypeParams,
438
+ ]);
439
+ const params = [];
440
+ for (const param of member.parameters) {
441
+ if (!param.type) {
442
+ // Deterministic: without an explicit type, we can't match this overload to metadata.
443
+ params.length = 0;
444
+ break;
445
+ }
446
+ params.push({
447
+ type: dtsTypeNodeToIrType(param.type, inScopeTypeParams, tsNameToTypeId),
448
+ isRest: param.dotDotDotToken !== undefined,
449
+ isOptional: param.questionToken !== undefined || param.initializer !== undefined,
450
+ });
451
+ }
452
+ if (params.length === 0 && member.parameters.length > 0) {
453
+ continue;
454
+ }
455
+ const returnType = member.type
456
+ ? dtsTypeNodeToIrType(member.type, inScopeTypeParams, tsNameToTypeId)
457
+ : { kind: "voidType" };
458
+ const isStatic = ts.isMethodDeclaration(member) &&
459
+ (member.modifiers?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword) ??
460
+ false);
461
+ const signatureKey = makeMethodSignatureKey({
462
+ isStatic,
463
+ name: methodName,
464
+ typeParamCount: methodTypeParams.length,
465
+ parameters: params.map((p) => ({ type: p.type, isRest: p.isRest })),
466
+ returnType,
467
+ });
468
+ recordMethodSignatureOptionals(baseTsName, signatureKey, params.map((p) => p.isOptional));
469
+ }
470
+ };
471
+ const extractMemberTypesFromInstanceDecl = (baseTsName, members, inScopeTypeParams) => {
472
+ for (const member of members) {
473
+ if (ts.isPropertySignature(member)) {
474
+ const nameText = member.name ? getPropertyNameText(member.name) : undefined;
475
+ if (!nameText || !member.type)
476
+ continue;
477
+ recordMemberType(baseTsName, nameText, dtsTypeNodeToIrType(member.type, inScopeTypeParams, tsNameToTypeId));
478
+ continue;
479
+ }
480
+ if (ts.isPropertyDeclaration(member)) {
481
+ const nameText = member.name ? getPropertyNameText(member.name) : undefined;
482
+ if (!nameText || !member.type)
483
+ continue;
484
+ recordMemberType(baseTsName, nameText, dtsTypeNodeToIrType(member.type, inScopeTypeParams, tsNameToTypeId));
485
+ continue;
486
+ }
487
+ if (ts.isGetAccessorDeclaration(member)) {
488
+ const nameText = member.name ? getPropertyNameText(member.name) : undefined;
489
+ if (!nameText || !member.type)
490
+ continue;
491
+ recordMemberType(baseTsName, nameText, dtsTypeNodeToIrType(member.type, inScopeTypeParams, tsNameToTypeId));
492
+ continue;
493
+ }
494
+ }
495
+ };
496
+ const computeEdgeKind = (source, target, preferred) => {
497
+ if (preferred)
498
+ return preferred;
499
+ if (source.kind === "interface")
500
+ return "extends";
501
+ return target.kind === "interface" ? "implements" : "extends";
502
+ };
503
+ const addHeritageFromHeritageClauses = (sourceTsName, sourceEntry, inScopeTypeParams, clauses, forceKind) => {
504
+ if (!clauses)
505
+ return;
506
+ for (const clause of clauses) {
507
+ for (const t of clause.types) {
508
+ const rawTarget = getRightmostPropertyAccessText(t.expression);
509
+ if (!rawTarget)
510
+ continue;
511
+ const targetTsName = stripTsBindgenInstanceSuffix(rawTarget);
512
+ const targetTypeId = tsNameToTypeId.get(targetTsName);
513
+ if (!targetTypeId)
514
+ continue;
515
+ const targetEntry = entries.get(targetTypeId.stableId);
516
+ if (!targetEntry)
517
+ continue;
518
+ const typeArguments = (t.typeArguments ?? []).map((a) => dtsTypeNodeToIrType(a, inScopeTypeParams, tsNameToTypeId));
519
+ addEdge(sourceTsName, {
520
+ kind: computeEdgeKind(sourceEntry, targetEntry, forceKind),
521
+ targetStableId: targetTypeId.stableId,
522
+ typeArguments,
523
+ });
524
+ }
525
+ }
526
+ };
527
+ const addHeritageFromViewsInterface = (viewsDecl) => {
528
+ const baseTsName = stripTsBindgenViewsWrapper(viewsDecl.name.text);
529
+ if (!baseTsName)
530
+ return;
531
+ const sourceEntry = getEntry(baseTsName);
532
+ if (!sourceEntry)
533
+ return;
534
+ const inScopeTypeParams = new Set((viewsDecl.typeParameters ?? []).map((p) => p.name.text));
535
+ for (const m of viewsDecl.members) {
536
+ if (!ts.isMethodSignature(m))
537
+ continue;
538
+ const methodName = m.name && ts.isIdentifier(m.name) ? m.name.text : undefined;
539
+ if (!methodName || !methodName.startsWith("As_"))
540
+ continue;
541
+ if (!m.type)
542
+ continue;
543
+ const returnType = dtsTypeNodeToIrType(m.type, inScopeTypeParams, tsNameToTypeId);
544
+ if (returnType.kind !== "referenceType")
545
+ continue;
546
+ const targetTsName = returnType.name;
547
+ const targetTypeId = tsNameToTypeId.get(targetTsName);
548
+ if (!targetTypeId)
549
+ continue;
550
+ const targetEntry = entries.get(targetTypeId.stableId);
551
+ if (!targetEntry)
552
+ continue;
553
+ addEdge(baseTsName, {
554
+ kind: computeEdgeKind(sourceEntry, targetEntry, "implements"),
555
+ targetStableId: targetTypeId.stableId,
556
+ typeArguments: returnType.typeArguments ?? [],
557
+ });
558
+ }
559
+ };
560
+ for (const stmt of sf.statements) {
561
+ // export interface Foo$instance<T> ...
562
+ if (ts.isInterfaceDeclaration(stmt) && stmt.name) {
563
+ const nameText = stmt.name.text;
564
+ // Views wrapper: __Foo$views<T> { As_IEnumerable_1(): IEnumerable_1$instance<T> }
565
+ if (nameText.startsWith(VIEWS_PREFIX) && nameText.endsWith(VIEWS_SUFFIX)) {
566
+ addHeritageFromViewsInterface(stmt);
567
+ continue;
568
+ }
569
+ if (!nameText.endsWith(INSTANCE_SUFFIX))
570
+ continue;
571
+ const baseTsName = stripTsBindgenInstanceSuffix(nameText);
572
+ const sourceEntry = getEntry(baseTsName);
573
+ if (!sourceEntry)
574
+ continue;
575
+ const typeParams = (stmt.typeParameters ?? []).map((p) => p.name.text);
576
+ if (!typeParametersByTsName.has(baseTsName)) {
577
+ typeParametersByTsName.set(baseTsName, typeParams);
578
+ }
579
+ const inScopeTypeParams = new Set(typeParams);
580
+ addHeritageFromHeritageClauses(baseTsName, sourceEntry, inScopeTypeParams, stmt.heritageClauses);
581
+ extractMemberTypesFromInstanceDecl(baseTsName, stmt.members, inScopeTypeParams);
582
+ extractMethodSignatureOptionalsFromMembers(baseTsName, stmt.members, typeParams);
583
+ continue;
584
+ }
585
+ // export abstract class Foo$instance { ... } (static namespaces)
586
+ if (ts.isClassDeclaration(stmt) && stmt.name) {
587
+ const nameText = stmt.name.text;
588
+ if (!nameText.endsWith(INSTANCE_SUFFIX))
589
+ continue;
590
+ const baseTsName = stripTsBindgenInstanceSuffix(nameText);
591
+ const sourceEntry = getEntry(baseTsName);
592
+ if (!sourceEntry)
593
+ continue;
594
+ const typeParams = (stmt.typeParameters ?? []).map((p) => p.name.text);
595
+ if (!typeParametersByTsName.has(baseTsName)) {
596
+ typeParametersByTsName.set(baseTsName, typeParams);
597
+ }
598
+ const inScopeTypeParams = new Set(typeParams);
599
+ // In a class declaration, TS encodes extends/implements explicitly.
600
+ if (stmt.heritageClauses) {
601
+ for (const clause of stmt.heritageClauses) {
602
+ if (clause.token === ts.SyntaxKind.ExtendsKeyword) {
603
+ addHeritageFromHeritageClauses(baseTsName, sourceEntry, inScopeTypeParams, [clause], "extends");
604
+ }
605
+ else if (clause.token === ts.SyntaxKind.ImplementsKeyword) {
606
+ addHeritageFromHeritageClauses(baseTsName, sourceEntry, inScopeTypeParams, [clause], "implements");
607
+ }
608
+ }
609
+ }
610
+ extractMemberTypesFromInstanceDecl(baseTsName, stmt.members, inScopeTypeParams);
611
+ extractMethodSignatureOptionalsFromMembers(baseTsName, stmt.members, typeParams);
612
+ }
613
+ }
614
+ // Dedup + stable sort per type (determinism)
615
+ const dedupedHeritageByTsName = new Map();
616
+ for (const [tsName, edges] of heritageByTsName) {
617
+ const seen = new Set();
618
+ const unique = [];
619
+ for (const e of edges) {
620
+ const key = `${e.kind}|${e.targetStableId}|${JSON.stringify(e.typeArguments)}`;
621
+ if (seen.has(key))
622
+ continue;
623
+ seen.add(key);
624
+ unique.push(e);
625
+ }
626
+ unique.sort((a, b) => {
627
+ const rank = (k) => (k === "extends" ? 0 : 1);
628
+ const ra = rank(a.kind);
629
+ const rb = rank(b.kind);
630
+ if (ra !== rb)
631
+ return ra - rb;
632
+ const stable = a.targetStableId.localeCompare(b.targetStableId);
633
+ if (stable !== 0)
634
+ return stable;
635
+ return JSON.stringify(a.typeArguments).localeCompare(JSON.stringify(b.typeArguments));
636
+ });
637
+ dedupedHeritageByTsName.set(tsName, unique);
638
+ }
639
+ return {
640
+ typeParametersByTsName,
641
+ heritageByTsName: dedupedHeritageByTsName,
642
+ memberTypesByTsName,
643
+ methodSignatureOptionalsByTsName,
644
+ };
645
+ };
646
+ const enrichAssemblyEntriesFromTsBindgenDts = (entries, tsNameToTypeId, dtsPaths) => {
647
+ const mergedTypeParams = new Map();
648
+ const mergedHeritage = new Map();
649
+ const mergedMemberTypes = new Map();
650
+ const mergedMethodSignatureOptionals = new Map();
651
+ for (const dtsPath of dtsPaths) {
652
+ try {
653
+ const info = extractHeritageFromTsBindgenDts(dtsPath, tsNameToTypeId, entries);
654
+ for (const [tsName, params] of info.typeParametersByTsName) {
655
+ if (!mergedTypeParams.has(tsName) && params.length > 0) {
656
+ mergedTypeParams.set(tsName, params);
657
+ }
658
+ }
659
+ for (const [tsName, edges] of info.heritageByTsName) {
660
+ const list = mergedHeritage.get(tsName) ?? [];
661
+ list.push(...edges);
662
+ mergedHeritage.set(tsName, list);
663
+ }
664
+ for (const [tsName, memberTypes] of info.memberTypesByTsName) {
665
+ const merged = mergedMemberTypes.get(tsName) ?? new Map();
666
+ for (const [memberName, type] of memberTypes) {
667
+ if (!merged.has(memberName)) {
668
+ merged.set(memberName, type);
669
+ }
670
+ }
671
+ mergedMemberTypes.set(tsName, merged);
672
+ }
673
+ for (const [tsName, signatureOptionals] of info.methodSignatureOptionalsByTsName) {
674
+ const merged = mergedMethodSignatureOptionals.get(tsName) ??
675
+ new Map();
676
+ for (const [sigKey, optionals] of signatureOptionals) {
677
+ if (!merged.has(sigKey)) {
678
+ merged.set(sigKey, optionals);
679
+ }
680
+ }
681
+ mergedMethodSignatureOptionals.set(tsName, merged);
682
+ }
683
+ }
684
+ catch (e) {
685
+ console.warn(`Failed to parse tsbindgen d.ts for heritage: ${dtsPath}`, e);
686
+ }
687
+ }
688
+ // Apply merged info to entries
689
+ for (const [tsName, typeId] of tsNameToTypeId) {
690
+ const entry = entries.get(typeId.stableId);
691
+ if (!entry)
692
+ continue;
693
+ const dtsTypeParams = mergedTypeParams.get(tsName);
694
+ const updatedTypeParameters = dtsTypeParams && dtsTypeParams.length === entry.typeParameters.length
695
+ ? dtsTypeParams.map((name) => ({ name }))
696
+ : entry.typeParameters;
697
+ const extraHeritage = mergedHeritage.get(tsName) ?? [];
698
+ const memberTypes = mergedMemberTypes.get(tsName);
699
+ const signatureOptionals = mergedMethodSignatureOptionals.get(tsName);
700
+ let updatedMembers;
701
+ if (memberTypes) {
702
+ for (const [memberName, type] of memberTypes) {
703
+ const member = entry.members.get(memberName);
704
+ if (!member)
705
+ continue;
706
+ if (!updatedMembers) {
707
+ updatedMembers = new Map(entry.members);
708
+ }
709
+ updatedMembers.set(memberName, { ...member, type });
710
+ }
711
+ }
712
+ if (signatureOptionals) {
713
+ const currentMembers = updatedMembers ?? entry.members;
714
+ for (const [memberName, member] of currentMembers) {
715
+ if (member.memberKind !== "method" || !member.signatures)
716
+ continue;
717
+ let memberChanged = false;
718
+ const updatedSignatures = member.signatures.map((sig) => {
719
+ const signatureKey = makeMethodSignatureKey({
720
+ isStatic: sig.isStatic,
721
+ name: memberName,
722
+ typeParamCount: sig.typeParameters.length,
723
+ parameters: sig.parameters.map((p) => ({
724
+ type: p.type,
725
+ isRest: p.isRest,
726
+ })),
727
+ returnType: sig.returnType,
728
+ });
729
+ const optionals = signatureOptionals.get(signatureKey);
730
+ if (!optionals)
731
+ return sig;
732
+ if (optionals.length !== sig.parameters.length)
733
+ return sig;
734
+ const updatedParams = sig.parameters.map((p, idx) => {
735
+ const isOptional = optionals[idx];
736
+ return isOptional === undefined || isOptional === p.isOptional
737
+ ? p
738
+ : { ...p, isOptional };
739
+ });
740
+ if (updatedParams.every((p, idx) => p === sig.parameters[idx])) {
741
+ return sig;
742
+ }
743
+ memberChanged = true;
744
+ return { ...sig, parameters: updatedParams };
745
+ });
746
+ if (!memberChanged)
747
+ continue;
748
+ if (!updatedMembers) {
749
+ updatedMembers = new Map(entry.members);
750
+ }
751
+ updatedMembers.set(memberName, { ...member, signatures: updatedSignatures });
752
+ }
753
+ }
754
+ const shouldSkip = extraHeritage.length === 0 &&
755
+ updatedTypeParameters === entry.typeParameters &&
756
+ !updatedMembers;
757
+ if (shouldSkip)
758
+ continue;
759
+ const combined = [...entry.heritage, ...extraHeritage];
760
+ const seen = new Set();
761
+ const deduped = [];
762
+ for (const h of combined) {
763
+ const key = `${h.kind}|${h.targetStableId}|${JSON.stringify(h.typeArguments)}`;
764
+ if (seen.has(key))
765
+ continue;
766
+ seen.add(key);
767
+ deduped.push(h);
768
+ }
769
+ deduped.sort((a, b) => {
770
+ const rank = (k) => (k === "extends" ? 0 : 1);
771
+ const ra = rank(a.kind);
772
+ const rb = rank(b.kind);
773
+ if (ra !== rb)
774
+ return ra - rb;
775
+ const stable = a.targetStableId.localeCompare(b.targetStableId);
776
+ if (stable !== 0)
777
+ return stable;
778
+ return JSON.stringify(a.typeArguments).localeCompare(JSON.stringify(b.typeArguments));
779
+ });
780
+ entries.set(typeId.stableId, {
781
+ ...entry,
782
+ typeParameters: updatedTypeParameters,
783
+ heritage: deduped,
784
+ ...(updatedMembers ? { members: updatedMembers } : {}),
785
+ });
786
+ }
787
+ };
788
+ // ═══════════════════════════════════════════════════════════════════════════
789
+ // NORMALIZED SIGNATURE PARSING
790
+ // ═══════════════════════════════════════════════════════════════════════════
791
+ /**
792
+ * Parse type from normalized signature for properties.
793
+ *
794
+ * Format for regular properties: "Name|:ReturnType|static=bool|accessor=get"
795
+ * Example: "Length|:System.Int32|static=false|accessor=get"
796
+ *
797
+ * Format for indexer properties: "Name|[IndexType]:ReturnType|static=bool|accessor=get"
798
+ * Example: "Chars|[System.Int32]:System.Char|static=false|accessor=get"
799
+ */
800
+ const parsePropertyType = (normalizedSig) => {
801
+ // Try indexer format first: Chars|[System.Int32]:System.Char|...
802
+ const indexerMatch = normalizedSig.match(/\|\[[^\]]*\]:([^|]+)\|/);
803
+ if (indexerMatch && indexerMatch[1]) {
804
+ return parseClrTypeString(indexerMatch[1]);
805
+ }
806
+ // Try regular property format: Length|:System.Int32|...
807
+ const colonMatch = normalizedSig.match(/\|:([^|]+)\|/);
808
+ if (colonMatch && colonMatch[1]) {
809
+ return parseClrTypeString(colonMatch[1]);
810
+ }
811
+ return { kind: "unknownType" };
812
+ };
813
+ /**
814
+ * Parse type from normalized signature for fields.
815
+ *
816
+ * Format: "Name|Type|static=bool|const=bool"
817
+ * Example: "Empty|System.String|static=true|const=false"
818
+ */
819
+ const parseFieldType = (normalizedSig) => {
820
+ const parts = normalizedSig.split("|");
821
+ if (parts.length >= 2 && parts[1]) {
822
+ return parseClrTypeString(parts[1]);
823
+ }
824
+ return { kind: "unknownType" };
825
+ };
826
+ /**
827
+ * Parse method signature from normalized signature.
828
+ *
829
+ * Format: "Name|(ParamTypes):ReturnType|static=bool"
830
+ * Example: "Substring|(System.Int32,System.Int32):System.String|static=false"
831
+ */
832
+ const parseMethodSignature = (normalizedSig, method) => {
833
+ // Parse return type
834
+ const returnMatch = normalizedSig.match(/\):([^|]+)\|/);
835
+ const returnType = returnMatch && returnMatch[1]
836
+ ? parseClrTypeString(returnMatch[1])
837
+ : { kind: "voidType" };
838
+ // Parse parameter types
839
+ const paramsMatch = normalizedSig.match(/\|\(([^)]*)\):/);
840
+ const parameters = [];
841
+ if (paramsMatch && paramsMatch[1]) {
842
+ const paramTypes = splitTypeArguments(paramsMatch[1]);
843
+ for (let i = 0; i < paramTypes.length; i++) {
844
+ const rawParamType = paramTypes[i];
845
+ if (!rawParamType)
846
+ continue;
847
+ let paramType = rawParamType.trim();
848
+ let mode = "value";
849
+ // Handle ref/out/in modifiers
850
+ if (paramType.endsWith("&")) {
851
+ mode = "ref"; // or could be out/in, need more info
852
+ paramType = paramType.slice(0, -1);
853
+ }
854
+ parameters.push({
855
+ name: `p${i}`, // We don't have parameter names in normalized signature
856
+ type: parseClrTypeString(paramType),
857
+ mode,
858
+ isOptional: false,
859
+ isRest: false,
860
+ });
861
+ }
862
+ }
863
+ const typeParameters = method.arity > 0
864
+ ? Array.from({ length: method.arity }, (_, i) => ({ name: `T${i}` }))
865
+ : [];
866
+ return {
867
+ stableId: method.stableId,
868
+ parameters,
869
+ returnType,
870
+ typeParameters,
871
+ parameterCount: method.parameterCount,
872
+ isStatic: method.isStatic,
873
+ isExtensionMethod: method.isExtensionMethod,
874
+ sourceInterface: method.sourceInterface,
875
+ normalizedSignature: normalizedSig,
876
+ };
877
+ };
878
+ // ═══════════════════════════════════════════════════════════════════════════
879
+ // RAW TYPE → NOMINAL ENTRY CONVERSION
880
+ // ═══════════════════════════════════════════════════════════════════════════
881
+ /**
882
+ * Convert raw metadata type to NominalEntry.
883
+ */
884
+ const convertRawType = (rawType, _namespace) => {
885
+ // Parse stableId
886
+ const parsed = parseStableId(rawType.stableId);
887
+ if (!parsed) {
888
+ throw new Error(`Invalid stableId: ${rawType.stableId}`);
889
+ }
890
+ const typeId = makeTypeId(rawType.stableId, rawType.clrName, parsed.assemblyName, rawType.tsEmitName);
891
+ // Convert kind
892
+ const kindMap = {
893
+ Class: "class",
894
+ Interface: "interface",
895
+ Struct: "struct",
896
+ Enum: "enum",
897
+ Delegate: "delegate",
898
+ };
899
+ const kind = kindMap[rawType.kind] ?? "class";
900
+ // Convert properties to members
901
+ const members = new Map();
902
+ for (const prop of rawType.properties) {
903
+ const memberEntry = {
904
+ tsName: prop.tsEmitName,
905
+ clrName: prop.clrName,
906
+ memberKind: "property",
907
+ type: parsePropertyType(prop.normalizedSignature),
908
+ isStatic: prop.isStatic,
909
+ isReadonly: !prop.hasSetter,
910
+ isAbstract: prop.isAbstract,
911
+ isVirtual: prop.isVirtual,
912
+ isOverride: prop.isOverride,
913
+ isIndexer: prop.isIndexer,
914
+ hasGetter: prop.hasGetter,
915
+ hasSetter: prop.hasSetter,
916
+ stableId: prop.stableId,
917
+ };
918
+ members.set(prop.tsEmitName, memberEntry);
919
+ }
920
+ // Convert fields to members
921
+ for (const field of rawType.fields) {
922
+ const memberEntry = {
923
+ tsName: field.tsEmitName,
924
+ clrName: field.clrName,
925
+ memberKind: "field",
926
+ type: parseFieldType(field.normalizedSignature),
927
+ isStatic: field.isStatic,
928
+ isReadonly: field.isReadOnly || field.isLiteral,
929
+ isAbstract: false,
930
+ isVirtual: false,
931
+ isOverride: false,
932
+ isIndexer: false,
933
+ hasGetter: true,
934
+ hasSetter: !field.isReadOnly && !field.isLiteral,
935
+ stableId: field.stableId,
936
+ };
937
+ members.set(field.tsEmitName, memberEntry);
938
+ }
939
+ // Convert methods to members (grouped by name for overloads)
940
+ const methodsByName = new Map();
941
+ for (const method of rawType.methods) {
942
+ const existing = methodsByName.get(method.tsEmitName) ?? [];
943
+ existing.push(method);
944
+ methodsByName.set(method.tsEmitName, existing);
945
+ }
946
+ for (const [methodName, overloads] of methodsByName) {
947
+ const signatures = overloads.map((m) => parseMethodSignature(m.normalizedSignature, m));
948
+ const first = overloads[0];
949
+ if (!first)
950
+ continue; // Should never happen since we only add non-empty arrays
951
+ const memberEntry = {
952
+ tsName: methodName,
953
+ clrName: first.clrName,
954
+ memberKind: "method",
955
+ signatures,
956
+ isStatic: first.isStatic,
957
+ isReadonly: true, // methods are readonly
958
+ isAbstract: first.isAbstract,
959
+ isVirtual: first.isVirtual,
960
+ isOverride: first.isOverride,
961
+ isIndexer: false,
962
+ hasGetter: false,
963
+ hasSetter: false,
964
+ stableId: first.stableId,
965
+ };
966
+ members.set(methodName, memberEntry);
967
+ }
968
+ // Parse type parameters from arity
969
+ const typeParameters = [];
970
+ for (let i = 0; i < rawType.arity; i++) {
971
+ typeParameters.push({
972
+ name: i === 0 ? "T" : `T${i + 1}`,
973
+ });
974
+ }
975
+ // Parse heritage (base type and interfaces)
976
+ const heritage = [];
977
+ // Note: baseType and interfaces are not in the raw type shown,
978
+ // but we'd parse them if present
979
+ // Convert accessibility
980
+ const accessibilityMap = {
981
+ Public: "public",
982
+ Internal: "internal",
983
+ Private: "private",
984
+ Protected: "protected",
985
+ };
986
+ const accessibility = accessibilityMap[rawType.accessibility] ?? "public";
987
+ return {
988
+ typeId,
989
+ kind,
990
+ typeParameters,
991
+ heritage,
992
+ members,
993
+ origin: "assembly",
994
+ accessibility,
995
+ isAbstract: rawType.isAbstract,
996
+ isSealed: rawType.isSealed,
997
+ isStatic: rawType.isStatic,
998
+ };
999
+ };
1000
+ // ═══════════════════════════════════════════════════════════════════════════
1001
+ // FILE DISCOVERY AND LOADING
1002
+ // ═══════════════════════════════════════════════════════════════════════════
1003
+ /**
1004
+ * Find all @tsonic packages in node_modules.
1005
+ */
1006
+ const findTsonicPackages = (nodeModulesPath) => {
1007
+ const tsonicDir = path.join(nodeModulesPath, "@tsonic");
1008
+ if (!fs.existsSync(tsonicDir)) {
1009
+ return [];
1010
+ }
1011
+ const packages = [];
1012
+ for (const entry of fs.readdirSync(tsonicDir, { withFileTypes: true })) {
1013
+ const fullPath = path.join(tsonicDir, entry.name);
1014
+ if (entry.isDirectory()) {
1015
+ packages.push(fullPath);
1016
+ continue;
1017
+ }
1018
+ // In multi-repo workspaces, @tsonic packages are often symlinked into node_modules.
1019
+ // Dirent reports these as symbolic links, so we must stat the target to detect
1020
+ // directory packages.
1021
+ if (entry.isSymbolicLink()) {
1022
+ try {
1023
+ if (fs.statSync(fullPath).isDirectory()) {
1024
+ packages.push(fullPath);
1025
+ }
1026
+ }
1027
+ catch {
1028
+ // Ignore broken links.
1029
+ }
1030
+ }
1031
+ }
1032
+ return packages;
1033
+ };
1034
+ /**
1035
+ * Find all metadata.json files in a package.
1036
+ */
1037
+ const findMetadataFiles = (packagePath) => {
1038
+ const metadataFiles = [];
1039
+ const walk = (dir) => {
1040
+ if (!fs.existsSync(dir))
1041
+ return;
1042
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
1043
+ const fullPath = path.join(dir, entry.name);
1044
+ if (entry.isDirectory()) {
1045
+ walk(fullPath);
1046
+ }
1047
+ else if (entry.name === "metadata.json") {
1048
+ metadataFiles.push(fullPath);
1049
+ }
1050
+ }
1051
+ };
1052
+ walk(packagePath);
1053
+ return metadataFiles;
1054
+ };
1055
+ // ═══════════════════════════════════════════════════════════════════════════
1056
+ // MAIN LOADER FUNCTION
1057
+ // ═══════════════════════════════════════════════════════════════════════════
1058
+ /**
1059
+ * Load all assembly types from node_modules/@tsonic packages.
1060
+ *
1061
+ * @param nodeModulesPath - Path to node_modules directory
1062
+ * @returns AssemblyTypeCatalog with all loaded types
1063
+ */
1064
+ export const loadClrCatalog = (nodeModulesPath, extraPackageRoots = []) => {
1065
+ const entries = new Map();
1066
+ const tsNameToTypeId = new Map();
1067
+ const clrNameToTypeId = new Map();
1068
+ const namespaceToTypeIds = new Map();
1069
+ const dtsFiles = new Set();
1070
+ // Find all @tsonic packages
1071
+ const packageRoots = new Set(findTsonicPackages(nodeModulesPath));
1072
+ for (const extra of extraPackageRoots) {
1073
+ packageRoots.add(extra);
1074
+ }
1075
+ for (const packagePath of Array.from(packageRoots).sort()) {
1076
+ // Find all metadata.json files
1077
+ const metadataFiles = findMetadataFiles(packagePath);
1078
+ for (const metadataPath of metadataFiles) {
1079
+ try {
1080
+ const dtsPath = path.join(path.dirname(metadataPath), "index.d.ts");
1081
+ if (fs.existsSync(dtsPath)) {
1082
+ dtsFiles.add(dtsPath);
1083
+ }
1084
+ const content = fs.readFileSync(metadataPath, "utf-8");
1085
+ const metadata = JSON.parse(content);
1086
+ for (const rawType of metadata.types) {
1087
+ const entry = convertRawType(rawType, metadata.namespace);
1088
+ // Add to entries map
1089
+ entries.set(entry.typeId.stableId, entry);
1090
+ // Add to name lookup maps
1091
+ tsNameToTypeId.set(entry.typeId.tsName, entry.typeId);
1092
+ clrNameToTypeId.set(entry.typeId.clrName, entry.typeId);
1093
+ // Add to namespace map
1094
+ const nsTypes = namespaceToTypeIds.get(metadata.namespace) ?? [];
1095
+ nsTypes.push(entry.typeId);
1096
+ namespaceToTypeIds.set(metadata.namespace, nsTypes);
1097
+ }
1098
+ }
1099
+ catch (e) {
1100
+ // Log but continue - don't fail on malformed files
1101
+ console.warn(`Failed to load metadata from ${metadataPath}:`, e);
1102
+ }
1103
+ }
1104
+ }
1105
+ // Enrich CLR catalog with heritage edges and type parameter names by parsing
1106
+ // tsbindgen internal `index.d.ts` files. This is required for deterministic
1107
+ // generic inference through inheritance (e.g., List<T> → IEnumerable<T>).
1108
+ enrichAssemblyEntriesFromTsBindgenDts(entries, tsNameToTypeId, Array.from(dtsFiles).sort());
1109
+ return {
1110
+ entries,
1111
+ tsNameToTypeId,
1112
+ clrNameToTypeId,
1113
+ namespaceToTypeIds,
1114
+ };
1115
+ };
1116
+ /**
1117
+ * Load CLR catalog from a specific package (for testing).
1118
+ */
1119
+ export const loadSinglePackageMetadata = (metadataPath) => {
1120
+ const entries = new Map();
1121
+ const tsNameToTypeId = new Map();
1122
+ const clrNameToTypeId = new Map();
1123
+ const namespaceToTypeIds = new Map();
1124
+ const dtsPath = path.join(path.dirname(metadataPath), "index.d.ts");
1125
+ const content = fs.readFileSync(metadataPath, "utf-8");
1126
+ const metadata = JSON.parse(content);
1127
+ for (const rawType of metadata.types) {
1128
+ const entry = convertRawType(rawType, metadata.namespace);
1129
+ entries.set(entry.typeId.stableId, entry);
1130
+ tsNameToTypeId.set(entry.typeId.tsName, entry.typeId);
1131
+ clrNameToTypeId.set(entry.typeId.clrName, entry.typeId);
1132
+ const nsTypes = namespaceToTypeIds.get(metadata.namespace) ?? [];
1133
+ nsTypes.push(entry.typeId);
1134
+ namespaceToTypeIds.set(metadata.namespace, nsTypes);
1135
+ }
1136
+ if (fs.existsSync(dtsPath)) {
1137
+ enrichAssemblyEntriesFromTsBindgenDts(entries, tsNameToTypeId, [dtsPath]);
1138
+ }
1139
+ return {
1140
+ entries,
1141
+ tsNameToTypeId,
1142
+ clrNameToTypeId,
1143
+ namespaceToTypeIds,
1144
+ };
1145
+ };
1146
+ // ═══════════════════════════════════════════════════════════════════════════
1147
+ // CATALOG QUERY HELPERS
1148
+ // ═══════════════════════════════════════════════════════════════════════════
1149
+ /**
1150
+ * Get a type entry by stableId.
1151
+ */
1152
+ export const getTypeByStableId = (catalog, stableId) => {
1153
+ return catalog.entries.get(stableId);
1154
+ };
1155
+ /**
1156
+ * Get a type entry by TS name.
1157
+ */
1158
+ export const getTypeByTsName = (catalog, tsName) => {
1159
+ const typeId = catalog.tsNameToTypeId.get(tsName);
1160
+ return typeId ? catalog.entries.get(typeId.stableId) : undefined;
1161
+ };
1162
+ /**
1163
+ * Get a type entry by CLR name.
1164
+ */
1165
+ export const getTypeByClrName = (catalog, clrName) => {
1166
+ const typeId = catalog.clrNameToTypeId.get(clrName);
1167
+ return typeId ? catalog.entries.get(typeId.stableId) : undefined;
1168
+ };
1169
+ /**
1170
+ * Get a member from a type by TS name.
1171
+ */
1172
+ export const getMemberByTsName = (catalog, typeStableId, memberTsName) => {
1173
+ const entry = catalog.entries.get(typeStableId);
1174
+ return entry?.members.get(memberTsName);
1175
+ };
1176
+ //# sourceMappingURL=clr-catalog.js.map