@@ -18,7 +18,7 @@ use hir_def::{
18
18
scope:: { ExprScopes , ScopeId } ,
19
19
Body , BodySourceMap , HygieneId ,
20
20
} ,
21
- hir:: { BindingId , Expr , ExprId , ExprOrPatId , Pat , PatId } ,
21
+ hir:: { BindingId , Expr , ExprId , ExprOrPatId , Pat } ,
22
22
lang_item:: LangItem ,
23
23
lower:: LowerCtx ,
24
24
nameres:: MacroSubNs ,
@@ -139,15 +139,15 @@ impl SourceAnalyzer {
139
139
sm. node_expr ( src. as_ref ( ) )
140
140
}
141
141
142
- fn pat_id ( & self , pat : & ast:: Pat ) -> Option < PatId > {
142
+ fn pat_id ( & self , pat : & ast:: Pat ) -> Option < ExprOrPatId > {
143
143
// FIXME: macros, see `expr_id`
144
144
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)
146
146
}
147
147
148
148
fn binding_id_of_pat ( & self , pat : & ast:: IdentPat ) -> Option < BindingId > {
149
149
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 ( ) ? ] {
151
151
Some ( id)
152
152
} else {
153
153
None
@@ -212,8 +212,10 @@ impl SourceAnalyzer {
212
212
) -> Option < ( Type , Option < Type > ) > {
213
213
let pat_id = self . pat_id ( pat) ?;
214
214
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 ( ) ) ;
217
219
let ty = infer[ pat_id] . clone ( ) ;
218
220
let mk_ty = |ty| Type :: new_with_resolver ( db, & self . resolver , ty) ;
219
221
Some ( ( mk_ty ( ty) , coerced. map ( mk_ty) ) )
@@ -248,7 +250,7 @@ impl SourceAnalyzer {
248
250
) -> Option < BindingMode > {
249
251
let id = self . pat_id ( & pat. clone ( ) . into ( ) ) ?;
250
252
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 {
252
254
hir_ty:: BindingMode :: Move => BindingMode :: Move ,
253
255
hir_ty:: BindingMode :: Ref ( hir_ty:: Mutability :: Mut ) => BindingMode :: Ref ( Mutability :: Mut ) ,
254
256
hir_ty:: BindingMode :: Ref ( hir_ty:: Mutability :: Not ) => {
@@ -266,7 +268,7 @@ impl SourceAnalyzer {
266
268
Some (
267
269
infer
268
270
. pat_adjustments
269
- . get ( & pat_id) ?
271
+ . get ( & pat_id. as_pat ( ) ? ) ?
270
272
. iter ( )
271
273
. map ( |ty| Type :: new_with_resolver ( db, & self . resolver , ty. clone ( ) ) )
272
274
. collect ( ) ,
@@ -649,10 +651,10 @@ impl SourceAnalyzer {
649
651
let field_name = field. field_name ( ) ?. as_name ( ) ;
650
652
let record_pat = ast:: RecordPat :: cast ( field. syntax ( ) . parent ( ) . and_then ( |p| p. parent ( ) ) ?) ?;
651
653
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 ( ) ? ) ?;
653
655
let variant_data = variant. variant_data ( db. upcast ( ) ) ;
654
656
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 ( ) ?;
656
658
let field_ty =
657
659
db. field_types ( variant) . get ( field. local_id ) ?. clone ( ) . substitute ( Interner , subst) ;
658
660
Some ( (
@@ -684,7 +686,7 @@ impl SourceAnalyzer {
684
686
) -> Option < ModuleDef > {
685
687
let pat_id = self . pat_id ( & pat. clone ( ) . into ( ) ) ?;
686
688
let body = self . body ( ) ?;
687
- let path = match & body[ pat_id] {
689
+ let path = match & body[ pat_id. as_pat ( ) ? ] {
688
690
Pat :: Path ( path) => path,
689
691
_ => return None ,
690
692
} ;
@@ -783,7 +785,7 @@ impl SourceAnalyzer {
783
785
prefer_value_ns = true ;
784
786
} else if let Some ( path_pat) = parent ( ) . and_then ( ast:: PathPat :: cast) {
785
787
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 ( ) ? ) {
787
789
let ( assoc, subst) = match assoc {
788
790
AssocItemId :: ConstId ( const_id) => {
789
791
let ( konst, subst) =
@@ -807,7 +809,7 @@ impl SourceAnalyzer {
807
809
return Some ( ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) , Some ( subst) ) ) ;
808
810
}
809
811
if let Some ( VariantId :: EnumVariantId ( variant) ) =
810
- infer. variant_resolution_for_pat ( pat_id)
812
+ infer. variant_resolution_for_pat ( pat_id. as_pat ( ) ? )
811
813
{
812
814
return Some ( ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) , None ) ) ;
813
815
}
@@ -824,7 +826,7 @@ impl SourceAnalyzer {
824
826
|| parent ( ) . and_then ( ast:: TupleStructPat :: cast) . map ( ast:: Pat :: from) ;
825
827
if let Some ( pat) = record_pat. or_else ( tuple_struct_pat) {
826
828
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 ( ) ? ) ;
828
830
if let Some ( VariantId :: EnumVariantId ( variant) ) = variant_res_for_pat {
829
831
return Some ( (
830
832
PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ,
@@ -1043,7 +1045,7 @@ impl SourceAnalyzer {
1043
1045
let body = self . body ( ) ?;
1044
1046
let infer = self . infer . as_ref ( ) ?;
1045
1047
1046
- let pat_id = self . pat_id ( & pattern. clone ( ) . into ( ) ) ?;
1048
+ let pat_id = self . pat_id ( & pattern. clone ( ) . into ( ) ) ?. as_pat ( ) ? ;
1047
1049
let substs = infer. type_of_pat [ pat_id] . as_adt ( ) ?. 1 ;
1048
1050
1049
1051
let ( variant, missing_fields, _exhaustive) =
0 commit comments