use super::*;
mod display;
#[derive(Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IdentifierNode {
pub name: String,
pub span: FileSpan,
}
#[derive(Clone, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NamePathNode {
pub path: Vec<IdentifierNode>,
pub span: FileSpan,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BooleanNode {
pub value: bool,
pub span: Range<u32>,
}
impl ValkyrieNode for BooleanNode {
fn get_range(&self) -> Range<usize> {
Range { start: self.span.start as usize, end: self.span.end as usize }
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NullNode {
pub nil: bool,
pub span: Range<u32>,
}
impl ValkyrieNode for NullNode {
fn get_range(&self) -> Range<usize> {
Range { start: self.span.start as usize, end: self.span.end as usize }
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct OutputNode {
pub count: isize,
pub span: Range<u32>,
}
impl ValkyrieNode for OutputNode {
fn get_range(&self) -> Range<usize> {
Range { start: self.span.start as usize, end: self.span.end as usize }
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LambdaSlotNode {
pub level: usize,
pub item: LambdaSlotItem,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum LambdaSlotItem {
SelfType,
MetaType,
Index(NonZeroU64),
Named(IdentifierNode),
}
impl ValkyrieNode for LambdaSlotNode {
fn get_range(&self) -> Range<usize> {
Range { start: self.span.start as usize, end: self.span.end as usize }
}
}
impl FromIterator<IdentifierNode> for NamePathNode {
fn from_iter<T: IntoIterator<Item = IdentifierNode>>(iter: T) -> Self {
Self { path: iter.into_iter().collect(), span: Default::default() }
}
}
impl NamePathNode {
pub fn new<I>(names: I) -> Self
where
I: IntoIterator<Item = IdentifierNode>,
{
Self { path: names.into_iter().collect(), span: Default::default() }
}
pub fn join<I: IntoIterator<Item = IdentifierNode>>(mut self, other: I) -> Self {
self.path.extend(other);
self
}
pub fn get_range(&self) -> Range<usize> {
self.span.get_range()
}
pub fn with_span(self, span: FileSpan) -> Self {
Self { span, ..self }
}
}
impl IdentifierNode {
pub fn new<S: ToString>(s: S) -> Self {
Self { name: s.to_string(), span: Default::default() }
}
pub fn with_file(mut self, file: FileID) -> Self {
self.span.set_file(file);
self
}
pub fn with_span<I>(mut self, range: Range<usize>) -> Self {
self.span.set_range(range);
self
}
pub fn is_normal(&self) -> bool {
self.name.starts_with(|c: char| c.is_ascii_lowercase())
}
}