Skip to content

Commit dbf7ccc

Browse files
committed
Preserve impl assoc names in ImplData
1 parent 70e93ed commit dbf7ccc

File tree

10 files changed

+78
-89
lines changed

10 files changed

+78
-89
lines changed

src/tools/rust-analyzer/crates/hir-def/src/data.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ bitflags::bitflags! {
244244
#[derive(Debug, Clone, PartialEq, Eq)]
245245
pub struct TraitData {
246246
pub name: Name,
247-
pub items: Vec<(Name, AssocItemId)>,
247+
pub items: Box<[(Name, AssocItemId)]>,
248248
pub flags: TraitFlags,
249249
pub visibility: RawVisibility,
250250
// box it as the vec is usually empty anyways
@@ -360,7 +360,7 @@ impl TraitAliasData {
360360
pub struct ImplData {
361361
pub target_trait: Option<TraitRef>,
362362
pub self_ty: TypeRefId,
363-
pub items: Box<[AssocItemId]>,
363+
pub items: Box<[(Name, AssocItemId)]>,
364364
pub is_negative: bool,
365365
pub is_unsafe: bool,
366366
// box it as the vec is usually empty anyways
@@ -393,7 +393,6 @@ impl ImplData {
393393
collector.collect(&item_tree, tree_id.tree_id(), &impl_def.items);
394394

395395
let (items, macro_calls, diagnostics) = collector.finish();
396-
let items = items.into_iter().map(|(_, item)| item).collect();
397396

398397
(
399398
Arc::new(ImplData {
@@ -648,12 +647,12 @@ impl<'a> AssocItemCollector<'a> {
648647
fn finish(
649648
self,
650649
) -> (
651-
Vec<(Name, AssocItemId)>,
650+
Box<[(Name, AssocItemId)]>,
652651
Option<Box<Vec<(AstId<ast::Item>, MacroCallId)>>>,
653652
Vec<DefDiagnostic>,
654653
) {
655654
(
656-
self.items,
655+
self.items.into_boxed_slice(),
657656
if self.macro_calls.is_empty() { None } else { Some(Box::new(self.macro_calls)) },
658657
self.diagnostics,
659658
)

src/tools/rust-analyzer/crates/hir-def/src/lang_item.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ impl LangItems {
107107
for (_, module_data) in crate_def_map.modules() {
108108
for impl_def in module_data.scope.impls() {
109109
lang_items.collect_lang_item(db, impl_def, LangItemTarget::ImplDef);
110-
for assoc in db.impl_data(impl_def).items.iter().copied() {
110+
for &(_, assoc) in db.impl_data(impl_def).items.iter() {
111111
match assoc {
112112
AssocItemId::FunctionId(f) => {
113113
lang_items.collect_lang_item(db, f, LangItemTarget::Function)

src/tools/rust-analyzer/crates/hir-ty/src/chalk_db.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@ fn impl_def_datum(
856856
let associated_ty_value_ids = impl_data
857857
.items
858858
.iter()
859-
.filter_map(|item| match item {
859+
.filter_map(|(_, item)| match item {
860860
AssocItemId::TypeAliasId(type_alias) => Some(*type_alias),
861861
_ => None,
862862
})

src/tools/rust-analyzer/crates/hir-ty/src/method_resolution.rs

+12-14
Original file line numberDiff line numberDiff line change
@@ -746,16 +746,9 @@ fn lookup_impl_assoc_item_for_trait_ref(
746746
let table = InferenceTable::new(db, env);
747747

748748
let (impl_data, impl_subst) = find_matching_impl(impls, table, trait_ref)?;
749-
let item = impl_data.items.iter().find_map(|&it| match it {
750-
AssocItemId::FunctionId(f) => {
751-
(db.function_data(f).name == *name).then_some(AssocItemId::FunctionId(f))
752-
}
753-
AssocItemId::ConstId(c) => db
754-
.const_data(c)
755-
.name
756-
.as_ref()
757-
.map(|n| n == name)
758-
.and_then(|result| if result { Some(AssocItemId::ConstId(c)) } else { None }),
749+
let item = impl_data.items.iter().find_map(|(n, it)| match *it {
750+
AssocItemId::FunctionId(f) => (n == name).then_some(AssocItemId::FunctionId(f)),
751+
AssocItemId::ConstId(c) => (n == name).then_some(AssocItemId::ConstId(c)),
759752
AssocItemId::TypeAliasId(_) => None,
760753
})?;
761754
Some((item, impl_subst))
@@ -850,7 +843,7 @@ fn is_inherent_impl_coherent(
850843
};
851844
rustc_has_incoherent_inherent_impls
852845
&& !impl_data.items.is_empty()
853-
&& impl_data.items.iter().copied().all(|assoc| match assoc {
846+
&& impl_data.items.iter().all(|&(_, assoc)| match assoc {
854847
AssocItemId::FunctionId(it) => db.function_data(it).rustc_allow_incoherent_impl,
855848
AssocItemId::ConstId(it) => db.const_data(it).rustc_allow_incoherent_impl,
856849
AssocItemId::TypeAliasId(it) => db.type_alias_data(it).rustc_allow_incoherent_impl,
@@ -1399,7 +1392,7 @@ fn iterate_inherent_methods(
13991392
callback: &mut dyn FnMut(ReceiverAdjustments, AssocItemId, bool) -> ControlFlow<()>,
14001393
) -> ControlFlow<()> {
14011394
for &impl_id in impls.for_self_ty(self_ty) {
1402-
for &item in table.db.impl_data(impl_id).items.iter() {
1395+
for &(ref item_name, item) in table.db.impl_data(impl_id).items.iter() {
14031396
let visible = match is_valid_impl_method_candidate(
14041397
table,
14051398
self_ty,
@@ -1408,6 +1401,7 @@ fn iterate_inherent_methods(
14081401
name,
14091402
impl_id,
14101403
item,
1404+
item_name,
14111405
) {
14121406
IsValidCandidate::Yes => true,
14131407
IsValidCandidate::NotVisible => false,
@@ -1467,6 +1461,7 @@ fn is_valid_impl_method_candidate(
14671461
name: Option<&Name>,
14681462
impl_id: ImplId,
14691463
item: AssocItemId,
1464+
item_name: &Name,
14701465
) -> IsValidCandidate {
14711466
match item {
14721467
AssocItemId::FunctionId(f) => is_valid_impl_fn_candidate(
@@ -1477,11 +1472,12 @@ fn is_valid_impl_method_candidate(
14771472
receiver_ty,
14781473
self_ty,
14791474
visible_from_module,
1475+
item_name,
14801476
),
14811477
AssocItemId::ConstId(c) => {
14821478
let db = table.db;
14831479
check_that!(receiver_ty.is_none());
1484-
check_that!(name.is_none_or(|n| db.const_data(c).name.as_ref() == Some(n)));
1480+
check_that!(name.is_none_or(|n| n == item_name));
14851481

14861482
if let Some(from_module) = visible_from_module {
14871483
if !db.const_visibility(c).is_visible_from(db.upcast(), from_module) {
@@ -1565,11 +1561,13 @@ fn is_valid_impl_fn_candidate(
15651561
receiver_ty: Option<&Ty>,
15661562
self_ty: &Ty,
15671563
visible_from_module: Option<ModuleId>,
1564+
item_name: &Name,
15681565
) -> IsValidCandidate {
1566+
check_that!(name.is_none_or(|n| n == item_name));
1567+
15691568
let db = table.db;
15701569
let data = db.function_data(fn_id);
15711570

1572-
check_that!(name.is_none_or(|n| n == &data.name));
15731571
if let Some(from_module) = visible_from_module {
15741572
if !db.function_visibility(fn_id).is_visible_from(db.upcast(), from_module) {
15751573
cov_mark::hit!(autoderef_candidate_not_visible);

src/tools/rust-analyzer/crates/hir-ty/src/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ pub(crate) fn visit_module(
435435
visit_scope(db, crate_def_map, &crate_def_map[module_id].scope, cb);
436436
for impl_id in crate_def_map[module_id].scope.impls() {
437437
let impl_data = db.impl_data(impl_id);
438-
for &item in impl_data.items.iter() {
438+
for &(_, item) in impl_data.items.iter() {
439439
match item {
440440
AssocItemId::FunctionId(it) => {
441441
let body = db.body(it.into());

src/tools/rust-analyzer/crates/hir/src/lib.rs

+7-20
Original file line numberDiff line numberDiff line change
@@ -775,29 +775,16 @@ impl Module {
775775
AssocItemId::ConstId(id) => !db.const_data(id).has_body,
776776
AssocItemId::TypeAliasId(it) => db.type_alias_data(it).type_ref.is_none(),
777777
});
778-
impl_assoc_items_scratch.extend(db.impl_data(impl_def.id).items.iter().filter_map(
779-
|&item| {
780-
Some((
781-
item,
782-
match item {
783-
AssocItemId::FunctionId(it) => db.function_data(it).name.clone(),
784-
AssocItemId::ConstId(it) => {
785-
db.const_data(it).name.as_ref()?.clone()
786-
}
787-
AssocItemId::TypeAliasId(it) => db.type_alias_data(it).name.clone(),
788-
},
789-
))
790-
},
791-
));
778+
impl_assoc_items_scratch.extend(db.impl_data(impl_def.id).items.iter().cloned());
792779

793780
let redundant = impl_assoc_items_scratch
794781
.iter()
795-
.filter(|(id, name)| {
782+
.filter(|(name, id)| {
796783
!items.iter().any(|(impl_name, impl_item)| {
797784
discriminant(impl_item) == discriminant(id) && impl_name == name
798785
})
799786
})
800-
.map(|(item, name)| (name.clone(), AssocItem::from(*item)));
787+
.map(|(name, item)| (name.clone(), AssocItem::from(*item)));
801788
for (name, assoc_item) in redundant {
802789
acc.push(
803790
TraitImplRedundantAssocItems {
@@ -812,7 +799,7 @@ impl Module {
812799

813800
let missing: Vec<_> = required_items
814801
.filter(|(name, id)| {
815-
!impl_assoc_items_scratch.iter().any(|(impl_item, impl_name)| {
802+
!impl_assoc_items_scratch.iter().any(|(impl_name, impl_item)| {
816803
discriminant(impl_item) == discriminant(id) && impl_name == name
817804
})
818805
})
@@ -844,7 +831,7 @@ impl Module {
844831
source_map,
845832
);
846833

847-
for &item in db.impl_data(impl_def.id).items.iter() {
834+
for &(_, item) in db.impl_data(impl_def.id).items.iter() {
848835
AssocItem::from(item).diagnostics(db, acc, style_lints);
849836
}
850837
}
@@ -4307,7 +4294,7 @@ impl Impl {
43074294
}
43084295

43094296
pub fn items(self, db: &dyn HirDatabase) -> Vec<AssocItem> {
4310-
db.impl_data(self.id).items.iter().map(|&it| it.into()).collect()
4297+
db.impl_data(self.id).items.iter().map(|&(_, it)| it.into()).collect()
43114298
}
43124299

43134300
pub fn is_negative(self, db: &dyn HirDatabase) -> bool {
@@ -5165,7 +5152,7 @@ impl Type {
51655152
let impls = db.inherent_impls_in_crate(krate);
51665153

51675154
for impl_def in impls.for_self_ty(&self.ty) {
5168-
for &item in db.impl_data(*impl_def).items.iter() {
5155+
for &(_, item) in db.impl_data(*impl_def).items.iter() {
51695156
if callback(item) {
51705157
return;
51715158
}

src/tools/rust-analyzer/crates/hir/src/semantics/child_by_source.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ impl ChildBySource for ImplId {
5656
res[keys::ATTR_MACRO_CALL].insert(ast_id.to_ptr(db.upcast()), call_id);
5757
},
5858
);
59-
data.items.iter().for_each(|&item| {
59+
data.items.iter().for_each(|&(_, item)| {
6060
add_assoc_item(db, res, file_id, item);
6161
});
6262
}

0 commit comments

Comments
 (0)