diff options
| author | Nicholas Nethercote <n.nethercote@gmail.com> | 2025-04-25 19:12:15 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <n.nethercote@gmail.com> | 2025-04-26 06:35:44 +1000 |
| commit | 7ac2d1f1bdb2348b13eb4f5fb9c7d620e316034f (patch) | |
| tree | 310683cb906ab06430be2656138ac6e3cfd4a22f /compiler/rustc_hir_pretty | |
| parent | e37c3674828a75ffdc2b94d9d273e9c02a9ee11f (diff) | |
| download | rust-7ac2d1f1bdb2348b13eb4f5fb9c7d620e316034f.tar.gz rust-7ac2d1f1bdb2348b13eb4f5fb9c7d620e316034f.zip | |
Improve HIR pretty-printing of if/else some more.
In the AST the "then" block is represented as a `Block`. In HIR the "then" block is represented as an `Expr` that happens to always be. `ExprKind::Block`. By deconstructing the `ExprKind::Block` to extract the block within, things print properly. For `issue-82392.rs`, note that we no longer print a type after the "then" block. This is good, it now matches how we don't print a type for the "else" block. (Well, we do print a type after the "else" block, but it's for the whole if/else.) Also tighten up some of the pattern matching -- these block expressions within if/else will never have labels.
Diffstat (limited to 'compiler/rustc_hir_pretty')
| -rw-r--r-- | compiler/rustc_hir_pretty/src/lib.rs | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/compiler/rustc_hir_pretty/src/lib.rs b/compiler/rustc_hir_pretty/src/lib.rs index 3e4d4f82322..4608531f1d9 100644 --- a/compiler/rustc_hir_pretty/src/lib.rs +++ b/compiler/rustc_hir_pretty/src/lib.rs @@ -1064,17 +1064,17 @@ impl<'a> State<'a> { if let Some(els_inner) = els { match els_inner.kind { // Another `else if` block. - hir::ExprKind::If(i, then, e) => { + hir::ExprKind::If(i, hir::Expr { kind: hir::ExprKind::Block(t, None), .. }, e) => { self.cbox(0); self.ibox(0); self.word(" else if "); self.print_expr_as_cond(i); self.space(); - self.print_expr(then); + self.print_block(t); self.print_else(e); } // Final `else` block. - hir::ExprKind::Block(b, _) => { + hir::ExprKind::Block(b, None) => { self.cbox(0); self.ibox(0); self.word(" else "); @@ -1099,8 +1099,13 @@ impl<'a> State<'a> { self.word_nbsp("if"); self.print_expr_as_cond(test); self.space(); - self.print_expr(blk); - self.print_else(elseopt) + match blk.kind { + hir::ExprKind::Block(blk, None) => { + self.print_block(blk); + self.print_else(elseopt) + } + _ => panic!("non-block then expr"), + } } fn print_anon_const(&mut self, constant: &hir::AnonConst) { |
