diff --git a/src/parse/value/parse.rs b/src/parse/value/parse.rs index 1c482f2..d27f697 100644 --- a/src/parse/value/parse.rs +++ b/src/parse/value/parse.rs @@ -524,15 +524,13 @@ impl<'a> Parser<'a> { Ok(v) => v.map_node(|i| i.into()), Err(e) => return Some(Err(e)), }; - let span = val.span; IntermediateValue::Value(HigherIntermediateValue::Literal( match self.scopes.last().get_var(&val, self.global_scope) { - Ok(v) => v, + Ok(v) => v.clone(), Err(e) => return Some(Err(e)), - } - .node, + }, )) - .span(span) + .span(val.span) } '+' => { let span = self.toks.next().unwrap().pos(); diff --git a/src/scope.rs b/src/scope.rs index c4f2ced..da470a0 100644 --- a/src/scope.rs +++ b/src/scope.rs @@ -17,7 +17,6 @@ pub(crate) struct Scope { functions: HashMap, } -// todo: separate struct for global scope? impl Scope { #[must_use] pub fn new() -> Self { @@ -28,20 +27,20 @@ impl Scope { } } - fn get_var_no_global(&self, name: &Spanned) -> SassResult> { + fn get_var_no_global(&self, name: &Spanned) -> SassResult<&Value> { match self.vars.get(&name.node) { - Some(v) => Ok(v.clone()), + Some(v) => Ok(&v.node), None => Err(("Undefined variable.", name.span).into()), } } - pub fn get_var( - &self, + pub fn get_var<'a>( + &'a self, name: &Spanned, - global_scope: &Scope, - ) -> SassResult> { + global_scope: &'a Scope, + ) -> SassResult<&Value> { match self.vars.get(&name.node) { - Some(v) => Ok(v.clone()), + Some(v) => Ok(&v.node), None => global_scope.get_var_no_global(name), } }