Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/ast/expr_ext.rs')
-rw-r--r--crates/syntax/src/ast/expr_ext.rs23
1 files changed, 22 insertions, 1 deletions
diff --git a/crates/syntax/src/ast/expr_ext.rs b/crates/syntax/src/ast/expr_ext.rs
index 9466755576..93faeb40c3 100644
--- a/crates/syntax/src/ast/expr_ext.rs
+++ b/crates/syntax/src/ast/expr_ext.rs
@@ -10,7 +10,7 @@ use crate::{
FormatArgsArg, FormatArgsExpr, MacroDef, Static, TokenTree,
},
AstToken,
- SyntaxKind::*,
+ SyntaxKind::{self, *},
SyntaxNode, SyntaxToken, T,
};
@@ -50,6 +50,27 @@ impl From<ast::IfExpr> for ElseBranch {
}
}
+impl AstNode for ElseBranch {
+ fn can_cast(kind: SyntaxKind) -> bool {
+ ast::BlockExpr::can_cast(kind) || ast::IfExpr::can_cast(kind)
+ }
+
+ fn cast(syntax: SyntaxNode) -> Option<Self> {
+ if let Some(block_expr) = ast::BlockExpr::cast(syntax.clone()) {
+ Some(Self::Block(block_expr))
+ } else {
+ ast::IfExpr::cast(syntax).map(Self::IfExpr)
+ }
+ }
+
+ fn syntax(&self) -> &SyntaxNode {
+ match self {
+ ElseBranch::Block(block_expr) => block_expr.syntax(),
+ ElseBranch::IfExpr(if_expr) => if_expr.syntax(),
+ }
+ }
+}
+
impl ast::IfExpr {
pub fn condition(&self) -> Option<ast::Expr> {
// If the condition is a BlockExpr, check if the then body is missing.