pub struct RepoGraph {
pub files: Vec<FileNode>,
pub edges: Vec<(u32, u32, u32)>,
pub base_ranks: Vec<f32>,
pub callers: Vec<Vec<u32>>,
pub callees: Vec<Vec<u32>>,
pub def_edges: Vec<(DefId, DefId, u32)>,
pub def_ranks: Vec<f32>,
pub def_callers: Vec<Vec<DefId>>,
pub def_callees: Vec<Vec<DefId>>,
pub def_offsets: Vec<usize>,
pub alpha: f32,
}Expand description
Persisted dependency graph with PageRank scores.
Fields§
§files: Vec<FileNode>Files in the repository with definitions, imports, and calls.
edges: Vec<(u32, u32, u32)>File-level edges (derived from def-level call edges).
base_ranks: Vec<f32>File-level PageRank scores (aggregated from def-level).
callers: Vec<Vec<u32>>File-level callers (indices into files).
callees: Vec<Vec<u32>>File-level callees (indices into files).
def_edges: Vec<(DefId, DefId, u32)>Definition-level call edges: (caller_def, callee_def, weight).
def_ranks: Vec<f32>Definition-level PageRank scores (flattened: offsets[file_idx] + def_idx).
def_callers: Vec<Vec<DefId>>Definition-level callers (flattened, parallel to def_ranks).
def_callees: Vec<Vec<DefId>>Definition-level callees (flattened, parallel to def_ranks).
def_offsets: Vec<usize>Prefix-sum offsets for flattening DefId to linear index.
alpha: f32Auto-tuned alpha for search boost.
Implementations§
Source§impl RepoGraph
impl RepoGraph
Sourcepub fn find_def(&self, file_path: &str, def_name: &str) -> Option<DefId>
pub fn find_def(&self, file_path: &str, def_name: &str) -> Option<DefId>
Look up a definition by file path and name. Returns the first match.
Sourcepub fn resolve_focus_file(&self, focus: &str) -> FocusResolution
pub fn resolve_focus_file(&self, focus: &str) -> FocusResolution
Resolve a caller-supplied focus_file string to a file index in Self::files.
Accepts any of the path forms that ripvec itself emits or accepts:
- Exact stored path (
device_opt/services/storage.py) — direct match. - LSP-shaped path (
./device_opt/services/storage.py) — the./prefix used by everyRepoMapLspLocation::file_pathis stripped before comparison so the documented chaining patternget_repo_map(focus_file=hits[0].lsp_location.file_path)works. - Strict suffix (
storage.py,services/storage.py) — match when the previous character in the stored path is/. Avoids matchingfoo_storage.pyforstorage.py.
Returns FocusResolution::Found when exactly one file matches,
FocusResolution::Ambiguous when multiple files match (the caller
surfaces the candidate list to the user), and FocusResolution::NotFound
when no file matches.
§Background
Prior to this helper the MCP layer (crates/ripvec-mcp/src/tools.rs)
did the matching inline with two bugs:
./prefix mismatch.RepoMapLspLocation::file_pathalways carries a leading./(see [file_lsp_location]), butFileNode::pathdoes not. Passing the LSP location verbatim asfocus_filematched zero files. The matcher silently returnedfocus = None, producing rank values bit-identical to the unfocused call — the bug originally reported as “I#20 focus_file rebias invisible on Python”.- Equal-length false negative. When the user passed
./device_opt/services/storage.pyand the stored path wasdevice_opt/services/storage.py,exactwas false (the strings differ by two bytes) andstrict_suffixwas false (the focus is longer than the stored path, sop.len() > focus.len()fails). The pathology surfaced specifically when the focus was a full path with the LSP./prefix.
Centralising the resolution here gives every caller the same normalization-tolerant semantics and one place to test the contract.
Trait Implementations§
Source§impl Archive for RepoGraph
impl Archive for RepoGraph
Source§const COPY_OPTIMIZATION: CopyOptimization<Self>
const COPY_OPTIMIZATION: CopyOptimization<Self>
serialize. Read moreSource§type Archived = ArchivedRepoGraph
type Archived = ArchivedRepoGraph
Source§type Resolver = RepoGraphResolver
type Resolver = RepoGraphResolver
Source§impl<__D: Fallible + ?Sized> Deserialize<RepoGraph, __D> for Archived<RepoGraph>where
Vec<FileNode>: Archive,
<Vec<FileNode> as Archive>::Archived: Deserialize<Vec<FileNode>, __D>,
Vec<(u32, u32, u32)>: Archive,
<Vec<(u32, u32, u32)> as Archive>::Archived: Deserialize<Vec<(u32, u32, u32)>, __D>,
Vec<f32>: Archive,
<Vec<f32> as Archive>::Archived: Deserialize<Vec<f32>, __D>,
Vec<Vec<u32>>: Archive,
<Vec<Vec<u32>> as Archive>::Archived: Deserialize<Vec<Vec<u32>>, __D>,
Vec<(DefId, DefId, u32)>: Archive,
<Vec<(DefId, DefId, u32)> as Archive>::Archived: Deserialize<Vec<(DefId, DefId, u32)>, __D>,
Vec<Vec<DefId>>: Archive,
<Vec<Vec<DefId>> as Archive>::Archived: Deserialize<Vec<Vec<DefId>>, __D>,
Vec<usize>: Archive,
<Vec<usize> as Archive>::Archived: Deserialize<Vec<usize>, __D>,
f32: Archive,
<f32 as Archive>::Archived: Deserialize<f32, __D>,
impl<__D: Fallible + ?Sized> Deserialize<RepoGraph, __D> for Archived<RepoGraph>where
Vec<FileNode>: Archive,
<Vec<FileNode> as Archive>::Archived: Deserialize<Vec<FileNode>, __D>,
Vec<(u32, u32, u32)>: Archive,
<Vec<(u32, u32, u32)> as Archive>::Archived: Deserialize<Vec<(u32, u32, u32)>, __D>,
Vec<f32>: Archive,
<Vec<f32> as Archive>::Archived: Deserialize<Vec<f32>, __D>,
Vec<Vec<u32>>: Archive,
<Vec<Vec<u32>> as Archive>::Archived: Deserialize<Vec<Vec<u32>>, __D>,
Vec<(DefId, DefId, u32)>: Archive,
<Vec<(DefId, DefId, u32)> as Archive>::Archived: Deserialize<Vec<(DefId, DefId, u32)>, __D>,
Vec<Vec<DefId>>: Archive,
<Vec<Vec<DefId>> as Archive>::Archived: Deserialize<Vec<Vec<DefId>>, __D>,
Vec<usize>: Archive,
<Vec<usize> as Archive>::Archived: Deserialize<Vec<usize>, __D>,
f32: Archive,
<f32 as Archive>::Archived: Deserialize<f32, __D>,
Auto Trait Implementations§
impl Freeze for RepoGraph
impl RefUnwindSafe for RepoGraph
impl Send for RepoGraph
impl Sync for RepoGraph
impl Unpin for RepoGraph
impl UnsafeUnpin for RepoGraph
impl UnwindSafe for RepoGraph
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> ArchiveUnsized for Twhere
T: Archive,
impl<T> ArchiveUnsized for Twhere
T: Archive,
Source§type Archived = <T as Archive>::Archived
type Archived = <T as Archive>::Archived
Archive, it may be
unsized. Read moreSource§fn archived_metadata(
&self,
) -> <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata
fn archived_metadata( &self, ) -> <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.