mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-01 07:48:45 +00:00
internal: Assume condition/iterable is missing if there is only a BlockExpr
This commit is contained in:
parent
b4d652aa40
commit
bf893d59b5
3 changed files with 40 additions and 4 deletions
|
@ -880,7 +880,6 @@ impl ForExpr {
|
||||||
pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
|
pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
|
||||||
pub fn pat(&self) -> Option<Pat> { support::child(&self.syntax) }
|
pub fn pat(&self) -> Option<Pat> { support::child(&self.syntax) }
|
||||||
pub fn in_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![in]) }
|
pub fn in_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![in]) }
|
||||||
pub fn iterable(&self) -> Option<Expr> { support::child(&self.syntax) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
|
@ -890,7 +889,6 @@ pub struct IfExpr {
|
||||||
impl ast::HasAttrs for IfExpr {}
|
impl ast::HasAttrs for IfExpr {}
|
||||||
impl IfExpr {
|
impl IfExpr {
|
||||||
pub fn if_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![if]) }
|
pub fn if_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![if]) }
|
||||||
pub fn condition(&self) -> Option<Expr> { support::child(&self.syntax) }
|
|
||||||
pub fn else_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![else]) }
|
pub fn else_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![else]) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1051,7 +1049,6 @@ pub struct WhileExpr {
|
||||||
impl ast::HasAttrs for WhileExpr {}
|
impl ast::HasAttrs for WhileExpr {}
|
||||||
impl WhileExpr {
|
impl WhileExpr {
|
||||||
pub fn while_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![while]) }
|
pub fn while_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![while]) }
|
||||||
pub fn condition(&self) -> Option<Expr> { support::child(&self.syntax) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
|
@ -1170,7 +1167,6 @@ pub struct MatchGuard {
|
||||||
}
|
}
|
||||||
impl MatchGuard {
|
impl MatchGuard {
|
||||||
pub fn if_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![if]) }
|
pub fn if_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![if]) }
|
||||||
pub fn condition(&self) -> Option<Expr> { support::child(&self.syntax) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
|
|
|
@ -806,6 +806,19 @@ impl ast::GenericParamList {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ast::ForExpr {
|
||||||
|
pub fn iterable(&self) -> Option<ast::Expr> {
|
||||||
|
// If the iterable is a BlockExpr, check if the body is missing.
|
||||||
|
// If it is assume the iterable 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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ast::HasLoopBody for ast::ForExpr {
|
impl ast::HasLoopBody for ast::ForExpr {
|
||||||
fn loop_body(&self) -> Option<ast::BlockExpr> {
|
fn loop_body(&self) -> Option<ast::BlockExpr> {
|
||||||
let mut exprs = support::children(self.syntax());
|
let mut exprs = support::children(self.syntax());
|
||||||
|
@ -815,6 +828,19 @@ impl ast::HasLoopBody for ast::ForExpr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ast::WhileExpr {
|
||||||
|
pub fn condition(&self) -> Option<ast::Expr> {
|
||||||
|
// If the condition is a BlockExpr, check if the 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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ast::HasLoopBody for ast::WhileExpr {
|
impl ast::HasLoopBody for ast::WhileExpr {
|
||||||
fn loop_body(&self) -> Option<ast::BlockExpr> {
|
fn loop_body(&self) -> Option<ast::BlockExpr> {
|
||||||
let mut exprs = support::children(self.syntax());
|
let mut exprs = support::children(self.syntax());
|
||||||
|
@ -835,3 +861,15 @@ impl From<ast::Adt> for ast::Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -682,6 +682,8 @@ fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, label: Option<&String>, r
|
||||||
| "value"
|
| "value"
|
||||||
| "trait"
|
| "trait"
|
||||||
| "self_ty"
|
| "self_ty"
|
||||||
|
| "iterable"
|
||||||
|
| "condition"
|
||||||
);
|
);
|
||||||
if manually_implemented {
|
if manually_implemented {
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in a new issue