Make hir().get_generics and generics_of consistent.
This commit is contained in:
parent
7e9b92cb43
commit
623ea5f5d2
3 changed files with 23 additions and 71 deletions
|
@ -3004,13 +3004,12 @@ impl ItemKind<'_> {
|
||||||
Some(match *self {
|
Some(match *self {
|
||||||
ItemKind::Fn(_, ref generics, _)
|
ItemKind::Fn(_, ref generics, _)
|
||||||
| ItemKind::TyAlias(_, ref generics)
|
| ItemKind::TyAlias(_, ref generics)
|
||||||
| ItemKind::OpaqueTy(OpaqueTy {
|
| ItemKind::OpaqueTy(OpaqueTy { ref generics, .. })
|
||||||
ref generics, origin: OpaqueTyOrigin::TyAlias, ..
|
|
||||||
})
|
|
||||||
| ItemKind::Enum(_, ref generics)
|
| ItemKind::Enum(_, ref generics)
|
||||||
| ItemKind::Struct(_, ref generics)
|
| ItemKind::Struct(_, ref generics)
|
||||||
| ItemKind::Union(_, ref generics)
|
| ItemKind::Union(_, ref generics)
|
||||||
| ItemKind::Trait(_, _, ref generics, _, _)
|
| ItemKind::Trait(_, _, ref generics, _, _)
|
||||||
|
| ItemKind::TraitAlias(ref generics, _)
|
||||||
| ItemKind::Impl(Impl { ref generics, .. }) => generics,
|
| ItemKind::Impl(Impl { ref generics, .. }) => generics,
|
||||||
_ => return None,
|
_ => return None,
|
||||||
})
|
})
|
||||||
|
@ -3210,13 +3209,8 @@ impl<'hir> OwnerNode<'hir> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generics(&self) -> Option<&'hir Generics<'hir>> {
|
pub fn generics(self) -> Option<&'hir Generics<'hir>> {
|
||||||
match self {
|
Node::generics(self.into())
|
||||||
OwnerNode::TraitItem(TraitItem { generics, .. })
|
|
||||||
| OwnerNode::ImplItem(ImplItem { generics, .. }) => Some(generics),
|
|
||||||
OwnerNode::Item(item) => item.kind.generics(),
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn def_id(self) -> LocalDefId {
|
pub fn def_id(self) -> LocalDefId {
|
||||||
|
@ -3403,9 +3397,12 @@ impl<'hir> Node<'hir> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generics(&self) -> Option<&'hir Generics<'hir>> {
|
pub fn generics(self) -> Option<&'hir Generics<'hir>> {
|
||||||
match self {
|
match self {
|
||||||
Node::TraitItem(TraitItem { generics, .. })
|
Node::ForeignItem(ForeignItem {
|
||||||
|
kind: ForeignItemKind::Fn(_, _, generics), ..
|
||||||
|
})
|
||||||
|
| Node::TraitItem(TraitItem { generics, .. })
|
||||||
| Node::ImplItem(ImplItem { generics, .. }) => Some(generics),
|
| Node::ImplItem(ImplItem { generics, .. }) => Some(generics),
|
||||||
Node::Item(item) => item.kind.generics(),
|
Node::Item(item) => item.kind.generics(),
|
||||||
_ => None,
|
_ => None,
|
||||||
|
|
|
@ -361,27 +361,7 @@ impl<'hir> Map<'hir> {
|
||||||
|
|
||||||
pub fn get_generics(self, id: LocalDefId) -> Option<&'hir Generics<'hir>> {
|
pub fn get_generics(self, id: LocalDefId) -> Option<&'hir Generics<'hir>> {
|
||||||
let node = self.tcx.hir_owner(id)?;
|
let node = self.tcx.hir_owner(id)?;
|
||||||
match node.node {
|
node.node.generics()
|
||||||
OwnerNode::ImplItem(impl_item) => Some(&impl_item.generics),
|
|
||||||
OwnerNode::TraitItem(trait_item) => Some(&trait_item.generics),
|
|
||||||
OwnerNode::ForeignItem(ForeignItem {
|
|
||||||
kind: ForeignItemKind::Fn(_, _, generics),
|
|
||||||
..
|
|
||||||
})
|
|
||||||
| OwnerNode::Item(Item {
|
|
||||||
kind:
|
|
||||||
ItemKind::Fn(_, generics, _)
|
|
||||||
| ItemKind::TyAlias(_, generics)
|
|
||||||
| ItemKind::Enum(_, generics)
|
|
||||||
| ItemKind::Struct(_, generics)
|
|
||||||
| ItemKind::Union(_, generics)
|
|
||||||
| ItemKind::Trait(_, _, generics, ..)
|
|
||||||
| ItemKind::TraitAlias(generics, _)
|
|
||||||
| ItemKind::Impl(Impl { generics, .. }),
|
|
||||||
..
|
|
||||||
}) => Some(generics),
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn item(self, id: ItemId) -> &'hir Item<'hir> {
|
pub fn item(self, id: ItemId) -> &'hir Item<'hir> {
|
||||||
|
|
|
@ -1588,41 +1588,20 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut opt_self = None;
|
|
||||||
let mut allow_defaults = false;
|
|
||||||
|
|
||||||
let no_generics = hir::Generics::empty();
|
let no_generics = hir::Generics::empty();
|
||||||
let ast_generics = match node {
|
let ast_generics = node.generics().unwrap_or(&no_generics);
|
||||||
Node::TraitItem(item) => &item.generics,
|
let (opt_self, allow_defaults) = match node {
|
||||||
|
|
||||||
Node::ImplItem(item) => &item.generics,
|
|
||||||
|
|
||||||
Node::Item(item) => {
|
Node::Item(item) => {
|
||||||
match item.kind {
|
match item.kind {
|
||||||
ItemKind::Fn(.., ref generics, _)
|
ItemKind::Trait(..) | ItemKind::TraitAlias(..) => {
|
||||||
| ItemKind::Impl(hir::Impl { ref generics, .. }) => generics,
|
|
||||||
|
|
||||||
ItemKind::TyAlias(_, ref generics)
|
|
||||||
| ItemKind::Enum(_, ref generics)
|
|
||||||
| ItemKind::Struct(_, ref generics)
|
|
||||||
| ItemKind::OpaqueTy(hir::OpaqueTy { ref generics, .. })
|
|
||||||
| ItemKind::Union(_, ref generics) => {
|
|
||||||
allow_defaults = true;
|
|
||||||
generics
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemKind::Trait(_, _, ref generics, ..)
|
|
||||||
| ItemKind::TraitAlias(ref generics, ..) => {
|
|
||||||
// Add in the self type parameter.
|
// Add in the self type parameter.
|
||||||
//
|
//
|
||||||
// Something of a hack: use the node id for the trait, also as
|
// Something of a hack: use the node id for the trait, also as
|
||||||
// the node id for the Self type parameter.
|
// the node id for the Self type parameter.
|
||||||
let param_id = item.def_id;
|
let opt_self = Some(ty::GenericParamDef {
|
||||||
|
|
||||||
opt_self = Some(ty::GenericParamDef {
|
|
||||||
index: 0,
|
index: 0,
|
||||||
name: kw::SelfUpper,
|
name: kw::SelfUpper,
|
||||||
def_id: param_id.to_def_id(),
|
def_id,
|
||||||
pure_wrt_drop: false,
|
pure_wrt_drop: false,
|
||||||
kind: ty::GenericParamDefKind::Type {
|
kind: ty::GenericParamDefKind::Type {
|
||||||
has_default: false,
|
has_default: false,
|
||||||
|
@ -1631,21 +1610,17 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
allow_defaults = true;
|
(opt_self, true)
|
||||||
generics
|
|
||||||
}
|
}
|
||||||
|
ItemKind::TyAlias(..)
|
||||||
_ => &no_generics,
|
| ItemKind::Enum(..)
|
||||||
|
| ItemKind::Struct(..)
|
||||||
|
| ItemKind::OpaqueTy(..)
|
||||||
|
| ItemKind::Union(..) => (None, true),
|
||||||
|
_ => (None, false),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_ => (None, false),
|
||||||
Node::ForeignItem(item) => match item.kind {
|
|
||||||
ForeignItemKind::Static(..) => &no_generics,
|
|
||||||
ForeignItemKind::Fn(_, _, ref generics) => generics,
|
|
||||||
ForeignItemKind::Type => &no_generics,
|
|
||||||
},
|
|
||||||
|
|
||||||
_ => &no_generics,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let has_self = opt_self.is_some();
|
let has_self = opt_self.is_some();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue