use super::index::{def_files, GraphIndex, InboundEntry};
use super::ts_edges::TsKinds;
#[derive(Debug, Clone, Default)]
pub struct SymbolRefs {
pub inbound_inherits: Vec<usize>,
pub inbound_uses_type: Vec<usize>,
pub inbound_uses_member: Vec<usize>,
pub inbound_implements: Vec<usize>,
pub inbound_overrides: Vec<usize>,
pub outbound_inherits: Vec<usize>,
pub outbound_uses_type: Vec<usize>,
pub outbound_uses_member: Vec<usize>,
pub outbound_implements: Vec<usize>,
pub outbound_overrides: Vec<usize>,
pub outbound_imports: Vec<usize>,
pub heuristic_inbound_inherits: Vec<usize>,
pub heuristic_inbound_uses_type: Vec<usize>,
pub heuristic_inbound_uses_member: Vec<usize>,
pub heuristic_outbound_inherits: Vec<usize>,
pub heuristic_outbound_uses_type: Vec<usize>,
pub heuristic_outbound_uses_member: Vec<usize>,
pub ambiguous_inbound: Vec<usize>,
pub ambiguous_outbound: Vec<usize>,
pub inbound_ts: TsKinds,
pub outbound_ts: TsKinds,
}
pub fn symbol_refs(index: &GraphIndex, def_id: &str) -> SymbolRefs {
let empty = InboundEntry::default();
let base = index.inbound.get(def_id).unwrap_or(&empty);
let inbound_inherits = base.inherits.clone();
let inbound_uses_type = base.uses_type.clone();
let mut inbound_uses_member = base.uses_member.clone();
let inbound_implements = base.implements.clone();
let inbound_overrides = base.overrides.clone();
let inbound_ts = base.ts.clone();
if let Some(&i) = index.by_id.get(def_id) {
if index.graph.defs[i].kind == "enum" {
let prefix = format!("{def_id}.");
for d in &index.graph.defs {
if d.kind != "enum-member" || !d.id.starts_with(&prefix) {
continue;
}
if let Some(m) = index.inbound.get(&d.id) {
inbound_uses_member.extend(m.uses_member.iter().copied());
}
}
}
}
let mut outbound_inherits = Vec::new();
let mut outbound_uses_type = Vec::new();
let mut outbound_uses_member = Vec::new();
let mut outbound_implements = Vec::new();
let mut outbound_overrides = Vec::new();
let mut outbound_imports = Vec::new();
let mut outbound_ts = TsKinds::default();
for file in def_files(index, def_id) {
if let Some(o) = index.outbound_by_file.get(&file) {
outbound_ts.extend_from(&o.ts);
outbound_inherits.extend(o.inherits.iter().copied());
outbound_uses_type.extend(o.uses_type.iter().copied());
outbound_uses_member.extend(o.uses_member.iter().copied());
outbound_implements.extend(o.implements.iter().copied());
outbound_overrides.extend(o.overrides.iter().copied());
outbound_imports.extend(o.imports.iter().copied());
}
}
let heuristic_base = index.heuristic_inbound.get(def_id).unwrap_or(&empty);
let heuristic_inbound_inherits = heuristic_base.inherits.clone();
let heuristic_inbound_uses_type = heuristic_base.uses_type.clone();
let mut heuristic_inbound_uses_member = heuristic_base.uses_member.clone();
if let Some(&i) = index.by_id.get(def_id) {
if index.graph.defs[i].kind == "enum" {
let prefix = format!("{def_id}.");
for d in &index.graph.defs {
if d.kind != "enum-member" || !d.id.starts_with(&prefix) {
continue;
}
if let Some(m) = index.heuristic_inbound.get(&d.id) {
heuristic_inbound_uses_member.extend(m.uses_member.iter().copied());
}
}
}
}
let mut heuristic_outbound_inherits = Vec::new();
let mut heuristic_outbound_uses_type = Vec::new();
let mut heuristic_outbound_uses_member = Vec::new();
for file in def_files(index, def_id) {
if let Some(o) = index.heuristic_outbound_by_file.get(&file) {
heuristic_outbound_inherits.extend(o.inherits.iter().copied());
heuristic_outbound_uses_type.extend(o.uses_type.iter().copied());
heuristic_outbound_uses_member.extend(o.uses_member.iter().copied());
}
}
let ambiguous_inbound = index
.ambiguous_by_candidate
.get(def_id)
.cloned()
.unwrap_or_default();
let ambiguous_outbound: Vec<usize> = def_files(index, def_id)
.iter()
.flat_map(|f| index.ambiguous_by_file.get(f).cloned().unwrap_or_default())
.collect();
SymbolRefs {
inbound_inherits,
inbound_uses_type,
inbound_uses_member,
inbound_implements,
inbound_overrides,
outbound_inherits,
outbound_uses_type,
outbound_uses_member,
outbound_implements,
outbound_overrides,
outbound_imports,
heuristic_inbound_inherits,
heuristic_inbound_uses_type,
heuristic_inbound_uses_member,
heuristic_outbound_inherits,
heuristic_outbound_uses_type,
heuristic_outbound_uses_member,
ambiguous_inbound,
ambiguous_outbound,
inbound_ts,
outbound_ts,
}
}