]> git.lizzy.rs Git - rust.git/commitdiff
Suggest correct order for args and constraints
authorEsteban Küber <esteban@kuber.com.ar>
Sun, 29 Mar 2020 00:45:36 +0000 (17:45 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Sun, 29 Mar 2020 00:45:36 +0000 (17:45 -0700)
src/librustc_ast_passes/ast_validation.rs
src/test/ui/parser/issue-32214.stderr
src/test/ui/suggestions/suggest-move-types.stderr

index 680a58d8b7786149a0ec90a1ccce9d0880b12166..4c7edfc83fa333b319a09910dadbfc191d0d0c9a 100644 (file)
@@ -663,6 +663,20 @@ fn check_generic_args_before_constraints(&self, data: &AngleBracketedArgs) {
                 _ => None,
             })
             .collect::<Vec<_>>();
+        let snippet_span = match &constraint_spans[..] {
+            [single] => *single,
+            [first, .., last] => first.to(*last),
+            [] => unreachable!(),
+        };
+        let removal_span = match &arg_spans[..] {
+            [first, ..] => snippet_span.until(*first),
+            [] => unreachable!(),
+        };
+        let sugg_span = match &arg_spans[..] {
+            [.., last] => last.shrink_to_hi(),
+            [] => unreachable!(),
+        };
+        let snippet = self.session.source_map().span_to_snippet(snippet_span).unwrap();
         let constraint_len = constraint_spans.len();
         // ...and then error:
         self.err_handler()
@@ -679,6 +693,15 @@ fn check_generic_args_before_constraints(&self, data: &AngleBracketedArgs) {
                 ),
             )
             .span_labels(arg_spans, "generic argument")
+            .multipart_suggestion(
+                "move the constraints after the generic arguments",
+                vec![
+                    (removal_span, String::new()),
+                    (sugg_span.shrink_to_lo(), ", ".to_string()),
+                    (sugg_span, snippet),
+                ],
+                Applicability::MachineApplicable,
+            )
             .emit();
     }
 }
index 6bb1425ee133f14faaca403b2dcbc9e5d3f04225..959a1ab121b2902ba2a0a81685ddaef64ff6b001 100644 (file)
@@ -5,6 +5,11 @@ LL | pub fn test<W, I: Trait<Item=(), W> >() {}
    |                         -------  ^ generic argument
    |                         |
    |                         the constraint is provided here
+   |
+help: move the constraints after the generic arguments
+   |
+LL | pub fn test<W, I: Trait<W, Item=()> >() {}
+   |                        --^^^^^^^
 
 error: aborting due to previous error
 
index b4cf0deacee4660ec80c4d926f434f4a37d3b416..3d2b35fcf454d30e1e2781ab39fbcf77d7f090c6 100644 (file)
@@ -5,6 +5,11 @@ LL | struct A<T, M: One<A=(), T>> {
    |                    ----  ^ generic argument
    |                    |
    |                    the constraint is provided here
+   |
+help: move the constraints after the generic arguments
+   |
+LL | struct A<T, M: One<T, A=()>> {
+   |                   --^^^^
 
 error: generic arguments must come before the first constraint
   --> $DIR/suggest-move-types.rs:33:43
@@ -14,6 +19,11 @@ LL | struct Al<'a, T, M: OneWithLifetime<A=(), T, 'a>> {
    |                                     |     |
    |                                     |     generic argument
    |                                     the constraint is provided here
+   |
+help: move the constraints after the generic arguments
+   |
+LL | struct Al<'a, T, M: OneWithLifetime<T, 'a, A=()>> {
+   |                                    --    ^^^^
 
 error: generic arguments must come before the first constraint
   --> $DIR/suggest-move-types.rs:40:46
@@ -26,6 +36,11 @@ LL | struct B<T, U, V, M: Three<A=(), B=(), C=(), T, U, V>> {
    |                            |     |     the constraints are provided here
    |                            |     the constraints are provided here
    |                            the constraints are provided here
+   |
+help: move the constraints after the generic arguments
+   |
+LL | struct B<T, U, V, M: Three<T, U, V, A=(), B=(), C=()>> {
+   |                           --      ^^^^^^^^^^^^^^^^
 
 error: generic arguments must come before the first constraint
   --> $DIR/suggest-move-types.rs:48:71
@@ -41,6 +56,11 @@ LL | struct Bl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<A=(), B=(), C=(), T, U,
    |                                                     |     |     the constraints are provided here
    |                                                     |     the constraints are provided here
    |                                                     the constraints are provided here
+   |
+help: move the constraints after the generic arguments
+   |
+LL | struct Bl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<T, U, V, 'a, 'b, 'c, A=(), B=(), C=()>> {
+   |                                                    --                  ^^^^^^^^^^^^^^^^
 
 error: generic arguments must come before the first constraint
   --> $DIR/suggest-move-types.rs:57:28
@@ -53,6 +73,11 @@ LL | struct C<T, U, V, M: Three<T, A=(), B=(), C=(), U, V>> {
    |                            |  |     the constraints are provided here
    |                            |  the constraints are provided here
    |                            generic argument
+   |
+help: move the constraints after the generic arguments
+   |
+LL | struct C<T, U, V, M: Three<A=(), B=(), C=(), U, V, A=(), B=(), C=()>> {
+   |                           --                     ^^^^^^^^^^^^^^^^
 
 error: generic arguments must come before the first constraint
   --> $DIR/suggest-move-types.rs:65:53
@@ -68,6 +93,11 @@ LL | struct Cl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<T, 'a, A=(), B=(), C=()
    |                                                     |  |   the constraints are provided here
    |                                                     |  generic argument
    |                                                     generic argument
+   |
+help: move the constraints after the generic arguments
+   |
+LL | struct Cl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<A=(), B=(), C=(), U, 'b, V, 'c, A=(), B=(), C=()>> {
+   |                                                    --                             ^^^^^^^^^^^^^^^^
 
 error: generic arguments must come before the first constraint
   --> $DIR/suggest-move-types.rs:74:28
@@ -80,6 +110,11 @@ LL | struct D<T, U, V, M: Three<T, A=(), B=(), U, C=(), V>> {
    |                            |  |     the constraints are provided here
    |                            |  the constraints are provided here
    |                            generic argument
+   |
+help: move the constraints after the generic arguments
+   |
+LL | struct D<T, U, V, M: Three<A=(), B=(), U, C=(), V, A=(), B=(), U, C=()>> {
+   |                           --                     ^^^^^^^^^^^^^^^^^^^
 
 error: generic arguments must come before the first constraint
   --> $DIR/suggest-move-types.rs:82:53
@@ -95,6 +130,11 @@ LL | struct Dl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<T, 'a, A=(), B=(), U, '
    |                                                     |  |   the constraints are provided here
    |                                                     |  generic argument
    |                                                     generic argument
+   |
+help: move the constraints after the generic arguments
+   |
+LL | struct Dl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<A=(), B=(), U, 'b, C=(), V, 'c, A=(), B=(), U, 'b, C=()>> {
+   |                                                    --                             ^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0747]: type provided when a lifetime was expected
   --> $DIR/suggest-move-types.rs:33:43