#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct SymbolFact {
pub file: String,
pub name: String,
pub kind: String,
pub line: u32,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ImportFact {
pub from_file: String,
pub module_specifier: String,
pub name: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct CallFact {
pub caller_file: String,
pub caller_name: String,
pub callee_name: String,
pub line: u32,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct VisibilityFact {
pub file: String,
pub name: String,
pub visibility: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct AttributeFact {
pub file: String,
pub name: String,
pub attribute: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ParentFact {
pub file: String,
pub child_name: String,
pub parent_name: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct QualifierFact {
pub caller_file: String,
pub caller_name: String,
pub callee_name: String,
pub qualifier: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct SymbolRangeFact {
pub file: String,
pub name: String,
pub start_line: u32,
pub end_line: u32,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ImplementsFact {
pub file: String,
pub name: String,
pub interface: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct IsImplFact {
pub file: String,
pub name: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct TypeMethodFact {
pub file: String,
pub type_name: String,
pub method_name: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ResolvedImportFact {
pub from_file: String,
pub to_file: String,
pub imported_name: String,
pub local_alias: String,
pub kind: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ModuleFact {
pub file: String,
pub canonical_module_path: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ExportFact {
pub file: String,
pub name: String,
pub kind: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ReexportFact {
pub from_file: String,
pub original_file: String,
pub original_name: String,
pub exported_as: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct SymbolUseFact {
pub file: String,
pub name: String,
pub line: u32,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ResolvedReferenceFact {
pub use_file: String,
pub use_line: u32,
pub def_file: String,
pub def_name: String,
pub def_kind: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ResolvedCallFact {
pub caller_file: String,
pub caller_name: String,
pub callee_file: String,
pub callee_name: String,
pub line: u32,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct ModuleSearchPathFact {
pub workspace_root: String,
pub language: String,
pub kind: String,
pub path: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct CfgBlockFact {
pub file: String,
pub func: String,
pub func_line: u32,
pub block: u32,
pub kind: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct CfgEdgeFact {
pub file: String,
pub func: String,
pub func_line: u32,
pub from: u32,
pub to: u32,
pub kind: String,
pub exception_type: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct CfgDefFact {
pub file: String,
pub func: String,
pub func_line: u32,
pub block: u32,
pub name: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct CfgUseFact {
pub file: String,
pub func: String,
pub func_line: u32,
pub block: u32,
pub name: String,
}
#[derive(Clone, Debug, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct CfgEffectFact {
pub file: String,
pub func: String,
pub func_line: u32,
pub block: u32,
pub kind: String,
pub line: u32,
pub label: String,
}
#[derive(Clone, Debug, Default, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
#[rkyv(derive(Debug))]
pub struct Relations {
pub symbols: Vec<SymbolFact>,
pub imports: Vec<ImportFact>,
pub calls: Vec<CallFact>,
pub visibilities: Vec<VisibilityFact>,
pub attributes: Vec<AttributeFact>,
pub parents: Vec<ParentFact>,
pub qualifiers: Vec<QualifierFact>,
pub symbol_ranges: Vec<SymbolRangeFact>,
pub implements: Vec<ImplementsFact>,
pub is_impls: Vec<IsImplFact>,
pub type_methods: Vec<TypeMethodFact>,
pub resolved_imports: Vec<ResolvedImportFact>,
pub modules: Vec<ModuleFact>,
pub exports: Vec<ExportFact>,
pub reexports: Vec<ReexportFact>,
pub symbol_uses: Vec<SymbolUseFact>,
pub resolved_references: Vec<ResolvedReferenceFact>,
pub resolved_calls: Vec<ResolvedCallFact>,
pub module_search_paths: Vec<ModuleSearchPathFact>,
pub cfg_blocks: Vec<CfgBlockFact>,
pub cfg_edges: Vec<CfgEdgeFact>,
pub cfg_defs: Vec<CfgDefFact>,
pub cfg_uses: Vec<CfgUseFact>,
pub cfg_effects: Vec<CfgEffectFact>,
}
impl Relations {
pub fn new() -> Self {
Self::default()
}
pub fn add_symbol(&mut self, file: &str, name: &str, kind: &str, line: u32) {
self.symbols.push(SymbolFact {
file: file.into(),
name: name.into(),
kind: kind.into(),
line,
});
}
pub fn add_import(&mut self, from_file: &str, to_module: &str, name: &str) {
self.imports.push(ImportFact {
from_file: from_file.into(),
module_specifier: to_module.into(),
name: name.into(),
});
}
pub fn add_call(&mut self, caller_file: &str, caller_name: &str, callee_name: &str, line: u32) {
self.calls.push(CallFact {
caller_file: caller_file.into(),
caller_name: caller_name.into(),
callee_name: callee_name.into(),
line,
});
}
pub fn add_visibility(&mut self, file: &str, name: &str, visibility: &str) {
self.visibilities.push(VisibilityFact {
file: file.into(),
name: name.into(),
visibility: visibility.into(),
});
}
pub fn add_attribute(&mut self, file: &str, name: &str, attribute: &str) {
self.attributes.push(AttributeFact {
file: file.into(),
name: name.into(),
attribute: attribute.into(),
});
}
pub fn add_parent(&mut self, file: &str, child_name: &str, parent_name: &str) {
self.parents.push(ParentFact {
file: file.into(),
child_name: child_name.into(),
parent_name: parent_name.into(),
});
}
pub fn add_qualifier(
&mut self,
caller_file: &str,
caller_name: &str,
callee_name: &str,
qualifier: &str,
) {
self.qualifiers.push(QualifierFact {
caller_file: caller_file.into(),
caller_name: caller_name.into(),
callee_name: callee_name.into(),
qualifier: qualifier.into(),
});
}
pub fn add_symbol_range(&mut self, file: &str, name: &str, start_line: u32, end_line: u32) {
self.symbol_ranges.push(SymbolRangeFact {
file: file.into(),
name: name.into(),
start_line,
end_line,
});
}
pub fn add_implements(&mut self, file: &str, name: &str, interface: &str) {
self.implements.push(ImplementsFact {
file: file.into(),
name: name.into(),
interface: interface.into(),
});
}
pub fn add_is_impl(&mut self, file: &str, name: &str) {
self.is_impls.push(IsImplFact {
file: file.into(),
name: name.into(),
});
}
pub fn add_type_method(&mut self, file: &str, type_name: &str, method_name: &str) {
self.type_methods.push(TypeMethodFact {
file: file.into(),
type_name: type_name.into(),
method_name: method_name.into(),
});
}
pub fn add_resolved_import(
&mut self,
from_file: &str,
to_file: &str,
imported_name: &str,
local_alias: &str,
kind: &str,
) {
self.resolved_imports.push(ResolvedImportFact {
from_file: from_file.into(),
to_file: to_file.into(),
imported_name: imported_name.into(),
local_alias: local_alias.into(),
kind: kind.into(),
});
}
pub fn add_module(&mut self, file: &str, canonical_module_path: &str) {
self.modules.push(ModuleFact {
file: file.into(),
canonical_module_path: canonical_module_path.into(),
});
}
pub fn add_export(&mut self, file: &str, name: &str, kind: &str) {
self.exports.push(ExportFact {
file: file.into(),
name: name.into(),
kind: kind.into(),
});
}
pub fn add_reexport(
&mut self,
from_file: &str,
original_file: &str,
original_name: &str,
exported_as: &str,
) {
self.reexports.push(ReexportFact {
from_file: from_file.into(),
original_file: original_file.into(),
original_name: original_name.into(),
exported_as: exported_as.into(),
});
}
pub fn add_symbol_use(&mut self, file: &str, name: &str, line: u32) {
self.symbol_uses.push(SymbolUseFact {
file: file.into(),
name: name.into(),
line,
});
}
pub fn add_resolved_reference(
&mut self,
use_file: &str,
use_line: u32,
def_file: &str,
def_name: &str,
def_kind: &str,
) {
self.resolved_references.push(ResolvedReferenceFact {
use_file: use_file.into(),
use_line,
def_file: def_file.into(),
def_name: def_name.into(),
def_kind: def_kind.into(),
});
}
pub fn add_resolved_call(
&mut self,
caller_file: &str,
caller_name: &str,
callee_file: &str,
callee_name: &str,
line: u32,
) {
self.resolved_calls.push(ResolvedCallFact {
caller_file: caller_file.into(),
caller_name: caller_name.into(),
callee_file: callee_file.into(),
callee_name: callee_name.into(),
line,
});
}
pub fn add_module_search_path(
&mut self,
workspace_root: &str,
language: &str,
kind: &str,
path: &str,
) {
self.module_search_paths.push(ModuleSearchPathFact {
workspace_root: workspace_root.into(),
language: language.into(),
kind: kind.into(),
path: path.into(),
});
}
pub fn add_cfg_block(
&mut self,
file: &str,
func: &str,
func_line: u32,
block: u32,
kind: &str,
) {
self.cfg_blocks.push(CfgBlockFact {
file: file.into(),
func: func.into(),
func_line,
block,
kind: kind.into(),
});
}
#[allow(clippy::too_many_arguments)]
pub fn add_cfg_edge(
&mut self,
file: &str,
func: &str,
func_line: u32,
from: u32,
to: u32,
kind: &str,
exception_type: &str,
) {
self.cfg_edges.push(CfgEdgeFact {
file: file.into(),
func: func.into(),
func_line,
from,
to,
kind: kind.into(),
exception_type: exception_type.into(),
});
}
pub fn add_cfg_def(&mut self, file: &str, func: &str, func_line: u32, block: u32, name: &str) {
self.cfg_defs.push(CfgDefFact {
file: file.into(),
func: func.into(),
func_line,
block,
name: name.into(),
});
}
pub fn add_cfg_use(&mut self, file: &str, func: &str, func_line: u32, block: u32, name: &str) {
self.cfg_uses.push(CfgUseFact {
file: file.into(),
func: func.into(),
func_line,
block,
name: name.into(),
});
}
#[allow(clippy::too_many_arguments)]
pub fn add_cfg_effect(
&mut self,
file: &str,
func: &str,
func_line: u32,
block: u32,
kind: &str,
line: u32,
label: &str,
) {
self.cfg_effects.push(CfgEffectFact {
file: file.into(),
func: func.into(),
func_line,
block,
kind: kind.into(),
line,
label: label.into(),
});
}
}