From 22a65b11b3a69b3dae561b34c6b28cb2107169d1 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 24 Jan 2020 14:32:47 +0100 Subject: Introduce TyLoweringContext --- crates/ra_hir_ty/src/infer/path.rs | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) (limited to 'crates/ra_hir_ty/src/infer/path.rs') diff --git a/crates/ra_hir_ty/src/infer/path.rs b/crates/ra_hir_ty/src/infer/path.rs index 2c1d4831d..132f3d6f2 100644 --- a/crates/ra_hir_ty/src/infer/path.rs +++ b/crates/ra_hir_ty/src/infer/path.rs @@ -11,7 +11,7 @@ use hir_expand::name::Name; use crate::{db::HirDatabase, method_resolution, Substs, Ty, TypeWalk, ValueTyDefId}; -use super::{ExprOrPatId, InferenceContext, TraitEnvironment, TraitRef}; +use super::{ExprOrPatId, InferenceContext, TraitRef}; impl<'a, D: HirDatabase> InferenceContext<'a, D> { pub(super) fn infer_path( @@ -39,7 +39,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { } let ty = self.make_ty(type_ref); let remaining_segments_for_ty = path.segments().take(path.segments().len() - 1); - let ty = Ty::from_type_relative_path(self.db, resolver, ty, remaining_segments_for_ty); + let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &resolver }; + let ty = Ty::from_type_relative_path(&ctx, ty, remaining_segments_for_ty); self.resolve_ty_assoc_item( ty, &path.segments().last().expect("path had at least one segment").name, @@ -73,7 +74,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { if let Some(self_subst) = self_subst { ty = ty.subst(&self_subst); } - let substs = Ty::substs_from_path(self.db, &self.resolver, path, typable); + let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; + let substs = Ty::substs_from_path(&ctx, path, typable); let ty = ty.subst(&substs); Some(ty) } @@ -98,13 +100,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { (TypeNs::TraitId(trait_), true) => { let segment = remaining_segments.last().expect("there should be at least one segment here"); - let trait_ref = TraitRef::from_resolved_path( - self.db, - &self.resolver, - trait_.into(), - resolved_segment, - None, - ); + let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; + let trait_ref = + TraitRef::from_resolved_path(&ctx, trait_.into(), resolved_segment, None); self.resolve_trait_assoc_item(trait_ref, segment, id) } (def, _) => { @@ -114,9 +112,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { // as Iterator>::Item::default`) let remaining_segments_for_ty = remaining_segments.take(remaining_segments.len() - 1); + let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; let ty = Ty::from_partly_resolved_hir_path( - self.db, - &self.resolver, + &ctx, def, resolved_segment, remaining_segments_for_ty, @@ -193,14 +191,13 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { } let canonical_ty = self.canonicalizer().canonicalize_ty(ty.clone()); - let env = TraitEnvironment::lower(self.db, &self.resolver); let krate = self.resolver.krate()?; let traits_in_scope = self.resolver.traits_in_scope(self.db); method_resolution::iterate_method_candidates( &canonical_ty.value, self.db, - env, + self.trait_env.clone(), krate, &traits_in_scope, Some(name), -- cgit v1.2.3 From 7ea4bce1b292d455c313f914b3aa3051293c502b Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 24 Jan 2020 15:22:00 +0100 Subject: Add impl trait lowering mode --- crates/ra_hir_ty/src/infer/path.rs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir_ty/src/infer/path.rs') diff --git a/crates/ra_hir_ty/src/infer/path.rs b/crates/ra_hir_ty/src/infer/path.rs index 132f3d6f2..02fc99288 100644 --- a/crates/ra_hir_ty/src/infer/path.rs +++ b/crates/ra_hir_ty/src/infer/path.rs @@ -9,7 +9,10 @@ use hir_def::{ }; use hir_expand::name::Name; -use crate::{db::HirDatabase, method_resolution, Substs, Ty, TypeWalk, ValueTyDefId}; +use crate::{ + db::HirDatabase, lower::ImplTraitLoweringMode, method_resolution, Substs, Ty, TypeWalk, + ValueTyDefId, +}; use super::{ExprOrPatId, InferenceContext, TraitRef}; @@ -39,7 +42,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { } let ty = self.make_ty(type_ref); let remaining_segments_for_ty = path.segments().take(path.segments().len() - 1); - let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &resolver }; + let ctx = crate::lower::TyLoweringContext { + db: self.db, + resolver: &resolver, + impl_trait_mode: ImplTraitLoweringMode::Disallowed, + }; let ty = Ty::from_type_relative_path(&ctx, ty, remaining_segments_for_ty); self.resolve_ty_assoc_item( ty, @@ -74,7 +81,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { if let Some(self_subst) = self_subst { ty = ty.subst(&self_subst); } - let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; + let ctx = crate::lower::TyLoweringContext { + db: self.db, + resolver: &self.resolver, + impl_trait_mode: ImplTraitLoweringMode::Disallowed, + }; let substs = Ty::substs_from_path(&ctx, path, typable); let ty = ty.subst(&substs); Some(ty) @@ -100,7 +111,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { (TypeNs::TraitId(trait_), true) => { let segment = remaining_segments.last().expect("there should be at least one segment here"); - let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; + let ctx = crate::lower::TyLoweringContext { + db: self.db, + resolver: &self.resolver, + impl_trait_mode: ImplTraitLoweringMode::Disallowed, + }; let trait_ref = TraitRef::from_resolved_path(&ctx, trait_.into(), resolved_segment, None); self.resolve_trait_assoc_item(trait_ref, segment, id) @@ -112,7 +127,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { // as Iterator>::Item::default`) let remaining_segments_for_ty = remaining_segments.take(remaining_segments.len() - 1); - let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; + let ctx = crate::lower::TyLoweringContext { + db: self.db, + resolver: &self.resolver, + impl_trait_mode: ImplTraitLoweringMode::Disallowed, + }; let ty = Ty::from_partly_resolved_hir_path( &ctx, def, -- cgit v1.2.3 From 16c69374471a0072541c21a5551b4fd97f7e12ba Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sat, 25 Jan 2020 23:38:33 +0100 Subject: Lower impl trait to variables, move away from using placeholders where they don't belong --- crates/ra_hir_ty/src/infer/path.rs | 55 ++++++++++++-------------------------- 1 file changed, 17 insertions(+), 38 deletions(-) (limited to 'crates/ra_hir_ty/src/infer/path.rs') diff --git a/crates/ra_hir_ty/src/infer/path.rs b/crates/ra_hir_ty/src/infer/path.rs index 02fc99288..39aa346eb 100644 --- a/crates/ra_hir_ty/src/infer/path.rs +++ b/crates/ra_hir_ty/src/infer/path.rs @@ -10,8 +10,8 @@ use hir_def::{ use hir_expand::name::Name; use crate::{ - db::HirDatabase, lower::ImplTraitLoweringMode, method_resolution, Substs, Ty, TypeWalk, - ValueTyDefId, + db::HirDatabase, method_resolution, Substs, Ty, + ValueTyDefId }; use super::{ExprOrPatId, InferenceContext, TraitRef}; @@ -42,11 +42,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { } let ty = self.make_ty(type_ref); let remaining_segments_for_ty = path.segments().take(path.segments().len() - 1); - let ctx = crate::lower::TyLoweringContext { - db: self.db, - resolver: &resolver, - impl_trait_mode: ImplTraitLoweringMode::Disallowed, - }; + let ctx = crate::lower::TyLoweringContext::new(self.db, &resolver); let ty = Ty::from_type_relative_path(&ctx, ty, remaining_segments_for_ty); self.resolve_ty_assoc_item( ty, @@ -77,17 +73,16 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { ValueNs::EnumVariantId(it) => it.into(), }; - let mut ty = self.db.value_ty(typable); - if let Some(self_subst) = self_subst { - ty = ty.subst(&self_subst); - } - let ctx = crate::lower::TyLoweringContext { - db: self.db, - resolver: &self.resolver, - impl_trait_mode: ImplTraitLoweringMode::Disallowed, - }; + let ty = self.db.value_ty(typable); + // self_subst is just for the parent + let parent_substs = self_subst.unwrap_or_else(Substs::empty); + let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver); let substs = Ty::substs_from_path(&ctx, path, typable); - let ty = ty.subst(&substs); + let full_substs = Substs::builder(substs.len()) + .use_parent_substs(&parent_substs) + .fill(substs.0[parent_substs.len()..].iter().cloned()) + .build(); + let ty = ty.subst(&full_substs); Some(ty) } @@ -111,11 +106,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { (TypeNs::TraitId(trait_), true) => { let segment = remaining_segments.last().expect("there should be at least one segment here"); - let ctx = crate::lower::TyLoweringContext { - db: self.db, - resolver: &self.resolver, - impl_trait_mode: ImplTraitLoweringMode::Disallowed, - }; + let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver); let trait_ref = TraitRef::from_resolved_path(&ctx, trait_.into(), resolved_segment, None); self.resolve_trait_assoc_item(trait_ref, segment, id) @@ -127,11 +118,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { // as Iterator>::Item::default`) let remaining_segments_for_ty = remaining_segments.take(remaining_segments.len() - 1); - let ctx = crate::lower::TyLoweringContext { - db: self.db, - resolver: &self.resolver, - impl_trait_mode: ImplTraitLoweringMode::Disallowed, - }; + let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver); let ty = Ty::from_partly_resolved_hir_path( &ctx, def, @@ -235,12 +222,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { .fill(iter::repeat_with(|| self.table.new_type_var())) .build(); let impl_self_ty = self.db.impl_self_ty(impl_id).subst(&impl_substs); - let substs = Substs::build_for_def(self.db, item) - .use_parent_substs(&impl_substs) - .fill_with_params() - .build(); self.unify(&impl_self_ty, &ty); - Some(substs) + Some(impl_substs) } AssocContainerId::TraitId(trait_) => { // we're picking this method @@ -248,15 +231,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { .push(ty.clone()) .fill(std::iter::repeat_with(|| self.table.new_type_var())) .build(); - let substs = Substs::build_for_def(self.db, item) - .use_parent_substs(&trait_substs) - .fill_with_params() - .build(); self.obligations.push(super::Obligation::Trait(TraitRef { trait_, - substs: trait_substs, + substs: trait_substs.clone(), })); - Some(substs) + Some(trait_substs) } AssocContainerId::ContainerId(_) => None, }; -- cgit v1.2.3 From 4a8279a21ad75ae2cb6d96746b8a880038ec0455 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 31 Jan 2020 15:34:43 +0100 Subject: Fix another test --- crates/ra_hir_ty/src/infer/path.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'crates/ra_hir_ty/src/infer/path.rs') diff --git a/crates/ra_hir_ty/src/infer/path.rs b/crates/ra_hir_ty/src/infer/path.rs index 39aa346eb..fcf13b0b3 100644 --- a/crates/ra_hir_ty/src/infer/path.rs +++ b/crates/ra_hir_ty/src/infer/path.rs @@ -177,13 +177,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { AssocItemId::ConstId(c) => ValueNs::ConstId(c), AssocItemId::TypeAliasId(_) => unreachable!(), }; - let substs = Substs::build_for_def(self.db, item) - .use_parent_substs(&trait_ref.substs) - .fill_with_params() - .build(); self.write_assoc_resolution(id, item); - Some((def, Some(substs))) + Some((def, Some(trait_ref.substs))) } fn resolve_ty_assoc_item( -- cgit v1.2.3 From dded90a748737c3661aad043524f2248e324c867 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 7 Feb 2020 15:13:15 +0100 Subject: Formatting --- crates/ra_hir_ty/src/infer/path.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'crates/ra_hir_ty/src/infer/path.rs') diff --git a/crates/ra_hir_ty/src/infer/path.rs b/crates/ra_hir_ty/src/infer/path.rs index fcf13b0b3..686ce7a21 100644 --- a/crates/ra_hir_ty/src/infer/path.rs +++ b/crates/ra_hir_ty/src/infer/path.rs @@ -9,10 +9,7 @@ use hir_def::{ }; use hir_expand::name::Name; -use crate::{ - db::HirDatabase, method_resolution, Substs, Ty, - ValueTyDefId -}; +use crate::{db::HirDatabase, method_resolution, Substs, Ty, ValueTyDefId}; use super::{ExprOrPatId, InferenceContext, TraitRef}; -- cgit v1.2.3