@@ -18,7 +18,7 @@ use hir_def::{
1818 scope:: { ExprScopes , ScopeId } ,
1919 Body , BodySourceMap , HygieneId ,
2020 } ,
21- hir:: { BindingId , Expr , ExprId , ExprOrPatId , Pat , PatId } ,
21+ hir:: { BindingId , Expr , ExprId , ExprOrPatId , Pat } ,
2222 lang_item:: LangItem ,
2323 lower:: LowerCtx ,
2424 nameres:: MacroSubNs ,
@@ -139,15 +139,15 @@ impl SourceAnalyzer {
139139 sm. node_expr ( src. as_ref ( ) )
140140 }
141141
142- fn pat_id ( & self , pat : & ast:: Pat ) -> Option < PatId > {
142+ fn pat_id ( & self , pat : & ast:: Pat ) -> Option < ExprOrPatId > {
143143 // FIXME: macros, see `expr_id`
144144 let src = InFile { file_id : self . file_id , value : pat } ;
145- self . body_source_map ( ) ?. node_pat ( src) . and_then ( ExprOrPatId :: as_pat )
145+ self . body_source_map ( ) ?. node_pat ( src)
146146 }
147147
148148 fn binding_id_of_pat ( & self , pat : & ast:: IdentPat ) -> Option < BindingId > {
149149 let pat_id = self . pat_id ( & pat. clone ( ) . into ( ) ) ?;
150- if let Pat :: Bind { id, .. } = self . body ( ) ?. pats [ pat_id] {
150+ if let Pat :: Bind { id, .. } = self . body ( ) ?. pats [ pat_id. as_pat ( ) ? ] {
151151 Some ( id)
152152 } else {
153153 None
@@ -212,8 +212,10 @@ impl SourceAnalyzer {
212212 ) -> Option < ( Type , Option < Type > ) > {
213213 let pat_id = self . pat_id ( pat) ?;
214214 let infer = self . infer . as_ref ( ) ?;
215- let coerced =
216- infer. pat_adjustments . get ( & pat_id) . and_then ( |adjusts| adjusts. last ( ) . cloned ( ) ) ;
215+ let coerced = infer
216+ . pat_adjustments
217+ . get ( & pat_id. as_pat ( ) ?)
218+ . and_then ( |adjusts| adjusts. last ( ) . cloned ( ) ) ;
217219 let ty = infer[ pat_id] . clone ( ) ;
218220 let mk_ty = |ty| Type :: new_with_resolver ( db, & self . resolver , ty) ;
219221 Some ( ( mk_ty ( ty) , coerced. map ( mk_ty) ) )
@@ -248,7 +250,7 @@ impl SourceAnalyzer {
248250 ) -> Option < BindingMode > {
249251 let id = self . pat_id ( & pat. clone ( ) . into ( ) ) ?;
250252 let infer = self . infer . as_ref ( ) ?;
251- infer. binding_modes . get ( id) . map ( |bm| match bm {
253+ infer. binding_modes . get ( id. as_pat ( ) ? ) . map ( |bm| match bm {
252254 hir_ty:: BindingMode :: Move => BindingMode :: Move ,
253255 hir_ty:: BindingMode :: Ref ( hir_ty:: Mutability :: Mut ) => BindingMode :: Ref ( Mutability :: Mut ) ,
254256 hir_ty:: BindingMode :: Ref ( hir_ty:: Mutability :: Not ) => {
@@ -266,7 +268,7 @@ impl SourceAnalyzer {
266268 Some (
267269 infer
268270 . pat_adjustments
269- . get ( & pat_id) ?
271+ . get ( & pat_id. as_pat ( ) ? ) ?
270272 . iter ( )
271273 . map ( |ty| Type :: new_with_resolver ( db, & self . resolver , ty. clone ( ) ) )
272274 . collect ( ) ,
@@ -649,10 +651,10 @@ impl SourceAnalyzer {
649651 let field_name = field. field_name ( ) ?. as_name ( ) ;
650652 let record_pat = ast:: RecordPat :: cast ( field. syntax ( ) . parent ( ) . and_then ( |p| p. parent ( ) ) ?) ?;
651653 let pat_id = self . pat_id ( & record_pat. into ( ) ) ?;
652- let variant = self . infer . as_ref ( ) ?. variant_resolution_for_pat ( pat_id) ?;
654+ let variant = self . infer . as_ref ( ) ?. variant_resolution_for_pat ( pat_id. as_pat ( ) ? ) ?;
653655 let variant_data = variant. variant_data ( db. upcast ( ) ) ;
654656 let field = FieldId { parent : variant, local_id : variant_data. field ( & field_name) ? } ;
655- let ( adt, subst) = self . infer . as_ref ( ) ?. type_of_pat . get ( pat_id) ?. as_adt ( ) ?;
657+ let ( adt, subst) = self . infer . as_ref ( ) ?. type_of_pat . get ( pat_id. as_pat ( ) ? ) ?. as_adt ( ) ?;
656658 let field_ty =
657659 db. field_types ( variant) . get ( field. local_id ) ?. clone ( ) . substitute ( Interner , subst) ;
658660 Some ( (
@@ -684,7 +686,7 @@ impl SourceAnalyzer {
684686 ) -> Option < ModuleDef > {
685687 let pat_id = self . pat_id ( & pat. clone ( ) . into ( ) ) ?;
686688 let body = self . body ( ) ?;
687- let path = match & body[ pat_id] {
689+ let path = match & body[ pat_id. as_pat ( ) ? ] {
688690 Pat :: Path ( path) => path,
689691 _ => return None ,
690692 } ;
@@ -783,7 +785,7 @@ impl SourceAnalyzer {
783785 prefer_value_ns = true ;
784786 } else if let Some ( path_pat) = parent ( ) . and_then ( ast:: PathPat :: cast) {
785787 let pat_id = self . pat_id ( & path_pat. into ( ) ) ?;
786- if let Some ( ( assoc, subs) ) = infer. assoc_resolutions_for_pat ( pat_id) {
788+ if let Some ( ( assoc, subs) ) = infer. assoc_resolutions_for_pat ( pat_id. as_pat ( ) ? ) {
787789 let ( assoc, subst) = match assoc {
788790 AssocItemId :: ConstId ( const_id) => {
789791 let ( konst, subst) =
@@ -807,7 +809,7 @@ impl SourceAnalyzer {
807809 return Some ( ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) , Some ( subst) ) ) ;
808810 }
809811 if let Some ( VariantId :: EnumVariantId ( variant) ) =
810- infer. variant_resolution_for_pat ( pat_id)
812+ infer. variant_resolution_for_pat ( pat_id. as_pat ( ) ? )
811813 {
812814 return Some ( ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) , None ) ) ;
813815 }
@@ -824,7 +826,7 @@ impl SourceAnalyzer {
824826 || parent ( ) . and_then ( ast:: TupleStructPat :: cast) . map ( ast:: Pat :: from) ;
825827 if let Some ( pat) = record_pat. or_else ( tuple_struct_pat) {
826828 let pat_id = self . pat_id ( & pat) ?;
827- let variant_res_for_pat = infer. variant_resolution_for_pat ( pat_id) ;
829+ let variant_res_for_pat = infer. variant_resolution_for_pat ( pat_id. as_pat ( ) ? ) ;
828830 if let Some ( VariantId :: EnumVariantId ( variant) ) = variant_res_for_pat {
829831 return Some ( (
830832 PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ,
@@ -1043,7 +1045,7 @@ impl SourceAnalyzer {
10431045 let body = self . body ( ) ?;
10441046 let infer = self . infer . as_ref ( ) ?;
10451047
1046- let pat_id = self . pat_id ( & pattern. clone ( ) . into ( ) ) ?;
1048+ let pat_id = self . pat_id ( & pattern. clone ( ) . into ( ) ) ?. as_pat ( ) ? ;
10471049 let substs = infer. type_of_pat [ pat_id] . as_adt ( ) ?. 1 ;
10481050
10491051 let ( variant, missing_fields, _exhaustive) =
0 commit comments