Add approximate suggestions for rustfix

This adds `span_approximate_suggestion()` that lets you emit a
suggestion marked as "approximate" in the JSON output. UI
users see no difference. This is for when rustc and clippy wish to
 emit suggestions which will make sense to the reader (e.g. they may
have placeholders like `<type>`) but are not source-applicable, so that
rustfix/etc can ignore these.

fixes #39254
This commit is contained in:
Manish Goregaokar
2018-01-18 17:17:46 +05:30
parent 385ef1514c
commit 937bc2e04a
4 changed files with 64 additions and 7 deletions

View File

@@ -121,6 +121,8 @@ struct DiagnosticSpan {
/// If we are suggesting a replacement, this will contain text
/// that should be sliced in atop this span.
suggested_replacement: Option<String>,
/// If the suggestion is approximate
suggestion_approximate: Option<bool>,
/// Macro invocations that created the code at this span, if any.
expansion: Option<Box<DiagnosticSpanMacroExpansion>>,
}
@@ -220,7 +222,7 @@ impl Diagnostic {
impl DiagnosticSpan {
fn from_span_label(span: SpanLabel,
suggestion: Option<&String>,
suggestion: Option<(&String, bool)>,
je: &JsonEmitter)
-> DiagnosticSpan {
Self::from_span_etc(span.span,
@@ -233,7 +235,7 @@ impl DiagnosticSpan {
fn from_span_etc(span: Span,
is_primary: bool,
label: Option<String>,
suggestion: Option<&String>,
suggestion: Option<(&String, bool)>,
je: &JsonEmitter)
-> DiagnosticSpan {
// obtain the full backtrace from the `macro_backtrace`
@@ -253,7 +255,7 @@ impl DiagnosticSpan {
fn from_span_full(span: Span,
is_primary: bool,
label: Option<String>,
suggestion: Option<&String>,
suggestion: Option<(&String, bool)>,
mut backtrace: vec::IntoIter<MacroBacktrace>,
je: &JsonEmitter)
-> DiagnosticSpan {
@@ -291,7 +293,8 @@ impl DiagnosticSpan {
column_end: end.col.0 + 1,
is_primary,
text: DiagnosticSpanLine::from_span(span, je),
suggested_replacement: suggestion.cloned(),
suggested_replacement: suggestion.map(|x| x.0.clone()),
suggestion_approximate: suggestion.map(|x| x.1),
expansion: backtrace_step,
label,
}
@@ -309,14 +312,15 @@ impl DiagnosticSpan {
suggestion.substitutions
.iter()
.flat_map(|substitution| {
substitution.parts.iter().map(move |suggestion| {
substitution.parts.iter().map(move |suggestion_inner| {
let span_label = SpanLabel {
span: suggestion.span,
span: suggestion_inner.span,
is_primary: true,
label: None,
};
DiagnosticSpan::from_span_label(span_label,
Some(&suggestion.snippet),
Some((&suggestion_inner.snippet,
suggestion.approximate)),
je)
})
})