use super::{AstNodeId, KindTest, QName, SourceSpan};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TypeExprKind {
InstanceOf,
TreatAs,
CastAs,
CastableAs,
}
#[derive(Debug, Clone)]
pub struct TypeExprNode {
pub kind: TypeExprKind,
pub operand: AstNodeId,
pub target_type: SequenceTypeNode,
pub span: SourceSpan,
pub resolved_atomic_type: Option<crate::namespace::qname::QualifiedName>,
}
impl TypeExprNode {
pub fn new(
kind: TypeExprKind,
operand: AstNodeId,
target_type: SequenceTypeNode,
span: SourceSpan,
) -> Self {
Self {
kind,
operand,
target_type,
span,
resolved_atomic_type: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum OccurrenceIndicator {
#[default]
One,
ZeroOrOne,
ZeroOrMore,
OneOrMore,
}
#[derive(Debug, Clone)]
pub struct SequenceTypeNode {
pub item_type: Option<ItemTypeNode>,
pub occurrence: OccurrenceIndicator,
pub span: SourceSpan,
}
impl SequenceTypeNode {
pub fn empty(span: SourceSpan) -> Self {
Self {
item_type: None,
occurrence: OccurrenceIndicator::One,
span,
}
}
pub fn single(
item_type: ItemTypeNode,
occurrence: OccurrenceIndicator,
span: SourceSpan,
) -> Self {
Self {
item_type: Some(item_type),
occurrence,
span,
}
}
}
#[derive(Debug, Clone)]
pub enum ItemTypeNode {
Item,
Atomic(QName),
Kind(KindTest),
}