@lzehrung/codegraph 2.4.0 → 3.0.1

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 (452) hide show
  1. package/README.md +5 -4
  2. package/codegraph-skill/codegraph/SKILL.md +3 -3
  3. package/dist/agent/call-hierarchy.js +2 -4
  4. package/dist/agent/call-hierarchy.js.map +1 -1
  5. package/dist/agent/explore.d.ts +1 -1
  6. package/dist/agent/explore.d.ts.map +1 -1
  7. package/dist/agent/explore.js +3 -2
  8. package/dist/agent/explore.js.map +1 -1
  9. package/dist/agent/refactor-plan.js +2 -4
  10. package/dist/agent/refactor-plan.js.map +1 -1
  11. package/dist/agent/rename-preview.d.ts.map +1 -1
  12. package/dist/agent/rename-preview.js +58 -8
  13. package/dist/agent/rename-preview.js.map +1 -1
  14. package/dist/agent/search.js +2 -3
  15. package/dist/agent/search.js.map +1 -1
  16. package/dist/agent/semantic-symbols.d.ts.map +1 -1
  17. package/dist/agent/semantic-symbols.js +2 -3
  18. package/dist/agent/semantic-symbols.js.map +1 -1
  19. package/dist/agent/type-hierarchy.js +2 -4
  20. package/dist/agent/type-hierarchy.js.map +1 -1
  21. package/dist/agent/workspace-symbols.d.ts.map +1 -1
  22. package/dist/agent/workspace-symbols.js +2 -3
  23. package/dist/agent/workspace-symbols.js.map +1 -1
  24. package/dist/agent-tools.d.ts +0 -4
  25. package/dist/agent-tools.d.ts.map +1 -1
  26. package/dist/agent-tools.js +3 -6
  27. package/dist/agent-tools.js.map +1 -1
  28. package/dist/analysis-summary.d.ts +8 -4
  29. package/dist/analysis-summary.d.ts.map +1 -1
  30. package/dist/analysis-summary.js +15 -66
  31. package/dist/analysis-summary.js.map +1 -1
  32. package/dist/bin/cli.js +14417 -16886
  33. package/dist/bin/query-index-worker.js +229 -99
  34. package/dist/cli/command-table.d.ts.map +1 -1
  35. package/dist/cli/command-table.js +9 -17
  36. package/dist/cli/command-table.js.map +1 -1
  37. package/dist/cli/context.js +10 -10
  38. package/dist/cli/context.js.map +1 -1
  39. package/dist/cli/drift.d.ts +0 -2
  40. package/dist/cli/drift.d.ts.map +1 -1
  41. package/dist/cli/drift.js +0 -1
  42. package/dist/cli/drift.js.map +1 -1
  43. package/dist/cli/graph-delta.d.ts +0 -2
  44. package/dist/cli/graph-delta.d.ts.map +1 -1
  45. package/dist/cli/graph-delta.js +0 -4
  46. package/dist/cli/graph-delta.js.map +1 -1
  47. package/dist/cli/graph.d.ts +0 -3
  48. package/dist/cli/graph.d.ts.map +1 -1
  49. package/dist/cli/graph.js +4 -14
  50. package/dist/cli/graph.js.map +1 -1
  51. package/dist/cli/help.d.ts +34 -34
  52. package/dist/cli/help.d.ts.map +1 -1
  53. package/dist/cli/help.js +6 -13
  54. package/dist/cli/help.js.map +1 -1
  55. package/dist/cli/impact.d.ts +0 -2
  56. package/dist/cli/impact.d.ts.map +1 -1
  57. package/dist/cli/impact.js +0 -1
  58. package/dist/cli/impact.js.map +1 -1
  59. package/dist/cli/index.d.ts +0 -2
  60. package/dist/cli/index.d.ts.map +1 -1
  61. package/dist/cli/index.js +5 -6
  62. package/dist/cli/index.js.map +1 -1
  63. package/dist/cli/inspect.d.ts +0 -2
  64. package/dist/cli/inspect.d.ts.map +1 -1
  65. package/dist/cli/inspect.js +5 -8
  66. package/dist/cli/inspect.js.map +1 -1
  67. package/dist/cli/invocation-context.d.ts +0 -3
  68. package/dist/cli/invocation-context.d.ts.map +1 -1
  69. package/dist/cli/invocation-context.js +4 -16
  70. package/dist/cli/invocation-context.js.map +1 -1
  71. package/dist/cli/navigation.d.ts +0 -2
  72. package/dist/cli/navigation.d.ts.map +1 -1
  73. package/dist/cli/navigation.js +0 -1
  74. package/dist/cli/navigation.js.map +1 -1
  75. package/dist/cli/options.d.ts.map +1 -1
  76. package/dist/cli/options.js +2 -12
  77. package/dist/cli/options.js.map +1 -1
  78. package/dist/cli/review.d.ts +0 -2
  79. package/dist/cli/review.d.ts.map +1 -1
  80. package/dist/cli/review.js +0 -5
  81. package/dist/cli/review.js.map +1 -1
  82. package/dist/cli/root-policy.d.ts +0 -2
  83. package/dist/cli/root-policy.d.ts.map +1 -1
  84. package/dist/cli/root-policy.js +0 -8
  85. package/dist/cli/root-policy.js.map +1 -1
  86. package/dist/cli/server.d.ts.map +1 -1
  87. package/dist/cli/server.js +0 -2
  88. package/dist/cli/server.js.map +1 -1
  89. package/dist/drift/git.d.ts.map +1 -1
  90. package/dist/drift/git.js +0 -1
  91. package/dist/drift/git.js.map +1 -1
  92. package/dist/drift/snapshot.d.ts.map +1 -1
  93. package/dist/drift/snapshot.js +0 -1
  94. package/dist/drift/snapshot.js.map +1 -1
  95. package/dist/drift/types.d.ts +0 -2
  96. package/dist/drift/types.d.ts.map +1 -1
  97. package/dist/drift/types.js.map +1 -1
  98. package/dist/duplicates/unit-cache.d.ts +0 -1
  99. package/dist/duplicates/unit-cache.d.ts.map +1 -1
  100. package/dist/duplicates/unit-cache.js +3 -11
  101. package/dist/duplicates/unit-cache.js.map +1 -1
  102. package/dist/duplicates/units.d.ts +5 -5
  103. package/dist/duplicates/units.d.ts.map +1 -1
  104. package/dist/duplicates/units.js +25 -88
  105. package/dist/duplicates/units.js.map +1 -1
  106. package/dist/graph-builder.d.ts +0 -6
  107. package/dist/graph-builder.d.ts.map +1 -1
  108. package/dist/graph-builder.js +2 -5
  109. package/dist/graph-builder.js.map +1 -1
  110. package/dist/graph-edge-collector.d.ts +1 -6
  111. package/dist/graph-edge-collector.d.ts.map +1 -1
  112. package/dist/graph-edge-collector.js +23 -21
  113. package/dist/graph-edge-collector.js.map +1 -1
  114. package/dist/graphs/edge-resolution.d.ts +1 -1
  115. package/dist/graphs/edge-resolution.d.ts.map +1 -1
  116. package/dist/graphs/edge-resolution.js +22 -98
  117. package/dist/graphs/edge-resolution.js.map +1 -1
  118. package/dist/graphs/specifiers.d.ts +4 -13
  119. package/dist/graphs/specifiers.d.ts.map +1 -1
  120. package/dist/graphs/specifiers.js +76 -173
  121. package/dist/graphs/specifiers.js.map +1 -1
  122. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +12 -3
  123. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
  124. package/dist/graphs/symbol-graph-detailed/edge-passes.js +315 -177
  125. package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
  126. package/dist/graphs/symbol-graph-detailed/import-aliases.d.ts.map +1 -1
  127. package/dist/graphs/symbol-graph-detailed/import-aliases.js +11 -0
  128. package/dist/graphs/symbol-graph-detailed/import-aliases.js.map +1 -1
  129. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +25 -22
  130. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
  131. package/dist/graphs/symbol-graph-detailed/receiver-calls.js +216 -147
  132. package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
  133. package/dist/graphs/symbol-graph-detailed.d.ts.map +1 -1
  134. package/dist/graphs/symbol-graph-detailed.js +80 -71
  135. package/dist/graphs/symbol-graph-detailed.js.map +1 -1
  136. package/dist/graphs/symbol-graph.d.ts +1 -1
  137. package/dist/graphs/symbol-graph.d.ts.map +1 -1
  138. package/dist/graphs/symbol-graph.js +12 -4
  139. package/dist/graphs/symbol-graph.js.map +1 -1
  140. package/dist/graphs/types.d.ts +0 -4
  141. package/dist/graphs/types.d.ts.map +1 -1
  142. package/dist/graphs.d.ts +1 -1
  143. package/dist/graphs.d.ts.map +1 -1
  144. package/dist/impact/analyzer.d.ts.map +1 -1
  145. package/dist/impact/analyzer.js +94 -1
  146. package/dist/impact/analyzer.js.map +1 -1
  147. package/dist/impact/call-compatibility.d.ts.map +1 -1
  148. package/dist/impact/call-compatibility.js +39 -43
  149. package/dist/impact/call-compatibility.js.map +1 -1
  150. package/dist/impact/transitive.d.ts +6 -2
  151. package/dist/impact/transitive.d.ts.map +1 -1
  152. package/dist/impact/transitive.js +23 -11
  153. package/dist/impact/transitive.js.map +1 -1
  154. package/dist/index.d.ts +2 -2
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js.map +1 -1
  157. package/dist/indexer/build-cache/module-cache.d.ts +1 -1
  158. package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
  159. package/dist/indexer/build-cache/module-cache.js +67 -12
  160. package/dist/indexer/build-cache/module-cache.js.map +1 -1
  161. package/dist/indexer/build-cache/options.d.ts +17 -2
  162. package/dist/indexer/build-cache/options.d.ts.map +1 -1
  163. package/dist/indexer/build-cache/options.js +19 -29
  164. package/dist/indexer/build-cache/options.js.map +1 -1
  165. package/dist/indexer/build-cache/project-snapshot.d.ts +3 -4
  166. package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
  167. package/dist/indexer/build-cache/project-snapshot.js +53 -62
  168. package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
  169. package/dist/indexer/build-cache/reports.d.ts +0 -2
  170. package/dist/indexer/build-cache/reports.d.ts.map +1 -1
  171. package/dist/indexer/build-cache/reports.js +0 -97
  172. package/dist/indexer/build-cache/reports.js.map +1 -1
  173. package/dist/indexer/build-cache.d.ts +1 -1
  174. package/dist/indexer/build-cache.d.ts.map +1 -1
  175. package/dist/indexer/build-cache.js +1 -1
  176. package/dist/indexer/build-cache.js.map +1 -1
  177. package/dist/indexer/build-index.d.ts.map +1 -1
  178. package/dist/indexer/build-index.js +72 -58
  179. package/dist/indexer/build-index.js.map +1 -1
  180. package/dist/indexer/build-workers.d.ts.map +1 -1
  181. package/dist/indexer/build-workers.js +9 -9
  182. package/dist/indexer/build-workers.js.map +1 -1
  183. package/dist/indexer/callable-identity.d.ts +24 -0
  184. package/dist/indexer/callable-identity.d.ts.map +1 -0
  185. package/dist/indexer/callable-identity.js +111 -0
  186. package/dist/indexer/callable-identity.js.map +1 -0
  187. package/dist/indexer/compilation-units.d.ts +2 -0
  188. package/dist/indexer/compilation-units.d.ts.map +1 -1
  189. package/dist/indexer/compilation-units.js +20 -18
  190. package/dist/indexer/compilation-units.js.map +1 -1
  191. package/dist/indexer/cpp-callables.d.ts +12 -7
  192. package/dist/indexer/cpp-callables.d.ts.map +1 -1
  193. package/dist/indexer/cpp-callables.js +42 -34
  194. package/dist/indexer/cpp-callables.js.map +1 -1
  195. package/dist/indexer/declaration-visibility.d.ts +7 -0
  196. package/dist/indexer/declaration-visibility.d.ts.map +1 -1
  197. package/dist/indexer/declaration-visibility.js +22 -0
  198. package/dist/indexer/declaration-visibility.js.map +1 -1
  199. package/dist/indexer/declarations.d.ts.map +1 -1
  200. package/dist/indexer/declarations.js +32 -7
  201. package/dist/indexer/declarations.js.map +1 -1
  202. package/dist/indexer/expand-star-imports.d.ts +6 -1
  203. package/dist/indexer/expand-star-imports.d.ts.map +1 -1
  204. package/dist/indexer/expand-star-imports.js +120 -48
  205. package/dist/indexer/expand-star-imports.js.map +1 -1
  206. package/dist/indexer/finalize.d.ts.map +1 -1
  207. package/dist/indexer/finalize.js +0 -1
  208. package/dist/indexer/finalize.js.map +1 -1
  209. package/dist/indexer/import-resolution-tables.d.ts +72 -0
  210. package/dist/indexer/import-resolution-tables.d.ts.map +1 -0
  211. package/dist/indexer/import-resolution-tables.js +147 -0
  212. package/dist/indexer/import-resolution-tables.js.map +1 -0
  213. package/dist/indexer/import-types.d.ts +18 -1
  214. package/dist/indexer/import-types.d.ts.map +1 -1
  215. package/dist/indexer/import-types.js.map +1 -1
  216. package/dist/indexer/imports/context.d.ts +6 -1
  217. package/dist/indexer/imports/context.d.ts.map +1 -1
  218. package/dist/indexer/imports/import-binding-tables.d.ts +3 -2
  219. package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
  220. package/dist/indexer/imports/import-binding-tables.js +19 -22
  221. package/dist/indexer/imports/import-binding-tables.js.map +1 -1
  222. package/dist/indexer/imports/native-captures.d.ts.map +1 -1
  223. package/dist/indexer/imports/native-captures.js +10 -4
  224. package/dist/indexer/imports/native-captures.js.map +1 -1
  225. package/dist/indexer/imports/python.d.ts.map +1 -1
  226. package/dist/indexer/imports/python.js +46 -81
  227. package/dist/indexer/imports/python.js.map +1 -1
  228. package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
  229. package/dist/indexer/imports/text-import-extractors.js +17 -7
  230. package/dist/indexer/imports/text-import-extractors.js.map +1 -1
  231. package/dist/indexer/imports.d.ts +3 -4
  232. package/dist/indexer/imports.d.ts.map +1 -1
  233. package/dist/indexer/imports.js +106 -81
  234. package/dist/indexer/imports.js.map +1 -1
  235. package/dist/indexer/incremental-plan.d.ts.map +1 -1
  236. package/dist/indexer/incremental-plan.js +27 -11
  237. package/dist/indexer/incremental-plan.js.map +1 -1
  238. package/dist/indexer/locals-and-exports.d.ts +1 -2
  239. package/dist/indexer/locals-and-exports.d.ts.map +1 -1
  240. package/dist/indexer/locals-and-exports.js +121 -43
  241. package/dist/indexer/locals-and-exports.js.map +1 -1
  242. package/dist/indexer/member-selection.d.ts +46 -0
  243. package/dist/indexer/member-selection.d.ts.map +1 -0
  244. package/dist/indexer/member-selection.js +169 -0
  245. package/dist/indexer/member-selection.js.map +1 -0
  246. package/dist/indexer/name-lookup-policies/c-family.d.ts +1 -1
  247. package/dist/indexer/name-lookup-policies/c-family.d.ts.map +1 -1
  248. package/dist/indexer/name-lookup-policies/c-family.js +30 -10
  249. package/dist/indexer/name-lookup-policies/c-family.js.map +1 -1
  250. package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -1
  251. package/dist/indexer/name-lookup-policies/implicit-self.js +14 -8
  252. package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -1
  253. package/dist/indexer/name-lookup-policies/index.d.ts.map +1 -1
  254. package/dist/indexer/name-lookup-policies/index.js +29 -3
  255. package/dist/indexer/name-lookup-policies/index.js.map +1 -1
  256. package/dist/indexer/name-lookup-policies/php.d.ts.map +1 -1
  257. package/dist/indexer/name-lookup-policies/php.js +9 -2
  258. package/dist/indexer/name-lookup-policies/php.js.map +1 -1
  259. package/dist/indexer/name-resolution-types.d.ts +2 -0
  260. package/dist/indexer/name-resolution-types.d.ts.map +1 -1
  261. package/dist/indexer/name-resolution.d.ts +5 -0
  262. package/dist/indexer/name-resolution.d.ts.map +1 -1
  263. package/dist/indexer/name-resolution.js +17 -2
  264. package/dist/indexer/name-resolution.js.map +1 -1
  265. package/dist/indexer/navigation-cpp.d.ts +8 -0
  266. package/dist/indexer/navigation-cpp.d.ts.map +1 -1
  267. package/dist/indexer/navigation-cpp.js +283 -2
  268. package/dist/indexer/navigation-cpp.js.map +1 -1
  269. package/dist/indexer/navigation-goto.d.ts +11 -2
  270. package/dist/indexer/navigation-goto.d.ts.map +1 -1
  271. package/dist/indexer/navigation-goto.js +675 -333
  272. package/dist/indexer/navigation-goto.js.map +1 -1
  273. package/dist/indexer/navigation-local.d.ts +4 -1
  274. package/dist/indexer/navigation-local.d.ts.map +1 -1
  275. package/dist/indexer/navigation-local.js +43 -23
  276. package/dist/indexer/navigation-local.js.map +1 -1
  277. package/dist/indexer/navigation-provenance.d.ts +1 -1
  278. package/dist/indexer/navigation-provenance.d.ts.map +1 -1
  279. package/dist/indexer/navigation-provenance.js +4 -13
  280. package/dist/indexer/navigation-provenance.js.map +1 -1
  281. package/dist/indexer/navigation-references.d.ts +1 -1
  282. package/dist/indexer/navigation-references.d.ts.map +1 -1
  283. package/dist/indexer/navigation-references.js +44 -16
  284. package/dist/indexer/navigation-references.js.map +1 -1
  285. package/dist/indexer/navigation-resolve.d.ts +13 -0
  286. package/dist/indexer/navigation-resolve.d.ts.map +1 -1
  287. package/dist/indexer/navigation-resolve.js +158 -5
  288. package/dist/indexer/navigation-resolve.js.map +1 -1
  289. package/dist/indexer/navigation.d.ts +2 -1
  290. package/dist/indexer/navigation.d.ts.map +1 -1
  291. package/dist/indexer/navigation.js +82 -57
  292. package/dist/indexer/navigation.js.map +1 -1
  293. package/dist/indexer/parse-context.d.ts +2 -3
  294. package/dist/indexer/parse-context.d.ts.map +1 -1
  295. package/dist/indexer/parse-context.js +8 -21
  296. package/dist/indexer/parse-context.js.map +1 -1
  297. package/dist/indexer/reference-candidates.d.ts.map +1 -1
  298. package/dist/indexer/reference-candidates.js +13 -7
  299. package/dist/indexer/reference-candidates.js.map +1 -1
  300. package/dist/indexer/reference-context.d.ts.map +1 -1
  301. package/dist/indexer/reference-context.js +4 -1
  302. package/dist/indexer/reference-context.js.map +1 -1
  303. package/dist/indexer/scope-nodes.d.ts.map +1 -1
  304. package/dist/indexer/scope-nodes.js +5 -0
  305. package/dist/indexer/scope-nodes.js.map +1 -1
  306. package/dist/indexer/scope-types.d.ts +4 -0
  307. package/dist/indexer/scope-types.d.ts.map +1 -1
  308. package/dist/indexer/scope.d.ts +2 -3
  309. package/dist/indexer/scope.d.ts.map +1 -1
  310. package/dist/indexer/scope.js +85 -13
  311. package/dist/indexer/scope.js.map +1 -1
  312. package/dist/indexer/shared-owner-identity.js +1 -1
  313. package/dist/indexer/shared-owner-identity.js.map +1 -1
  314. package/dist/indexer/star-import-precedence.d.ts +6 -7
  315. package/dist/indexer/star-import-precedence.d.ts.map +1 -1
  316. package/dist/indexer/star-import-precedence.js +18 -12
  317. package/dist/indexer/star-import-precedence.js.map +1 -1
  318. package/dist/indexer/ts-callables.d.ts +15 -24
  319. package/dist/indexer/ts-callables.d.ts.map +1 -1
  320. package/dist/indexer/ts-callables.js +44 -75
  321. package/dist/indexer/ts-callables.js.map +1 -1
  322. package/dist/indexer/types.d.ts +23 -26
  323. package/dist/indexer/types.d.ts.map +1 -1
  324. package/dist/indexer/types.js +4 -0
  325. package/dist/indexer/types.js.map +1 -1
  326. package/dist/indexer.d.ts +2 -7
  327. package/dist/indexer.d.ts.map +1 -1
  328. package/dist/indexer.js.map +1 -1
  329. package/dist/languages/all.d.ts +1 -0
  330. package/dist/languages/all.d.ts.map +1 -1
  331. package/dist/languages/all.js +1 -0
  332. package/dist/languages/all.js.map +1 -1
  333. package/dist/languages/callable-arity.d.ts +21 -0
  334. package/dist/languages/callable-arity.d.ts.map +1 -1
  335. package/dist/languages/callable-arity.js +17 -0
  336. package/dist/languages/callable-arity.js.map +1 -1
  337. package/dist/languages/definitions/terraform.d.ts +9 -0
  338. package/dist/languages/definitions/terraform.d.ts.map +1 -0
  339. package/dist/languages/definitions/terraform.js +84 -0
  340. package/dist/languages/definitions/terraform.js.map +1 -0
  341. package/dist/languages/definitions/zig.d.ts.map +1 -1
  342. package/dist/languages/definitions/zig.js +6 -0
  343. package/dist/languages/definitions/zig.js.map +1 -1
  344. package/dist/languages.d.ts +1 -0
  345. package/dist/languages.d.ts.map +1 -1
  346. package/dist/languages.js +1 -0
  347. package/dist/languages.js.map +1 -1
  348. package/dist/lifecycle/manifest.d.ts.map +1 -1
  349. package/dist/lifecycle/manifest.js +0 -1
  350. package/dist/lifecycle/manifest.js.map +1 -1
  351. package/dist/native/byte-index.d.ts +6 -0
  352. package/dist/native/byte-index.d.ts.map +1 -1
  353. package/dist/native/byte-index.js +11 -6
  354. package/dist/native/byte-index.js.map +1 -1
  355. package/dist/native/contracts.d.ts +2 -3
  356. package/dist/native/contracts.d.ts.map +1 -1
  357. package/dist/native/execution.d.ts +9 -9
  358. package/dist/native/execution.d.ts.map +1 -1
  359. package/dist/native/execution.js +37 -77
  360. package/dist/native/execution.js.map +1 -1
  361. package/dist/native/js-bridge.d.ts +2 -15
  362. package/dist/native/js-bridge.d.ts.map +1 -1
  363. package/dist/native/js-bridge.js +2 -15
  364. package/dist/native/js-bridge.js.map +1 -1
  365. package/dist/native/query-results.js +2 -2
  366. package/dist/native/query-results.js.map +1 -1
  367. package/dist/native/runtime.d.ts +12 -12
  368. package/dist/native/runtime.d.ts.map +1 -1
  369. package/dist/native/runtime.js +24 -69
  370. package/dist/native/runtime.js.map +1 -1
  371. package/dist/native/tree-sitter-native.d.ts +3 -3
  372. package/dist/native/tree-sitter-native.d.ts.map +1 -1
  373. package/dist/native/tree-sitter-native.js +2 -2
  374. package/dist/native/tree-sitter-native.js.map +1 -1
  375. package/dist/presets.d.ts.map +1 -1
  376. package/dist/presets.js +0 -4
  377. package/dist/presets.js.map +1 -1
  378. package/dist/review.d.ts.map +1 -1
  379. package/dist/review.js +2 -20
  380. package/dist/review.js.map +1 -1
  381. package/dist/session.d.ts.map +1 -1
  382. package/dist/session.js +0 -5
  383. package/dist/session.js.map +1 -1
  384. package/dist/sql/navigation.js +1 -1
  385. package/dist/sql/navigation.js.map +1 -1
  386. package/dist/terraform/navigation.d.ts +20 -0
  387. package/dist/terraform/navigation.d.ts.map +1 -0
  388. package/dist/terraform/navigation.js +142 -0
  389. package/dist/terraform/navigation.js.map +1 -0
  390. package/dist/terraform/resolution.d.ts +82 -0
  391. package/dist/terraform/resolution.d.ts.map +1 -0
  392. package/dist/terraform/resolution.js +324 -0
  393. package/dist/terraform/resolution.js.map +1 -0
  394. package/dist/terraform/syntax.d.ts +109 -0
  395. package/dist/terraform/syntax.d.ts.map +1 -0
  396. package/dist/terraform/syntax.js +441 -0
  397. package/dist/terraform/syntax.js.map +1 -0
  398. package/dist/util/bloom-filter.d.ts +1 -0
  399. package/dist/util/bloom-filter.d.ts.map +1 -1
  400. package/dist/util/bloom-filter.js +3 -0
  401. package/dist/util/bloom-filter.js.map +1 -1
  402. package/dist/util/glob.d.ts +32 -0
  403. package/dist/util/glob.d.ts.map +1 -0
  404. package/dist/util/glob.js +137 -0
  405. package/dist/util/glob.js.map +1 -0
  406. package/dist/util/member-access-tables.d.ts.map +1 -1
  407. package/dist/util/member-access-tables.js +5 -0
  408. package/dist/util/member-access-tables.js.map +1 -1
  409. package/dist/util/member-access.d.ts.map +1 -1
  410. package/dist/util/member-access.js +5 -2
  411. package/dist/util/member-access.js.map +1 -1
  412. package/dist/util/project-files.d.ts +2 -10
  413. package/dist/util/project-files.d.ts.map +1 -1
  414. package/dist/util/project-files.js +32 -52
  415. package/dist/util/project-files.js.map +1 -1
  416. package/dist/util/python-type-checking.d.ts +18 -0
  417. package/dist/util/python-type-checking.d.ts.map +1 -0
  418. package/dist/util/python-type-checking.js +160 -0
  419. package/dist/util/python-type-checking.js.map +1 -0
  420. package/dist/util/resolution/jvm.d.ts +7 -3
  421. package/dist/util/resolution/jvm.d.ts.map +1 -1
  422. package/dist/util/resolution/jvm.js +56 -38
  423. package/dist/util/resolution/jvm.js.map +1 -1
  424. package/dist/util/resolution/rust.d.ts +0 -1
  425. package/dist/util/resolution/rust.d.ts.map +1 -1
  426. package/dist/util/resolution/rust.js +0 -9
  427. package/dist/util/resolution/rust.js.map +1 -1
  428. package/dist/util/resolution/specifier-targets.d.ts +44 -0
  429. package/dist/util/resolution/specifier-targets.d.ts.map +1 -0
  430. package/dist/util/resolution/specifier-targets.js +157 -0
  431. package/dist/util/resolution/specifier-targets.js.map +1 -0
  432. package/dist/util/resolution/terraform.d.ts +18 -0
  433. package/dist/util/resolution/terraform.d.ts.map +1 -0
  434. package/dist/util/resolution/terraform.js +64 -0
  435. package/dist/util/resolution/terraform.js.map +1 -0
  436. package/dist/util/resolution.d.ts.map +1 -1
  437. package/dist/util/resolution.js +5 -10
  438. package/dist/util/resolution.js.map +1 -1
  439. package/dist/util/specifiers.d.ts +9 -1
  440. package/dist/util/specifiers.d.ts.map +1 -1
  441. package/dist/util/specifiers.js +27 -8
  442. package/dist/util/specifiers.js.map +1 -1
  443. package/dist/util/trivia-tables.d.ts.map +1 -1
  444. package/dist/util/trivia-tables.js +9 -0
  445. package/dist/util/trivia-tables.js.map +1 -1
  446. package/dist/util/trivia.d.ts.map +1 -1
  447. package/dist/util/trivia.js +49 -30
  448. package/dist/util/trivia.js.map +1 -1
  449. package/dist/util/workspace.d.ts.map +1 -1
  450. package/dist/util/workspace.js +32 -4
  451. package/dist/util/workspace.js.map +1 -1
  452. package/package.json +6 -8
@@ -1,7 +1,9 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { findCommentEnd } from "../../impact/call-compatibility/text-scanner.js";
3
3
  import { isGoExportedMemberName } from "../../indexer/declaration-visibility.js";
4
+ import { hasSeparateMemberScopes, inheritsMemberOverloads, selectMember, } from "../../indexer/member-selection.js";
4
5
  import { SymbolKind } from "../../indexer/types.js";
6
+ import { supportForFileWithoutHeaderSample } from "../../languages.js";
5
7
  import { isJsTsLanguage } from "../../languages/js-family.js";
6
8
  import { sliceText } from "../../util/ast.js";
7
9
  import { foldPhpIdentifierCase, XID_IDENTIFIER_SOURCE } from "../../util/identifiers.js";
@@ -16,6 +18,7 @@ const STATIC_MEMBER_LANGUAGES = {
16
18
  java: true,
17
19
  js: true,
18
20
  php: true,
21
+ ruby: true,
19
22
  swift: true,
20
23
  ts: true,
21
24
  tsx: true,
@@ -280,8 +283,6 @@ const LANGUAGE_CONSTRUCTION_FORMS = {
280
283
  tsx: { newExpression: true },
281
284
  zig: { compositeLiteral: true },
282
285
  };
283
- /** Guards against a cyclic or pathological declared hierarchy. */
284
- const MAX_SUPERTYPE_DEPTH = 16;
285
286
  /**
286
287
  * Resolves the receiver and member-name nodes of a call, or null when the call has no
287
288
  * receiver or its shape is not a member access. `callee` is the call's resolved callee
@@ -667,7 +668,7 @@ function bindingValueExpression(node) {
667
668
  ]);
668
669
  return node.namedChildren.find((child) => expressionTypes.has(child.type)) ?? null;
669
670
  }
670
- function declaredTypeNameNode(node, sup) {
671
+ export function declaredTypeNameNode(node, sup) {
671
672
  const typeField = node.childForFieldName("type");
672
673
  if (typeField)
673
674
  return unwrapNamedType(typeField, sup) ?? typeField;
@@ -677,6 +678,8 @@ function declaredTypeNameNode(node, sup) {
677
678
  child.type === "type");
678
679
  if (typedChild)
679
680
  return unwrapNamedType(typedChild, sup) ?? typedChild;
681
+ if (node.type === "let_declaration")
682
+ return null;
680
683
  const ids = node.namedChildren.filter((child) => isReceiverNameNode(sup, child.type) || child.type === "type_identifier" || child.type === "name");
681
684
  if (ids.length >= 2)
682
685
  return unwrapNamedType(ids[0], sup);
@@ -758,6 +761,9 @@ function bindingProof(node, receiverName, source, sup) {
758
761
  const annotated = annotation ? (unwrapNamedType(annotation, sup) ?? typescriptImportTypeQuery(annotation)) : null;
759
762
  if (annotated)
760
763
  return { status: "declared", node: annotated };
764
+ const declared = declaredTypeNameNode(node, sup);
765
+ if (declared)
766
+ return { status: "declared", node: declared };
761
767
  const typeNode = constructionTypeFromBinding(node, receiverName, source, sup);
762
768
  if (typeNode)
763
769
  return { status: "type", node: typeNode };
@@ -767,7 +773,7 @@ function isSkippableBindingContainer(node, receiver) {
767
773
  return BINDING_CONTAINER_TYPES.has(node.type) && !containsIndex(node, receiver.startIndex);
768
774
  }
769
775
  function findPriorConstructorInContainer(node, receiver, receiverName, source, sup) {
770
- let constructor = null;
776
+ let typeEvidence = null;
771
777
  let sawUnproven = false;
772
778
  let declared = false;
773
779
  const visit = (current) => {
@@ -777,16 +783,16 @@ function findPriorConstructorInContainer(node, receiver, receiverName, source, s
777
783
  return true;
778
784
  const proof = bindingProof(current, receiverName, source, sup);
779
785
  if (proof.status === "declared") {
780
- constructor = proof.node;
781
- declared = true;
786
+ typeEvidence = { typeNode: proof.node, origin: "declared-type" };
787
+ declared = isJsTsLanguage(sup.id);
782
788
  return true;
783
789
  }
784
790
  // A later assignment to an annotated binding cannot change its declared type.
785
791
  if (declared && proof.status !== "none")
786
792
  return true;
787
793
  if (proof.status === "unproven") {
788
- if (constructor) {
789
- constructor = null;
794
+ if (typeEvidence) {
795
+ typeEvidence = null;
790
796
  return false;
791
797
  }
792
798
  sawUnproven = true;
@@ -794,14 +800,14 @@ function findPriorConstructorInContainer(node, receiver, receiverName, source, s
794
800
  }
795
801
  if (proof.status === "type") {
796
802
  if (sawUnproven) {
797
- constructor = null;
803
+ typeEvidence = null;
798
804
  return false;
799
805
  }
800
- if (constructor && sliceText(constructor, source) !== sliceText(proof.node, source)) {
801
- constructor = null;
806
+ if (typeEvidence && sliceText(typeEvidence.typeNode, source) !== sliceText(proof.node, source)) {
807
+ typeEvidence = null;
802
808
  return false;
803
809
  }
804
- constructor = proof.node;
810
+ typeEvidence = { typeNode: proof.node, origin: "constructor" };
805
811
  return true;
806
812
  }
807
813
  for (const child of current.namedChildren) {
@@ -811,7 +817,7 @@ function findPriorConstructorInContainer(node, receiver, receiverName, source, s
811
817
  return true;
812
818
  };
813
819
  visit(node);
814
- return constructor;
820
+ return typeEvidence;
815
821
  }
816
822
  function bindingContainerDeclaresNameBefore(node, receiver, receiverName, source, sup) {
817
823
  const visit = (current) => {
@@ -853,23 +859,21 @@ function findVisiblePriorConstructor(receiver, receiverName, source, sup) {
853
859
  }
854
860
  return findPriorConstructorInContainer(rootOf(receiver), receiver, receiverName, source, sup);
855
861
  }
856
- /**
857
- * Resolves the node naming the type a receiver expression was constructed from, or
858
- * null when no constructor is proven for it. Shared with detailed symbol-graph call
859
- * extraction so `goto` and resolved `calls` edges accept the same receiver forms.
860
- * A bare name is unit-struct construction only while no local binding of the same
861
- * name shadows it; a shadowing binding is a value whose type must come from the
862
- * binding, never from the type the name also spells.
863
- */
864
- export function receiverConstructorExpression(obj, source, sup) {
862
+ /** Constructor or declared type visible at a receiver, without resolving its owner. */
863
+ function receiverTypeEvidence(obj, source, sup) {
865
864
  const direct = constructionTypeName(obj, source, sup);
866
865
  if (!isReceiverNameNode(sup, obj.type))
867
- return direct;
866
+ return direct ? { typeNode: direct, origin: "constructor" } : null;
868
867
  const receiverName = sliceText(obj, source);
869
- if (direct && !bindsLocalValue(obj, receiverName, source, sup))
870
- return direct;
868
+ if (direct && !bindsLocalValue(obj, receiverName, source, sup)) {
869
+ return { typeNode: direct, origin: "constructor" };
870
+ }
871
871
  return findVisiblePriorConstructor(obj, receiverName, source, sup);
872
872
  }
873
+ /** Syntax naming the type of a constructed or declared receiver. */
874
+ export function receiverConstructorExpression(obj, source, sup) {
875
+ return receiverTypeEvidence(obj, source, sup)?.typeNode ?? null;
876
+ }
873
877
  /** Identifier segments in a C++ qualified name, excluding template arguments. */
874
878
  export function cppQualifiedNameSegments(node, source) {
875
879
  return cppQualifiedTextSegments(sliceText(node, source));
@@ -1024,6 +1028,10 @@ export function cppOutOfLineMemberDeclarationNode(definitionNameNode, localName,
1024
1028
  return declarations.length === 1 ? declarations[0] : null;
1025
1029
  }
1026
1030
  export function nodeDeclaresStatic(node, source) {
1031
+ if (node.type === "singleton_method") {
1032
+ const receiver = node.childForFieldName("object") ?? node.childForFieldName("receiver") ?? node.namedChildren[0];
1033
+ return !!receiver && sliceText(receiver, source).trim() === "self";
1034
+ }
1027
1035
  if (node.type === "static" || node.type === "static_modifier")
1028
1036
  return true;
1029
1037
  if (node.type === "storage_class_specifier" || node.type === "modifier" || node.type === "property_modifier") {
@@ -1125,48 +1133,48 @@ export function csharpDottedNameRoot(node) {
1125
1133
  return null;
1126
1134
  return csharpDottedNameRoot(object);
1127
1135
  }
1128
- /**
1129
- * Classifies a receiver as the declaring type, a supertype, or a named/constructed type.
1130
- * Returns null when the receiver cannot be proven.
1131
- * Named-local constructor lookup is memoized per enclosing function and receiver text.
1132
- */
1133
- export function classifyReceiver(sup, receiver, source, proofCache, cacheScope, accessNode, hasLexicalBinding) {
1136
+ /** Classify a receiver from syntax and consumer-proven import bindings. */
1137
+ export function classifyReceiver(sup, receiver, source, proofCache, cacheScope, accessNode, hasLexicalBinding, classifyImport) {
1134
1138
  const text = receiverKeywordText(sup, receiver, source, hasLexicalBinding);
1135
1139
  if (!text)
1136
- return null;
1140
+ return { kind: "unknown", receiver };
1137
1141
  const keywordKind = keywordReceiverKind(sup.id, text);
1138
1142
  if (keywordKind) {
1139
1143
  if (keywordReceiverCrossesDynamicBoundary(sup, accessNode))
1140
- return null;
1144
+ return { kind: "unknown", receiver };
1141
1145
  const memberScope = keywordReceiverMemberScope(sup, text, accessNode, source);
1142
1146
  return keywordKind === "own" ? { kind: "own-type", memberScope } : { kind: "supertype", memberScope };
1143
1147
  }
1144
1148
  const receiverIsName = isReceiverNameNode(sup, receiver.type);
1145
- const cacheKey = `${cacheScope}\u0000${text}`;
1146
- let proof = proofCache.get(cacheKey);
1149
+ const importProof = receiverIsName ? classifyImport?.(text, receiver) : null;
1150
+ if (importProof === "module-import")
1151
+ return { kind: "module-import", receiver };
1152
+ const cacheKey = proofCache ? cacheScope + "\u0000" + text : "";
1153
+ let proof = proofCache?.get(cacheKey);
1147
1154
  if (!proof) {
1148
- const constructed = receiverConstructorExpression(receiver, source, sup);
1155
+ const typeEvidence = receiverTypeEvidence(receiver, source, sup);
1149
1156
  proof = {
1150
- constructed,
1151
- locallyBound: !constructed && receiverIsName && bindsLocalValue(receiver, text, source, sup),
1157
+ typeEvidence,
1158
+ locallyBound: !typeEvidence && receiverIsName && bindsLocalValue(receiver, text, source, sup),
1152
1159
  };
1153
- proofCache.set(cacheKey, proof);
1160
+ proofCache?.set(cacheKey, proof);
1154
1161
  }
1155
- if (proof.constructed) {
1162
+ if (proof.typeEvidence) {
1163
+ const { typeNode, origin } = proof.typeEvidence;
1156
1164
  return {
1157
1165
  kind: "named-type",
1158
- typeName: sliceText(proof.constructed, source),
1159
- typeNode: proof.constructed,
1166
+ proof: origin,
1167
+ typeName: sliceText(typeNode, source),
1168
+ typeNode,
1160
1169
  memberScope: hasStaticMemberDistinction(sup.id) ? "instance" : "any",
1161
- constructed: true,
1170
+ constructed: origin === "constructor",
1162
1171
  };
1163
1172
  }
1164
- if (!receiverIsName)
1165
- return null;
1166
- // A name bound by a local or parameter is a value, not a type. Without this guard
1167
- // `Example::shared()` would still be attributed to a colliding parameter named Example.
1168
- if (proof.locallyBound)
1169
- return null;
1173
+ if (importProof === "static-type") {
1174
+ return { kind: "named-type", proof: "static-type", typeName: text, typeNode: receiver, memberScope: "static" };
1175
+ }
1176
+ if (!receiverIsName || proof.locallyBound)
1177
+ return { kind: "unknown", receiver };
1170
1178
  // Dotted `Cfg.load()` is not proof in languages where the identifier may be a
1171
1179
  // value. Type-scoped `::` is one named-type proof; C# `Box.Left()` is another
1172
1180
  // because a capitalized unbound name is the static type receiver. Ruby
@@ -1181,9 +1189,10 @@ export function classifyReceiver(sup, receiver, source, proofCache, cacheScope,
1181
1189
  // The named type must still resolve to a members-declaring definition
1182
1190
  // before any call edge is recorded, so a name alone never invents a target.
1183
1191
  if (!capitalizedTypeReceiverName(sup, receiver, text))
1184
- return null;
1192
+ return { kind: "unknown", receiver };
1185
1193
  return {
1186
1194
  kind: "named-type",
1195
+ proof: "static-type",
1187
1196
  typeName: text,
1188
1197
  typeNode: receiver,
1189
1198
  memberScope: UNBOUND_INSTANCE_CALL_LANGUAGE_IDS[sup.id] ? "any" : "static",
@@ -1191,6 +1200,7 @@ export function classifyReceiver(sup, receiver, source, proofCache, cacheScope,
1191
1200
  }
1192
1201
  return {
1193
1202
  kind: "named-type",
1203
+ proof: "static-type",
1194
1204
  typeName: text,
1195
1205
  typeNode: receiver,
1196
1206
  memberScope: hasStaticMemberDistinction(sup.id) && typeScoped ? "static" : "any",
@@ -1214,6 +1224,7 @@ const STATIC_TYPE_NAME_RECEIVER_LANGUAGE_IDS = {
1214
1224
  js: true,
1215
1225
  kotlin: true,
1216
1226
  ts: true,
1227
+ ruby: true,
1217
1228
  tsx: true,
1218
1229
  };
1219
1230
  /** Whether a receiver name is capitalized like a type in a capitalized-name language. */
@@ -1456,12 +1467,95 @@ function callSiteKey(callerId, site) {
1456
1467
  const { start, end } = site.range;
1457
1468
  return `${callerId}\u0000${site.file}\u0000${start.line}:${start.column}:${start.index ?? ""}-${end.line}:${end.column}:${end.index ?? ""}`;
1458
1469
  }
1470
+ /** Prove overriding member pairs only for hierarchy receiver calls. */
1471
+ export async function inheritedReceiverMemberSignatures(graph, candidates, definitions, ownerAnchors, accessibleMembers, languageExtensions, sameParameterTypes) {
1472
+ const signatures = new Map();
1473
+ const membersByOwner = new Map();
1474
+ const ownerByMember = new Map();
1475
+ const parentsByOwner = new Map();
1476
+ for (const edge of graph.edges) {
1477
+ if (edge.label === "member_of") {
1478
+ ownerByMember.set(edge.from, edge.to);
1479
+ if (definitions.has(edge.from)) {
1480
+ const members = membersByOwner.get(edge.to) ?? [];
1481
+ members.push(edge.from);
1482
+ membersByOwner.set(edge.to, members);
1483
+ }
1484
+ }
1485
+ else if (edge.label && HIERARCHY_LABELS[edge.label]) {
1486
+ const parents = parentsByOwner.get(edge.from) ?? [];
1487
+ parents.push(edge.to);
1488
+ parentsByOwner.set(edge.from, parents);
1489
+ }
1490
+ }
1491
+ for (const [owner, accessible] of accessibleMembers) {
1492
+ const members = membersByOwner.get(owner) ?? [];
1493
+ for (const id of accessible)
1494
+ if (definitions.has(id) && !members.includes(id))
1495
+ members.push(id);
1496
+ membersByOwner.set(owner, members);
1497
+ }
1498
+ const checkedPairs = new Set();
1499
+ const checkedGroups = new Set();
1500
+ const separator = "\0";
1501
+ for (const candidate of candidates) {
1502
+ if (!inheritsMemberOverloads(supportForFileWithoutHeaderSample(candidate.site.file, languageExtensions)?.id ?? "")) {
1503
+ continue;
1504
+ }
1505
+ const rawOwner = candidate.ownerId ?? ownerByMember.get(candidate.callerId);
1506
+ if (!rawOwner)
1507
+ continue;
1508
+ const owner = ownerAnchors.get(rawOwner) ?? rawOwner;
1509
+ // Override pairs are a fact of the declarations, not of this call: an override that rejects
1510
+ // the argument count still hides the base declaration it overrides.
1511
+ const group = `${owner}\0${candidate.memberName}\0${candidate.viaSupertypes}`;
1512
+ if (checkedGroups.has(group))
1513
+ continue;
1514
+ checkedGroups.add(group);
1515
+ let level = candidate.viaSupertypes ? (parentsByOwner.get(owner) ?? []) : [owner];
1516
+ const seen = new Set([owner]);
1517
+ const shallower = [];
1518
+ for (let depth = 0; depth < 16 && level.length; depth += 1) {
1519
+ const current = [];
1520
+ const next = [];
1521
+ for (const id of level) {
1522
+ for (const memberId of membersByOwner.get(id) ?? []) {
1523
+ if (graph.nodes.get(memberId)?.name === candidate.memberName)
1524
+ current.push(memberId);
1525
+ }
1526
+ for (const parent of parentsByOwner.get(id) ?? []) {
1527
+ if (seen.has(parent))
1528
+ continue;
1529
+ seen.add(parent);
1530
+ next.push(parent);
1531
+ }
1532
+ }
1533
+ for (const derivedId of shallower) {
1534
+ const derived = definitions.get(derivedId);
1535
+ for (const inheritedId of current) {
1536
+ const pair = derivedId + separator + inheritedId;
1537
+ if (checkedPairs.has(pair))
1538
+ continue;
1539
+ checkedPairs.add(pair);
1540
+ if (!(await sameParameterTypes(derived, definitions.get(inheritedId))))
1541
+ continue;
1542
+ const inherited = signatures.get(derivedId) ?? new Set();
1543
+ inherited.add(inheritedId);
1544
+ signatures.set(derivedId, inherited);
1545
+ }
1546
+ }
1547
+ shallower.push(...current);
1548
+ level = next;
1549
+ }
1550
+ }
1551
+ return signatures;
1552
+ }
1459
1553
  /**
1460
1554
  * Records proven `calls` edges for deferred receiver invocations.
1461
1555
  * Ambiguous names at a level stop the walk.
1462
1556
  * `super`/`base`/`parent` follow class `extends` ancestors only.
1463
1557
  */
1464
- export function emitReceiverCallEdges(graph, candidates, recordEdge, memberScopes = new Map(), nodeAliases = new Map(), memberArities = new Map(), ownerAnchors = new Map(), accessibleMembers = new Map(), fileHiddenMemberIds = new Set(), acceptsCallTarget) {
1558
+ export function emitReceiverCallEdges(graph, candidates, recordEdge, memberScopes = new Map(), nodeAliases = new Map(), memberArities = new Map(), ownerAnchors = new Map(), accessibleMembers = new Map(), fileHiddenMemberIds = new Set(), acceptsCallTarget, callableIdentities = new Map(), languageExtensions, overridingSignatures, isReceiverMemberVisible) {
1465
1559
  if (!candidates.length)
1466
1560
  return [];
1467
1561
  const membersByOwner = new Map();
@@ -1493,10 +1587,49 @@ export function emitReceiverCallEdges(graph, candidates, recordEdge, memberScope
1493
1587
  for (const memberId of memberIds)
1494
1588
  pushUnique(membersByOwner, ownerId, memberId);
1495
1589
  }
1496
- const nextOwners = (ownerId, viaSupertypes) => {
1497
- if (!viaSupertypes)
1498
- return supertypesByOwner.get(ownerId) ?? [];
1499
- return (classAncestorsByOwner.get(ownerId) ?? []).filter((id) => graph.nodes.get(id)?.kind === "class");
1590
+ let activeCandidate;
1591
+ const facts = new Map();
1592
+ for (const [ownerId, ids] of membersByOwner) {
1593
+ for (const id of ids) {
1594
+ const canonicalId = canonicalMemberId(id, nodeAliases);
1595
+ const indexed = callableIdentities.get(id) ?? callableIdentities.get(canonicalId);
1596
+ const bounds = memberArities.get(id) ?? memberArities.get(canonicalId);
1597
+ facts.set(id, {
1598
+ key: indexed?.key ?? canonicalId,
1599
+ owner: indexed?.owner ?? ownerId,
1600
+ kind: indexed?.kind ?? "function",
1601
+ arity: bounds ? { minArgs: bounds.min, maxArgs: bounds.max } : null,
1602
+ ...(indexed?.role ? { role: indexed.role } : {}),
1603
+ });
1604
+ }
1605
+ }
1606
+ const model = {
1607
+ ownerKey: (id) => id,
1608
+ members: (id) => membersByOwner.get(id) ?? [],
1609
+ supertypes: (id, classOnly) => {
1610
+ if (!classOnly)
1611
+ return supertypesByOwner.get(id) ?? [];
1612
+ return (classAncestorsByOwner.get(id) ?? []).filter((base) => graph.nodes.get(base)?.kind === "class");
1613
+ },
1614
+ name: (id) => graph.nodes.get(id)?.name ?? graph.nodes.get(canonicalMemberId(id, nodeAliases))?.name ?? "",
1615
+ key: (id) => facts.get(id)?.key ?? canonicalMemberId(id, nodeAliases),
1616
+ callable: (id) => facts.get(id),
1617
+ scope: (id) => memberScopes.get(id) ?? memberScopes.get(canonicalMemberId(id, nodeAliases)) ?? "any",
1618
+ visible: (id, useFile) => {
1619
+ const canonicalId = canonicalMemberId(id, nodeAliases);
1620
+ const node = graph.nodes.get(id) ?? graph.nodes.get(canonicalId);
1621
+ if (!node || (node.kind !== "function" && !node.callable))
1622
+ return false;
1623
+ if (isReceiverMemberVisible && !isReceiverMemberVisible(canonicalId, useFile))
1624
+ return false;
1625
+ if ((fileHiddenMemberIds.has(id) || fileHiddenMemberIds.has(canonicalId)) &&
1626
+ fileIdentityKey(node.file) !== fileIdentityKey(useFile))
1627
+ return false;
1628
+ return (!activeCandidate.goPackagePeerFiles ||
1629
+ isGoExportedMemberName("go", node.name) ||
1630
+ activeCandidate.goPackagePeerFiles.has(node.file));
1631
+ },
1632
+ sameSignature: (a, b) => overridingSignatures?.get(a)?.has(b) ?? false,
1500
1633
  };
1501
1634
  const callTargetsBySite = new Map();
1502
1635
  for (const edge of graph.edges) {
@@ -1525,48 +1658,42 @@ export function emitReceiverCallEdges(graph, candidates, recordEdge, memberScope
1525
1658
  // coalesced type identity so lookup starts on the whole member set.
1526
1659
  const owner = ownerAnchors.get(rawOwner) ?? rawOwner;
1527
1660
  const memberScope = candidate.memberScope ?? inferCallMemberScope(candidate.site, sourceCache);
1528
- let level = candidate.viaSupertypes ? nextOwners(owner, true) : [owner];
1529
- const visited = new Set(level);
1530
- let receiverDisposition = "none";
1531
- for (let depth = 0; depth < MAX_SUPERTYPE_DEPTH && level.length; depth += 1) {
1532
- const lookup = provenMemberTarget(graph, membersByOwner, level, candidate, memberScope, memberScopes, nodeAliases, memberArities, fileHiddenMemberIds, candidate.site.file);
1533
- if (lookup.status === "unique") {
1534
- if (acceptsCallTarget && !acceptsCallTarget(lookup.memberId, candidate)) {
1535
- receiverDisposition = "ambiguous";
1536
- if (existingTargets.size)
1537
- rejectedCallSites.add(siteKey);
1538
- break;
1539
- }
1661
+ const languageId = supportForFileWithoutHeaderSample(candidate.site.file, languageExtensions)?.id ?? "";
1662
+ activeCandidate = candidate;
1663
+ const lookup = selectMember([owner], model, {
1664
+ name: candidate.memberName,
1665
+ argumentCount: candidate.argumentCount,
1666
+ scope: memberScope,
1667
+ useFile: candidate.site.file,
1668
+ phpCaseInsensitive: !!candidate.caseInsensitiveMemberName,
1669
+ separateMemberScopes: hasSeparateMemberScopes(languageId),
1670
+ startAtAncestor: candidate.viaSupertypes,
1671
+ inheritOverloads: inheritsMemberOverloads(languageId),
1672
+ });
1673
+ let receiverDisposition = lookup.status === "unique" ? "resolved" : lookup.status;
1674
+ if (lookup.status === "unique") {
1675
+ const memberId = canonicalMemberId(lookup.member, nodeAliases);
1676
+ if (acceptsCallTarget && !acceptsCallTarget(memberId, candidate)) {
1677
+ receiverDisposition = "ambiguous";
1678
+ if (existingTargets.size)
1679
+ rejectedCallSites.add(siteKey);
1680
+ }
1681
+ else {
1540
1682
  receiverDisposition = "resolved";
1541
1683
  const combinedTargets = new Set(existingTargets);
1542
- combinedTargets.add(lookup.memberId);
1684
+ combinedTargets.add(memberId);
1543
1685
  if (combinedTargets.size === 1) {
1544
- if (existingTargets.size === 0 && recordEdge(candidate.callerId, lookup.memberId, "calls", candidate.site)) {
1545
- existingTargets.add(lookup.memberId);
1686
+ if (!existingTargets.size && recordEdge(candidate.callerId, memberId, "calls", candidate.site)) {
1687
+ existingTargets.add(memberId);
1546
1688
  callTargetsBySite.set(siteKey, existingTargets);
1547
1689
  }
1548
1690
  }
1549
- else {
1691
+ else
1550
1692
  rejectedCallSites.add(siteKey);
1551
- }
1552
- break;
1553
1693
  }
1554
- if (lookup.status === "ambiguous") {
1555
- receiverDisposition = "ambiguous";
1556
- if (existingTargets.size)
1557
- rejectedCallSites.add(siteKey);
1558
- break;
1559
- }
1560
- const next = [];
1561
- for (const ownerId of level) {
1562
- for (const supertype of nextOwners(ownerId, candidate.viaSupertypes)) {
1563
- if (visited.has(supertype))
1564
- continue;
1565
- visited.add(supertype);
1566
- next.push(supertype);
1567
- }
1568
- }
1569
- level = next;
1694
+ }
1695
+ else if (lookup.status === "ambiguous" && existingTargets.size) {
1696
+ rejectedCallSites.add(siteKey);
1570
1697
  }
1571
1698
  if (receiverDisposition === "none") {
1572
1699
  if (candidate.fallbackTargetId && !existingTargets.size) {
@@ -1601,62 +1728,4 @@ function canonicalMemberId(id, aliases) {
1601
1728
  }
1602
1729
  return current;
1603
1730
  }
1604
- function memberArityMatches(memberId, argumentCount, memberArities) {
1605
- if (argumentCount === null)
1606
- return true;
1607
- const range = memberArities.get(memberId);
1608
- // Declaration parameter counts do not prove required/default/variadic call bounds.
1609
- // An unknown range cannot reject a unique target or eliminate an overload.
1610
- return !range || (argumentCount >= range.min && (range.max === null || argumentCount <= range.max));
1611
- }
1612
- /**
1613
- * The single callable member named by `candidate` across `owners`.
1614
- * `none` means this depth has no name match and the walk may continue.
1615
- * `ambiguous` means this depth matched the name but could not prove one member,
1616
- * including arity ambiguity, and the walk must stop.
1617
- */
1618
- function provenMemberTarget(graph, membersByOwner, owners, candidate, memberScope, memberScopes, nodeAliases, memberArities, fileHiddenMemberIds, useFile) {
1619
- const matches = new Set();
1620
- for (const ownerId of owners) {
1621
- for (const memberId of membersByOwner.get(ownerId) ?? []) {
1622
- const canonicalId = canonicalMemberId(memberId, nodeAliases);
1623
- const node = graph.nodes.get(memberId) ?? graph.nodes.get(canonicalId);
1624
- if (!node || (node.kind !== "function" && !node.callable))
1625
- continue;
1626
- if ((fileHiddenMemberIds.has(memberId) || fileHiddenMemberIds.has(canonicalId)) &&
1627
- fileIdentityKey(node.file) !== fileIdentityKey(useFile)) {
1628
- continue;
1629
- }
1630
- const nameMatches = candidate.caseInsensitiveMemberName
1631
- ? foldPhpIdentifierCase(node.name) === foldPhpIdentifierCase(candidate.memberName)
1632
- : node.name === candidate.memberName;
1633
- if (!nameMatches)
1634
- continue;
1635
- if (candidate.goPackagePeerFiles &&
1636
- !isGoExportedMemberName("go", node.name) &&
1637
- !candidate.goPackagePeerFiles.has(node.file)) {
1638
- continue;
1639
- }
1640
- const scope = memberScopes.get(memberId) ?? memberScopes.get(canonicalId);
1641
- if (memberScope !== "any" && scope !== memberScope)
1642
- continue;
1643
- matches.add(canonicalId);
1644
- }
1645
- }
1646
- if (!matches.size)
1647
- return { status: "none" };
1648
- if (matches.size === 1) {
1649
- const [memberId] = matches;
1650
- if (memberArityMatches(memberId, candidate.argumentCount, memberArities)) {
1651
- return { status: "unique", memberId: memberId };
1652
- }
1653
- return { status: "ambiguous" };
1654
- }
1655
- const byArity = candidate.argumentCount === null
1656
- ? []
1657
- : [...matches].filter((memberId) => memberArityMatches(memberId, candidate.argumentCount, memberArities));
1658
- if (byArity.length === 1)
1659
- return { status: "unique", memberId: byArity[0] };
1660
- return { status: "ambiguous" };
1661
- }
1662
1731
  //# sourceMappingURL=receiver-calls.js.map