1
1
use rustc_ast:: ptr:: P ;
2
2
use 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 } ;
4
4
use rustc_errors:: PResult ;
5
5
use rustc_expand:: base:: { self , DummyResult , ExpandResult , ExtCtxt , MacroExpanderResult } ;
6
6
use rustc_parse:: exp;
7
+ use rustc_parse:: parser:: { CommaRecoveryMode , RecoverColon , RecoverComma } ;
7
8
use rustc_span:: Span ;
8
9
9
10
pub ( crate ) fn expand < ' cx > (
@@ -26,19 +27,42 @@ fn parse_pat_ty<'a>(cx: &mut ExtCtxt<'a>, stream: TokenStream) -> PResult<'a, (P
26
27
27
28
let ty = parser. parse_ty ( ) ?;
28
29
parser. expect_keyword ( exp ! ( Is ) ) ?;
29
- let pat = parser. parse_pat_no_top_alt ( None , None ) ?. into_inner ( ) ;
30
30
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 > {
31
55
let kind = match pat. kind {
32
56
ast:: PatKind :: Range ( start, end, include_end) => TyPatKind :: Range (
33
57
start. map ( |value| P ( AnonConst { id : DUMMY_NODE_ID , value } ) ) ,
34
58
end. map ( |value| P ( AnonConst { id : DUMMY_NODE_ID , value } ) ) ,
35
59
include_end,
36
60
) ,
61
+ ast:: PatKind :: Or ( variants) => TyPatKind :: Or (
62
+ variants. into_iter ( ) . map ( |pat| pat_to_ty_pat ( cx, pat. into_inner ( ) ) ) . collect ( ) ,
63
+ ) ,
37
64
ast:: PatKind :: Err ( guar) => TyPatKind :: Err ( guar) ,
38
65
_ => TyPatKind :: Err ( cx. dcx ( ) . span_err ( pat. span , "pattern not supported in pattern types" ) ) ,
39
66
} ;
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 )
44
68
}
0 commit comments