rustc: Harmonize DefKind
and DefPathData
`DefPathData::(ClosureExpr,ImplTrait)` are renamed to match `DefKind::(Closure,OpaqueTy)`. `DefPathData::ImplTraitAssocTy` is replaced with `DefPathData::TypeNS(kw::Empty)` because both correspond to `DefKind::AssocTy`. It's possible that introducing `(DefKind,DefPathData)::AssocOpaqueTy` could be a better solution, but that would be a much more invasive change. Const generic parameters introduced for effects are moved from `DefPathData::TypeNS` to `DefPathData::ValueNS`, because constants are values. `DefPathData` is no longer passed to `create_def` functions to avoid redundancy.
This commit is contained in:
parent
7ceaf19868
commit
17e799c270
17 changed files with 133 additions and 132 deletions
|
@ -1,3 +1,4 @@
|
|||
use crate::definitions::DefPathData;
|
||||
use crate::hir;
|
||||
|
||||
use rustc_ast as ast;
|
||||
|
@ -45,6 +46,7 @@ pub enum NonMacroAttrKind {
|
|||
}
|
||||
|
||||
/// What kind of definition something is; e.g., `mod` vs `struct`.
|
||||
/// `enum DefPathData` may need to be updated if a new variant is added here.
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Encodable, Decodable, Hash, Debug, HashStable_Generic)]
|
||||
pub enum DefKind {
|
||||
// Type namespace
|
||||
|
@ -221,6 +223,41 @@ impl DefKind {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn def_path_data(self, name: Symbol) -> DefPathData {
|
||||
match self {
|
||||
DefKind::Mod
|
||||
| DefKind::Struct
|
||||
| DefKind::Union
|
||||
| DefKind::Enum
|
||||
| DefKind::Variant
|
||||
| DefKind::Trait
|
||||
| DefKind::TyAlias
|
||||
| DefKind::ForeignTy
|
||||
| DefKind::TraitAlias
|
||||
| DefKind::AssocTy
|
||||
| DefKind::TyParam
|
||||
| DefKind::ExternCrate => DefPathData::TypeNs(name),
|
||||
DefKind::Fn
|
||||
| DefKind::Const
|
||||
| DefKind::ConstParam
|
||||
| DefKind::Static(..)
|
||||
| DefKind::AssocFn
|
||||
| DefKind::AssocConst
|
||||
| DefKind::Field => DefPathData::ValueNs(name),
|
||||
DefKind::Macro(..) => DefPathData::MacroNs(name),
|
||||
DefKind::LifetimeParam => DefPathData::LifetimeNs(name),
|
||||
DefKind::Ctor(..) => DefPathData::Ctor,
|
||||
DefKind::Use => DefPathData::Use,
|
||||
DefKind::ForeignMod => DefPathData::ForeignMod,
|
||||
DefKind::AnonConst => DefPathData::AnonConst,
|
||||
DefKind::InlineConst => DefPathData::AnonConst,
|
||||
DefKind::OpaqueTy => DefPathData::OpaqueTy,
|
||||
DefKind::GlobalAsm => DefPathData::GlobalAsm,
|
||||
DefKind::Impl { .. } => DefPathData::Impl,
|
||||
DefKind::Closure => DefPathData::Closure,
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn is_fn_like(self) -> bool {
|
||||
matches!(self, DefKind::Fn | DefKind::AssocFn | DefKind::Closure)
|
||||
|
|
|
@ -246,6 +246,7 @@ impl DefPath {
|
|||
}
|
||||
}
|
||||
|
||||
/// New variants should only be added in synchronization with `enum DefKind`.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)]
|
||||
pub enum DefPathData {
|
||||
// Root: these should only be used for the root nodes, because
|
||||
|
@ -271,7 +272,7 @@ pub enum DefPathData {
|
|||
/// Something in the lifetime namespace.
|
||||
LifetimeNs(Symbol),
|
||||
/// A closure expression.
|
||||
ClosureExpr,
|
||||
Closure,
|
||||
|
||||
// Subportions of items:
|
||||
/// Implicit constructor for a unit or tuple-like struct or enum variant.
|
||||
|
@ -280,9 +281,7 @@ pub enum DefPathData {
|
|||
AnonConst,
|
||||
/// An existential `impl Trait` type node.
|
||||
/// Argument position `impl Trait` have a `TypeNs` with their pretty-printed name.
|
||||
ImplTrait,
|
||||
/// `impl Trait` generated associated type node.
|
||||
ImplTraitAssocTy,
|
||||
OpaqueTy,
|
||||
}
|
||||
|
||||
impl Definitions {
|
||||
|
@ -403,16 +402,17 @@ impl DefPathData {
|
|||
pub fn get_opt_name(&self) -> Option<Symbol> {
|
||||
use self::DefPathData::*;
|
||||
match *self {
|
||||
TypeNs(name) if name == kw::Empty => None,
|
||||
TypeNs(name) | ValueNs(name) | MacroNs(name) | LifetimeNs(name) => Some(name),
|
||||
|
||||
Impl | ForeignMod | CrateRoot | Use | GlobalAsm | ClosureExpr | Ctor | AnonConst
|
||||
| ImplTrait | ImplTraitAssocTy => None,
|
||||
Impl | ForeignMod | CrateRoot | Use | GlobalAsm | Closure | Ctor | AnonConst
|
||||
| OpaqueTy => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn name(&self) -> DefPathDataName {
|
||||
use self::DefPathData::*;
|
||||
match *self {
|
||||
TypeNs(name) if name == kw::Empty => DefPathDataName::Anon { namespace: sym::opaque },
|
||||
TypeNs(name) | ValueNs(name) | MacroNs(name) | LifetimeNs(name) => {
|
||||
DefPathDataName::Named(name)
|
||||
}
|
||||
|
@ -422,10 +422,10 @@ impl DefPathData {
|
|||
ForeignMod => DefPathDataName::Anon { namespace: kw::Extern },
|
||||
Use => DefPathDataName::Anon { namespace: kw::Use },
|
||||
GlobalAsm => DefPathDataName::Anon { namespace: sym::global_asm },
|
||||
ClosureExpr => DefPathDataName::Anon { namespace: sym::closure },
|
||||
Closure => DefPathDataName::Anon { namespace: sym::closure },
|
||||
Ctor => DefPathDataName::Anon { namespace: sym::constructor },
|
||||
AnonConst => DefPathDataName::Anon { namespace: sym::constant },
|
||||
ImplTrait | ImplTraitAssocTy => DefPathDataName::Anon { namespace: sym::opaque },
|
||||
OpaqueTy => DefPathDataName::Anon { namespace: sym::opaque },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue