Auto merge of #45489 - oli-obk:json_diagnostics, r=petrochenkov
Fix a quadradic duplication in json for multi-suggestions r? @petrochenkov
This commit is contained in:
commit
2e6a1a9fb4
6 changed files with 44 additions and 28 deletions
|
@ -153,17 +153,15 @@ impl Diagnostic {
|
|||
fn from_diagnostic_builder(db: &DiagnosticBuilder,
|
||||
je: &JsonEmitter)
|
||||
-> Diagnostic {
|
||||
let sugg = db.suggestions.iter().flat_map(|sugg| {
|
||||
je.render(sugg).into_iter().map(move |rendered| {
|
||||
Diagnostic {
|
||||
message: sugg.msg.clone(),
|
||||
code: None,
|
||||
level: "help",
|
||||
spans: DiagnosticSpan::from_suggestion(sugg, je),
|
||||
children: vec![],
|
||||
rendered: Some(rendered),
|
||||
}
|
||||
})
|
||||
let sugg = db.suggestions.iter().map(|sugg| {
|
||||
Diagnostic {
|
||||
message: sugg.msg.clone(),
|
||||
code: None,
|
||||
level: "help",
|
||||
spans: DiagnosticSpan::from_suggestion(sugg, je),
|
||||
children: vec![],
|
||||
rendered: None,
|
||||
}
|
||||
});
|
||||
Diagnostic {
|
||||
message: db.message(),
|
||||
|
@ -356,9 +354,3 @@ impl DiagnosticCode {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl JsonEmitter {
|
||||
fn render(&self, suggestion: &CodeSuggestion) -> Vec<String> {
|
||||
suggestion.splice_lines(&*self.cm).iter().map(|line| line.0.to_owned()).collect()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ fn main() {
|
|||
let _ = tup[0];
|
||||
//~^ ERROR cannot index into a value of type
|
||||
//~| HELP to access tuple elements, use
|
||||
//~| SUGGESTION let _ = tup.0
|
||||
//~| SUGGESTION tup.0
|
||||
|
||||
// the case where we show just a general hint
|
||||
let i = 0_usize;
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"message":"unnecessary parentheses around assigned value","code":null,"level":"warning","spans":[{"file_name":"$DIR/unused_parens_json_suggestion.rs","byte_start":976,"byte_end":989,"line_start":22,"line_end":22,"column_start":14,"column_end":27,"is_primary":true,"text":[{"text":" let _a = (1 / (2 + 3));","highlight_start":14,"highlight_end":27}],"label":null,"suggested_replacement":null,"expansion":null}],"children":[{"message":"#[warn(unused_parens)] on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove these parentheses","code":null,"level":"help","spans":[{"file_name":"$DIR/unused_parens_json_suggestion.rs","byte_start":976,"byte_end":989,"line_start":22,"line_end":22,"column_start":14,"column_end":27,"is_primary":true,"text":[{"text":" let _a = (1 / (2 + 3));","highlight_start":14,"highlight_end":27}],"label":null,"suggested_replacement":"1 / (2 + 3)","expansion":null}],"children":[],"rendered":" let _a = 1 / (2 + 3);"}],"rendered":null}
|
||||
{"message":"unnecessary parentheses around assigned value","code":null,"level":"warning","spans":[{"file_name":"$DIR/unused_parens_json_suggestion.rs","byte_start":976,"byte_end":989,"line_start":22,"line_end":22,"column_start":14,"column_end":27,"is_primary":true,"text":[{"text":" let _a = (1 / (2 + 3));","highlight_start":14,"highlight_end":27}],"label":null,"suggested_replacement":null,"expansion":null}],"children":[{"message":"#[warn(unused_parens)] on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove these parentheses","code":null,"level":"help","spans":[{"file_name":"$DIR/unused_parens_json_suggestion.rs","byte_start":976,"byte_end":989,"line_start":22,"line_end":22,"column_start":14,"column_end":27,"is_primary":true,"text":[{"text":" let _a = (1 / (2 + 3));","highlight_start":14,"highlight_end":27}],"label":null,"suggested_replacement":"1 / (2 + 3)","expansion":null}],"children":[],"rendered":null}],"rendered":null}
|
||||
|
|
21
src/test/ui/lint/use_suggestion_json.rs
Normal file
21
src/test/ui/lint/use_suggestion_json.rs
Normal file
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// compile-flags: --error-format json
|
||||
|
||||
// The output for humans should just highlight the whole span without showing
|
||||
// the suggested replacement, but we also want to test that suggested
|
||||
// replacement only removes one set of parentheses, rather than naïvely
|
||||
// stripping away any starting or ending parenthesis characters—hence this
|
||||
// test of the JSON error format.
|
||||
|
||||
fn main() {
|
||||
let x: Iter;
|
||||
}
|
2
src/test/ui/lint/use_suggestion_json.stderr
Normal file
2
src/test/ui/lint/use_suggestion_json.stderr
Normal file
File diff suppressed because one or more lines are too long
|
@ -36,6 +36,7 @@ struct DiagnosticSpan {
|
|||
column_end: usize,
|
||||
is_primary: bool,
|
||||
label: Option<String>,
|
||||
suggested_replacement: Option<String>,
|
||||
expansion: Option<Box<DiagnosticSpanMacroExpansion>>,
|
||||
}
|
||||
|
||||
|
@ -164,15 +165,15 @@ fn push_expected_errors(expected_errors: &mut Vec<Error>,
|
|||
}
|
||||
|
||||
// If the message has a suggestion, register that.
|
||||
if let Some(ref rendered) = diagnostic.rendered {
|
||||
let start_line = primary_spans.iter().map(|s| s.line_start).min().expect("\
|
||||
every suggestion should have at least one span");
|
||||
for (index, line) in rendered.lines().enumerate() {
|
||||
expected_errors.push(Error {
|
||||
line_num: start_line + index,
|
||||
kind: Some(ErrorKind::Suggestion),
|
||||
msg: line.to_string(),
|
||||
});
|
||||
for span in primary_spans {
|
||||
if let Some(ref suggested_replacement) = span.suggested_replacement {
|
||||
for (index, line) in suggested_replacement.lines().enumerate() {
|
||||
expected_errors.push(Error {
|
||||
line_num: span.line_start + index,
|
||||
kind: Some(ErrorKind::Suggestion),
|
||||
msg: line.to_string(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue