@lzehrung/codegraph 2.3.31 → 2.4.0

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 (407) hide show
  1. package/README.md +30 -137
  2. package/codegraph-skill/codegraph/SKILL.md +5 -3
  3. package/dist/agent/artifact.d.ts +2 -0
  4. package/dist/agent/artifact.d.ts.map +1 -1
  5. package/dist/agent/artifact.js.map +1 -1
  6. package/dist/agent/search.d.ts.map +1 -1
  7. package/dist/agent/search.js +3 -0
  8. package/dist/agent/search.js.map +1 -1
  9. package/dist/agent/session.d.ts +3 -0
  10. package/dist/agent/session.d.ts.map +1 -1
  11. package/dist/agent/session.js +10 -2
  12. package/dist/agent/session.js.map +1 -1
  13. package/dist/bin/cli.js +42243 -29202
  14. package/dist/bin/query-index-worker.js +73 -11
  15. package/dist/cli/affected.d.ts.map +1 -1
  16. package/dist/cli/affected.js +4 -1
  17. package/dist/cli/affected.js.map +1 -1
  18. package/dist/cli/command-catalog.js +1 -1
  19. package/dist/cli/command-catalog.js.map +1 -1
  20. package/dist/cli/graph-queries.d.ts.map +1 -1
  21. package/dist/cli/graph-queries.js +27 -1
  22. package/dist/cli/graph-queries.js.map +1 -1
  23. package/dist/cli/help.d.ts +2 -2
  24. package/dist/cli/help.d.ts.map +1 -1
  25. package/dist/cli/help.js +4 -2
  26. package/dist/cli/help.js.map +1 -1
  27. package/dist/cli/options.js +2 -2
  28. package/dist/cli/options.js.map +1 -1
  29. package/dist/drift/artifact.d.ts.map +1 -1
  30. package/dist/drift/artifact.js +15 -18
  31. package/dist/drift/artifact.js.map +1 -1
  32. package/dist/drift/compare.js +1 -1
  33. package/dist/drift/compare.js.map +1 -1
  34. package/dist/drift/snapshot.d.ts.map +1 -1
  35. package/dist/drift/snapshot.js +5 -6
  36. package/dist/drift/snapshot.js.map +1 -1
  37. package/dist/drift/types.d.ts +2 -0
  38. package/dist/drift/types.d.ts.map +1 -1
  39. package/dist/drift/types.js.map +1 -1
  40. package/dist/graph-builder.d.ts.map +1 -1
  41. package/dist/graph-builder.js +4 -6
  42. package/dist/graph-builder.js.map +1 -1
  43. package/dist/graph-edge-collector.d.ts +3 -0
  44. package/dist/graph-edge-collector.d.ts.map +1 -1
  45. package/dist/graph-edge-collector.js +8 -5
  46. package/dist/graph-edge-collector.js.map +1 -1
  47. package/dist/graphs/angularjs.d.ts.map +1 -1
  48. package/dist/graphs/angularjs.js +2 -1
  49. package/dist/graphs/angularjs.js.map +1 -1
  50. package/dist/graphs/edge-resolution.d.ts +4 -1
  51. package/dist/graphs/edge-resolution.d.ts.map +1 -1
  52. package/dist/graphs/edge-resolution.js +26 -2
  53. package/dist/graphs/edge-resolution.js.map +1 -1
  54. package/dist/graphs/specifiers.d.ts.map +1 -1
  55. package/dist/graphs/specifiers.js +6 -2
  56. package/dist/graphs/specifiers.js.map +1 -1
  57. package/dist/graphs/symbol-graph-detailed/ast.d.ts +20 -0
  58. package/dist/graphs/symbol-graph-detailed/ast.d.ts.map +1 -1
  59. package/dist/graphs/symbol-graph-detailed/ast.js +154 -15
  60. package/dist/graphs/symbol-graph-detailed/ast.js.map +1 -1
  61. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +51 -8
  62. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
  63. package/dist/graphs/symbol-graph-detailed/edge-passes.js +823 -132
  64. package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
  65. package/dist/graphs/symbol-graph-detailed/import-aliases.d.ts +2 -1
  66. package/dist/graphs/symbol-graph-detailed/import-aliases.d.ts.map +1 -1
  67. package/dist/graphs/symbol-graph-detailed/import-aliases.js +139 -7
  68. package/dist/graphs/symbol-graph-detailed/import-aliases.js.map +1 -1
  69. package/dist/graphs/symbol-graph-detailed/member-chains.d.ts +1 -0
  70. package/dist/graphs/symbol-graph-detailed/member-chains.d.ts.map +1 -1
  71. package/dist/graphs/symbol-graph-detailed/member-chains.js +3 -1
  72. package/dist/graphs/symbol-graph-detailed/member-chains.js.map +1 -1
  73. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +128 -15
  74. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
  75. package/dist/graphs/symbol-graph-detailed/receiver-calls.js +873 -93
  76. package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
  77. package/dist/graphs/symbol-graph-detailed.d.ts.map +1 -1
  78. package/dist/graphs/symbol-graph-detailed.js +434 -40
  79. package/dist/graphs/symbol-graph-detailed.js.map +1 -1
  80. package/dist/graphs/symbol-graph.d.ts +2 -0
  81. package/dist/graphs/symbol-graph.d.ts.map +1 -1
  82. package/dist/graphs/symbol-graph.js +34 -16
  83. package/dist/graphs/symbol-graph.js.map +1 -1
  84. package/dist/impact/call-compatibility/providers/index.d.ts +4 -4
  85. package/dist/impact/call-compatibility/providers/index.d.ts.map +1 -1
  86. package/dist/impact/call-compatibility/providers/index.js +6 -6
  87. package/dist/impact/call-compatibility/providers/index.js.map +1 -1
  88. package/dist/impact/call-compatibility/providers/types.d.ts +2 -0
  89. package/dist/impact/call-compatibility/providers/types.d.ts.map +1 -1
  90. package/dist/impact/call-compatibility/types.d.ts +6 -0
  91. package/dist/impact/call-compatibility/types.d.ts.map +1 -1
  92. package/dist/impact/call-compatibility.d.ts.map +1 -1
  93. package/dist/impact/call-compatibility.js +310 -516
  94. package/dist/impact/call-compatibility.js.map +1 -1
  95. package/dist/impact/map.js +1 -0
  96. package/dist/impact/map.js.map +1 -1
  97. package/dist/impact/reference-cache.d.ts.map +1 -1
  98. package/dist/impact/reference-cache.js +2 -2
  99. package/dist/impact/reference-cache.js.map +1 -1
  100. package/dist/index.d.ts +1 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +1 -1
  103. package/dist/index.js.map +1 -1
  104. package/dist/indexer/ambiguous-resolution.d.ts +11 -0
  105. package/dist/indexer/ambiguous-resolution.d.ts.map +1 -0
  106. package/dist/indexer/ambiguous-resolution.js +19 -0
  107. package/dist/indexer/ambiguous-resolution.js.map +1 -0
  108. package/dist/indexer/build-cache/module-cache.d.ts +38 -0
  109. package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
  110. package/dist/indexer/build-cache/module-cache.js +151 -9
  111. package/dist/indexer/build-cache/module-cache.js.map +1 -1
  112. package/dist/indexer/build-cache/options.d.ts +16 -43
  113. package/dist/indexer/build-cache/options.d.ts.map +1 -1
  114. package/dist/indexer/build-cache/options.js +16 -43
  115. package/dist/indexer/build-cache/options.js.map +1 -1
  116. package/dist/indexer/build-cache/project-snapshot.d.ts +1 -0
  117. package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
  118. package/dist/indexer/build-cache/project-snapshot.js +117 -24
  119. package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
  120. package/dist/indexer/build-cache/resolver-environment.d.ts.map +1 -1
  121. package/dist/indexer/build-cache/resolver-environment.js +32 -2
  122. package/dist/indexer/build-cache/resolver-environment.js.map +1 -1
  123. package/dist/indexer/build-cache.d.ts +1 -1
  124. package/dist/indexer/build-cache.d.ts.map +1 -1
  125. package/dist/indexer/build-cache.js +1 -1
  126. package/dist/indexer/build-cache.js.map +1 -1
  127. package/dist/indexer/build-index.d.ts.map +1 -1
  128. package/dist/indexer/build-index.js +593 -22
  129. package/dist/indexer/build-index.js.map +1 -1
  130. package/dist/indexer/call-hierarchy.js +1 -1
  131. package/dist/indexer/call-hierarchy.js.map +1 -1
  132. package/dist/indexer/compilation-units.d.ts +101 -0
  133. package/dist/indexer/compilation-units.d.ts.map +1 -0
  134. package/dist/indexer/compilation-units.js +605 -0
  135. package/dist/indexer/compilation-units.js.map +1 -0
  136. package/dist/indexer/cpp-callables.d.ts +20 -0
  137. package/dist/indexer/cpp-callables.d.ts.map +1 -0
  138. package/dist/indexer/cpp-callables.js +554 -0
  139. package/dist/indexer/cpp-callables.js.map +1 -0
  140. package/dist/indexer/declaration-visibility.d.ts +36 -2
  141. package/dist/indexer/declaration-visibility.d.ts.map +1 -1
  142. package/dist/indexer/declaration-visibility.js +136 -2
  143. package/dist/indexer/declaration-visibility.js.map +1 -1
  144. package/dist/indexer/expand-star-imports.d.ts.map +1 -1
  145. package/dist/indexer/expand-star-imports.js +28 -6
  146. package/dist/indexer/expand-star-imports.js.map +1 -1
  147. package/dist/indexer/import-types.d.ts +37 -0
  148. package/dist/indexer/import-types.d.ts.map +1 -1
  149. package/dist/indexer/import-types.js +24 -1
  150. package/dist/indexer/import-types.js.map +1 -1
  151. package/dist/indexer/imports/context.d.ts +11 -1
  152. package/dist/indexer/imports/context.d.ts.map +1 -1
  153. package/dist/indexer/imports/import-binding-tables.d.ts +12 -1
  154. package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
  155. package/dist/indexer/imports/import-binding-tables.js +144 -19
  156. package/dist/indexer/imports/import-binding-tables.js.map +1 -1
  157. package/dist/indexer/imports/js-text-imports.js +4 -4
  158. package/dist/indexer/imports/js-text-imports.js.map +1 -1
  159. package/dist/indexer/imports/native-captures.d.ts.map +1 -1
  160. package/dist/indexer/imports/native-captures.js +18 -6
  161. package/dist/indexer/imports/native-captures.js.map +1 -1
  162. package/dist/indexer/imports/python.d.ts +10 -2
  163. package/dist/indexer/imports/python.d.ts.map +1 -1
  164. package/dist/indexer/imports/python.js +91 -40
  165. package/dist/indexer/imports/python.js.map +1 -1
  166. package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
  167. package/dist/indexer/imports/text-import-extractors.js +51 -12
  168. package/dist/indexer/imports/text-import-extractors.js.map +1 -1
  169. package/dist/indexer/imports.d.ts.map +1 -1
  170. package/dist/indexer/imports.js +23 -4
  171. package/dist/indexer/imports.js.map +1 -1
  172. package/dist/indexer/incremental-plan.d.ts +33 -0
  173. package/dist/indexer/incremental-plan.d.ts.map +1 -1
  174. package/dist/indexer/incremental-plan.js +187 -1
  175. package/dist/indexer/incremental-plan.js.map +1 -1
  176. package/dist/indexer/locals-and-exports.d.ts +2 -0
  177. package/dist/indexer/locals-and-exports.d.ts.map +1 -1
  178. package/dist/indexer/locals-and-exports.js +565 -54
  179. package/dist/indexer/locals-and-exports.js.map +1 -1
  180. package/dist/indexer/name-lookup-policies/c-family.d.ts +7 -0
  181. package/dist/indexer/name-lookup-policies/c-family.d.ts.map +1 -0
  182. package/dist/indexer/name-lookup-policies/c-family.js +117 -0
  183. package/dist/indexer/name-lookup-policies/c-family.js.map +1 -0
  184. package/dist/indexer/name-lookup-policies/csharp-using-static.d.ts +11 -0
  185. package/dist/indexer/name-lookup-policies/csharp-using-static.d.ts.map +1 -0
  186. package/dist/indexer/name-lookup-policies/csharp-using-static.js +136 -0
  187. package/dist/indexer/name-lookup-policies/csharp-using-static.js.map +1 -0
  188. package/dist/indexer/name-lookup-policies/implicit-self.d.ts +10 -0
  189. package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -0
  190. package/dist/indexer/name-lookup-policies/implicit-self.js +113 -0
  191. package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -0
  192. package/dist/indexer/name-lookup-policies/index.d.ts +3 -0
  193. package/dist/indexer/name-lookup-policies/index.d.ts.map +1 -0
  194. package/dist/indexer/name-lookup-policies/index.js +106 -0
  195. package/dist/indexer/name-lookup-policies/index.js.map +1 -0
  196. package/dist/indexer/name-lookup-policies/php.d.ts +3 -0
  197. package/dist/indexer/name-lookup-policies/php.d.ts.map +1 -0
  198. package/dist/indexer/name-lookup-policies/php.js +75 -0
  199. package/dist/indexer/name-lookup-policies/php.js.map +1 -0
  200. package/dist/indexer/name-resolution-types.d.ts +99 -0
  201. package/dist/indexer/name-resolution-types.d.ts.map +1 -0
  202. package/dist/indexer/name-resolution-types.js +2 -0
  203. package/dist/indexer/name-resolution-types.js.map +1 -0
  204. package/dist/indexer/name-resolution.d.ts +52 -0
  205. package/dist/indexer/name-resolution.d.ts.map +1 -0
  206. package/dist/indexer/name-resolution.js +189 -0
  207. package/dist/indexer/name-resolution.js.map +1 -0
  208. package/dist/indexer/navigation-cpp.d.ts +50 -0
  209. package/dist/indexer/navigation-cpp.d.ts.map +1 -0
  210. package/dist/indexer/navigation-cpp.js +654 -0
  211. package/dist/indexer/navigation-cpp.js.map +1 -0
  212. package/dist/indexer/navigation-goto.d.ts +106 -3
  213. package/dist/indexer/navigation-goto.d.ts.map +1 -1
  214. package/dist/indexer/navigation-goto.js +2074 -137
  215. package/dist/indexer/navigation-goto.js.map +1 -1
  216. package/dist/indexer/navigation-local.d.ts +18 -2
  217. package/dist/indexer/navigation-local.d.ts.map +1 -1
  218. package/dist/indexer/navigation-local.js +498 -61
  219. package/dist/indexer/navigation-local.js.map +1 -1
  220. package/dist/indexer/navigation-php.d.ts +66 -0
  221. package/dist/indexer/navigation-php.d.ts.map +1 -1
  222. package/dist/indexer/navigation-php.js +287 -4
  223. package/dist/indexer/navigation-php.js.map +1 -1
  224. package/dist/indexer/navigation-references.d.ts +72 -5
  225. package/dist/indexer/navigation-references.d.ts.map +1 -1
  226. package/dist/indexer/navigation-references.js +620 -54
  227. package/dist/indexer/navigation-references.js.map +1 -1
  228. package/dist/indexer/navigation-resolve.d.ts +33 -2
  229. package/dist/indexer/navigation-resolve.d.ts.map +1 -1
  230. package/dist/indexer/navigation-resolve.js +446 -193
  231. package/dist/indexer/navigation-resolve.js.map +1 -1
  232. package/dist/indexer/navigation.d.ts +28 -2
  233. package/dist/indexer/navigation.d.ts.map +1 -1
  234. package/dist/indexer/navigation.js +1082 -151
  235. package/dist/indexer/navigation.js.map +1 -1
  236. package/dist/indexer/php-namespace-symbols.d.ts +66 -0
  237. package/dist/indexer/php-namespace-symbols.d.ts.map +1 -0
  238. package/dist/indexer/php-namespace-symbols.js +342 -0
  239. package/dist/indexer/php-namespace-symbols.js.map +1 -0
  240. package/dist/indexer/reference-context.d.ts +2 -0
  241. package/dist/indexer/reference-context.d.ts.map +1 -1
  242. package/dist/indexer/reference-context.js +4 -0
  243. package/dist/indexer/reference-context.js.map +1 -1
  244. package/dist/indexer/scope-nodes.d.ts +92 -13
  245. package/dist/indexer/scope-nodes.d.ts.map +1 -1
  246. package/dist/indexer/scope-nodes.js +212 -20
  247. package/dist/indexer/scope-nodes.js.map +1 -1
  248. package/dist/indexer/scope-types.d.ts +25 -1
  249. package/dist/indexer/scope-types.d.ts.map +1 -1
  250. package/dist/indexer/scope.d.ts.map +1 -1
  251. package/dist/indexer/scope.js +894 -45
  252. package/dist/indexer/scope.js.map +1 -1
  253. package/dist/indexer/shared-owner-identity.d.ts +53 -0
  254. package/dist/indexer/shared-owner-identity.d.ts.map +1 -0
  255. package/dist/indexer/shared-owner-identity.js +460 -0
  256. package/dist/indexer/shared-owner-identity.js.map +1 -0
  257. package/dist/indexer/shared.d.ts +1 -1
  258. package/dist/indexer/shared.d.ts.map +1 -1
  259. package/dist/indexer/shared.js +1 -1
  260. package/dist/indexer/shared.js.map +1 -1
  261. package/dist/indexer/star-import-precedence.d.ts +114 -0
  262. package/dist/indexer/star-import-precedence.d.ts.map +1 -0
  263. package/dist/indexer/star-import-precedence.js +396 -0
  264. package/dist/indexer/star-import-precedence.js.map +1 -0
  265. package/dist/indexer/symbols.d.ts +3 -1
  266. package/dist/indexer/symbols.d.ts.map +1 -1
  267. package/dist/indexer/symbols.js +58 -18
  268. package/dist/indexer/symbols.js.map +1 -1
  269. package/dist/indexer/ts-callables.d.ts +51 -0
  270. package/dist/indexer/ts-callables.d.ts.map +1 -0
  271. package/dist/indexer/ts-callables.js +264 -0
  272. package/dist/indexer/ts-callables.js.map +1 -0
  273. package/dist/indexer/types.d.ts +23 -1
  274. package/dist/indexer/types.d.ts.map +1 -1
  275. package/dist/indexer/unused-exports.d.ts +13 -0
  276. package/dist/indexer/unused-exports.d.ts.map +1 -0
  277. package/dist/indexer/unused-exports.js +159 -0
  278. package/dist/indexer/unused-exports.js.map +1 -0
  279. package/dist/indexer/workspace-symbols.d.ts.map +1 -1
  280. package/dist/indexer/workspace-symbols.js +3 -2
  281. package/dist/indexer/workspace-symbols.js.map +1 -1
  282. package/dist/indexer.d.ts +2 -2
  283. package/dist/indexer.d.ts.map +1 -1
  284. package/dist/indexer.js +1 -1
  285. package/dist/indexer.js.map +1 -1
  286. package/dist/languages/callable-arity.d.ts +202 -0
  287. package/dist/languages/callable-arity.d.ts.map +1 -0
  288. package/dist/languages/callable-arity.js +1182 -0
  289. package/dist/languages/callable-arity.js.map +1 -0
  290. package/dist/languages/definitions/c-family.d.ts.map +1 -1
  291. package/dist/languages/definitions/c-family.js +30 -1
  292. package/dist/languages/definitions/c-family.js.map +1 -1
  293. package/dist/languages/definitions/c.d.ts +4 -0
  294. package/dist/languages/definitions/c.d.ts.map +1 -1
  295. package/dist/languages/definitions/c.js +19 -0
  296. package/dist/languages/definitions/c.js.map +1 -1
  297. package/dist/languages/definitions/cpp.d.ts.map +1 -1
  298. package/dist/languages/definitions/cpp.js +12 -0
  299. package/dist/languages/definitions/cpp.js.map +1 -1
  300. package/dist/languages/definitions/csharp.d.ts.map +1 -1
  301. package/dist/languages/definitions/csharp.js +2 -8
  302. package/dist/languages/definitions/csharp.js.map +1 -1
  303. package/dist/languages/definitions/go.d.ts.map +1 -1
  304. package/dist/languages/definitions/go.js +3 -0
  305. package/dist/languages/definitions/go.js.map +1 -1
  306. package/dist/languages/definitions/javascript.d.ts.map +1 -1
  307. package/dist/languages/definitions/javascript.js +10 -1
  308. package/dist/languages/definitions/javascript.js.map +1 -1
  309. package/dist/languages/definitions/js-family.d.ts +1 -1
  310. package/dist/languages/definitions/js-family.d.ts.map +1 -1
  311. package/dist/languages/definitions/js-family.js +7 -1
  312. package/dist/languages/definitions/js-family.js.map +1 -1
  313. package/dist/languages/definitions/php.d.ts.map +1 -1
  314. package/dist/languages/definitions/php.js +5 -1
  315. package/dist/languages/definitions/php.js.map +1 -1
  316. package/dist/languages/definitions/typescript.d.ts.map +1 -1
  317. package/dist/languages/definitions/typescript.js +8 -1
  318. package/dist/languages/definitions/typescript.js.map +1 -1
  319. package/dist/languages/definitions/zig.d.ts.map +1 -1
  320. package/dist/languages/definitions/zig.js +2 -0
  321. package/dist/languages/definitions/zig.js.map +1 -1
  322. package/dist/mcp/handlers.js +14 -7
  323. package/dist/mcp/handlers.js.map +1 -1
  324. package/dist/review/candidates.d.ts.map +1 -1
  325. package/dist/review/candidates.js +1 -1
  326. package/dist/review/candidates.js.map +1 -1
  327. package/dist/review/deleted.d.ts +3 -3
  328. package/dist/review/deleted.d.ts.map +1 -1
  329. package/dist/review/deleted.js +82 -32
  330. package/dist/review/deleted.js.map +1 -1
  331. package/dist/review/report.d.ts +1 -0
  332. package/dist/review/report.d.ts.map +1 -1
  333. package/dist/review/report.js +1 -1
  334. package/dist/review/report.js.map +1 -1
  335. package/dist/review.d.ts.map +1 -1
  336. package/dist/review.js +1 -0
  337. package/dist/review.js.map +1 -1
  338. package/dist/sql/navigation.d.ts.map +1 -1
  339. package/dist/sql/navigation.js +1 -0
  340. package/dist/sql/navigation.js.map +1 -1
  341. package/dist/sql/source-graph.d.ts.map +1 -1
  342. package/dist/sql/source-graph.js +2 -2
  343. package/dist/sql/source-graph.js.map +1 -1
  344. package/dist/sqlite/schema.d.ts +1 -1
  345. package/dist/sqlite/schema.d.ts.map +1 -1
  346. package/dist/sqlite/schema.js +8 -2
  347. package/dist/sqlite/schema.js.map +1 -1
  348. package/dist/sqlite/write.js +2 -2
  349. package/dist/sqlite/write.js.map +1 -1
  350. package/dist/types.d.ts +2 -0
  351. package/dist/types.d.ts.map +1 -1
  352. package/dist/util/bloom-filter.d.ts +7 -1
  353. package/dist/util/bloom-filter.d.ts.map +1 -1
  354. package/dist/util/bloom-filter.js +12 -2
  355. package/dist/util/bloom-filter.js.map +1 -1
  356. package/dist/util/graph-edges.d.ts +19 -1
  357. package/dist/util/graph-edges.d.ts.map +1 -1
  358. package/dist/util/graph-edges.js +30 -4
  359. package/dist/util/graph-edges.js.map +1 -1
  360. package/dist/util/identifiers.d.ts +15 -0
  361. package/dist/util/identifiers.d.ts.map +1 -1
  362. package/dist/util/identifiers.js +35 -0
  363. package/dist/util/identifiers.js.map +1 -1
  364. package/dist/util/member-access-tables.d.ts +61 -4
  365. package/dist/util/member-access-tables.d.ts.map +1 -1
  366. package/dist/util/member-access-tables.js +137 -19
  367. package/dist/util/member-access-tables.js.map +1 -1
  368. package/dist/util/member-access.d.ts +17 -0
  369. package/dist/util/member-access.d.ts.map +1 -1
  370. package/dist/util/member-access.js +95 -3
  371. package/dist/util/member-access.js.map +1 -1
  372. package/dist/util/resolution/cargo-targets.d.ts +11 -0
  373. package/dist/util/resolution/cargo-targets.d.ts.map +1 -1
  374. package/dist/util/resolution/cargo-targets.js +174 -13
  375. package/dist/util/resolution/cargo-targets.js.map +1 -1
  376. package/dist/util/resolution/csharp.d.ts +33 -1
  377. package/dist/util/resolution/csharp.d.ts.map +1 -1
  378. package/dist/util/resolution/csharp.js +145 -30
  379. package/dist/util/resolution/csharp.js.map +1 -1
  380. package/dist/util/resolution/php.d.ts.map +1 -1
  381. package/dist/util/resolution/php.js +35 -8
  382. package/dist/util/resolution/php.js.map +1 -1
  383. package/dist/util/resolution/python.d.ts +9 -0
  384. package/dist/util/resolution/python.d.ts.map +1 -1
  385. package/dist/util/resolution/python.js +46 -0
  386. package/dist/util/resolution/python.js.map +1 -1
  387. package/dist/util/resolution/rust.d.ts.map +1 -1
  388. package/dist/util/resolution/rust.js +95 -26
  389. package/dist/util/resolution/rust.js.map +1 -1
  390. package/dist/util/resolution-candidates.d.ts +5 -0
  391. package/dist/util/resolution-candidates.d.ts.map +1 -1
  392. package/dist/util/resolution-candidates.js +16 -3
  393. package/dist/util/resolution-candidates.js.map +1 -1
  394. package/dist/util/resolution.d.ts +2 -1
  395. package/dist/util/resolution.d.ts.map +1 -1
  396. package/dist/util/resolution.js +96 -5
  397. package/dist/util/resolution.js.map +1 -1
  398. package/dist/util/specifiers.d.ts +20 -0
  399. package/dist/util/specifiers.d.ts.map +1 -1
  400. package/dist/util/specifiers.js +29 -0
  401. package/dist/util/specifiers.js.map +1 -1
  402. package/docs/mcp.md +3 -2
  403. package/package.json +3 -3
  404. package/dist/impact/call-compatibility/providers/profiles.d.ts +0 -80
  405. package/dist/impact/call-compatibility/providers/profiles.d.ts.map +0 -1
  406. package/dist/impact/call-compatibility/providers/profiles.js +0 -164
  407. package/dist/impact/call-compatibility/providers/profiles.js.map +0 -1
@@ -1,19 +1,126 @@
1
+ import { definitionWithoutDeferredSteps, nameResolutionPreloadFiles, phpImportTypeAtPosition, resolveBareName, settleNameResolution, } from "../indexer/name-resolution.js";
2
+ import { recoverIncludedCallableStar } from "../indexer/navigation.js";
1
3
  import { isUnsupportedParserInputError, prepareSourceInput } from "../languages/file-prep.js";
4
+ import { supportForFileWithoutHeaderSample } from "../languages.js";
2
5
  import { logWithLevel } from "../logging.js";
3
6
  import { ProjectedSyntaxTree } from "../native/projected-tree.js";
4
7
  import { assertNativeRequiredAvailable, getNativeSyntaxTreeExecution, isNativeRequiredUnavailableError, } from "../native/tree-sitter-native.js";
5
- import { resolveExport } from "../indexer/navigation-resolve.js";
8
+ import { cppCallableIsDefinition, cppEquivalentCallableBindings } from "../indexer/cpp-callables.js";
9
+ import { cjsRequireValueBinding, resolveExport } from "../indexer/navigation-resolve.js";
10
+ import { typescriptCollapsedOverloadTarget, typescriptCallableContainerKey, typescriptCallableRoleAt, typescriptOverloadImplementationAcceptsCount, } from "../indexer/ts-callables.js";
11
+ import { isJsTsLanguage } from "../languages/js-family.js";
12
+ import { isGoExportedMemberName, languageHasDeclarationVisibility } from "../indexer/declaration-visibility.js";
13
+ import { innermostNamespaceImport, resolveMemberAccessDefinition } from "../indexer/navigation-goto.js";
14
+ import { inferPhpQualifiedReferenceImportType } from "../indexer/navigation-php.js";
15
+ import { ensurePhpNamespaceSymbolIndex } from "../indexer/php-namespace-symbols.js";
6
16
  import { findClosestScopeBinding, getOrBuildScopeIndex } from "../indexer/navigation-local.js";
7
- import { SymbolKind } from "../indexer/types.js";
17
+ import { ensureParsedContext } from "../indexer/parse-context.js";
18
+ import { SymbolKind, } from "../indexer/types.js";
8
19
  import { fileIdentityKey, normalizePath } from "../util/paths.js";
9
- import { buildSymbolGraph } from "./symbol-graph.js";
20
+ import { foldPhpIdentifierCase } from "../util/identifiers.js";
21
+ import { buildSymbolGraph, defNodeId } from "./symbol-graph.js";
10
22
  import { collectDetailedDeclarations } from "./symbol-graph-detailed/ast.js";
11
23
  import { emitClassInheritanceEdges, emitFunctionBodyEdges, emitMemberOwnershipEdges, emitMemberImplementationEdges, emitPythonDecoratorEdges, emitRustImplEdges, } from "./symbol-graph-detailed/edge-passes.js";
12
24
  import { buildImportAliasMaps } from "./symbol-graph-detailed/import-aliases.js";
13
25
  import { createMemberChainResolver } from "./symbol-graph-detailed/member-chains.js";
14
- import { emitReceiverCallEdges } from "./symbol-graph-detailed/receiver-calls.js";
26
+ import { emitReceiverCallEdges, } from "./symbol-graph-detailed/receiver-calls.js";
27
+ const CPP_CLASS_DECLARATION_TYPES = new Set(["class_specifier", "struct_specifier", "union_specifier"]);
28
+ function symbolDefForBinding(moduleEntry, binding) {
29
+ const bindingRange = binding.def;
30
+ if (!bindingRange)
31
+ return null;
32
+ return (moduleEntry.locals.find((candidate) => candidate.kind === SymbolKind.Function &&
33
+ candidate.range.start.index === bindingRange.start.index &&
34
+ candidate.range.end.index === bindingRange.end.index) ?? null);
35
+ }
36
+ function recordCallableDeclarationAliases(moduleEntry, languageId, bindings, nodeAliases) {
37
+ const recordGroup = (group) => {
38
+ if (group.length < 2)
39
+ return;
40
+ const canonicalBinding = group.find((binding) => !cppCallableIsDefinition(binding.node)) ?? group[0];
41
+ const canonicalDef = symbolDefForBinding(moduleEntry, canonicalBinding);
42
+ if (!canonicalDef)
43
+ return;
44
+ const canonicalId = defNodeId(canonicalDef);
45
+ for (const binding of group) {
46
+ const def = symbolDefForBinding(moduleEntry, binding);
47
+ if (!def)
48
+ continue;
49
+ const id = defNodeId(def);
50
+ if (id !== canonicalId)
51
+ nodeAliases.set(id, canonicalId);
52
+ }
53
+ };
54
+ if (languageId === "c") {
55
+ const byName = new Map();
56
+ for (const binding of bindings) {
57
+ if (binding.kind !== "function" || !binding.def)
58
+ continue;
59
+ const group = byName.get(binding.canonicalName) ?? [];
60
+ group.push(binding);
61
+ byName.set(binding.canonicalName, group);
62
+ }
63
+ for (const group of byName.values())
64
+ recordGroup(group);
65
+ return;
66
+ }
67
+ if (languageId !== "cpp")
68
+ return;
69
+ const handled = new Set();
70
+ for (const binding of bindings) {
71
+ if (binding.kind !== "function" || handled.has(binding))
72
+ continue;
73
+ const group = cppEquivalentCallableBindings(binding);
74
+ for (const candidate of group)
75
+ handled.add(candidate);
76
+ recordGroup(group);
77
+ }
78
+ }
79
+ function recordTypeScriptCallableAliases(moduleEntry, languageId, tree, nodeAliases) {
80
+ if (languageId !== "ts" && languageId !== "tsx")
81
+ return;
82
+ const groups = new Map();
83
+ for (const local of moduleEntry.locals) {
84
+ if (local.kind !== SymbolKind.Function)
85
+ continue;
86
+ const start = local.range.start.index ?? 0;
87
+ const end = local.range.end.index ?? start;
88
+ const role = typescriptCallableRoleAt(tree, start, end);
89
+ if (role === "other")
90
+ continue;
91
+ const key = `${typescriptCallableContainerKey(tree, start, end)}\0${local.localName}`;
92
+ const group = groups.get(key) ?? [];
93
+ group.push(local);
94
+ groups.set(key, group);
95
+ }
96
+ for (const group of groups.values()) {
97
+ if (group.length < 2)
98
+ continue;
99
+ // Signature-only and multiply implemented groups keep their distinct declarations.
100
+ const canonical = typescriptCollapsedOverloadTarget(group, tree, (local) => local);
101
+ if (!canonical)
102
+ continue;
103
+ const canonicalId = defNodeId(canonical);
104
+ for (const local of group) {
105
+ const id = defNodeId(local);
106
+ if (id !== canonicalId)
107
+ nodeAliases.set(id, canonicalId);
108
+ }
109
+ }
110
+ }
111
+ /**
112
+ * The indexed symbol a definition names (with its member metadata), or null for a parameter or
113
+ * block local, which has no graph node.
114
+ */
115
+ function indexedSymbolFor(index, def) {
116
+ const module = index.byFile.get(fileIdentityKey(def.file));
117
+ return (module?.locals.find((local) => local.localName === def.localName &&
118
+ local.range.start.index === def.range.start.index &&
119
+ local.range.end.index === def.range.end.index) ?? null);
120
+ }
15
121
  export async function buildSymbolGraphDetailed(index, opts) {
16
122
  assertNativeRequiredAvailable(index.nativeMode);
123
+ await ensurePhpNamespaceSymbolIndex(index);
17
124
  const base = await buildSymbolGraph(index, opts?.files ? { files: opts.files } : undefined);
18
125
  const configuredMaxEdges = typeof opts?.maxEdges === "number" && opts.maxEdges > 0 ? Math.floor(opts.maxEdges) : undefined;
19
126
  const maxEdges = configuredMaxEdges ?? Number.POSITIVE_INFINITY;
@@ -49,15 +156,23 @@ export async function buildSymbolGraphDetailed(index, opts) {
49
156
  edgeCount++;
50
157
  return true;
51
158
  };
52
- const recordEdge = (fromId, toId, label, site) => {
159
+ const edgeKey = (fromId, toId, label, site) => {
53
160
  const siteKey = site ? `${site.file}:${site.range.start.index ?? ""}:${site.range.end.index ?? ""}` : "";
54
- const key = `${fromId}->${toId}::${label ?? ""}::${siteKey}`;
161
+ return `${fromId}->${toId}::${label ?? ""}::${siteKey}`;
162
+ };
163
+ const recordEdge = (fromId, toId, label, site) => {
164
+ const key = edgeKey(fromId, toId, label, site);
55
165
  if (added.has(key))
56
166
  return true;
57
167
  added.add(key);
58
168
  return maybePushEdge(fromId, toId, label, site);
59
169
  };
60
- const resolveExportNamespace = (file, exportedName) => resolveExport(index, file, exportedName);
170
+ const resolveExportNamespace = (file, exportedName) => {
171
+ const languageId = supportForFileWithoutHeaderSample(file, index.languageExtensions)?.id;
172
+ if (!isGoExportedMemberName(languageId, exportedName))
173
+ return null;
174
+ return resolveExport(index, file, exportedName);
175
+ };
61
176
  const resolveExportDef = (file, exportedName) => {
62
177
  const resolved = resolveExportNamespace(file, exportedName);
63
178
  return resolved?.kind === "resolved" ? resolved.def : null;
@@ -68,7 +183,10 @@ export async function buildSymbolGraphDetailed(index, opts) {
68
183
  for (const segment of [...names].reverse()) {
69
184
  if (!file)
70
185
  break;
71
- const resolved = resolveExportNamespace(file, segment);
186
+ const languageId = supportForFileWithoutHeaderSample(file, index.languageExtensions)?.id;
187
+ const resolved = languageId && isJsTsLanguage(languageId)
188
+ ? resolveExport(index, file, segment, { allowLocalFallback: false })
189
+ : resolveExportNamespace(file, segment);
72
190
  if (!resolved) {
73
191
  targetDef = null;
74
192
  break;
@@ -81,32 +199,70 @@ export async function buildSymbolGraphDetailed(index, opts) {
81
199
  targetDef = resolved.def;
82
200
  file = normalizePath(targetDef.file);
83
201
  }
84
- if (targetDef) {
202
+ if (targetDef)
85
203
  return targetDef;
86
- }
204
+ const languageId = supportForFileWithoutHeaderSample(file ?? startFile, index.languageExtensions)?.id;
205
+ if (languageId === "c" ||
206
+ languageId === "cpp" ||
207
+ (languageId && (isJsTsLanguage(languageId) || languageHasDeclarationVisibility(languageId))))
208
+ return null;
87
209
  const fileKey = typeof file === "string" ? fileIdentityKey(file) : null;
88
210
  const moduleEntry = fileKey ? index.byFile.get(fileKey) : undefined;
89
211
  const lastName = names[0];
212
+ if (languageId === "go" && (!lastName || !isGoExportedMemberName(languageId, lastName)))
213
+ return null;
90
214
  return moduleEntry?.locals.find((entry) => entry.localName === lastName) ?? null;
91
215
  };
92
216
  const resolveExportFrom = (file, exportedName) => resolveExportDef(file, exportedName);
93
217
  const receiverCalls = [];
94
- // Every receiver call resolves to a callable declared somewhere in the project, so
95
- // this set short-circuits receiver typing for calls into runtime and dependency
96
- // APIs, which dominate real call sites. Built on first use because a scoped graph
97
- // may never reach a receiver call.
218
+ const fileHiddenMemberIds = new Set();
219
+ const receiverMemberScopes = new Map();
220
+ const receiverMemberArities = new Map();
221
+ const sharedOwnerPeers = new Map();
222
+ const sharedOwnerAnchors = new Map();
223
+ const sharedOwnerAccessibleMembers = new Map();
224
+ const nodeAliases = new Map();
225
+ const ownershipParsedContexts = new Map();
226
+ const loadParsedFile = (file) => {
227
+ const fileKey = fileIdentityKey(file);
228
+ const cached = ownershipParsedContexts.get(fileKey);
229
+ if (cached)
230
+ return cached;
231
+ const pending = ensureParsedContext(file, index.parsed?.get(fileKey), index.languageExtensions).catch(() => null);
232
+ ownershipParsedContexts.set(fileKey, pending);
233
+ return pending;
234
+ };
235
+ // Receiver calls into runtime and dependency APIs dominate real call sites. Build these
236
+ // indexes lazily so a scoped graph that has no receiver calls pays no allocation cost.
98
237
  let callableNames;
99
- const hasCallableNamed = (name) => {
238
+ const ensureCallableNames = () => {
100
239
  if (!callableNames) {
101
- callableNames = new Set();
240
+ callableNames = { exact: new Set(), phpFolded: new Set() };
102
241
  for (const entry of index.byFile.values()) {
242
+ const isPhp = supportForFileWithoutHeaderSample(entry.file, index.languageExtensions)?.id === "php";
103
243
  for (const local of entry.locals) {
104
- if (local.kind === SymbolKind.Function)
105
- callableNames.add(local.localName);
244
+ if (local.kind !== SymbolKind.Function)
245
+ continue;
246
+ callableNames.exact.add(local.localName);
247
+ if (isPhp)
248
+ callableNames.phpFolded.add(foldPhpIdentifierCase(local.localName));
106
249
  }
107
250
  }
108
251
  }
109
- return callableNames.has(name);
252
+ return callableNames;
253
+ };
254
+ const hasCallableNamed = (name, phpCaseInsensitive = false) => {
255
+ const names = ensureCallableNames();
256
+ return phpCaseInsensitive ? names.phpFolded.has(foldPhpIdentifierCase(name)) : names.exact.has(name);
257
+ };
258
+ // Function-valued bindings (`const helper = () => 1`) index as variables, so the
259
+ // kind scan above cannot see them; the detailed pass mirrors each name it proves
260
+ // callable here as its files are processed.
261
+ const noteCallableName = (name, phpCaseInsensitive = false) => {
262
+ const names = ensureCallableNames();
263
+ names.exact.add(name);
264
+ if (phpCaseInsensitive)
265
+ names.phpFolded.add(foldPhpIdentifierCase(name));
110
266
  };
111
267
  const optionFileKeys = opts?.files ? new Set(Array.from(opts.files, fileIdentityKey)) : undefined;
112
268
  for (const moduleEntry of index.byFile.values()) {
@@ -147,7 +303,19 @@ export async function buildSymbolGraphDetailed(index, opts) {
147
303
  if (!sup || src === undefined || !tree) {
148
304
  throw new Error(`Failed to parse ${file}`);
149
305
  }
150
- const { aliasToTargetDef, aliasToTargetModule } = buildImportAliasMaps(index, moduleEntry, resolveExportNamespace, resolveExportFrom);
306
+ ownershipParsedContexts.set(fileIdentityKey(file), Promise.resolve({ source: src, tree, sup }));
307
+ const scopeIndex = getOrBuildScopeIndex(index, file, src, sup, moduleEntry, tree);
308
+ const { aliasToTargetDef, aliasToTargetModule } = buildImportAliasMaps(index, moduleEntry, resolveExportNamespace, resolveExportFrom, scopeIndex);
309
+ if (sup.id === "c" || sup.id === "cpp") {
310
+ for (const [alias, def] of [...aliasToTargetDef]) {
311
+ const exported = resolveExport(index, def.file, alias, {
312
+ allowLocalFallback: false,
313
+ ...(sup.id === "c" ? { cNamespace: "ordinary" } : {}),
314
+ });
315
+ if (exported?.kind !== "resolved")
316
+ aliasToTargetDef.delete(alias);
317
+ }
318
+ }
151
319
  const { functionNodes, classNodes, constStringOf } = collectDetailedDeclarations(tree.rootNode, sup, src, moduleEntry.locals);
152
320
  const memberResolver = createMemberChainResolver({
153
321
  sup,
@@ -155,27 +323,100 @@ export async function buildSymbolGraphDetailed(index, opts) {
155
323
  constStringOf,
156
324
  aliasToTargetModule,
157
325
  resolveMemberPathFromModule,
326
+ ...(sup.id === "zig" || sup.id === "csharp" || isJsTsLanguage(sup.id)
327
+ ? {
328
+ resolveNamespaceAlias: (alias, useNode) => {
329
+ if (sup.id === "zig") {
330
+ const binding = findClosestScopeBinding(scopeIndex, alias, useNode, sup);
331
+ if (binding && binding.kind !== "namespace")
332
+ return undefined;
333
+ }
334
+ const imported = innermostNamespaceImport(moduleEntry.imports, alias, useNode, sup.normalizeIdentifier);
335
+ if (isJsTsLanguage(sup.id) &&
336
+ imported?.mechanism === "cjs" &&
337
+ typeof imported.resolved === "string" &&
338
+ cjsRequireValueBinding(index, imported.resolved)) {
339
+ return undefined;
340
+ }
341
+ if (typeof imported?.resolved === "string")
342
+ return imported.resolved;
343
+ if (isJsTsLanguage(sup.id))
344
+ return aliasToTargetModule.get(alias);
345
+ return undefined;
346
+ },
347
+ }
348
+ : {}),
349
+ // Go has no `resolveNamespaceAlias` override otherwise, so a local variable that
350
+ // shadows a package alias (`u := LocalU{}; u.Square()` alongside `import u "pkg"`)
351
+ // would still resolve `u.Square` through the blind `aliasToTargetModule` text map.
352
+ // Refuse the package alias whenever a closer, non-namespace scope binding owns the
353
+ // name at this exact use site, matching how the receiver-proof path already treats
354
+ // the local as the real receiver instead.
355
+ ...(sup.id === "go"
356
+ ? {
357
+ resolveNamespaceAlias: (alias, useNode) => {
358
+ const binding = findClosestScopeBinding(scopeIndex, alias, useNode, sup);
359
+ if (binding && binding.kind !== "namespace")
360
+ return undefined;
361
+ return aliasToTargetModule.get(alias);
362
+ },
363
+ }
364
+ : {}),
158
365
  });
159
366
  const { memberExpressionType, optionalMemberTypes, propertyIdentifierTypes, resolveMemberChainTarget } = memberResolver;
160
- const scopeIndex = getOrBuildScopeIndex(index, file, src, sup, moduleEntry, tree);
161
- const resolveIdentifier = (name, node) => {
162
- const binding = findClosestScopeBinding(scopeIndex, name, node, sup);
163
- if (binding) {
164
- if (!binding.def)
165
- return aliasToTargetDef.get(binding.name) ?? null;
166
- return (moduleEntry.locals.find((local) => sup.normalizeIdentifier(local.localName) === binding.canonicalName &&
167
- local.range.start.index === binding.def?.start.index &&
168
- local.range.end.index === binding.def?.end.index) ?? null);
169
- }
170
- const localCandidates = moduleEntry.locals.filter((local) => sup.normalizeIdentifier(local.localName) === sup.normalizeIdentifier(name));
171
- if (localCandidates.length === 1)
172
- return localCandidates[0] ?? null;
173
- return aliasToTargetDef.get(name) ?? null;
367
+ recordCallableDeclarationAliases(moduleEntry, sup.id, scopeIndex.all, nodeAliases);
368
+ recordTypeScriptCallableAliases(moduleEntry, sup.id, tree, nodeAliases);
369
+ // Files the shared name lookup reads synchronously for this module (imports, C++ includes).
370
+ const parsedForResolution = new Map([
371
+ [fileIdentityKey(file), { source: src, tree, sup }],
372
+ ]);
373
+ for (const preload of nameResolutionPreloadFiles(index, moduleEntry, sup.id)) {
374
+ const key = fileIdentityKey(preload);
375
+ if (parsedForResolution.has(key))
376
+ continue;
377
+ const parsedFile = await loadParsedFile(preload);
378
+ if (parsedFile)
379
+ parsedForResolution.set(key, parsedFile);
380
+ }
381
+ const resolutionFiles = {
382
+ get: (target) => parsedForResolution.get(fileIdentityKey(target)) ?? null,
383
+ };
384
+ const moduleParsed = { source: src, tree, sup };
385
+ const bareNameUse = (name, node) => {
386
+ const phpImportType = sup.id === "php"
387
+ ? (phpImportTypeAtPosition(moduleEntry.imports, node.startPosition.row, node.startPosition.column) ??
388
+ inferPhpQualifiedReferenceImportType(node))
389
+ : undefined;
390
+ return {
391
+ index,
392
+ mod: moduleEntry,
393
+ file,
394
+ parsed: moduleParsed,
395
+ scopeIndex,
396
+ files: resolutionFiles,
397
+ node,
398
+ name,
399
+ ...(phpImportType ? { phpImportType } : {}),
400
+ };
401
+ };
402
+ // The graph has nodes only for indexed symbols; a parameter or function-local binding
403
+ // that navigation resolves has no node, so it gets no edge.
404
+ const indexedOrNull = (definition) => definition ? indexedSymbolFor(index, definition) : null;
405
+ const resolveName = (name, node) => resolveBareName(bareNameUse(name, node));
406
+ const resolveIdentifier = (name, node) => indexedOrNull(definitionWithoutDeferredSteps(resolveName(name, node)));
407
+ const settleName = async (name, node, resolution) => {
408
+ const settled = await settleNameResolution(bareNameUse(name, node), resolution, {
409
+ // A member that cannot accept the call's argument count gets no edge and no fallback.
410
+ requireAcceptedArity: true,
411
+ recoverIncludedStar: (lookupName, cNamespace) => recoverIncludedCallableStar(index, moduleEntry, sup.id, lookupName, cNamespace, node, src),
412
+ });
413
+ return indexedOrNull(settled?.status === "ok" ? settled.definition : null);
174
414
  };
175
415
  const edgePassContext = {
176
416
  index,
177
417
  sup,
178
418
  source: src,
419
+ tree,
179
420
  moduleEntry,
180
421
  nodes,
181
422
  membersOnly,
@@ -185,16 +426,57 @@ export async function buildSymbolGraphDetailed(index, opts) {
185
426
  aliasToTargetDef,
186
427
  aliasToTargetModule,
187
428
  resolveIdentifier,
429
+ resolveName,
430
+ settleName,
431
+ hasNonModuleBinding: (name, node) => {
432
+ const binding = findClosestScopeBinding(scopeIndex, name, node, sup);
433
+ return !!binding && scopeIndex.allScopes[0]?.map.get(binding.canonicalName) !== binding;
434
+ },
188
435
  resolveExportFrom,
189
436
  resolveMemberChainTarget,
437
+ cppDeclaresClass: (def) => {
438
+ const parsed = parsedForResolution.get(fileIdentityKey(def.file));
439
+ if (!parsed)
440
+ return false;
441
+ const start = def.range.start.index ?? 0;
442
+ const nameNode = parsed.tree.rootNode.descendantForIndex(start, def.range.end.index ?? start);
443
+ return CPP_CLASS_DECLARATION_TYPES.has(nameNode.parent?.type ?? "");
444
+ },
445
+ resolveMemberAccessTarget: async (node) => {
446
+ const useNode = tree.rootNode.descendantForIndex(node.startIndex, node.endIndex);
447
+ const resolved = await resolveMemberAccessDefinition({
448
+ index,
449
+ mod: moduleEntry,
450
+ node: useNode,
451
+ source: src,
452
+ tree,
453
+ sup,
454
+ resolveLexicalBinding: (expression) => {
455
+ const name = src.slice(expression.startIndex, expression.endIndex);
456
+ const imported = aliasToTargetDef.get(name);
457
+ if (imported)
458
+ return imported;
459
+ return resolveIdentifier(name, expression);
460
+ },
461
+ });
462
+ return resolved?.status === "ok" ? resolved.definition : null;
463
+ },
190
464
  recordEdge,
191
465
  receiverCalls,
192
- hasCallableNamed,
466
+ receiverMemberScopes,
467
+ receiverMemberArities,
468
+ sharedOwnerPeers,
469
+ sharedOwnerAnchors,
470
+ sharedOwnerAccessibleMembers,
471
+ fileHiddenMemberIds,
472
+ nodeAliases,
473
+ noteCallableName,
474
+ loadParsedFile,
193
475
  };
194
476
  emitPythonDecoratorEdges(edgePassContext, tree.rootNode);
195
- emitFunctionBodyEdges(edgePassContext, functionNodes);
196
- emitMemberOwnershipEdges(edgePassContext, functionNodes, classNodes);
197
- emitClassInheritanceEdges(edgePassContext, classNodes);
477
+ await emitFunctionBodyEdges(edgePassContext, functionNodes);
478
+ await emitMemberOwnershipEdges(edgePassContext, functionNodes, classNodes);
479
+ await emitClassInheritanceEdges(edgePassContext, classNodes);
198
480
  emitRustImplEdges(edgePassContext, tree.rootNode);
199
481
  }
200
482
  catch (error) {
@@ -207,12 +489,121 @@ export async function buildSymbolGraphDetailed(index, opts) {
207
489
  logWithLevel(opts?.logLevel, "warn", `Warning: Failed to build detailed symbol edges for ${file}:`, error);
208
490
  }
209
491
  }
210
- emitReceiverCallEdges({ nodes, edges }, receiverCalls, recordEdge);
492
+ // Function-valued bindings are proven while each file is processed. Apply the callable-name
493
+ // prefilter only after that pass so receiver calls do not depend on file iteration order.
494
+ const callableReceiverCalls = receiverCalls.filter((candidate) => hasCallableNamed(candidate.memberName, candidate.caseInsensitiveMemberName));
495
+ let typeScriptReceiverFiles;
496
+ let typeScriptReceiverNames;
497
+ for (const candidate of callableReceiverCalls) {
498
+ if (candidate.argumentCount === null)
499
+ continue;
500
+ const languageId = supportForFileWithoutHeaderSample(candidate.site.file, index.languageExtensions)?.id;
501
+ if (languageId !== "ts" && languageId !== "tsx")
502
+ continue;
503
+ (typeScriptReceiverFiles ??= new Set()).add(fileIdentityKey(candidate.site.file));
504
+ (typeScriptReceiverNames ??= new Set()).add(candidate.memberName);
505
+ }
506
+ const typeScriptReceiverTargets = typeScriptReceiverNames?.size
507
+ ? new Map()
508
+ : undefined;
509
+ if (typeScriptReceiverTargets && typeScriptReceiverNames) {
510
+ for (const node of nodes.values()) {
511
+ if (!typeScriptReceiverNames.has(node.name))
512
+ continue;
513
+ const targetLanguageId = supportForFileWithoutHeaderSample(node.file, index.languageExtensions)?.id;
514
+ if (targetLanguageId !== "ts" && targetLanguageId !== "tsx")
515
+ continue;
516
+ const module = index.byFile.get(fileIdentityKey(node.file));
517
+ const def = module?.locals.find((candidate) => defNodeId(candidate) === node.id);
518
+ if (!module || !def || def.kind !== SymbolKind.Function)
519
+ continue;
520
+ if (!module.locals.some((candidate) => candidate.kind === SymbolKind.Function &&
521
+ candidate.localName === def.localName &&
522
+ candidate.range.start.index !== def.range.start.index)) {
523
+ continue;
524
+ }
525
+ const parsed = await loadParsedFile(def.file);
526
+ typeScriptReceiverTargets.set(node.id, { def, module, parsed });
527
+ }
528
+ }
529
+ const removedReceiverEdges = emitReceiverCallEdges({ nodes, edges }, callableReceiverCalls, recordEdge, receiverMemberScopes, nodeAliases, receiverMemberArities, sharedOwnerAnchors, sharedOwnerAccessibleMembers, fileHiddenMemberIds, (targetId, candidate) => {
530
+ if (candidate.argumentCount === null || !typeScriptReceiverFiles?.has(fileIdentityKey(candidate.site.file))) {
531
+ return true;
532
+ }
533
+ const target = typeScriptReceiverTargets?.get(targetId);
534
+ if (!target)
535
+ return true;
536
+ if (!target.parsed)
537
+ return false;
538
+ return typescriptOverloadImplementationAcceptsCount({
539
+ implementation: target.def,
540
+ locals: target.module.locals,
541
+ tree: target.parsed.tree,
542
+ source: target.parsed.source,
543
+ languageId: target.parsed.sup.id,
544
+ argumentCount: candidate.argumentCount,
545
+ });
546
+ });
547
+ edgeCount -= removedReceiverEdges.length;
548
+ for (const edge of removedReceiverEdges)
549
+ added.delete(edgeKey(edge.from, edge.to, edge.label, edge.site));
550
+ const canonicalNodeId = (id) => {
551
+ let current = id;
552
+ const seen = new Set();
553
+ while (nodeAliases.has(current) && !seen.has(current)) {
554
+ seen.add(current);
555
+ current = nodeAliases.get(current);
556
+ }
557
+ return current;
558
+ };
559
+ for (const [aliasId] of nodeAliases) {
560
+ const canonicalId = canonicalNodeId(aliasId);
561
+ nodeAliases.set(aliasId, canonicalId);
562
+ if (canonicalId === aliasId)
563
+ continue;
564
+ const aliasNode = nodes.get(aliasId);
565
+ const canonicalNode = nodes.get(canonicalId);
566
+ if (aliasNode && canonicalNode) {
567
+ if (!canonicalNode.docstring && aliasNode.docstring)
568
+ canonicalNode.docstring = aliasNode.docstring;
569
+ canonicalNode.lineSpan = Math.max(canonicalNode.lineSpan ?? 0, aliasNode.lineSpan ?? 0);
570
+ canonicalNode.complexity = Math.max(canonicalNode.complexity ?? 0, aliasNode.complexity ?? 0);
571
+ if (aliasNode.callable)
572
+ canonicalNode.callable = true;
573
+ if (aliasNode.implementationTarget)
574
+ canonicalNode.implementationTarget = true;
575
+ if (canonicalNode.memberArity === undefined && aliasNode.memberArity !== undefined) {
576
+ canonicalNode.memberArity = aliasNode.memberArity;
577
+ }
578
+ }
579
+ nodes.delete(aliasId);
580
+ }
581
+ if (nodeAliases.size) {
582
+ const reconciledEdges = [];
583
+ const reconciledEdgeKeys = new Set();
584
+ for (const edge of edges) {
585
+ const reconciled = {
586
+ ...edge,
587
+ from: canonicalNodeId(edge.from),
588
+ to: canonicalNodeId(edge.to),
589
+ };
590
+ const key = edgeKey(reconciled.from, reconciled.to, reconciled.label, reconciled.site);
591
+ if (reconciledEdgeKeys.has(key))
592
+ continue;
593
+ reconciledEdgeKeys.add(key);
594
+ reconciledEdges.push(reconciled);
595
+ }
596
+ edges.splice(0, edges.length, ...reconciledEdges);
597
+ added.clear();
598
+ for (const edge of edges)
599
+ added.add(edgeKey(edge.from, edge.to, edge.label, edge.site));
600
+ edgeCount = edges.length;
601
+ }
211
602
  emitMemberImplementationEdges({ nodes, edges }, recordEdge);
212
603
  if (skippedSyntaxTreeFiles > 0) {
213
604
  logWithLevel(opts?.logLevel, "warn", `Warning: Skipped detailed symbol edges for ${skippedSyntaxTreeFiles} file(s) because no syntax-tree backend was available.`);
214
605
  }
215
- return {
606
+ const graph = {
216
607
  nodes,
217
608
  edges,
218
609
  ...(configuredMaxEdges !== undefined
@@ -223,5 +614,8 @@ export async function buildSymbolGraphDetailed(index, opts) {
223
614
  }
224
615
  : {}),
225
616
  };
617
+ if (nodeAliases.size)
618
+ Object.defineProperty(graph, "nodeAliases", { value: nodeAliases });
619
+ return graph;
226
620
  }
227
621
  //# sourceMappingURL=symbol-graph-detailed.js.map