]> git.lizzy.rs Git - rust.git/commitdiff
Review fixes.
authorYukio Siraichi <yukio.siraichi@gmail.com>
Sat, 17 Mar 2018 18:41:46 +0000 (15:41 -0300)
committerYukio Siraichi <yukio.siraichi@gmail.com>
Sun, 18 Mar 2018 23:46:28 +0000 (20:46 -0300)
- `span_suggestion` changed to `span_suggestion_short`;
- `Span` used changed to contain only `&` refs;
- Tests passing.

src/librustc/traits/error_reporting.rs
src/libsyntax/codemap.rs
src/test/ui/suggest-remove-refs-1.stderr
src/test/ui/suggest-remove-refs-2.stderr
src/test/ui/suggest-remove-refs-3.stderr

index 267d84cc531415ed1553f7e8706a91d33c51130f..9b01f8899b52b3d44de2c000a0936434e0f7b3ce 100644 (file)
@@ -914,13 +914,14 @@ fn suggest_remove_reference(&self,
                                                          new_trait_ref.to_predicate());
 
                     if selcx.evaluate_obligation(&new_obligation) {
-                        let remove_refs = refs_remaining + 1;
+                        let sp = self.tcx.sess.codemap()
+                            .span_take_while(span, |c| c.is_whitespace() || *c == '&');
 
-                        err.span_suggestion_short(span,
-                                                  &format!("consider removing {} leading `&`-references",
-                                                           remove_refs),
-                                                  String::from(""));
+                        let remove_refs = refs_remaining + 1;
+                        let format_str = format!("consider removing {} leading `&`-references",
+                                                 remove_refs);
 
+                        err.span_suggestion_short(sp, &format_str, String::from(""));
                         break;
                     }
                 } else {
index a1aec0520885922fe5e2539be3c9f033b95d4ce4..324d57c1194520be54a413c3757427e7545bfbad 100644 (file)
@@ -697,6 +697,22 @@ pub fn span_through_char(&self, sp: Span, c: char) -> Span {
         sp
     }
 
+    /// Given a `Span`, get a shorter one until `predicate` yields false.
+    pub fn span_take_while<P>(&self, sp: Span, predicate: P) -> Span
+        where P: for <'r> FnMut(&'r char) -> bool
+    {
+        if let Ok(snippet) = self.span_to_snippet(sp) {
+            let offset = snippet.chars()
+                .take_while(predicate)
+                .map(|c| c.len_utf8())
+                .sum::<usize>();
+
+            sp.with_hi(BytePos(sp.lo().0 + (offset as u32)))
+        } else {
+            sp
+        }
+    }
+
     pub fn def_span(&self, sp: Span) -> Span {
         self.span_until_char(sp, '{')
     }
index fe4ab2c4ee052c2a6f25be345d5ba97c3b424d69..c47b4d283d7cda5195b9edc6087ca8931276e4cc 100644 (file)
@@ -2,10 +2,10 @@ error[E0277]: the trait bound `&std::iter::Enumerate<std::slice::Iter<'_, {integ
   --> $DIR/suggest-remove-refs-1.rs:14:19
    |
 LL |     for (i, n) in &v.iter().enumerate() {
-   |                   ^^^^^^^^^^^^^^^^^^^^^
+   |                   -^^^^^^^^^^^^^^^^^^^^
    |                   |
    |                   `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
-   |                   help: consider removing 1 references `&`: `v.iter().enumerate()`
+   |                   help: consider removing 1 leading `&`-references
    |
    = help: the trait `std::iter::Iterator` is not implemented for `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
    = note: required by `std::iter::IntoIterator::into_iter`
index 243ddcfe125e22403de4662f6bebaf0951606736..fdd654ea3923f9019a2ecc204be1e0f610ab0d64 100644 (file)
@@ -2,10 +2,10 @@ error[E0277]: the trait bound `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {i
   --> $DIR/suggest-remove-refs-2.rs:14:19
    |
 LL |     for (i, n) in & & & & &v.iter().enumerate() {
-   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |                   ---------^^^^^^^^^^^^^^^^^^^^
    |                   |
    |                   `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
-   |                   help: consider removing 5 references `&`: `v.iter().enumerate()`
+   |                   help: consider removing 5 leading `&`-references
    |
    = help: the trait `std::iter::Iterator` is not implemented for `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
    = note: required by `std::iter::IntoIterator::into_iter`
index 83f3826642b2b55723b4c59efd310c48d59b945a..b0920a0fa523ee2b1850db901d036b29689c8955 100644 (file)
@@ -1,21 +1,18 @@
 error[E0277]: the trait bound `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>: std::iter::Iterator` is not satisfied
   --> $DIR/suggest-remove-refs-3.rs:14:19
    |
-LL |       for (i, n) in & & &
-   |  ___________________^
-LL | |         & &v
-LL | |         .iter()
-LL | |         .enumerate() {
-   | |____________________^ `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
+LL |        for (i, n) in & & &
+   |   ___________________^
+   |  |___________________|
+   | ||
+LL | ||         & &v
+   | ||___________- help: consider removing 5 leading `&`-references
+LL | |          .iter()
+LL | |          .enumerate() {
+   | |_____________________^ `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
    |
    = help: the trait `std::iter::Iterator` is not implemented for `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
    = note: required by `std::iter::IntoIterator::into_iter`
-help: consider removing 5 references `&`
-   |
-LL |     for (i, n) in v
-LL |         .iter()
-LL |         .enumerate() {
-   |
 
 error: aborting due to previous error