Skip to content

Commit

Permalink
Merge pull request #19314 from snprajwal/variantdef-impl
Browse files Browse the repository at this point in the history
fix(hir): `VariantDef` is `impl HasSource`
  • Loading branch information
Veykril authored Mar 10, 2025
2 parents 34e352a + 39391b0 commit 476a0cb
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 1 deletion.
12 changes: 11 additions & 1 deletion crates/hir/src/has_source.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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>> {
Expand Down
2 changes: 2 additions & 0 deletions crates/parser/src/syntax_kind/generated.rs
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ pub enum SyntaxKind {
USE_TREE,
USE_TREE_LIST,
VARIANT,
VARIANT_DEF,
VARIANT_LIST,
VISIBILITY,
WHERE_CLAUSE,
Expand Down Expand Up @@ -501,6 +502,7 @@ impl SyntaxKind {
| USE_TREE
| USE_TREE_LIST
| VARIANT
| VARIANT_DEF
| VARIANT_LIST
| VISIBILITY
| WHERE_CLAUSE
Expand Down
5 changes: 5 additions & 0 deletions crates/syntax/rust.ungram
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,11 @@ Adt =
| Struct
| Union

VariantDef =
Struct
| Union
| Variant

Const =
Attr* Visibility?
'default'?
Expand Down
50 changes: 50 additions & 0 deletions crates/syntax/src/ast/generated/nodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 476a0cb

Please sign in to comment.