From dd331f007cb9c9968605f8d3eaef8fb498c21322 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 20 Jan 2023 14:05:17 +0100 Subject: Rewrite parser --- src/model/eval.rs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'src/model/eval.rs') diff --git a/src/model/eval.rs b/src/model/eval.rs index 8e8c93c5..0469649b 100644 --- a/src/model/eval.rs +++ b/src/model/eval.rs @@ -261,9 +261,10 @@ impl Eval for ast::Expr { }; match self { + Self::Text(v) => v.eval(vm).map(Value::Content), Self::Space(v) => v.eval(vm).map(Value::Content), Self::Linebreak(v) => v.eval(vm).map(Value::Content), - Self::Text(v) => v.eval(vm).map(Value::Content), + Self::Parbreak(v) => v.eval(vm).map(Value::Content), Self::Escape(v) => v.eval(vm).map(Value::Content), Self::Shorthand(v) => v.eval(vm).map(Value::Content), Self::Symbol(v) => v.eval(vm).map(Value::Content), @@ -330,14 +331,19 @@ impl ast::Expr { } } +impl Eval for ast::Text { + type Output = Content; + + fn eval(&self, vm: &mut Vm) -> SourceResult { + Ok((vm.items.text)(self.get().clone())) + } +} + impl Eval for ast::Space { type Output = Content; fn eval(&self, vm: &mut Vm) -> SourceResult { - Ok(match self.newlines() { - 0..=1 => (vm.items.space)(), - _ => (vm.items.parbreak)(), - }) + Ok((vm.items.space)()) } } @@ -349,11 +355,11 @@ impl Eval for ast::Linebreak { } } -impl Eval for ast::Text { +impl Eval for ast::Parbreak { type Output = Content; fn eval(&self, vm: &mut Vm) -> SourceResult { - Ok((vm.items.text)(self.get().clone())) + Ok((vm.items.parbreak)()) } } @@ -438,7 +444,7 @@ impl Eval for ast::Link { type Output = Content; fn eval(&self, vm: &mut Vm) -> SourceResult { - Ok((vm.items.link)(self.url().clone())) + Ok((vm.items.link)(self.get().clone())) } } @@ -1231,13 +1237,17 @@ impl Eval for ast::ModuleImport { } } Some(ast::Imports::Items(idents)) => { + let mut errors = vec![]; for ident in idents { if let Some(value) = module.scope().get(&ident) { vm.scopes.top.define(ident.take(), value.clone()); } else { - bail!(ident.span(), "unresolved import"); + errors.push(error!(ident.span(), "unresolved import")); } } + if errors.len() > 0 { + return Err(Box::new(errors)); + } } } -- cgit v1.2.3