Skip to content

Commit 6968130

Browse files
authored
Merge pull request #20087 from Veykril/push-rrtkwpzmmwwz
Short circuit a couple hir-ty/lower queries
2 parents 0b648f8 + 8b52bab commit 6968130

File tree

8 files changed

+40
-15
lines changed

8 files changed

+40
-15
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,13 @@ impl GenericParams {
331331
}
332332

333333
#[inline]
334-
pub fn no_predicates(&self) -> bool {
334+
pub fn has_no_predicates(&self) -> bool {
335335
self.where_predicates.is_empty()
336336
}
337337

338338
#[inline]
339-
pub fn where_predicates(&self) -> std::slice::Iter<'_, WherePredicate> {
340-
self.where_predicates.iter()
339+
pub fn where_predicates(&self) -> &[WherePredicate] {
340+
&self.where_predicates
341341
}
342342

343343
/// Iterator of type_or_consts field

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2178,6 +2178,7 @@ impl HirDisplayWithExpressionStore for TypeRefId {
21782178
f.write_joined(
21792179
generic_params
21802180
.where_predicates()
2181+
.iter()
21812182
.filter_map(|it| match it {
21822183
WherePredicate::TypeBound { target, bound }
21832184
| WherePredicate::ForLifetime { lifetimes: _, target, bound }

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,16 @@ impl Generics {
6060
}
6161

6262
pub(crate) fn where_predicates(&self) -> impl Iterator<Item = &WherePredicate> {
63-
self.params.where_predicates()
63+
self.params.where_predicates().iter()
64+
}
65+
66+
pub(crate) fn has_no_predicates(&self) -> bool {
67+
self.params.has_no_predicates()
68+
&& self.parent_generics.as_ref().is_none_or(|g| g.params.has_no_predicates())
69+
}
70+
71+
pub(crate) fn is_empty(&self) -> bool {
72+
self.params.is_empty() && self.parent_generics.as_ref().is_none_or(|g| g.params.is_empty())
6473
}
6574

6675
pub(crate) fn iter_id(&self) -> impl Iterator<Item = GenericParamId> + '_ {

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -884,6 +884,11 @@ pub(crate) fn field_types_with_diagnostics_query(
884884
variant_id: VariantId,
885885
) -> (Arc<ArenaMap<LocalFieldId, Binders<Ty>>>, Diagnostics) {
886886
let var_data = db.variant_fields(variant_id);
887+
let fields = var_data.fields();
888+
if fields.is_empty() {
889+
return (Arc::new(ArenaMap::default()), None);
890+
}
891+
887892
let (resolver, def): (_, GenericDefId) = match variant_id {
888893
VariantId::StructId(it) => (it.resolver(db), it.into()),
889894
VariantId::UnionId(it) => (it.resolver(db), it.into()),
@@ -899,7 +904,7 @@ pub(crate) fn field_types_with_diagnostics_query(
899904
LifetimeElisionKind::AnonymousReportError,
900905
)
901906
.with_type_param_mode(ParamLoweringMode::Variable);
902-
for (field_id, field_data) in var_data.fields().iter() {
907+
for (field_id, field_data) in fields.iter() {
903908
res.insert(field_id, make_binders(db, &generics, ctx.lower_ty(field_data.type_ref)));
904909
}
905910
(Arc::new(res), create_diagnostics(ctx.diagnostics))
@@ -920,6 +925,10 @@ pub(crate) fn generic_predicates_for_param_query(
920925
assoc_name: Option<Name>,
921926
) -> GenericPredicates {
922927
let generics = generics(db, def);
928+
if generics.has_no_predicates() && generics.is_empty() {
929+
return GenericPredicates(None);
930+
}
931+
923932
let resolver = def.resolver(db);
924933
let mut ctx = TyLoweringContext::new(
925934
db,
@@ -1025,6 +1034,10 @@ pub(crate) fn trait_environment_query(
10251034
def: GenericDefId,
10261035
) -> Arc<TraitEnvironment> {
10271036
let generics = generics(db, def);
1037+
if generics.has_no_predicates() && generics.is_empty() {
1038+
return TraitEnvironment::empty(def.krate(db));
1039+
}
1040+
10281041
let resolver = def.resolver(db);
10291042
let mut ctx = TyLoweringContext::new(
10301043
db,
@@ -1128,6 +1141,10 @@ where
11281141
F: Fn(&WherePredicate, GenericDefId) -> bool,
11291142
{
11301143
let generics = generics(db, def);
1144+
if generics.has_no_predicates() && generics.is_empty() {
1145+
return (GenericPredicates(None), None);
1146+
}
1147+
11311148
let resolver = def.resolver(db);
11321149
let mut ctx = TyLoweringContext::new(
11331150
db,
@@ -1154,7 +1171,7 @@ where
11541171
}
11551172
}
11561173

1157-
if generics.len() > 0 {
1174+
if !generics.is_empty() {
11581175
let subst = generics.bound_vars_subst(db, DebruijnIndex::INNERMOST);
11591176
let explicitly_unsized_tys = ctx.unsized_types;
11601177
if let Some(implicitly_sized_predicates) =
@@ -1229,7 +1246,7 @@ pub(crate) fn generic_defaults_with_diagnostics_query(
12291246
def: GenericDefId,
12301247
) -> (GenericDefaults, Diagnostics) {
12311248
let generic_params = generics(db, def);
1232-
if generic_params.len() == 0 {
1249+
if generic_params.is_empty() {
12331250
return (GenericDefaults(None), None);
12341251
}
12351252
let resolver = def.resolver(db);

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -695,10 +695,8 @@ fn main() {
695695
"return_type_impl_traits_shim",
696696
"infer_shim",
697697
"function_signature_with_source_map_shim",
698-
"trait_environment_shim",
699698
"expr_scopes_shim",
700699
"struct_signature_with_source_map_shim",
701-
"generic_predicates_shim",
702700
"variant_fields_with_source_map_shim",
703701
"inherent_impls_in_crate_shim",
704702
"impl_signature_with_source_map_shim",
@@ -709,7 +707,6 @@ fn main() {
709707
"impl_trait_with_diagnostics_shim",
710708
"impl_self_ty_with_diagnostics_shim",
711709
"generic_predicates_shim",
712-
"generic_predicates_shim",
713710
]
714711
"#]],
715712
);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Helper functions for working with def, which don't need to be a separate
22
//! query, but can't be computed directly from `*Data` (ie, which need a `db`).
33
4-
use std::iter;
4+
use std::{cell::LazyCell, iter};
55

66
use base_db::Crate;
77
use chalk_ir::{
@@ -161,11 +161,12 @@ impl Iterator for ClauseElaborator<'_> {
161161
}
162162

163163
fn direct_super_traits_cb(db: &dyn DefDatabase, trait_: TraitId, cb: impl FnMut(TraitId)) {
164-
let resolver = trait_.resolver(db);
164+
let resolver = LazyCell::new(|| trait_.resolver(db));
165165
let (generic_params, store) = db.generic_params_and_store(trait_.into());
166166
let trait_self = generic_params.trait_self_param();
167167
generic_params
168168
.where_predicates()
169+
.iter()
169170
.filter_map(|pred| match pred {
170171
WherePredicate::ForLifetime { target, bound, .. }
171172
| WherePredicate::TypeBound { target, bound } => {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ fn has_disaplayable_predicates(
633633
params: &GenericParams,
634634
store: &ExpressionStore,
635635
) -> bool {
636-
params.where_predicates().any(|pred| {
636+
params.where_predicates().iter().any(|pred| {
637637
!matches!(
638638
pred,
639639
WherePredicate::TypeBound { target, .. }
@@ -668,7 +668,7 @@ fn write_where_predicates(
668668
_ => false,
669669
};
670670

671-
let mut iter = params.where_predicates().peekable();
671+
let mut iter = params.where_predicates().iter().peekable();
672672
while let Some(pred) = iter.next() {
673673
if matches!(pred, TypeBound { target, .. } if is_unnamed_type_target(*target)) {
674674
continue;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3667,7 +3667,7 @@ impl GenericDef {
36673667

36683668
let generics = db.generic_params(def);
36693669

3670-
if generics.is_empty() && generics.no_predicates() {
3670+
if generics.is_empty() && generics.has_no_predicates() {
36713671
return;
36723672
}
36733673

0 commit comments

Comments
 (0)