@lzehrung/codegraph 3.0.1 → 3.1.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 (684) hide show
  1. package/README.md +17 -17
  2. package/codegraph-skill/codegraph/SKILL.md +6 -2
  3. package/dist/agent/artifact.d.ts.map +1 -1
  4. package/dist/agent/artifact.js +4 -9
  5. package/dist/agent/artifact.js.map +1 -1
  6. package/dist/agent/call-hierarchy.d.ts +4 -2
  7. package/dist/agent/call-hierarchy.d.ts.map +1 -1
  8. package/dist/agent/call-hierarchy.js +20 -29
  9. package/dist/agent/call-hierarchy.js.map +1 -1
  10. package/dist/agent/explain.d.ts.map +1 -1
  11. package/dist/agent/explain.js +24 -18
  12. package/dist/agent/explain.js.map +1 -1
  13. package/dist/agent/explore.d.ts.map +1 -1
  14. package/dist/agent/explore.js +2 -11
  15. package/dist/agent/explore.js.map +1 -1
  16. package/dist/agent/file-view.d.ts.map +1 -1
  17. package/dist/agent/file-view.js +4 -12
  18. package/dist/agent/file-view.js.map +1 -1
  19. package/dist/agent/normalize.d.ts +0 -3
  20. package/dist/agent/normalize.d.ts.map +1 -1
  21. package/dist/agent/normalize.js +1 -7
  22. package/dist/agent/normalize.js.map +1 -1
  23. package/dist/agent/orient.d.ts.map +1 -1
  24. package/dist/agent/orient.js +2 -6
  25. package/dist/agent/orient.js.map +1 -1
  26. package/dist/agent/packet.d.ts.map +1 -1
  27. package/dist/agent/packet.js +2 -5
  28. package/dist/agent/packet.js.map +1 -1
  29. package/dist/agent/query-index/content.d.ts.map +1 -1
  30. package/dist/agent/query-index/content.js +2 -6
  31. package/dist/agent/query-index/content.js.map +1 -1
  32. package/dist/agent/query-index/update.d.ts.map +1 -1
  33. package/dist/agent/query-index/update.js +8 -45
  34. package/dist/agent/query-index/update.js.map +1 -1
  35. package/dist/agent/query-index/worker-pool.d.ts.map +1 -1
  36. package/dist/agent/query-index/worker-pool.js +2 -1
  37. package/dist/agent/query-index/worker-pool.js.map +1 -1
  38. package/dist/agent/refactor-plan.d.ts +2 -2
  39. package/dist/agent/refactor-plan.d.ts.map +1 -1
  40. package/dist/agent/refactor-plan.js +11 -57
  41. package/dist/agent/refactor-plan.js.map +1 -1
  42. package/dist/agent/rename-preview.d.ts.map +1 -1
  43. package/dist/agent/rename-preview.js +166 -23
  44. package/dist/agent/rename-preview.js.map +1 -1
  45. package/dist/agent/search.d.ts +13 -0
  46. package/dist/agent/search.d.ts.map +1 -1
  47. package/dist/agent/search.js +17 -26
  48. package/dist/agent/search.js.map +1 -1
  49. package/dist/agent/semantic-symbols.d.ts +1 -1
  50. package/dist/agent/semantic-symbols.d.ts.map +1 -1
  51. package/dist/agent/semantic-symbols.js +2 -5
  52. package/dist/agent/semantic-symbols.js.map +1 -1
  53. package/dist/agent/semantic.d.ts +5 -0
  54. package/dist/agent/semantic.d.ts.map +1 -1
  55. package/dist/agent/semantic.js +12 -1
  56. package/dist/agent/semantic.js.map +1 -1
  57. package/dist/agent/session.d.ts +9 -0
  58. package/dist/agent/session.d.ts.map +1 -1
  59. package/dist/agent/session.js +59 -41
  60. package/dist/agent/session.js.map +1 -1
  61. package/dist/agent/type-hierarchy.d.ts +4 -2
  62. package/dist/agent/type-hierarchy.d.ts.map +1 -1
  63. package/dist/agent/type-hierarchy.js +19 -31
  64. package/dist/agent/type-hierarchy.js.map +1 -1
  65. package/dist/agent/workspace-symbols.d.ts +1 -1
  66. package/dist/agent/workspace-symbols.d.ts.map +1 -1
  67. package/dist/agent/workspace-symbols.js +7 -15
  68. package/dist/agent/workspace-symbols.js.map +1 -1
  69. package/dist/analysis-summary.d.ts +1 -4
  70. package/dist/analysis-summary.d.ts.map +1 -1
  71. package/dist/analysis-summary.js +58 -19
  72. package/dist/analysis-summary.js.map +1 -1
  73. package/dist/bin/cli.js +41060 -27641
  74. package/dist/bin/query-index-worker.js +268 -241
  75. package/dist/bootstrap/tree-sitter-languages.d.ts +2 -0
  76. package/dist/bootstrap/tree-sitter-languages.d.ts.map +1 -1
  77. package/dist/bootstrap/tree-sitter-languages.js +6 -19
  78. package/dist/bootstrap/tree-sitter-languages.js.map +1 -1
  79. package/dist/chunking/chunk-matches.d.ts.map +1 -1
  80. package/dist/chunking/chunk-matches.js +6 -42
  81. package/dist/chunking/chunk-matches.js.map +1 -1
  82. package/dist/chunking/chunk-split.d.ts +7 -0
  83. package/dist/chunking/chunk-split.d.ts.map +1 -1
  84. package/dist/chunking/chunk-split.js +3 -3
  85. package/dist/chunking/chunk-split.js.map +1 -1
  86. package/dist/chunking/chunk-text-file.js +2 -30
  87. package/dist/chunking/chunk-text-file.js.map +1 -1
  88. package/dist/cli/affected.d.ts.map +1 -1
  89. package/dist/cli/affected.js +1 -9
  90. package/dist/cli/affected.js.map +1 -1
  91. package/dist/cli/call-hierarchy.js +3 -6
  92. package/dist/cli/call-hierarchy.js.map +1 -1
  93. package/dist/cli/chunk.d.ts.map +1 -1
  94. package/dist/cli/chunk.js +4 -11
  95. package/dist/cli/chunk.js.map +1 -1
  96. package/dist/cli/command-table.d.ts.map +1 -1
  97. package/dist/cli/command-table.js +7 -0
  98. package/dist/cli/command-table.js.map +1 -1
  99. package/dist/cli/context.d.ts +1 -0
  100. package/dist/cli/context.d.ts.map +1 -1
  101. package/dist/cli/context.js +1 -1
  102. package/dist/cli/context.js.map +1 -1
  103. package/dist/cli/doctor.d.ts.map +1 -1
  104. package/dist/cli/doctor.js +1 -11
  105. package/dist/cli/doctor.js.map +1 -1
  106. package/dist/cli/duplicates.d.ts +5 -0
  107. package/dist/cli/duplicates.d.ts.map +1 -1
  108. package/dist/cli/duplicates.js +15 -2
  109. package/dist/cli/duplicates.js.map +1 -1
  110. package/dist/cli/graph.d.ts +4 -12
  111. package/dist/cli/graph.d.ts.map +1 -1
  112. package/dist/cli/graph.js +17 -8
  113. package/dist/cli/graph.js.map +1 -1
  114. package/dist/cli/help.d.ts +4 -4
  115. package/dist/cli/help.d.ts.map +1 -1
  116. package/dist/cli/help.js +17 -9
  117. package/dist/cli/help.js.map +1 -1
  118. package/dist/cli/index.d.ts +2 -12
  119. package/dist/cli/index.d.ts.map +1 -1
  120. package/dist/cli/index.js +2 -5
  121. package/dist/cli/index.js.map +1 -1
  122. package/dist/cli/links.d.ts.map +1 -1
  123. package/dist/cli/links.js +4 -10
  124. package/dist/cli/links.js.map +1 -1
  125. package/dist/cli/mcp.d.ts.map +1 -1
  126. package/dist/cli/mcp.js +5 -0
  127. package/dist/cli/mcp.js.map +1 -1
  128. package/dist/cli/module-locals.d.ts +8 -0
  129. package/dist/cli/module-locals.d.ts.map +1 -0
  130. package/dist/cli/module-locals.js +9 -0
  131. package/dist/cli/module-locals.js.map +1 -0
  132. package/dist/cli/navigation.d.ts +2 -0
  133. package/dist/cli/navigation.d.ts.map +1 -1
  134. package/dist/cli/navigation.js +3 -5
  135. package/dist/cli/navigation.js.map +1 -1
  136. package/dist/cli/options.d.ts.map +1 -1
  137. package/dist/cli/options.js +6 -1
  138. package/dist/cli/options.js.map +1 -1
  139. package/dist/cli/pretty.d.ts +1 -0
  140. package/dist/cli/pretty.d.ts.map +1 -1
  141. package/dist/cli/pretty.js +6 -8
  142. package/dist/cli/pretty.js.map +1 -1
  143. package/dist/cli/progress.d.ts.map +1 -1
  144. package/dist/cli/progress.js +42 -16
  145. package/dist/cli/progress.js.map +1 -1
  146. package/dist/cli/refactor-plan.js +2 -5
  147. package/dist/cli/refactor-plan.js.map +1 -1
  148. package/dist/cli/rename-preview.js +2 -5
  149. package/dist/cli/rename-preview.js.map +1 -1
  150. package/dist/cli/review.d.ts +6 -16
  151. package/dist/cli/review.d.ts.map +1 -1
  152. package/dist/cli/review.js +2 -0
  153. package/dist/cli/review.js.map +1 -1
  154. package/dist/cli/server.d.ts.map +1 -1
  155. package/dist/cli/server.js +9 -10
  156. package/dist/cli/server.js.map +1 -1
  157. package/dist/cli/type-hierarchy.js +8 -8
  158. package/dist/cli/type-hierarchy.js.map +1 -1
  159. package/dist/cli/viewer.js +1 -1
  160. package/dist/cli/viewer.js.map +1 -1
  161. package/dist/document-links/asciidoc.d.ts.map +1 -1
  162. package/dist/document-links/asciidoc.js +4 -16
  163. package/dist/document-links/asciidoc.js.map +1 -1
  164. package/dist/document-links/check.d.ts.map +1 -1
  165. package/dist/document-links/check.js +1 -3
  166. package/dist/document-links/check.js.map +1 -1
  167. package/dist/document-links/html.d.ts.map +1 -1
  168. package/dist/document-links/html.js +6 -44
  169. package/dist/document-links/html.js.map +1 -1
  170. package/dist/document-links/markdown.d.ts.map +1 -1
  171. package/dist/document-links/markdown.js +4 -13
  172. package/dist/document-links/markdown.js.map +1 -1
  173. package/dist/document-links/rst.d.ts.map +1 -1
  174. package/dist/document-links/rst.js +7 -31
  175. package/dist/document-links/rst.js.map +1 -1
  176. package/dist/document-links/sfc.d.ts.map +1 -1
  177. package/dist/document-links/sfc.js +2 -5
  178. package/dist/document-links/sfc.js.map +1 -1
  179. package/dist/document-links/shared.d.ts +2 -0
  180. package/dist/document-links/shared.d.ts.map +1 -1
  181. package/dist/document-links/shared.js +13 -0
  182. package/dist/document-links/shared.js.map +1 -1
  183. package/dist/drift/artifact.d.ts.map +1 -1
  184. package/dist/drift/artifact.js +4 -27
  185. package/dist/drift/artifact.js.map +1 -1
  186. package/dist/drift/git.d.ts.map +1 -1
  187. package/dist/drift/git.js +10 -2
  188. package/dist/drift/git.js.map +1 -1
  189. package/dist/drift/graph-edges.d.ts +4 -0
  190. package/dist/drift/graph-edges.d.ts.map +1 -0
  191. package/dist/drift/graph-edges.js +15 -0
  192. package/dist/drift/graph-edges.js.map +1 -0
  193. package/dist/drift/snapshot.d.ts.map +1 -1
  194. package/dist/drift/snapshot.js +2 -17
  195. package/dist/drift/snapshot.js.map +1 -1
  196. package/dist/duplicates/candidates.d.ts +61 -0
  197. package/dist/duplicates/candidates.d.ts.map +1 -0
  198. package/dist/duplicates/candidates.js +873 -0
  199. package/dist/duplicates/candidates.js.map +1 -0
  200. package/dist/duplicates/progress.d.ts +17 -0
  201. package/dist/duplicates/progress.d.ts.map +1 -0
  202. package/dist/duplicates/progress.js +57 -0
  203. package/dist/duplicates/progress.js.map +1 -0
  204. package/dist/duplicates/scoring.d.ts +9 -40
  205. package/dist/duplicates/scoring.d.ts.map +1 -1
  206. package/dist/duplicates/scoring.js +34 -414
  207. package/dist/duplicates/scoring.js.map +1 -1
  208. package/dist/duplicates/types.d.ts +30 -1
  209. package/dist/duplicates/types.d.ts.map +1 -1
  210. package/dist/duplicates/unit-cache.d.ts +11 -1
  211. package/dist/duplicates/unit-cache.d.ts.map +1 -1
  212. package/dist/duplicates/unit-cache.js +20 -2
  213. package/dist/duplicates/unit-cache.js.map +1 -1
  214. package/dist/duplicates/units.d.ts +4 -2
  215. package/dist/duplicates/units.d.ts.map +1 -1
  216. package/dist/duplicates/units.js +47 -25
  217. package/dist/duplicates/units.js.map +1 -1
  218. package/dist/duplicates.d.ts +1 -0
  219. package/dist/duplicates.d.ts.map +1 -1
  220. package/dist/duplicates.js +116 -62
  221. package/dist/duplicates.js.map +1 -1
  222. package/dist/graph-builder.d.ts +1 -1
  223. package/dist/graph-builder.d.ts.map +1 -1
  224. package/dist/graph-builder.js +3 -2
  225. package/dist/graph-builder.js.map +1 -1
  226. package/dist/graph-edge-collector.d.ts +3 -1
  227. package/dist/graph-edge-collector.d.ts.map +1 -1
  228. package/dist/graph-edge-collector.js +38 -6
  229. package/dist/graph-edge-collector.js.map +1 -1
  230. package/dist/graphs/angularjs.d.ts.map +1 -1
  231. package/dist/graphs/angularjs.js +2 -9
  232. package/dist/graphs/angularjs.js.map +1 -1
  233. package/dist/graphs/edge-resolution.d.ts +4 -0
  234. package/dist/graphs/edge-resolution.d.ts.map +1 -1
  235. package/dist/graphs/edge-resolution.js +2 -0
  236. package/dist/graphs/edge-resolution.js.map +1 -1
  237. package/dist/graphs/external/manifests.d.ts.map +1 -1
  238. package/dist/graphs/external/manifests.js +1 -6
  239. package/dist/graphs/external/manifests.js.map +1 -1
  240. package/dist/graphs/specifiers.d.ts.map +1 -1
  241. package/dist/graphs/specifiers.js +47 -26
  242. package/dist/graphs/specifiers.js.map +1 -1
  243. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +2 -0
  244. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
  245. package/dist/graphs/symbol-graph-detailed/edge-passes.js +9 -3
  246. package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
  247. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +3 -3
  248. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
  249. package/dist/graphs/symbol-graph-detailed/receiver-calls.js +2 -26
  250. package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
  251. package/dist/graphs/symbol-graph-detailed.d.ts.map +1 -1
  252. package/dist/graphs/symbol-graph-detailed.js +38 -1
  253. package/dist/graphs/symbol-graph-detailed.js.map +1 -1
  254. package/dist/impact/analyzer.d.ts.map +1 -1
  255. package/dist/impact/analyzer.js +23 -17
  256. package/dist/impact/analyzer.js.map +1 -1
  257. package/dist/impact/budgets.d.ts.map +1 -1
  258. package/dist/impact/budgets.js +3 -9
  259. package/dist/impact/budgets.js.map +1 -1
  260. package/dist/impact/call-compatibility.d.ts.map +1 -1
  261. package/dist/impact/call-compatibility.js +3 -12
  262. package/dist/impact/call-compatibility.js.map +1 -1
  263. package/dist/impact/context.d.ts +6 -0
  264. package/dist/impact/context.d.ts.map +1 -1
  265. package/dist/impact/context.js +2 -2
  266. package/dist/impact/context.js.map +1 -1
  267. package/dist/impact/direct.d.ts.map +1 -1
  268. package/dist/impact/direct.js +2 -6
  269. package/dist/impact/direct.js.map +1 -1
  270. package/dist/impact/map.d.ts +3 -1
  271. package/dist/impact/map.d.ts.map +1 -1
  272. package/dist/impact/map.js +12 -5
  273. package/dist/impact/map.js.map +1 -1
  274. package/dist/impact/providers/base.js +1 -1
  275. package/dist/impact/providers/base.js.map +1 -1
  276. package/dist/impact/reference-cache.d.ts.map +1 -1
  277. package/dist/impact/reference-cache.js +1 -24
  278. package/dist/impact/reference-cache.js.map +1 -1
  279. package/dist/impact/report-shared.d.ts +2 -1
  280. package/dist/impact/report-shared.d.ts.map +1 -1
  281. package/dist/impact/report-shared.js +10 -0
  282. package/dist/impact/report-shared.js.map +1 -1
  283. package/dist/impact/report-suggestions.d.ts.map +1 -1
  284. package/dist/impact/report-suggestions.js +2 -8
  285. package/dist/impact/report-suggestions.js.map +1 -1
  286. package/dist/impact/report.d.ts.map +1 -1
  287. package/dist/impact/report.js +2 -8
  288. package/dist/impact/report.js.map +1 -1
  289. package/dist/impact/streaming.d.ts.map +1 -1
  290. package/dist/impact/streaming.js +3 -8
  291. package/dist/impact/streaming.js.map +1 -1
  292. package/dist/indexer/build-cache/manifest.d.ts.map +1 -1
  293. package/dist/indexer/build-cache/manifest.js +10 -108
  294. package/dist/indexer/build-cache/manifest.js.map +1 -1
  295. package/dist/indexer/build-cache/module-cache.d.ts +6 -1
  296. package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
  297. package/dist/indexer/build-cache/module-cache.js +25 -2
  298. package/dist/indexer/build-cache/module-cache.js.map +1 -1
  299. package/dist/indexer/build-cache/options.d.ts +38 -1
  300. package/dist/indexer/build-cache/options.d.ts.map +1 -1
  301. package/dist/indexer/build-cache/options.js +38 -1
  302. package/dist/indexer/build-cache/options.js.map +1 -1
  303. package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
  304. package/dist/indexer/build-cache/project-snapshot.js +48 -99
  305. package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
  306. package/dist/indexer/build-cache/reports.d.ts +1 -0
  307. package/dist/indexer/build-cache/reports.d.ts.map +1 -1
  308. package/dist/indexer/build-cache/reports.js +10 -0
  309. package/dist/indexer/build-cache/reports.js.map +1 -1
  310. package/dist/indexer/build-index.d.ts +2 -0
  311. package/dist/indexer/build-index.d.ts.map +1 -1
  312. package/dist/indexer/build-index.js +187 -57
  313. package/dist/indexer/build-index.js.map +1 -1
  314. package/dist/indexer/build-workers.d.ts +7 -1
  315. package/dist/indexer/build-workers.d.ts.map +1 -1
  316. package/dist/indexer/build-workers.js +12 -0
  317. package/dist/indexer/build-workers.js.map +1 -1
  318. package/dist/indexer/call-hierarchy.d.ts.map +1 -1
  319. package/dist/indexer/call-hierarchy.js +5 -17
  320. package/dist/indexer/call-hierarchy.js.map +1 -1
  321. package/dist/indexer/compilation-units.d.ts +32 -20
  322. package/dist/indexer/compilation-units.d.ts.map +1 -1
  323. package/dist/indexer/compilation-units.js +139 -145
  324. package/dist/indexer/compilation-units.js.map +1 -1
  325. package/dist/indexer/cpp-callables.d.ts.map +1 -1
  326. package/dist/indexer/cpp-callables.js +2 -7
  327. package/dist/indexer/cpp-callables.js.map +1 -1
  328. package/dist/indexer/import-types.d.ts +5 -0
  329. package/dist/indexer/import-types.d.ts.map +1 -1
  330. package/dist/indexer/import-types.js.map +1 -1
  331. package/dist/indexer/imports/binding-ranges.d.ts +5 -12
  332. package/dist/indexer/imports/binding-ranges.d.ts.map +1 -1
  333. package/dist/indexer/imports/binding-ranges.js +13 -19
  334. package/dist/indexer/imports/binding-ranges.js.map +1 -1
  335. package/dist/indexer/imports/context.d.ts +6 -0
  336. package/dist/indexer/imports/context.d.ts.map +1 -1
  337. package/dist/indexer/imports/import-binding-tables.d.ts +28 -13
  338. package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
  339. package/dist/indexer/imports/import-binding-tables.js +179 -178
  340. package/dist/indexer/imports/import-binding-tables.js.map +1 -1
  341. package/dist/indexer/imports/js-text-imports.d.ts +0 -1
  342. package/dist/indexer/imports/js-text-imports.d.ts.map +1 -1
  343. package/dist/indexer/imports/js-text-imports.js +0 -176
  344. package/dist/indexer/imports/js-text-imports.js.map +1 -1
  345. package/dist/indexer/imports/language-specific.d.ts.map +1 -1
  346. package/dist/indexer/imports/language-specific.js +4 -8
  347. package/dist/indexer/imports/language-specific.js.map +1 -1
  348. package/dist/indexer/imports/python.d.ts +0 -1
  349. package/dist/indexer/imports/python.d.ts.map +1 -1
  350. package/dist/indexer/imports/python.js +1 -29
  351. package/dist/indexer/imports/python.js.map +1 -1
  352. package/dist/indexer/imports/text-import-extractors.d.ts +2 -9
  353. package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
  354. package/dist/indexer/imports/text-import-extractors.js +0 -284
  355. package/dist/indexer/imports/text-import-extractors.js.map +1 -1
  356. package/dist/indexer/imports.d.ts +15 -0
  357. package/dist/indexer/imports.d.ts.map +1 -1
  358. package/dist/indexer/imports.js +82 -44
  359. package/dist/indexer/imports.js.map +1 -1
  360. package/dist/indexer/incremental-plan.d.ts +0 -1
  361. package/dist/indexer/incremental-plan.d.ts.map +1 -1
  362. package/dist/indexer/incremental-plan.js +6 -12
  363. package/dist/indexer/incremental-plan.js.map +1 -1
  364. package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -1
  365. package/dist/indexer/name-lookup-policies/implicit-self.js +25 -4
  366. package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -1
  367. package/dist/indexer/name-resolution-types.d.ts +5 -0
  368. package/dist/indexer/name-resolution-types.d.ts.map +1 -1
  369. package/dist/indexer/name-resolution.d.ts.map +1 -1
  370. package/dist/indexer/name-resolution.js +2 -0
  371. package/dist/indexer/name-resolution.js.map +1 -1
  372. package/dist/indexer/navigation-cpp.d.ts.map +1 -1
  373. package/dist/indexer/navigation-cpp.js +3 -5
  374. package/dist/indexer/navigation-cpp.js.map +1 -1
  375. package/dist/indexer/navigation-goto.d.ts +49 -3
  376. package/dist/indexer/navigation-goto.d.ts.map +1 -1
  377. package/dist/indexer/navigation-goto.js +500 -106
  378. package/dist/indexer/navigation-goto.js.map +1 -1
  379. package/dist/indexer/navigation-local.d.ts +7 -0
  380. package/dist/indexer/navigation-local.d.ts.map +1 -1
  381. package/dist/indexer/navigation-local.js +22 -2
  382. package/dist/indexer/navigation-local.js.map +1 -1
  383. package/dist/indexer/navigation-php.d.ts +0 -1
  384. package/dist/indexer/navigation-php.d.ts.map +1 -1
  385. package/dist/indexer/navigation-php.js +1 -7
  386. package/dist/indexer/navigation-php.js.map +1 -1
  387. package/dist/indexer/navigation-references.d.ts +1 -0
  388. package/dist/indexer/navigation-references.d.ts.map +1 -1
  389. package/dist/indexer/navigation-references.js +134 -23
  390. package/dist/indexer/navigation-references.js.map +1 -1
  391. package/dist/indexer/navigation-resolve.d.ts +22 -0
  392. package/dist/indexer/navigation-resolve.d.ts.map +1 -1
  393. package/dist/indexer/navigation-resolve.js +73 -8
  394. package/dist/indexer/navigation-resolve.js.map +1 -1
  395. package/dist/indexer/navigation.d.ts +4 -1
  396. package/dist/indexer/navigation.d.ts.map +1 -1
  397. package/dist/indexer/navigation.js +398 -95
  398. package/dist/indexer/navigation.js.map +1 -1
  399. package/dist/indexer/python-property-decorator.d.ts +11 -0
  400. package/dist/indexer/python-property-decorator.d.ts.map +1 -0
  401. package/dist/indexer/python-property-decorator.js +30 -0
  402. package/dist/indexer/python-property-decorator.js.map +1 -0
  403. package/dist/indexer/shared-owner-identity.d.ts +3 -1
  404. package/dist/indexer/shared-owner-identity.d.ts.map +1 -1
  405. package/dist/indexer/shared-owner-identity.js +40 -12
  406. package/dist/indexer/shared-owner-identity.js.map +1 -1
  407. package/dist/indexer/shared.d.ts +10 -0
  408. package/dist/indexer/shared.d.ts.map +1 -1
  409. package/dist/indexer/shared.js +8 -0
  410. package/dist/indexer/shared.js.map +1 -1
  411. package/dist/indexer/star-import-precedence.d.ts +5 -1
  412. package/dist/indexer/star-import-precedence.d.ts.map +1 -1
  413. package/dist/indexer/star-import-precedence.js +12 -19
  414. package/dist/indexer/star-import-precedence.js.map +1 -1
  415. package/dist/indexer/type-hierarchy.d.ts.map +1 -1
  416. package/dist/indexer/type-hierarchy.js +8 -9
  417. package/dist/indexer/type-hierarchy.js.map +1 -1
  418. package/dist/indexer/types.d.ts +49 -1
  419. package/dist/indexer/types.d.ts.map +1 -1
  420. package/dist/indexer/types.js.map +1 -1
  421. package/dist/indexer/workspace-symbols.d.ts.map +1 -1
  422. package/dist/indexer/workspace-symbols.js +3 -13
  423. package/dist/indexer/workspace-symbols.js.map +1 -1
  424. package/dist/installer/locks.d.ts +1 -0
  425. package/dist/installer/locks.d.ts.map +1 -1
  426. package/dist/installer/locks.js +4 -8
  427. package/dist/installer/locks.js.map +1 -1
  428. package/dist/installer/registry.d.ts.map +1 -1
  429. package/dist/installer/registry.js +9 -15
  430. package/dist/installer/registry.js.map +1 -1
  431. package/dist/languages/callable-arity.d.ts.map +1 -1
  432. package/dist/languages/callable-arity.js +1 -38
  433. package/dist/languages/callable-arity.js.map +1 -1
  434. package/dist/languages/definitions/csharp.d.ts.map +1 -1
  435. package/dist/languages/definitions/csharp.js +5 -13
  436. package/dist/languages/definitions/csharp.js.map +1 -1
  437. package/dist/languages/definitions/java.d.ts.map +1 -1
  438. package/dist/languages/definitions/java.js +4 -13
  439. package/dist/languages/definitions/java.js.map +1 -1
  440. package/dist/languages/definitions/kotlin.d.ts.map +1 -1
  441. package/dist/languages/definitions/kotlin.js +4 -8
  442. package/dist/languages/definitions/kotlin.js.map +1 -1
  443. package/dist/languages/definitions/python.d.ts.map +1 -1
  444. package/dist/languages/definitions/python.js +5 -3
  445. package/dist/languages/definitions/python.js.map +1 -1
  446. package/dist/languages/import-statement-parsers.d.ts +0 -30
  447. package/dist/languages/import-statement-parsers.d.ts.map +1 -1
  448. package/dist/languages/import-statement-parsers.js +1 -81
  449. package/dist/languages/import-statement-parsers.js.map +1 -1
  450. package/dist/languages/sfc.d.ts.map +1 -1
  451. package/dist/languages/sfc.js +8 -43
  452. package/dist/languages/sfc.js.map +1 -1
  453. package/dist/lifecycle/manifest.d.ts.map +1 -1
  454. package/dist/lifecycle/manifest.js +11 -29
  455. package/dist/lifecycle/manifest.js.map +1 -1
  456. package/dist/mcp/cancellation.d.ts +6 -0
  457. package/dist/mcp/cancellation.d.ts.map +1 -0
  458. package/dist/mcp/cancellation.js +11 -0
  459. package/dist/mcp/cancellation.js.map +1 -0
  460. package/dist/mcp/handlers.d.ts +54 -3
  461. package/dist/mcp/handlers.d.ts.map +1 -1
  462. package/dist/mcp/handlers.js +186 -42
  463. package/dist/mcp/handlers.js.map +1 -1
  464. package/dist/mcp/http-transport.d.ts.map +1 -1
  465. package/dist/mcp/http-transport.js +9 -2
  466. package/dist/mcp/http-transport.js.map +1 -1
  467. package/dist/mcp/index-readiness.d.ts +114 -0
  468. package/dist/mcp/index-readiness.d.ts.map +1 -0
  469. package/dist/mcp/index-readiness.js +264 -0
  470. package/dist/mcp/index-readiness.js.map +1 -0
  471. package/dist/mcp/project-watcher.d.ts +125 -0
  472. package/dist/mcp/project-watcher.d.ts.map +1 -0
  473. package/dist/mcp/project-watcher.js +643 -0
  474. package/dist/mcp/project-watcher.js.map +1 -0
  475. package/dist/mcp/protocol.d.ts.map +1 -1
  476. package/dist/mcp/protocol.js +23 -10
  477. package/dist/mcp/protocol.js.map +1 -1
  478. package/dist/mcp/server.d.ts +2 -0
  479. package/dist/mcp/server.d.ts.map +1 -1
  480. package/dist/mcp/server.js +11 -2
  481. package/dist/mcp/server.js.map +1 -1
  482. package/dist/mcp/stale-install.d.ts +13 -0
  483. package/dist/mcp/stale-install.d.ts.map +1 -0
  484. package/dist/mcp/stale-install.js +30 -0
  485. package/dist/mcp/stale-install.js.map +1 -0
  486. package/dist/native/byte-index.d.ts +1 -0
  487. package/dist/native/byte-index.d.ts.map +1 -1
  488. package/dist/native/byte-index.js +1 -1
  489. package/dist/native/byte-index.js.map +1 -1
  490. package/dist/native/contracts.d.ts +1 -0
  491. package/dist/native/contracts.d.ts.map +1 -1
  492. package/dist/native/native-backend-report.d.ts +2 -1
  493. package/dist/native/native-backend-report.d.ts.map +1 -1
  494. package/dist/native/native-backend-report.js +23 -0
  495. package/dist/native/native-backend-report.js.map +1 -1
  496. package/dist/native/tree-shape.d.ts +5 -7
  497. package/dist/native/tree-shape.d.ts.map +1 -1
  498. package/dist/native/tree-shape.js +11 -10
  499. package/dist/native/tree-shape.js.map +1 -1
  500. package/dist/presentation/bounds.d.ts +2 -0
  501. package/dist/presentation/bounds.d.ts.map +1 -1
  502. package/dist/presentation/bounds.js +8 -0
  503. package/dist/presentation/bounds.js.map +1 -1
  504. package/dist/review/candidates.d.ts.map +1 -1
  505. package/dist/review/candidates.js +4 -25
  506. package/dist/review/candidates.js.map +1 -1
  507. package/dist/review/deleted.js +1 -1
  508. package/dist/review/deleted.js.map +1 -1
  509. package/dist/review/report.d.ts.map +1 -1
  510. package/dist/review/report.js +4 -2
  511. package/dist/review/report.js.map +1 -1
  512. package/dist/review/summaries.d.ts.map +1 -1
  513. package/dist/review/summaries.js +14 -35
  514. package/dist/review/summaries.js.map +1 -1
  515. package/dist/review.d.ts +6 -0
  516. package/dist/review.d.ts.map +1 -1
  517. package/dist/review.js +5 -6
  518. package/dist/review.js.map +1 -1
  519. package/dist/scss/navigation.d.ts +13 -0
  520. package/dist/scss/navigation.d.ts.map +1 -0
  521. package/dist/scss/navigation.js +150 -0
  522. package/dist/scss/navigation.js.map +1 -0
  523. package/dist/scss/resolution.d.ts +190 -0
  524. package/dist/scss/resolution.d.ts.map +1 -0
  525. package/dist/scss/resolution.js +1802 -0
  526. package/dist/scss/resolution.js.map +1 -0
  527. package/dist/scss/syntax.d.ts +181 -0
  528. package/dist/scss/syntax.d.ts.map +1 -0
  529. package/dist/scss/syntax.js +1436 -0
  530. package/dist/scss/syntax.js.map +1 -0
  531. package/dist/sql/classify-sql-file.d.ts +7 -0
  532. package/dist/sql/classify-sql-file.d.ts.map +1 -1
  533. package/dist/sql/classify-sql-file.js +9 -0
  534. package/dist/sql/classify-sql-file.js.map +1 -1
  535. package/dist/sql/extract-facts.d.ts.map +1 -1
  536. package/dist/sql/extract-facts.js +517 -77
  537. package/dist/sql/extract-facts.js.map +1 -1
  538. package/dist/sql/lex.d.ts +100 -1
  539. package/dist/sql/lex.d.ts.map +1 -1
  540. package/dist/sql/lex.js +473 -11
  541. package/dist/sql/lex.js.map +1 -1
  542. package/dist/sql/lookup.d.ts +17 -0
  543. package/dist/sql/lookup.d.ts.map +1 -1
  544. package/dist/sql/lookup.js +21 -0
  545. package/dist/sql/lookup.js.map +1 -1
  546. package/dist/sql/navigation.d.ts +28 -1
  547. package/dist/sql/navigation.d.ts.map +1 -1
  548. package/dist/sql/navigation.js +474 -84
  549. package/dist/sql/navigation.js.map +1 -1
  550. package/dist/sql/object-mentions.d.ts +24 -0
  551. package/dist/sql/object-mentions.d.ts.map +1 -0
  552. package/dist/sql/object-mentions.js +233 -0
  553. package/dist/sql/object-mentions.js.map +1 -0
  554. package/dist/sql/review.d.ts +3 -0
  555. package/dist/sql/review.d.ts.map +1 -1
  556. package/dist/sql/review.js +15 -14
  557. package/dist/sql/review.js.map +1 -1
  558. package/dist/sql/routine-mentions.d.ts +61 -0
  559. package/dist/sql/routine-mentions.d.ts.map +1 -0
  560. package/dist/sql/routine-mentions.js +868 -0
  561. package/dist/sql/routine-mentions.js.map +1 -0
  562. package/dist/sql/source-graph.d.ts +18 -3
  563. package/dist/sql/source-graph.d.ts.map +1 -1
  564. package/dist/sql/source-graph.js +109 -32
  565. package/dist/sql/source-graph.js.map +1 -1
  566. package/dist/sqlite/raw-query-worker-pool.d.ts.map +1 -1
  567. package/dist/sqlite/raw-query-worker-pool.js +2 -0
  568. package/dist/sqlite/raw-query-worker-pool.js.map +1 -1
  569. package/dist/sqlite/types.d.ts +6 -5
  570. package/dist/sqlite/types.d.ts.map +1 -1
  571. package/dist/sqlite/write.d.ts.map +1 -1
  572. package/dist/sqlite/write.js.map +1 -1
  573. package/dist/sqlite-driver.d.ts +0 -1
  574. package/dist/sqlite-driver.d.ts.map +1 -1
  575. package/dist/sqlite-driver.js +0 -11
  576. package/dist/sqlite-driver.js.map +1 -1
  577. package/dist/terraform/navigation.d.ts.map +1 -1
  578. package/dist/terraform/navigation.js +1 -3
  579. package/dist/terraform/navigation.js.map +1 -1
  580. package/dist/terraform/syntax.d.ts.map +1 -1
  581. package/dist/terraform/syntax.js +1 -4
  582. package/dist/terraform/syntax.js.map +1 -1
  583. package/dist/types.d.ts +2 -0
  584. package/dist/types.d.ts.map +1 -1
  585. package/dist/util/ast.d.ts +5 -0
  586. package/dist/util/ast.d.ts.map +1 -1
  587. package/dist/util/ast.js +10 -0
  588. package/dist/util/ast.js.map +1 -1
  589. package/dist/util/atomic-file.d.ts +22 -0
  590. package/dist/util/atomic-file.d.ts.map +1 -0
  591. package/dist/util/atomic-file.js +106 -0
  592. package/dist/util/atomic-file.js.map +1 -0
  593. package/dist/util/collections.d.ts +5 -0
  594. package/dist/util/collections.d.ts.map +1 -1
  595. package/dist/util/collections.js +26 -0
  596. package/dist/util/collections.js.map +1 -1
  597. package/dist/util/concurrency.d.ts +8 -0
  598. package/dist/util/concurrency.d.ts.map +1 -1
  599. package/dist/util/concurrency.js +16 -0
  600. package/dist/util/concurrency.js.map +1 -1
  601. package/dist/util/confined-file.d.ts.map +1 -1
  602. package/dist/util/confined-file.js +1 -3
  603. package/dist/util/confined-file.js.map +1 -1
  604. package/dist/util/csharp-tree.d.ts +65 -0
  605. package/dist/util/csharp-tree.d.ts.map +1 -0
  606. package/dist/util/csharp-tree.js +266 -0
  607. package/dist/util/csharp-tree.js.map +1 -0
  608. package/dist/util/errors.d.ts +1 -0
  609. package/dist/util/errors.d.ts.map +1 -1
  610. package/dist/util/errors.js +3 -0
  611. package/dist/util/errors.js.map +1 -1
  612. package/dist/util/graph-edges.d.ts +2 -0
  613. package/dist/util/graph-edges.d.ts.map +1 -1
  614. package/dist/util/graph-edges.js +11 -0
  615. package/dist/util/graph-edges.js.map +1 -1
  616. package/dist/util/guards.d.ts +1 -0
  617. package/dist/util/guards.d.ts.map +1 -1
  618. package/dist/util/guards.js +6 -0
  619. package/dist/util/guards.js.map +1 -1
  620. package/dist/util/identifiers.d.ts +0 -24
  621. package/dist/util/identifiers.d.ts.map +1 -1
  622. package/dist/util/identifiers.js +0 -24
  623. package/dist/util/identifiers.js.map +1 -1
  624. package/dist/util/jvm-tree.d.ts +58 -0
  625. package/dist/util/jvm-tree.d.ts.map +1 -0
  626. package/dist/util/jvm-tree.js +153 -0
  627. package/dist/util/jvm-tree.js.map +1 -0
  628. package/dist/util/package-exports.d.ts +0 -22
  629. package/dist/util/package-exports.d.ts.map +1 -1
  630. package/dist/util/package-exports.js +25 -5
  631. package/dist/util/package-exports.js.map +1 -1
  632. package/dist/util/paths.d.ts +1 -0
  633. package/dist/util/paths.d.ts.map +1 -1
  634. package/dist/util/paths.js +10 -4
  635. package/dist/util/paths.js.map +1 -1
  636. package/dist/util/resolution/csharp.d.ts +20 -8
  637. package/dist/util/resolution/csharp.d.ts.map +1 -1
  638. package/dist/util/resolution/csharp.js +126 -127
  639. package/dist/util/resolution/csharp.js.map +1 -1
  640. package/dist/util/resolution/files.d.ts +6 -0
  641. package/dist/util/resolution/files.d.ts.map +1 -1
  642. package/dist/util/resolution/files.js +74 -21
  643. package/dist/util/resolution/files.js.map +1 -1
  644. package/dist/util/resolution/jvm.d.ts +21 -1
  645. package/dist/util/resolution/jvm.d.ts.map +1 -1
  646. package/dist/util/resolution/jvm.js +168 -100
  647. package/dist/util/resolution/jvm.js.map +1 -1
  648. package/dist/util/resolution/project-symbols.d.ts +1 -1
  649. package/dist/util/resolution/project-symbols.d.ts.map +1 -1
  650. package/dist/util/resolution/project-symbols.js.map +1 -1
  651. package/dist/util/resolution/specifier-targets.d.ts +4 -0
  652. package/dist/util/resolution/specifier-targets.d.ts.map +1 -1
  653. package/dist/util/resolution/specifier-targets.js +11 -3
  654. package/dist/util/resolution/specifier-targets.js.map +1 -1
  655. package/dist/util/resolution.d.ts.map +1 -1
  656. package/dist/util/resolution.js +21 -7
  657. package/dist/util/resolution.js.map +1 -1
  658. package/dist/util/syntax-tree.d.ts +16 -0
  659. package/dist/util/syntax-tree.d.ts.map +1 -0
  660. package/dist/util/syntax-tree.js +34 -0
  661. package/dist/util/syntax-tree.js.map +1 -0
  662. package/dist/util/text-scanning.d.ts +6 -0
  663. package/dist/util/text-scanning.d.ts.map +1 -0
  664. package/dist/util/text-scanning.js +35 -0
  665. package/dist/util/text-scanning.js.map +1 -0
  666. package/dist/util/trivia-tables.d.ts +13 -8
  667. package/dist/util/trivia-tables.d.ts.map +1 -1
  668. package/dist/util/trivia-tables.js +13 -72
  669. package/dist/util/trivia-tables.js.map +1 -1
  670. package/dist/util/trivia.d.ts +10 -3
  671. package/dist/util/trivia.d.ts.map +1 -1
  672. package/dist/util/trivia.js +209 -79
  673. package/dist/util/trivia.js.map +1 -1
  674. package/dist/util/windows-process-drain.d.ts.map +1 -1
  675. package/dist/util/windows-process-drain.js.map +1 -1
  676. package/dist/util/worker-threads.d.ts +16 -0
  677. package/dist/util/worker-threads.d.ts.map +1 -1
  678. package/dist/util/worker-threads.js +118 -0
  679. package/dist/util/worker-threads.js.map +1 -1
  680. package/dist/worker/native-worker-pool.d.ts.map +1 -1
  681. package/dist/worker/native-worker-pool.js +2 -1
  682. package/dist/worker/native-worker-pool.js.map +1 -1
  683. package/docs/mcp.md +82 -8
  684. package/package.json +7 -7
@@ -1,4 +1,7 @@
1
+ import path from "node:path";
1
2
  import { supportForFileWithoutHeaderSample } from "../languages.js";
3
+ import { isJsTsLanguage } from "../languages/js-family.js";
4
+ import { pythonPropertyDecorator } from "./python-property-decorator.js";
2
5
  import { ensureParsedContext } from "./parse-context.js";
3
6
  import { getCompilationUnitPeers, IMPLICIT_UNIT_LANGUAGES } from "./compilation-units.js";
4
7
  import { getReverseNeighbors, graphAdjacencyFor } from "../graphs/adjacency.js";
@@ -6,6 +9,7 @@ import { isGoExportedMemberName } from "./declaration-visibility.js";
6
9
  import { memberSyntaxNamesFreeFunction } from "../util/member-access-tables.js";
7
10
  import { phpObjectCreationKeyword } from "../graphs/symbol-graph-detailed/receiver-calls.js";
8
11
  import { findCsharpPartialTypeEquivalents, innermostNamespaceImport, resolveMemberAccessDefinition, resolvePhpObjectCreationTarget, resolveRubySuperDefinition, sharedOwnerMemberUnitComplete, supportsReceiverMemberNavigation, } from "./navigation-goto.js";
12
+ import { isPythonReceiverAttributeAssignmentName } from "../languages/definitions/python.js";
9
13
  import { findClosestBinding, findClosestScopeBinding, findDeclarationNameNode, getOrBuildScopeIndex, toModuleRef, } from "./navigation-local.js";
10
14
  import { typescriptCallableCandidatesInContainer } from "./ts-callables.js";
11
15
  import { isExplicitMethodCall, scopeNodesFor } from "./scope-nodes.js";
@@ -14,24 +18,28 @@ import { effectiveExplicitBinding, findRubyReopenedConstantParts, isExpandedStar
14
18
  import { createNavigationProvenance, okGoToResult } from "./navigation-provenance.js";
15
19
  import { getPhpQualifiedReference, inferPhpQualifiedReferenceImportType, isPhpCaseInsensitiveSymbolKind, normalizePhpQualifiedReference, phpLastIdentifierSegment, } from "./navigation-php.js";
16
20
  import { ensurePhpNamespaceSymbolIndex, phpReferenceRoleMatchesKind } from "./php-namespace-symbols.js";
17
- import { buildIndexedCandidateCoverage, buildPhpQualifiedNames, cppCanonicalStructuralExport, describeReferenceStrategies, collectVerifiedNamedNodeReferences, isMemberAccessPropertyRange, getCachedScope, exportFromIdentifier, getCachedReferenceCandidateFiles, getCandidateReferenceNames, hasExpandedNamedImport, pythonParentPackageNamespacePaths, importBindingDeclarationRangeKeys, importBindingIdentityVerificationSites, importBindingReferenceSites, rangeIdentityKey, referenceSiteKey, } from "./navigation-references.js";
18
- import { directModuleValueEntry, javaStaticNamedImportIncludes, resolveExport, resolveImported, resolveModuleExports, resolvePhpExportByImportType, } from "./navigation-resolve.js";
21
+ import { buildIndexedCandidateCoverage, buildPhpQualifiedNames, markNameEquivalenceGap, cppCanonicalStructuralExport, describeReferenceStrategies, collectVerifiedNamedNodeReferences, isMemberAccessPropertyRange, getCachedScope, exportFromIdentifier, getCachedReferenceCandidateFiles, getCandidateReferenceNames, hasExpandedNamedImport, pythonParentPackageNamespacePaths, importBindingDeclarationRangeKeys, importBindingIdentityVerificationSites, importBindingReferenceSites, rangeIdentityKey, referenceSiteKey, } from "./navigation-references.js";
22
+ import { directModuleValueEntry, csharpNamespaceImportDirectories, csharpShadowedImports, javaStaticNamedImportIncludes, resolveExport, resolveImported, resolveModuleExports, resolvePhpExportByImportType, } from "./navigation-resolve.js";
19
23
  import { extractEnclosingBlock, extractLineContext, rangeContains, sameDef } from "./reference-context.js";
20
24
  import { DEFAULT_REF_CONTEXT_LINES } from "./shared.js";
21
25
  import {} from "../types.js";
22
26
  import { loadNearestTsconfigFor, resolveImportSpecifier } from "../util/resolution.js";
23
- import { fileIdentityKey } from "../util/paths.js";
27
+ import { fileIdentityKey, normalizePath } from "../util/paths.js";
24
28
  import { sliceText, toRange } from "../util/ast.js";
25
29
  import { foldPhpIdentifierCase } from "../util/identifiers.js";
26
- import { getMemberAccessParts, isMemberAccessNode, isMemberObjectIdentifier, isMemberReferencePropertyIdentifier, isReceiverNameNode, } from "../util/member-access.js";
30
+ import { collectMemberAccessChain, getMemberAccessParts, isMemberAccessNode, isMemberObjectIdentifier, isMemberReferencePropertyIdentifier, isReceiverNameNode, } from "../util/member-access.js";
27
31
  import { cppOutOfLineOwnerPath, cppOutOfLineMemberName, cppOutOfLineMemberDeclarationNode, cppQualifiedNameSegments, } from "../graphs/symbol-graph-detailed/receiver-calls.js";
28
32
  import { cppEquivalentCallableBindings } from "./cpp-callables.js";
29
33
  import { resolveCppExportedCallables, resolveCppQualifiedMemberContainer } from "./navigation-cpp.js";
30
34
  import { SymbolKind, } from "./types.js";
31
- import { findSqlReferences, goToSqlDefinition } from "../sql/navigation.js";
35
+ import { findSqlReferences, goToSqlDefinition, sqlPositionIsProvenObjectOrRoutineMention } from "../sql/navigation.js";
36
+ import { findScssReferences, goToScssDefinition } from "../scss/navigation.js";
37
+ import { scssBlockLocalExistenceUnproven, scssFactsForFile, scssFlowLocalUnproven, scssLocalSpellingGap, scssMemberForDefinition, scssNearerEquivalentLocal, scssScopedCallableDynamicUnproven, scssScopedCallableReferences, } from "../scss/resolution.js";
32
38
  import { findTerraformReferences, goToTerraformDefinition } from "../terraform/navigation.js";
33
39
  import { createLoadingParsedFileProvider, fileBindingIsUnshadowed, phpImportTypeAtPosition, resolveBareName, settleNameResolution, withParsedFiles, } from "./name-resolution.js";
34
40
  import { resolveCppQualifiedName } from "./name-lookup-policies/c-family.js";
41
+ import { createUnionFind } from "../util/collections.js";
42
+ import { toTreeSitterPosition } from "./shared.js";
35
43
  export { resolveExport, resolveImported } from "./navigation-resolve.js";
36
44
  const CPP_MEMBER_CONTAINER_TYPES = new Set(["class_specifier", "struct_specifier", "union_specifier"]);
37
45
  const MAX_REFERENCE_NAMESPACE_DEPTH = 8;
@@ -47,6 +55,9 @@ export async function goToDefinition(index, req, parsedContext) {
47
55
  const terraformResult = await goToTerraformDefinition(index, req);
48
56
  if (terraformResult)
49
57
  return terraformResult;
58
+ const scssResult = await goToScssDefinition(index, req);
59
+ if (scssResult)
60
+ return scssResult;
50
61
  const context = parsedContext ??
51
62
  (await ensureParsedContext(file, index.parsed?.get(fileIdentityKey(file)), index.languageExtensions));
52
63
  const sup = context.sup;
@@ -54,10 +65,7 @@ export async function goToDefinition(index, req, parsedContext) {
54
65
  const tree = context.tree;
55
66
  if (sup.id === "php")
56
67
  await ensurePhpNamespaceSymbolIndex(index);
57
- const pos = {
58
- row: Math.max(0, line - 1),
59
- column: Math.max(0, column - 1),
60
- };
68
+ const pos = toTreeSitterPosition({ line, column });
61
69
  let node = tree.rootNode.descendantForPosition(pos, pos);
62
70
  // A position at the start of `b` in `a?.b` also touches the end of the `?.` token, which the
63
71
  // parser reports first. The use is the name that starts at the position.
@@ -366,22 +374,7 @@ export async function recoverIncludedCallableStar(index, mod, languageId, name,
366
374
  familyOf.set(key, defs);
367
375
  return defs;
368
376
  };
369
- const parent = functions.map((_, candidateIndex) => candidateIndex);
370
- const find = (start) => {
371
- let current = start;
372
- while (parent[current] !== current) {
373
- const next = parent[current];
374
- parent[current] = parent[next] ?? next;
375
- current = next;
376
- }
377
- return current;
378
- };
379
- const unite = (left, right) => {
380
- const leftRoot = find(left);
381
- const rightRoot = find(right);
382
- if (leftRoot !== rightRoot)
383
- parent[rightRoot] = leftRoot;
384
- };
377
+ const { find, unite } = createUnionFind(functions.length);
385
378
  for (let left = 0; left < functions.length; left += 1) {
386
379
  const defs = await family(functions[left].def);
387
380
  for (let right = left + 1; right < functions.length; right += 1) {
@@ -426,7 +419,7 @@ export async function getCppEquivalentCallableDefinitions(index, def, parsedCont
426
419
  return [family.definition, ...family.equivalents];
427
420
  }
428
421
  /** Adds the requested `line` or `block` context to each reference, parsing each file once. */
429
- async function attachReferenceContext(index, refs, opts) {
422
+ export async function attachReferenceContext(index, refs, opts) {
430
423
  if (!opts?.context)
431
424
  return;
432
425
  const perFileCache = new Map();
@@ -448,22 +441,67 @@ async function attachReferenceContext(index, refs, opts) {
448
441
  }
449
442
  }
450
443
  }
444
+ export async function canonicalizePythonReceiverAttributeDefinition(index, def, position = {
445
+ file: def.file,
446
+ line: def.range.start.line,
447
+ column: def.range.start.column,
448
+ }) {
449
+ if (supportForFileWithoutHeaderSample(position.file, index.languageExtensions)?.id !== "python")
450
+ return null;
451
+ const context = await ensureParsedContext(position.file, index.parsed?.get(fileIdentityKey(position.file)), index.languageExtensions);
452
+ if (context.sup.id !== "python")
453
+ return null;
454
+ const nodePosition = { row: position.line - 1, column: position.column - 1 };
455
+ const node = context.tree.rootNode.descendantForPosition(nodePosition, nodePosition);
456
+ if (!isPythonReceiverAttributeAssignmentName(node))
457
+ return null;
458
+ return await goToDefinition(index, position, context);
459
+ }
451
460
  async function findReferencesInternal(index, req, opts, collectionMode) {
452
461
  let def = null;
453
462
  let provenance;
454
463
  if ("def" in req) {
455
464
  def = req.def;
456
465
  provenance = createNavigationProvenance("exact", "high");
466
+ const canonical = await canonicalizePythonReceiverAttributeDefinition(index, def);
467
+ if (canonical?.status === "ok") {
468
+ def = canonical.definition;
469
+ provenance = canonical.provenance;
470
+ }
457
471
  }
458
472
  else {
459
473
  const module = index.byFile.get(fileIdentityKey(req.file));
474
+ // A SQL definition spans its whole statement, so a position inside it can name another object: the
475
+ // function a trigger runs, a call in a routine body, or a table a view reads. Resolve that name first.
476
+ const sqlTarget = module ? await goToSqlDefinition(index, req) : null;
460
477
  const localAtPosition = module?.locals.find((local) => rangeContains(local.range, {
461
478
  row: req.line,
462
479
  column: req.column,
463
480
  }));
464
- if (localAtPosition) {
481
+ // A column can share a table's name. Only a syntactically proven object or routine mention
482
+ // overrides the definition that encloses the position; a column stays on that definition.
483
+ const namesObject = sqlTarget && localAtPosition ? await sqlPositionIsProvenObjectOrRoutineMention(index, req) : false;
484
+ // A proven mention that no single definition owns, such as an overloaded callee, is unresolved.
485
+ // It is not a reference to the definition around it.
486
+ if (namesObject && sqlTarget?.status === "not_found")
487
+ return { status: "not_found", reason: sqlTarget.reason };
488
+ const sqlMention = sqlTarget?.status === "ok" && (!localAtPosition || namesObject);
489
+ if (sqlMention && sqlTarget?.status === "ok") {
490
+ def = sqlTarget.definition;
491
+ provenance = sqlTarget.provenance;
492
+ }
493
+ else if (localAtPosition) {
465
494
  def = localAtPosition;
466
495
  provenance = createNavigationProvenance("exact", "high");
496
+ const canonical = await canonicalizePythonReceiverAttributeDefinition(index, def, {
497
+ file: req.file,
498
+ line: req.line,
499
+ column: req.column,
500
+ });
501
+ if (canonical?.status === "ok") {
502
+ def = canonical.definition;
503
+ provenance = canonical.provenance;
504
+ }
467
505
  }
468
506
  else {
469
507
  const gotoResult = await goToDefinition(index, req);
@@ -489,7 +527,10 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
489
527
  }
490
528
  const maxReferences = typeof opts?.maxReferences === "number" && opts.maxReferences > 0 ? opts.maxReferences : undefined;
491
529
  const sqlReferences = await findSqlReferences(index, def, {
492
- includeDefinition: collectionMode === "all",
530
+ // A SQL definition spans its whole statement, so rename finds the declaration's name through here.
531
+ includeDefinition: collectionMode !== "usages",
532
+ // Rename edits the name in `public.f`, not the qualifier that comes with it.
533
+ renameRanges: collectionMode === "rename",
493
534
  ...(maxReferences === undefined ? {} : { maxReferences }),
494
535
  });
495
536
  if (sqlReferences)
@@ -503,8 +544,18 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
503
544
  await attachReferenceContext(index, terraformReferences.references, opts);
504
545
  return terraformReferences;
505
546
  }
547
+ const scssReferences = await findScssReferences(index, def, {
548
+ includeDefinition: collectionMode === "all",
549
+ ...(maxReferences === undefined ? {} : { maxReferences }),
550
+ });
551
+ if (scssReferences) {
552
+ if (scssReferences.status === "ok")
553
+ await attachReferenceContext(index, scssReferences.references, opts);
554
+ return scssReferences;
555
+ }
506
556
  const definitionFile = def.file;
507
557
  const definitionSiteKey = referenceSiteKey(definitionFile, def.range);
558
+ const explicitNamespaceMemberAliasFiles = new Set();
508
559
  const includeReference = (ref) => {
509
560
  if (collectionMode === "all")
510
561
  return true;
@@ -512,6 +563,10 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
512
563
  return false;
513
564
  if (collectionMode === "usages")
514
565
  return ref.via?.importBinding === undefined;
566
+ if (ref.via?.namespaceMember) {
567
+ const hasExplicitAlias = namespaceBindingHasExplicitAlias(ref.via.import);
568
+ return ref.via.namespaceMember === def.localName && !hasExplicitAlias;
569
+ }
515
570
  const binding = ref.via?.import;
516
571
  if (!binding || binding.kind === "star" || binding.kind === "namespace")
517
572
  return true;
@@ -583,6 +638,78 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
583
638
  }
584
639
  const matchesReferenceDefinition = (candidate) => sameDef(candidate, definition, index.languageExtensions) ||
585
640
  equivalentDefinitions.some((equivalent) => sameDef(candidate, equivalent, index.languageExtensions));
641
+ const hasExplicitExportAliasForDefinition = async (candidateModule) => {
642
+ const definitionExportNames = new Set();
643
+ for (const entry of candidateModule.exports) {
644
+ if (!("exportedAs" in entry))
645
+ continue;
646
+ const hit = resolveExport(index, candidateModule.file, entry.exportedAs, exportOptions);
647
+ if (hit?.kind === "resolved" && matchesReferenceDefinition(hit.def)) {
648
+ definitionExportNames.add(entry.exportedAs);
649
+ }
650
+ }
651
+ if (!definitionExportNames.size)
652
+ return false;
653
+ const parsedModule = await ensureParsedContext(candidateModule.file, index.parsed?.get(fileIdentityKey(candidateModule.file)), index.languageExtensions);
654
+ const pending = [parsedModule.tree.rootNode];
655
+ while (pending.length) {
656
+ const node = pending.pop();
657
+ const alias = node.type === "export_specifier" ? node.childForFieldName("alias") : undefined;
658
+ if (alias && definitionExportNames.has(alias.text))
659
+ return true;
660
+ pending.push(...node.namedChildren);
661
+ }
662
+ return false;
663
+ };
664
+ // Alias uncertainty only affects rename safety; reference and usage queries skip the scan.
665
+ for (const candidateModule of collectionMode === "rename" ? index.byFile.values() : []) {
666
+ if (await hasExplicitExportAliasForDefinition(candidateModule)) {
667
+ explicitNamespaceMemberAliasFiles.add(fileIdentityKey(candidateModule.file));
668
+ }
669
+ }
670
+ let namespaceExportAliasUncertainty = false;
671
+ const namespaceBindingHasExplicitAlias = (binding) => {
672
+ if (!binding)
673
+ return false;
674
+ const namespaceFiles = [];
675
+ if (binding.kind === "namespace" && typeof binding.resolved === "string") {
676
+ namespaceFiles.push(binding.resolved);
677
+ }
678
+ else if (binding.kind === "named" && typeof binding.resolved === "string") {
679
+ const target = resolveExport(index, binding.resolved, binding.imported);
680
+ if (target?.kind === "namespace")
681
+ namespaceFiles.push(target.file);
682
+ }
683
+ const visited = new Set();
684
+ const modulePathHasAlias = (file) => {
685
+ const fileKey = fileIdentityKey(file);
686
+ if (visited.has(fileKey))
687
+ return false;
688
+ visited.add(fileKey);
689
+ if (explicitNamespaceMemberAliasFiles.has(fileKey))
690
+ return true;
691
+ const targetModule = index.byFile.get(fileKey);
692
+ for (const entry of targetModule?.exports ?? []) {
693
+ // A star or namespace forward keeps an aliased export reachable under the forwarding module's own names.
694
+ if ((entry.type === "namespaceReexport" || entry.type === "exportStar") &&
695
+ modulePathHasAlias(entry.fromModule)) {
696
+ return true;
697
+ }
698
+ if (entry.type !== "reexport")
699
+ continue;
700
+ const hit = resolveExport(index, file, entry.exportedAs, exportOptions);
701
+ // A named re-export forwards the definition itself or a namespace that can reach it.
702
+ const forwardsDefinition = hit?.kind === "resolved" && matchesReferenceDefinition(hit.def);
703
+ if ((forwardsDefinition || hit?.kind === "namespace") && modulePathHasAlias(entry.fromModule))
704
+ return true;
705
+ }
706
+ return false;
707
+ };
708
+ const hasAlias = namespaceFiles.some(modulePathHasAlias);
709
+ if (hasAlias)
710
+ namespaceExportAliasUncertainty = true;
711
+ return hasAlias;
712
+ };
586
713
  const exportedNames = [];
587
714
  for (const candidate of [definition, ...equivalentDefinitions]) {
588
715
  const candidateModule = index.byFile.get(fileIdentityKey(candidate.file));
@@ -773,6 +900,61 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
773
900
  }
774
901
  return scopeIndex;
775
902
  };
903
+ const scannedNamespaceMemberRoots = new Set();
904
+ const scanNamespaceMemberPaths = async (importBinding, namespacePaths) => {
905
+ const rootPath = namespacePaths[0];
906
+ if (!rootPath)
907
+ return;
908
+ const rootKey = fileIdentityKey(rootPath.file) + "::" + rootPath.name;
909
+ if (scannedNamespaceMemberRoots.has(rootKey))
910
+ return;
911
+ scannedNamespaceMemberRoots.add(rootKey);
912
+ for (let pathIndex = 0; pathIndex < namespacePaths.length; pathIndex++) {
913
+ if (hasReachedCollectionLimit())
914
+ return;
915
+ if (pathIndex >= MAX_REFERENCE_NAMESPACE_PATHS) {
916
+ receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
917
+ return;
918
+ }
919
+ const namespacePath = namespacePaths[pathIndex];
920
+ const namespaceExports = resolveModuleExports(index, namespacePath.file, { allowLocalFallback: false });
921
+ if (namespacePath.depth) {
922
+ for (const [visibleMemberName, nestedHit] of namespaceExports) {
923
+ if (nestedHit.kind !== "resolved" || !matchesReferenceDefinition(nestedHit.def))
924
+ continue;
925
+ const parsed = await ensureCandidateParsed();
926
+ const ranges = await collectNamespaceMemberRefs(fileId, namespacePath.name, visibleMemberName, parsed, index.languageExtensions, importBinding, module.imports, await ensureScope());
927
+ for (const range of ranges) {
928
+ if (hasReachedCollectionLimit())
929
+ return;
930
+ const proof = await goToDefinition(index, { file: fileId, line: range.start.line, column: range.start.column }, parsed);
931
+ if (proof.status !== "ok" || !matchesReferenceDefinition(proof.definition))
932
+ continue;
933
+ pushRef({
934
+ file: fileId,
935
+ range,
936
+ via: { import: importBinding, namespaceMember: visibleMemberName },
937
+ });
938
+ }
939
+ }
940
+ }
941
+ if (namespacePath.depth >= MAX_REFERENCE_NAMESPACE_DEPTH) {
942
+ if ([...namespaceExports.values()].some((entry) => entry.kind === "namespace")) {
943
+ receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
944
+ }
945
+ continue;
946
+ }
947
+ for (const [alias, entry] of namespaceExports) {
948
+ if (entry.kind !== "namespace")
949
+ continue;
950
+ namespacePaths.push({
951
+ file: entry.file,
952
+ name: `${namespacePath.name}.${alias}`,
953
+ depth: namespacePath.depth + 1,
954
+ });
955
+ }
956
+ }
957
+ };
776
958
  if (supportForFileWithoutHeaderSample(fileId, index.languageExtensions)?.supportsExportFromReferences) {
777
959
  for (const entry of module.exports) {
778
960
  if (hasReachedCollectionLimit())
@@ -800,7 +982,31 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
800
982
  break;
801
983
  if (cNamespace && imp.kind === "named" && (imp.cNamespace ?? "ordinary") !== cNamespace)
802
984
  continue;
803
- const targetFile = typeof imp.resolved === "string" ? imp.resolved : undefined;
985
+ // A C# directive that an enclosing namespace shadows resolves nothing, so it is verified like an unresolved import.
986
+ const targetFile = typeof imp.resolved === "string" && !csharpShadowedImports(index).has(imp) ? imp.resolved : undefined;
987
+ if (!targetFile && parsedContext.sup.id === "csharp" && imp.kind === "namespace") {
988
+ const namespaceTargets = csharpNamespaceImportDirectories(index).get(imp) ?? [];
989
+ const targetDirectories = new Set(namespaceTargets.map((target) => fileIdentityKey(path.posix.dirname(normalizePath(target)))));
990
+ const definitionIsTargeted = [definition, ...equivalentDefinitions].some((candidate) => targetDirectories.has(fileIdentityKey(path.posix.dirname(normalizePath(candidate.file)))));
991
+ if (definitionIsTargeted) {
992
+ for (const exportedName of exportedNames) {
993
+ if (hasReachedCollectionLimit())
994
+ break;
995
+ const ranges = await collectVerifiedNamedNodeReferences(index, fileId, exportedName, definition, (params, parsed) => goToDefinition(index, params, parsed), remainingCollectionSlots(), verifiedReferenceFilter(fileId), (unavailableFile) => receiverProofUnavailableFiles.set(fileIdentityKey(unavailableFile), unavailableFile), equivalentDefinitions);
996
+ for (const { range, provenance, via } of ranges) {
997
+ if (hasReachedCollectionLimit())
998
+ break;
999
+ pushRef({
1000
+ file: fileId,
1001
+ range,
1002
+ via: { import: imp, ...(via ?? {}) },
1003
+ ...(provenance ? { provenance } : {}),
1004
+ });
1005
+ }
1006
+ }
1007
+ }
1008
+ continue;
1009
+ }
804
1010
  const bindingSites = importBindingReferenceSites(imp);
805
1011
  let verifiedBindingMatches;
806
1012
  const bindingMatchesDefinition = async () => {
@@ -873,65 +1079,25 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
873
1079
  // Python binds the first segment of an unaliased dotted import, while an alias
874
1080
  // binds the whole module. Other namespaces use their local name directly.
875
1081
  const namespaceSearchName = imp.mechanism === "python" && imp.from.includes(".") && !imp.explicitAlias ? imp.from : imp.localNS;
876
- if (!matchesDef) {
877
- const targetModule = index.byFile.get(fileIdentityKey(targetFile));
878
- if (!targetModule?.exports.some((entry) => entry.type === "namespaceReexport" || entry.type === "exportStar")) {
879
- continue;
880
- }
881
- // A namespace re-export exposes a member at paths such as W.helpers.helper,
1082
+ const targetModule = index.byFile.get(fileIdentityKey(targetFile));
1083
+ if (targetModule?.exports.some((entry) => entry.type === "namespaceReexport" || entry.type === "exportStar" || entry.type === "reexport")) {
1084
+ // A forwarded namespace can expose a member at paths such as W.helpers.helper,
882
1085
  // not as a bare export of the intermediate module. Follow only export-proven
883
1086
  // namespace edges, then verify each use through the same goto resolver.
884
- const namespacePaths = [
885
- { file: targetFile, name: namespaceSearchName, depth: 0 },
886
- ];
887
- for (let pathIndex = 0; pathIndex < namespacePaths.length; pathIndex++) {
888
- if (pathIndex >= MAX_REFERENCE_NAMESPACE_PATHS) {
889
- receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
890
- break;
891
- }
892
- const namespacePath = namespacePaths[pathIndex];
893
- if (namespacePath.depth) {
894
- const nestedHit = resolveExport(index, namespacePath.file, exportedName, {
895
- allowLocalFallback: false,
896
- ...(exportOptions ?? {}),
897
- });
898
- if (nestedHit?.kind === "resolved" && matchesReferenceDefinition(nestedHit.def)) {
899
- const parsed = await ensureCandidateParsed();
900
- const ranges = await collectNamespaceMemberRefs(fileId, namespacePath.name, exportedName, parsed, index.languageExtensions, imp, module.imports, await ensureScope());
901
- for (const range of ranges) {
902
- if (hasReachedCollectionLimit())
903
- break;
904
- const proof = await goToDefinition(index, { file: fileId, line: range.start.line, column: range.start.column }, parsed);
905
- if (proof.status !== "ok" || !matchesReferenceDefinition(proof.definition))
906
- continue;
907
- pushRef({ file: fileId, range, via: { import: imp, namespaceMember: exportedName } });
908
- }
909
- }
910
- }
911
- const exports = resolveModuleExports(index, namespacePath.file, { allowLocalFallback: false });
912
- if (namespacePath.depth >= MAX_REFERENCE_NAMESPACE_DEPTH) {
913
- if ([...exports.values()].some((entry) => entry.kind === "namespace")) {
914
- receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
915
- }
916
- continue;
917
- }
918
- for (const [alias, entry] of exports) {
919
- if (entry.kind !== "namespace")
920
- continue;
921
- namespacePaths.push({
922
- file: entry.file,
923
- name: `${namespacePath.name}.${alias}`,
924
- depth: namespacePath.depth + 1,
925
- });
926
- }
927
- }
928
- continue;
1087
+ await scanNamespaceMemberPaths(imp, [{ file: targetFile, name: namespaceSearchName, depth: 0 }]);
929
1088
  }
1089
+ if (!matchesDef)
1090
+ continue;
930
1091
  const parsed = await ensureCandidateParsed();
931
1092
  const ranges = await collectNamespaceMemberRefs(fileId, namespaceSearchName, exportedName, parsed, index.languageExtensions, imp, module.imports, await ensureScope());
932
1093
  for (const range of ranges) {
933
1094
  if (hasReachedCollectionLimit())
934
1095
  break;
1096
+ if (parsed.sup.id === "csharp" && imp.localRange) {
1097
+ const proof = await goToDefinition(index, { file: fileId, line: range.start.line, column: range.start.column }, parsed);
1098
+ if (proof.status !== "ok" || !matchesReferenceDefinition(proof.definition))
1099
+ continue;
1100
+ }
935
1101
  pushRef({
936
1102
  file: fileId,
937
1103
  range,
@@ -1030,6 +1196,17 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1030
1196
  continue;
1031
1197
  }
1032
1198
  }
1199
+ const candidateLanguage = supportForFileWithoutHeaderSample(fileId, index.languageExtensions)?.id;
1200
+ if (!matchesDef &&
1201
+ imp.kind === "named" &&
1202
+ hit?.kind === "namespace" &&
1203
+ candidateLanguage &&
1204
+ isJsTsLanguage(candidateLanguage)) {
1205
+ // `import { nested }` binds the namespace object. Member lookup starts in that
1206
+ // module; `import * as ns` still starts at the barrel and descends. Goto proves the site.
1207
+ await scanNamespaceMemberPaths(imp, [{ file: hit.file, name: imp.local, depth: 1 }]);
1208
+ continue;
1209
+ }
1033
1210
  if (!matchesDef) {
1034
1211
  // The requested export slot itself does not exist at all (as opposed to existing
1035
1212
  // and structurally naming a different, already-proven definition): the binding may
@@ -1167,6 +1344,38 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1167
1344
  }
1168
1345
  }
1169
1346
  }
1347
+ // A scoped mixin or function is not a module member. The scope walker misses function calls
1348
+ // (`function_name` is not an identifier) and treats `-` and `_` as different spellings, and a
1349
+ // later include outside the block can attach to the nested mixin. Bare same-kind calls and
1350
+ // includes inside the scanned scope are the references; anything else the walker added is not.
1351
+ let scssScopedCallableUnproven = false;
1352
+ if (parsedContext.sup.id === "scss") {
1353
+ const scoped = await scssScopedCallableReferences(index, definition);
1354
+ if (scoped?.unproven) {
1355
+ scssScopedCallableUnproven = true;
1356
+ }
1357
+ else if (scoped) {
1358
+ const owned = new Set(scoped.ranges.map((range) => referenceSiteKey(definitionFile, range)));
1359
+ const definitionKey = referenceSiteKey(definition.file, definition.range);
1360
+ const kept = [];
1361
+ seenRefs.clear();
1362
+ for (const ref of refs) {
1363
+ const key = referenceSiteKey(ref.file, ref.range);
1364
+ if (key !== definitionSiteKey && key !== definitionKey && !owned.has(key))
1365
+ continue;
1366
+ seenRefs.set(key, kept.length);
1367
+ kept.push(ref);
1368
+ }
1369
+ refs.length = 0;
1370
+ refs.push(...kept);
1371
+ for (const range of scoped.ranges)
1372
+ pushRef({ file: definitionFile, range });
1373
+ // Those static uses stay. A lookup in the same span may still name the callable by a
1374
+ // string, which this walk does not edit, so coverage must not claim to be complete.
1375
+ if (await scssScopedCallableDynamicUnproven(index, definition))
1376
+ scssScopedCallableUnproven = true;
1377
+ }
1378
+ }
1170
1379
  const truncated = maxReferences !== undefined && refs.length > maxReferences;
1171
1380
  if (truncated) {
1172
1381
  refs.length = maxReferences;
@@ -1179,6 +1388,40 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1179
1388
  }
1180
1389
  return left.file.localeCompare(right.file);
1181
1390
  });
1391
+ // A block local's lexical scope can run past the block. A use the SCSS resolver proves is a
1392
+ // module member is not a reference of that local. The local's own uses stay: they resolve as a
1393
+ // shadow and the generic walker keeps them. A nearer binding with the same Sass name and a
1394
+ // different `-`/`_` spelling owns the read; the exact-name walk would keep it on this declaration.
1395
+ let scssNearerSpellingDropped = false;
1396
+ if (parsedContext.sup.id === "scss" &&
1397
+ definition.localName.startsWith("$") &&
1398
+ !(await scssMemberForDefinition(index, definition))) {
1399
+ const facts = await scssFactsForFile(index, definition.file);
1400
+ const definitionKey = fileIdentityKey(definition.file);
1401
+ const kept = [];
1402
+ for (const ref of refs) {
1403
+ if (referenceSiteKey(ref.file, ref.range) === definitionSiteKey) {
1404
+ kept.push(ref);
1405
+ continue;
1406
+ }
1407
+ const resolved = await goToScssDefinition(index, {
1408
+ file: ref.file,
1409
+ line: ref.range.start.line,
1410
+ column: ref.range.start.column,
1411
+ });
1412
+ if (resolved?.status === "ok")
1413
+ continue;
1414
+ if (facts &&
1415
+ fileIdentityKey(ref.file) === definitionKey &&
1416
+ scssNearerEquivalentLocal(facts, definition, ref.range.start)) {
1417
+ scssNearerSpellingDropped = true;
1418
+ continue;
1419
+ }
1420
+ kept.push(ref);
1421
+ }
1422
+ refs.length = 0;
1423
+ refs.push(...kept);
1424
+ }
1182
1425
  await attachReferenceContext(index, refs, opts);
1183
1426
  const scannedFiles = [definitionFile, ...candidateFiles, ...receiverScannedFiles];
1184
1427
  // Top-level implicit-unit names and C# partial / Swift shared-owner members are both bounded
@@ -1186,6 +1429,26 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1186
1429
  const implicitUnitComplete = !definition.isMember && IMPLICIT_UNIT_LANGUAGES[parsedContext.sup.id]
1187
1430
  ? getCompilationUnitPeers(index, definitionFile, parsedContext.sup.id === "csharp" ? { csharpQualifiedName: true } : undefined).complete
1188
1431
  : await sharedOwnerMemberUnitComplete(index, definition);
1432
+ const strategyUnavailableFiles = [
1433
+ ...receiverProofUnavailableFiles.values(),
1434
+ ...(rubyReopen?.incomplete ? [definition.file] : []),
1435
+ ...(namespaceExportAliasUncertainty ? [definition.file] : []),
1436
+ ];
1437
+ if (parsedContext.sup.id === "scss" && definition.localName.startsWith("$")) {
1438
+ const facts = await scssFactsForFile(index, definition.file);
1439
+ if (scssNearerSpellingDropped || (facts && scssLocalSpellingGap(facts, definition))) {
1440
+ markNameEquivalenceGap(index, definition);
1441
+ }
1442
+ if (await scssFlowLocalUnproven(index, definition))
1443
+ strategyUnavailableFiles.push(definition.file);
1444
+ if (await scssBlockLocalExistenceUnproven(index, definition))
1445
+ strategyUnavailableFiles.push(definition.file);
1446
+ }
1447
+ if (parsedContext.sup.id === "python" && pythonPropertyAccessorNeedsPartialCoverage(parsedContext, definition)) {
1448
+ strategyUnavailableFiles.push(definition.file);
1449
+ }
1450
+ if (scssScopedCallableUnproven)
1451
+ strategyUnavailableFiles.push(definition.file);
1189
1452
  const referenceCoverage = buildIndexedCandidateCoverage({
1190
1453
  index,
1191
1454
  def: definition,
@@ -1210,10 +1473,7 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1210
1473
  ? { implicitUnitPeers: { applicable: true, executed: implicitUnitComplete } }
1211
1474
  : {}),
1212
1475
  }),
1213
- strategyUnavailableFiles: [
1214
- ...receiverProofUnavailableFiles.values(),
1215
- ...(rubyReopen?.incomplete ? [definition.file] : []),
1216
- ],
1476
+ strategyUnavailableFiles,
1217
1477
  });
1218
1478
  return {
1219
1479
  status: "ok",
@@ -1223,11 +1483,43 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1223
1483
  ...(provenance ? { provenance } : {}),
1224
1484
  };
1225
1485
  }
1486
+ function pythonPropertyAccessorNeedsPartialCoverage(parsedContext, definition) {
1487
+ const nameNode = syntaxNodeForDefinition(parsedContext, definition);
1488
+ if (nameNode.type !== "identifier")
1489
+ return false;
1490
+ const assignment = nameNode.parent;
1491
+ if (assignment?.type === "assignment" && assignment.childForFieldName("left")?.id === nameNode.id) {
1492
+ const value = assignment.childForFieldName("right");
1493
+ const argumentsNode = value?.childForFieldName("arguments");
1494
+ if (value?.type === "call" && value.childForFieldName("function")?.text === "property" && argumentsNode) {
1495
+ const positionalArguments = argumentsNode.namedChildren.filter((argument) => argument.type !== "keyword_argument");
1496
+ if (positionalArguments[1] && positionalArguments[1].text !== "None")
1497
+ return true;
1498
+ return argumentsNode.namedChildren.some((argument) => argument.type === "keyword_argument" &&
1499
+ argument.childForFieldName("name")?.text === "fset" &&
1500
+ argument.childForFieldName("value")?.text !== "None");
1501
+ }
1502
+ }
1503
+ let functionNode = nameNode;
1504
+ while (functionNode && functionNode.type !== "function_definition")
1505
+ functionNode = functionNode.parent;
1506
+ if (functionNode?.type !== "function_definition")
1507
+ return false;
1508
+ const functionName = functionNode.childForFieldName("name");
1509
+ if (functionName?.startIndex !== nameNode.startIndex || functionName.endIndex !== nameNode.endIndex)
1510
+ return false;
1511
+ const decoratedDefinition = functionNode.parent;
1512
+ if (decoratedDefinition?.type !== "decorated_definition")
1513
+ return false;
1514
+ return decoratedDefinition.namedChildren.some((child) => {
1515
+ const decorator = pythonPropertyDecorator(child);
1516
+ if (decorator?.kind === "property")
1517
+ return true;
1518
+ return decorator?.kind === "accessor" && decorator.propertyName === definition.localName;
1519
+ });
1520
+ }
1226
1521
  function syntaxNodeForDefinition(parsedContext, def) {
1227
- const position = {
1228
- row: def.range.start.line - 1,
1229
- column: def.range.start.column - 1,
1230
- };
1522
+ const position = toTreeSitterPosition(def.range.start);
1231
1523
  return parsedContext.tree.rootNode.descendantForPosition(position, position);
1232
1524
  }
1233
1525
  /**
@@ -1593,6 +1885,7 @@ export async function collectNamespaceMemberRefs(file, ns, member, parsedContext
1593
1885
  // Identifier equality follows the language rule, so C# `@X::@Target` matches alias `X` member `Target`.
1594
1886
  const normalize = sup.normalizeIdentifier;
1595
1887
  const normalizedNs = normalize(ns);
1888
+ const namespaceSegments = normalizedNs.includes(".") ? normalizedNs.split(".") : undefined;
1596
1889
  const normalizedMember = normalize(member);
1597
1890
  let effectivePythonBinding;
1598
1891
  if (sup.id === "python" && importBinding && imports) {
@@ -1616,13 +1909,23 @@ export async function collectNamespaceMemberRefs(file, ns, member, parsedContext
1616
1909
  if (obj && prop && isMemberReferencePropertyIdentifier(sup, prop.type)) {
1617
1910
  const objectName = sliceText(obj, source);
1618
1911
  const propertyName = sliceText(prop, source);
1619
- // A python multi-segment dotted import (`import a.b`) binds only the first segment;
1620
- // the source only ever repeats the whole dotted phrase to reach the resolved leaf
1621
- // module again, so `ns` can be that literal phrase and `obj` a compound chain rather
1622
- // than the single bare identifier every other caller passes.
1623
- const objectMatches = normalizedNs.includes(".")
1624
- ? normalize(objectName) === normalizedNs
1625
- : isMemberObjectIdentifier(obj.type) && normalize(objectName) === normalizedNs;
1912
+ let objectMatches = false;
1913
+ if (namespaceSegments) {
1914
+ const chain = collectMemberAccessChain({ sup, source, chainNode: obj });
1915
+ if (chain &&
1916
+ isMemberObjectIdentifier(chain.base.type) &&
1917
+ chain.names.length === namespaceSegments.length - 1) {
1918
+ objectMatches = normalize(sliceText(chain.base, source)) === namespaceSegments[0];
1919
+ for (let segmentIndex = 0; objectMatches && segmentIndex < chain.names.length; segmentIndex += 1) {
1920
+ objectMatches =
1921
+ normalize(chain.names[segmentIndex]) ===
1922
+ namespaceSegments[namespaceSegments.length - 1 - segmentIndex];
1923
+ }
1924
+ }
1925
+ }
1926
+ else {
1927
+ objectMatches = isMemberObjectIdentifier(obj.type) && normalize(objectName) === normalizedNs;
1928
+ }
1626
1929
  if (objectMatches && normalize(propertyName) === normalizedMember) {
1627
1930
  let receiver = obj;
1628
1931
  while (!isMemberObjectIdentifier(receiver.type) && receiver.namedChildren.length) {