Skip to content

Commit

Permalink
Auto merge of #47465 - estebank:include-space-after-mut, r=nikomatsakis
Browse files Browse the repository at this point in the history
Include space in suggestion `mut` in bindings

Fix #46614.
  • Loading branch information
bors committed Feb 2, 2018
2 parents 6741e41 + df412ce commit 616b66d
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 32 deletions.
2 changes: 1 addition & 1 deletion src/librustc_borrowck/borrowck/unused.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ impl<'a, 'tcx> UnusedMutCx<'a, 'tcx> {
continue
}

let mut_span = tcx.sess.codemap().span_until_char(ids[0].2, ' ');
let mut_span = tcx.sess.codemap().span_until_non_whitespace(ids[0].2);

// Ok, every name wasn't used mutably, so issue a warning that this
// didn't need to be mutable.
Expand Down
26 changes: 24 additions & 2 deletions src/libsyntax/codemap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -593,8 +593,30 @@ impl CodeMap {
}
}

/// Given a `Span`, try to get a shorter span ending just after the first
/// occurrence of `char` `c`.
/// Given a `Span`, get a new `Span` covering the first token and all its trailing whitespace or
/// the original `Span`.
///
/// If `sp` points to `"let mut x"`, then a span pointing at `"let "` will be returned.
pub fn span_until_non_whitespace(&self, sp: Span) -> Span {
if let Ok(snippet) = self.span_to_snippet(sp) {
let mut offset = 0;
// get the bytes width of all the non-whitespace characters
for c in snippet.chars().take_while(|c| !c.is_whitespace()) {
offset += c.len_utf8();
}
// get the bytes width of all the whitespace characters after that
for c in snippet[offset..].chars().take_while(|c| c.is_whitespace()) {
offset += c.len_utf8();
}
if offset > 1 {
return sp.with_hi(BytePos(sp.lo().0 + offset as u32));
}
}
sp
}

/// Given a `Span`, try to get a shorter span ending just after the first occurrence of `char`
/// `c`.
pub fn span_through_char(&self, sp: Span, c: char) -> Span {
if let Ok(snippet) = self.span_to_snippet(sp) {
if let Some(offset) = snippet.find(c) {
Expand Down
8 changes: 7 additions & 1 deletion src/test/ui/lint/suggestions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// ignore-tidy-tab

#![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
#![feature(no_debug)]

Expand Down Expand Up @@ -46,11 +48,15 @@ fn main() {
let mut a = (1); // should suggest no `mut`, no parens
//~^ WARN does not need to be mutable
//~| WARN unnecessary parentheses
// the line after `mut` has a `\t` at the beginning, this is on purpose
let mut
b = 1;
//~^^ WARN does not need to be mutable
let d = Equinox { warp_factor: 9.975 };
match d {
Equinox { warp_factor: warp_factor } => {} // should suggest shorthand
//~^ WARN this pattern is redundant
}
println!("{}", a);
println!("{} {}", a, b);
}
}
68 changes: 40 additions & 28 deletions src/test/ui/lint/suggestions.stderr
Original file line number Diff line number Diff line change
@@ -1,101 +1,113 @@
warning: unnecessary parentheses around assigned value
--> $DIR/suggestions.rs:46:21
--> $DIR/suggestions.rs:48:21
|
46 | let mut a = (1); // should suggest no `mut`, no parens
48 | let mut a = (1); // should suggest no `mut`, no parens
| ^^^ help: remove these parentheses
|
note: lint level defined here
--> $DIR/suggestions.rs:11:21
--> $DIR/suggestions.rs:13:21
|
11 | #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
13 | #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
| ^^^^^^^^^^^^^

warning: use of deprecated attribute `no_debug`: the `#[no_debug]` attribute was an experimental feature that has been deprecated due to lack of demand. See https://github.com/rust-lang/rust/issues/29721
--> $DIR/suggestions.rs:41:1
--> $DIR/suggestions.rs:43:1
|
41 | #[no_debug] // should suggest removal of deprecated attribute
43 | #[no_debug] // should suggest removal of deprecated attribute
| ^^^^^^^^^^^ help: remove this attribute
|
= note: #[warn(deprecated)] on by default

warning: variable does not need to be mutable
--> $DIR/suggestions.rs:46:13
--> $DIR/suggestions.rs:48:13
|
46 | let mut a = (1); // should suggest no `mut`, no parens
| ---^^
48 | let mut a = (1); // should suggest no `mut`, no parens
| ----^
| |
| help: remove this `mut`
|
note: lint level defined here
--> $DIR/suggestions.rs:11:9
--> $DIR/suggestions.rs:13:9
|
11 | #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
13 | #![warn(unused_mut, unused_parens)] // UI tests pass `-A unused`—see Issue #43896
| ^^^^^^^^^^

warning: variable does not need to be mutable
--> $DIR/suggestions.rs:52:13
|
52 | let mut
| _____________^
| |_____________|
| ||
53 | || b = 1;
| ||____________-^
| |____________|
| help: remove this `mut`

warning: static is marked #[no_mangle], but not exported
--> $DIR/suggestions.rs:14:14
--> $DIR/suggestions.rs:16:14
|
14 | #[no_mangle] static SHENZHOU: usize = 1; // should suggest `pub`
16 | #[no_mangle] static SHENZHOU: usize = 1; // should suggest `pub`
| -^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| help: try making it public: `pub`
|
= note: #[warn(private_no_mangle_statics)] on by default

error: const items should never be #[no_mangle]
--> $DIR/suggestions.rs:16:14
--> $DIR/suggestions.rs:18:14
|
16 | #[no_mangle] const DISCOVERY: usize = 1; // should suggest `pub static` rather than `const`
18 | #[no_mangle] const DISCOVERY: usize = 1; // should suggest `pub static` rather than `const`
| -----^^^^^^^^^^^^^^^^^^^^^^
| |
| help: try a static value: `pub static`
|
= note: #[deny(no_mangle_const_items)] on by default

warning: functions generic over types must be mangled
--> $DIR/suggestions.rs:20:1
--> $DIR/suggestions.rs:22:1
|
19 | #[no_mangle] // should suggest removal (generics can't be no-mangle)
21 | #[no_mangle] // should suggest removal (generics can't be no-mangle)
| ------------ help: remove this attribute
20 | pub fn defiant<T>(_t: T) {}
22 | pub fn defiant<T>(_t: T) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: #[warn(no_mangle_generic_items)] on by default

warning: function is marked #[no_mangle], but not exported
--> $DIR/suggestions.rs:24:1
--> $DIR/suggestions.rs:26:1
|
24 | fn rio_grande() {} // should suggest `pub`
26 | fn rio_grande() {} // should suggest `pub`
| -^^^^^^^^^^^^^^^^^
| |
| help: try making it public: `pub`
|
= note: #[warn(private_no_mangle_fns)] on by default

warning: static is marked #[no_mangle], but not exported
--> $DIR/suggestions.rs:31:18
--> $DIR/suggestions.rs:33:18
|
31 | #[no_mangle] pub static DAUNTLESS: bool = true;
33 | #[no_mangle] pub static DAUNTLESS: bool = true;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

warning: function is marked #[no_mangle], but not exported
--> $DIR/suggestions.rs:33:18
--> $DIR/suggestions.rs:35:18
|
33 | #[no_mangle] pub fn val_jean() {}
35 | #[no_mangle] pub fn val_jean() {}
| ^^^^^^^^^^^^^^^^^^^^

warning: denote infinite loops with `loop { ... }`
--> $DIR/suggestions.rs:44:5
--> $DIR/suggestions.rs:46:5
|
44 | while true { // should suggest `loop`
46 | while true { // should suggest `loop`
| ^^^^^^^^^^ help: use `loop`
|
= note: #[warn(while_true)] on by default

warning: the `warp_factor:` in this pattern is redundant
--> $DIR/suggestions.rs:51:23
--> $DIR/suggestions.rs:57:23
|
51 | Equinox { warp_factor: warp_factor } => {} // should suggest shorthand
57 | Equinox { warp_factor: warp_factor } => {} // should suggest shorthand
| ------------^^^^^^^^^^^^
| |
| help: remove this
Expand Down

0 comments on commit 616b66d

Please sign in to comment.