Skip to content

Commit b0d3170

Browse files
committed
Rollup merge of #50670 - alexcrichton:remove-extern-crate-correct-span, r=Manishearth
rustc: Include semicolon when removing `extern crate` Currently the lint for removing `extern crate` suggests removing `extern crate` most of the time, but the rest of the time it suggest replacing it with `use crate_name`. Unfortunately though when spliced into the original code you're replacing extern crate foo; with use foo which is syntactically invalid! This commit ensure that the trailing semicolon is included in rustc's suggestion to ensure that the code continues to compile afterwards.
2 parents ededa9d + 6de899f commit b0d3170

File tree

6 files changed

+107
-11
lines changed

6 files changed

+107
-11
lines changed

src/librustc_lint/builtin.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1568,10 +1568,10 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ExternCrate {
15681568

15691569
if let Some(orig) = orig {
15701570
err.span_suggestion(it.span, &help,
1571-
format!("{}use {} as {}", pub_, orig, it.name));
1571+
format!("{}use {} as {};", pub_, orig, it.name));
15721572
} else {
15731573
err.span_suggestion(it.span, &help,
1574-
format!("{}use {}", pub_, it.name));
1574+
format!("{}use {};", pub_, it.name));
15751575
}
15761576
} else {
15771577
err.span_suggestion(it.span, "remove it", "".into());

src/test/ui-fulldeps/unnecessary-extern-crate.stderr

+9-9
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,55 @@ error: `extern crate` is unnecessary in the new edition
1414
--> $DIR/unnecessary-extern-crate.rs:19:1
1515
|
1616
LL | extern crate alloc as x;
17-
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc as x`
17+
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc as x;`
1818

1919
error: `extern crate` is unnecessary in the new edition
2020
--> $DIR/unnecessary-extern-crate.rs:25:1
2121
|
2222
LL | pub extern crate test as y;
23-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `pub use`: `pub use test as y`
23+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `pub use`: `pub use test as y;`
2424

2525
error: `extern crate` is unnecessary in the new edition
2626
--> $DIR/unnecessary-extern-crate.rs:28:1
2727
|
2828
LL | pub extern crate libc;
29-
| ^^^^^^^^^^^^^^^^^^^^^^ help: use `pub use`: `pub use libc`
29+
| ^^^^^^^^^^^^^^^^^^^^^^ help: use `pub use`: `pub use libc;`
3030

3131
error: `extern crate` is unnecessary in the new edition
3232
--> $DIR/unnecessary-extern-crate.rs:34:5
3333
|
3434
LL | extern crate alloc;
35-
| ^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc`
35+
| ^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc;`
3636

3737
error: `extern crate` is unnecessary in the new edition
3838
--> $DIR/unnecessary-extern-crate.rs:37:5
3939
|
4040
LL | extern crate alloc as x;
41-
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc as x`
41+
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc as x;`
4242

4343
error: `extern crate` is unnecessary in the new edition
4444
--> $DIR/unnecessary-extern-crate.rs:40:5
4545
|
4646
LL | pub extern crate test;
47-
| ^^^^^^^^^^^^^^^^^^^^^^ help: use `pub use`: `pub use test`
47+
| ^^^^^^^^^^^^^^^^^^^^^^ help: use `pub use`: `pub use test;`
4848

4949
error: `extern crate` is unnecessary in the new edition
5050
--> $DIR/unnecessary-extern-crate.rs:43:5
5151
|
5252
LL | pub extern crate test as y;
53-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `pub use`: `pub use test as y`
53+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `pub use`: `pub use test as y;`
5454

5555
error: `extern crate` is unnecessary in the new edition
5656
--> $DIR/unnecessary-extern-crate.rs:47:9
5757
|
5858
LL | extern crate alloc;
59-
| ^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc`
59+
| ^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc;`
6060

6161
error: `extern crate` is unnecessary in the new edition
6262
--> $DIR/unnecessary-extern-crate.rs:50:9
6363
|
6464
LL | extern crate alloc as x;
65-
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc as x`
65+
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `use`: `use alloc as x;`
6666

6767
error: aborting due to 10 previous errors
6868

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// intentionally blank
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// compile-flags: --edition 2018
12+
// aux-build:removing-extern-crate.rs
13+
// run-rustfix
14+
// compile-pass
15+
16+
#![warn(rust_2018_idioms)]
17+
#![allow(unused_imports)]
18+
19+
use std as foo;
20+
21+
22+
mod another {
23+
use std as foo;
24+
use std;
25+
}
26+
27+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// compile-flags: --edition 2018
12+
// aux-build:removing-extern-crate.rs
13+
// run-rustfix
14+
// compile-pass
15+
16+
#![warn(rust_2018_idioms)]
17+
#![allow(unused_imports)]
18+
19+
extern crate std as foo;
20+
extern crate core;
21+
22+
mod another {
23+
extern crate std as foo;
24+
extern crate std;
25+
}
26+
27+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
warning: `extern crate` is unnecessary in the new edition
2+
--> $DIR/removing-extern-crate.rs:19:1
3+
|
4+
LL | extern crate std as foo;
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `use`: `use std as foo;`
6+
|
7+
note: lint level defined here
8+
--> $DIR/removing-extern-crate.rs:16:9
9+
|
10+
LL | #![warn(rust_2018_idioms)]
11+
| ^^^^^^^^^^^^^^^^
12+
= note: #[warn(unnecessary_extern_crate)] implied by #[warn(rust_2018_idioms)]
13+
14+
warning: `extern crate` is unnecessary in the new edition
15+
--> $DIR/removing-extern-crate.rs:20:1
16+
|
17+
LL | extern crate core;
18+
| ^^^^^^^^^^^^^^^^^^ help: remove it
19+
20+
warning: `extern crate` is unnecessary in the new edition
21+
--> $DIR/removing-extern-crate.rs:23:5
22+
|
23+
LL | extern crate std as foo;
24+
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: use `use`: `use std as foo;`
25+
26+
warning: `extern crate` is unnecessary in the new edition
27+
--> $DIR/removing-extern-crate.rs:24:5
28+
|
29+
LL | extern crate std;
30+
| ^^^^^^^^^^^^^^^^^ help: use `use`: `use std;`
31+

0 commit comments

Comments
 (0)