Skip to content

Commit dc69255

Browse files
committed
Re-organize hir-def/lib.rs
1 parent 74eb3ec commit dc69255

File tree

4 files changed

+228
-211
lines changed

4 files changed

+228
-211
lines changed

crates/hir-def/src/attr.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ use crate::{
2828
lang_item::LangItem,
2929
nameres::{ModuleOrigin, ModuleSource},
3030
src::{HasChildSource, HasSource},
31-
AdtId, AttrDefId, GenericParamId, ItemTreeLoc, LocalFieldId, Lookup, MacroId, VariantId,
31+
AdtId, AttrDefId, GenericParamId, HasModule, ItemTreeLoc, LocalFieldId, Lookup, MacroId,
32+
VariantId,
3233
};
3334

3435
/// Desugared attributes of an item post `cfg_attr` expansion.

crates/hir-def/src/generics.rs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ use triomphe::Arc;
1818
use crate::{
1919
db::DefDatabase,
2020
expander::Expander,
21-
item_tree::ItemTree,
21+
item_tree::{GenericsItemTreeNode, ItemTree},
2222
lower::LowerCtx,
2323
nameres::{DefMap, MacroSubNs},
2424
type_ref::{ConstRef, LifetimeRef, TypeBound, TypeRef},
25-
AdtId, ConstParamId, GenericDefId, HasModule, LocalTypeOrConstParamId, Lookup,
25+
AdtId, ConstParamId, GenericDefId, HasModule, ItemTreeLoc, LocalTypeOrConstParamId, Lookup,
2626
TypeOrConstParamId, TypeParamId,
2727
};
2828

@@ -414,13 +414,18 @@ impl GenericParams {
414414
})
415415
}
416416
};
417-
macro_rules! id_to_generics {
418-
($id:ident) => {{
419-
let id = $id.lookup(db).id;
420-
let tree = id.item_tree(db);
421-
let item = &tree[id.value];
422-
enabled_params(&item.generic_params, &tree)
423-
}};
417+
fn id_to_generics<Id: GenericsItemTreeNode>(
418+
db: &dyn DefDatabase,
419+
id: impl for<'db> Lookup<
420+
Database<'db> = dyn DefDatabase + 'db,
421+
Data = impl ItemTreeLoc<Id = Id>,
422+
>,
423+
enabled_params: impl Fn(&Interned<GenericParams>, &ItemTree) -> Interned<GenericParams>,
424+
) -> Interned<GenericParams> {
425+
let id = id.lookup(db).item_tree_id();
426+
let tree = id.item_tree(db);
427+
let item = &tree[id.value];
428+
enabled_params(item.generic_params(), &tree)
424429
}
425430

426431
match def {
@@ -453,13 +458,13 @@ impl GenericParams {
453458
Interned::new(generic_params.finish())
454459
}
455460
}
456-
GenericDefId::AdtId(AdtId::StructId(id)) => id_to_generics!(id),
457-
GenericDefId::AdtId(AdtId::EnumId(id)) => id_to_generics!(id),
458-
GenericDefId::AdtId(AdtId::UnionId(id)) => id_to_generics!(id),
459-
GenericDefId::TraitId(id) => id_to_generics!(id),
460-
GenericDefId::TraitAliasId(id) => id_to_generics!(id),
461-
GenericDefId::TypeAliasId(id) => id_to_generics!(id),
462-
GenericDefId::ImplId(id) => id_to_generics!(id),
461+
GenericDefId::AdtId(AdtId::StructId(id)) => id_to_generics(db, id, enabled_params),
462+
GenericDefId::AdtId(AdtId::EnumId(id)) => id_to_generics(db, id, enabled_params),
463+
GenericDefId::AdtId(AdtId::UnionId(id)) => id_to_generics(db, id, enabled_params),
464+
GenericDefId::TraitId(id) => id_to_generics(db, id, enabled_params),
465+
GenericDefId::TraitAliasId(id) => id_to_generics(db, id, enabled_params),
466+
GenericDefId::TypeAliasId(id) => id_to_generics(db, id, enabled_params),
467+
GenericDefId::ImplId(id) => id_to_generics(db, id, enabled_params),
463468
GenericDefId::EnumVariantId(_) | GenericDefId::ConstId(_) => {
464469
Interned::new(GenericParams {
465470
type_or_consts: Default::default(),

crates/hir-def/src/item_tree.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,9 @@ pub trait ItemTreeNode: Clone {
347347
fn lookup(tree: &ItemTree, index: Idx<Self>) -> &Self;
348348
fn attr_owner(id: FileItemTreeId<Self>) -> AttrOwner;
349349
}
350+
pub trait GenericsItemTreeNode: ItemTreeNode {
351+
fn generic_params(&self) -> &Interned<GenericParams>;
352+
}
350353

351354
pub struct FileItemTreeId<N>(Idx<N>);
352355

@@ -473,7 +476,7 @@ impl<N> Hash for ItemTreeId<N> {
473476
}
474477

475478
macro_rules! mod_items {
476-
( $( $typ:ident in $fld:ident -> $ast:ty ),+ $(,)? ) => {
479+
( $( $typ:ident $(<$generic_params:ident>)? in $fld:ident -> $ast:ty ),+ $(,)? ) => {
477480
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
478481
pub enum ModItem {
479482
$(
@@ -513,6 +516,14 @@ macro_rules! mod_items {
513516
&self.data().$fld[index]
514517
}
515518
}
519+
520+
$(
521+
impl GenericsItemTreeNode for $typ {
522+
fn generic_params(&self) -> &Interned<GenericParams> {
523+
&self.$generic_params
524+
}
525+
}
526+
)?
516527
)+
517528
};
518529
}
@@ -521,16 +532,16 @@ mod_items! {
521532
Use in uses -> ast::Use,
522533
ExternCrate in extern_crates -> ast::ExternCrate,
523534
ExternBlock in extern_blocks -> ast::ExternBlock,
524-
Function in functions -> ast::Fn,
525-
Struct in structs -> ast::Struct,
526-
Union in unions -> ast::Union,
527-
Enum in enums -> ast::Enum,
535+
Function<explicit_generic_params> in functions -> ast::Fn,
536+
Struct<generic_params> in structs -> ast::Struct,
537+
Union<generic_params> in unions -> ast::Union,
538+
Enum<generic_params> in enums -> ast::Enum,
528539
Const in consts -> ast::Const,
529540
Static in statics -> ast::Static,
530-
Trait in traits -> ast::Trait,
531-
TraitAlias in trait_aliases -> ast::TraitAlias,
532-
Impl in impls -> ast::Impl,
533-
TypeAlias in type_aliases -> ast::TypeAlias,
541+
Trait<generic_params> in traits -> ast::Trait,
542+
TraitAlias<generic_params> in trait_aliases -> ast::TraitAlias,
543+
Impl<generic_params> in impls -> ast::Impl,
544+
TypeAlias<generic_params> in type_aliases -> ast::TypeAlias,
534545
Mod in mods -> ast::Module,
535546
MacroCall in macro_calls -> ast::MacroCall,
536547
MacroRules in macro_rules -> ast::MacroRules,

0 commit comments

Comments
 (0)