Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/path.rs')
| -rw-r--r-- | crates/hir-ty/src/infer/path.rs | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs index 6254bc1239..9d4bbe5346 100644 --- a/crates/hir-ty/src/infer/path.rs +++ b/crates/hir-ty/src/infer/path.rs @@ -2,21 +2,23 @@ use chalk_ir::cast::Cast; use hir_def::{ - path::{Path, PathSegment}, - resolver::{ResolveValueResult, TypeNs, ValueNs}, AdtId, AssocItemId, GenericDefId, ItemContainerId, Lookup, + expr_store::path::{Path, PathSegment}, + resolver::{ResolveValueResult, TypeNs, ValueNs}, }; use hir_expand::name::Name; use stdx::never; use crate::{ + InferenceDiagnostic, Interner, Substitution, TraitRef, TraitRefExt, Ty, TyBuilder, TyExt, + TyKind, ValueTyDefId, builder::ParamKind, consteval, error_lifetime, generics::generics, infer::diagnostics::InferenceTyLoweringContext as TyLoweringContext, + lower::LifetimeElisionKind, method_resolution::{self, VisibleFromModule}, - to_chalk_trait_id, InferenceDiagnostic, Interner, Substitution, TraitRef, TraitRefExt, Ty, - TyBuilder, TyExt, TyKind, ValueTyDefId, + to_chalk_trait_id, }; use super::{ExprOrPatId, InferenceContext, InferenceTyDiagnosticSource}; @@ -63,10 +65,10 @@ impl InferenceContext<'_> { never!("uninferred pattern?"); None } - } + }; } ValueNs::ImplSelf(impl_id) => { - let generics = crate::generics::generics(self.db.upcast(), impl_id.into()); + let generics = crate::generics::generics(self.db, impl_id.into()); let substs = generics.placeholder_subst(self.db); let ty = self.db.impl_self_ty(impl_id).substitute(Interner, &substs); return if let Some((AdtId::StructId(struct_id), substs)) = ty.as_adt() { @@ -81,7 +83,7 @@ impl InferenceContext<'_> { }; } ValueNs::GenericParam(it) => { - return Some(ValuePathResolution::NonGeneric(self.db.const_param_ty(it))) + return Some(ValuePathResolution::NonGeneric(self.db.const_param_ty(it))); } }; @@ -99,16 +101,14 @@ impl InferenceContext<'_> { if let Some(last_segment) = last_segment { path_ctx.set_current_segment(last_segment) } - path_ctx.substs_from_path(value_def, true) + path_ctx.substs_from_path(value_def, true, false) }); let substs = substs.as_slice(Interner); if let ValueNs::EnumVariantId(_) = value { - let mut it = self_subst - .as_ref() - .map_or(&[][..], |s| s.as_slice(Interner)) + let mut it = substs .iter() - .chain(substs) + .chain(self_subst.as_ref().map_or(&[][..], |s| s.as_slice(Interner))) .cloned(); let builder = TyBuilder::subst_for_def(self.db, generic_def, None); let substs = builder @@ -127,13 +127,13 @@ impl InferenceContext<'_> { } let parent_substs = self_subst.or_else(|| { - let generics = generics(self.db.upcast(), generic_def); + let generics = generics(self.db, generic_def); let parent_params_len = generics.parent_generics()?.len(); - let parent_args = &substs[substs.len() - parent_params_len..]; + let parent_args = &substs[..parent_params_len]; Some(Substitution::from_iter(Interner, parent_args)) }); let parent_substs_len = parent_substs.as_ref().map_or(0, |s| s.len(Interner)); - let mut it = substs.iter().take(substs.len() - parent_substs_len).cloned(); + let mut it = substs.iter().skip(parent_substs_len).cloned(); let builder = TyBuilder::subst_for_def(self.db, generic_def, parent_substs); let substs = builder .fill(|x| { @@ -158,10 +158,11 @@ impl InferenceContext<'_> { let mut ctx = TyLoweringContext::new( self.db, &self.resolver, - &self.body.types, - self.owner.into(), + self.body, &self.diagnostics, InferenceTyDiagnosticSource::Body, + self.generic_def, + LifetimeElisionKind::Infer, ); let mut path_ctx = if no_diagnostics { ctx.at_path_forget_diagnostics(path) @@ -176,7 +177,7 @@ impl InferenceContext<'_> { let ty = self.table.normalize_associated_types_in(ty); path_ctx.ignore_last_segment(); - let (ty, _) = path_ctx.lower_ty_relative_path(ty, orig_ns); + let (ty, _) = path_ctx.lower_ty_relative_path(ty, orig_ns, true); drop_ctx(ctx, no_diagnostics); let ty = self.table.insert_type_vars(ty); let ty = self.table.normalize_associated_types_in(ty); @@ -206,7 +207,7 @@ impl InferenceContext<'_> { (TypeNs::TraitId(trait_), true) => { let self_ty = self.table.new_type_var(); let trait_ref = - path_ctx.lower_trait_ref_from_resolved_path(trait_, self_ty); + path_ctx.lower_trait_ref_from_resolved_path(trait_, self_ty, true); drop_ctx(ctx, no_diagnostics); self.resolve_trait_assoc_item(trait_ref, last_segment, id) } @@ -254,15 +255,15 @@ impl InferenceContext<'_> { // We need to add `Self: Trait` obligation when `def` is a trait assoc item. let container = match def { - GenericDefId::FunctionId(id) => id.lookup(self.db.upcast()).container, - GenericDefId::ConstId(id) => id.lookup(self.db.upcast()).container, + GenericDefId::FunctionId(id) => id.lookup(self.db).container, + GenericDefId::ConstId(id) => id.lookup(self.db).container, _ => return, }; if let ItemContainerId::TraitId(trait_) = container { - let param_len = generics(self.db.upcast(), def).len_self(); + let parent_len = generics(self.db, def).parent_generics().map_or(0, |g| g.len_self()); let parent_subst = - Substitution::from_iter(Interner, subst.iter(Interner).skip(param_len)); + Substitution::from_iter(Interner, subst.iter(Interner).take(parent_len)); let trait_ref = TraitRef { trait_id: to_chalk_trait_id(trait_), substitution: parent_subst }; self.push_obligation(trait_ref.cast(Interner)); @@ -277,10 +278,10 @@ impl InferenceContext<'_> { ) -> Option<(ValueNs, Substitution)> { let trait_ = trait_ref.hir_trait_id(); let item = - self.db.trait_data(trait_).items.iter().map(|(_name, id)| *id).find_map(|item| { + self.db.trait_items(trait_).items.iter().map(|(_name, id)| *id).find_map(|item| { match item { AssocItemId::FunctionId(func) => { - if segment.name == &self.db.function_data(func).name { + if segment.name == &self.db.function_signature(func).name { Some(AssocItemId::FunctionId(func)) } else { None @@ -288,7 +289,7 @@ impl InferenceContext<'_> { } AssocItemId::ConstId(konst) => { - if self.db.const_data(konst).name.as_ref() == Some(segment.name) { + if self.db.const_signature(konst).name.as_ref() == Some(segment.name) { Some(AssocItemId::ConstId(konst)) } else { None @@ -350,10 +351,8 @@ impl InferenceContext<'_> { let (item, visible) = res?; let (def, container) = match item { - AssocItemId::FunctionId(f) => { - (ValueNs::FunctionId(f), f.lookup(self.db.upcast()).container) - } - AssocItemId::ConstId(c) => (ValueNs::ConstId(c), c.lookup(self.db.upcast()).container), + AssocItemId::FunctionId(f) => (ValueNs::FunctionId(f), f.lookup(self.db).container), + AssocItemId::ConstId(c) => (ValueNs::ConstId(c), c.lookup(self.db).container), AssocItemId::TypeAliasId(_) => unreachable!(), }; let substs = match container { @@ -398,7 +397,7 @@ impl InferenceContext<'_> { Some((AdtId::EnumId(e), subst)) => (e, subst), _ => return None, }; - let enum_data = self.db.enum_data(enum_id); + let enum_data = self.db.enum_variants(enum_id); let variant = enum_data.variant(name)?; self.write_variant_resolution(id, variant.into()); Some((ValueNs::EnumVariantId(variant), subst.clone())) |