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