From 971ff3a2dcff1e68bf7e19017113469aad5a30c2 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 13 Dec 2019 14:58:14 +0100 Subject: =?UTF-8?q?Implement=20expression=20kind=20for=20Spanned=20?= =?UTF-8?q?=F0=9F=91=A9=E2=80=8D=F0=9F=92=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/syntax/mod.rs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'src/syntax') diff --git a/src/syntax/mod.rs b/src/syntax/mod.rs index 2f64bc9b..57488121 100644 --- a/src/syntax/mod.rs +++ b/src/syntax/mod.rs @@ -121,16 +121,15 @@ impl FuncArgs { } /// Force-extract the first positional argument. - pub fn get_pos(&mut self) -> ParseResult> { + pub fn get_pos(&mut self) -> ParseResult { expect(self.get_pos_opt()) } /// Extract the first positional argument. - pub fn get_pos_opt(&mut self) -> ParseResult>> { + pub fn get_pos_opt(&mut self) -> ParseResult> { Ok(if !self.pos.is_empty() { let spanned = self.pos.remove(0); - let span = spanned.span; - Some(Spanned::new(E::from_expr(spanned)?, span)) + Some(E::from_expr(spanned)?) } else { None }) @@ -143,15 +142,15 @@ impl FuncArgs { } /// Force-extract a keyword argument. - pub fn get_key(&mut self, name: &str) -> ParseResult> { + pub fn get_key(&mut self, name: &str) -> ParseResult { expect(self.get_key_opt(name)) } /// Extract a keyword argument. - pub fn get_key_opt(&mut self, name: &str) -> ParseResult>> { + pub fn get_key_opt(&mut self, name: &str) -> ParseResult> { Ok(if let Some(index) = self.key.iter().position(|arg| arg.v.key.v.0 == name) { - let Spanned { v, span } = self.key.swap_remove(index); - Some(Spanned::new(E::from_expr(v.value)?, span)) + let value = self.key.swap_remove(index).v.value; + Some(E::from_expr(value)?) } else { None }) @@ -181,7 +180,7 @@ impl FuncArgs { } /// Extract the option expression kind from the option or return an error. -fn expect(opt: ParseResult>>) -> ParseResult> { +fn expect(opt: ParseResult>) -> ParseResult { match opt { Ok(Some(spanned)) => Ok(spanned), Ok(None) => error!("expected {}", E::NAME), @@ -308,3 +307,13 @@ kind!(ScaleSize, "number or size", Expression::Size(size) => ScaleSize::Absolute(size), Expression::Num(scale) => ScaleSize::Scaled(scale as f32) ); + +impl ExpressionKind for Spanned where T: ExpressionKind { + const NAME: &'static str = T::NAME; + + fn from_expr(expr: Spanned) -> ParseResult> { + let span = expr.span; + T::from_expr(expr) + .map(|v| Spanned::new(v, span)) + } +} -- cgit v1.2.3