diff options
| author | bors <bors@rust-lang.org> | 2023-02-06 11:39:47 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-02-06 11:39:47 +0000 |
| commit | e9d0bfc799630309bc1370037ae91deaacee53e0 (patch) | |
| tree | d66b8ce2ff7044b772b30ab5032bb80270eaab67 | |
| parent | 0b32b65ca6aee21f352d178eeb0b85e092a93177 (diff) | |
| parent | c6305c56592b49ae817e550e3cd42ef704e2307d (diff) | |
| download | rust-e9d0bfc799630309bc1370037ae91deaacee53e0.tar.gz rust-e9d0bfc799630309bc1370037ae91deaacee53e0.zip | |
Auto merge of #14092 - Veykril:inlay-hint-panic, r=Veykril
fix: Don't panic on broken syntax trees in adjustment inlay hints These should be unreachable, but apparently with broken enough syntax trees (I assume mismatched parens), we do reach these unreachable calls. Haven't quite figured out when this happens though.
| -rw-r--r-- | crates/ide/src/inlay_hints/adjustment.rs | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/crates/ide/src/inlay_hints/adjustment.rs b/crates/ide/src/inlay_hints/adjustment.rs index 45e85a338a4..188eb7f977b 100644 --- a/crates/ide/src/inlay_hints/adjustment.rs +++ b/crates/ide/src/inlay_hints/adjustment.rs @@ -6,6 +6,7 @@ use hir::{Adjust, Adjustment, AutoBorrow, HirDisplay, Mutability, PointerCast, Safety, Semantics}; use ide_db::RootDatabase; +use stdx::never; use syntax::{ ast::{self, make, AstNode}, ted, @@ -210,16 +211,21 @@ fn needs_parens_for_adjustment_hints(expr: &ast::Expr, postfix: bool) -> (bool, ted::replace(expr.syntax(), dummy_expr.syntax()); let parent = dummy_expr.syntax().parent(); - let expr = if postfix { - let ast::Expr::TryExpr(e) = &dummy_expr else { unreachable!() }; - let Some(ast::Expr::ParenExpr(e)) = e.expr() else { unreachable!() }; + let Some(expr) = (|| { + if postfix { + let ast::Expr::TryExpr(e) = &dummy_expr else { return None }; + let Some(ast::Expr::ParenExpr(e)) = e.expr() else { return None }; - e.expr().unwrap() - } else { - let ast::Expr::RefExpr(e) = &dummy_expr else { unreachable!() }; - let Some(ast::Expr::ParenExpr(e)) = e.expr() else { unreachable!() }; + e.expr() + } else { + let ast::Expr::RefExpr(e) = &dummy_expr else { return None }; + let Some(ast::Expr::ParenExpr(e)) = e.expr() else { return None }; - e.expr().unwrap() + e.expr() + } + })() else { + never!("broken syntax tree?\n{:?}\n{:?}", expr, dummy_expr); + return (true, true) }; // At this point |
