diff options
Diffstat (limited to 'crates/ra_hir/src')
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index a379b9f49..e86077dd6 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -26,8 +26,10 @@ use hir_ty::{ | |||
26 | autoderef, | 26 | autoderef, |
27 | display::{HirDisplayError, HirFormatter}, | 27 | display::{HirDisplayError, HirFormatter}, |
28 | expr::ExprValidator, | 28 | expr::ExprValidator, |
29 | method_resolution, ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, | 29 | method_resolution, |
30 | TraitEnvironment, Ty, TyDefId, TypeCtor, | 30 | unsafe_validation::UnsafeValidator, |
31 | ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, TraitEnvironment, Ty, | ||
32 | TyDefId, TypeCtor, | ||
31 | }; | 33 | }; |
32 | use ra_db::{CrateId, CrateName, Edition, FileId}; | 34 | use ra_db::{CrateId, CrateName, Edition, FileId}; |
33 | use ra_prof::profile; | 35 | use ra_prof::profile; |
@@ -541,7 +543,7 @@ impl_froms!(Adt: Struct, Union, Enum); | |||
541 | impl Adt { | 543 | impl Adt { |
542 | pub fn has_non_default_type_params(self, db: &dyn HirDatabase) -> bool { | 544 | pub fn has_non_default_type_params(self, db: &dyn HirDatabase) -> bool { |
543 | let subst = db.generic_defaults(self.into()); | 545 | let subst = db.generic_defaults(self.into()); |
544 | subst.iter().any(|ty| ty == &Ty::Unknown) | 546 | subst.iter().any(|ty| &ty.value == &Ty::Unknown) |
545 | } | 547 | } |
546 | 548 | ||
547 | /// Turns this ADT into a type. Any type parameters of the ADT will be | 549 | /// Turns this ADT into a type. Any type parameters of the ADT will be |
@@ -677,7 +679,9 @@ impl Function { | |||
677 | let _p = profile("Function::diagnostics"); | 679 | let _p = profile("Function::diagnostics"); |
678 | let infer = db.infer(self.id.into()); | 680 | let infer = db.infer(self.id.into()); |
679 | infer.add_diagnostics(db, self.id, sink); | 681 | infer.add_diagnostics(db, self.id, sink); |
680 | let mut validator = ExprValidator::new(self.id, infer, sink); | 682 | let mut validator = ExprValidator::new(self.id, infer.clone(), sink); |
683 | validator.validate_body(db); | ||
684 | let mut validator = UnsafeValidator::new(self.id, infer, sink); | ||
681 | validator.validate_body(db); | 685 | validator.validate_body(db); |
682 | } | 686 | } |
683 | } | 687 | } |
@@ -771,7 +775,7 @@ pub struct TypeAlias { | |||
771 | impl TypeAlias { | 775 | impl TypeAlias { |
772 | pub fn has_non_default_type_params(self, db: &dyn HirDatabase) -> bool { | 776 | pub fn has_non_default_type_params(self, db: &dyn HirDatabase) -> bool { |
773 | let subst = db.generic_defaults(self.id.into()); | 777 | let subst = db.generic_defaults(self.id.into()); |
774 | subst.iter().any(|ty| ty == &Ty::Unknown) | 778 | subst.iter().any(|ty| &ty.value == &Ty::Unknown) |
775 | } | 779 | } |
776 | 780 | ||
777 | pub fn module(self, db: &dyn HirDatabase) -> Module { | 781 | pub fn module(self, db: &dyn HirDatabase) -> Module { |
@@ -1031,7 +1035,10 @@ impl TypeParam { | |||
1031 | let local_idx = hir_ty::param_idx(db, self.id)?; | 1035 | let local_idx = hir_ty::param_idx(db, self.id)?; |
1032 | let resolver = self.id.parent.resolver(db.upcast()); | 1036 | let resolver = self.id.parent.resolver(db.upcast()); |
1033 | let environment = TraitEnvironment::lower(db, &resolver); | 1037 | let environment = TraitEnvironment::lower(db, &resolver); |
1034 | params.get(local_idx).cloned().map(|ty| Type { | 1038 | let ty = params.get(local_idx)?.clone(); |
1039 | let subst = Substs::type_params(db, self.id.parent); | ||
1040 | let ty = ty.subst(&subst.prefix(local_idx)); | ||
1041 | Some(Type { | ||
1035 | krate: self.id.parent.module(db.upcast()).krate, | 1042 | krate: self.id.parent.module(db.upcast()).krate, |
1036 | ty: InEnvironment { value: ty, environment }, | 1043 | ty: InEnvironment { value: ty, environment }, |
1037 | }) | 1044 | }) |