From 3b686d5c251be3354d53c08c5a0c1f46894627a6 Mon Sep 17 00:00:00 2001 From: Andy Russell Date: Thu, 4 Apr 2019 00:43:58 -0400 Subject: [PATCH] tweak unresolved label suggestion Only suggest label names in the same hygiene context, and use a structured suggestion. --- src/librustc_resolve/lib.rs | 15 +++++++++++++-- src/test/ui/hygiene/hygienic-label-1.stderr | 2 +- src/test/ui/hygiene/hygienic-label-2.stderr | 2 +- src/test/ui/hygiene/hygienic-label-3.stderr | 2 +- src/test/ui/hygiene/hygienic-label-4.stderr | 2 +- src/test/ui/suggestions/suggest-labels.stderr | 18 +++++++++++++++--- 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 1934f800af7..0c37296d241 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -357,7 +357,12 @@ fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver<'_>, "use of undeclared label `{}`", name); if let Some(lev_candidate) = lev_candidate { - err.span_label(span, format!("did you mean `{}`?", lev_candidate)); + err.span_suggestion( + span, + "a label with a similar name exists in this scope", + lev_candidate.to_string(), + Applicability::MaybeIncorrect, + ); } else { err.span_label(span, format!("undeclared label `{}`", name)); } @@ -4218,7 +4223,13 @@ fn resolve_expr(&mut self, expr: &Expr, parent: Option<&Expr>) { // Picks the first label that is "close enough", which is not necessarily // the closest match let close_match = self.search_label(label.ident, |rib, ident| { - let names = rib.bindings.iter().map(|(id, _)| &id.name); + let names = rib.bindings.iter().filter_map(|(id, _)| { + if id.span.ctxt() == label.ident.span.ctxt() { + Some(&id.name) + } else { + None + } + }); find_best_match_for_name(names, &*ident.as_str(), None) }); self.record_def(expr.id, err_path_resolution()); diff --git a/src/test/ui/hygiene/hygienic-label-1.stderr b/src/test/ui/hygiene/hygienic-label-1.stderr index 80cd1547b45..d61c0687c16 100644 --- a/src/test/ui/hygiene/hygienic-label-1.stderr +++ b/src/test/ui/hygiene/hygienic-label-1.stderr @@ -2,7 +2,7 @@ error[E0426]: use of undeclared label `'x` --> $DIR/hygienic-label-1.rs:2:19 | LL | () => { break 'x; } - | ^^ did you mean `'x`? + | ^^ undeclared label `'x` ... LL | 'x: loop { foo!() } | ------ in this macro invocation diff --git a/src/test/ui/hygiene/hygienic-label-2.stderr b/src/test/ui/hygiene/hygienic-label-2.stderr index c20cbd9f687..f23e741debe 100644 --- a/src/test/ui/hygiene/hygienic-label-2.stderr +++ b/src/test/ui/hygiene/hygienic-label-2.stderr @@ -2,7 +2,7 @@ error[E0426]: use of undeclared label `'x` --> $DIR/hygienic-label-2.rs:6:16 | LL | foo!(break 'x); - | ^^ did you mean `'x`? + | ^^ undeclared label `'x` error: aborting due to previous error diff --git a/src/test/ui/hygiene/hygienic-label-3.stderr b/src/test/ui/hygiene/hygienic-label-3.stderr index b5839fe5c3d..0c4173a61aa 100644 --- a/src/test/ui/hygiene/hygienic-label-3.stderr +++ b/src/test/ui/hygiene/hygienic-label-3.stderr @@ -2,7 +2,7 @@ error[E0426]: use of undeclared label `'x` --> $DIR/hygienic-label-3.rs:2:19 | LL | () => { break 'x; } - | ^^ did you mean `'x`? + | ^^ undeclared label `'x` ... LL | foo!() | ------ in this macro invocation diff --git a/src/test/ui/hygiene/hygienic-label-4.stderr b/src/test/ui/hygiene/hygienic-label-4.stderr index 1dd74895746..1c93da02f61 100644 --- a/src/test/ui/hygiene/hygienic-label-4.stderr +++ b/src/test/ui/hygiene/hygienic-label-4.stderr @@ -2,7 +2,7 @@ error[E0426]: use of undeclared label `'x` --> $DIR/hygienic-label-4.rs:6:16 | LL | foo!(break 'x); - | ^^ did you mean `'x`? + | ^^ undeclared label `'x` error: aborting due to previous error diff --git a/src/test/ui/suggestions/suggest-labels.stderr b/src/test/ui/suggestions/suggest-labels.stderr index ead8f94209b..02d46a3f596 100644 --- a/src/test/ui/suggestions/suggest-labels.stderr +++ b/src/test/ui/suggestions/suggest-labels.stderr @@ -2,19 +2,31 @@ error[E0426]: use of undeclared label `'fo` --> $DIR/suggest-labels.rs:4:15 | LL | break 'fo; - | ^^^ did you mean `'foo`? + | ^^^ +help: a label with a similar name exists in this scope + | +LL | break 'foo; + | ^^^^ error[E0426]: use of undeclared label `'bor` --> $DIR/suggest-labels.rs:8:18 | LL | continue 'bor; - | ^^^^ did you mean `'bar`? + | ^^^^ +help: a label with a similar name exists in this scope + | +LL | continue 'bar; + | ^^^^ error[E0426]: use of undeclared label `'longlable` --> $DIR/suggest-labels.rs:13:19 | LL | break 'longlable; - | ^^^^^^^^^^ did you mean `'longlabel1`? + | ^^^^^^^^^^ +help: a label with a similar name exists in this scope + | +LL | break 'longlabel1; + | ^^^^^^^^^^^ error: aborting due to 3 previous errors -- 2.44.0