diff options
| author | Yuki Okushi <jtitor@2k36.org> | 2022-06-16 07:24:43 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-16 07:24:43 +0900 |
| commit | bfc6c90115a84157451b0738f5f56fd8275a9aaa (patch) | |
| tree | c2354dbb0c69a5d3c2647c3db2f0a3e5bb6ed24f /compiler/rustc_ast_lowering/src | |
| parent | ad61ae59bf3a3d64fc724bb4d6b32eba33b01671 (diff) | |
| parent | 71a98e1a4ec98d263984e78f0e54ea0dfa0c7846 (diff) | |
| download | rust-bfc6c90115a84157451b0738f5f56fd8275a9aaa.tar.gz rust-bfc6c90115a84157451b0738f5f56fd8275a9aaa.zip | |
Rollup merge of #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
Diffstat (limited to 'compiler/rustc_ast_lowering/src')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/path.rs | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/compiler/rustc_ast_lowering/src/path.rs b/compiler/rustc_ast_lowering/src/path.rs index ac63a075ac6..5d56b0ffe8d 100644 --- a/compiler/rustc_ast_lowering/src/path.rs +++ b/compiler/rustc_ast_lowering/src/path.rs @@ -196,25 +196,32 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { ParenthesizedGenericArgs::Err => { let mut err = struct_span_err!(self.sess, data.span, E0214, "{}", msg); err.span_label(data.span, "only `Fn` traits may use parentheses"); - if let Ok(snippet) = self.sess.source_map().span_to_snippet(data.span) { - // Do not suggest going from `Trait()` to `Trait<>` - if !data.inputs.is_empty() { - // Suggest replacing `(` and `)` with `<` and `>` - // The snippet may be missing the closing `)`, skip that case - if snippet.ends_with(')') { - if let Some(split) = snippet.find('(') { - let trait_name = &snippet[0..split]; - let args = &snippet[split + 1..snippet.len() - 1]; - err.span_suggestion( - data.span, - "use angle brackets instead", - format!("{}<{}>", trait_name, args), - Applicability::MaybeIncorrect, - ); - } - } - } - }; + // Suggest replacing parentheses with angle brackets `Trait(params...)` to `Trait<params...>` + if !data.inputs.is_empty() { + // Start of the span to the 1st character of 1st argument + let open_param = data.inputs_span.shrink_to_lo().to(data + .inputs + .first() + .unwrap() + .span + .shrink_to_lo()); + // Last character position of last argument to the end of the span + let close_param = data + .inputs + .last() + .unwrap() + .span + .shrink_to_hi() + .to(data.inputs_span.shrink_to_hi()); + err.multipart_suggestion( + &format!("use angle brackets instead",), + vec![ + (open_param, String::from("<")), + (close_param, String::from(">")), + ], + Applicability::MaybeIncorrect, + ); + } err.emit(); ( self.lower_angle_bracketed_parameter_data( |
