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()
     }