use crate::span::{HasSpan, Span}; use super::{Expr, Ident, Space}; #[derive(Debug, Clone)] pub enum Var { /// `[a]` /// /// Structure: `[ s0 index s1 ]` Access { s0: Space, index: Box, s1: Space, span: Span, }, /// - `[a] = b` /// - `local [a] = b` /// /// Structure: `local [ s0 index s1 ] s2 = s3 value` Assign { local: Option, s0: Space, index: Box, s1: Space, s2: Space, s3: Space, value: Box, span: Span, }, /// `foo` AccessIdent(Ident), /// - `foo = a` /// - `local foo = a` /// /// Structure: `local name s0 = s1 value` AssignIdent { local: Option, name: Ident, s0: Space, s1: Space, value: Box, span: Span, }, } impl HasSpan for Var { fn span(&self) -> Span { match self { Self::Access { span, .. } => *span, Self::Assign { span, .. } => *span, Self::AccessIdent(ident) => ident.span(), Self::AssignIdent { span, .. } => *span, } } }