Skip to content

Commit 71b9103

Browse files
authored
Merge pull request rust-lang#19314 from snprajwal/variantdef-impl
fix(hir): `VariantDef` is `impl HasSource`
2 parents b2a4f3d + e98837f commit 71b9103

File tree

4 files changed

+68
-1
lines changed

4 files changed

+68
-1
lines changed

src/tools/rust-analyzer/crates/hir/src/has_source.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use tt::TextRange;
1515
use crate::{
1616
db::HirDatabase, Adt, Callee, Const, Enum, ExternCrateDecl, Field, FieldSource, Function, Impl,
1717
InlineAsmOperand, Label, LifetimeParam, LocalSource, Macro, Module, Param, SelfParam, Static,
18-
Struct, Trait, TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant,
18+
Struct, Trait, TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant, VariantDef,
1919
};
2020

2121
pub trait HasSource {
@@ -110,6 +110,16 @@ impl HasSource for Adt {
110110
}
111111
}
112112
}
113+
impl HasSource for VariantDef {
114+
type Ast = ast::VariantDef;
115+
fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
116+
match self {
117+
VariantDef::Struct(s) => Some(s.source(db)?.map(ast::VariantDef::Struct)),
118+
VariantDef::Union(u) => Some(u.source(db)?.map(ast::VariantDef::Union)),
119+
VariantDef::Variant(v) => Some(v.source(db)?.map(ast::VariantDef::Variant)),
120+
}
121+
}
122+
}
113123
impl HasSource for Struct {
114124
type Ast = ast::Struct;
115125
fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {

src/tools/rust-analyzer/crates/parser/src/syntax_kind/generated.rs

+2
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ pub enum SyntaxKind {
315315
USE_TREE,
316316
USE_TREE_LIST,
317317
VARIANT,
318+
VARIANT_DEF,
318319
VARIANT_LIST,
319320
VISIBILITY,
320321
WHERE_CLAUSE,
@@ -501,6 +502,7 @@ impl SyntaxKind {
501502
| USE_TREE
502503
| USE_TREE_LIST
503504
| VARIANT
505+
| VARIANT_DEF
504506
| VARIANT_LIST
505507
| VISIBILITY
506508
| WHERE_CLAUSE

src/tools/rust-analyzer/crates/syntax/rust.ungram

+5
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ Adt =
279279
| Struct
280280
| Union
281281

282+
VariantDef =
283+
Struct
284+
| Union
285+
| Variant
286+
282287
Const =
283288
Attr* Visibility?
284289
'default'?

src/tools/rust-analyzer/crates/syntax/src/ast/generated/nodes.rs

+50
Original file line numberDiff line numberDiff line change
@@ -2446,6 +2446,17 @@ pub enum UseBoundGenericArg {
24462446
NameRef(NameRef),
24472447
}
24482448

2449+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
2450+
pub enum VariantDef {
2451+
Struct(Struct),
2452+
Union(Union),
2453+
Variant(Variant),
2454+
}
2455+
impl ast::HasAttrs for VariantDef {}
2456+
impl ast::HasDocComments for VariantDef {}
2457+
impl ast::HasName for VariantDef {}
2458+
impl ast::HasVisibility for VariantDef {}
2459+
24492460
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
24502461
pub struct AnyHasArgList {
24512462
pub(crate) syntax: SyntaxNode,
@@ -6738,6 +6749,40 @@ impl AstNode for UseBoundGenericArg {
67386749
}
67396750
}
67406751
}
6752+
impl From<Struct> for VariantDef {
6753+
#[inline]
6754+
fn from(node: Struct) -> VariantDef { VariantDef::Struct(node) }
6755+
}
6756+
impl From<Union> for VariantDef {
6757+
#[inline]
6758+
fn from(node: Union) -> VariantDef { VariantDef::Union(node) }
6759+
}
6760+
impl From<Variant> for VariantDef {
6761+
#[inline]
6762+
fn from(node: Variant) -> VariantDef { VariantDef::Variant(node) }
6763+
}
6764+
impl AstNode for VariantDef {
6765+
#[inline]
6766+
fn can_cast(kind: SyntaxKind) -> bool { matches!(kind, STRUCT | UNION | VARIANT) }
6767+
#[inline]
6768+
fn cast(syntax: SyntaxNode) -> Option<Self> {
6769+
let res = match syntax.kind() {
6770+
STRUCT => VariantDef::Struct(Struct { syntax }),
6771+
UNION => VariantDef::Union(Union { syntax }),
6772+
VARIANT => VariantDef::Variant(Variant { syntax }),
6773+
_ => return None,
6774+
};
6775+
Some(res)
6776+
}
6777+
#[inline]
6778+
fn syntax(&self) -> &SyntaxNode {
6779+
match self {
6780+
VariantDef::Struct(it) => &it.syntax,
6781+
VariantDef::Union(it) => &it.syntax,
6782+
VariantDef::Variant(it) => &it.syntax,
6783+
}
6784+
}
6785+
}
67416786
impl AnyHasArgList {
67426787
#[inline]
67436788
pub fn new<T: ast::HasArgList>(node: T) -> AnyHasArgList {
@@ -7753,6 +7798,11 @@ impl std::fmt::Display for UseBoundGenericArg {
77537798
std::fmt::Display::fmt(self.syntax(), f)
77547799
}
77557800
}
7801+
impl std::fmt::Display for VariantDef {
7802+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7803+
std::fmt::Display::fmt(self.syntax(), f)
7804+
}
7805+
}
77567806
impl std::fmt::Display for Abi {
77577807
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77587808
std::fmt::Display::fmt(self.syntax(), f)

0 commit comments

Comments
 (0)