Skip to content

Commit e3268f7

Browse files
authored
Merge pull request #21391 from Veykril/push-zttspnlnqpto
internal: Reduce `impl_signature` query dependencies in method resolution
2 parents 8f5634a + 439c095 commit e3268f7

10 files changed

Lines changed: 36 additions & 36 deletions

File tree

crates/hir-def/src/item_scope.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ pub struct ItemScope {
158158
/// declared.
159159
declarations: ThinVec<ModuleDefId>,
160160

161-
impls: ThinVec<ImplId>,
161+
impls: ThinVec<(ImplId, /* trait impl */ bool)>,
162162
builtin_derive_impls: ThinVec<BuiltinDeriveImplId>,
163163
extern_blocks: ThinVec<ExternBlockId>,
164164
unnamed_consts: ThinVec<ConstId>,
@@ -327,7 +327,15 @@ impl ItemScope {
327327
}
328328

329329
pub fn impls(&self) -> impl ExactSizeIterator<Item = ImplId> + '_ {
330-
self.impls.iter().copied()
330+
self.impls.iter().map(|&(id, _)| id)
331+
}
332+
333+
pub fn trait_impls(&self) -> impl Iterator<Item = ImplId> + '_ {
334+
self.impls.iter().filter(|&&(_, is_trait_impl)| is_trait_impl).map(|&(id, _)| id)
335+
}
336+
337+
pub fn inherent_impls(&self) -> impl Iterator<Item = ImplId> + '_ {
338+
self.impls.iter().filter(|&&(_, is_trait_impl)| !is_trait_impl).map(|&(id, _)| id)
331339
}
332340

333341
pub fn builtin_derive_impls(&self) -> impl ExactSizeIterator<Item = BuiltinDeriveImplId> + '_ {
@@ -472,8 +480,8 @@ impl ItemScope {
472480
self.legacy_macros.get(name).map(|it| &**it)
473481
}
474482

475-
pub(crate) fn define_impl(&mut self, imp: ImplId) {
476-
self.impls.push(imp);
483+
pub(crate) fn define_impl(&mut self, imp: ImplId, is_trait_impl: bool) {
484+
self.impls.push((imp, is_trait_impl));
477485
}
478486

479487
pub(crate) fn define_builtin_derive_impl(&mut self, imp: BuiltinDeriveImplId) {

crates/hir-def/src/item_tree.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,9 @@ pub struct Trait {
614614
}
615615

616616
#[derive(Debug, Clone, Eq, PartialEq)]
617-
pub struct Impl {}
617+
pub struct Impl {
618+
pub is_trait_impl: bool,
619+
}
618620

619621
#[derive(Debug, Clone, PartialEq, Eq)]
620622
pub struct TypeAlias {

crates/hir-def/src/item_tree/lower.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ impl<'a> Ctx<'a> {
271271
let ast_id = self.source_ast_id_map.ast_id(impl_def);
272272
// Note that trait impls don't get implicit `Self` unlike traits, because here they are a
273273
// type alias rather than a type parameter, so this is handled by the resolver.
274-
let res = Impl {};
274+
let res = Impl { is_trait_impl: impl_def.trait_().is_some() };
275275
self.tree.small_data.insert(ast_id.upcast(), SmallModItem::Impl(res));
276276
ast_id
277277
}

crates/hir-def/src/item_tree/pretty.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ impl Printer<'_> {
258258
w!(self, "trait {} {{ ... }}", name.display(self.db, self.edition));
259259
}
260260
ModItemId::Impl(ast_id) => {
261-
let Impl {} = &self.tree[ast_id];
261+
let Impl { is_trait_impl: _ } = &self.tree[ast_id];
262262
self.print_ast_id(ast_id.erase());
263263
w!(self, "impl {{ ... }}");
264264
}

crates/hir-def/src/lang_item.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
4141
let crate_def_map = crate_def_map(db, krate);
4242

4343
for (_, module_data) in crate_def_map.modules() {
44-
for impl_def in module_data.scope.impls() {
44+
for impl_def in module_data.scope.inherent_impls() {
4545
lang_items.collect_lang_item(db, impl_def);
4646
for &(_, assoc) in impl_def.impl_items(db).items.iter() {
4747
match assoc {

crates/hir-def/src/nameres/collector.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2028,7 +2028,9 @@ impl ModCollector<'_, '_> {
20282028
let impl_id =
20292029
ImplLoc { container: module_id, id: InFile::new(self.file_id(), imp) }
20302030
.intern(db);
2031-
self.def_collector.def_map.modules[self.module_id].scope.define_impl(impl_id)
2031+
self.def_collector.def_map.modules[self.module_id]
2032+
.scope
2033+
.define_impl(impl_id, self.item_tree[imp].is_trait_impl)
20322034
}
20332035
ModItemId::Function(id) => {
20342036
let it = &self.item_tree[id];

crates/hir-ty/src/method_resolution.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -609,12 +609,7 @@ impl InherentImpls {
609609
map: &mut FxHashMap<SimplifiedType, Vec<ImplId>>,
610610
) {
611611
for (_module_id, module_data) in def_map.modules() {
612-
for impl_id in module_data.scope.impls() {
613-
let data = db.impl_signature(impl_id);
614-
if data.target_trait.is_some() {
615-
continue;
616-
}
617-
612+
for impl_id in module_data.scope.inherent_impls() {
618613
let interner = DbInterner::new_no_crate(db);
619614
let self_ty = db.impl_self_ty(impl_id);
620615
let self_ty = self_ty.instantiate_identity();
@@ -730,7 +725,7 @@ impl TraitImpls {
730725
map: &mut FxHashMap<TraitId, OneTraitImplsBuilder>,
731726
) {
732727
for (_module_id, module_data) in def_map.modules() {
733-
for impl_id in module_data.scope.impls() {
728+
for impl_id in module_data.scope.trait_impls() {
734729
let trait_ref = match db.impl_trait(impl_id) {
735730
Some(tr) => tr.instantiate_identity(),
736731
None => continue,

crates/hir-ty/src/tests/incremental.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -539,12 +539,6 @@ impl SomeStruct {
539539
"AttrFlags::query_",
540540
"AttrFlags::query_",
541541
"AttrFlags::query_",
542-
"impl_trait_with_diagnostics_query",
543-
"impl_signature_shim",
544-
"impl_signature_with_source_map_shim",
545-
"impl_self_ty_with_diagnostics_query",
546-
"struct_signature_shim",
547-
"struct_signature_with_source_map_shim",
548542
]
549543
"#]],
550544
);
@@ -617,7 +611,6 @@ fn main() {
617611
"lang_items",
618612
"crate_lang_items",
619613
"AttrFlags::query_",
620-
"AttrFlags::query_",
621614
"GenericPredicates::query_with_diagnostics_",
622615
"GenericPredicates::query_with_diagnostics_",
623616
"ImplTraits::return_type_impl_traits_",
@@ -633,13 +626,14 @@ fn main() {
633626
"GenericPredicates::query_with_diagnostics_",
634627
"value_ty_query",
635628
"InherentImpls::for_crate_",
636-
"impl_signature_shim",
637-
"impl_signature_with_source_map_shim",
638629
"callable_item_signature_query",
639630
"TraitImpls::for_crate_and_deps_",
640631
"TraitImpls::for_crate_",
641632
"impl_trait_with_diagnostics_query",
633+
"impl_signature_shim",
634+
"impl_signature_with_source_map_shim",
642635
"impl_self_ty_with_diagnostics_query",
636+
"AttrFlags::query_",
643637
"GenericPredicates::query_with_diagnostics_",
644638
]
645639
"#]],
@@ -710,7 +704,6 @@ fn main() {
710704
"crate_lang_items",
711705
"AttrFlags::query_",
712706
"AttrFlags::query_",
713-
"AttrFlags::query_",
714707
"GenericPredicates::query_with_diagnostics_",
715708
"GenericPredicates::query_with_diagnostics_",
716709
"ImplTraits::return_type_impl_traits_",
@@ -722,12 +715,13 @@ fn main() {
722715
"struct_signature_with_source_map_shim",
723716
"GenericPredicates::query_with_diagnostics_",
724717
"InherentImpls::for_crate_",
725-
"impl_signature_with_source_map_shim",
726-
"impl_signature_shim",
727718
"callable_item_signature_query",
728719
"TraitImpls::for_crate_",
720+
"impl_signature_with_source_map_shim",
721+
"impl_signature_shim",
729722
"impl_trait_with_diagnostics_query",
730723
"impl_self_ty_with_diagnostics_query",
724+
"AttrFlags::query_",
731725
"GenericPredicates::query_with_diagnostics_",
732726
]
733727
"#]],

crates/hir/src/lib.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -803,22 +803,21 @@ impl Module {
803803
emit_def_diagnostic(db, acc, diag, edition, loc.container.krate(db));
804804
}
805805

806-
if impl_signature.target_trait.is_none()
807-
&& !is_inherent_impl_coherent(db, def_map, impl_id)
808-
{
806+
let trait_impl = impl_signature.target_trait.is_some();
807+
if !trait_impl && !is_inherent_impl_coherent(db, def_map, impl_id) {
809808
acc.push(IncoherentImpl { impl_: ast_id_map.get(loc.id.value), file_id }.into())
810809
}
811810

812-
if !impl_def.check_orphan_rules(db) {
811+
if trait_impl && !impl_def.check_orphan_rules(db) {
813812
acc.push(TraitImplOrphan { impl_: ast_id_map.get(loc.id.value), file_id }.into())
814813
}
815814

816-
let trait_ = impl_def.trait_(db);
815+
let trait_ = trait_impl.then(|| impl_def.trait_(db)).flatten();
817816
let mut trait_is_unsafe = trait_.is_some_and(|t| t.is_unsafe(db));
818817
let impl_is_negative = impl_def.is_negative(db);
819818
let impl_is_unsafe = impl_def.is_unsafe(db);
820819

821-
let trait_is_unresolved = trait_.is_none() && impl_signature.target_trait.is_some();
820+
let trait_is_unresolved = trait_.is_none() && trait_impl;
822821
if trait_is_unresolved {
823822
// Ignore trait safety errors when the trait is unresolved, as otherwise we'll treat it as safe,
824823
// which may not be correct.

crates/ide-completion/src/tests/flyimport.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -781,9 +781,9 @@ fn main() {
781781
}
782782
"#,
783783
expect![[r#"
784-
fn weird_function() (use dep::test_mod::TestTrait) fn() DEPRECATED
785-
ct SPECIAL_CONST (use dep::test_mod::TestTrait) u8 DEPRECATED
786784
me random_method(…) (use dep::test_mod::TestTrait) fn(&self) DEPRECATED
785+
ct SPECIAL_CONST (use dep::test_mod::TestTrait) u8 DEPRECATED
786+
fn weird_function() (use dep::test_mod::TestTrait) fn() DEPRECATED
787787
"#]],
788788
);
789789
}

0 commit comments

Comments
 (0)