diff options
| author | Alexander Korolkov <alexander.korolkov@gmail.com> | 2015-01-23 18:51:12 +0300 |
|---|---|---|
| committer | Alexander Korolkov <alexander.korolkov@gmail.com> | 2015-01-23 18:51:12 +0300 |
| commit | 8a22454731cb81f3800fc0e8a5e1e7831e3c74e2 (patch) | |
| tree | c4995f9703004182e19729a12e364be7d1bf0761 /src/libsyntax | |
| parent | aedcbb9d82ccd7ead4b075ff55a99e363be94174 (diff) | |
| download | rust-8a22454731cb81f3800fc0e8a5e1e7831e3c74e2.tar.gz rust-8a22454731cb81f3800fc0e8a5e1e7831e3c74e2.zip | |
Rephrase error message on invalid fragment specifiers in macros.
Also, print help on valid fragment specifiers.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/tt/macro_parser.rs | 14 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 2 |
2 files changed, 10 insertions, 6 deletions
diff --git a/src/libsyntax/ext/tt/macro_parser.rs b/src/libsyntax/ext/tt/macro_parser.rs index d115f2ed620..9d5be3fff61 100644 --- a/src/libsyntax/ext/tt/macro_parser.rs +++ b/src/libsyntax/ext/tt/macro_parser.rs @@ -83,7 +83,7 @@ use self::TokenTreeOrTokenTreeVec::*; use ast; use ast::{TokenTree, Ident}; use ast::{TtDelimited, TtSequence, TtToken}; -use codemap::{BytePos, mk_sp}; +use codemap::{BytePos, mk_sp, Span}; use codemap; use parse::lexer::*; //resolve bug? use parse::ParseSess; @@ -483,11 +483,11 @@ pub fn parse(sess: &ParseSess, let mut ei = bb_eis.pop().unwrap(); match ei.top_elts.get_tt(ei.idx) { - TtToken(_, MatchNt(_, name, _, _)) => { + TtToken(span, MatchNt(_, name, _, _)) => { let name_string = token::get_ident(name); let match_cur = ei.match_cur; (&mut ei.matches[match_cur]).push(Rc::new(MatchedNonterminal( - parse_nt(&mut rust_parser, name_string.get())))); + parse_nt(&mut rust_parser, span, name_string.get())))); ei.idx += 1us; ei.match_cur += 1; } @@ -505,7 +505,7 @@ pub fn parse(sess: &ParseSess, } } -pub fn parse_nt(p: &mut Parser, name: &str) -> Nonterminal { +pub fn parse_nt(p: &mut Parser, sp: Span, name: &str) -> Nonterminal { match name { "tt" => { p.quote_depth += 1us; //but in theory, non-quoted tts might be useful @@ -541,7 +541,11 @@ pub fn parse_nt(p: &mut Parser, name: &str) -> Nonterminal { } "meta" => token::NtMeta(p.parse_meta_item()), _ => { - p.fatal(&format!("unsupported builtin nonterminal parser: {}", name)[]) + p.span_fatal_help(sp, + &format!("invalid fragment specifier `{}`", name)[], + "valid fragment specifiers are `ident`, `block`, \ + `stmt`, `expr`, `pat`, `ty`, `path`, `meta`, `tt` \ + and `item`") } } } diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 8350e0222ef..666281ac6b6 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -457,7 +457,7 @@ fn is_in_follow(_: &ExtCtxt, tok: &Token, frag: &str) -> Result<bool, String> { // harmless Ok(true) }, - _ => Err(format!("unrecognized builtin nonterminal `{}`", frag)) + _ => Err(format!("invalid fragment specifier `{}`", frag)) } } } |
