Unnamed repository; edit this file 'description' to name the repository.
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]>
Prajwal S N 2025-03-08
parent 62dea27 · commit 39391b0
-rw-r--r--crates/hir/src/has_source.rs12
-rw-r--r--crates/parser/src/syntax_kind/generated.rs2
-rw-r--r--crates/syntax/rust.ungram5
-rw-r--r--crates/syntax/src/ast/generated/nodes.rs50
-rw-r--r--docs/book/src/assists_generated.md4
5 files changed, 70 insertions, 3 deletions
diff --git a/crates/hir/src/has_source.rs b/crates/hir/src/has_source.rs
index a34b498083..372c725293 100644
--- a/crates/hir/src/has_source.rs
+++ b/crates/hir/src/has_source.rs
@@ -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>> {
diff --git a/crates/parser/src/syntax_kind/generated.rs b/crates/parser/src/syntax_kind/generated.rs
index e56e09eeb6..1ff0bbea8b 100644
--- a/crates/parser/src/syntax_kind/generated.rs
+++ b/crates/parser/src/syntax_kind/generated.rs
@@ -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
diff --git a/crates/syntax/rust.ungram b/crates/syntax/rust.ungram
index 88d7beb897..70a91af6c4 100644
--- a/crates/syntax/rust.ungram
+++ b/crates/syntax/rust.ungram
@@ -279,6 +279,11 @@ Adt =
| Struct
| Union
+VariantDef =
+ Struct
+| Union
+| Variant
+
Const =
Attr* Visibility?
'default'?
diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs
index 58c76a456a..ebee5e9af2 100644
--- a/crates/syntax/src/ast/generated/nodes.rs
+++ b/crates/syntax/src/ast/generated/nodes.rs
@@ -2447,6 +2447,17 @@ pub enum UseBoundGenericArg {
}
#[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)
diff --git a/docs/book/src/assists_generated.md b/docs/book/src/assists_generated.md
index 918ae4a579..a1433952e0 100644
--- a/docs/book/src/assists_generated.md
+++ b/docs/book/src/assists_generated.md
@@ -1070,7 +1070,7 @@ pub use foo::{Bar, Baz};
### `expand_record_rest_pattern`
-**Source:** [expand_rest_pattern.rs](https://github.com/rust-lang/rust-analyzer/blob/master/crates/ide-assists/src/handlers/expand_rest_pattern.rs#L24)
+**Source:** [expand_rest_pattern.rs](https://github.com/rust-lang/rust-analyzer/blob/master/crates/ide-assists/src/handlers/expand_rest_pattern.rs#L26)
Fills fields by replacing rest pattern in record patterns.
@@ -1094,7 +1094,7 @@ fn foo(bar: Bar) {
### `expand_tuple_struct_rest_pattern`
-**Source:** [expand_rest_pattern.rs](https://github.com/rust-lang/rust-analyzer/blob/master/crates/ide-assists/src/handlers/expand_rest_pattern.rs#L80)
+**Source:** [expand_rest_pattern.rs](https://github.com/rust-lang/rust-analyzer/blob/master/crates/ide-assists/src/handlers/expand_rest_pattern.rs#L82)
Fills fields by replacing rest pattern in tuple struct patterns.