use crate::Compiler::AST::{Expression, Position};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum QualifiedIdentifierType {
Unknown,
LocalEnumAccess,
ImportedEnumAccess,
ImportedFunctionCall,
StaticObjectAccess,
ObjectPropertyAccess,
NamespaceEnumReference,
}
impl std::fmt::Display for QualifiedIdentifierType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
QualifiedIdentifierType::Unknown => write!(f, "Unknown"),
QualifiedIdentifierType::LocalEnumAccess => write!(f, "LocalEnumAccess"),
QualifiedIdentifierType::ImportedEnumAccess => write!(f, "ImportedEnumAccess"),
QualifiedIdentifierType::ImportedFunctionCall => write!(f, "ImportedFunctionCall"),
QualifiedIdentifierType::StaticObjectAccess => write!(f, "StaticObjectAccess"),
QualifiedIdentifierType::ObjectPropertyAccess => write!(f, "ObjectPropertyAccess"),
QualifiedIdentifierType::NamespaceEnumReference => write!(f, "NamespaceEnumReference"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct QualifiedIdentifierKey {
pub position: Position,
pub parts: Vec<String>,
pub is_call: bool,
}
impl QualifiedIdentifierKey {
pub fn from_qualified_identifier(expr: &Expression) -> Option<Self> {
if let Expression::QualifiedIdentifier { parts, arguments, position } = expr {
Some(QualifiedIdentifierKey {
position: *position,
parts: parts.clone(),
is_call: arguments.is_some(),
})
} else {
None
}
}
}
#[derive(Debug, Clone)]
pub struct QualifiedIdentifierResolution {
pub resolved_type: QualifiedIdentifierType,
pub context: Option<String>,
pub parts: Vec<String>,
pub is_call: bool,
pub position: Position,
}
impl QualifiedIdentifierResolution {
pub fn new(
resolved_type: QualifiedIdentifierType,
context: Option<String>,
parts: Vec<String>,
is_call: bool,
position: Position,
) -> Self {
QualifiedIdentifierResolution {
resolved_type,
context,
parts,
is_call,
position,
}
}
pub fn from_expression(
expr: &Expression,
resolved_type: QualifiedIdentifierType,
context: Option<String>,
) -> Option<Self> {
if let Expression::QualifiedIdentifier { parts, arguments, position } = expr {
Some(QualifiedIdentifierResolution {
resolved_type,
context,
parts: parts.clone(),
is_call: arguments.is_some(),
position: *position,
})
} else {
None
}
}
}
impl std::fmt::Display for QualifiedIdentifierResolution {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let parts = self.parts.join(".");
let call_suffix = if self.is_call { "()" } else { "" };
let context_str = self.context.as_ref()
.map(|c| format!(" [{}]", c))
.unwrap_or_default();
write!(f, "{}{} → {}{}", parts, call_suffix, self.resolved_type, context_str)
}
}