@@ -18,10 +18,10 @@ extern crate syntax_pos;
1818extern crate rustc;
1919extern crate rustc_plugin;
2020
21- use syntax:: parse:: token:: { self , str_to_ident, NtExpr , NtPat } ;
21+ use syntax:: parse:: token:: { str_to_ident, NtExpr , NtPat } ;
2222use syntax:: ast:: { Pat } ;
2323use syntax:: tokenstream:: { TokenTree } ;
24- use syntax:: ext:: base:: { ExtCtxt , MacResult , DummyResult , MacEager } ;
24+ use syntax:: ext:: base:: { ExtCtxt , MacResult , MacEager } ;
2525use syntax:: ext:: build:: AstBuilder ;
2626use syntax:: ext:: tt:: macro_parser:: { MatchedSeq , MatchedNonterminal } ;
2727use syntax:: ext:: tt:: macro_parser:: { Success , Failure , Error } ;
@@ -30,35 +30,12 @@ use syntax::ptr::P;
3030use syntax_pos:: Span ;
3131use rustc_plugin:: Registry ;
3232
33- fn expand_mbe_matches ( cx : & mut ExtCtxt , sp : Span , args : & [ TokenTree ] )
33+ fn expand_mbe_matches ( cx : & mut ExtCtxt , _ : Span , args : & [ TokenTree ] )
3434 -> Box < MacResult + ' static > {
3535
3636 let mbe_matcher = quote_matcher ! ( cx, $matched: expr, $( $pat: pat) |+) ;
37-
38- let mac_expr = match TokenTree :: parse ( cx, & mbe_matcher[ ..] , args) {
39- Success ( map) => {
40- match ( & * map[ & str_to_ident ( "matched" ) ] , & * map[ & str_to_ident ( "pat" ) ] ) {
41- ( & MatchedNonterminal ( NtExpr ( ref matched_expr) ) ,
42- & MatchedSeq ( ref pats, seq_sp) ) => {
43- let pats: Vec < P < Pat > > = pats. iter ( ) . map ( |pat_nt|
44- if let & MatchedNonterminal ( NtPat ( ref pat) ) = & * * pat_nt {
45- pat. clone ( )
46- } else {
47- unreachable ! ( )
48- }
49- ) . collect ( ) ;
50- let arm = cx. arm ( seq_sp, pats, cx. expr_bool ( seq_sp, true ) ) ;
51-
52- quote_expr ! ( cx,
53- match $matched_expr {
54- $arm
55- _ => false
56- }
57- )
58- }
59- _ => unreachable ! ( )
60- }
61- }
37+ let map = match TokenTree :: parse ( cx, & mbe_matcher, args) {
38+ Success ( map) => map,
6239 Failure ( _, tok) => {
6340 panic ! ( "expected Success, but got Failure: {}" , parse_failure_msg( tok) ) ;
6441 }
@@ -67,6 +44,34 @@ fn expand_mbe_matches(cx: &mut ExtCtxt, sp: Span, args: &[TokenTree])
6744 }
6845 } ;
6946
47+ let matched_nt = match * map[ & str_to_ident ( "matched" ) ] {
48+ MatchedNonterminal ( ref nt) => nt. clone ( ) ,
49+ _ => unreachable ! ( ) ,
50+ } ;
51+
52+ let mac_expr = match ( & * matched_nt, & * map[ & str_to_ident ( "pat" ) ] ) {
53+ ( & NtExpr ( ref matched_expr) , & MatchedSeq ( ref pats, seq_sp) ) => {
54+ let pats: Vec < P < Pat > > = pats. iter ( ) . map ( |pat_nt| {
55+ match * * pat_nt {
56+ MatchedNonterminal ( ref nt) => match * * nt {
57+ NtPat ( ref pat) => pat. clone ( ) ,
58+ _ => unreachable ! ( ) ,
59+ } ,
60+ _ => unreachable ! ( ) ,
61+ }
62+ } ) . collect ( ) ;
63+ let arm = cx. arm ( seq_sp, pats, cx. expr_bool ( seq_sp, true ) ) ;
64+
65+ quote_expr ! ( cx,
66+ match $matched_expr {
67+ $arm
68+ _ => false
69+ }
70+ )
71+ }
72+ _ => unreachable ! ( )
73+ } ;
74+
7075 MacEager :: expr ( mac_expr)
7176}
7277
0 commit comments