11565: fix: Fix body selection in while loops r=Veykril a=lnicola

CC #11561

Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
This commit is contained in:
bors[bot] 2022-02-26 16:49:16 +00:00 committed by GitHub
commit 5cade9bf33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 3 deletions

View File

@ -1245,3 +1245,25 @@ fn test() {
"#]],
);
}
#[test]
fn while_loop_block_expr_iterable() {
check_infer(
r#"
fn test() {
while { true } {
let y = 0;
}
}
"#,
expect![[r#"
10..59 '{ ... } }': ()
16..57 'while ... }': ()
22..30 '{ true }': bool
24..28 'true': bool
31..57 '{ ... }': ()
45..46 'y': i32
49..50 '0': i32
"#]],
);
}

View File

@ -1035,7 +1035,6 @@ pub struct WhileExpr {
pub(crate) syntax: SyntaxNode,
}
impl ast::HasAttrs for WhileExpr {}
impl ast::HasLoopBody 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) }

View File

@ -769,6 +769,15 @@ impl ast::HasLoopBody for ast::ForExpr {
}
}
impl ast::HasLoopBody for ast::WhileExpr {
fn loop_body(&self) -> Option<ast::BlockExpr> {
let mut exprs = support::children(self.syntax());
let first = exprs.next();
let second = exprs.next();
second.or(first)
}
}
impl ast::HasAttrs for ast::AnyHasDocComments {}
impl From<ast::Adt> for ast::Item {

View File

@ -85,8 +85,9 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> String {
.traits
.iter()
.filter(|trait_name| {
// For loops have two expressions so this might collide, therefor manual impl it
node.name != "ForExpr" || trait_name.as_str() != "HasLoopBody"
// Loops have two expressions so this might collide, therefor manual impl it
node.name != "ForExpr" && node.name != "WhileExpr"
|| trait_name.as_str() != "HasLoopBody"
})
.map(|trait_name| {
let trait_name = format_ident!("{}", trait_name);