Skip to content

Commit 623ea5f

Browse files
committed
Make hir().get_generics and generics_of consistent.
1 parent 7e9b92c commit 623ea5f

File tree

3 files changed

+23
-71
lines changed

3 files changed

+23
-71
lines changed

compiler/rustc_hir/src/hir.rs

+9-12
Original file line numberDiff line numberDiff line change
@@ -3004,13 +3004,12 @@ impl ItemKind<'_> {
30043004
Some(match *self {
30053005
ItemKind::Fn(_, ref generics, _)
30063006
| ItemKind::TyAlias(_, ref generics)
3007-
| ItemKind::OpaqueTy(OpaqueTy {
3008-
ref generics, origin: OpaqueTyOrigin::TyAlias, ..
3009-
})
3007+
| ItemKind::OpaqueTy(OpaqueTy { ref generics, .. })
30103008
| ItemKind::Enum(_, ref generics)
30113009
| ItemKind::Struct(_, ref generics)
30123010
| ItemKind::Union(_, ref generics)
30133011
| ItemKind::Trait(_, _, ref generics, _, _)
3012+
| ItemKind::TraitAlias(ref generics, _)
30143013
| ItemKind::Impl(Impl { ref generics, .. }) => generics,
30153014
_ => return None,
30163015
})
@@ -3210,13 +3209,8 @@ impl<'hir> OwnerNode<'hir> {
32103209
}
32113210
}
32123211

3213-
pub fn generics(&self) -> Option<&'hir Generics<'hir>> {
3214-
match self {
3215-
OwnerNode::TraitItem(TraitItem { generics, .. })
3216-
| OwnerNode::ImplItem(ImplItem { generics, .. }) => Some(generics),
3217-
OwnerNode::Item(item) => item.kind.generics(),
3218-
_ => None,
3219-
}
3212+
pub fn generics(self) -> Option<&'hir Generics<'hir>> {
3213+
Node::generics(self.into())
32203214
}
32213215

32223216
pub fn def_id(self) -> LocalDefId {
@@ -3403,9 +3397,12 @@ impl<'hir> Node<'hir> {
34033397
}
34043398
}
34053399

3406-
pub fn generics(&self) -> Option<&'hir Generics<'hir>> {
3400+
pub fn generics(self) -> Option<&'hir Generics<'hir>> {
34073401
match self {
3408-
Node::TraitItem(TraitItem { generics, .. })
3402+
Node::ForeignItem(ForeignItem {
3403+
kind: ForeignItemKind::Fn(_, _, generics), ..
3404+
})
3405+
| Node::TraitItem(TraitItem { generics, .. })
34093406
| Node::ImplItem(ImplItem { generics, .. }) => Some(generics),
34103407
Node::Item(item) => item.kind.generics(),
34113408
_ => None,

compiler/rustc_middle/src/hir/map/mod.rs

+1-21
Original file line numberDiff line numberDiff line change
@@ -361,27 +361,7 @@ impl<'hir> Map<'hir> {
361361

362362
pub fn get_generics(self, id: LocalDefId) -> Option<&'hir Generics<'hir>> {
363363
let node = self.tcx.hir_owner(id)?;
364-
match node.node {
365-
OwnerNode::ImplItem(impl_item) => Some(&impl_item.generics),
366-
OwnerNode::TraitItem(trait_item) => Some(&trait_item.generics),
367-
OwnerNode::ForeignItem(ForeignItem {
368-
kind: ForeignItemKind::Fn(_, _, generics),
369-
..
370-
})
371-
| OwnerNode::Item(Item {
372-
kind:
373-
ItemKind::Fn(_, generics, _)
374-
| ItemKind::TyAlias(_, generics)
375-
| ItemKind::Enum(_, generics)
376-
| ItemKind::Struct(_, generics)
377-
| ItemKind::Union(_, generics)
378-
| ItemKind::Trait(_, _, generics, ..)
379-
| ItemKind::TraitAlias(generics, _)
380-
| ItemKind::Impl(Impl { generics, .. }),
381-
..
382-
}) => Some(generics),
383-
_ => None,
384-
}
364+
node.node.generics()
385365
}
386366

387367
pub fn item(self, id: ItemId) -> &'hir Item<'hir> {

compiler/rustc_typeck/src/collect.rs

+13-38
Original file line numberDiff line numberDiff line change
@@ -1588,41 +1588,20 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
15881588
_ => None,
15891589
};
15901590

1591-
let mut opt_self = None;
1592-
let mut allow_defaults = false;
1593-
15941591
let no_generics = hir::Generics::empty();
1595-
let ast_generics = match node {
1596-
Node::TraitItem(item) => &item.generics,
1597-
1598-
Node::ImplItem(item) => &item.generics,
1599-
1592+
let ast_generics = node.generics().unwrap_or(&no_generics);
1593+
let (opt_self, allow_defaults) = match node {
16001594
Node::Item(item) => {
16011595
match item.kind {
1602-
ItemKind::Fn(.., ref generics, _)
1603-
| ItemKind::Impl(hir::Impl { ref generics, .. }) => generics,
1604-
1605-
ItemKind::TyAlias(_, ref generics)
1606-
| ItemKind::Enum(_, ref generics)
1607-
| ItemKind::Struct(_, ref generics)
1608-
| ItemKind::OpaqueTy(hir::OpaqueTy { ref generics, .. })
1609-
| ItemKind::Union(_, ref generics) => {
1610-
allow_defaults = true;
1611-
generics
1612-
}
1613-
1614-
ItemKind::Trait(_, _, ref generics, ..)
1615-
| ItemKind::TraitAlias(ref generics, ..) => {
1596+
ItemKind::Trait(..) | ItemKind::TraitAlias(..) => {
16161597
// Add in the self type parameter.
16171598
//
16181599
// Something of a hack: use the node id for the trait, also as
16191600
// the node id for the Self type parameter.
1620-
let param_id = item.def_id;
1621-
1622-
opt_self = Some(ty::GenericParamDef {
1601+
let opt_self = Some(ty::GenericParamDef {
16231602
index: 0,
16241603
name: kw::SelfUpper,
1625-
def_id: param_id.to_def_id(),
1604+
def_id,
16261605
pure_wrt_drop: false,
16271606
kind: ty::GenericParamDefKind::Type {
16281607
has_default: false,
@@ -1631,21 +1610,17 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
16311610
},
16321611
});
16331612

1634-
allow_defaults = true;
1635-
generics
1613+
(opt_self, true)
16361614
}
1637-
1638-
_ => &no_generics,
1615+
ItemKind::TyAlias(..)
1616+
| ItemKind::Enum(..)
1617+
| ItemKind::Struct(..)
1618+
| ItemKind::OpaqueTy(..)
1619+
| ItemKind::Union(..) => (None, true),
1620+
_ => (None, false),
16391621
}
16401622
}
1641-
1642-
Node::ForeignItem(item) => match item.kind {
1643-
ForeignItemKind::Static(..) => &no_generics,
1644-
ForeignItemKind::Fn(_, _, ref generics) => generics,
1645-
ForeignItemKind::Type => &no_generics,
1646-
},
1647-
1648-
_ => &no_generics,
1623+
_ => (None, false),
16491624
};
16501625

16511626
let has_self = opt_self.is_some();

0 commit comments

Comments
 (0)