11use  rustc_ast:: ptr:: P ; 
22use  rustc_ast:: tokenstream:: TokenStream ; 
3- use  rustc_ast:: { AnonConst ,  DUMMY_NODE_ID ,  Ty ,  TyPat ,  TyPatKind ,  ast} ; 
3+ use  rustc_ast:: { AnonConst ,  DUMMY_NODE_ID ,  Ty ,  TyPat ,  TyPatKind ,  ast,  token } ; 
44use  rustc_errors:: PResult ; 
55use  rustc_expand:: base:: { self ,  DummyResult ,  ExpandResult ,  ExtCtxt ,  MacroExpanderResult } ; 
66use  rustc_parse:: exp; 
7+ use  rustc_parse:: parser:: { CommaRecoveryMode ,  RecoverColon ,  RecoverComma } ; 
78use  rustc_span:: Span ; 
89
910pub ( crate )  fn  expand < ' cx > ( 
@@ -26,19 +27,42 @@ fn parse_pat_ty<'a>(cx: &mut ExtCtxt<'a>, stream: TokenStream) -> PResult<'a, (P
2627
2728    let  ty = parser. parse_ty ( ) ?; 
2829    parser. expect_keyword ( exp ! ( Is ) ) ?; 
29-     let  pat = parser. parse_pat_no_top_alt ( None ,  None ) ?. into_inner ( ) ; 
3030
31+     let  pat = pat_to_ty_pat ( 
32+         cx, 
33+         parser
34+             . parse_pat_no_top_guard ( 
35+                 None , 
36+                 RecoverComma :: No , 
37+                 RecoverColon :: No , 
38+                 CommaRecoveryMode :: EitherTupleOrPipe , 
39+             ) ?
40+             . into_inner ( ) , 
41+     ) ; 
42+ 
43+     if  parser. token  != token:: Eof  { 
44+         parser. unexpected ( ) ?; 
45+     } 
46+ 
47+     Ok ( ( ty,  pat) ) 
48+ } 
49+ 
50+ fn  ty_pat ( kind :  TyPatKind ,  span :  Span )  -> P < TyPat >  { 
51+     P ( TyPat  {  id :  DUMMY_NODE_ID ,  kind,  span,  tokens :  None  } ) 
52+ } 
53+ 
54+ fn  pat_to_ty_pat ( cx :  & mut  ExtCtxt < ' _ > ,  pat :  ast:: Pat )  -> P < TyPat >  { 
3155    let  kind = match  pat. kind  { 
3256        ast:: PatKind :: Range ( start,  end,  include_end)  => TyPatKind :: Range ( 
3357            start. map ( |value| P ( AnonConst  {  id :  DUMMY_NODE_ID ,  value } ) ) , 
3458            end. map ( |value| P ( AnonConst  {  id :  DUMMY_NODE_ID ,  value } ) ) , 
3559            include_end, 
3660        ) , 
61+         ast:: PatKind :: Or ( variants)  => TyPatKind :: Or ( 
62+             variants. into_iter ( ) . map ( |pat| pat_to_ty_pat ( cx,  pat. into_inner ( ) ) ) . collect ( ) , 
63+         ) , 
3764        ast:: PatKind :: Err ( guar)  => TyPatKind :: Err ( guar) , 
3865        _ => TyPatKind :: Err ( cx. dcx ( ) . span_err ( pat. span ,  "pattern not supported in pattern types" ) ) , 
3966    } ; 
40- 
41-     let  pat = P ( TyPat  {  id :  pat. id ,  kind,  span :  pat. span ,  tokens :  pat. tokens  } ) ; 
42- 
43-     Ok ( ( ty,  pat) ) 
67+     ty_pat ( kind,  pat. span ) 
4468} 
0 commit comments