Skip to content

Commit 74a4928

Browse files
committed
Review fixes.
- `span_suggestion` changed to `span_suggestion_short`; - `Span` used changed to contain only `&` refs; - Tests passing.
1 parent c1ba5ac commit 74a4928

File tree

5 files changed

+35
-21
lines changed

5 files changed

+35
-21
lines changed

src/librustc/traits/error_reporting.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -914,13 +914,14 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
914914
new_trait_ref.to_predicate());
915915

916916
if selcx.evaluate_obligation(&new_obligation) {
917-
let remove_refs = refs_remaining + 1;
917+
let sp = self.tcx.sess.codemap()
918+
.span_take_while(span, |c| c.is_whitespace() || *c == '&');
918919

919-
err.span_suggestion_short(span,
920-
&format!("consider removing {} leading `&`-references",
921-
remove_refs),
922-
String::from(""));
920+
let remove_refs = refs_remaining + 1;
921+
let format_str = format!("consider removing {} leading `&`-references",
922+
remove_refs);
923923

924+
err.span_suggestion_short(sp, &format_str, String::from(""));
924925
break;
925926
}
926927
} else {

src/libsyntax/codemap.rs

+16
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,22 @@ impl CodeMap {
697697
sp
698698
}
699699

700+
/// Given a `Span`, get a shorter one until `predicate` yields false.
701+
pub fn span_take_while<P>(&self, sp: Span, predicate: P) -> Span
702+
where P: for <'r> FnMut(&'r char) -> bool
703+
{
704+
if let Ok(snippet) = self.span_to_snippet(sp) {
705+
let offset = snippet.chars()
706+
.take_while(predicate)
707+
.map(|c| c.len_utf8())
708+
.sum::<usize>();
709+
710+
sp.with_hi(BytePos(sp.lo().0 + (offset as u32)))
711+
} else {
712+
sp
713+
}
714+
}
715+
700716
pub fn def_span(&self, sp: Span) -> Span {
701717
self.span_until_char(sp, '{')
702718
}

src/test/ui/suggest-remove-refs-1.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ error[E0277]: the trait bound `&std::iter::Enumerate<std::slice::Iter<'_, {integ
22
--> $DIR/suggest-remove-refs-1.rs:14:19
33
|
44
LL | for (i, n) in &v.iter().enumerate() {
5-
| ^^^^^^^^^^^^^^^^^^^^^
5+
| -^^^^^^^^^^^^^^^^^^^^
66
| |
77
| `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
8-
| help: consider removing 1 references `&`: `v.iter().enumerate()`
8+
| help: consider removing 1 leading `&`-references
99
|
1010
= help: the trait `std::iter::Iterator` is not implemented for `&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
1111
= note: required by `std::iter::IntoIterator::into_iter`

src/test/ui/suggest-remove-refs-2.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ error[E0277]: the trait bound `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {i
22
--> $DIR/suggest-remove-refs-2.rs:14:19
33
|
44
LL | for (i, n) in & & & & &v.iter().enumerate() {
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5+
| ---------^^^^^^^^^^^^^^^^^^^^
66
| |
77
| `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
8-
| help: consider removing 5 references `&`: `v.iter().enumerate()`
8+
| help: consider removing 5 leading `&`-references
99
|
1010
= help: the trait `std::iter::Iterator` is not implemented for `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
1111
= note: required by `std::iter::IntoIterator::into_iter`

src/test/ui/suggest-remove-refs-3.stderr

+9-12
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
error[E0277]: the trait bound `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>: std::iter::Iterator` is not satisfied
22
--> $DIR/suggest-remove-refs-3.rs:14:19
33
|
4-
LL | for (i, n) in & & &
5-
| ___________________^
6-
LL | | & &v
7-
LL | | .iter()
8-
LL | | .enumerate() {
9-
| |____________________^ `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
4+
LL | for (i, n) in & & &
5+
| ___________________^
6+
| |___________________|
7+
| ||
8+
LL | || & &v
9+
| ||___________- help: consider removing 5 leading `&`-references
10+
LL | | .iter()
11+
LL | | .enumerate() {
12+
| |_____________________^ `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>` is not an iterator; maybe try calling `.iter()` or a similar method
1013
|
1114
= help: the trait `std::iter::Iterator` is not implemented for `&&&&&std::iter::Enumerate<std::slice::Iter<'_, {integer}>>`
1215
= note: required by `std::iter::IntoIterator::into_iter`
13-
help: consider removing 5 references `&`
14-
|
15-
LL | for (i, n) in v
16-
LL | .iter()
17-
LL | .enumerate() {
18-
|
1916

2017
error: aborting due to previous error
2118

0 commit comments

Comments
 (0)