use std::rc::Rc;
use pedant_types::ReferenceKind;
use crate::ir::cfg::RustCfgCondition;
use super::range::IrRange;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum ReferenceOrigin {
Import,
ModuleDeclaration,
ExpressionPath,
CallPath,
TypeMention,
MethodCall,
Implementation,
MacroInvocation,
}
#[derive(Debug)]
pub struct ReferenceSite {
pub kind: ReferenceKind,
pub text: Box<str>,
pub range: IrRange,
pub scope: usize,
pub enclosing: Option<usize>,
pub(crate) origin: ReferenceOrigin,
pub(crate) segments: Box<[Box<str>]>,
pub(crate) alias: Option<Box<str>>,
pub(crate) glob: bool,
pub(crate) receiver: Option<Rc<str>>,
pub(crate) condition: RustCfgCondition,
}
impl ReferenceSite {
pub(crate) fn origin(&self) -> ReferenceOrigin {
self.origin
}
pub(crate) fn segments(&self) -> &[Box<str>] {
&self.segments
}
pub(crate) fn alias(&self) -> Option<&str> {
self.alias.as_deref()
}
pub(crate) fn is_glob(&self) -> bool {
self.glob
}
pub(crate) fn receiver(&self) -> Option<&str> {
self.receiver.as_deref()
}
pub(crate) fn condition(&self) -> &RustCfgCondition {
&self.condition
}
}