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.rs47
1 files changed, 20 insertions, 27 deletions
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs
index 44c496c054..442daa9f9e 100644
--- a/crates/hir-ty/src/infer/path.rs
+++ b/crates/hir-ty/src/infer/path.rs
@@ -94,8 +94,7 @@ impl InferenceContext<'_> {
return Some(ValuePathResolution::NonGeneric(ty));
};
- let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver, self.owner.into());
- let substs = ctx.substs_from_path(path, value_def, true);
+ let substs = self.with_body_ty_lowering(|ctx| ctx.substs_from_path(path, value_def, true));
let substs = substs.as_slice(Interner);
if let ValueNs::EnumVariantId(_) = value {
@@ -152,8 +151,12 @@ impl InferenceContext<'_> {
let last = path.segments().last()?;
// Don't use `self.make_ty()` here as we need `orig_ns`.
- let ctx =
- crate::lower::TyLoweringContext::new(self.db, &self.resolver, self.owner.into());
+ let ctx = crate::lower::TyLoweringContext::new(
+ self.db,
+ &self.resolver,
+ &self.body.types,
+ self.owner.into(),
+ );
let (ty, orig_ns) = ctx.lower_ty_ext(type_ref);
let ty = self.table.insert_type_vars(ty);
let ty = self.table.normalize_associated_types_in(ty);
@@ -219,7 +222,7 @@ impl InferenceContext<'_> {
let _d;
let (resolved_segment, remaining_segments) = match path {
- Path::Normal { .. } => {
+ Path::Normal { .. } | Path::BarePath(_) => {
assert!(remaining_index < path.segments().len());
(
path.segments().get(remaining_index - 1).unwrap(),
@@ -243,17 +246,10 @@ impl InferenceContext<'_> {
(TypeNs::TraitId(trait_), true) => {
let segment =
remaining_segments.last().expect("there should be at least one segment here");
- let ctx = crate::lower::TyLoweringContext::new(
- self.db,
- &self.resolver,
- self.owner.into(),
- );
- let trait_ref = ctx.lower_trait_ref_from_resolved_path(
- trait_,
- resolved_segment,
- self.table.new_type_var(),
- );
-
+ let self_ty = self.table.new_type_var();
+ let trait_ref = self.with_body_ty_lowering(|ctx| {
+ ctx.lower_trait_ref_from_resolved_path(trait_, resolved_segment, self_ty)
+ });
self.resolve_trait_assoc_item(trait_ref, segment, id)
}
(def, _) => {
@@ -263,17 +259,14 @@ impl InferenceContext<'_> {
// as Iterator>::Item::default`)
let remaining_segments_for_ty =
remaining_segments.take(remaining_segments.len() - 1);
- let ctx = crate::lower::TyLoweringContext::new(
- self.db,
- &self.resolver,
- self.owner.into(),
- );
- let (ty, _) = ctx.lower_partly_resolved_path(
- def,
- resolved_segment,
- remaining_segments_for_ty,
- true,
- );
+ let (ty, _) = self.with_body_ty_lowering(|ctx| {
+ ctx.lower_partly_resolved_path(
+ def,
+ resolved_segment,
+ remaining_segments_for_ty,
+ true,
+ )
+ });
if ty.is_unknown() {
return None;
}