@@ -83,7 +83,7 @@ use self::TokenTreeOrTokenTreeVec::*;
83
83
use ast;
84
84
use ast:: { TokenTree , Ident } ;
85
85
use ast:: { TtDelimited , TtSequence , TtToken } ;
86
- use codemap:: { BytePos , mk_sp} ;
86
+ use codemap:: { BytePos , mk_sp, Span } ;
87
87
use codemap;
88
88
use parse:: lexer:: * ; //resolve bug?
89
89
use parse:: ParseSess ;
@@ -483,11 +483,11 @@ pub fn parse(sess: &ParseSess,
483
483
484
484
let mut ei = bb_eis. pop ( ) . unwrap ( ) ;
485
485
match ei. top_elts . get_tt ( ei. idx ) {
486
- TtToken ( _ , MatchNt ( _, name, _, _) ) => {
486
+ TtToken ( span , MatchNt ( _, name, _, _) ) => {
487
487
let name_string = token:: get_ident ( name) ;
488
488
let match_cur = ei. match_cur ;
489
489
( & mut ei. matches [ match_cur] ) . push ( Rc :: new ( MatchedNonterminal (
490
- parse_nt ( & mut rust_parser, name_string. get ( ) ) ) ) ) ;
490
+ parse_nt ( & mut rust_parser, span , name_string. get ( ) ) ) ) ) ;
491
491
ei. idx += 1 us;
492
492
ei. match_cur += 1 ;
493
493
}
@@ -505,7 +505,7 @@ pub fn parse(sess: &ParseSess,
505
505
}
506
506
}
507
507
508
- pub fn parse_nt ( p : & mut Parser , name : & str ) -> Nonterminal {
508
+ pub fn parse_nt ( p : & mut Parser , sp : Span , name : & str ) -> Nonterminal {
509
509
match name {
510
510
"tt" => {
511
511
p. quote_depth += 1 us; //but in theory, non-quoted tts might be useful
@@ -541,7 +541,11 @@ pub fn parse_nt(p: &mut Parser, name: &str) -> Nonterminal {
541
541
}
542
542
"meta" => token:: NtMeta ( p. parse_meta_item ( ) ) ,
543
543
_ => {
544
- p. fatal ( & format ! ( "unsupported builtin nonterminal parser: {}" , name) [ ] )
544
+ p. span_fatal_help ( sp,
545
+ & format ! ( "invalid fragment specifier `{}`" , name) [ ] ,
546
+ "valid fragment specifiers are `ident`, `block`, \
547
+ `stmt`, `expr`, `pat`, `ty`, `path`, `meta`, `tt` \
548
+ and `item`")
545
549
}
546
550
}
547
551
}
0 commit comments