fix: Fix ast::IfExpr child accessors

This commit is contained in:
Lukas Wirth 2023-03-15 12:53:39 +01:00
parent 1787c14e72
commit 9fe206956f
3 changed files with 21 additions and 21 deletions

View File

@ -636,9 +636,8 @@ fn foo() {
if {}
}
"#,
// the {} gets parsed as the condition, I think?
expect![[r#"
fn foo () {if {} {}}
fn foo () {if __ra_fixup {} {}}
"#]],
)
}

View File

@ -48,23 +48,30 @@ fn from(if_expr: ast::IfExpr) -> Self {
}
impl ast::IfExpr {
pub fn condition(&self) -> Option<ast::Expr> {
// If the condition is a BlockExpr, check if the then body is missing.
// If it is assume the condition is the expression that is missing instead.
let mut exprs = support::children(self.syntax());
let first = exprs.next();
match first {
Some(ast::Expr::BlockExpr(_)) => exprs.next().and(first),
first => first,
}
}
pub fn then_branch(&self) -> Option<ast::BlockExpr> {
self.children_after_condition().next()
match support::children(self.syntax()).nth(1)? {
ast::Expr::BlockExpr(block) => Some(block),
_ => None,
}
}
pub fn else_branch(&self) -> Option<ElseBranch> {
let res = match self.children_after_condition().nth(1) {
Some(block) => ElseBranch::Block(block),
None => {
let elif = self.children_after_condition().next()?;
ElseBranch::IfExpr(elif)
}
};
Some(res)
}
fn children_after_condition<N: AstNode>(&self) -> impl Iterator<Item = N> {
self.syntax().children().skip(1).filter_map(N::cast)
match support::children(self.syntax()).nth(2)? {
ast::Expr::BlockExpr(block) => Some(ElseBranch::Block(block)),
ast::Expr::IfExpr(elif) => Some(ElseBranch::IfExpr(elif)),
_ => None,
}
}
}

View File

@ -937,12 +937,6 @@ fn from(it: ast::Adt) -> Self {
}
}
impl ast::IfExpr {
pub fn condition(&self) -> Option<ast::Expr> {
support::child(&self.syntax)
}
}
impl ast::MatchGuard {
pub fn condition(&self) -> Option<ast::Expr> {
support::child(&self.syntax)