diff --git a/src/ast/lit.rs b/src/ast/lit.rs index ee486ef..16c7263 100644 --- a/src/ast/lit.rs +++ b/src/ast/lit.rs @@ -93,6 +93,15 @@ pub struct StringLit { pub span: Span, } +impl StringLit { + pub fn from_ident(ident: Ident) -> Self { + Self { + elems: vec![StringLitElem::Plain(ident.name)], + span: ident.span, + } + } +} + impl HasSpan for StringLit { fn span(&self) -> Span { self.span diff --git a/src/desugar/field.rs b/src/desugar/field.rs index 496cd44..30dfc5b 100644 --- a/src/desugar/field.rs +++ b/src/desugar/field.rs @@ -1,6 +1,6 @@ use crate::ast::{ - BoundedSeparated, Call, Expr, Field, Line, Lit, Space, StringLit, StringLitElem, TableConstr, - TableConstrElem, TableLitElem, + BoundedSeparated, Call, Expr, Field, Line, Lit, Space, StringLit, TableConstr, TableConstrElem, + TableLitElem, }; use crate::builtin::Builtin; @@ -94,15 +94,11 @@ impl Field { } => { // `expr s0 . s1 ident´ // -> `expr s0 [ s1 ident_str ]` - let ident_str = Expr::Lit(Lit::String(StringLit { - elems: vec![StringLitElem::Plain(ident.name)], - span: ident.span, - })); let new = Expr::Field(Self::Access { expr, s0, s1, - index: Box::new(ident_str), + index: Box::new(Expr::Lit(Lit::String(StringLit::from_ident(ident)))), s2: Space::empty(span), span, }); @@ -121,15 +117,11 @@ impl Field { } => { // `expr s0 . s1 ident s2 = s3 value` // -> `expr s0 [ s1 ident_str ] s2 = s3 value` - let ident_str = Expr::Lit(Lit::String(StringLit { - elems: vec![StringLitElem::Plain(ident.name)], - span: ident.span, - })); let new = Expr::Field(Self::Assign { expr, s0, s1, - index: Box::new(ident_str), + index: Box::new(Expr::Lit(Lit::String(StringLit::from_ident(ident)))), s2: Space::empty(span), s3: s2, s4: s3, diff --git a/src/desugar/var.rs b/src/desugar/var.rs index 7cb5268..2ea1997 100644 --- a/src/desugar/var.rs +++ b/src/desugar/var.rs @@ -1,6 +1,6 @@ use crate::ast::{ - BoundedSeparated, Call, Expr, Field, Line, Lit, Space, StringLit, StringLitElem, TableConstr, - TableConstrElem, TableLitElem, Var, + BoundedSeparated, Call, Expr, Field, Line, Lit, Space, StringLit, TableConstr, TableConstrElem, + TableLitElem, Var, }; use crate::builtin::Builtin; use crate::span::HasSpan; @@ -117,13 +117,9 @@ impl Var { // `name` // -> `[ name_str ]` let span = name.span(); - let name_str = Expr::Lit(Lit::String(StringLit { - elems: vec![StringLitElem::Plain(name.name)], - span, - })); let new = Expr::Var(Self::Access { s0: Space::empty(span), - index: Box::new(name_str), + index: Box::new(Expr::Lit(Lit::String(StringLit::from_ident(name)))), s1: Space::empty(span), span, }); @@ -140,14 +136,10 @@ impl Var { } => { // `local name s0 = s1 value` // -> `local [ name_str ] s0 = s1 value` - let name_str = Expr::Lit(Lit::String(StringLit { - elems: vec![StringLitElem::Plain(name.name)], - span: name.span, - })); let new = Expr::Var(Self::Assign { local, s0: Space::empty(span), - index: Box::new(name_str), + index: Box::new(Expr::Lit(Lit::String(StringLit::from_ident(name)))), s1: Space::empty(span), s2: s0, s3: s1,