Skip to content

Commit bfc6c90

Browse files
authored
Rollup merge of rust-lang#98119 - EdwinRy:path-parenthesized-type-error, r=estebank
Refactor path segment parameter error This PR attempts to rewrite the error handling for an unexpected parenthesised type parameters to: - Use provided data instead of re-parsing the whole span - Add a multipart suggestion to reflect on the changes with an underline - Remove the unnecessary "if" nesting
2 parents ad61ae5 + 71a98e1 commit bfc6c90

File tree

7 files changed

+61
-39
lines changed

7 files changed

+61
-39
lines changed

compiler/rustc_ast_lowering/src/path.rs

+26-19
Original file line numberDiff line numberDiff line change
@@ -196,25 +196,32 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
196196
ParenthesizedGenericArgs::Err => {
197197
let mut err = struct_span_err!(self.sess, data.span, E0214, "{}", msg);
198198
err.span_label(data.span, "only `Fn` traits may use parentheses");
199-
if let Ok(snippet) = self.sess.source_map().span_to_snippet(data.span) {
200-
// Do not suggest going from `Trait()` to `Trait<>`
201-
if !data.inputs.is_empty() {
202-
// Suggest replacing `(` and `)` with `<` and `>`
203-
// The snippet may be missing the closing `)`, skip that case
204-
if snippet.ends_with(')') {
205-
if let Some(split) = snippet.find('(') {
206-
let trait_name = &snippet[0..split];
207-
let args = &snippet[split + 1..snippet.len() - 1];
208-
err.span_suggestion(
209-
data.span,
210-
"use angle brackets instead",
211-
format!("{}<{}>", trait_name, args),
212-
Applicability::MaybeIncorrect,
213-
);
214-
}
215-
}
216-
}
217-
};
199+
// Suggest replacing parentheses with angle brackets `Trait(params...)` to `Trait<params...>`
200+
if !data.inputs.is_empty() {
201+
// Start of the span to the 1st character of 1st argument
202+
let open_param = data.inputs_span.shrink_to_lo().to(data
203+
.inputs
204+
.first()
205+
.unwrap()
206+
.span
207+
.shrink_to_lo());
208+
// Last character position of last argument to the end of the span
209+
let close_param = data
210+
.inputs
211+
.last()
212+
.unwrap()
213+
.span
214+
.shrink_to_hi()
215+
.to(data.inputs_span.shrink_to_hi());
216+
err.multipart_suggestion(
217+
&format!("use angle brackets instead",),
218+
vec![
219+
(open_param, String::from("<")),
220+
(close_param, String::from(">")),
221+
],
222+
Applicability::MaybeIncorrect,
223+
);
224+
}
218225
err.emit();
219226
(
220227
self.lower_angle_bracketed_parameter_data(

src/test/ui/error-codes/E0214.stderr

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
22
--> $DIR/E0214.rs:2:12
33
|
44
LL | let v: Vec(&str) = vec!["foo"];
5-
| ^^^^^^^^^
6-
| |
7-
| only `Fn` traits may use parentheses
8-
| help: use angle brackets instead: `Vec<&str>`
5+
| ^^^^^^^^^ only `Fn` traits may use parentheses
6+
|
7+
help: use angle brackets instead
8+
|
9+
LL | let v: Vec<&str> = vec!["foo"];
10+
| ~ ~
911

1012
error: aborting due to previous error
1113

src/test/ui/issues/issue-23589.stderr

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
22
--> $DIR/issue-23589.rs:2:12
33
|
44
LL | let v: Vec(&str) = vec!['1', '2'];
5-
| ^^^^^^^^^
6-
| |
7-
| only `Fn` traits may use parentheses
8-
| help: use angle brackets instead: `Vec<&str>`
5+
| ^^^^^^^^^ only `Fn` traits may use parentheses
6+
|
7+
help: use angle brackets instead
8+
|
9+
LL | let v: Vec<&str> = vec!['1', '2'];
10+
| ~ ~
911

1012
error[E0308]: mismatched types
1113
--> $DIR/issue-23589.rs:2:29

src/test/ui/proc-macro/issue-66286.stderr

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
22
--> $DIR/issue-66286.rs:8:22
33
|
44
LL | pub extern fn foo(_: Vec(u32)) -> u32 {
5-
| ^^^^^^^^
6-
| |
7-
| only `Fn` traits may use parentheses
8-
| help: use angle brackets instead: `Vec<u32>`
5+
| ^^^^^^^^ only `Fn` traits may use parentheses
6+
|
7+
help: use angle brackets instead
8+
|
9+
LL | pub extern fn foo(_: Vec<u32>) -> u32 {
10+
| ~ ~
911

1012
error: aborting due to previous error
1113

src/test/ui/suggestions/let-binding-init-expr-as-ty.stderr

+6-4
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
1010
--> $DIR/let-binding-init-expr-as-ty.rs:2:19
1111
|
1212
LL | let foo: i32::from_be(num);
13-
| ^^^^^^^^^^^^
14-
| |
15-
| only `Fn` traits may use parentheses
16-
| help: use angle brackets instead: `from_be<num>`
13+
| ^^^^^^^^^^^^ only `Fn` traits may use parentheses
14+
|
15+
help: use angle brackets instead
16+
|
17+
LL | let foo: i32::from_be<num>;
18+
| ~ ~
1719

1820
error[E0223]: ambiguous associated type
1921
--> $DIR/let-binding-init-expr-as-ty.rs:2:14

src/test/ui/type/issue-91268.stderr

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
2929
|
3030
LL | 0: u8(ţ
3131
| ^^^^ only `Fn` traits may use parentheses
32+
|
33+
help: use angle brackets instead
34+
|
35+
LL | 0: u8<ţ>
36+
| ~ +
3237

3338
error[E0109]: type arguments are not allowed on this type
3439
--> $DIR/issue-91268.rs:9:11

src/test/ui/unboxed-closures/unboxed-closure-sugar-used-on-struct-3.stderr

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ error[E0214]: parenthesized type parameters may only be used with a `Fn` trait
22
--> $DIR/unboxed-closure-sugar-used-on-struct-3.rs:14:13
33
|
44
LL | let b = Bar::(isize, usize)::new(); // OK too (for the parser)
5-
| ^^^^^^^^^^^^^^^^^^^
6-
| |
7-
| only `Fn` traits may use parentheses
8-
| help: use angle brackets instead: `Bar::<isize, usize>`
5+
| ^^^^^^^^^^^^^^^^^^^ only `Fn` traits may use parentheses
6+
|
7+
help: use angle brackets instead
8+
|
9+
LL | let b = Bar::<isize, usize>::new(); // OK too (for the parser)
10+
| ~ ~
911

1012
error: aborting due to previous error
1113

0 commit comments

Comments
 (0)