Skip to content

Commit 1d3558b

Browse files
committed
Auto merge of rust-lang#16684 - Veykril:synthetic-fmt-args, r=Veykril
fix: Don't panic on synthetic syntax in inference diagnostics Temporary fix for rust-lang/rust-analyzer#16682 We ought to rethink how we attach diagnostics to things, as IDs don't work for `format_args` like that!
2 parents 9650578 + 3856648 commit 1d3558b

File tree

2 files changed

+33
-17
lines changed

2 files changed

+33
-17
lines changed

crates/hir/src/diagnostics.rs

+20-17
Original file line numberDiff line numberDiff line change
@@ -518,8 +518,12 @@ impl AnyDiagnostic {
518518
d: &InferenceDiagnostic,
519519
source_map: &hir_def::body::BodySourceMap,
520520
) -> Option<AnyDiagnostic> {
521-
let expr_syntax = |expr| source_map.expr_syntax(expr).expect("unexpected synthetic");
522-
let pat_syntax = |pat| source_map.pat_syntax(pat).expect("unexpected synthetic");
521+
let expr_syntax = |expr| {
522+
source_map.expr_syntax(expr).inspect_err(|_| tracing::error!("synthetic syntax")).ok()
523+
};
524+
let pat_syntax = |pat| {
525+
source_map.pat_syntax(pat).inspect_err(|_| tracing::error!("synthetic syntax")).ok()
526+
};
523527
Some(match d {
524528
&InferenceDiagnostic::NoSuchField { field: expr, private } => {
525529
let expr_or_pat = match expr {
@@ -533,23 +537,23 @@ impl AnyDiagnostic {
533537
NoSuchField { field: expr_or_pat, private }.into()
534538
}
535539
&InferenceDiagnostic::MismatchedArgCount { call_expr, expected, found } => {
536-
MismatchedArgCount { call_expr: expr_syntax(call_expr), expected, found }.into()
540+
MismatchedArgCount { call_expr: expr_syntax(call_expr)?, expected, found }.into()
537541
}
538542
&InferenceDiagnostic::PrivateField { expr, field } => {
539-
let expr = expr_syntax(expr);
543+
let expr = expr_syntax(expr)?;
540544
let field = field.into();
541545
PrivateField { expr, field }.into()
542546
}
543547
&InferenceDiagnostic::PrivateAssocItem { id, item } => {
544548
let expr_or_pat = match id {
545-
ExprOrPatId::ExprId(expr) => expr_syntax(expr).map(AstPtr::wrap_left),
546-
ExprOrPatId::PatId(pat) => pat_syntax(pat).map(AstPtr::wrap_right),
549+
ExprOrPatId::ExprId(expr) => expr_syntax(expr)?.map(AstPtr::wrap_left),
550+
ExprOrPatId::PatId(pat) => pat_syntax(pat)?.map(AstPtr::wrap_right),
547551
};
548552
let item = item.into();
549553
PrivateAssocItem { expr_or_pat, item }.into()
550554
}
551555
InferenceDiagnostic::ExpectedFunction { call_expr, found } => {
552-
let call_expr = expr_syntax(*call_expr);
556+
let call_expr = expr_syntax(*call_expr)?;
553557
ExpectedFunction { call: call_expr, found: Type::new(db, def, found.clone()) }
554558
.into()
555559
}
@@ -559,7 +563,7 @@ impl AnyDiagnostic {
559563
name,
560564
method_with_same_name_exists,
561565
} => {
562-
let expr = expr_syntax(*expr);
566+
let expr = expr_syntax(*expr)?;
563567
UnresolvedField {
564568
expr,
565569
name: name.clone(),
@@ -575,7 +579,7 @@ impl AnyDiagnostic {
575579
field_with_same_name,
576580
assoc_func_with_same_name,
577581
} => {
578-
let expr = expr_syntax(*expr);
582+
let expr = expr_syntax(*expr)?;
579583
UnresolvedMethodCall {
580584
expr,
581585
name: name.clone(),
@@ -589,29 +593,28 @@ impl AnyDiagnostic {
589593
}
590594
&InferenceDiagnostic::UnresolvedAssocItem { id } => {
591595
let expr_or_pat = match id {
592-
ExprOrPatId::ExprId(expr) => expr_syntax(expr).map(AstPtr::wrap_left),
593-
ExprOrPatId::PatId(pat) => pat_syntax(pat).map(AstPtr::wrap_right),
596+
ExprOrPatId::ExprId(expr) => expr_syntax(expr)?.map(AstPtr::wrap_left),
597+
ExprOrPatId::PatId(pat) => pat_syntax(pat)?.map(AstPtr::wrap_right),
594598
};
595599
UnresolvedAssocItem { expr_or_pat }.into()
596600
}
597601
&InferenceDiagnostic::UnresolvedIdent { expr } => {
598-
let expr = expr_syntax(expr);
602+
let expr = expr_syntax(expr)?;
599603
UnresolvedIdent { expr }.into()
600604
}
601605
&InferenceDiagnostic::BreakOutsideOfLoop { expr, is_break, bad_value_break } => {
602-
let expr = expr_syntax(expr);
606+
let expr = expr_syntax(expr)?;
603607
BreakOutsideOfLoop { expr, is_break, bad_value_break }.into()
604608
}
605609
InferenceDiagnostic::TypedHole { expr, expected } => {
606-
let expr = expr_syntax(*expr);
610+
let expr = expr_syntax(*expr)?;
607611
TypedHole { expr, expected: Type::new(db, def, expected.clone()) }.into()
608612
}
609613
&InferenceDiagnostic::MismatchedTupleStructPatArgCount { pat, expected, found } => {
610614
let expr_or_pat = match pat {
611-
ExprOrPatId::ExprId(expr) => expr_syntax(expr).map(AstPtr::wrap_left),
615+
ExprOrPatId::ExprId(expr) => expr_syntax(expr)?.map(AstPtr::wrap_left),
612616
ExprOrPatId::PatId(pat) => {
613-
let InFile { file_id, value } =
614-
source_map.pat_syntax(pat).expect("unexpected synthetic");
617+
let InFile { file_id, value } = pat_syntax(pat)?;
615618

616619
// cast from Either<Pat, SelfParam> -> Either<_, Pat>
617620
let ptr = AstPtr::try_from_raw(value.syntax_node_ptr())?;

crates/ide-diagnostics/src/handlers/unresolved_ident.rs

+13
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ pub(crate) fn unresolved_ident(
2020
mod tests {
2121
use crate::tests::check_diagnostics;
2222

23+
// FIXME: This should show a diagnostic
24+
#[test]
25+
fn feature() {
26+
check_diagnostics(
27+
r#"
28+
//- minicore: fmt
29+
fn main() {
30+
format_args!("{unresolved}");
31+
}
32+
"#,
33+
)
34+
}
35+
2336
#[test]
2437
fn missing() {
2538
check_diagnostics(

0 commit comments

Comments
 (0)