From 270781b255fb29d20a48c9157da910b63e619ce5 Mon Sep 17 00:00:00 2001 From: Chris Wong <lambda.fairy@gmail.com> Date: Mon, 12 Jan 2015 16:24:53 +1300 Subject: [PATCH] Show error on unexpected end of input Without this error, rustc would treat our dummy result as a real one, causing much pain. --- maud_macros/src/lib.rs | 2 +- maud_macros/src/parse.rs | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/maud_macros/src/lib.rs b/maud_macros/src/lib.rs index d9bdccd..976e85e 100644 --- a/maud_macros/src/lib.rs +++ b/maud_macros/src/lib.rs @@ -15,7 +15,7 @@ mod parse; mod render; fn expand_html<'cx>(cx: &'cx mut ExtCtxt, sp: Span, args: &[TokenTree]) -> Box<MacResult + 'cx> { - match parse::parse(cx, args) { + match parse::parse(cx, args, sp) { Some(expr) => MacExpr::new(expr), None => DummyResult::any(sp), } diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs index 29a511e..3fc86d0 100644 --- a/maud_macros/src/parse.rs +++ b/maud_macros/src/parse.rs @@ -35,12 +35,13 @@ macro_rules! ident { ($sp:pat, $x:pat) => (TtToken($sp, token::Ident($x, token::IdentStyle::Plain))) } -pub fn parse(cx: &mut ExtCtxt, input: &[TokenTree]) -> Option<P<Expr>> { +pub fn parse(cx: &mut ExtCtxt, input: &[TokenTree], sp: Span) -> Option<P<Expr>> { let mut success = true; let expr = Renderer::with(cx, |render| { let mut parser = Parser { in_attr: false, input: input, + span: sp, render: render, }; success = parser.markups(); @@ -55,6 +56,7 @@ pub fn parse(cx: &mut ExtCtxt, input: &[TokenTree]) -> Option<P<Expr>> { struct Parser<'cx: 'r, 's: 'cx, 'i, 'r, 'o: 'r> { in_attr: bool, input: &'i [TokenTree], + span: Span, render: &'r mut Renderer<'cx, 's, 'o>, } @@ -113,6 +115,8 @@ impl<'cx, 's, 'i, 'r, 'o> Parser<'cx, 's, 'i, 'r, 'o> { _ => { if let [ref tt, ..] = self.input { self.render.cx.span_err(tt.get_span(), "invalid syntax"); + } else { + self.render.cx.span_err(self.span, "unexpected end of block"); } false }, @@ -179,6 +183,7 @@ impl<'cx, 's, 'i, 'r, 'o> Parser<'cx, 's, 'i, 'r, 'o> { Parser { in_attr: self.in_attr, input: tts, + span: self.span, render: self.render, }.markups() }