mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
internal: improve compile times a bit
before after for cargo llvm-lines -q --lib --release -p ide_ssr | head -n 24 Lines Copies Function name ----- ------ ------------- 297146 (100%) 12748 (100%) (TOTAL) 5970 (2.0%) 47 (0.4%) core::iter::traits::iterator::Iterator::try_fold 4750 (1.6%) 27 (0.2%) hashbrown::raw::RawTable<T,A>::resize 4080 (1.4%) 30 (0.2%) alloc::raw_vec::RawVec<T,A>::grow_amortized 3933 (1.3%) 69 (0.5%) alloc::raw_vec::RawVec<T,A>::current_memory 3668 (1.2%) 89 (0.7%) <core::result::Result<T,E> as core::ops::try_trait::Try>::branch 3500 (1.2%) 50 (0.4%) hashbrown::raw::RawTable<T,A>::drop_elements 3436 (1.2%) 33 (0.3%) hashbrown::raw::RawTable<T,A>::find 3415 (1.1%) 17 (0.1%) hashbrown::raw::RawTable<T,A>::rehash_in_place 3400 (1.1%) 50 (0.4%) <hashbrown::raw::RawIterRange<T> as core::iter::traits::iterator::Iterator>::next 2840 (1.0%) 20 (0.2%) alloc::raw_vec::RawVec<T,A>::allocate_in 2700 (0.9%) 30 (0.2%) core::alloc::layout::Layout::array 2666 (0.9%) 86 (0.7%) core::ptr::metadata::from_raw_parts_mut 2495 (0.8%) 50 (0.4%) core::option::Option<T>::map 2354 (0.8%) 38 (0.3%) alloc::alloc::box_free 2302 (0.8%) 7 (0.1%) ide_ssr::parsing::RuleBuilder::try_add 2146 (0.7%) 45 (0.4%) core::mem::replace 2070 (0.7%) 69 (0.5%) <alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop 1979 (0.7%) 16 (0.1%) hashbrown::map::HashMap<K,V,S,A>::insert 1926 (0.6%) 18 (0.1%) <core::iter::adapters::zip::Zip<A,B> as core::iter::adapters::zip::ZipImpl<A,B>>::next 1922 (0.6%) 62 (0.5%) core::fmt::ArgumentV1::new 1885 (0.6%) 13 (0.1%) alloc::raw_vec::RawVec<T,A>::shrink Lines Copies Function name ----- ------ ------------- 261717 (100%) 11666 (100%) (TOTAL) 5239 (2.0%) 42 (0.4%) core::iter::traits::iterator::Iterator::try_fold 4750 (1.8%) 27 (0.2%) hashbrown::raw::RawTable<T,A>::resize 3933 (1.5%) 69 (0.6%) alloc::raw_vec::RawVec<T,A>::current_memory 3536 (1.4%) 26 (0.2%) alloc::raw_vec::RawVec<T,A>::grow_amortized 3500 (1.3%) 50 (0.4%) hashbrown::raw::RawTable<T,A>::drop_elements 3400 (1.3%) 50 (0.4%) <hashbrown::raw::RawIterRange<T> as core::iter::traits::iterator::Iterator>::next 3124 (1.2%) 30 (0.3%) hashbrown::raw::RawTable<T,A>::find 2812 (1.1%) 14 (0.1%) hashbrown::raw::RawTable<T,A>::rehash_in_place 2604 (1.0%) 84 (0.7%) core::ptr::metadata::from_raw_parts_mut 2340 (0.9%) 26 (0.2%) core::alloc::layout::Layout::array 2302 (0.9%) 7 (0.1%) ide_ssr::parsing::RuleBuilder::try_add 2272 (0.9%) 16 (0.1%) alloc::raw_vec::RawVec<T,A>::allocate_in 2201 (0.8%) 35 (0.3%) alloc::alloc::box_free 2104 (0.8%) 44 (0.4%) core::mem::replace 2079 (0.8%) 42 (0.4%) <core::result::Result<T,E> as core::ops::try_trait::Try>::branch 2070 (0.8%) 69 (0.6%) <alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop 1926 (0.7%) 18 (0.2%) <core::iter::adapters::zip::Zip<A,B> as core::iter::adapters::zip::ZipImpl<A,B>>::next 1885 (0.7%) 13 (0.1%) alloc::raw_vec::RawVec<T,A>::shrink 1833 (0.7%) 13 (0.1%) hashbrown::raw::RawTable<T,A>::shrink_to 1771 (0.7%) 91 (0.8%) core::ptr::read 1701 (0.6%) 35 (0.3%) core::option::Option<T>::map
This commit is contained in:
parent
35d98070d2
commit
76b60efbfb
2 changed files with 77 additions and 16 deletions
|
@ -2517,18 +2517,35 @@ impl Type {
|
||||||
krate: Crate,
|
krate: Crate,
|
||||||
mut callback: impl FnMut(AssocItem) -> Option<T>,
|
mut callback: impl FnMut(AssocItem) -> Option<T>,
|
||||||
) -> Option<T> {
|
) -> Option<T> {
|
||||||
for krate in method_resolution::def_crates(db, &self.ty, krate.id)? {
|
let mut slot = None;
|
||||||
|
self.iterate_assoc_items_dyn(db, krate, &mut |assoc_item_id| {
|
||||||
|
slot = callback(assoc_item_id.into());
|
||||||
|
slot.is_some()
|
||||||
|
});
|
||||||
|
slot
|
||||||
|
}
|
||||||
|
|
||||||
|
fn iterate_assoc_items_dyn(
|
||||||
|
self,
|
||||||
|
db: &dyn HirDatabase,
|
||||||
|
krate: Crate,
|
||||||
|
callback: &mut dyn FnMut(AssocItemId) -> bool,
|
||||||
|
) {
|
||||||
|
let def_crates = match method_resolution::def_crates(db, &self.ty, krate.id) {
|
||||||
|
Some(it) => it,
|
||||||
|
None => return,
|
||||||
|
};
|
||||||
|
for krate in def_crates {
|
||||||
let impls = db.inherent_impls_in_crate(krate);
|
let impls = db.inherent_impls_in_crate(krate);
|
||||||
|
|
||||||
for impl_def in impls.for_self_ty(&self.ty) {
|
for impl_def in impls.for_self_ty(&self.ty) {
|
||||||
for &item in db.impl_data(*impl_def).items.iter() {
|
for &item in db.impl_data(*impl_def).items.iter() {
|
||||||
if let Some(result) = callback(item.into()) {
|
if callback(item) {
|
||||||
return Some(result);
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn type_arguments(&self) -> impl Iterator<Item = Type> + '_ {
|
pub fn type_arguments(&self) -> impl Iterator<Item = Type> + '_ {
|
||||||
|
@ -2550,6 +2567,31 @@ impl Type {
|
||||||
mut callback: impl FnMut(&Ty, Function) -> Option<T>,
|
mut callback: impl FnMut(&Ty, Function) -> Option<T>,
|
||||||
) -> Option<T> {
|
) -> Option<T> {
|
||||||
let _p = profile::span("iterate_method_candidates");
|
let _p = profile::span("iterate_method_candidates");
|
||||||
|
let mut slot = None;
|
||||||
|
self.iterate_method_candidates_dyn(
|
||||||
|
db,
|
||||||
|
krate,
|
||||||
|
traits_in_scope,
|
||||||
|
name,
|
||||||
|
&mut |ty, assoc_item_id| match assoc_item_id {
|
||||||
|
AssocItemId::FunctionId(it) => {
|
||||||
|
slot = callback(ty, it.into());
|
||||||
|
slot.is_some()
|
||||||
|
}
|
||||||
|
AssocItemId::ConstId(_) | AssocItemId::TypeAliasId(_) => false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
slot
|
||||||
|
}
|
||||||
|
|
||||||
|
fn iterate_method_candidates_dyn(
|
||||||
|
&self,
|
||||||
|
db: &dyn HirDatabase,
|
||||||
|
krate: Crate,
|
||||||
|
traits_in_scope: &FxHashSet<TraitId>,
|
||||||
|
name: Option<&Name>,
|
||||||
|
callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool,
|
||||||
|
) {
|
||||||
// There should be no inference vars in types passed here
|
// There should be no inference vars in types passed here
|
||||||
// FIXME check that?
|
// FIXME check that?
|
||||||
// FIXME replace Unknown by bound vars here
|
// FIXME replace Unknown by bound vars here
|
||||||
|
@ -2559,7 +2601,7 @@ impl Type {
|
||||||
let env = self.env.clone();
|
let env = self.env.clone();
|
||||||
let krate = krate.id;
|
let krate = krate.id;
|
||||||
|
|
||||||
method_resolution::iterate_method_candidates(
|
method_resolution::iterate_method_candidates_dyn(
|
||||||
&canonical,
|
&canonical,
|
||||||
db,
|
db,
|
||||||
env,
|
env,
|
||||||
|
@ -2568,11 +2610,8 @@ impl Type {
|
||||||
None,
|
None,
|
||||||
name,
|
name,
|
||||||
method_resolution::LookupMode::MethodCall,
|
method_resolution::LookupMode::MethodCall,
|
||||||
|ty, it| match it {
|
callback,
|
||||||
AssocItemId::FunctionId(f) => callback(ty, f.into()),
|
);
|
||||||
_ => None,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn iterate_path_candidates<T>(
|
pub fn iterate_path_candidates<T>(
|
||||||
|
@ -2584,12 +2623,34 @@ impl Type {
|
||||||
mut callback: impl FnMut(&Ty, AssocItem) -> Option<T>,
|
mut callback: impl FnMut(&Ty, AssocItem) -> Option<T>,
|
||||||
) -> Option<T> {
|
) -> Option<T> {
|
||||||
let _p = profile::span("iterate_path_candidates");
|
let _p = profile::span("iterate_path_candidates");
|
||||||
|
let mut slot = None;
|
||||||
|
self.iterate_path_candidates_dyn(
|
||||||
|
db,
|
||||||
|
krate,
|
||||||
|
traits_in_scope,
|
||||||
|
name,
|
||||||
|
&mut |ty, assoc_item_id| {
|
||||||
|
slot = callback(ty, assoc_item_id.into());
|
||||||
|
slot.is_some()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
slot
|
||||||
|
}
|
||||||
|
|
||||||
|
fn iterate_path_candidates_dyn(
|
||||||
|
&self,
|
||||||
|
db: &dyn HirDatabase,
|
||||||
|
krate: Crate,
|
||||||
|
traits_in_scope: &FxHashSet<TraitId>,
|
||||||
|
name: Option<&Name>,
|
||||||
|
callback: &mut dyn FnMut(&Ty, AssocItemId) -> bool,
|
||||||
|
) {
|
||||||
let canonical = hir_ty::replace_errors_with_variables(&self.ty);
|
let canonical = hir_ty::replace_errors_with_variables(&self.ty);
|
||||||
|
|
||||||
let env = self.env.clone();
|
let env = self.env.clone();
|
||||||
let krate = krate.id;
|
let krate = krate.id;
|
||||||
|
|
||||||
method_resolution::iterate_method_candidates(
|
method_resolution::iterate_method_candidates_dyn(
|
||||||
&canonical,
|
&canonical,
|
||||||
db,
|
db,
|
||||||
env,
|
env,
|
||||||
|
@ -2598,8 +2659,8 @@ impl Type {
|
||||||
None,
|
None,
|
||||||
name,
|
name,
|
||||||
method_resolution::LookupMode::Path,
|
method_resolution::LookupMode::Path,
|
||||||
|ty, it| callback(ty, it.into()),
|
callback,
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn as_adt(&self) -> Option<Adt> {
|
pub fn as_adt(&self) -> Option<Adt> {
|
||||||
|
|
|
@ -410,7 +410,7 @@ pub enum LookupMode {
|
||||||
// This would be nicer if it just returned an iterator, but that runs into
|
// This would be nicer if it just returned an iterator, but that runs into
|
||||||
// lifetime problems, because we need to borrow temp `CrateImplDefs`.
|
// lifetime problems, because we need to borrow temp `CrateImplDefs`.
|
||||||
// FIXME add a context type here?
|
// FIXME add a context type here?
|
||||||
pub fn iterate_method_candidates<T>(
|
pub fn iterate_method_candidates<T>(
|
||||||
ty: &Canonical<Ty>,
|
ty: &Canonical<Ty>,
|
||||||
db: &dyn HirDatabase,
|
db: &dyn HirDatabase,
|
||||||
env: Arc<TraitEnvironment>,
|
env: Arc<TraitEnvironment>,
|
||||||
|
@ -422,7 +422,7 @@ pub fn iterate_method_candidates<T>(
|
||||||
mut callback: impl FnMut(&Ty, AssocItemId) -> Option<T>,
|
mut callback: impl FnMut(&Ty, AssocItemId) -> Option<T>,
|
||||||
) -> Option<T> {
|
) -> Option<T> {
|
||||||
let mut slot = None;
|
let mut slot = None;
|
||||||
iterate_method_candidates_impl(
|
iterate_method_candidates_dyn(
|
||||||
ty,
|
ty,
|
||||||
db,
|
db,
|
||||||
env,
|
env,
|
||||||
|
@ -440,7 +440,7 @@ pub fn iterate_method_candidates<T>(
|
||||||
slot
|
slot
|
||||||
}
|
}
|
||||||
|
|
||||||
fn iterate_method_candidates_impl(
|
pub fn iterate_method_candidates_dyn(
|
||||||
ty: &Canonical<Ty>,
|
ty: &Canonical<Ty>,
|
||||||
db: &dyn HirDatabase,
|
db: &dyn HirDatabase,
|
||||||
env: Arc<TraitEnvironment>,
|
env: Arc<TraitEnvironment>,
|
||||||
|
|
Loading…
Reference in a new issue