Auto merge of #14361 - Veykril:if-then-parse, r=Veykril
fix: Fix `ast::IfExpr` child accessors Fixes https://github.com/rust-lang/rust-analyzer/issues/14360
This commit is contained in:
commit
924d277f32
@ -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 {} {}}
|
||||
"#]],
|
||||
)
|
||||
}
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user