Skip to content

Commit 39747cb

Browse files
Reuse empty GenericParams
This saves back 15mb that went for typeref source maps.
1 parent 1fae57f commit 39747cb

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

crates/hir-def/src/generics.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//! generic parameters. See also the `Generics` type and the `generics_of` query
44
//! in rustc.
55
6-
use std::ops;
6+
use std::{ops, sync::LazyLock};
77

88
use either::Either;
99
use hir_expand::{
@@ -412,7 +412,7 @@ impl GenericParams {
412412
);
413413
}
414414
let generics = generic_params.finish(types_map, &mut types_source_maps);
415-
(Arc::new(generics), Some(Arc::new(types_source_maps)))
415+
(generics, Some(Arc::new(types_source_maps)))
416416
}
417417
}
418418
GenericDefId::AdtId(AdtId::StructId(id)) => id_to_generics(db, id, enabled_params),
@@ -686,19 +686,32 @@ impl GenericParamsCollector {
686686
self,
687687
mut generics_types_map: TypesMap,
688688
generics_types_source_map: &mut TypesSourceMap,
689-
) -> GenericParams {
689+
) -> Arc<GenericParams> {
690690
let Self { mut lifetimes, mut type_or_consts, mut where_predicates } = self;
691+
692+
if lifetimes.is_empty() && type_or_consts.is_empty() && where_predicates.is_empty() {
693+
static EMPTY: LazyLock<Arc<GenericParams>> = LazyLock::new(|| {
694+
Arc::new(GenericParams {
695+
lifetimes: Arena::new(),
696+
type_or_consts: Arena::new(),
697+
where_predicates: Box::default(),
698+
types_map: TypesMap::default(),
699+
})
700+
});
701+
return Arc::clone(&EMPTY);
702+
}
703+
691704
lifetimes.shrink_to_fit();
692705
type_or_consts.shrink_to_fit();
693706
where_predicates.shrink_to_fit();
694707
generics_types_map.shrink_to_fit();
695708
generics_types_source_map.shrink_to_fit();
696-
GenericParams {
709+
Arc::new(GenericParams {
697710
type_or_consts,
698711
lifetimes,
699712
where_predicates: where_predicates.into_boxed_slice(),
700713
types_map: generics_types_map,
701-
}
714+
})
702715
}
703716
}
704717

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,7 @@ impl<'a> Ctx<'a> {
895895
generics.fill(&body_ctx, node, add_param_attrs);
896896

897897
let generics = generics.finish(types_map, &mut types_source_map);
898-
(Arc::new(generics), types_source_map)
898+
(generics, types_source_map)
899899
}
900900

901901
fn lower_type_bounds(

0 commit comments

Comments
 (0)