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.rs61
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()))