@tsonic/frontend 0.0.62 → 0.0.64

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 (439) 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 +0 -24
  9. package/dist/dotnet-metadata.js.map +1 -1
  10. package/dist/generic-function-values.d.ts +11 -0
  11. package/dist/generic-function-values.d.ts.map +1 -0
  12. package/dist/generic-function-values.js +243 -0
  13. package/dist/generic-function-values.js.map +1 -0
  14. package/dist/generic-function-values.test.d.ts +2 -0
  15. package/dist/generic-function-values.test.d.ts.map +1 -0
  16. package/dist/generic-function-values.test.js +256 -0
  17. package/dist/generic-function-values.test.js.map +1 -0
  18. package/dist/graph/extraction/imports.d.ts +5 -0
  19. package/dist/graph/extraction/imports.d.ts.map +1 -1
  20. package/dist/graph/extraction/imports.js +39 -1
  21. package/dist/graph/extraction/imports.js.map +1 -1
  22. package/dist/graph/extraction/index.d.ts +1 -1
  23. package/dist/graph/extraction/index.d.ts.map +1 -1
  24. package/dist/graph/extraction/index.js +1 -1
  25. package/dist/graph/extraction/index.js.map +1 -1
  26. package/dist/graph/extraction/orchestrator.d.ts.map +1 -1
  27. package/dist/graph/extraction/orchestrator.js +16 -2
  28. package/dist/graph/extraction/orchestrator.js.map +1 -1
  29. package/dist/graph/extraction.d.ts +1 -1
  30. package/dist/graph/extraction.d.ts.map +1 -1
  31. package/dist/graph/extraction.js +1 -1
  32. package/dist/graph/extraction.js.map +1 -1
  33. package/dist/ir/binding/binding-factory.d.ts +17 -0
  34. package/dist/ir/binding/binding-factory.d.ts.map +1 -0
  35. package/dist/ir/binding/binding-factory.js +765 -0
  36. package/dist/ir/binding/binding-factory.js.map +1 -0
  37. package/dist/ir/binding/binding-helpers.d.ts +90 -0
  38. package/dist/ir/binding/binding-helpers.d.ts.map +1 -0
  39. package/dist/ir/binding/binding-helpers.js +387 -0
  40. package/dist/ir/binding/binding-helpers.js.map +1 -0
  41. package/dist/ir/binding/binding-types.d.ts +203 -0
  42. package/dist/ir/binding/binding-types.d.ts.map +1 -0
  43. package/dist/ir/binding/binding-types.js +9 -0
  44. package/dist/ir/binding/binding-types.js.map +1 -0
  45. package/dist/ir/binding/index.d.ts +4 -158
  46. package/dist/ir/binding/index.d.ts.map +1 -1
  47. package/dist/ir/binding/index.js +3 -1134
  48. package/dist/ir/binding/index.js.map +1 -1
  49. package/dist/ir/binding-resolution.test.js +248 -0
  50. package/dist/ir/binding-resolution.test.js.map +1 -1
  51. package/dist/ir/builder/imports.d.ts.map +1 -1
  52. package/dist/ir/builder/imports.js +8 -1
  53. package/dist/ir/builder/imports.js.map +1 -1
  54. package/dist/ir/builder.test.js +360 -0
  55. package/dist/ir/builder.test.js.map +1 -1
  56. package/dist/ir/converters/anonymous-synthesis.d.ts +3 -3
  57. package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -1
  58. package/dist/ir/converters/anonymous-synthesis.js +45 -8
  59. package/dist/ir/converters/anonymous-synthesis.js.map +1 -1
  60. package/dist/ir/converters/expressions/access/access-converter.d.ts +14 -0
  61. package/dist/ir/converters/expressions/access/access-converter.d.ts.map +1 -0
  62. package/dist/ir/converters/expressions/access/access-converter.js +141 -0
  63. package/dist/ir/converters/expressions/access/access-converter.js.map +1 -0
  64. package/dist/ir/converters/expressions/access/binding-resolution.d.ts +35 -0
  65. package/dist/ir/converters/expressions/access/binding-resolution.d.ts.map +1 -0
  66. package/dist/ir/converters/expressions/access/binding-resolution.js +447 -0
  67. package/dist/ir/converters/expressions/access/binding-resolution.js.map +1 -0
  68. package/dist/ir/converters/expressions/access/member-resolution.d.ts +67 -0
  69. package/dist/ir/converters/expressions/access/member-resolution.d.ts.map +1 -0
  70. package/dist/ir/converters/expressions/access/member-resolution.js +262 -0
  71. package/dist/ir/converters/expressions/access/member-resolution.js.map +1 -0
  72. package/dist/ir/converters/expressions/access.d.ts +1 -7
  73. package/dist/ir/converters/expressions/access.d.ts.map +1 -1
  74. package/dist/ir/converters/expressions/access.js +1 -720
  75. package/dist/ir/converters/expressions/access.js.map +1 -1
  76. package/dist/ir/converters/expressions/calls/call-converter.d.ts +23 -0
  77. package/dist/ir/converters/expressions/calls/call-converter.d.ts.map +1 -0
  78. package/dist/ir/converters/expressions/calls/call-converter.js +526 -0
  79. package/dist/ir/converters/expressions/calls/call-converter.js.map +1 -0
  80. package/dist/ir/converters/expressions/calls/call-site-analysis.d.ts +53 -0
  81. package/dist/ir/converters/expressions/calls/call-site-analysis.d.ts.map +1 -0
  82. package/dist/ir/converters/expressions/calls/call-site-analysis.js +554 -0
  83. package/dist/ir/converters/expressions/calls/call-site-analysis.js.map +1 -0
  84. package/dist/ir/converters/expressions/calls/new-converter.d.ts +21 -0
  85. package/dist/ir/converters/expressions/calls/new-converter.d.ts.map +1 -0
  86. package/dist/ir/converters/expressions/calls/new-converter.js +182 -0
  87. package/dist/ir/converters/expressions/calls/new-converter.js.map +1 -0
  88. package/dist/ir/converters/expressions/calls.d.ts +2 -28
  89. package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
  90. package/dist/ir/converters/expressions/calls.js +2 -1344
  91. package/dist/ir/converters/expressions/calls.js.map +1 -1
  92. package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
  93. package/dist/ir/converters/expressions/collections.js +37 -6
  94. package/dist/ir/converters/expressions/collections.js.map +1 -1
  95. package/dist/ir/converters/expressions/functions.js +1 -1
  96. package/dist/ir/converters/expressions/functions.js.map +1 -1
  97. package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
  98. package/dist/ir/converters/expressions/helpers.js +1 -0
  99. package/dist/ir/converters/expressions/helpers.js.map +1 -1
  100. package/dist/ir/converters/expressions/other.d.ts.map +1 -1
  101. package/dist/ir/converters/expressions/other.js +3 -2
  102. package/dist/ir/converters/expressions/other.js.map +1 -1
  103. package/dist/ir/converters/flow-narrowing.d.ts.map +1 -1
  104. package/dist/ir/converters/flow-narrowing.js +3 -2
  105. package/dist/ir/converters/flow-narrowing.js.map +1 -1
  106. package/dist/ir/converters/statements/declarations/classes/methods.js +1 -1
  107. package/dist/ir/converters/statements/declarations/classes/methods.js.map +1 -1
  108. package/dist/ir/converters/statements/declarations/type-aliases.js +1 -1
  109. package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
  110. package/dist/ir/converters/statements/declarations/variables.d.ts +2 -2
  111. package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
  112. package/dist/ir/converters/statements/declarations/variables.js +289 -2
  113. package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
  114. package/dist/ir/expression-converter.d.ts +0 -1
  115. package/dist/ir/expression-converter.d.ts.map +1 -1
  116. package/dist/ir/expression-converter.js +0 -2
  117. package/dist/ir/expression-converter.js.map +1 -1
  118. package/dist/ir/generic-function-value-lowering.test.d.ts +2 -0
  119. package/dist/ir/generic-function-value-lowering.test.d.ts.map +1 -0
  120. package/dist/ir/generic-function-value-lowering.test.js +312 -0
  121. package/dist/ir/generic-function-value-lowering.test.js.map +1 -0
  122. package/dist/ir/generic-validator.d.ts +3 -4
  123. package/dist/ir/generic-validator.d.ts.map +1 -1
  124. package/dist/ir/generic-validator.js +3 -35
  125. package/dist/ir/generic-validator.js.map +1 -1
  126. package/dist/ir/program-context.d.ts +12 -0
  127. package/dist/ir/program-context.d.ts.map +1 -1
  128. package/dist/ir/program-context.js +2 -0
  129. package/dist/ir/program-context.js.map +1 -1
  130. package/dist/ir/statement-converter.d.ts +0 -2
  131. package/dist/ir/statement-converter.d.ts.map +1 -1
  132. package/dist/ir/statement-converter.js +0 -3
  133. package/dist/ir/statement-converter.js.map +1 -1
  134. package/dist/ir/type-system/internal/handle-types.d.ts +16 -16
  135. package/dist/ir/type-system/internal/handle-types.d.ts.map +1 -1
  136. package/dist/ir/type-system/internal/nominal-env.d.ts +0 -2
  137. package/dist/ir/type-system/internal/nominal-env.d.ts.map +1 -1
  138. package/dist/ir/type-system/internal/nominal-env.js +2 -6
  139. package/dist/ir/type-system/internal/nominal-env.js.map +1 -1
  140. package/dist/ir/type-system/internal/type-converter/converter.d.ts +3 -1
  141. package/dist/ir/type-system/internal/type-converter/converter.d.ts.map +1 -1
  142. package/dist/ir/type-system/internal/type-converter/converter.js +3 -1
  143. package/dist/ir/type-system/internal/type-converter/converter.js.map +1 -1
  144. package/dist/ir/type-system/internal/type-converter/objects.js +7 -1
  145. package/dist/ir/type-system/internal/type-converter/objects.js.map +1 -1
  146. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts +0 -2
  147. package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts.map +1 -1
  148. package/dist/ir/type-system/internal/type-converter/orchestrator.js +322 -23
  149. package/dist/ir/type-system/internal/type-converter/orchestrator.js.map +1 -1
  150. package/dist/ir/type-system/internal/type-converter/orchestrator.test.d.ts +2 -0
  151. package/dist/ir/type-system/internal/type-converter/orchestrator.test.d.ts.map +1 -0
  152. package/dist/ir/type-system/internal/type-converter/orchestrator.test.js +265 -0
  153. package/dist/ir/type-system/internal/type-converter/orchestrator.test.js.map +1 -0
  154. package/dist/ir/type-system/internal/type-converter/primitives.d.ts.map +1 -1
  155. package/dist/ir/type-system/internal/type-converter/primitives.js +5 -0
  156. package/dist/ir/type-system/internal/type-converter/primitives.js.map +1 -1
  157. package/dist/ir/type-system/internal/type-converter/references.d.ts.map +1 -1
  158. package/dist/ir/type-system/internal/type-converter/references.js +67 -29
  159. package/dist/ir/type-system/internal/type-converter/references.js.map +1 -1
  160. package/dist/ir/type-system/internal/type-converter/utility-types.d.ts.map +1 -1
  161. package/dist/ir/type-system/internal/type-converter/utility-types.js +145 -0
  162. package/dist/ir/type-system/internal/type-converter/utility-types.js.map +1 -1
  163. package/dist/ir/type-system/internal/type-converter/utility-types.test.js +91 -1
  164. package/dist/ir/type-system/internal/type-converter/utility-types.test.js.map +1 -1
  165. package/dist/ir/type-system/internal/type-registry.d.ts +1 -1
  166. package/dist/ir/type-system/internal/type-registry.js +7 -7
  167. package/dist/ir/type-system/internal/type-registry.js.map +1 -1
  168. package/dist/ir/type-system/internal/universe/alias-table.d.ts +0 -14
  169. package/dist/ir/type-system/internal/universe/alias-table.d.ts.map +1 -1
  170. package/dist/ir/type-system/internal/universe/alias-table.js +0 -17
  171. package/dist/ir/type-system/internal/universe/alias-table.js.map +1 -1
  172. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts +3 -0
  173. package/dist/ir/type-system/internal/universe/clr-catalog.d.ts.map +1 -1
  174. package/dist/ir/type-system/internal/universe/clr-catalog.js +4 -1044
  175. package/dist/ir/type-system/internal/universe/clr-catalog.js.map +1 -1
  176. package/dist/ir/type-system/internal/universe/clr-entry-converter.d.ts +51 -0
  177. package/dist/ir/type-system/internal/universe/clr-entry-converter.d.ts.map +1 -0
  178. package/dist/ir/type-system/internal/universe/clr-entry-converter.js +657 -0
  179. package/dist/ir/type-system/internal/universe/clr-entry-converter.js.map +1 -0
  180. package/dist/ir/type-system/internal/universe/clr-type-parser.d.ts +52 -0
  181. package/dist/ir/type-system/internal/universe/clr-type-parser.d.ts.map +1 -0
  182. package/dist/ir/type-system/internal/universe/clr-type-parser.js +481 -0
  183. package/dist/ir/type-system/internal/universe/clr-type-parser.js.map +1 -0
  184. package/dist/ir/type-system/internal/universe/clr-type-parser.test.d.ts +2 -0
  185. package/dist/ir/type-system/internal/universe/clr-type-parser.test.d.ts.map +1 -0
  186. package/dist/ir/type-system/internal/universe/clr-type-parser.test.js +55 -0
  187. package/dist/ir/type-system/internal/universe/clr-type-parser.test.js.map +1 -0
  188. package/dist/ir/type-system/internal/universe/index.d.ts +1 -1
  189. package/dist/ir/type-system/internal/universe/index.d.ts.map +1 -1
  190. package/dist/ir/type-system/internal/universe/index.js +1 -3
  191. package/dist/ir/type-system/internal/universe/index.js.map +1 -1
  192. package/dist/ir/type-system/internal/universe/unified-universe.test.js +2 -0
  193. package/dist/ir/type-system/internal/universe/unified-universe.test.js.map +1 -1
  194. package/dist/ir/type-system/type-system-call-resolution.d.ts +69 -0
  195. package/dist/ir/type-system/type-system-call-resolution.d.ts.map +1 -0
  196. package/dist/ir/type-system/type-system-call-resolution.js +1121 -0
  197. package/dist/ir/type-system/type-system-call-resolution.js.map +1 -0
  198. package/dist/ir/type-system/type-system-inference.d.ts +98 -0
  199. package/dist/ir/type-system/type-system-inference.d.ts.map +1 -0
  200. package/dist/ir/type-system/type-system-inference.js +1121 -0
  201. package/dist/ir/type-system/type-system-inference.js.map +1 -0
  202. package/dist/ir/type-system/type-system-relations.d.ts +15 -0
  203. package/dist/ir/type-system/type-system-relations.d.ts.map +1 -0
  204. package/dist/ir/type-system/type-system-relations.js +152 -0
  205. package/dist/ir/type-system/type-system-relations.js.map +1 -0
  206. package/dist/ir/type-system/type-system-state.d.ts +436 -0
  207. package/dist/ir/type-system/type-system-state.d.ts.map +1 -0
  208. package/dist/ir/type-system/type-system-state.js +212 -0
  209. package/dist/ir/type-system/type-system-state.js.map +1 -0
  210. package/dist/ir/type-system/type-system-utilities.d.ts +56 -0
  211. package/dist/ir/type-system/type-system-utilities.d.ts.map +1 -0
  212. package/dist/ir/type-system/type-system-utilities.js +373 -0
  213. package/dist/ir/type-system/type-system-utilities.js.map +1 -0
  214. package/dist/ir/type-system/type-system.d.ts +17 -358
  215. package/dist/ir/type-system/type-system.d.ts.map +1 -1
  216. package/dist/ir/type-system/type-system.js +67 -2945
  217. package/dist/ir/type-system/type-system.js.map +1 -1
  218. package/dist/ir/types/index.d.ts +1 -0
  219. package/dist/ir/types/index.d.ts.map +1 -1
  220. package/dist/ir/types/index.js +1 -0
  221. package/dist/ir/types/index.js.map +1 -1
  222. package/dist/ir/types/ir-substitution.js +1 -1
  223. package/dist/ir/types/ir-substitution.js.map +1 -1
  224. package/dist/ir/types/statements.d.ts +1 -1
  225. package/dist/ir/types/type-ops.d.ts +9 -0
  226. package/dist/ir/types/type-ops.d.ts.map +1 -0
  227. package/dist/ir/types/type-ops.js +134 -0
  228. package/dist/ir/types/type-ops.js.map +1 -0
  229. package/dist/ir/types/type-ops.test.d.ts +2 -0
  230. package/dist/ir/types/type-ops.test.d.ts.map +1 -0
  231. package/dist/ir/types/type-ops.test.js +73 -0
  232. package/dist/ir/types/type-ops.test.js.map +1 -0
  233. package/dist/ir/validation/anonymous-type-lowering-pass.d.ts.map +1 -1
  234. package/dist/ir/validation/anonymous-type-lowering-pass.js +34 -0
  235. package/dist/ir/validation/anonymous-type-lowering-pass.js.map +1 -1
  236. package/dist/ir/validation/anonymous-type-lowering-regressions.test.d.ts +2 -0
  237. package/dist/ir/validation/anonymous-type-lowering-regressions.test.d.ts.map +1 -0
  238. package/dist/ir/validation/anonymous-type-lowering-regressions.test.js +121 -0
  239. package/dist/ir/validation/anonymous-type-lowering-regressions.test.js.map +1 -0
  240. package/dist/ir/validation/attribute-collection/arg-extractor.d.ts +58 -0
  241. package/dist/ir/validation/attribute-collection/arg-extractor.d.ts.map +1 -0
  242. package/dist/ir/validation/attribute-collection/arg-extractor.js +284 -0
  243. package/dist/ir/validation/attribute-collection/arg-extractor.js.map +1 -0
  244. package/dist/ir/validation/attribute-collection/marker-parser.d.ts +28 -0
  245. package/dist/ir/validation/attribute-collection/marker-parser.d.ts.map +1 -0
  246. package/dist/ir/validation/attribute-collection/marker-parser.js +404 -0
  247. package/dist/ir/validation/attribute-collection/marker-parser.js.map +1 -0
  248. package/dist/ir/validation/attribute-collection/orchestrator.d.ts +28 -0
  249. package/dist/ir/validation/attribute-collection/orchestrator.d.ts.map +1 -0
  250. package/dist/ir/validation/attribute-collection/orchestrator.js +332 -0
  251. package/dist/ir/validation/attribute-collection/orchestrator.js.map +1 -0
  252. package/dist/ir/validation/attribute-collection-pass.d.ts +1 -23
  253. package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -1
  254. package/dist/ir/validation/attribute-collection-pass.js +1 -961
  255. package/dist/ir/validation/attribute-collection-pass.js.map +1 -1
  256. package/dist/ir/validation/attribute-collection-pass.test.js +12 -6
  257. package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -1
  258. package/dist/ir/validation/numeric-invariants.test.js +29 -0
  259. package/dist/ir/validation/numeric-invariants.test.js.map +1 -1
  260. package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -1
  261. package/dist/ir/validation/numeric-proof-pass.js +21 -0
  262. package/dist/ir/validation/numeric-proof-pass.js.map +1 -1
  263. package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
  264. package/dist/ir/validation/soundness-gate.js +2 -1
  265. package/dist/ir/validation/soundness-gate.js.map +1 -1
  266. package/dist/ir/validation/soundness-gate.test.js +69 -0
  267. package/dist/ir/validation/soundness-gate.test.js.map +1 -1
  268. package/dist/ir/validation/yield-lowering-pass.d.ts +11 -5
  269. package/dist/ir/validation/yield-lowering-pass.d.ts.map +1 -1
  270. package/dist/ir/validation/yield-lowering-pass.js +942 -48
  271. package/dist/ir/validation/yield-lowering-pass.js.map +1 -1
  272. package/dist/ir/validation/yield-lowering-pass.test.js +1333 -127
  273. package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
  274. package/dist/program/binding-loader.d.ts +37 -0
  275. package/dist/program/binding-loader.d.ts.map +1 -0
  276. package/dist/program/binding-loader.js +155 -0
  277. package/dist/program/binding-loader.js.map +1 -0
  278. package/dist/program/binding-registry.d.ts +106 -0
  279. package/dist/program/binding-registry.d.ts.map +1 -0
  280. package/dist/program/binding-registry.js +590 -0
  281. package/dist/program/binding-registry.js.map +1 -0
  282. package/dist/program/binding-types.d.ts +166 -0
  283. package/dist/program/binding-types.d.ts.map +1 -0
  284. package/dist/program/binding-types.js +57 -0
  285. package/dist/program/binding-types.js.map +1 -0
  286. package/dist/program/bindings.d.ts +6 -271
  287. package/dist/program/bindings.d.ts.map +1 -1
  288. package/dist/program/bindings.js +7 -781
  289. package/dist/program/bindings.js.map +1 -1
  290. package/dist/program/creation.d.ts.map +1 -1
  291. package/dist/program/creation.js +104 -13
  292. package/dist/program/creation.js.map +1 -1
  293. package/dist/program/creation.test.js +133 -1
  294. package/dist/program/creation.test.js.map +1 -1
  295. package/dist/program/diagnostics.d.ts +1 -1
  296. package/dist/program/diagnostics.d.ts.map +1 -1
  297. package/dist/program/diagnostics.js +47 -2
  298. package/dist/program/diagnostics.js.map +1 -1
  299. package/dist/program/diagnostics.test.d.ts +2 -0
  300. package/dist/program/diagnostics.test.d.ts.map +1 -0
  301. package/dist/program/diagnostics.test.js +58 -0
  302. package/dist/program/diagnostics.test.js.map +1 -0
  303. package/dist/program/types.d.ts +2 -0
  304. package/dist/program/types.d.ts.map +1 -1
  305. package/dist/resolver/clr-bindings-resolver.d.ts +0 -1
  306. package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
  307. package/dist/resolver/clr-bindings-resolver.js +22 -32
  308. package/dist/resolver/clr-bindings-resolver.js.map +1 -1
  309. package/dist/resolver/clr-bindings-resolver.test.js +0 -27
  310. package/dist/resolver/clr-bindings-resolver.test.js.map +1 -1
  311. package/dist/resolver/import-resolution.d.ts +3 -1
  312. package/dist/resolver/import-resolution.d.ts.map +1 -1
  313. package/dist/resolver/import-resolution.js +14 -11
  314. package/dist/resolver/import-resolution.js.map +1 -1
  315. package/dist/resolver/naming.d.ts.map +1 -1
  316. package/dist/resolver/naming.js +1 -0
  317. package/dist/resolver/naming.js.map +1 -1
  318. package/dist/resolver/node-module-aliases.d.ts +6 -0
  319. package/dist/resolver/node-module-aliases.d.ts.map +1 -0
  320. package/dist/resolver/node-module-aliases.js +164 -0
  321. package/dist/resolver/node-module-aliases.js.map +1 -0
  322. package/dist/resolver/node-module-aliases.test.d.ts +2 -0
  323. package/dist/resolver/node-module-aliases.test.d.ts.map +1 -0
  324. package/dist/resolver/node-module-aliases.test.js +64 -0
  325. package/dist/resolver/node-module-aliases.test.js.map +1 -0
  326. package/dist/resolver.test.js +103 -0
  327. package/dist/resolver.test.js.map +1 -1
  328. package/dist/surface/js-surface-shims.d.ts +3 -0
  329. package/dist/surface/js-surface-shims.d.ts.map +1 -0
  330. package/dist/surface/js-surface-shims.js +332 -0
  331. package/dist/surface/js-surface-shims.js.map +1 -0
  332. package/dist/surface/js-surface-shims.test.d.ts +2 -0
  333. package/dist/surface/js-surface-shims.test.d.ts.map +1 -0
  334. package/dist/surface/js-surface-shims.test.js +53 -0
  335. package/dist/surface/js-surface-shims.test.js.map +1 -0
  336. package/dist/surface/profiles.d.ts +10 -0
  337. package/dist/surface/profiles.d.ts.map +1 -0
  338. package/dist/surface/profiles.js +65 -0
  339. package/dist/surface/profiles.js.map +1 -0
  340. package/dist/surface/profiles.test.d.ts +2 -0
  341. package/dist/surface/profiles.test.d.ts.map +1 -0
  342. package/dist/surface/profiles.test.js +44 -0
  343. package/dist/surface/profiles.test.js.map +1 -0
  344. package/dist/types/diagnostic.d.ts +1 -1
  345. package/dist/types/diagnostic.d.ts.map +1 -1
  346. package/dist/types/diagnostic.js.map +1 -1
  347. package/dist/validation/features.d.ts.map +1 -1
  348. package/dist/validation/features.js +38 -13
  349. package/dist/validation/features.js.map +1 -1
  350. package/dist/validation/features.test.d.ts +2 -0
  351. package/dist/validation/features.test.d.ts.map +1 -0
  352. package/dist/validation/features.test.js +273 -0
  353. package/dist/validation/features.test.js.map +1 -0
  354. package/dist/validation/generics.d.ts +1 -1
  355. package/dist/validation/generics.d.ts.map +1 -1
  356. package/dist/validation/generics.js +2 -26
  357. package/dist/validation/generics.js.map +1 -1
  358. package/dist/validation/imports.d.ts.map +1 -1
  359. package/dist/validation/imports.js +29 -5
  360. package/dist/validation/imports.js.map +1 -1
  361. package/dist/validation/imports.test.d.ts +2 -0
  362. package/dist/validation/imports.test.d.ts.map +1 -0
  363. package/dist/validation/imports.test.js +211 -0
  364. package/dist/validation/imports.test.js.map +1 -0
  365. package/dist/validation/static-safety.d.ts +6 -6
  366. package/dist/validation/static-safety.d.ts.map +1 -1
  367. package/dist/validation/static-safety.js +163 -109
  368. package/dist/validation/static-safety.js.map +1 -1
  369. package/dist/validation/unsupported-utility-types.d.ts +3 -3
  370. package/dist/validation/unsupported-utility-types.d.ts.map +1 -1
  371. package/dist/validation/unsupported-utility-types.js +4 -7
  372. package/dist/validation/unsupported-utility-types.js.map +1 -1
  373. package/dist/validator.maximus.test.d.ts +2 -0
  374. package/dist/validator.maximus.test.d.ts.map +1 -0
  375. package/dist/validator.maximus.test.js +1214 -0
  376. package/dist/validator.maximus.test.js.map +1 -0
  377. package/dist/validator.test.js +152 -18
  378. package/dist/validator.test.js.map +1 -1
  379. package/package.json +1 -1
  380. package/dist/ir/converters/statements/declarations/registry.d.ts +0 -96
  381. package/dist/ir/converters/statements/declarations/registry.d.ts.map +0 -1
  382. package/dist/ir/converters/statements/declarations/registry.js +0 -130
  383. package/dist/ir/converters/statements/declarations/registry.js.map +0 -1
  384. package/dist/ir/this-parameter-inference.test.d.ts +0 -13
  385. package/dist/ir/this-parameter-inference.test.d.ts.map +0 -1
  386. package/dist/ir/this-parameter-inference.test.js +0 -165
  387. package/dist/ir/this-parameter-inference.test.js.map +0 -1
  388. package/dist/metadata/bindings-loader.d.ts +0 -41
  389. package/dist/metadata/bindings-loader.d.ts.map +0 -1
  390. package/dist/metadata/bindings-loader.js +0 -308
  391. package/dist/metadata/bindings-loader.js.map +0 -1
  392. package/dist/metadata/bindings-loader.test.d.ts +0 -5
  393. package/dist/metadata/bindings-loader.test.d.ts.map +0 -1
  394. package/dist/metadata/bindings-loader.test.js +0 -117
  395. package/dist/metadata/bindings-loader.test.js.map +0 -1
  396. package/dist/metadata/index.d.ts +0 -8
  397. package/dist/metadata/index.d.ts.map +0 -1
  398. package/dist/metadata/index.js +0 -7
  399. package/dist/metadata/index.js.map +0 -1
  400. package/dist/metadata/library-loader.d.ts +0 -42
  401. package/dist/metadata/library-loader.d.ts.map +0 -1
  402. package/dist/metadata/library-loader.js +0 -126
  403. package/dist/metadata/library-loader.js.map +0 -1
  404. package/dist/metadata/loader.d.ts +0 -26
  405. package/dist/metadata/loader.d.ts.map +0 -1
  406. package/dist/metadata/loader.js +0 -333
  407. package/dist/metadata/loader.js.map +0 -1
  408. package/dist/metadata/loader.test.d.ts +0 -5
  409. package/dist/metadata/loader.test.d.ts.map +0 -1
  410. package/dist/metadata/loader.test.js +0 -119
  411. package/dist/metadata/loader.test.js.map +0 -1
  412. package/dist/resolver/naming-policy.d.ts +0 -20
  413. package/dist/resolver/naming-policy.d.ts.map +0 -1
  414. package/dist/resolver/naming-policy.js +0 -40
  415. package/dist/resolver/naming-policy.js.map +0 -1
  416. package/dist/types/bindings.d.ts +0 -153
  417. package/dist/types/bindings.d.ts.map +0 -1
  418. package/dist/types/bindings.js +0 -14
  419. package/dist/types/bindings.js.map +0 -1
  420. package/dist/types/metadata.d.ts +0 -196
  421. package/dist/types/metadata.d.ts.map +0 -1
  422. package/dist/types/metadata.js +0 -10
  423. package/dist/types/metadata.js.map +0 -1
  424. package/dist/types/nested-types.d.ts +0 -111
  425. package/dist/types/nested-types.d.ts.map +0 -1
  426. package/dist/types/nested-types.js +0 -176
  427. package/dist/types/nested-types.js.map +0 -1
  428. package/dist/types/nested-types.test.d.ts +0 -5
  429. package/dist/types/nested-types.test.d.ts.map +0 -1
  430. package/dist/types/nested-types.test.js +0 -135
  431. package/dist/types/nested-types.test.js.map +0 -1
  432. package/dist/types/ref-parameters.d.ts +0 -123
  433. package/dist/types/ref-parameters.d.ts.map +0 -1
  434. package/dist/types/ref-parameters.js +0 -203
  435. package/dist/types/ref-parameters.js.map +0 -1
  436. package/dist/types/ref-parameters.test.d.ts +0 -5
  437. package/dist/types/ref-parameters.test.d.ts.map +0 -1
  438. package/dist/types/ref-parameters.test.js +0 -147
  439. package/dist/types/ref-parameters.test.js.map +0 -1
@@ -5,724 +5,5 @@
5
5
  * Falls back to Binding-resolved MemberId only when the receiver type cannot
6
6
  * be normalized nominally (e.g., tsbindgen `$instance & __views` intersections).
7
7
  */
8
- import * as ts from "typescript";
9
- import { existsSync, readFileSync } from "node:fs";
10
- import { dirname, join } from "node:path";
11
- import { getSourceSpan } from "./helpers.js";
12
- import { convertExpression } from "../../expression-converter.js";
13
- import { tsbindgenClrTypeNameToTsTypeName } from "../../../tsbindgen/names.js";
14
- import { createDiagnostic } from "../../../types/diagnostic.js";
15
- import { loadBindingsFromPath } from "../../../program/bindings.js";
16
- /**
17
- * Fallback for getDeclaredPropertyType when TypeSystem can't resolve the member.
18
- * Uses TypeSystem.typeOfMemberId() to get member types for:
19
- * - Built-in types from globals (Array.Length, string.Length, etc.)
20
- * - CLR-bound types from tsbindgen
21
- * - Types with inherited members not in TypeRegistry
22
- *
23
- * ALICE'S SPEC: Uses TypeSystem as single source of truth.
24
- */
25
- const getDeclaredPropertyTypeFallback = (node, ctx) => {
26
- // ALICE'S SPEC: Use TypeSystem.typeOfMemberId() to get member type
27
- const typeSystem = ctx.typeSystem;
28
- // Resolve property member through Binding layer
29
- const memberId = ctx.binding.resolvePropertyAccess(node);
30
- if (!memberId)
31
- return undefined;
32
- // Use TypeSystem.typeOfMemberId() to get the member's declared type
33
- const memberType = typeSystem.typeOfMemberId(memberId);
34
- // If TypeSystem returns unknownType, treat as not found
35
- if (memberType.kind === "unknownType") {
36
- return undefined;
37
- }
38
- return memberType;
39
- };
40
- /**
41
- * Get the declared property type from a property access expression.
42
- *
43
- * ALICE'S SPEC: Uses TypeSystem.typeOfMember() as primary source.
44
- * Falls back to Binding for inherited members not in TypeRegistry.
45
- *
46
- * @param node - Property access expression node
47
- * @param receiverIrType - Already-computed IR type of the receiver (object) expression
48
- * @param ctx - ProgramContext for type system and binding access
49
- * @returns The deterministically computed property type
50
- */
51
- const getDeclaredPropertyType = (node, receiverIrType, ctx) => {
52
- const DEBUG = process.env.DEBUG_PROPERTY_TYPE === "1";
53
- const propertyName = node.name.text;
54
- if (DEBUG) {
55
- console.log("[getDeclaredPropertyType]", propertyName, "on receiver:", receiverIrType);
56
- }
57
- // Try TypeSystem.typeOfMember() first
58
- const typeSystem = ctx.typeSystem;
59
- if (receiverIrType && receiverIrType.kind !== "unknownType") {
60
- const memberType = typeSystem.typeOfMember(receiverIrType, {
61
- kind: "byName",
62
- name: propertyName,
63
- });
64
- if (DEBUG) {
65
- console.log("[getDeclaredPropertyType]", propertyName, "TypeSystem returned:", memberType);
66
- }
67
- // If TypeSystem returned a valid type (not unknownType), use it
68
- if (memberType.kind !== "unknownType") {
69
- return memberType;
70
- }
71
- // Fall through to Binding fallback
72
- }
73
- // Fallback: Use Binding for inherited members not in TypeRegistry
74
- // (e.g., Array.Length from Array$instance)
75
- const fallbackResult = getDeclaredPropertyTypeFallback(node, ctx);
76
- if (DEBUG) {
77
- console.log("[getDeclaredPropertyType]", propertyName, "fallback returned:", fallbackResult);
78
- }
79
- return fallbackResult;
80
- };
81
- /**
82
- * Normalize a receiver type for computed access classification.
83
- *
84
- * This supports common TS shapes that appear at runtime:
85
- * - Nullish unions (`T | undefined` / `T | null | undefined`)
86
- * - tsbindgen-style intersection views (`T$instance & __T$views`, and primitives like
87
- * `string & String$instance & __String$views`)
88
- *
89
- * The goal is to preserve deterministic proof behavior without heuristics.
90
- */
91
- const normalizeForComputedAccess = (type) => {
92
- if (!type)
93
- return undefined;
94
- if (type.kind === "unionType") {
95
- const nonNullish = type.types.filter((t) => !(t.kind === "primitiveType" &&
96
- (t.name === "null" || t.name === "undefined")));
97
- if (nonNullish.length === 1) {
98
- const only = nonNullish[0];
99
- return only ? normalizeForComputedAccess(only) : undefined;
100
- }
101
- }
102
- if (type.kind === "intersectionType") {
103
- const pick = type.types.find((t) => t.kind === "arrayType") ??
104
- type.types.find((t) => t.kind === "dictionaryType") ??
105
- type.types.find((t) => t.kind === "primitiveType" && t.name === "string") ??
106
- type.types.find((t) => t.kind === "referenceType");
107
- return pick ? normalizeForComputedAccess(pick) : type;
108
- }
109
- return type;
110
- };
111
- /**
112
- * Classify computed member access for proof pass.
113
- * This determines whether Int32 proof is required for the index.
114
- *
115
- * Classification is based on IR type kinds, NOT string matching.
116
- * CLR indexers (arrays, List<T>, etc.) require Int32 proof for indices.
117
- *
118
- * IMPORTANT: If classification cannot be determined reliably for a CLR-bound
119
- * reference type, we conservatively assume `clrIndexer` (requires Int32 proof).
120
- * This is safer than allowing arbitrary dictionary access without proof.
121
- *
122
- * @param objectType - The inferred type of the object being accessed
123
- * @returns The access kind classification
124
- */
125
- const classifyComputedAccess = (objectType, ctx) => {
126
- const normalized = normalizeForComputedAccess(objectType);
127
- if (!normalized)
128
- return "unknown";
129
- objectType = normalized;
130
- // TypeScript array type (number[], T[], etc.)
131
- // Requires Int32 proof
132
- if (objectType.kind === "arrayType") {
133
- return "clrIndexer";
134
- }
135
- // IR dictionary type - this is the PRIMARY way to detect dictionaries
136
- // tsbindgen should emit dictionaryType for Record<K,V> and {[key: K]: V}
137
- if (objectType.kind === "dictionaryType") {
138
- return "dictionary";
139
- }
140
- // String character access: string[int]
141
- if (objectType.kind === "primitiveType" && objectType.name === "string") {
142
- return "stringChar";
143
- }
144
- if (objectType.kind === "referenceType") {
145
- const indexer = ctx.typeSystem.getIndexerInfo(objectType);
146
- if (!indexer)
147
- return "clrIndexer";
148
- return indexer.keyClrType === "System.Int32" ? "clrIndexer" : "dictionary";
149
- }
150
- return "unknown";
151
- };
152
- /**
153
- * Extract the type name from an inferred type for binding lookup.
154
- * Handles tsbindgen's naming convention where instance types are suffixed with $instance
155
- * (e.g., List_1$instance → List_1 for binding lookup)
156
- *
157
- * Also handles intersection types like `TypeName$instance & __TypeName$views`
158
- * which are common in tsbindgen-generated types. In this case, we look for
159
- * the $instance member and extract the type name from it.
160
- */
161
- const extractTypeName = (inferredType) => {
162
- if (!inferredType)
163
- return undefined;
164
- // Handle common nullish unions like `Uri | undefined` by stripping null/undefined.
165
- // This enables CLR member binding after explicit null checks in source code.
166
- if (inferredType.kind === "unionType") {
167
- const nonNullish = inferredType.types.filter((t) => !(t.kind === "primitiveType" &&
168
- (t.name === "null" || t.name === "undefined")));
169
- if (nonNullish.length === 1) {
170
- const only = nonNullish[0];
171
- return only ? extractTypeName(only) : undefined;
172
- }
173
- }
174
- // Handle primitive types - map to their CLR type names for binding lookup
175
- // This enables binding resolution for methods like string.Split(), number.ToString()
176
- if (inferredType.kind === "primitiveType") {
177
- switch (inferredType.name) {
178
- case "string":
179
- return "String"; // System.String
180
- case "number":
181
- return "Double"; // System.Double (TS number is double)
182
- case "boolean":
183
- return "Boolean"; // System.Boolean
184
- case "char":
185
- return "Char"; // System.Char
186
- default:
187
- return undefined;
188
- }
189
- }
190
- // Handle literal types - determine the CLR type from the value type
191
- // This enables binding resolution for string literals like "hello".Split(" ")
192
- if (inferredType.kind === "literalType") {
193
- const valueType = typeof inferredType.value;
194
- switch (valueType) {
195
- case "string":
196
- return "String"; // System.String
197
- case "number":
198
- return "Double"; // System.Double
199
- case "boolean":
200
- return "Boolean"; // System.Boolean
201
- default:
202
- return undefined;
203
- }
204
- }
205
- if (inferredType.kind === "referenceType") {
206
- const name = inferredType.name;
207
- // Strip $instance suffix from tsbindgen-generated type names
208
- // e.g., "List_1$instance" → "List_1" for binding lookup
209
- if (name.endsWith("$instance")) {
210
- return name.slice(0, -"$instance".length);
211
- }
212
- return name;
213
- }
214
- // Handle intersection types: TypeName$instance & __TypeName$views
215
- // This happens when TypeScript expands a type alias to its underlying intersection
216
- // during property access (e.g., listener.prefixes returns HttpListenerPrefixCollection
217
- // which is HttpListenerPrefixCollection$instance & __HttpListenerPrefixCollection$views)
218
- if (inferredType.kind === "intersectionType") {
219
- // Look for a member that ends with $instance - that's the main type
220
- for (const member of inferredType.types) {
221
- if (member.kind === "referenceType" &&
222
- member.name.endsWith("$instance")) {
223
- // Found the $instance member, strip the suffix to get the type name
224
- return member.name.slice(0, -"$instance".length);
225
- }
226
- }
227
- // Fallback: look for any referenceType that's not a $views type
228
- for (const member of inferredType.types) {
229
- if (member.kind === "referenceType" &&
230
- !member.name.startsWith("__") &&
231
- !member.name.endsWith("$views")) {
232
- return member.name;
233
- }
234
- }
235
- }
236
- return undefined;
237
- };
238
- /**
239
- * Resolve hierarchical binding for a member access
240
- * Handles namespace.type, type.member, directType.member, and instance.member patterns
241
- */
242
- const resolveHierarchicalBinding = (object, propertyName, ctx) => {
243
- const registry = ctx.bindings;
244
- const toIrMemberBinding = (overloads) => {
245
- const first = overloads[0];
246
- if (!first)
247
- return undefined;
248
- const getTargetKey = (m) => `${m.binding.assembly}:${m.binding.type}::${m.binding.member}`;
249
- const targetKey = getTargetKey(first);
250
- if (overloads.some((m) => getTargetKey(m) !== targetKey)) {
251
- // Unsafe: overloads map to different CLR targets.
252
- return undefined;
253
- }
254
- const getModifiersKey = (m) => {
255
- const mods = m.parameterModifiers ?? [];
256
- if (mods.length === 0)
257
- return "";
258
- return [...mods]
259
- .slice()
260
- .sort((a, b) => a.index - b.index)
261
- .map((mod) => `${mod.index}:${mod.modifier}`)
262
- .join(",");
263
- };
264
- const modsKey = getModifiersKey(first);
265
- const modsConsistent = overloads.every((m) => getModifiersKey(m) === modsKey);
266
- return {
267
- assembly: first.binding.assembly,
268
- type: first.binding.type,
269
- member: first.binding.member,
270
- // IMPORTANT: Only attach parameterModifiers if consistent across all overloads.
271
- // Overloads can differ in ref/out/in, and those must be selected at call time.
272
- parameterModifiers: modsConsistent &&
273
- first.parameterModifiers &&
274
- first.parameterModifiers.length > 0
275
- ? first.parameterModifiers
276
- : undefined,
277
- isExtensionMethod: first.isExtensionMethod,
278
- };
279
- };
280
- // Case 1: object is identifier → check if it's a namespace, then check if property is a type
281
- if (object.kind === "identifier") {
282
- const namespace = registry.getNamespace(object.name);
283
- if (namespace) {
284
- // Found namespace binding, check if property is a type within this namespace
285
- // Note: After schema swap, we look up by alias (TS identifier)
286
- const type = namespace.types.find((t) => t.alias === propertyName);
287
- if (type) {
288
- // This member access is namespace.type - we don't emit a member binding here
289
- // because we're just accessing a type, not calling a member
290
- return undefined;
291
- }
292
- }
293
- // Case 1b: object is a direct type import (like `Console` imported directly)
294
- // Check if the identifier is a type alias, and if so, look up the member
295
- // First try by local name, then by original name (handles aliased imports like `import { String as ClrString }`)
296
- const directType = registry.getType(object.name) ??
297
- (object.originalName ? registry.getType(object.originalName) : undefined);
298
- if (directType) {
299
- const overloads = registry.getMemberOverloads(directType.alias, propertyName);
300
- if (!overloads || overloads.length === 0)
301
- return undefined;
302
- return toIrMemberBinding(overloads);
303
- }
304
- }
305
- // Case 2: object is member expression with a type reference → check if property is a member
306
- if (object.kind === "memberAccess" && !object.isComputed) {
307
- // Walk up the chain to find if this is a type reference
308
- // For systemLinq.enumerable, the object is "systemLinq" and property is "enumerable"
309
- if (object.object.kind === "identifier") {
310
- const namespace = registry.getNamespace(object.object.name);
311
- if (namespace && typeof object.property === "string") {
312
- const type = namespace.types.find((t) => t.alias === object.property);
313
- if (type) {
314
- // The object is a type reference (namespace.type), now check if property is a member
315
- const overloads = registry.getMemberOverloads(type.alias, propertyName);
316
- if (!overloads || overloads.length === 0)
317
- return undefined;
318
- return toIrMemberBinding(overloads);
319
- }
320
- }
321
- }
322
- }
323
- // Case 3: Instance member access (e.g., numbers.add where numbers is List<T>)
324
- // Use the object's inferred type to look up the member binding
325
- const objectTypeName = extractTypeName(object.inferredType);
326
- if (objectTypeName) {
327
- // Look up member by type alias and property name
328
- const overloads = registry.getMemberOverloads(objectTypeName, propertyName);
329
- if (!overloads || overloads.length === 0)
330
- return undefined;
331
- return toIrMemberBinding(overloads);
332
- }
333
- return undefined;
334
- };
335
- const findNearestBindingsJson = (filePath) => {
336
- let currentDir = dirname(filePath);
337
- while (true) {
338
- const candidate = join(currentDir, "bindings.json");
339
- if (existsSync(candidate))
340
- return candidate;
341
- const parentDir = dirname(currentDir);
342
- if (parentDir === currentDir)
343
- return undefined;
344
- currentDir = parentDir;
345
- }
346
- };
347
- const disambiguateOverloadsByDeclaringType = (overloads, memberId, declaringTypeTsName, ctx) => {
348
- const declSourceFilePath = ctx.binding.getSourceFilePathOfMember(memberId);
349
- if (!declSourceFilePath)
350
- return undefined;
351
- const bindingsPath = findNearestBindingsJson(declSourceFilePath);
352
- if (!bindingsPath)
353
- return undefined;
354
- const raw = (() => {
355
- try {
356
- return JSON.parse(readFileSync(bindingsPath, "utf8"));
357
- }
358
- catch {
359
- return undefined;
360
- }
361
- })();
362
- if (!raw || typeof raw !== "object")
363
- return undefined;
364
- const types = raw.types;
365
- if (!Array.isArray(types))
366
- return undefined;
367
- const typeEntry = types.find((t) => {
368
- if (!t || typeof t !== "object")
369
- return false;
370
- const clrName = t.clrName;
371
- if (typeof clrName !== "string")
372
- return false;
373
- return tsbindgenClrTypeNameToTsTypeName(clrName) === declaringTypeTsName;
374
- });
375
- const expectedClrType = typeEntry && typeof typeEntry.clrName === "string"
376
- ? typeEntry.clrName
377
- : undefined;
378
- if (!expectedClrType)
379
- return undefined;
380
- const filtered = overloads.filter((m) => m.binding.type === expectedClrType);
381
- return filtered.length > 0 ? filtered : undefined;
382
- };
383
- /**
384
- * Resolve hierarchical binding for a member access using Binding-resolved MemberId.
385
- *
386
- * This is a fallback for cases where the receiver's inferredType is unavailable
387
- * (e.g., local variable typing inferred from a complex initializer), but TS can
388
- * still resolve the member symbol deterministically.
389
- *
390
- * Critical use case: CLR property casing (e.g., `.expression` → `.Expression`).
391
- */
392
- const resolveHierarchicalBindingFromMemberId = (node, propertyName, ctx) => {
393
- const memberId = ctx.binding.resolvePropertyAccess(node);
394
- if (!memberId)
395
- return undefined;
396
- const declaringTypeName = ctx.binding.getDeclaringTypeNameOfMember(memberId);
397
- if (!declaringTypeName)
398
- return undefined;
399
- const normalizeDeclaringType = (name) => {
400
- if (name.endsWith("$instance"))
401
- return name.slice(0, -"$instance".length);
402
- if (name.startsWith("__") && name.endsWith("$views")) {
403
- return name.slice("__".length, -"$views".length);
404
- }
405
- return name;
406
- };
407
- const typeAlias = normalizeDeclaringType(declaringTypeName);
408
- let overloadsAll = ctx.bindings.getMemberOverloads(typeAlias, propertyName);
409
- if (!overloadsAll || overloadsAll.length === 0) {
410
- const declSourceFilePath = ctx.binding.getSourceFilePathOfMember(memberId);
411
- const bindingsPath = declSourceFilePath !== undefined
412
- ? findNearestBindingsJson(declSourceFilePath)
413
- : undefined;
414
- // Airplane-grade: If we can locate the bindings.json that corresponds to the
415
- // tsbindgen declaration, load it on-demand and retry. This avoids relying on
416
- // "import closure" heuristics and ensures CLR binding lookup is based on the
417
- // declaration’s actual owning bindings.json.
418
- if (bindingsPath) {
419
- loadBindingsFromPath(ctx.bindings, bindingsPath);
420
- overloadsAll = ctx.bindings.getMemberOverloads(typeAlias, propertyName);
421
- }
422
- // Airplane-grade rule: If this member resolves to a tsbindgen declaration,
423
- // we MUST have a CLR binding; we must never guess member names via naming policy.
424
- //
425
- // We treat it as CLR-bound if:
426
- // - The declaring type is a tsbindgen extension interface (`__Ext_*`), OR
427
- // - We can locate a bindings.json near the declaration source file.
428
- const isClrBound = declaringTypeName.startsWith("__Ext_") || bindingsPath !== undefined;
429
- if (isClrBound && (!overloadsAll || overloadsAll.length === 0)) {
430
- ctx.diagnostics.push(createDiagnostic("TSN4004", "error", `Missing CLR binding for '${typeAlias}.${propertyName}'.`, getSourceSpan(node), bindingsPath
431
- ? `No matching member binding was found in the loaded bindings for this tsbindgen declaration. (bindings.json: ${bindingsPath})`
432
- : "No matching member binding was found for this tsbindgen extension interface member."));
433
- }
434
- return undefined;
435
- }
436
- let overloads = overloadsAll;
437
- const targetKeys = new Set(overloads.map((m) => `${m.binding.assembly}:${m.binding.type}::${m.binding.member}`));
438
- if (targetKeys.size > 1) {
439
- const disambiguated = disambiguateOverloadsByDeclaringType(overloads, memberId, typeAlias, ctx);
440
- if (disambiguated) {
441
- overloads = disambiguated;
442
- }
443
- }
444
- const first = overloads[0];
445
- if (!first)
446
- return undefined;
447
- const targetKey = `${first.binding.assembly}:${first.binding.type}::${first.binding.member}`;
448
- if (overloads.some((m) => `${m.binding.assembly}:${m.binding.type}::${m.binding.member}` !==
449
- targetKey)) {
450
- const declSourceFilePath = ctx.binding.getSourceFilePathOfMember(memberId);
451
- const bindingsPath = declSourceFilePath !== undefined
452
- ? findNearestBindingsJson(declSourceFilePath)
453
- : undefined;
454
- // Only treat this as a CLR ambiguity when we can locate a bindings.json near the
455
- // TS declaration source (tsbindgen packages). Otherwise, fall back to "no binding"
456
- // and let local codepaths handle naming policy.
457
- if (bindingsPath) {
458
- const targets = [
459
- ...new Set(overloads.map((m) => `${m.binding.type}.${m.binding.member}`)),
460
- ]
461
- .sort()
462
- .join(", ");
463
- ctx.diagnostics.push(createDiagnostic("TSN4003", "error", `Ambiguous CLR binding for '${typeAlias}.${propertyName}'. Multiple CLR targets found: ${targets}.`, getSourceSpan(node), `This usually indicates multiple tsbindgen packages export the same TS type/member alias. Ensure the correct package is imported, or regenerate bindings to avoid collisions. (bindings.json: ${bindingsPath})`));
464
- }
465
- return undefined;
466
- }
467
- const getModifiersKey = (m) => {
468
- const mods = m.parameterModifiers ?? [];
469
- if (mods.length === 0)
470
- return "";
471
- return [...mods]
472
- .slice()
473
- .sort((a, b) => a.index - b.index)
474
- .map((mod) => `${mod.index}:${mod.modifier}`)
475
- .join(",");
476
- };
477
- const modsKey = getModifiersKey(first);
478
- const modsConsistent = overloads.every((m) => getModifiersKey(m) === modsKey);
479
- return {
480
- assembly: first.binding.assembly,
481
- type: first.binding.type,
482
- member: first.binding.member,
483
- parameterModifiers: modsConsistent &&
484
- first.parameterModifiers &&
485
- first.parameterModifiers.length > 0
486
- ? first.parameterModifiers
487
- : undefined,
488
- isExtensionMethod: first.isExtensionMethod,
489
- };
490
- };
491
- /**
492
- * Resolve instance-style extension method bindings from tsbindgen's `ExtensionMethods` typing.
493
- *
494
- * tsbindgen emits extension methods as interface members on `__Ext_*` types, and users
495
- * opt in via `ExtensionMethods<TShape>`. At runtime those members do not exist, so we
496
- * must attach the underlying CLR binding so the emitter can lower the call to an
497
- * explicit static invocation.
498
- */
499
- const resolveExtensionMethodsBinding = (node, propertyName, ctx) => {
500
- const memberId = ctx.binding.resolvePropertyAccess(node);
501
- if (!memberId)
502
- return undefined;
503
- const declaringTypeName = ctx.binding.getDeclaringTypeNameOfMember(memberId);
504
- if (!declaringTypeName)
505
- return undefined;
506
- const callArgumentCount = (() => {
507
- const parent = node.parent;
508
- if (ts.isCallExpression(parent) && parent.expression === node) {
509
- return parent.arguments.length;
510
- }
511
- return undefined;
512
- })();
513
- // Debug/diagnostic context for airplane-grade failures.
514
- // These are populated during resolution and surfaced only if resolution fails.
515
- let sigDeclaringTypeNameForError;
516
- let namespaceKeyForError;
517
- let receiverTypeNameForError;
518
- const resolved = (() => {
519
- const parent = node.parent;
520
- if (!ts.isCallExpression(parent) || parent.expression !== node)
521
- return undefined;
522
- const sigId = ctx.binding.resolveCallSignature(parent);
523
- if (!sigId)
524
- return undefined;
525
- // IMPORTANT (airplane-grade): the same TS member name can exist in multiple extension
526
- // namespaces (e.g., BCL async LINQ and EF Core both define ToArrayAsync). When the
527
- // receiver expression is not an identifier, `resolvePropertyAccess` can key the member
528
- // entry off the member symbol itself, which merges declarations. Always anchor to the
529
- // resolved signature’s declaring type to choose the correct CLR extension binding.
530
- const sigDeclaringTypeName = ctx.binding.getDeclaringTypeNameOfSignature(sigId);
531
- sigDeclaringTypeNameForError = sigDeclaringTypeName;
532
- if (!sigDeclaringTypeName)
533
- return undefined;
534
- // Legacy tsbindgen format: extension methods emitted on `__Ext_*` bucket interfaces.
535
- if (sigDeclaringTypeName.startsWith("__Ext_")) {
536
- return ctx.bindings.resolveExtensionMethod(sigDeclaringTypeName, propertyName, callArgumentCount);
537
- }
538
- // New format: extension methods emitted on method-table interfaces:
539
- // interface __TsonicExtMethods_System_Linq { Where(this: IQueryable_1<T>, ...): ... }
540
- if (sigDeclaringTypeName.startsWith("__TsonicExtMethods_")) {
541
- const namespaceKey = sigDeclaringTypeName.slice("__TsonicExtMethods_".length);
542
- namespaceKeyForError = namespaceKey;
543
- if (!namespaceKey)
544
- return undefined;
545
- const thisTypeNode = ctx.binding.getThisTypeNodeOfSignature(sigId);
546
- if (!thisTypeNode)
547
- return undefined;
548
- const extractReceiverTypeName = (typeNode) => {
549
- let current = typeNode;
550
- while (ts.isParenthesizedTypeNode(current))
551
- current = current.type;
552
- if (ts.isTypeReferenceNode(current)) {
553
- const tn = current.typeName;
554
- if (ts.isIdentifier(tn))
555
- return tn.text;
556
- if (ts.isQualifiedName(tn))
557
- return tn.right.text;
558
- }
559
- return undefined;
560
- };
561
- const receiverTypeName = extractReceiverTypeName(thisTypeNode);
562
- receiverTypeNameForError = receiverTypeName;
563
- if (!receiverTypeName)
564
- return undefined;
565
- return ctx.bindings.resolveExtensionMethodByKey(namespaceKey, receiverTypeName, propertyName, callArgumentCount);
566
- }
567
- return undefined;
568
- })();
569
- if (!resolved) {
570
- // Airplane-grade: if the TS surface indicates this member comes from an extension-method
571
- // module, failing to attach a CLR binding would emit an instance call that cannot exist
572
- // at runtime. Treat as a hard error rather than miscompiling.
573
- if (declaringTypeName.startsWith("__Ext_") ||
574
- declaringTypeName.startsWith("__TsonicExtMethods_")) {
575
- const detail = [
576
- sigDeclaringTypeNameForError
577
- ? `Resolved signature declares: '${sigDeclaringTypeNameForError}'.`
578
- : "Resolved signature declaring type: <unknown>.",
579
- namespaceKeyForError
580
- ? `Namespace key: '${namespaceKeyForError}'.`
581
- : "Namespace key: <unknown>.",
582
- receiverTypeNameForError
583
- ? `Receiver type: '${receiverTypeNameForError}'.`
584
- : "Receiver type: <unknown>.",
585
- ].join(" ");
586
- ctx.diagnostics.push(createDiagnostic("TSN4004", "error", `Failed to resolve CLR extension-method binding for '${propertyName}' on '${declaringTypeName}'. ${detail}`, getSourceSpan(node), "This indicates a mismatch between the generated .d.ts surface and bindings.json extension metadata. Regenerate bindings and ensure the correct packages are installed."));
587
- }
588
- return undefined;
589
- }
590
- // tsbindgen parameterModifiers indices include the extension receiver at index 0.
591
- // For instance-style calls, our call-site arguments exclude the receiver, so shift by -1.
592
- const shiftedModifiers = resolved.parameterModifiers
593
- ? resolved.parameterModifiers
594
- .map((m) => ({ index: m.index - 1, modifier: m.modifier }))
595
- .filter((m) => m.index >= 0)
596
- : undefined;
597
- return {
598
- assembly: resolved.binding.assembly,
599
- type: resolved.binding.type,
600
- member: resolved.binding.member,
601
- parameterModifiers: shiftedModifiers && shiftedModifiers.length > 0
602
- ? shiftedModifiers
603
- : undefined,
604
- isExtensionMethod: resolved.isExtensionMethod,
605
- };
606
- };
607
- /**
608
- * Derive element type from object type for element access.
609
- * - Array type → element type
610
- * - Dictionary type → value type
611
- * - String → string (single character)
612
- * - Other → undefined
613
- */
614
- const deriveElementType = (objectType, ctx) => {
615
- objectType = normalizeForComputedAccess(objectType);
616
- if (!objectType)
617
- return undefined;
618
- if (objectType.kind === "arrayType") {
619
- return objectType.elementType;
620
- }
621
- if (objectType.kind === "dictionaryType") {
622
- return objectType.valueType;
623
- }
624
- if (objectType.kind === "primitiveType" && objectType.name === "string") {
625
- // string[n] returns a single character (string in TS, char in C#)
626
- return { kind: "primitiveType", name: "string" };
627
- }
628
- if (objectType.kind === "referenceType" &&
629
- objectType.name === "Span" &&
630
- objectType.typeArguments &&
631
- objectType.typeArguments.length === 1) {
632
- return objectType.typeArguments[0];
633
- }
634
- if (objectType.kind === "referenceType") {
635
- return ctx.typeSystem.getIndexerInfo(objectType)?.valueType;
636
- }
637
- return undefined;
638
- };
639
- /**
640
- * Convert property access or element access expression
641
- */
642
- export const convertMemberExpression = (node, ctx) => {
643
- const isOptional = node.questionDotToken !== undefined;
644
- const sourceSpan = getSourceSpan(node);
645
- if (ts.isPropertyAccessExpression(node)) {
646
- const object = convertExpression(node.expression, ctx, undefined);
647
- const propertyName = node.name.text;
648
- // Try to resolve hierarchical binding
649
- const memberBinding = resolveExtensionMethodsBinding(node, propertyName, ctx) ??
650
- resolveHierarchicalBindingFromMemberId(node, propertyName, ctx) ??
651
- resolveHierarchicalBinding(object, propertyName, ctx);
652
- // DETERMINISTIC TYPING: Property type comes from NominalEnv + TypeRegistry for
653
- // user-defined types (including inherited members), with fallback to Binding layer
654
- // for built-ins and CLR types.
655
- //
656
- // The receiver's inferredType enables NominalEnv to walk inheritance chains
657
- // and substitute type parameters correctly for inherited generic members.
658
- //
659
- // Built-ins like string.length work because globals declare them with proper types.
660
- // If getDeclaredPropertyType returns undefined, it means the property declaration
661
- // is missing - use unknownType as poison so validation can emit TSN5203.
662
- //
663
- // EXCEPTION: If memberBinding exists AND declaredType is undefined, return undefined.
664
- // This handles pure CLR-bound methods like Console.WriteLine that have no TS declaration.
665
- const declaredType = getDeclaredPropertyType(node, object.inferredType, ctx);
666
- // Hierarchical bindings: namespace.type is a static type reference, not a runtime
667
- // value. When this pattern is present in the binding manifest, avoid poisoning the
668
- // receiver with unknownType; the emitter uses "no inferredType" to classify the
669
- // receiver as a static type, enabling global::Type.Member emission.
670
- const isNamespaceTypeReference = object.kind === "identifier" &&
671
- ctx.bindings
672
- .getNamespace(object.name)
673
- ?.types.some((t) => t.alias === propertyName) === true;
674
- // DETERMINISTIC TYPING: Set inferredType for validation passes (like numeric proof).
675
- // The emitter uses memberBinding separately for C# casing (e.g., length -> Length).
676
- //
677
- // Priority order for inferredType:
678
- // 1. If declaredType exists, use it (covers built-ins like string.length -> int)
679
- // 2. If memberBinding exists but no declaredType, use undefined (pure CLR-bound)
680
- // 3. Otherwise, poison with unknownType for validation (TSN5203)
681
- //
682
- // Note: Both memberBinding AND inferredType can be set - they serve different purposes:
683
- // - memberBinding: used by emitter for C# member names
684
- // - inferredType: used by validation passes for type checking
685
- //
686
- // Class fields without explicit type annotations will emit TSN5203.
687
- // Users must add explicit types like `count: int = 0` instead of `count = 0`.
688
- const propertyInferredType = declaredType
689
- ? declaredType
690
- : isNamespaceTypeReference
691
- ? undefined
692
- : memberBinding
693
- ? undefined
694
- : { kind: "unknownType" };
695
- return {
696
- kind: "memberAccess",
697
- object,
698
- property: propertyName,
699
- isComputed: false,
700
- isOptional,
701
- inferredType: propertyInferredType,
702
- sourceSpan,
703
- memberBinding,
704
- };
705
- }
706
- else {
707
- // Element access (computed): obj[expr]
708
- const object = convertExpression(node.expression, ctx, undefined);
709
- // DETERMINISTIC TYPING: Use object's inferredType (not getInferredType)
710
- const objectType = object.inferredType;
711
- // Classify the access kind for proof pass
712
- // This determines whether Int32 proof is required for the index
713
- const accessKind = classifyComputedAccess(objectType, ctx);
714
- // Derive element type from object type
715
- const elementType = deriveElementType(objectType, ctx);
716
- return {
717
- kind: "memberAccess",
718
- object,
719
- property: convertExpression(node.argumentExpression, ctx, undefined),
720
- isComputed: true,
721
- isOptional,
722
- inferredType: elementType,
723
- sourceSpan,
724
- accessKind,
725
- };
726
- }
727
- };
8
+ export { convertMemberExpression } from "./access/access-converter.js";
728
9
  //# sourceMappingURL=access.js.map