Skip to content

Commit

Permalink
Rollup merge of rust-lang#67500 - JohnTitor:non-shorthand-field-patte…
Browse files Browse the repository at this point in the history
…rns, r=Centril

Tweak non_shorthand_field_patterns' suggestion

Fixes rust-lang#66434

r? @estebank
  • Loading branch information
Centril authored Dec 22, 2019
2 parents cdb8cd3 + 30e84b0 commit f358d92
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 22 deletions.
23 changes: 16 additions & 7 deletions src/librustc_lint/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -174,18 +174,27 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonShorthandFieldPatterns {
// (Issue #49588)
continue;
}
if let PatKind::Binding(_, _, ident, None) = fieldpat.pat.kind {
if let PatKind::Binding(binding_annot, _, ident, None) = fieldpat.pat.kind {
if cx.tcx.find_field_index(ident, &variant) ==
Some(cx.tcx.field_index(fieldpat.hir_id, cx.tables)) {
let mut err = cx.struct_span_lint(NON_SHORTHAND_FIELD_PATTERNS,
fieldpat.span,
&format!("the `{}:` in this pattern is redundant", ident));
let subspan = cx.tcx.sess.source_map().span_through_char(fieldpat.span,
':');
err.span_suggestion_short(
subspan,
"remove this",
ident.to_string(),
let binding = match binding_annot {
hir::BindingAnnotation::Unannotated => None,
hir::BindingAnnotation::Mutable => Some("mut"),
hir::BindingAnnotation::Ref => Some("ref"),
hir::BindingAnnotation::RefMut => Some("ref mut"),
};
let ident = if let Some(binding) = binding {
format!("{} {}", binding, ident)
} else {
ident.to_string()
};
err.span_suggestion(
fieldpat.span,
"use shorthand field pattern",
ident,
Applicability::MachineApplicable
);
err.emit();
Expand Down
70 changes: 70 additions & 0 deletions src/test/ui/lint/lint-shorthand-field.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// run-rustfix

#![allow(nonstandard_style, unused_variables, unused_mut)]
#![deny(non_shorthand_field_patterns)]

struct Foo {
x: isize,
y: isize,
}

fn main() {
{
let Foo {
x, //~ ERROR the `x:` in this pattern is redundant
ref y, //~ ERROR the `y:` in this pattern is redundant
} = Foo { x: 0, y: 0 };

let Foo {
x,
ref y,
} = Foo { x: 0, y: 0 };
}

{
const x: isize = 1;

match (Foo { x: 1, y: 1 }) {
Foo { x: x, ..} => {},
_ => {},
}
}

{
struct Bar {
x: x,
}

struct x;

match (Bar { x: x }) {
Bar { x: x } => {},
}
}

{
struct Bar {
x: Foo,
}

enum Foo { x }

match (Bar { x: Foo::x }) {
Bar { x: Foo::x } => {},
}
}

{
struct Baz {
x: isize,
y: isize,
z: isize,
}

let Baz {
mut x, //~ ERROR the `x:` in this pattern is redundant
ref y, //~ ERROR the `y:` in this pattern is redundant
ref mut z, //~ ERROR the `z:` in this pattern is redundant
} = Baz { x: 0, y: 0, z: 0 };
}
}
18 changes: 17 additions & 1 deletion src/test/ui/lint/lint-shorthand-field.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#![allow(nonstandard_style, unused_variables)]
// run-rustfix

#![allow(nonstandard_style, unused_variables, unused_mut)]
#![deny(non_shorthand_field_patterns)]

struct Foo {
Expand Down Expand Up @@ -51,4 +53,18 @@ fn main() {
Bar { x: Foo::x } => {},
}
}

{
struct Baz {
x: isize,
y: isize,
z: isize,
}

let Baz {
x: mut x, //~ ERROR the `x:` in this pattern is redundant
y: ref y, //~ ERROR the `y:` in this pattern is redundant
z: ref mut z, //~ ERROR the `z:` in this pattern is redundant
} = Baz { x: 0, y: 0, z: 0 };
}
}
34 changes: 24 additions & 10 deletions src/test/ui/lint/lint-shorthand-field.stderr
Original file line number Diff line number Diff line change
@@ -1,24 +1,38 @@
error: the `x:` in this pattern is redundant
--> $DIR/lint-shorthand-field.rs:12:13
--> $DIR/lint-shorthand-field.rs:14:13
|
LL | x: x,
| --^^
| |
| help: remove this
| ^^^^ help: use shorthand field pattern: `x`
|
note: lint level defined here
--> $DIR/lint-shorthand-field.rs:2:9
--> $DIR/lint-shorthand-field.rs:4:9
|
LL | #![deny(non_shorthand_field_patterns)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: the `y:` in this pattern is redundant
--> $DIR/lint-shorthand-field.rs:13:13
--> $DIR/lint-shorthand-field.rs:15:13
|
LL | y: ref y,
| --^^^^^^
| |
| help: remove this
| ^^^^^^^^ help: use shorthand field pattern: `ref y`

error: aborting due to 2 previous errors
error: the `x:` in this pattern is redundant
--> $DIR/lint-shorthand-field.rs:65:13
|
LL | x: mut x,
| ^^^^^^^^ help: use shorthand field pattern: `mut x`

error: the `y:` in this pattern is redundant
--> $DIR/lint-shorthand-field.rs:66:13
|
LL | y: ref y,
| ^^^^^^^^ help: use shorthand field pattern: `ref y`

error: the `z:` in this pattern is redundant
--> $DIR/lint-shorthand-field.rs:67:13
|
LL | z: ref mut z,
| ^^^^^^^^^^^^ help: use shorthand field pattern: `ref mut z`

error: aborting due to 5 previous errors

2 changes: 1 addition & 1 deletion src/test/ui/lint/suggestions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ fn main() {
match d {
Equinox { warp_factor: warp_factor } => {}
//~^ WARN this pattern is redundant
//~| HELP remove this
//~| HELP use shorthand field pattern
}
println!("{} {}", registry_no, b);
}
Expand Down
4 changes: 1 addition & 3 deletions src/test/ui/lint/suggestions.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,7 @@ warning: the `warp_factor:` in this pattern is redundant
--> $DIR/suggestions.rs:61:23
|
LL | Equinox { warp_factor: warp_factor } => {}
| ------------^^^^^^^^^^^^
| |
| help: remove this
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use shorthand field pattern: `warp_factor`
|
= note: `#[warn(non_shorthand_field_patterns)]` on by default

Expand Down

0 comments on commit f358d92

Please sign in to comment.