pub mod extractor;
pub mod hits;
pub mod inverted;
pub mod resolver;
pub mod syntax;
use crate::graph_support::CppSource;
use brokk_bifrost_core::analyzer::capabilities::{TypeAliasProvider, TypeHierarchyProvider};
use brokk_bifrost_core::analyzer::model::{CppFieldLinkage, SignatureMetadata};
use brokk_bifrost_core::analyzer::{CodeUnit, CodeUnitIndex, ProjectFile, Range};
use std::collections::BTreeSet;
pub trait CppWorkspaceSource {
fn import_statements(&self, file: &ProjectFile) -> Vec<String>;
fn definitions_by_fqn(&self, fqn: &str) -> Vec<&CodeUnit>;
}
#[derive(Clone, Copy)]
pub struct CppWorkspaceDefinitions<'a>(&'a dyn CppWorkspaceSource);
impl<'a> CppWorkspaceDefinitions<'a> {
pub fn fqn(&self, fqn: &str) -> Vec<&'a CodeUnit> {
self.0.definitions_by_fqn(fqn)
}
}
#[derive(Clone, Copy)]
pub struct CppGraphSource<'a> {
pub index: &'a dyn CodeUnitIndex,
pub cpp: Option<&'a dyn CppSource>,
pub aliases: Option<&'a dyn TypeAliasProvider>,
pub hierarchy: Option<&'a dyn TypeHierarchyProvider>,
pub workspace: &'a dyn CppWorkspaceSource,
}
impl<'a> CppGraphSource<'a> {
pub fn from_source(source: &'a dyn CppSource) -> Self {
Self {
index: source,
cpp: Some(source),
aliases: Some(source),
hierarchy: Some(source),
workspace: source,
}
}
pub fn type_alias_provider(&self) -> Option<&'a dyn TypeAliasProvider> {
self.aliases
}
pub fn type_hierarchy_provider(&self) -> Option<&'a dyn TypeHierarchyProvider> {
self.hierarchy
}
pub fn import_statements(&self, file: &ProjectFile) -> Vec<String> {
self.workspace.import_statements(file)
}
pub fn global_usage_definition_index(&self) -> CppWorkspaceDefinitions<'a> {
CppWorkspaceDefinitions(self.workspace)
}
pub fn parent_of(&self, code_unit: &CodeUnit) -> Option<CodeUnit> {
self.index.parent_of(code_unit)
}
pub fn ranges(&self, code_unit: &CodeUnit) -> Vec<Range> {
self.index.ranges(code_unit)
}
pub fn enclosing_code_unit(&self, file: &ProjectFile, range: &Range) -> Option<CodeUnit> {
self.index.enclosing_code_unit(file, range)
}
pub fn signature_metadata(&self, code_unit: &CodeUnit) -> Vec<SignatureMetadata> {
self.index.signature_metadata(code_unit)
}
pub fn cpp_field_linkage(&self, code_unit: &CodeUnit) -> Option<CppFieldLinkage> {
self.cpp?.cpp_field_linkage(code_unit)
}
pub fn signatures(&self, code_unit: &CodeUnit) -> Vec<String> {
self.index.signatures(code_unit)
}
pub fn get_source(&self, code_unit: &CodeUnit, include_comments: bool) -> Option<String> {
self.index.get_source(code_unit, include_comments)
}
pub fn indexed_source(&self, file: &ProjectFile) -> Option<String> {
self.index.indexed_source(file)
}
pub fn declarations(&self, file: &ProjectFile) -> BTreeSet<CodeUnit> {
self.index.declarations(file)
}
pub fn direct_children(&self, code_unit: &CodeUnit) -> Vec<CodeUnit> {
self.index.direct_children(code_unit)
}
pub fn definitions(&self, fq_name: &str) -> Box<dyn Iterator<Item = CodeUnit> + '_> {
self.index.definitions(fq_name)
}
}
pub fn callable_definitions_share_identity_evidence(
analyzer: &CppGraphSource<'_>,
left: &CodeUnit,
right: &CodeUnit,
) -> bool {
crate::identity::cpp_callable_definitions_share_identity_evidence(
analyzer.index,
left,
right,
|left_source, right_source| {
let Some(implementation) =
crate::identity::cpp_header_body_implementation_file(left_source, right_source)
else {
return false;
};
let Some(cpp) = analyzer.cpp else {
return false;
};
crate::identity::cpp_header_body_files_are_related(
left_source,
right_source,
&analyzer.import_statements(implementation),
cpp.include_target_index(),
)
},
)
}