about summary refs log tree commit diff
path: root/compiler/rustc_hir_pretty
diff options
context:
space:
mode:
authorNicholas Nethercote <n.nethercote@gmail.com>2025-04-25 19:12:15 +1000
committerNicholas Nethercote <n.nethercote@gmail.com>2025-04-26 06:35:44 +1000
commit7ac2d1f1bdb2348b13eb4f5fb9c7d620e316034f (patch)
tree310683cb906ab06430be2656138ac6e3cfd4a22f /compiler/rustc_hir_pretty
parente37c3674828a75ffdc2b94d9d273e9c02a9ee11f (diff)
downloadrust-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.rs15
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) {