use super::*;
#[cfg(feature = "pretty-print")]
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(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LambdaSlotNode {
pub name: String,
pub span: Range<u32>,
}
impl LambdaSlotNode {
pub fn new<S>(name: S, span: Range<u32>) -> Self
where
S: ToString,
{
Self { name: name.to_string(), span }
}
}
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 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())
}
}