Skip to content

Commit fcc246e

Browse files
committed
Remove pointless canonicalizing in method_resolution
1 parent d21f888 commit fcc246e

File tree

1 file changed

+18
-27
lines changed

1 file changed

+18
-27
lines changed

crates/hir-ty/src/method_resolution.rs

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use std::ops::ControlFlow;
66

77
use base_db::{CrateId, Edition};
8-
use chalk_ir::{cast::Cast, Mutability, TyKind, UniverseIndex, WhereClause};
8+
use chalk_ir::{cast::Cast, Mutability, TyKind, TyVariableKind, UniverseIndex, WhereClause};
99
use hir_def::{
1010
data::{adt::StructFlags, ImplData},
1111
nameres::DefMap,
@@ -1000,14 +1000,14 @@ pub fn iterate_method_candidates_dyn(
10001000
#[tracing::instrument(skip_all, fields(name = ?name))]
10011001
fn iterate_method_candidates_with_autoref(
10021002
table: &mut InferenceTable<'_>,
1003-
receiver_ty: Canonical<Ty>,
1003+
receiver_ty: Ty,
10041004
first_adjustment: ReceiverAdjustments,
10051005
traits_in_scope: &FxHashSet<TraitId>,
10061006
visible_from_module: VisibleFromModule,
10071007
name: Option<&Name>,
10081008
mut callback: &mut dyn FnMut(ReceiverAdjustments, AssocItemId, bool) -> ControlFlow<()>,
10091009
) -> ControlFlow<()> {
1010-
if receiver_ty.value.is_general_var(Interner, &receiver_ty.binders) {
1010+
if let TyKind::InferenceVar(_, TyVariableKind::General) = receiver_ty.kind(Interner) {
10111011
// don't try to resolve methods on unknown types
10121012
return ControlFlow::Continue(());
10131013
}
@@ -1025,43 +1025,36 @@ fn iterate_method_candidates_with_autoref(
10251025
};
10261026

10271027
let mut maybe_reborrowed = first_adjustment.clone();
1028-
if let Some((_, _, m)) = receiver_ty.value.as_reference() {
1028+
if let Some((_, _, m)) = receiver_ty.as_reference() {
10291029
// Prefer reborrow of references to move
10301030
maybe_reborrowed.autoref = Some(m);
10311031
maybe_reborrowed.autoderefs += 1;
10321032
}
10331033

10341034
iterate_method_candidates_by_receiver(receiver_ty.clone(), maybe_reborrowed)?;
10351035

1036-
let refed = Canonical {
1037-
value: TyKind::Ref(Mutability::Not, static_lifetime(), receiver_ty.value.clone())
1038-
.intern(Interner),
1039-
binders: receiver_ty.binders.clone(),
1040-
};
1036+
let refed =
1037+
TyKind::Ref(Mutability::Not, static_lifetime(), receiver_ty.clone()).intern(Interner);
10411038

10421039
iterate_method_candidates_by_receiver(refed, first_adjustment.with_autoref(Mutability::Not))?;
10431040

1044-
let ref_muted = Canonical {
1045-
value: TyKind::Ref(Mutability::Mut, static_lifetime(), receiver_ty.value.clone())
1046-
.intern(Interner),
1047-
binders: receiver_ty.binders.clone(),
1048-
};
1041+
let ref_muted =
1042+
TyKind::Ref(Mutability::Mut, static_lifetime(), receiver_ty.clone()).intern(Interner);
10491043

10501044
iterate_method_candidates_by_receiver(ref_muted, first_adjustment.with_autoref(Mutability::Mut))
10511045
}
10521046

10531047
#[tracing::instrument(skip_all, fields(name = ?name))]
10541048
fn iterate_method_candidates_by_receiver(
10551049
table: &mut InferenceTable<'_>,
1056-
receiver_ty: Canonical<Ty>,
1050+
receiver_ty: Ty,
10571051
receiver_adjustments: ReceiverAdjustments,
10581052
traits_in_scope: &FxHashSet<TraitId>,
10591053
visible_from_module: VisibleFromModule,
10601054
name: Option<&Name>,
10611055
mut callback: &mut dyn FnMut(ReceiverAdjustments, AssocItemId, bool) -> ControlFlow<()>,
10621056
) -> ControlFlow<()> {
10631057
table.run_in_snapshot(|table| {
1064-
let receiver_ty = table.instantiate_canonical(receiver_ty.clone());
10651058
// We're looking for methods with *receiver* type receiver_ty. These could
10661059
// be found in any of the derefs of receiver_ty, so we have to go through
10671060
// that, including raw derefs.
@@ -1358,7 +1351,8 @@ pub(crate) fn resolve_indexing_op(
13581351
let ty = table.instantiate_canonical(ty);
13591352
let deref_chain = autoderef_method_receiver(&mut table, ty);
13601353
for (ty, adj) in deref_chain {
1361-
let goal = generic_implements_goal(db, &table.trait_env, index_trait, &ty);
1354+
let canonical = table.canonicalize(ty);
1355+
let goal = generic_implements_goal(db, &table.trait_env, index_trait, &canonical);
13621356
if db
13631357
.trait_solve(table.trait_env.krate, table.trait_env.block, goal.cast(Interner))
13641358
.is_some()
@@ -1638,24 +1632,21 @@ fn generic_implements_goal(
16381632
fn autoderef_method_receiver(
16391633
table: &mut InferenceTable<'_>,
16401634
ty: Ty,
1641-
) -> Vec<(Canonical<Ty>, ReceiverAdjustments)> {
1635+
) -> Vec<(Ty, ReceiverAdjustments)> {
16421636
let mut deref_chain: Vec<_> = Vec::new();
1643-
let mut autoderef = autoderef::Autoderef::new(table, ty, false);
1644-
while let Some((ty, derefs)) = autoderef.next() {
1637+
let autoderef = autoderef::Autoderef::new(table, ty, false);
1638+
for (ty, derefs) in autoderef {
16451639
deref_chain.push((
1646-
autoderef.table.canonicalize(ty),
1640+
ty,
16471641
ReceiverAdjustments { autoref: None, autoderefs: derefs, unsize_array: false },
16481642
));
16491643
}
16501644
// As a last step, we can do array unsizing (that's the only unsizing that rustc does for method receivers!)
1651-
if let Some((TyKind::Array(parameters, _), binders, adj)) =
1652-
deref_chain.last().map(|(ty, adj)| (ty.value.kind(Interner), ty.binders.clone(), adj))
1645+
if let Some((TyKind::Array(parameters, _), adj)) =
1646+
deref_chain.last().map(|(ty, adj)| (ty.kind(Interner), adj))
16531647
{
16541648
let unsized_ty = TyKind::Slice(parameters.clone()).intern(Interner);
1655-
deref_chain.push((
1656-
Canonical { value: unsized_ty, binders },
1657-
ReceiverAdjustments { unsize_array: true, ..adj.clone() },
1658-
));
1649+
deref_chain.push((unsized_ty, ReceiverAdjustments { unsize_array: true, ..adj.clone() }));
16591650
}
16601651
deref_chain
16611652
}

0 commit comments

Comments
 (0)