Skip to content

Commit e98837f

Browse files
committed
fix(hir): VariantDef is impl HasSource
A new syntax node `ast::VariantDef` has been introduced to map between the HIR node and the AST. The files have been updated with `cargo test -p xtask`. Signed-off-by: Prajwal S N <[email protected]>
1 parent d11c5b8 commit e98837f

File tree

5 files changed

+70
-3
lines changed

5 files changed

+70
-3
lines changed

Diff for: 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>> {

Diff for: 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

Diff for: 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'?

Diff for: 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)

Diff for: src/tools/rust-analyzer/docs/book/src/assists_generated.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,7 @@ pub use foo::{Bar, Baz};
10701070

10711071

10721072
### `expand_record_rest_pattern`
1073-
**Source:** [expand_rest_pattern.rs](https://github.com/rust-lang/rust-analyzer/blob/master/crates/ide-assists/src/handlers/expand_rest_pattern.rs#L24)
1073+
**Source:** [expand_rest_pattern.rs](https://github.com/rust-lang/rust-analyzer/blob/master/crates/ide-assists/src/handlers/expand_rest_pattern.rs#L26)
10741074

10751075
Fills fields by replacing rest pattern in record patterns.
10761076

@@ -1094,7 +1094,7 @@ fn foo(bar: Bar) {
10941094

10951095

10961096
### `expand_tuple_struct_rest_pattern`
1097-
**Source:** [expand_rest_pattern.rs](https://github.com/rust-lang/rust-analyzer/blob/master/crates/ide-assists/src/handlers/expand_rest_pattern.rs#L80)
1097+
**Source:** [expand_rest_pattern.rs](https://github.com/rust-lang/rust-analyzer/blob/master/crates/ide-assists/src/handlers/expand_rest_pattern.rs#L82)
10981098

10991099
Fills fields by replacing rest pattern in tuple struct patterns.
11001100

0 commit comments

Comments
 (0)