@@ -59,7 +59,8 @@ mod closure;
59
59
pub ( crate ) fn infer_query ( db : & dyn HirDatabase , def : DefWithBodyId ) -> Arc < InferenceResult > {
60
60
let _p = profile:: span ( "infer_query" ) ;
61
61
let resolver = def. resolver ( db. upcast ( ) ) ;
62
- let mut ctx = InferenceContext :: new ( db, def, resolver) ;
62
+ let body = db. body ( def) ;
63
+ let mut ctx = InferenceContext :: new ( db, def, & body, resolver) ;
63
64
64
65
match def {
65
66
DefWithBodyId :: ConstId ( c) => ctx. collect_const ( & db. const_data ( c) ) ,
@@ -360,7 +361,7 @@ impl Index<PatId> for InferenceResult {
360
361
pub ( crate ) struct InferenceContext < ' a > {
361
362
pub ( crate ) db : & ' a dyn HirDatabase ,
362
363
pub ( crate ) owner : DefWithBodyId ,
363
- pub ( crate ) body : Arc < Body > ,
364
+ pub ( crate ) body : & ' a Body ,
364
365
pub ( crate ) resolver : Resolver ,
365
366
table : unify:: InferenceTable < ' a > ,
366
367
trait_env : Arc < TraitEnvironment > ,
@@ -394,7 +395,12 @@ fn find_breakable<'c>(
394
395
}
395
396
396
397
impl < ' a > InferenceContext < ' a > {
397
- fn new ( db : & ' a dyn HirDatabase , owner : DefWithBodyId , resolver : Resolver ) -> Self {
398
+ fn new (
399
+ db : & ' a dyn HirDatabase ,
400
+ owner : DefWithBodyId ,
401
+ body : & ' a Body ,
402
+ resolver : Resolver ,
403
+ ) -> Self {
398
404
let krate = owner. module ( db. upcast ( ) ) . krate ( ) ;
399
405
let trait_env = owner
400
406
. as_generic_def_id ( )
@@ -406,46 +412,76 @@ impl<'a> InferenceContext<'a> {
406
412
return_ty : TyKind :: Error . intern ( Interner ) , // set in collect_fn_signature
407
413
db,
408
414
owner,
409
- body : db . body ( owner ) ,
415
+ body,
410
416
resolver,
411
417
diverges : Diverges :: Maybe ,
412
418
breakables : Vec :: new ( ) ,
413
419
}
414
420
}
415
421
416
- fn err_ty ( & self ) -> Ty {
417
- self . result . standard_types . unknown . clone ( )
418
- }
422
+ fn resolve_all ( self ) -> InferenceResult {
423
+ let InferenceContext { mut table, mut result, .. } = self ;
419
424
420
- fn resolve_all ( mut self ) -> InferenceResult {
421
425
// FIXME resolve obligations as well (use Guidance if necessary)
422
- self . table . resolve_obligations_as_possible ( ) ;
426
+ table. resolve_obligations_as_possible ( ) ;
423
427
424
428
// make sure diverging type variables are marked as such
425
- self . table . propagate_diverging_flag ( ) ;
426
- let mut result = std:: mem:: take ( & mut self . result ) ;
429
+ table. propagate_diverging_flag ( ) ;
427
430
for ty in result. type_of_expr . values_mut ( ) {
428
- * ty = self . table . resolve_completely ( ty. clone ( ) ) ;
431
+ * ty = table. resolve_completely ( ty. clone ( ) ) ;
429
432
}
430
433
for ty in result. type_of_pat . values_mut ( ) {
431
- * ty = self . table . resolve_completely ( ty. clone ( ) ) ;
434
+ * ty = table. resolve_completely ( ty. clone ( ) ) ;
432
435
}
433
436
for mismatch in result. type_mismatches . values_mut ( ) {
434
- mismatch. expected = self . table . resolve_completely ( mismatch. expected . clone ( ) ) ;
435
- mismatch. actual = self . table . resolve_completely ( mismatch. actual . clone ( ) ) ;
437
+ mismatch. expected = table. resolve_completely ( mismatch. expected . clone ( ) ) ;
438
+ mismatch. actual = table. resolve_completely ( mismatch. actual . clone ( ) ) ;
436
439
}
437
440
for ( _, subst) in result. method_resolutions . values_mut ( ) {
438
- * subst = self . table . resolve_completely ( subst. clone ( ) ) ;
441
+ * subst = table. resolve_completely ( subst. clone ( ) ) ;
439
442
}
440
443
for adjustment in result. expr_adjustments . values_mut ( ) . flatten ( ) {
441
- adjustment. target = self . table . resolve_completely ( adjustment. target . clone ( ) ) ;
444
+ adjustment. target = table. resolve_completely ( adjustment. target . clone ( ) ) ;
442
445
}
443
446
for adjustment in result. pat_adjustments . values_mut ( ) . flatten ( ) {
444
- adjustment. target = self . table . resolve_completely ( adjustment. target . clone ( ) ) ;
447
+ adjustment. target = table. resolve_completely ( adjustment. target . clone ( ) ) ;
445
448
}
446
449
result
447
450
}
448
451
452
+ fn collect_const ( & mut self , data : & ConstData ) {
453
+ self . return_ty = self . make_ty ( & data. type_ref ) ;
454
+ }
455
+
456
+ fn collect_static ( & mut self , data : & StaticData ) {
457
+ self . return_ty = self . make_ty ( & data. type_ref ) ;
458
+ }
459
+
460
+ fn collect_fn ( & mut self , data : & FunctionData ) {
461
+ let ctx = crate :: lower:: TyLoweringContext :: new ( self . db , & self . resolver )
462
+ . with_impl_trait_mode ( ImplTraitLoweringMode :: Param ) ;
463
+ let param_tys =
464
+ data. params . iter ( ) . map ( |( _, type_ref) | ctx. lower_ty ( type_ref) ) . collect :: < Vec < _ > > ( ) ;
465
+ for ( ty, pat) in param_tys. into_iter ( ) . zip ( self . body . params . iter ( ) ) {
466
+ let ty = self . insert_type_vars ( ty) ;
467
+ let ty = self . normalize_associated_types_in ( ty) ;
468
+
469
+ self . infer_pat ( * pat, & ty, BindingMode :: default ( ) ) ;
470
+ }
471
+ let error_ty = & TypeRef :: Error ;
472
+ let return_ty = if data. has_async_kw ( ) {
473
+ data. async_ret_type . as_deref ( ) . unwrap_or ( error_ty)
474
+ } else {
475
+ & * data. ret_type
476
+ } ;
477
+ let return_ty = self . make_ty_with_mode ( return_ty, ImplTraitLoweringMode :: Disallowed ) ; // FIXME implement RPIT
478
+ self . return_ty = return_ty;
479
+ }
480
+
481
+ fn infer_body ( & mut self ) {
482
+ self . infer_expr_coerce ( self . body . body_expr , & Expectation :: has_type ( self . return_ty . clone ( ) ) ) ;
483
+ }
484
+
449
485
fn write_expr_ty ( & mut self , expr : ExprId , ty : Ty ) {
450
486
self . result . type_of_expr . insert ( expr, ty) ;
451
487
}
@@ -491,6 +527,10 @@ impl<'a> InferenceContext<'a> {
491
527
self . make_ty_with_mode ( type_ref, ImplTraitLoweringMode :: Disallowed )
492
528
}
493
529
530
+ fn err_ty ( & self ) -> Ty {
531
+ self . result . standard_types . unknown . clone ( )
532
+ }
533
+
494
534
/// Replaces ConstScalar::Unknown by a new type var, so we can maybe still infer it.
495
535
fn insert_const_vars_shallow ( & mut self , c : Const ) -> Const {
496
536
let data = c. data ( Interner ) ;
@@ -544,6 +584,16 @@ impl<'a> InferenceContext<'a> {
544
584
self . table . unify ( ty1, ty2)
545
585
}
546
586
587
+ /// Recurses through the given type, normalizing associated types mentioned
588
+ /// in it by replacing them by type variables and registering obligations to
589
+ /// resolve later. This should be done once for every type we get from some
590
+ /// type annotation (e.g. from a let type annotation, field type or function
591
+ /// call). `make_ty` handles this already, but e.g. for field types we need
592
+ /// to do it as well.
593
+ fn normalize_associated_types_in ( & mut self , ty : Ty ) -> Ty {
594
+ self . table . normalize_associated_types_in ( ty)
595
+ }
596
+
547
597
fn resolve_ty_shallow ( & mut self , ty : & Ty ) -> Ty {
548
598
self . resolve_obligations_as_possible ( ) ;
549
599
self . table . resolve_ty_shallow ( ty)
@@ -586,16 +636,6 @@ impl<'a> InferenceContext<'a> {
586
636
}
587
637
}
588
638
589
- /// Recurses through the given type, normalizing associated types mentioned
590
- /// in it by replacing them by type variables and registering obligations to
591
- /// resolve later. This should be done once for every type we get from some
592
- /// type annotation (e.g. from a let type annotation, field type or function
593
- /// call). `make_ty` handles this already, but e.g. for field types we need
594
- /// to do it as well.
595
- fn normalize_associated_types_in ( & mut self , ty : Ty ) -> Ty {
596
- self . table . normalize_associated_types_in ( ty)
597
- }
598
-
599
639
fn resolve_variant ( & mut self , path : Option < & Path > , value_ns : bool ) -> ( Ty , Option < VariantId > ) {
600
640
let path = match path {
601
641
Some ( path) => path,
@@ -727,40 +767,6 @@ impl<'a> InferenceContext<'a> {
727
767
}
728
768
}
729
769
730
- fn collect_const ( & mut self , data : & ConstData ) {
731
- self . return_ty = self . make_ty ( & data. type_ref ) ;
732
- }
733
-
734
- fn collect_static ( & mut self , data : & StaticData ) {
735
- self . return_ty = self . make_ty ( & data. type_ref ) ;
736
- }
737
-
738
- fn collect_fn ( & mut self , data : & FunctionData ) {
739
- let body = Arc :: clone ( & self . body ) ; // avoid borrow checker problem
740
- let ctx = crate :: lower:: TyLoweringContext :: new ( self . db , & self . resolver )
741
- . with_impl_trait_mode ( ImplTraitLoweringMode :: Param ) ;
742
- let param_tys =
743
- data. params . iter ( ) . map ( |( _, type_ref) | ctx. lower_ty ( type_ref) ) . collect :: < Vec < _ > > ( ) ;
744
- for ( ty, pat) in param_tys. into_iter ( ) . zip ( body. params . iter ( ) ) {
745
- let ty = self . insert_type_vars ( ty) ;
746
- let ty = self . normalize_associated_types_in ( ty) ;
747
-
748
- self . infer_pat ( * pat, & ty, BindingMode :: default ( ) ) ;
749
- }
750
- let error_ty = & TypeRef :: Error ;
751
- let return_ty = if data. has_async_kw ( ) {
752
- data. async_ret_type . as_deref ( ) . unwrap_or ( error_ty)
753
- } else {
754
- & * data. ret_type
755
- } ;
756
- let return_ty = self . make_ty_with_mode ( return_ty, ImplTraitLoweringMode :: Disallowed ) ; // FIXME implement RPIT
757
- self . return_ty = return_ty;
758
- }
759
-
760
- fn infer_body ( & mut self ) {
761
- self . infer_expr_coerce ( self . body . body_expr , & Expectation :: has_type ( self . return_ty . clone ( ) ) ) ;
762
- }
763
-
764
770
fn resolve_lang_item ( & self , name : Name ) -> Option < LangItemTarget > {
765
771
let krate = self . resolver . krate ( ) ;
766
772
self . db . lang_item ( krate, name. to_smol_str ( ) )
0 commit comments