about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-07-11 22:07:11 +0000
committerEsteban Küber <esteban@kuber.com.ar>2024-07-12 03:02:58 +0000
commit377d14be88200d122f699aa989e4d1256f2173d2 (patch)
tree9b28227ca0df88d3182f368050c6940529d9ff93
parentb5f94c61f72cc85151dbd9bb1081fde2ab78f806 (diff)
downloadrust-377d14be88200d122f699aa989e4d1256f2173d2.tar.gz
rust-377d14be88200d122f699aa989e4d1256f2173d2.zip
More accurate incorrect use of `await` suggestion
-rw-r--r--compiler/rustc_parse/messages.ftl6
-rw-r--r--compiler/rustc_parse/src/errors.rs23
-rw-r--r--compiler/rustc_parse/src/parser/diagnostics.rs18
-rw-r--r--tests/ui/async-await/await-keyword/incorrect-syntax-suggestions.stderr80
-rw-r--r--tests/ui/parser/issues/issue-113203.stderr5
5 files changed, 76 insertions, 56 deletions
diff --git a/compiler/rustc_parse/messages.ftl b/compiler/rustc_parse/messages.ftl
index fd96d95bc2e..c2201b1c41e 100644
--- a/compiler/rustc_parse/messages.ftl
+++ b/compiler/rustc_parse/messages.ftl
@@ -323,10 +323,10 @@ parse_incorrect_semicolon =
     .suggestion = remove this semicolon
     .help = {$name} declarations are not followed by a semicolon
 
-parse_incorrect_use_of_await =
-    incorrect use of `await`
+parse_incorrect_use_of_await = incorrect use of `await`
     .parentheses_suggestion = `await` is not a method call, remove the parentheses
-    .postfix_suggestion = `await` is a postfix operation
+
+parse_incorrect_use_of_await_postfix_suggestion = `await` is a postfix operation
 
 parse_incorrect_visibility_restriction = incorrect visibility restriction
     .help = some possible visibility restrictions are:
diff --git a/compiler/rustc_parse/src/errors.rs b/compiler/rustc_parse/src/errors.rs
index 18a3153bcd4..eee17a73acf 100644
--- a/compiler/rustc_parse/src/errors.rs
+++ b/compiler/rustc_parse/src/errors.rs
@@ -103,19 +103,26 @@ pub(crate) struct IncorrectUseOfAwait {
     pub span: Span,
 }
 
+#[derive(Subdiagnostic)]
+#[multipart_suggestion(
+    parse_incorrect_use_of_await_postfix_suggestion,
+    applicability = "machine-applicable"
+)]
+pub(crate) struct AwaitSuggestion {
+    #[suggestion_part(code = "")]
+    pub removal: Span,
+    #[suggestion_part(code = ".await{question_mark}")]
+    pub dot_await: Span,
+    pub question_mark: &'static str,
+}
+
 #[derive(Diagnostic)]
 #[diag(parse_incorrect_use_of_await)]
 pub(crate) struct IncorrectAwait {
     #[primary_span]
     pub span: Span,
-    #[suggestion(
-        parse_postfix_suggestion,
-        style = "verbose",
-        code = "{expr}.await{question_mark}"
-    )]
-    pub sugg_span: (Span, Applicability),
-    pub expr: String,
-    pub question_mark: &'static str,
+    #[subdiagnostic]
+    pub suggestion: AwaitSuggestion,
 }
 
 #[derive(Diagnostic)]
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs
index 63e4d8a4352..39f1d4e89ec 100644
--- a/compiler/rustc_parse/src/parser/diagnostics.rs
+++ b/compiler/rustc_parse/src/parser/diagnostics.rs
@@ -3,8 +3,8 @@ use super::{
     BlockMode, CommaRecoveryMode, Parser, PathStyle, Restrictions, SemiColonMode, SeqSep, TokenType,
 };
 use crate::errors::{
-    AddParen, AmbiguousPlus, AsyncMoveBlockIn2015, AttributeOnParamType, BadQPathStage2,
-    BadTypePlus, BadTypePlusSub, ColonAsSemi, ComparisonOperatorsCannotBeChained,
+    AddParen, AmbiguousPlus, AsyncMoveBlockIn2015, AttributeOnParamType, AwaitSuggestion,
+    BadQPathStage2, BadTypePlus, BadTypePlusSub, ColonAsSemi, ComparisonOperatorsCannotBeChained,
     ComparisonOperatorsCannotBeChainedSugg, ConstGenericWithoutBraces,
     ConstGenericWithoutBracesSugg, DocCommentDoesNotDocumentAnything, DocCommentOnParamType,
     DoubleColonInBound, ExpectedIdentifier, ExpectedSemi, ExpectedSemiSugg,
@@ -1959,18 +1959,14 @@ impl<'a> Parser<'a> {
         is_question: bool,
     ) -> (Span, ErrorGuaranteed) {
         let span = lo.to(hi);
-        let applicability = match expr.kind {
-            ExprKind::Try(_) => Applicability::MaybeIncorrect, // `await <expr>?`
-            _ => Applicability::MachineApplicable,
-        };
-
         let guar = self.dcx().emit_err(IncorrectAwait {
             span,
-            sugg_span: (span, applicability),
-            expr: self.span_to_snippet(expr.span).unwrap_or_else(|_| pprust::expr_to_string(expr)),
-            question_mark: if is_question { "?" } else { "" },
+            suggestion: AwaitSuggestion {
+                removal: lo.until(expr.span),
+                dot_await: expr.span.shrink_to_hi(),
+                question_mark: if is_question { "?" } else { "" },
+            },
         });
-
         (span, guar)
     }
 
diff --git a/tests/ui/async-await/await-keyword/incorrect-syntax-suggestions.stderr b/tests/ui/async-await/await-keyword/incorrect-syntax-suggestions.stderr
index ac1bc693fab..0ccde7d8709 100644
--- a/tests/ui/async-await/await-keyword/incorrect-syntax-suggestions.stderr
+++ b/tests/ui/async-await/await-keyword/incorrect-syntax-suggestions.stderr
@@ -6,8 +6,9 @@ LL |     let _ = await bar();
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = bar().await;
-   |             ~~~~~~~~~~~
+LL -     let _ = await bar();
+LL +     let _ = bar().await;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:12:13
@@ -17,8 +18,9 @@ LL |     let _ = await? bar();
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = bar().await?;
-   |             ~~~~~~~~~~~~
+LL -     let _ = await? bar();
+LL +     let _ = bar().await?;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:16:13
@@ -28,8 +30,9 @@ LL |     let _ = await bar()?;
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = bar()?.await;
-   |             ~~~~~~~~~~~~
+LL -     let _ = await bar()?;
+LL +     let _ = bar()?.await;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:20:13
@@ -39,8 +42,9 @@ LL |     let _ = await { bar() };
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = { bar() }.await;
-   |             ~~~~~~~~~~~~~~~
+LL -     let _ = await { bar() };
+LL +     let _ = { bar() }.await;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:24:13
@@ -50,8 +54,9 @@ LL |     let _ = await(bar());
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = (bar()).await;
-   |             ~~~~~~~~~~~~~
+LL -     let _ = await(bar());
+LL +     let _ = (bar()).await;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:28:13
@@ -61,8 +66,9 @@ LL |     let _ = await { bar() }?;
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = { bar() }.await?;
-   |             ~~~~~~~~~~~~~~~
+LL -     let _ = await { bar() }?;
+LL +     let _ = { bar() }.await?;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:32:14
@@ -72,8 +78,9 @@ LL |     let _ = (await bar())?;
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = (bar().await)?;
-   |              ~~~~~~~~~~~
+LL -     let _ = (await bar())?;
+LL +     let _ = (bar().await)?;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:36:24
@@ -107,8 +114,9 @@ LL |     let _ = await bar();
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = bar().await;
-   |             ~~~~~~~~~~~
+LL -     let _ = await bar();
+LL +     let _ = bar().await;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:56:13
@@ -118,8 +126,9 @@ LL |     let _ = await? bar();
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = bar().await?;
-   |             ~~~~~~~~~~~~
+LL -     let _ = await? bar();
+LL +     let _ = bar().await?;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:60:13
@@ -129,8 +138,9 @@ LL |     let _ = await bar()?;
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = bar()?.await;
-   |             ~~~~~~~~~~~~
+LL -     let _ = await bar()?;
+LL +     let _ = bar()?.await;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:64:14
@@ -140,8 +150,9 @@ LL |     let _ = (await bar())?;
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = (bar().await)?;
-   |              ~~~~~~~~~~~
+LL -     let _ = (await bar())?;
+LL +     let _ = (bar().await)?;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:68:24
@@ -175,8 +186,9 @@ LL |     let _ = await!(bar());
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = bar().await;
-   |             ~~~~~~~~~~~
+LL -     let _ = await!(bar());
+LL +     let _ = bar().await);
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:105:13
@@ -186,8 +198,9 @@ LL |     let _ = await!(bar())?;
    |
 help: `await` is a postfix operation
    |
-LL |     let _ = bar().await?;
-   |             ~~~~~~~~~~~
+LL -     let _ = await!(bar())?;
+LL +     let _ = bar().await)?;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:110:17
@@ -197,8 +210,9 @@ LL |         let _ = await!(bar())?;
    |
 help: `await` is a postfix operation
    |
-LL |         let _ = bar().await?;
-   |                 ~~~~~~~~~~~
+LL -         let _ = await!(bar())?;
+LL +         let _ = bar().await)?;
+   |
 
 error: incorrect use of `await`
   --> $DIR/incorrect-syntax-suggestions.rs:117:17
@@ -208,8 +222,9 @@ LL |         let _ = await!(bar())?;
    |
 help: `await` is a postfix operation
    |
-LL |         let _ = bar().await?;
-   |                 ~~~~~~~~~~~
+LL -         let _ = await!(bar())?;
+LL +         let _ = bar().await)?;
+   |
 
 error: expected expression, found `=>`
   --> $DIR/incorrect-syntax-suggestions.rs:124:25
@@ -227,8 +242,9 @@ LL |     match await { await => () }
    |
 help: `await` is a postfix operation
    |
-LL |     match { await => () }.await
-   |           ~~~~~~~~~~~~~~~~~~~~~
+LL -     match await { await => () }
+LL +     match { await => () }.await
+   |
 
 error: expected one of `.`, `?`, `{`, or an operator, found `}`
   --> $DIR/incorrect-syntax-suggestions.rs:127:1
diff --git a/tests/ui/parser/issues/issue-113203.stderr b/tests/ui/parser/issues/issue-113203.stderr
index f9c8ad91280..1ef20ddf726 100644
--- a/tests/ui/parser/issues/issue-113203.stderr
+++ b/tests/ui/parser/issues/issue-113203.stderr
@@ -6,8 +6,9 @@ LL |     await {}()
    |
 help: `await` is a postfix operation
    |
-LL |     {}.await()
-   |     ~~~~~~~~
+LL -     await {}()
+LL +     {}.await()
+   |
 
 error: aborting due to 1 previous error