test+feat: add cargo workspace crate resolution for rust resolver (#151)

* test+feat: add cargo workspace crate resolution for rust resolver

Agent-Logs-Url: https://github.com/miketheman/codegraph/sessions/0101633b-8b63-4951-a6ca-03efe7fafe0b

Co-authored-by: miketheman <529516+miketheman@users.noreply.github.com>

* perf: cache cargo workspace map during rust resolution

Agent-Logs-Url: https://github.com/miketheman/codegraph/sessions/0101633b-8b63-4951-a6ca-03efe7fafe0b

Co-authored-by: miketheman <529516+miketheman@users.noreply.github.com>

* feat(rust): expand cargo workspace member globs and trust workspace hits

- Parse glob entries in `[workspace].members` (e.g. `crates/*`,
  `helix-*`) via picomatch against a new optional
  `ResolutionContext.listDirectories` so workspaces that don't
  enumerate every member are covered. Implementation walks the
  static-prefix subtree with a depth cap and skips `target`,
  `node_modules`, `.git`, etc.
- Bump Pattern 4's confidence to 0.95 when the workspace map
  produces a hit. The cargo manifest gives an unambiguous
  crate-name -> crate-root mapping, so workspace-driven module
  resolution should beat name-matcher's self-file matches
  (otherwise every file with `use foo::...` self-resolves at 0.7
  and the cross-crate edge never materializes).
- Validated against astral-sh/uv (`members = ["crates/*"]`,
  67 crates, 567 .rs files): 1,969 cross-crate `imports` edges
  reaching 60 distinct member lib.rs files, up from 0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Colby McHenry <me@colbymchenry.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Mike Fiedler
2026-05-12 13:25:14 -05:00
committed by GitHub
co-authored by Claude Opus 4.7 copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Colby McHenry
parent 1cbd5a8123
commit 6ac2066a7a
5 changed files with 619 additions and 18 deletions
+18
View File
@@ -257,6 +257,24 @@ export class ReferenceResolver {
return this.queries.getAllFilePaths();
},
listDirectories: (relativePath: string) => {
const target = relativePath === '.' || relativePath === ''
? this.projectRoot
: path.join(this.projectRoot, relativePath);
try {
return fs
.readdirSync(target, { withFileTypes: true })
.filter((entry) => entry.isDirectory())
.map((entry) => entry.name);
} catch (error) {
logDebug('Failed to list directory for resolution', {
relativePath,
error: String(error),
});
return [];
}
},
getNodesByLowerName: (lowerName: string) => {
const cached = this.lowerNameCache.get(lowerName);
if (cached !== undefined) return cached;