diff options
| author | bors <bors@rust-lang.org> | 2022-07-27 15:30:03 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-07-27 15:30:03 +0000 |
| commit | 9a1ec451d3c8c6bed062ee002b5c613d64ca1ecd (patch) | |
| tree | 3c22bfb3368e47be42b793dfc26f9a424957c58e | |
| parent | b4d652aa40911640c137314e97ca99557cd44df5 (diff) | |
| parent | bf893d59b54eb3b0dd3bcf34a66f9f0703753ffb (diff) | |
| download | rust-9a1ec451d3c8c6bed062ee002b5c613d64ca1ecd.tar.gz rust-9a1ec451d3c8c6bed062ee002b5c613d64ca1ecd.zip | |
Auto merge of #12890 - Veykril:syntax-blocks, r=Veykril
internal: Assume condition/iterable is missing if there is only a BlockExpr cc https://github.com/rust-lang/rust-analyzer/pull/12880#issuecomment-1195567103 It sounds good on paper, so let's try it
| -rw-r--r-- | crates/syntax/src/ast/generated/nodes.rs | 4 | ||||
| -rw-r--r-- | crates/syntax/src/ast/node_ext.rs | 38 | ||||
| -rw-r--r-- | crates/syntax/src/tests/sourcegen_ast.rs | 2 |
3 files changed, 40 insertions, 4 deletions
diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs index cf90ba64cff..63309a15521 100644 --- a/crates/syntax/src/ast/generated/nodes.rs +++ b/crates/syntax/src/ast/generated/nodes.rs @@ -880,7 +880,6 @@ impl ForExpr { 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 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)] @@ -890,7 +889,6 @@ pub struct IfExpr { impl ast::HasAttrs for IfExpr {} impl IfExpr { 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]) } } @@ -1051,7 +1049,6 @@ pub struct WhileExpr { impl ast::HasAttrs for WhileExpr {} impl WhileExpr { 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)] @@ -1170,7 +1167,6 @@ pub struct MatchGuard { } impl MatchGuard { 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)] diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index b143df1f83f..bb92c51e9a9 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -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 { fn loop_body(&self) -> Option<ast::BlockExpr> { 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 { fn loop_body(&self) -> Option<ast::BlockExpr> { 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) + } +} diff --git a/crates/syntax/src/tests/sourcegen_ast.rs b/crates/syntax/src/tests/sourcegen_ast.rs index 4cfb8075cb1..6d276622510 100644 --- a/crates/syntax/src/tests/sourcegen_ast.rs +++ b/crates/syntax/src/tests/sourcegen_ast.rs @@ -682,6 +682,8 @@ fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, label: Option<&String>, r | "value" | "trait" | "self_ty" + | "iterable" + | "condition" ); if manually_implemented { return; |
