Skip to content

Commit 9593fe6

Browse files
committed
Fix resolution of inherent array methods.
1 parent 1785493 commit 9593fe6

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

crates/hir_ty/src/method_resolution.rs

+36-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use rustc_hash::{FxHashMap, FxHashSet};
1616

1717
use crate::{
1818
autoderef,
19+
consteval::{self, ConstExt},
1920
db::HirDatabase,
2021
from_foreign_def_id,
2122
primitive::{self, FloatTy, IntTy, UintTy},
@@ -725,7 +726,27 @@ fn iterate_inherent_methods(
725726
for krate in def_crates {
726727
let impls = db.inherent_impls_in_crate(krate);
727728

728-
for &impl_def in impls.for_self_ty(&self_ty.value) {
729+
let impls_for_self_ty = impls.for_self_ty(&self_ty.value).iter().chain(
730+
{
731+
if let TyKind::Array(parameters, array_len) = self_ty.value.kind(&Interner) {
732+
if !array_len.is_unknown() {
733+
let unknown_array_len_ty =
734+
TyKind::Array(parameters.clone(), consteval::usize_const(None))
735+
.intern(&Interner);
736+
737+
Some(impls.for_self_ty(&unknown_array_len_ty))
738+
} else {
739+
None
740+
}
741+
} else {
742+
None
743+
}
744+
}
745+
.into_iter()
746+
.flatten(),
747+
);
748+
749+
for &impl_def in impls_for_self_ty {
729750
for &item in db.impl_data(impl_def).items.iter() {
730751
if !is_valid_candidate(
731752
db,
@@ -803,7 +824,20 @@ fn is_valid_candidate(
803824
None => return false,
804825
};
805826
if transformed_receiver_ty != receiver_ty.value {
806-
return false;
827+
match (
828+
transformed_receiver_ty.kind(&Interner),
829+
receiver_ty.value.kind(&Interner),
830+
) {
831+
(
832+
TyKind::Array(transformed_array_ty, transformed_array_len),
833+
TyKind::Array(receiver_array_ty, receiver_array_len),
834+
) if transformed_array_ty == receiver_array_ty
835+
&& transformed_array_len.is_unknown()
836+
&& !receiver_array_len.is_unknown() => {}
837+
_ => {
838+
return false;
839+
}
840+
}
807841
}
808842
}
809843
if let Some(from_module) = visible_from_module {

0 commit comments

Comments
 (0)