pub mod repomap;
pub mod storage;
pub mod types;
use anyhow::Result;
pub use types::{
CallEdge, CallGraphNode, Definition, DefinitionResult, PrecisionLevel, Reference,
ReferenceKind, ReferenceResult, SymbolId, SymbolInfo, SymbolKind, Visibility,
};
use crate::rag::indexer::FileInfo;
use std::collections::HashMap;
pub trait RelationsProvider: Send + Sync {
fn extract_definitions(&self, file_info: &FileInfo) -> Result<Vec<Definition>>;
fn extract_references(
&self,
file_info: &FileInfo,
symbol_index: &HashMap<String, Vec<Definition>>,
) -> Result<Vec<Reference>>;
fn supports_language(&self, language: &str) -> bool;
fn precision_level(&self, language: &str) -> PrecisionLevel;
}
pub struct HybridRelationsProvider {
repomap: repomap::RepoMapProvider,
}
impl HybridRelationsProvider {
pub fn new() -> Result<Self> {
Ok(Self {
repomap: repomap::RepoMapProvider::new(),
})
}
}
impl RelationsProvider for HybridRelationsProvider {
fn extract_definitions(&self, file_info: &FileInfo) -> Result<Vec<Definition>> {
self.repomap.extract_definitions(file_info)
}
fn extract_references(
&self,
file_info: &FileInfo,
symbol_index: &HashMap<String, Vec<Definition>>,
) -> Result<Vec<Reference>> {
self.repomap.extract_references(file_info, symbol_index)
}
fn supports_language(&self, language: &str) -> bool {
self.repomap.supports_language(language)
}
fn precision_level(&self, language: &str) -> PrecisionLevel {
self.repomap.precision_level(language)
}
}
#[derive(Debug, Clone)]
pub struct RelationsConfig {
pub enabled: bool,
pub max_call_depth: usize,
}
impl Default for RelationsConfig {
fn default() -> Self {
Self {
enabled: true,
max_call_depth: 3,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hybrid_provider_creation() {
let provider = HybridRelationsProvider::new().unwrap();
assert!(provider.supports_language("Rust"));
assert!(provider.supports_language("Python"));
assert!(provider.supports_language("Unknown"));
}
#[test]
fn test_precision_level() {
let provider = HybridRelationsProvider::new().unwrap();
assert_eq!(provider.precision_level("Rust"), PrecisionLevel::Medium);
assert_eq!(provider.precision_level("Python"), PrecisionLevel::Medium);
}
#[test]
fn test_relations_config_default() {
let config = RelationsConfig::default();
assert!(config.enabled);
assert_eq!(config.max_call_depth, 3);
}
}