diff options
| author | Ryo Yoshida <low.ryoshida@gmail.com> | 2023-03-04 00:23:56 +0900 |
|---|---|---|
| committer | Ryo Yoshida <low.ryoshida@gmail.com> | 2023-03-04 00:23:56 +0900 |
| commit | 2e7d2c2d045e2a66a4e309cbb71a3264004f8678 (patch) | |
| tree | c8da7ff5cbc0b2ca0def352fb807213212d49097 /crates/syntax/src/ast/node_ext.rs | |
| parent | 9b441b9c67531481c7c18cd09b2397c0591ae63f (diff) | |
| download | rust-2e7d2c2d045e2a66a4e309cbb71a3264004f8678.tar.gz rust-2e7d2c2d045e2a66a4e309cbb71a3264004f8678.zip | |
Parse trait alias as a distinct AST type
Diffstat (limited to 'crates/syntax/src/ast/node_ext.rs')
| -rw-r--r-- | crates/syntax/src/ast/node_ext.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index fe82aa90722..301fbcebf1c 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -680,6 +680,51 @@ impl TypeOrConstParam { } } +#[derive(Debug, Clone)] +pub enum TraitOrAlias { + Trait(ast::Trait), + TraitAlias(ast::TraitAlias), +} + +impl TraitOrAlias { + pub fn name(&self) -> Option<ast::Name> { + match self { + TraitOrAlias::Trait(x) => x.name(), + TraitOrAlias::TraitAlias(x) => x.name(), + } + } +} + +impl AstNode for TraitOrAlias { + fn can_cast(kind: SyntaxKind) -> bool + where + Self: Sized, + { + matches!(kind, SyntaxKind::TRAIT | SyntaxKind::TRAIT_ALIAS) + } + + fn cast(syntax: SyntaxNode) -> Option<Self> + where + Self: Sized, + { + let res = match syntax.kind() { + SyntaxKind::TRAIT => TraitOrAlias::Trait(ast::Trait { syntax }), + SyntaxKind::TRAIT_ALIAS => TraitOrAlias::TraitAlias(ast::TraitAlias { syntax }), + _ => return None, + }; + Some(res) + } + + fn syntax(&self) -> &SyntaxNode { + match self { + TraitOrAlias::Trait(it) => it.syntax(), + TraitOrAlias::TraitAlias(it) => it.syntax(), + } + } +} + +impl HasAttrs for TraitOrAlias {} + pub enum VisibilityKind { In(ast::Path), PubCrate, |
