@@ -4,10 +4,10 @@ use rustc_ast::ptr::P;
44use rustc_ast:: * ;
55use rustc_data_structures:: stack:: ensure_sufficient_stack;
66use rustc_hir as hir;
7- use rustc_hir:: def:: Res ;
7+ use rustc_hir:: def:: { DefKind , Res } ;
88use rustc_middle:: span_bug;
99use rustc_span:: source_map:: { Spanned , respan} ;
10- use rustc_span:: { Ident , Span } ;
10+ use rustc_span:: { Ident , Span , kw } ;
1111
1212use super :: errors:: {
1313 ArbitraryExpressionInPattern , ExtraDoubleDot , MisplacedDoubleDot , SubTupleBinding ,
@@ -429,4 +429,81 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
429429 } ;
430430 self . arena . alloc ( hir:: PatExpr { hir_id : self . lower_node_id ( expr. id ) , span, kind } )
431431 }
432+
433+ pub ( crate ) fn lower_ty_pat ( & mut self , pattern : & Pat ) -> & ' hir hir:: TyPat < ' hir > {
434+ self . arena . alloc ( self . lower_ty_pat_mut ( pattern) )
435+ }
436+
437+ fn lower_ty_pat_mut ( & mut self , mut pattern : & Pat ) -> hir:: TyPat < ' hir > {
438+ // loop here to avoid recursion
439+ let pat_hir_id = self . lower_node_id ( pattern. id ) ;
440+ let node = loop {
441+ match & pattern. kind {
442+ PatKind :: Range ( e1, e2, Spanned { node : end, .. } ) => {
443+ // FIXME(pattern_types): remove this closure and call `lower_const_arg` instead.
444+ // That requires first modifying the AST to have const args here.
445+ let mut lower_expr = |e : & Expr | -> & _ {
446+ if let ExprKind :: Path ( None , path) = & e. kind
447+ && let Some ( res) = self
448+ . resolver
449+ . get_partial_res ( e. id )
450+ . and_then ( |partial_res| partial_res. full_res ( ) )
451+ {
452+ self . lower_const_path_to_const_arg ( path, res, e. id , e. span )
453+ } else {
454+ let node_id = self . next_node_id ( ) ;
455+ let def_id = self . create_def (
456+ self . current_hir_id_owner . def_id ,
457+ node_id,
458+ kw:: Empty ,
459+ DefKind :: AnonConst ,
460+ e. span ,
461+ ) ;
462+ let hir_id = self . lower_node_id ( node_id) ;
463+ let ac = self . arena . alloc ( hir:: AnonConst {
464+ def_id,
465+ hir_id,
466+ body : self . lower_const_body ( pattern. span , Some ( e) ) ,
467+ span : self . lower_span ( pattern. span ) ,
468+ } ) ;
469+ self . arena . alloc ( hir:: ConstArg {
470+ hir_id : self . next_id ( ) ,
471+ kind : hir:: ConstArgKind :: Anon ( ac) ,
472+ } )
473+ }
474+ } ;
475+ break hir:: TyPatKind :: Range (
476+ e1. as_deref ( ) . map ( |e| lower_expr ( e) ) ,
477+ e2. as_deref ( ) . map ( |e| lower_expr ( e) ) ,
478+ self . lower_range_end ( end, e2. is_some ( ) ) ,
479+ ) ;
480+ }
481+ // return inner to be processed in next loop
482+ PatKind :: Paren ( inner) => pattern = inner,
483+ PatKind :: MacCall ( _) => panic ! ( "{:?} shouldn't exist here" , pattern. span) ,
484+ PatKind :: Err ( guar) => break hir:: TyPatKind :: Err ( * guar) ,
485+ PatKind :: Deref ( ..)
486+ | PatKind :: Box ( ..)
487+ | PatKind :: Or ( ..)
488+ | PatKind :: Struct ( ..)
489+ | PatKind :: TupleStruct ( ..)
490+ | PatKind :: Tuple ( ..)
491+ | PatKind :: Ref ( ..)
492+ | PatKind :: Expr ( ..)
493+ | PatKind :: Guard ( ..)
494+ | PatKind :: Slice ( _)
495+ | PatKind :: Ident ( ..)
496+ | PatKind :: Path ( ..)
497+ | PatKind :: Wild
498+ | PatKind :: Never
499+ | PatKind :: Rest => {
500+ break hir:: TyPatKind :: Err (
501+ self . dcx ( ) . span_err ( pattern. span , "pattern not supported in pattern types" ) ,
502+ ) ;
503+ }
504+ }
505+ } ;
506+
507+ hir:: TyPat { hir_id : pat_hir_id, kind : node, span : self . lower_span ( pattern. span ) }
508+ }
432509}
0 commit comments