use super::*;
mod display;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IdentifierNode {
pub name: String,
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NamePathNode {
pub names: Vec<IdentifierNode>,
pub span: Range<usize>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MacroKind {
Normal,
Environment,
Dict,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MacroPathNode {
pub path: NamePathNode,
pub names: Vec<IdentifierNode>,
pub span: Range<usize>,
}
impl NamePathNode {
pub fn new<I>(names: I, range: Range<usize>) -> Self
where
I: IntoIterator<Item = IdentifierNode>,
{
Self { names: names.into_iter().collect(), span: range }
}
}
impl MacroPathNode {
pub fn new(path: NamePathNode, names: Vec<IdentifierNode>, range: Range<usize>) -> Self {
Self { path, names, span: range }
}
}
impl IdentifierNode {
pub fn new<S: ToString>(s: S, range: Range<usize>) -> Self {
Self { name: s.to_string(), span: range }
}
pub fn is_normal(&self) -> bool {
self.name.starts_with(|c: char| c.is_ascii_lowercase())
}
}