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<u32>,
}
#[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<u32>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MacroKind {
Normal,
Environment,
NonCapture,
}
#[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<u32>,
}
impl NamePathNode {
pub fn new<I>(names: I) -> Self
where
I: IntoIterator<Item = IdentifierNode>,
{
let names: Vec<IdentifierNode> = names.into_iter().collect();
let start = names.iter().map(|s| s.span.start).min().unwrap_or(0);
let end = names.iter().map(|n| n.span.end).max().unwrap_or(0);
Self { names, span: start..end }
}
pub fn join<I: IntoIterator<Item = IdentifierNode>>(mut self, other: I) -> Self {
self.names.extend(other);
self
}
}
impl MacroPathNode {
pub fn new(path: NamePathNode, names: Vec<IdentifierNode>, span: Range<u32>) -> Self {
Self { path, names, span }
}
}
impl IdentifierNode {
pub fn new<S: ToString>(s: S, span: Range<u32>) -> Self {
Self { name: s.to_string(), span }
}
pub fn is_normal(&self) -> bool {
self.name.starts_with(|c: char| c.is_ascii_lowercase())
}
}