mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Merge pull request #19314 from snprajwal/variantdef-impl
fix(hir): `VariantDef` is `impl HasSource`
This commit is contained in:
commit
71b9103ea2
@ -15,7 +15,7 @@ use tt::TextRange;
|
||||
use crate::{
|
||||
db::HirDatabase, Adt, Callee, Const, Enum, ExternCrateDecl, Field, FieldSource, Function, Impl,
|
||||
InlineAsmOperand, Label, LifetimeParam, LocalSource, Macro, Module, Param, SelfParam, Static,
|
||||
Struct, Trait, TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant,
|
||||
Struct, Trait, TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant, VariantDef,
|
||||
};
|
||||
|
||||
pub trait HasSource {
|
||||
@ -110,6 +110,16 @@ impl HasSource for Adt {
|
||||
}
|
||||
}
|
||||
}
|
||||
impl HasSource for VariantDef {
|
||||
type Ast = ast::VariantDef;
|
||||
fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
|
||||
match self {
|
||||
VariantDef::Struct(s) => Some(s.source(db)?.map(ast::VariantDef::Struct)),
|
||||
VariantDef::Union(u) => Some(u.source(db)?.map(ast::VariantDef::Union)),
|
||||
VariantDef::Variant(v) => Some(v.source(db)?.map(ast::VariantDef::Variant)),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl HasSource for Struct {
|
||||
type Ast = ast::Struct;
|
||||
fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
|
||||
|
@ -315,6 +315,7 @@ pub enum SyntaxKind {
|
||||
USE_TREE,
|
||||
USE_TREE_LIST,
|
||||
VARIANT,
|
||||
VARIANT_DEF,
|
||||
VARIANT_LIST,
|
||||
VISIBILITY,
|
||||
WHERE_CLAUSE,
|
||||
@ -501,6 +502,7 @@ impl SyntaxKind {
|
||||
| USE_TREE
|
||||
| USE_TREE_LIST
|
||||
| VARIANT
|
||||
| VARIANT_DEF
|
||||
| VARIANT_LIST
|
||||
| VISIBILITY
|
||||
| WHERE_CLAUSE
|
||||
|
@ -279,6 +279,11 @@ Adt =
|
||||
| Struct
|
||||
| Union
|
||||
|
||||
VariantDef =
|
||||
Struct
|
||||
| Union
|
||||
| Variant
|
||||
|
||||
Const =
|
||||
Attr* Visibility?
|
||||
'default'?
|
||||
|
@ -2446,6 +2446,17 @@ pub enum UseBoundGenericArg {
|
||||
NameRef(NameRef),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
pub enum VariantDef {
|
||||
Struct(Struct),
|
||||
Union(Union),
|
||||
Variant(Variant),
|
||||
}
|
||||
impl ast::HasAttrs for VariantDef {}
|
||||
impl ast::HasDocComments for VariantDef {}
|
||||
impl ast::HasName for VariantDef {}
|
||||
impl ast::HasVisibility for VariantDef {}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
pub struct AnyHasArgList {
|
||||
pub(crate) syntax: SyntaxNode,
|
||||
@ -6738,6 +6749,40 @@ impl AstNode for UseBoundGenericArg {
|
||||
}
|
||||
}
|
||||
}
|
||||
impl From<Struct> for VariantDef {
|
||||
#[inline]
|
||||
fn from(node: Struct) -> VariantDef { VariantDef::Struct(node) }
|
||||
}
|
||||
impl From<Union> for VariantDef {
|
||||
#[inline]
|
||||
fn from(node: Union) -> VariantDef { VariantDef::Union(node) }
|
||||
}
|
||||
impl From<Variant> for VariantDef {
|
||||
#[inline]
|
||||
fn from(node: Variant) -> VariantDef { VariantDef::Variant(node) }
|
||||
}
|
||||
impl AstNode for VariantDef {
|
||||
#[inline]
|
||||
fn can_cast(kind: SyntaxKind) -> bool { matches!(kind, STRUCT | UNION | VARIANT) }
|
||||
#[inline]
|
||||
fn cast(syntax: SyntaxNode) -> Option<Self> {
|
||||
let res = match syntax.kind() {
|
||||
STRUCT => VariantDef::Struct(Struct { syntax }),
|
||||
UNION => VariantDef::Union(Union { syntax }),
|
||||
VARIANT => VariantDef::Variant(Variant { syntax }),
|
||||
_ => return None,
|
||||
};
|
||||
Some(res)
|
||||
}
|
||||
#[inline]
|
||||
fn syntax(&self) -> &SyntaxNode {
|
||||
match self {
|
||||
VariantDef::Struct(it) => &it.syntax,
|
||||
VariantDef::Union(it) => &it.syntax,
|
||||
VariantDef::Variant(it) => &it.syntax,
|
||||
}
|
||||
}
|
||||
}
|
||||
impl AnyHasArgList {
|
||||
#[inline]
|
||||
pub fn new<T: ast::HasArgList>(node: T) -> AnyHasArgList {
|
||||
@ -7753,6 +7798,11 @@ impl std::fmt::Display for UseBoundGenericArg {
|
||||
std::fmt::Display::fmt(self.syntax(), f)
|
||||
}
|
||||
}
|
||||
impl std::fmt::Display for VariantDef {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
std::fmt::Display::fmt(self.syntax(), f)
|
||||
}
|
||||
}
|
||||
impl std::fmt::Display for Abi {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
std::fmt::Display::fmt(self.syntax(), f)
|
||||
|
Loading…
Reference in New Issue
Block a user