Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 008b639

Browse files
committed
handle #[cfg]s on generic parameters
1 parent b64e5b3 commit 008b639

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

crates/hir-def/src/generics.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use crate::{
2121
db::DefDatabase,
2222
dyn_map::{keys, DynMap},
2323
expander::Expander,
24+
item_tree::ItemTree,
2425
lower::LowerCtx,
2526
nameres::{DefMap, MacroSubNs},
2627
src::{HasChildSource, HasSource},
@@ -154,12 +155,28 @@ impl GenericParams {
154155
def: GenericDefId,
155156
) -> Interned<GenericParams> {
156157
let _p = profile::span("generic_params_query");
158+
159+
let krate = def.module(db).krate;
160+
let cfg_options = db.crate_graph();
161+
let cfg_options = &cfg_options[krate].cfg_options;
162+
let enabled_params = |params: &GenericParams, item_tree: &ItemTree| {
163+
let enabled = |param| item_tree.attrs(db, krate, param).is_cfg_enabled(cfg_options);
164+
Interned::new(GenericParams {
165+
type_or_consts: (params.type_or_consts.iter())
166+
.filter_map(|(idx, param)| enabled(idx.into()).then(|| param.clone()))
167+
.collect(),
168+
lifetimes: (params.lifetimes.iter())
169+
.filter_map(|(idx, param)| enabled(idx.into()).then(|| param.clone()))
170+
.collect(),
171+
where_predicates: params.where_predicates.clone(),
172+
})
173+
};
157174
macro_rules! id_to_generics {
158175
($id:ident) => {{
159176
let id = $id.lookup(db).id;
160177
let tree = id.item_tree(db);
161178
let item = &tree[id.value];
162-
item.generic_params.clone()
179+
enabled_params(&item.generic_params, &tree)
163180
}};
164181
}
165182

crates/hir-def/src/item_tree.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ use triomphe::Arc;
6464
use crate::{
6565
attr::Attrs,
6666
db::DefDatabase,
67-
generics::GenericParams,
67+
generics::{GenericParams, LifetimeParamData, TypeOrConstParamData},
6868
path::{path, AssociatedTypeBinding, GenericArgs, ImportAlias, ModPath, Path, PathKind},
6969
type_ref::{Mutability, TraitRef, TypeBound, TypeRef},
7070
visibility::RawVisibility,
@@ -296,10 +296,12 @@ pub enum AttrOwner {
296296
Variant(Idx<Variant>),
297297
Field(Idx<Field>),
298298
Param(Idx<Param>),
299+
TypeOrConstParamData(Idx<TypeOrConstParamData>),
300+
LifetimeParamData(Idx<LifetimeParamData>),
299301
}
300302

301303
macro_rules! from_attrs {
302-
( $( $var:ident($t:ty) ),+ ) => {
304+
( $( $var:ident($t:ty) ),+ $(,)? ) => {
303305
$(
304306
impl From<$t> for AttrOwner {
305307
fn from(t: $t) -> AttrOwner {
@@ -310,7 +312,14 @@ macro_rules! from_attrs {
310312
};
311313
}
312314

313-
from_attrs!(ModItem(ModItem), Variant(Idx<Variant>), Field(Idx<Field>), Param(Idx<Param>));
315+
from_attrs!(
316+
ModItem(ModItem),
317+
Variant(Idx<Variant>),
318+
Field(Idx<Field>),
319+
Param(Idx<Param>),
320+
TypeOrConstParamData(Idx<TypeOrConstParamData>),
321+
LifetimeParamData(Idx<LifetimeParamData>),
322+
);
314323

315324
/// Trait implemented by all item nodes in the item tree.
316325
pub trait ItemTreeNode: Clone {

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,41 @@ impl<'a> Ctx<'a> {
605605
generics.fill(&self.body_ctx, node);
606606

607607
generics.shrink_to_fit();
608+
609+
if let Some(params) = node.generic_param_list() {
610+
let params_by_name: FxHashMap<_, _> = params
611+
.generic_params()
612+
.filter_map(|param| {
613+
let name = match &param {
614+
ast::GenericParam::ConstParam(param) => param.name()?.as_name(),
615+
ast::GenericParam::LifetimeParam(param) => {
616+
Name::new_lifetime(&param.lifetime()?)
617+
}
618+
ast::GenericParam::TypeParam(param) => param.name()?.as_name(),
619+
};
620+
Some((name, param))
621+
})
622+
.collect();
623+
for (idx, param) in generics.type_or_consts.iter() {
624+
if let Some(name) = param.name() {
625+
if let Some(param) = params_by_name.get(name) {
626+
self.add_attrs(
627+
idx.into(),
628+
RawAttrs::new(self.db.upcast(), param, self.hygiene()),
629+
);
630+
}
631+
}
632+
}
633+
for (idx, param) in generics.lifetimes.iter() {
634+
if let Some(param) = params_by_name.get(&param.name) {
635+
self.add_attrs(
636+
idx.into(),
637+
RawAttrs::new(self.db.upcast(), param, self.hygiene()),
638+
);
639+
}
640+
}
641+
}
642+
608643
Interned::new(generics)
609644
}
610645

0 commit comments

Comments
 (0)