use crate::facet::Facets;
use crate::node::AnyId;
use crate::node::constant::ConstExprNode;
use crate::node::type_::TypeNode;
use alloc::string::String;
use alloc::vec::Vec;
use zerodds_ast_core::{Id, NodeId, Ref};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MemberNode {
pub node_id: NodeId,
pub name: String,
pub type_: Ref<TypeNode>,
pub parent: AnyId,
pub facets: Facets,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CaseLabel {
Value(Id<ConstExprNode>),
Default,
}
impl CaseLabel {
#[must_use]
pub const fn is_default(self) -> bool {
matches!(self, Self::Default)
}
#[must_use]
pub const fn expr(self) -> Option<Id<ConstExprNode>> {
match self {
Self::Value(id) => Some(id),
Self::Default => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CaseNode {
pub node_id: NodeId,
pub labels: Vec<CaseLabel>,
pub member: Id<MemberNode>,
pub parent: Id<TypeNode>,
pub facets: Facets,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnumeratorNode {
pub node_id: NodeId,
pub name: String,
pub value: Option<Id<ConstExprNode>>,
pub parent: Id<TypeNode>,
pub facets: Facets,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BitValueNode {
pub node_id: NodeId,
pub name: String,
pub position: Option<u16>,
pub parent: Id<TypeNode>,
pub facets: Facets,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BitfieldNode {
pub node_id: NodeId,
pub name: Option<String>,
pub bits: u16,
pub holder_type: Option<Ref<TypeNode>>,
pub parent: Id<TypeNode>,
pub facets: Facets,
}
impl BitfieldNode {
#[must_use]
pub const fn is_padding(&self) -> bool {
self.name.is_none()
}
}