@lzehrung/codegraph 3.0.0 → 3.1.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 (682) hide show
  1. package/README.md +19 -17
  2. package/codegraph-skill/codegraph/SKILL.md +3 -0
  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 +12 -11
  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 +218 -26
  44. package/dist/agent/rename-preview.js.map +1 -1
  45. package/dist/agent/search.d.ts.map +1 -1
  46. package/dist/agent/search.js +7 -22
  47. package/dist/agent/search.js.map +1 -1
  48. package/dist/agent/semantic-symbols.d.ts +1 -1
  49. package/dist/agent/semantic-symbols.d.ts.map +1 -1
  50. package/dist/agent/semantic-symbols.js +2 -5
  51. package/dist/agent/semantic-symbols.js.map +1 -1
  52. package/dist/agent/semantic.d.ts +5 -0
  53. package/dist/agent/semantic.d.ts.map +1 -1
  54. package/dist/agent/semantic.js +12 -1
  55. package/dist/agent/semantic.js.map +1 -1
  56. package/dist/agent/session.d.ts +9 -0
  57. package/dist/agent/session.d.ts.map +1 -1
  58. package/dist/agent/session.js +59 -41
  59. package/dist/agent/session.js.map +1 -1
  60. package/dist/agent/type-hierarchy.d.ts +4 -2
  61. package/dist/agent/type-hierarchy.d.ts.map +1 -1
  62. package/dist/agent/type-hierarchy.js +19 -31
  63. package/dist/agent/type-hierarchy.js.map +1 -1
  64. package/dist/agent/workspace-symbols.d.ts +1 -1
  65. package/dist/agent/workspace-symbols.d.ts.map +1 -1
  66. package/dist/agent/workspace-symbols.js +7 -15
  67. package/dist/agent/workspace-symbols.js.map +1 -1
  68. package/dist/analysis-summary.d.ts +1 -4
  69. package/dist/analysis-summary.d.ts.map +1 -1
  70. package/dist/analysis-summary.js +58 -19
  71. package/dist/analysis-summary.js.map +1 -1
  72. package/dist/bin/cli.js +36572 -22925
  73. package/dist/bin/query-index-worker.js +440 -261
  74. package/dist/bootstrap/tree-sitter-languages.d.ts +2 -0
  75. package/dist/bootstrap/tree-sitter-languages.d.ts.map +1 -1
  76. package/dist/bootstrap/tree-sitter-languages.js +6 -19
  77. package/dist/bootstrap/tree-sitter-languages.js.map +1 -1
  78. package/dist/chunking/chunk-matches.d.ts.map +1 -1
  79. package/dist/chunking/chunk-matches.js +6 -42
  80. package/dist/chunking/chunk-matches.js.map +1 -1
  81. package/dist/chunking/chunk-split.d.ts +7 -0
  82. package/dist/chunking/chunk-split.d.ts.map +1 -1
  83. package/dist/chunking/chunk-split.js +3 -3
  84. package/dist/chunking/chunk-split.js.map +1 -1
  85. package/dist/chunking/chunk-text-file.js +2 -30
  86. package/dist/chunking/chunk-text-file.js.map +1 -1
  87. package/dist/cli/affected.d.ts.map +1 -1
  88. package/dist/cli/affected.js +1 -9
  89. package/dist/cli/affected.js.map +1 -1
  90. package/dist/cli/call-hierarchy.js +3 -6
  91. package/dist/cli/call-hierarchy.js.map +1 -1
  92. package/dist/cli/chunk.d.ts.map +1 -1
  93. package/dist/cli/chunk.js +4 -11
  94. package/dist/cli/chunk.js.map +1 -1
  95. package/dist/cli/command-table.d.ts.map +1 -1
  96. package/dist/cli/command-table.js +3 -0
  97. package/dist/cli/command-table.js.map +1 -1
  98. package/dist/cli/context.d.ts +1 -0
  99. package/dist/cli/context.d.ts.map +1 -1
  100. package/dist/cli/context.js +1 -1
  101. package/dist/cli/context.js.map +1 -1
  102. package/dist/cli/doctor.d.ts.map +1 -1
  103. package/dist/cli/doctor.js +1 -11
  104. package/dist/cli/doctor.js.map +1 -1
  105. package/dist/cli/graph.d.ts +4 -12
  106. package/dist/cli/graph.d.ts.map +1 -1
  107. package/dist/cli/graph.js +17 -8
  108. package/dist/cli/graph.js.map +1 -1
  109. package/dist/cli/help.d.ts +4 -4
  110. package/dist/cli/help.d.ts.map +1 -1
  111. package/dist/cli/help.js +7 -5
  112. package/dist/cli/help.js.map +1 -1
  113. package/dist/cli/index.d.ts +2 -12
  114. package/dist/cli/index.d.ts.map +1 -1
  115. package/dist/cli/index.js +2 -5
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/links.d.ts.map +1 -1
  118. package/dist/cli/links.js +4 -10
  119. package/dist/cli/links.js.map +1 -1
  120. package/dist/cli/mcp.d.ts.map +1 -1
  121. package/dist/cli/mcp.js +1 -0
  122. package/dist/cli/mcp.js.map +1 -1
  123. package/dist/cli/module-locals.d.ts +8 -0
  124. package/dist/cli/module-locals.d.ts.map +1 -0
  125. package/dist/cli/module-locals.js +9 -0
  126. package/dist/cli/module-locals.js.map +1 -0
  127. package/dist/cli/navigation.d.ts +2 -0
  128. package/dist/cli/navigation.d.ts.map +1 -1
  129. package/dist/cli/navigation.js +3 -5
  130. package/dist/cli/navigation.js.map +1 -1
  131. package/dist/cli/options.d.ts.map +1 -1
  132. package/dist/cli/options.js +2 -1
  133. package/dist/cli/options.js.map +1 -1
  134. package/dist/cli/pretty.d.ts +1 -0
  135. package/dist/cli/pretty.d.ts.map +1 -1
  136. package/dist/cli/pretty.js +6 -8
  137. package/dist/cli/pretty.js.map +1 -1
  138. package/dist/cli/refactor-plan.js +2 -5
  139. package/dist/cli/refactor-plan.js.map +1 -1
  140. package/dist/cli/rename-preview.js +2 -5
  141. package/dist/cli/rename-preview.js.map +1 -1
  142. package/dist/cli/review.d.ts +6 -16
  143. package/dist/cli/review.d.ts.map +1 -1
  144. package/dist/cli/review.js +2 -0
  145. package/dist/cli/review.js.map +1 -1
  146. package/dist/cli/server.d.ts.map +1 -1
  147. package/dist/cli/server.js +7 -10
  148. package/dist/cli/server.js.map +1 -1
  149. package/dist/cli/type-hierarchy.js +8 -8
  150. package/dist/cli/type-hierarchy.js.map +1 -1
  151. package/dist/document-links/asciidoc.d.ts.map +1 -1
  152. package/dist/document-links/asciidoc.js +4 -16
  153. package/dist/document-links/asciidoc.js.map +1 -1
  154. package/dist/document-links/check.d.ts.map +1 -1
  155. package/dist/document-links/check.js +1 -3
  156. package/dist/document-links/check.js.map +1 -1
  157. package/dist/document-links/html.d.ts.map +1 -1
  158. package/dist/document-links/html.js +6 -44
  159. package/dist/document-links/html.js.map +1 -1
  160. package/dist/document-links/markdown.d.ts.map +1 -1
  161. package/dist/document-links/markdown.js +4 -13
  162. package/dist/document-links/markdown.js.map +1 -1
  163. package/dist/document-links/rst.d.ts.map +1 -1
  164. package/dist/document-links/rst.js +7 -31
  165. package/dist/document-links/rst.js.map +1 -1
  166. package/dist/document-links/sfc.d.ts.map +1 -1
  167. package/dist/document-links/sfc.js +2 -5
  168. package/dist/document-links/sfc.js.map +1 -1
  169. package/dist/document-links/shared.d.ts +2 -0
  170. package/dist/document-links/shared.d.ts.map +1 -1
  171. package/dist/document-links/shared.js +13 -0
  172. package/dist/document-links/shared.js.map +1 -1
  173. package/dist/drift/artifact.d.ts.map +1 -1
  174. package/dist/drift/artifact.js +4 -27
  175. package/dist/drift/artifact.js.map +1 -1
  176. package/dist/drift/graph-edges.d.ts +4 -0
  177. package/dist/drift/graph-edges.d.ts.map +1 -0
  178. package/dist/drift/graph-edges.js +15 -0
  179. package/dist/drift/graph-edges.js.map +1 -0
  180. package/dist/drift/snapshot.d.ts.map +1 -1
  181. package/dist/drift/snapshot.js +2 -17
  182. package/dist/drift/snapshot.js.map +1 -1
  183. package/dist/duplicates/unit-cache.d.ts +11 -1
  184. package/dist/duplicates/unit-cache.d.ts.map +1 -1
  185. package/dist/duplicates/unit-cache.js +20 -2
  186. package/dist/duplicates/unit-cache.js.map +1 -1
  187. package/dist/duplicates/units.d.ts +2 -1
  188. package/dist/duplicates/units.d.ts.map +1 -1
  189. package/dist/duplicates/units.js +23 -22
  190. package/dist/duplicates/units.js.map +1 -1
  191. package/dist/graph-builder.d.ts +1 -1
  192. package/dist/graph-builder.d.ts.map +1 -1
  193. package/dist/graph-builder.js +3 -2
  194. package/dist/graph-builder.js.map +1 -1
  195. package/dist/graph-edge-collector.d.ts +3 -1
  196. package/dist/graph-edge-collector.d.ts.map +1 -1
  197. package/dist/graph-edge-collector.js +38 -6
  198. package/dist/graph-edge-collector.js.map +1 -1
  199. package/dist/graphs/angularjs.d.ts.map +1 -1
  200. package/dist/graphs/angularjs.js +2 -9
  201. package/dist/graphs/angularjs.js.map +1 -1
  202. package/dist/graphs/edge-resolution.d.ts +4 -0
  203. package/dist/graphs/edge-resolution.d.ts.map +1 -1
  204. package/dist/graphs/edge-resolution.js +2 -0
  205. package/dist/graphs/edge-resolution.js.map +1 -1
  206. package/dist/graphs/external/manifests.d.ts.map +1 -1
  207. package/dist/graphs/external/manifests.js +1 -6
  208. package/dist/graphs/external/manifests.js.map +1 -1
  209. package/dist/graphs/specifiers.d.ts.map +1 -1
  210. package/dist/graphs/specifiers.js +47 -26
  211. package/dist/graphs/specifiers.js.map +1 -1
  212. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +2 -0
  213. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
  214. package/dist/graphs/symbol-graph-detailed/edge-passes.js +9 -3
  215. package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
  216. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +3 -3
  217. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
  218. package/dist/graphs/symbol-graph-detailed/receiver-calls.js +2 -26
  219. package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
  220. package/dist/graphs/symbol-graph-detailed.d.ts.map +1 -1
  221. package/dist/graphs/symbol-graph-detailed.js +38 -1
  222. package/dist/graphs/symbol-graph-detailed.js.map +1 -1
  223. package/dist/graphs/symbol-graph.d.ts +1 -1
  224. package/dist/graphs/symbol-graph.d.ts.map +1 -1
  225. package/dist/graphs/symbol-graph.js +8 -0
  226. package/dist/graphs/symbol-graph.js.map +1 -1
  227. package/dist/impact/analyzer.d.ts.map +1 -1
  228. package/dist/impact/analyzer.js +116 -17
  229. package/dist/impact/analyzer.js.map +1 -1
  230. package/dist/impact/budgets.d.ts.map +1 -1
  231. package/dist/impact/budgets.js +3 -9
  232. package/dist/impact/budgets.js.map +1 -1
  233. package/dist/impact/call-compatibility.d.ts.map +1 -1
  234. package/dist/impact/call-compatibility.js +3 -12
  235. package/dist/impact/call-compatibility.js.map +1 -1
  236. package/dist/impact/context.d.ts +6 -0
  237. package/dist/impact/context.d.ts.map +1 -1
  238. package/dist/impact/context.js +2 -2
  239. package/dist/impact/context.js.map +1 -1
  240. package/dist/impact/direct.d.ts.map +1 -1
  241. package/dist/impact/direct.js +2 -6
  242. package/dist/impact/direct.js.map +1 -1
  243. package/dist/impact/map.d.ts +3 -1
  244. package/dist/impact/map.d.ts.map +1 -1
  245. package/dist/impact/map.js +12 -5
  246. package/dist/impact/map.js.map +1 -1
  247. package/dist/impact/reference-cache.d.ts.map +1 -1
  248. package/dist/impact/reference-cache.js +1 -24
  249. package/dist/impact/reference-cache.js.map +1 -1
  250. package/dist/impact/report-shared.d.ts +2 -1
  251. package/dist/impact/report-shared.d.ts.map +1 -1
  252. package/dist/impact/report-shared.js +10 -0
  253. package/dist/impact/report-shared.js.map +1 -1
  254. package/dist/impact/report-suggestions.d.ts.map +1 -1
  255. package/dist/impact/report-suggestions.js +2 -8
  256. package/dist/impact/report-suggestions.js.map +1 -1
  257. package/dist/impact/report.d.ts.map +1 -1
  258. package/dist/impact/report.js +2 -8
  259. package/dist/impact/report.js.map +1 -1
  260. package/dist/impact/streaming.d.ts.map +1 -1
  261. package/dist/impact/streaming.js +3 -8
  262. package/dist/impact/streaming.js.map +1 -1
  263. package/dist/impact/transitive.d.ts +6 -2
  264. package/dist/impact/transitive.d.ts.map +1 -1
  265. package/dist/impact/transitive.js +23 -11
  266. package/dist/impact/transitive.js.map +1 -1
  267. package/dist/indexer/build-cache/manifest.d.ts.map +1 -1
  268. package/dist/indexer/build-cache/manifest.js +10 -108
  269. package/dist/indexer/build-cache/manifest.js.map +1 -1
  270. package/dist/indexer/build-cache/module-cache.d.ts +6 -1
  271. package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
  272. package/dist/indexer/build-cache/module-cache.js +25 -2
  273. package/dist/indexer/build-cache/module-cache.js.map +1 -1
  274. package/dist/indexer/build-cache/options.d.ts +40 -1
  275. package/dist/indexer/build-cache/options.d.ts.map +1 -1
  276. package/dist/indexer/build-cache/options.js +40 -1
  277. package/dist/indexer/build-cache/options.js.map +1 -1
  278. package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
  279. package/dist/indexer/build-cache/project-snapshot.js +52 -99
  280. package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
  281. package/dist/indexer/build-cache/reports.d.ts +1 -0
  282. package/dist/indexer/build-cache/reports.d.ts.map +1 -1
  283. package/dist/indexer/build-cache/reports.js +10 -0
  284. package/dist/indexer/build-cache/reports.js.map +1 -1
  285. package/dist/indexer/build-index.d.ts +2 -0
  286. package/dist/indexer/build-index.d.ts.map +1 -1
  287. package/dist/indexer/build-index.js +187 -57
  288. package/dist/indexer/build-index.js.map +1 -1
  289. package/dist/indexer/build-workers.d.ts +7 -1
  290. package/dist/indexer/build-workers.d.ts.map +1 -1
  291. package/dist/indexer/build-workers.js +12 -0
  292. package/dist/indexer/build-workers.js.map +1 -1
  293. package/dist/indexer/call-hierarchy.d.ts.map +1 -1
  294. package/dist/indexer/call-hierarchy.js +5 -17
  295. package/dist/indexer/call-hierarchy.js.map +1 -1
  296. package/dist/indexer/compilation-units.d.ts +32 -20
  297. package/dist/indexer/compilation-units.d.ts.map +1 -1
  298. package/dist/indexer/compilation-units.js +139 -145
  299. package/dist/indexer/compilation-units.js.map +1 -1
  300. package/dist/indexer/cpp-callables.d.ts.map +1 -1
  301. package/dist/indexer/cpp-callables.js +2 -7
  302. package/dist/indexer/cpp-callables.js.map +1 -1
  303. package/dist/indexer/declarations.d.ts.map +1 -1
  304. package/dist/indexer/declarations.js +32 -7
  305. package/dist/indexer/declarations.js.map +1 -1
  306. package/dist/indexer/import-resolution-tables.d.ts.map +1 -1
  307. package/dist/indexer/import-resolution-tables.js +10 -0
  308. package/dist/indexer/import-resolution-tables.js.map +1 -1
  309. package/dist/indexer/import-types.d.ts +5 -0
  310. package/dist/indexer/import-types.d.ts.map +1 -1
  311. package/dist/indexer/import-types.js.map +1 -1
  312. package/dist/indexer/imports/binding-ranges.d.ts +5 -12
  313. package/dist/indexer/imports/binding-ranges.d.ts.map +1 -1
  314. package/dist/indexer/imports/binding-ranges.js +13 -19
  315. package/dist/indexer/imports/binding-ranges.js.map +1 -1
  316. package/dist/indexer/imports/context.d.ts +6 -0
  317. package/dist/indexer/imports/context.d.ts.map +1 -1
  318. package/dist/indexer/imports/import-binding-tables.d.ts +28 -13
  319. package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
  320. package/dist/indexer/imports/import-binding-tables.js +182 -178
  321. package/dist/indexer/imports/import-binding-tables.js.map +1 -1
  322. package/dist/indexer/imports/js-text-imports.d.ts +0 -1
  323. package/dist/indexer/imports/js-text-imports.d.ts.map +1 -1
  324. package/dist/indexer/imports/js-text-imports.js +0 -176
  325. package/dist/indexer/imports/js-text-imports.js.map +1 -1
  326. package/dist/indexer/imports/language-specific.d.ts.map +1 -1
  327. package/dist/indexer/imports/language-specific.js +4 -8
  328. package/dist/indexer/imports/language-specific.js.map +1 -1
  329. package/dist/indexer/imports/python.d.ts +0 -1
  330. package/dist/indexer/imports/python.d.ts.map +1 -1
  331. package/dist/indexer/imports/python.js +1 -29
  332. package/dist/indexer/imports/python.js.map +1 -1
  333. package/dist/indexer/imports/text-import-extractors.d.ts +2 -9
  334. package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
  335. package/dist/indexer/imports/text-import-extractors.js +0 -284
  336. package/dist/indexer/imports/text-import-extractors.js.map +1 -1
  337. package/dist/indexer/imports.d.ts +15 -0
  338. package/dist/indexer/imports.d.ts.map +1 -1
  339. package/dist/indexer/imports.js +82 -44
  340. package/dist/indexer/imports.js.map +1 -1
  341. package/dist/indexer/incremental-plan.d.ts +0 -1
  342. package/dist/indexer/incremental-plan.d.ts.map +1 -1
  343. package/dist/indexer/incremental-plan.js +6 -12
  344. package/dist/indexer/incremental-plan.js.map +1 -1
  345. package/dist/indexer/locals-and-exports.d.ts.map +1 -1
  346. package/dist/indexer/locals-and-exports.js +8 -0
  347. package/dist/indexer/locals-and-exports.js.map +1 -1
  348. package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -1
  349. package/dist/indexer/name-lookup-policies/implicit-self.js +25 -4
  350. package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -1
  351. package/dist/indexer/name-resolution-types.d.ts +5 -0
  352. package/dist/indexer/name-resolution-types.d.ts.map +1 -1
  353. package/dist/indexer/name-resolution.d.ts.map +1 -1
  354. package/dist/indexer/name-resolution.js +2 -0
  355. package/dist/indexer/name-resolution.js.map +1 -1
  356. package/dist/indexer/navigation-cpp.d.ts.map +1 -1
  357. package/dist/indexer/navigation-cpp.js +3 -5
  358. package/dist/indexer/navigation-cpp.js.map +1 -1
  359. package/dist/indexer/navigation-goto.d.ts +49 -3
  360. package/dist/indexer/navigation-goto.d.ts.map +1 -1
  361. package/dist/indexer/navigation-goto.js +500 -106
  362. package/dist/indexer/navigation-goto.js.map +1 -1
  363. package/dist/indexer/navigation-local.d.ts +7 -0
  364. package/dist/indexer/navigation-local.d.ts.map +1 -1
  365. package/dist/indexer/navigation-local.js +22 -2
  366. package/dist/indexer/navigation-local.js.map +1 -1
  367. package/dist/indexer/navigation-php.d.ts +0 -1
  368. package/dist/indexer/navigation-php.d.ts.map +1 -1
  369. package/dist/indexer/navigation-php.js +1 -7
  370. package/dist/indexer/navigation-php.js.map +1 -1
  371. package/dist/indexer/navigation-references.d.ts +1 -0
  372. package/dist/indexer/navigation-references.d.ts.map +1 -1
  373. package/dist/indexer/navigation-references.js +134 -23
  374. package/dist/indexer/navigation-references.js.map +1 -1
  375. package/dist/indexer/navigation-resolve.d.ts +22 -0
  376. package/dist/indexer/navigation-resolve.d.ts.map +1 -1
  377. package/dist/indexer/navigation-resolve.js +73 -8
  378. package/dist/indexer/navigation-resolve.js.map +1 -1
  379. package/dist/indexer/navigation.d.ts +4 -1
  380. package/dist/indexer/navigation.d.ts.map +1 -1
  381. package/dist/indexer/navigation.js +429 -109
  382. package/dist/indexer/navigation.js.map +1 -1
  383. package/dist/indexer/python-property-decorator.d.ts +11 -0
  384. package/dist/indexer/python-property-decorator.d.ts.map +1 -0
  385. package/dist/indexer/python-property-decorator.js +30 -0
  386. package/dist/indexer/python-property-decorator.js.map +1 -0
  387. package/dist/indexer/reference-context.d.ts.map +1 -1
  388. package/dist/indexer/reference-context.js +4 -1
  389. package/dist/indexer/reference-context.js.map +1 -1
  390. package/dist/indexer/scope-nodes.d.ts.map +1 -1
  391. package/dist/indexer/scope-nodes.js +5 -0
  392. package/dist/indexer/scope-nodes.js.map +1 -1
  393. package/dist/indexer/shared-owner-identity.d.ts +3 -1
  394. package/dist/indexer/shared-owner-identity.d.ts.map +1 -1
  395. package/dist/indexer/shared-owner-identity.js +40 -12
  396. package/dist/indexer/shared-owner-identity.js.map +1 -1
  397. package/dist/indexer/shared.d.ts +10 -0
  398. package/dist/indexer/shared.d.ts.map +1 -1
  399. package/dist/indexer/shared.js +8 -0
  400. package/dist/indexer/shared.js.map +1 -1
  401. package/dist/indexer/star-import-precedence.d.ts +5 -1
  402. package/dist/indexer/star-import-precedence.d.ts.map +1 -1
  403. package/dist/indexer/star-import-precedence.js +12 -19
  404. package/dist/indexer/star-import-precedence.js.map +1 -1
  405. package/dist/indexer/type-hierarchy.d.ts.map +1 -1
  406. package/dist/indexer/type-hierarchy.js +8 -9
  407. package/dist/indexer/type-hierarchy.js.map +1 -1
  408. package/dist/indexer/types.d.ts +54 -2
  409. package/dist/indexer/types.d.ts.map +1 -1
  410. package/dist/indexer/types.js +4 -0
  411. package/dist/indexer/types.js.map +1 -1
  412. package/dist/indexer/workspace-symbols.d.ts.map +1 -1
  413. package/dist/indexer/workspace-symbols.js +3 -13
  414. package/dist/indexer/workspace-symbols.js.map +1 -1
  415. package/dist/installer/locks.d.ts +1 -0
  416. package/dist/installer/locks.d.ts.map +1 -1
  417. package/dist/installer/locks.js +4 -8
  418. package/dist/installer/locks.js.map +1 -1
  419. package/dist/installer/registry.d.ts.map +1 -1
  420. package/dist/installer/registry.js +9 -15
  421. package/dist/installer/registry.js.map +1 -1
  422. package/dist/languages/all.d.ts +1 -0
  423. package/dist/languages/all.d.ts.map +1 -1
  424. package/dist/languages/all.js +1 -0
  425. package/dist/languages/all.js.map +1 -1
  426. package/dist/languages/callable-arity.d.ts.map +1 -1
  427. package/dist/languages/callable-arity.js +1 -38
  428. package/dist/languages/callable-arity.js.map +1 -1
  429. package/dist/languages/definitions/csharp.d.ts.map +1 -1
  430. package/dist/languages/definitions/csharp.js +5 -13
  431. package/dist/languages/definitions/csharp.js.map +1 -1
  432. package/dist/languages/definitions/java.d.ts.map +1 -1
  433. package/dist/languages/definitions/java.js +4 -13
  434. package/dist/languages/definitions/java.js.map +1 -1
  435. package/dist/languages/definitions/kotlin.d.ts.map +1 -1
  436. package/dist/languages/definitions/kotlin.js +4 -8
  437. package/dist/languages/definitions/kotlin.js.map +1 -1
  438. package/dist/languages/definitions/python.d.ts.map +1 -1
  439. package/dist/languages/definitions/python.js +5 -3
  440. package/dist/languages/definitions/python.js.map +1 -1
  441. package/dist/languages/definitions/terraform.d.ts +9 -0
  442. package/dist/languages/definitions/terraform.d.ts.map +1 -0
  443. package/dist/languages/definitions/terraform.js +84 -0
  444. package/dist/languages/definitions/terraform.js.map +1 -0
  445. package/dist/languages/import-statement-parsers.d.ts +0 -30
  446. package/dist/languages/import-statement-parsers.d.ts.map +1 -1
  447. package/dist/languages/import-statement-parsers.js +1 -81
  448. package/dist/languages/import-statement-parsers.js.map +1 -1
  449. package/dist/languages/sfc.d.ts.map +1 -1
  450. package/dist/languages/sfc.js +8 -43
  451. package/dist/languages/sfc.js.map +1 -1
  452. package/dist/languages.d.ts +1 -0
  453. package/dist/languages.d.ts.map +1 -1
  454. package/dist/languages.js +1 -0
  455. package/dist/languages.js.map +1 -1
  456. package/dist/lifecycle/manifest.d.ts.map +1 -1
  457. package/dist/lifecycle/manifest.js +11 -29
  458. package/dist/lifecycle/manifest.js.map +1 -1
  459. package/dist/mcp/handlers.d.ts +21 -0
  460. package/dist/mcp/handlers.d.ts.map +1 -1
  461. package/dist/mcp/handlers.js +66 -20
  462. package/dist/mcp/handlers.js.map +1 -1
  463. package/dist/mcp/http-transport.d.ts.map +1 -1
  464. package/dist/mcp/http-transport.js +5 -1
  465. package/dist/mcp/http-transport.js.map +1 -1
  466. package/dist/mcp/project-watcher.d.ts +125 -0
  467. package/dist/mcp/project-watcher.d.ts.map +1 -0
  468. package/dist/mcp/project-watcher.js +643 -0
  469. package/dist/mcp/project-watcher.js.map +1 -0
  470. package/dist/mcp/server.d.ts.map +1 -1
  471. package/dist/mcp/server.js +5 -1
  472. package/dist/mcp/server.js.map +1 -1
  473. package/dist/native/byte-index.d.ts +1 -0
  474. package/dist/native/byte-index.d.ts.map +1 -1
  475. package/dist/native/byte-index.js +1 -1
  476. package/dist/native/byte-index.js.map +1 -1
  477. package/dist/native/contracts.d.ts +1 -0
  478. package/dist/native/contracts.d.ts.map +1 -1
  479. package/dist/native/native-backend-report.d.ts +2 -1
  480. package/dist/native/native-backend-report.d.ts.map +1 -1
  481. package/dist/native/native-backend-report.js +23 -0
  482. package/dist/native/native-backend-report.js.map +1 -1
  483. package/dist/native/tree-shape.d.ts +5 -7
  484. package/dist/native/tree-shape.d.ts.map +1 -1
  485. package/dist/native/tree-shape.js +11 -10
  486. package/dist/native/tree-shape.js.map +1 -1
  487. package/dist/presentation/bounds.d.ts +2 -0
  488. package/dist/presentation/bounds.d.ts.map +1 -1
  489. package/dist/presentation/bounds.js +8 -0
  490. package/dist/presentation/bounds.js.map +1 -1
  491. package/dist/review/candidates.d.ts.map +1 -1
  492. package/dist/review/candidates.js +4 -25
  493. package/dist/review/candidates.js.map +1 -1
  494. package/dist/review/report.d.ts.map +1 -1
  495. package/dist/review/report.js +4 -2
  496. package/dist/review/report.js.map +1 -1
  497. package/dist/review/summaries.d.ts.map +1 -1
  498. package/dist/review/summaries.js +14 -35
  499. package/dist/review/summaries.js.map +1 -1
  500. package/dist/review.d.ts.map +1 -1
  501. package/dist/review.js +4 -5
  502. package/dist/review.js.map +1 -1
  503. package/dist/scss/navigation.d.ts +13 -0
  504. package/dist/scss/navigation.d.ts.map +1 -0
  505. package/dist/scss/navigation.js +150 -0
  506. package/dist/scss/navigation.js.map +1 -0
  507. package/dist/scss/resolution.d.ts +190 -0
  508. package/dist/scss/resolution.d.ts.map +1 -0
  509. package/dist/scss/resolution.js +1802 -0
  510. package/dist/scss/resolution.js.map +1 -0
  511. package/dist/scss/syntax.d.ts +181 -0
  512. package/dist/scss/syntax.d.ts.map +1 -0
  513. package/dist/scss/syntax.js +1436 -0
  514. package/dist/scss/syntax.js.map +1 -0
  515. package/dist/sql/classify-sql-file.d.ts +7 -0
  516. package/dist/sql/classify-sql-file.d.ts.map +1 -1
  517. package/dist/sql/classify-sql-file.js +9 -0
  518. package/dist/sql/classify-sql-file.js.map +1 -1
  519. package/dist/sql/extract-facts.d.ts.map +1 -1
  520. package/dist/sql/extract-facts.js +517 -77
  521. package/dist/sql/extract-facts.js.map +1 -1
  522. package/dist/sql/lex.d.ts +100 -1
  523. package/dist/sql/lex.d.ts.map +1 -1
  524. package/dist/sql/lex.js +473 -11
  525. package/dist/sql/lex.js.map +1 -1
  526. package/dist/sql/lookup.d.ts +17 -0
  527. package/dist/sql/lookup.d.ts.map +1 -1
  528. package/dist/sql/lookup.js +21 -0
  529. package/dist/sql/lookup.js.map +1 -1
  530. package/dist/sql/navigation.d.ts +28 -1
  531. package/dist/sql/navigation.d.ts.map +1 -1
  532. package/dist/sql/navigation.js +474 -84
  533. package/dist/sql/navigation.js.map +1 -1
  534. package/dist/sql/object-mentions.d.ts +24 -0
  535. package/dist/sql/object-mentions.d.ts.map +1 -0
  536. package/dist/sql/object-mentions.js +233 -0
  537. package/dist/sql/object-mentions.js.map +1 -0
  538. package/dist/sql/review.d.ts +3 -0
  539. package/dist/sql/review.d.ts.map +1 -1
  540. package/dist/sql/review.js +15 -14
  541. package/dist/sql/review.js.map +1 -1
  542. package/dist/sql/routine-mentions.d.ts +61 -0
  543. package/dist/sql/routine-mentions.d.ts.map +1 -0
  544. package/dist/sql/routine-mentions.js +868 -0
  545. package/dist/sql/routine-mentions.js.map +1 -0
  546. package/dist/sql/source-graph.d.ts +18 -3
  547. package/dist/sql/source-graph.d.ts.map +1 -1
  548. package/dist/sql/source-graph.js +109 -32
  549. package/dist/sql/source-graph.js.map +1 -1
  550. package/dist/sqlite/raw-query-worker-pool.d.ts.map +1 -1
  551. package/dist/sqlite/raw-query-worker-pool.js +2 -0
  552. package/dist/sqlite/raw-query-worker-pool.js.map +1 -1
  553. package/dist/sqlite/types.d.ts +6 -5
  554. package/dist/sqlite/types.d.ts.map +1 -1
  555. package/dist/sqlite/write.d.ts.map +1 -1
  556. package/dist/sqlite/write.js.map +1 -1
  557. package/dist/sqlite-driver.d.ts +0 -1
  558. package/dist/sqlite-driver.d.ts.map +1 -1
  559. package/dist/sqlite-driver.js +0 -11
  560. package/dist/sqlite-driver.js.map +1 -1
  561. package/dist/terraform/navigation.d.ts +20 -0
  562. package/dist/terraform/navigation.d.ts.map +1 -0
  563. package/dist/terraform/navigation.js +140 -0
  564. package/dist/terraform/navigation.js.map +1 -0
  565. package/dist/terraform/resolution.d.ts +82 -0
  566. package/dist/terraform/resolution.d.ts.map +1 -0
  567. package/dist/terraform/resolution.js +324 -0
  568. package/dist/terraform/resolution.js.map +1 -0
  569. package/dist/terraform/syntax.d.ts +109 -0
  570. package/dist/terraform/syntax.d.ts.map +1 -0
  571. package/dist/terraform/syntax.js +438 -0
  572. package/dist/terraform/syntax.js.map +1 -0
  573. package/dist/util/ast.d.ts +5 -0
  574. package/dist/util/ast.d.ts.map +1 -1
  575. package/dist/util/ast.js +10 -0
  576. package/dist/util/ast.js.map +1 -1
  577. package/dist/util/atomic-file.d.ts +22 -0
  578. package/dist/util/atomic-file.d.ts.map +1 -0
  579. package/dist/util/atomic-file.js +106 -0
  580. package/dist/util/atomic-file.js.map +1 -0
  581. package/dist/util/collections.d.ts +5 -0
  582. package/dist/util/collections.d.ts.map +1 -1
  583. package/dist/util/collections.js +26 -0
  584. package/dist/util/collections.js.map +1 -1
  585. package/dist/util/concurrency.d.ts +1 -0
  586. package/dist/util/concurrency.d.ts.map +1 -1
  587. package/dist/util/concurrency.js +5 -0
  588. package/dist/util/concurrency.js.map +1 -1
  589. package/dist/util/confined-file.d.ts.map +1 -1
  590. package/dist/util/confined-file.js +1 -3
  591. package/dist/util/confined-file.js.map +1 -1
  592. package/dist/util/csharp-tree.d.ts +65 -0
  593. package/dist/util/csharp-tree.d.ts.map +1 -0
  594. package/dist/util/csharp-tree.js +266 -0
  595. package/dist/util/csharp-tree.js.map +1 -0
  596. package/dist/util/errors.d.ts +1 -0
  597. package/dist/util/errors.d.ts.map +1 -1
  598. package/dist/util/errors.js +3 -0
  599. package/dist/util/errors.js.map +1 -1
  600. package/dist/util/graph-edges.d.ts +2 -0
  601. package/dist/util/graph-edges.d.ts.map +1 -1
  602. package/dist/util/graph-edges.js +11 -0
  603. package/dist/util/graph-edges.js.map +1 -1
  604. package/dist/util/guards.d.ts +1 -0
  605. package/dist/util/guards.d.ts.map +1 -1
  606. package/dist/util/guards.js +6 -0
  607. package/dist/util/guards.js.map +1 -1
  608. package/dist/util/identifiers.d.ts +0 -24
  609. package/dist/util/identifiers.d.ts.map +1 -1
  610. package/dist/util/identifiers.js +0 -24
  611. package/dist/util/identifiers.js.map +1 -1
  612. package/dist/util/jvm-tree.d.ts +58 -0
  613. package/dist/util/jvm-tree.d.ts.map +1 -0
  614. package/dist/util/jvm-tree.js +153 -0
  615. package/dist/util/jvm-tree.js.map +1 -0
  616. package/dist/util/member-access-tables.d.ts.map +1 -1
  617. package/dist/util/member-access-tables.js +3 -0
  618. package/dist/util/member-access-tables.js.map +1 -1
  619. package/dist/util/package-exports.d.ts +0 -22
  620. package/dist/util/package-exports.d.ts.map +1 -1
  621. package/dist/util/package-exports.js +25 -5
  622. package/dist/util/package-exports.js.map +1 -1
  623. package/dist/util/paths.d.ts +1 -0
  624. package/dist/util/paths.d.ts.map +1 -1
  625. package/dist/util/paths.js +10 -4
  626. package/dist/util/paths.js.map +1 -1
  627. package/dist/util/project-files.d.ts.map +1 -1
  628. package/dist/util/project-files.js +3 -1
  629. package/dist/util/project-files.js.map +1 -1
  630. package/dist/util/resolution/csharp.d.ts +20 -8
  631. package/dist/util/resolution/csharp.d.ts.map +1 -1
  632. package/dist/util/resolution/csharp.js +126 -127
  633. package/dist/util/resolution/csharp.js.map +1 -1
  634. package/dist/util/resolution/files.d.ts +6 -0
  635. package/dist/util/resolution/files.d.ts.map +1 -1
  636. package/dist/util/resolution/files.js +74 -21
  637. package/dist/util/resolution/files.js.map +1 -1
  638. package/dist/util/resolution/jvm.d.ts +21 -1
  639. package/dist/util/resolution/jvm.d.ts.map +1 -1
  640. package/dist/util/resolution/jvm.js +168 -100
  641. package/dist/util/resolution/jvm.js.map +1 -1
  642. package/dist/util/resolution/project-symbols.d.ts +1 -1
  643. package/dist/util/resolution/project-symbols.d.ts.map +1 -1
  644. package/dist/util/resolution/project-symbols.js.map +1 -1
  645. package/dist/util/resolution/specifier-targets.d.ts +4 -0
  646. package/dist/util/resolution/specifier-targets.d.ts.map +1 -1
  647. package/dist/util/resolution/specifier-targets.js +16 -3
  648. package/dist/util/resolution/specifier-targets.js.map +1 -1
  649. package/dist/util/resolution/terraform.d.ts +18 -0
  650. package/dist/util/resolution/terraform.d.ts.map +1 -0
  651. package/dist/util/resolution/terraform.js +64 -0
  652. package/dist/util/resolution/terraform.js.map +1 -0
  653. package/dist/util/resolution.d.ts.map +1 -1
  654. package/dist/util/resolution.js +21 -7
  655. package/dist/util/resolution.js.map +1 -1
  656. package/dist/util/syntax-tree.d.ts +16 -0
  657. package/dist/util/syntax-tree.d.ts.map +1 -0
  658. package/dist/util/syntax-tree.js +34 -0
  659. package/dist/util/syntax-tree.js.map +1 -0
  660. package/dist/util/text-scanning.d.ts +6 -0
  661. package/dist/util/text-scanning.d.ts.map +1 -0
  662. package/dist/util/text-scanning.js +35 -0
  663. package/dist/util/text-scanning.js.map +1 -0
  664. package/dist/util/trivia-tables.d.ts +13 -8
  665. package/dist/util/trivia-tables.d.ts.map +1 -1
  666. package/dist/util/trivia-tables.js +13 -63
  667. package/dist/util/trivia-tables.js.map +1 -1
  668. package/dist/util/trivia.d.ts +10 -3
  669. package/dist/util/trivia.d.ts.map +1 -1
  670. package/dist/util/trivia.js +209 -79
  671. package/dist/util/trivia.js.map +1 -1
  672. package/dist/util/windows-process-drain.d.ts.map +1 -1
  673. package/dist/util/windows-process-drain.js.map +1 -1
  674. package/dist/util/worker-threads.d.ts +16 -0
  675. package/dist/util/worker-threads.d.ts.map +1 -1
  676. package/dist/util/worker-threads.js +118 -0
  677. package/dist/util/worker-threads.js.map +1 -1
  678. package/dist/worker/native-worker-pool.d.ts.map +1 -1
  679. package/dist/worker/native-worker-pool.js +2 -1
  680. package/dist/worker/native-worker-pool.js.map +1 -1
  681. package/docs/mcp.md +27 -2
  682. package/package.json +8 -8
@@ -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,23 +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";
38
+ import { findTerraformReferences, goToTerraformDefinition } from "../terraform/navigation.js";
32
39
  import { createLoadingParsedFileProvider, fileBindingIsUnshadowed, phpImportTypeAtPosition, resolveBareName, settleNameResolution, withParsedFiles, } from "./name-resolution.js";
33
40
  import { resolveCppQualifiedName } from "./name-lookup-policies/c-family.js";
41
+ import { createUnionFind } from "../util/collections.js";
42
+ import { toTreeSitterPosition } from "./shared.js";
34
43
  export { resolveExport, resolveImported } from "./navigation-resolve.js";
35
44
  const CPP_MEMBER_CONTAINER_TYPES = new Set(["class_specifier", "struct_specifier", "union_specifier"]);
36
45
  const MAX_REFERENCE_NAMESPACE_DEPTH = 8;
@@ -43,6 +52,12 @@ export async function goToDefinition(index, req, parsedContext) {
43
52
  const sqlResult = await goToSqlDefinition(index, req);
44
53
  if (sqlResult)
45
54
  return sqlResult;
55
+ const terraformResult = await goToTerraformDefinition(index, req);
56
+ if (terraformResult)
57
+ return terraformResult;
58
+ const scssResult = await goToScssDefinition(index, req);
59
+ if (scssResult)
60
+ return scssResult;
46
61
  const context = parsedContext ??
47
62
  (await ensureParsedContext(file, index.parsed?.get(fileIdentityKey(file)), index.languageExtensions));
48
63
  const sup = context.sup;
@@ -50,10 +65,7 @@ export async function goToDefinition(index, req, parsedContext) {
50
65
  const tree = context.tree;
51
66
  if (sup.id === "php")
52
67
  await ensurePhpNamespaceSymbolIndex(index);
53
- const pos = {
54
- row: Math.max(0, line - 1),
55
- column: Math.max(0, column - 1),
56
- };
68
+ const pos = toTreeSitterPosition({ line, column });
57
69
  let node = tree.rootNode.descendantForPosition(pos, pos);
58
70
  // A position at the start of `b` in `a?.b` also touches the end of the `?.` token, which the
59
71
  // parser reports first. The use is the name that starts at the position.
@@ -362,22 +374,7 @@ export async function recoverIncludedCallableStar(index, mod, languageId, name,
362
374
  familyOf.set(key, defs);
363
375
  return defs;
364
376
  };
365
- const parent = functions.map((_, candidateIndex) => candidateIndex);
366
- const find = (start) => {
367
- let current = start;
368
- while (parent[current] !== current) {
369
- const next = parent[current];
370
- parent[current] = parent[next] ?? next;
371
- current = next;
372
- }
373
- return current;
374
- };
375
- const unite = (left, right) => {
376
- const leftRoot = find(left);
377
- const rightRoot = find(right);
378
- if (leftRoot !== rightRoot)
379
- parent[rightRoot] = leftRoot;
380
- };
377
+ const { find, unite } = createUnionFind(functions.length);
381
378
  for (let left = 0; left < functions.length; left += 1) {
382
379
  const defs = await family(functions[left].def);
383
380
  for (let right = left + 1; right < functions.length; right += 1) {
@@ -421,22 +418,90 @@ export async function getCppEquivalentCallableDefinitions(index, def, parsedCont
421
418
  const family = await cppEquivalentCallableFamily(index, def, parsedContext);
422
419
  return [family.definition, ...family.equivalents];
423
420
  }
421
+ /** Adds the requested `line` or `block` context to each reference, parsing each file once. */
422
+ export async function attachReferenceContext(index, refs, opts) {
423
+ if (!opts?.context)
424
+ return;
425
+ const perFileCache = new Map();
426
+ for (const ref of refs) {
427
+ let cached = perFileCache.get(fileIdentityKey(ref.file));
428
+ if (!cached) {
429
+ const parsedEntry = index.parsed?.get(fileIdentityKey(ref.file));
430
+ const parsed = await ensureParsedContext(ref.file, parsedEntry, index.languageExtensions);
431
+ cached = { source: parsed.source, tree: parsed.tree, sup: parsed.sup };
432
+ perFileCache.set(fileIdentityKey(ref.file), cached);
433
+ }
434
+ if (opts.context === "line") {
435
+ const lines = opts.lines ?? DEFAULT_REF_CONTEXT_LINES;
436
+ ref.context = extractLineContext(cached.source, ref.range.start.line, lines);
437
+ }
438
+ else if (opts.context === "block") {
439
+ const maxLines = opts.blockMaxLines ?? 60;
440
+ ref.context = extractEnclosingBlock(cached.source, cached.tree, ref.range, maxLines, cached.sup);
441
+ }
442
+ }
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
+ }
424
460
  async function findReferencesInternal(index, req, opts, collectionMode) {
425
461
  let def = null;
426
462
  let provenance;
427
463
  if ("def" in req) {
428
464
  def = req.def;
429
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
+ }
430
471
  }
431
472
  else {
432
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;
433
477
  const localAtPosition = module?.locals.find((local) => rangeContains(local.range, {
434
478
  row: req.line,
435
479
  column: req.column,
436
480
  }));
437
- 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) {
438
494
  def = localAtPosition;
439
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
+ }
440
505
  }
441
506
  else {
442
507
  const gotoResult = await goToDefinition(index, req);
@@ -462,13 +527,35 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
462
527
  }
463
528
  const maxReferences = typeof opts?.maxReferences === "number" && opts.maxReferences > 0 ? opts.maxReferences : undefined;
464
529
  const sqlReferences = await findSqlReferences(index, def, {
465
- 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",
466
534
  ...(maxReferences === undefined ? {} : { maxReferences }),
467
535
  });
468
536
  if (sqlReferences)
469
537
  return sqlReferences;
538
+ const terraformReferences = await findTerraformReferences(index, def, {
539
+ includeDefinition: collectionMode === "all",
540
+ ...(maxReferences === undefined ? {} : { maxReferences }),
541
+ });
542
+ if (terraformReferences) {
543
+ if (terraformReferences.status === "ok")
544
+ await attachReferenceContext(index, terraformReferences.references, opts);
545
+ return terraformReferences;
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
+ }
470
556
  const definitionFile = def.file;
471
557
  const definitionSiteKey = referenceSiteKey(definitionFile, def.range);
558
+ const explicitNamespaceMemberAliasFiles = new Set();
472
559
  const includeReference = (ref) => {
473
560
  if (collectionMode === "all")
474
561
  return true;
@@ -476,6 +563,10 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
476
563
  return false;
477
564
  if (collectionMode === "usages")
478
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
+ }
479
570
  const binding = ref.via?.import;
480
571
  if (!binding || binding.kind === "star" || binding.kind === "namespace")
481
572
  return true;
@@ -547,6 +638,78 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
547
638
  }
548
639
  const matchesReferenceDefinition = (candidate) => sameDef(candidate, definition, index.languageExtensions) ||
549
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
+ };
550
713
  const exportedNames = [];
551
714
  for (const candidate of [definition, ...equivalentDefinitions]) {
552
715
  const candidateModule = index.byFile.get(fileIdentityKey(candidate.file));
@@ -737,6 +900,61 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
737
900
  }
738
901
  return scopeIndex;
739
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
+ };
740
958
  if (supportForFileWithoutHeaderSample(fileId, index.languageExtensions)?.supportsExportFromReferences) {
741
959
  for (const entry of module.exports) {
742
960
  if (hasReachedCollectionLimit())
@@ -764,7 +982,31 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
764
982
  break;
765
983
  if (cNamespace && imp.kind === "named" && (imp.cNamespace ?? "ordinary") !== cNamespace)
766
984
  continue;
767
- 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
+ }
768
1010
  const bindingSites = importBindingReferenceSites(imp);
769
1011
  let verifiedBindingMatches;
770
1012
  const bindingMatchesDefinition = async () => {
@@ -837,65 +1079,25 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
837
1079
  // Python binds the first segment of an unaliased dotted import, while an alias
838
1080
  // binds the whole module. Other namespaces use their local name directly.
839
1081
  const namespaceSearchName = imp.mechanism === "python" && imp.from.includes(".") && !imp.explicitAlias ? imp.from : imp.localNS;
840
- if (!matchesDef) {
841
- const targetModule = index.byFile.get(fileIdentityKey(targetFile));
842
- if (!targetModule?.exports.some((entry) => entry.type === "namespaceReexport" || entry.type === "exportStar")) {
843
- continue;
844
- }
845
- // 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,
846
1085
  // not as a bare export of the intermediate module. Follow only export-proven
847
1086
  // namespace edges, then verify each use through the same goto resolver.
848
- const namespacePaths = [
849
- { file: targetFile, name: namespaceSearchName, depth: 0 },
850
- ];
851
- for (let pathIndex = 0; pathIndex < namespacePaths.length; pathIndex++) {
852
- if (pathIndex >= MAX_REFERENCE_NAMESPACE_PATHS) {
853
- receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
854
- break;
855
- }
856
- const namespacePath = namespacePaths[pathIndex];
857
- if (namespacePath.depth) {
858
- const nestedHit = resolveExport(index, namespacePath.file, exportedName, {
859
- allowLocalFallback: false,
860
- ...(exportOptions ?? {}),
861
- });
862
- if (nestedHit?.kind === "resolved" && matchesReferenceDefinition(nestedHit.def)) {
863
- const parsed = await ensureCandidateParsed();
864
- const ranges = await collectNamespaceMemberRefs(fileId, namespacePath.name, exportedName, parsed, index.languageExtensions, imp, module.imports, await ensureScope());
865
- for (const range of ranges) {
866
- if (hasReachedCollectionLimit())
867
- break;
868
- const proof = await goToDefinition(index, { file: fileId, line: range.start.line, column: range.start.column }, parsed);
869
- if (proof.status !== "ok" || !matchesReferenceDefinition(proof.definition))
870
- continue;
871
- pushRef({ file: fileId, range, via: { import: imp, namespaceMember: exportedName } });
872
- }
873
- }
874
- }
875
- const exports = resolveModuleExports(index, namespacePath.file, { allowLocalFallback: false });
876
- if (namespacePath.depth >= MAX_REFERENCE_NAMESPACE_DEPTH) {
877
- if ([...exports.values()].some((entry) => entry.kind === "namespace")) {
878
- receiverProofUnavailableFiles.set(fileIdentityKey(fileId), fileId);
879
- }
880
- continue;
881
- }
882
- for (const [alias, entry] of exports) {
883
- if (entry.kind !== "namespace")
884
- continue;
885
- namespacePaths.push({
886
- file: entry.file,
887
- name: `${namespacePath.name}.${alias}`,
888
- depth: namespacePath.depth + 1,
889
- });
890
- }
891
- }
892
- continue;
1087
+ await scanNamespaceMemberPaths(imp, [{ file: targetFile, name: namespaceSearchName, depth: 0 }]);
893
1088
  }
1089
+ if (!matchesDef)
1090
+ continue;
894
1091
  const parsed = await ensureCandidateParsed();
895
1092
  const ranges = await collectNamespaceMemberRefs(fileId, namespaceSearchName, exportedName, parsed, index.languageExtensions, imp, module.imports, await ensureScope());
896
1093
  for (const range of ranges) {
897
1094
  if (hasReachedCollectionLimit())
898
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
+ }
899
1101
  pushRef({
900
1102
  file: fileId,
901
1103
  range,
@@ -994,6 +1196,17 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
994
1196
  continue;
995
1197
  }
996
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
+ }
997
1210
  if (!matchesDef) {
998
1211
  // The requested export slot itself does not exist at all (as opposed to existing
999
1212
  // and structurally naming a different, already-proven definition): the binding may
@@ -1131,6 +1344,38 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1131
1344
  }
1132
1345
  }
1133
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
+ }
1134
1379
  const truncated = maxReferences !== undefined && refs.length > maxReferences;
1135
1380
  if (truncated) {
1136
1381
  refs.length = maxReferences;
@@ -1143,32 +1388,67 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1143
1388
  }
1144
1389
  return left.file.localeCompare(right.file);
1145
1390
  });
1146
- if (opts?.context) {
1147
- const perFileCache = new Map();
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 = [];
1148
1402
  for (const ref of refs) {
1149
- let cached = perFileCache.get(fileIdentityKey(ref.file));
1150
- if (!cached) {
1151
- const parsedEntry = index.parsed?.get(fileIdentityKey(ref.file));
1152
- const parsed = await ensureParsedContext(ref.file, parsedEntry, index.languageExtensions);
1153
- cached = { source: parsed.source, tree: parsed.tree, sup: parsed.sup };
1154
- perFileCache.set(fileIdentityKey(ref.file), cached);
1155
- }
1156
- if (opts.context === "line") {
1157
- const lines = opts.lines ?? DEFAULT_REF_CONTEXT_LINES;
1158
- ref.context = extractLineContext(cached.source, ref.range.start.line, lines);
1403
+ if (referenceSiteKey(ref.file, ref.range) === definitionSiteKey) {
1404
+ kept.push(ref);
1405
+ continue;
1159
1406
  }
1160
- else if (opts.context === "block") {
1161
- const maxLines = opts.blockMaxLines ?? 60;
1162
- ref.context = extractEnclosingBlock(cached.source, cached.tree, ref.range, maxLines, cached.sup);
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;
1163
1419
  }
1420
+ kept.push(ref);
1164
1421
  }
1422
+ refs.length = 0;
1423
+ refs.push(...kept);
1165
1424
  }
1425
+ await attachReferenceContext(index, refs, opts);
1166
1426
  const scannedFiles = [definitionFile, ...candidateFiles, ...receiverScannedFiles];
1167
1427
  // Top-level implicit-unit names and C# partial / Swift shared-owner members are both bounded
1168
1428
  // by the source-unit relation; an unproven boundary leaves their reference set partial.
1169
1429
  const implicitUnitComplete = !definition.isMember && IMPLICIT_UNIT_LANGUAGES[parsedContext.sup.id]
1170
1430
  ? getCompilationUnitPeers(index, definitionFile, parsedContext.sup.id === "csharp" ? { csharpQualifiedName: true } : undefined).complete
1171
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);
1172
1452
  const referenceCoverage = buildIndexedCandidateCoverage({
1173
1453
  index,
1174
1454
  def: definition,
@@ -1193,10 +1473,7 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1193
1473
  ? { implicitUnitPeers: { applicable: true, executed: implicitUnitComplete } }
1194
1474
  : {}),
1195
1475
  }),
1196
- strategyUnavailableFiles: [
1197
- ...receiverProofUnavailableFiles.values(),
1198
- ...(rubyReopen?.incomplete ? [definition.file] : []),
1199
- ],
1476
+ strategyUnavailableFiles,
1200
1477
  });
1201
1478
  return {
1202
1479
  status: "ok",
@@ -1206,11 +1483,43 @@ async function findReferencesInternal(index, req, opts, collectionMode) {
1206
1483
  ...(provenance ? { provenance } : {}),
1207
1484
  };
1208
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
+ }
1209
1521
  function syntaxNodeForDefinition(parsedContext, def) {
1210
- const position = {
1211
- row: def.range.start.line - 1,
1212
- column: def.range.start.column - 1,
1213
- };
1522
+ const position = toTreeSitterPosition(def.range.start);
1214
1523
  return parsedContext.tree.rootNode.descendantForPosition(position, position);
1215
1524
  }
1216
1525
  /**
@@ -1576,6 +1885,7 @@ export async function collectNamespaceMemberRefs(file, ns, member, parsedContext
1576
1885
  // Identifier equality follows the language rule, so C# `@X::@Target` matches alias `X` member `Target`.
1577
1886
  const normalize = sup.normalizeIdentifier;
1578
1887
  const normalizedNs = normalize(ns);
1888
+ const namespaceSegments = normalizedNs.includes(".") ? normalizedNs.split(".") : undefined;
1579
1889
  const normalizedMember = normalize(member);
1580
1890
  let effectivePythonBinding;
1581
1891
  if (sup.id === "python" && importBinding && imports) {
@@ -1599,13 +1909,23 @@ export async function collectNamespaceMemberRefs(file, ns, member, parsedContext
1599
1909
  if (obj && prop && isMemberReferencePropertyIdentifier(sup, prop.type)) {
1600
1910
  const objectName = sliceText(obj, source);
1601
1911
  const propertyName = sliceText(prop, source);
1602
- // A python multi-segment dotted import (`import a.b`) binds only the first segment;
1603
- // the source only ever repeats the whole dotted phrase to reach the resolved leaf
1604
- // module again, so `ns` can be that literal phrase and `obj` a compound chain rather
1605
- // than the single bare identifier every other caller passes.
1606
- const objectMatches = normalizedNs.includes(".")
1607
- ? normalize(objectName) === normalizedNs
1608
- : 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
+ }
1609
1929
  if (objectMatches && normalize(propertyName) === normalizedMember) {
1610
1930
  let receiver = obj;
1611
1931
  while (!isMemberObjectIdentifier(receiver.type) && receiver.namedChildren.length) {