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.rs54
1 files changed, 32 insertions, 22 deletions
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs
index a6296c3af2..d79bf9a05e 100644
--- a/crates/hir-ty/src/infer/path.rs
+++ b/crates/hir-ty/src/infer/path.rs
@@ -14,6 +14,7 @@ use crate::{
builder::ParamKind,
consteval, error_lifetime,
generics::generics,
+ infer::diagnostics::InferenceTyLoweringContext as TyLoweringContext,
method_resolution::{self, VisibleFromModule},
to_chalk_trait_id, InferenceDiagnostic, Interner, Substitution, TraitRef, TraitRefExt, Ty,
TyBuilder, TyExt, TyKind, ValueTyDefId,
@@ -147,36 +148,38 @@ impl InferenceContext<'_> {
path: &Path,
id: ExprOrPatId,
) -> Option<(ValueNs, Option<chalk_ir::Substitution<Interner>>)> {
+ // Don't use `self.make_ty()` here as we need `orig_ns`.
+ let mut ctx = TyLoweringContext::new(
+ self.db,
+ &self.resolver,
+ &self.body.types,
+ self.owner.into(),
+ &self.diagnostics,
+ InferenceTyDiagnosticSource::Body,
+ );
let (value, self_subst) = if let Some(type_ref) = path.type_anchor() {
let last = path.segments().last()?;
- // Don't use `self.make_ty()` here as we need `orig_ns`.
- let mut 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);
let remaining_segments_for_ty = path.segments().take(path.segments().len() - 1);
let (ty, _) = ctx.lower_ty_relative_path(ty, orig_ns, remaining_segments_for_ty);
- self.push_ty_diagnostics(InferenceTyDiagnosticSource::Body, ctx.diagnostics);
+ drop(ctx);
let ty = self.table.insert_type_vars(ty);
let ty = self.table.normalize_associated_types_in(ty);
self.resolve_ty_assoc_item(ty, last.name, id).map(|(it, substs)| (it, Some(substs)))?
} else {
let hygiene = self.body.expr_or_pat_path_hygiene(id);
// FIXME: report error, unresolved first path segment
- let value_or_partial =
- self.resolver.resolve_path_in_value_ns(self.db.upcast(), path, hygiene)?;
+ let value_or_partial = ctx.resolve_path_in_value_ns(path, id, hygiene)?;
+ drop(ctx);
match value_or_partial {
ResolveValueResult::ValueNs(it, _) => (it, None),
ResolveValueResult::Partial(def, remaining_index, _) => self
- .resolve_assoc_item(def, path, remaining_index, id)
+ .resolve_assoc_item(id, def, path, remaining_index, id)
.map(|(it, substs)| (it, Some(substs)))?,
}
};
@@ -212,6 +215,7 @@ impl InferenceContext<'_> {
fn resolve_assoc_item(
&mut self,
+ node: ExprOrPatId,
def: TypeNs,
path: &Path,
remaining_index: usize,
@@ -260,17 +264,23 @@ impl InferenceContext<'_> {
// as Iterator>::Item::default`)
let remaining_segments_for_ty =
remaining_segments.take(remaining_segments.len() - 1);
- let (ty, _) = self.with_body_ty_lowering(|ctx| {
- ctx.lower_partly_resolved_path(
- def,
- resolved_segment,
- remaining_segments_for_ty,
- true,
- &mut |_, _reason| {
- // FIXME: Report an error.
- },
- )
- });
+ let mut ctx = TyLoweringContext::new(
+ self.db,
+ &self.resolver,
+ &self.body.types,
+ self.owner.into(),
+ &self.diagnostics,
+ InferenceTyDiagnosticSource::Body,
+ );
+ let (ty, _) = ctx.lower_partly_resolved_path(
+ node,
+ def,
+ resolved_segment,
+ remaining_segments_for_ty,
+ (remaining_index - 1) as u32,
+ true,
+ );
+ drop(ctx);
if ty.is_unknown() {
return None;
}