From 637c795b3c9a56795977ade0cedbc7a9fb7dc453 Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Thu, 12 Mar 2020 15:01:53 +0100 Subject: Correctly handle multi-line fixes from cargo/clippy --- crates/ra_cargo_watch/src/conv.rs | 47 +++----- ...watch__conv__test__snap_clippy_pass_by_ref.snap | 2 +- ...rgo_watch__conv__test__snap_multi_line_fix.snap | 112 +++++++++++++++++ ...ch__conv__test__snap_rustc_unused_variable.snap | 2 +- crates/ra_cargo_watch/src/conv/test.rs | 134 +++++++++++++++++++++ 5 files changed, 267 insertions(+), 30 deletions(-) create mode 100644 crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_multi_line_fix.snap (limited to 'crates/ra_cargo_watch') diff --git a/crates/ra_cargo_watch/src/conv.rs b/crates/ra_cargo_watch/src/conv.rs index 0246adfb5..a3f05bede 100644 --- a/crates/ra_cargo_watch/src/conv.rs +++ b/crates/ra_cargo_watch/src/conv.rs @@ -8,6 +8,7 @@ use lsp_types::{ Location, NumberOrString, Position, Range, TextEdit, Url, WorkspaceEdit, }; use std::{ + collections::HashMap, fmt::Write, path::{Component, Path, PathBuf, Prefix}, str::FromStr, @@ -126,44 +127,34 @@ fn map_rust_child_diagnostic( rd: &RustDiagnostic, workspace_root: &PathBuf, ) -> MappedRustChildDiagnostic { - let span: &DiagnosticSpan = match rd.spans.iter().find(|s| s.is_primary) { - Some(span) => span, - None => { - // `rustc` uses these spanless children as a way to print multi-line - // messages - return MappedRustChildDiagnostic::MessageLine(rd.message.clone()); - } - }; - - // If we have a primary span use its location, otherwise use the parent - let location = map_span_to_location(&span, workspace_root); - - if let Some(suggested_replacement) = &span.suggested_replacement { - // Include our replacement in the title unless it's empty - let title = if !suggested_replacement.is_empty() { - format!("{}: '{}'", rd.message, suggested_replacement) - } else { - rd.message.clone() - }; + let spans: Vec<&DiagnosticSpan> = rd.spans.iter().filter(|s| s.is_primary).collect(); + if spans.is_empty() { + // `rustc` uses these spanless children as a way to print multi-line + // messages + return MappedRustChildDiagnostic::MessageLine(rd.message.clone()); + } - let edit = { - let edits = vec![TextEdit::new(location.range, suggested_replacement.clone())]; - let mut edit_map = std::collections::HashMap::new(); - edit_map.insert(location.uri, edits); - WorkspaceEdit::new(edit_map) - }; + let mut edit_map: HashMap> = HashMap::new(); + for &span in &spans { + if let Some(suggested_replacement) = &span.suggested_replacement { + let location = map_span_to_location(span, workspace_root); + let edit = TextEdit::new(location.range, suggested_replacement.clone()); + edit_map.entry(location.uri).or_default().push(edit); + } + } + if !edit_map.is_empty() { MappedRustChildDiagnostic::SuggestedFix(CodeAction { - title, + title: rd.message.clone(), kind: Some("quickfix".to_string()), diagnostics: None, - edit: Some(edit), + edit: Some(WorkspaceEdit::new(edit_map)), command: None, is_preferred: None, }) } else { MappedRustChildDiagnostic::Related(DiagnosticRelatedInformation { - location, + location: map_span_to_location(spans[0], workspace_root), message: rd.message.clone(), }) } diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_clippy_pass_by_ref.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_clippy_pass_by_ref.snap index 95ca163dc..47801ae79 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_clippy_pass_by_ref.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_clippy_pass_by_ref.snap @@ -63,7 +63,7 @@ MappedRustDiagnostic { }, fixes: [ CodeAction { - title: "consider passing by value instead: \'self\'", + title: "consider passing by value instead", kind: Some( "quickfix", ), diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_multi_line_fix.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_multi_line_fix.snap new file mode 100644 index 000000000..23c4f5a2c --- /dev/null +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_multi_line_fix.snap @@ -0,0 +1,112 @@ +--- +source: crates/ra_cargo_watch/src/conv/test.rs +expression: diag +--- +MappedRustDiagnostic { + location: Location { + uri: "file:///test/src/main.rs", + range: Range { + start: Position { + line: 3, + character: 4, + }, + end: Position { + line: 3, + character: 5, + }, + }, + }, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 3, + character: 4, + }, + end: Position { + line: 3, + character: 5, + }, + }, + severity: Some( + Warning, + ), + code: Some( + String( + "let_and_return", + ), + ), + source: Some( + "clippy", + ), + message: "returning the result of a let binding from a block\n`#[warn(clippy::let_and_return)]` on by default\nfor further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return", + related_information: Some( + [ + DiagnosticRelatedInformation { + location: Location { + uri: "file:///test/src/main.rs", + range: Range { + start: Position { + line: 2, + character: 4, + }, + end: Position { + line: 2, + character: 30, + }, + }, + }, + message: "unnecessary let binding", + }, + ], + ), + tags: None, + }, + fixes: [ + CodeAction { + title: "return the expression directly", + kind: Some( + "quickfix", + ), + diagnostics: None, + edit: Some( + WorkspaceEdit { + changes: Some( + { + "file:///test/src/main.rs": [ + TextEdit { + range: Range { + start: Position { + line: 2, + character: 4, + }, + end: Position { + line: 2, + character: 30, + }, + }, + new_text: "", + }, + TextEdit { + range: Range { + start: Position { + line: 3, + character: 4, + }, + end: Position { + line: 3, + character: 5, + }, + }, + new_text: "(0..10).collect()", + }, + ], + }, + ), + document_changes: None, + }, + ), + command: None, + is_preferred: None, + }, + ], +} diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_unused_variable.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_unused_variable.snap index 3e1fe736c..8bab09540 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_unused_variable.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_unused_variable.snap @@ -48,7 +48,7 @@ MappedRustDiagnostic { }, fixes: [ CodeAction { - title: "consider prefixing with an underscore: \'_foo\'", + title: "consider prefixing with an underscore", kind: Some( "quickfix", ), diff --git a/crates/ra_cargo_watch/src/conv/test.rs b/crates/ra_cargo_watch/src/conv/test.rs index 6b86525b8..c880dcdc3 100644 --- a/crates/ra_cargo_watch/src/conv/test.rs +++ b/crates/ra_cargo_watch/src/conv/test.rs @@ -936,3 +936,137 @@ fn snap_macro_compiler_error() { let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); insta::assert_debug_snapshot!(diag); } + +#[test] +#[cfg(not(windows))] +fn snap_multi_line_fix() { + let diag = parse_diagnostic( + r##"{ + "rendered": "warning: returning the result of a let binding from a block\n --> src/main.rs:4:5\n |\n3 | let a = (0..10).collect();\n | -------------------------- unnecessary let binding\n4 | a\n | ^\n |\n = note: `#[warn(clippy::let_and_return)]` on by default\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return\nhelp: return the expression directly\n |\n3 | \n4 | (0..10).collect()\n |\n\n", + "children": [ + { + "children": [], + "code": null, + "level": "note", + "message": "`#[warn(clippy::let_and_return)]` on by default", + "rendered": null, + "spans": [] + }, + { + "children": [], + "code": null, + "level": "help", + "message": "for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return", + "rendered": null, + "spans": [] + }, + { + "children": [], + "code": null, + "level": "help", + "message": "return the expression directly", + "rendered": null, + "spans": [ + { + "byte_end": 55, + "byte_start": 29, + "column_end": 31, + "column_start": 5, + "expansion": null, + "file_name": "src/main.rs", + "is_primary": true, + "label": null, + "line_end": 3, + "line_start": 3, + "suggested_replacement": "", + "suggestion_applicability": "MachineApplicable", + "text": [ + { + "highlight_end": 31, + "highlight_start": 5, + "text": " let a = (0..10).collect();" + } + ] + }, + { + "byte_end": 61, + "byte_start": 60, + "column_end": 6, + "column_start": 5, + "expansion": null, + "file_name": "src/main.rs", + "is_primary": true, + "label": null, + "line_end": 4, + "line_start": 4, + "suggested_replacement": "(0..10).collect()", + "suggestion_applicability": "MachineApplicable", + "text": [ + { + "highlight_end": 6, + "highlight_start": 5, + "text": " a" + } + ] + } + ] + } + ], + "code": { + "code": "clippy::let_and_return", + "explanation": null + }, + "level": "warning", + "message": "returning the result of a let binding from a block", + "spans": [ + { + "byte_end": 55, + "byte_start": 29, + "column_end": 31, + "column_start": 5, + "expansion": null, + "file_name": "src/main.rs", + "is_primary": false, + "label": "unnecessary let binding", + "line_end": 3, + "line_start": 3, + "suggested_replacement": null, + "suggestion_applicability": null, + "text": [ + { + "highlight_end": 31, + "highlight_start": 5, + "text": " let a = (0..10).collect();" + } + ] + }, + { + "byte_end": 61, + "byte_start": 60, + "column_end": 6, + "column_start": 5, + "expansion": null, + "file_name": "src/main.rs", + "is_primary": true, + "label": null, + "line_end": 4, + "line_start": 4, + "suggested_replacement": null, + "suggestion_applicability": null, + "text": [ + { + "highlight_end": 6, + "highlight_start": 5, + "text": " a" + } + ] + } + ] + } + "##, + ); + + let workspace_root = PathBuf::from("/test/"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + insta::assert_debug_snapshot!(diag); +} -- cgit v1.2.3 From 98e8ad5e608b739d1d28a43c8c69358e77c1c1f0 Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Thu, 12 Mar 2020 15:24:20 +0100 Subject: Handle diagnostics with multiple primary spans --- crates/ra_cargo_watch/src/conv.rs | 81 +++++---- ...watch__conv__test__snap_clippy_pass_by_ref.snap | 172 +++++++++--------- ...h__conv__test__snap_handles_macro_location.snap | 76 ++++---- ...tch__conv__test__snap_macro_compiler_error.snap | 102 +++++------ ...rgo_watch__conv__test__snap_multi_line_fix.snap | 194 +++++++++++---------- ...st__snap_rustc_incompatible_type_for_trait.snap | 76 ++++---- ...ch__conv__test__snap_rustc_mismatched_type.snap | 76 ++++---- ...ch__conv__test__snap_rustc_unused_variable.snap | 148 ++++++++-------- ...est__snap_rustc_wrong_number_of_parameters.snap | 108 ++++++------ crates/ra_cargo_watch/src/conv/test.rs | 16 +- crates/ra_cargo_watch/src/lib.rs | 32 ++-- 11 files changed, 554 insertions(+), 527 deletions(-) (limited to 'crates/ra_cargo_watch') diff --git a/crates/ra_cargo_watch/src/conv.rs b/crates/ra_cargo_watch/src/conv.rs index a3f05bede..c6f8ca329 100644 --- a/crates/ra_cargo_watch/src/conv.rs +++ b/crates/ra_cargo_watch/src/conv.rs @@ -180,13 +180,13 @@ pub(crate) struct MappedRustDiagnostic { pub(crate) fn map_rust_diagnostic_to_lsp( rd: &RustDiagnostic, workspace_root: &PathBuf, -) -> Option { - let primary_span = rd.spans.iter().find(|s| s.is_primary)?; - - let location = map_span_to_location(&primary_span, workspace_root); +) -> Vec { + let primary_spans: Vec<&DiagnosticSpan> = rd.spans.iter().filter(|s| s.is_primary).collect(); + if primary_spans.is_empty() { + return vec![]; + } let severity = map_level_to_severity(rd.level); - let mut primary_span_label = primary_span.label.as_ref(); let mut source = String::from("rustc"); let mut code = rd.code.as_ref().map(|c| c.code.clone()); @@ -199,19 +199,10 @@ pub(crate) fn map_rust_diagnostic_to_lsp( } } + let mut needs_primary_span_label = true; let mut related_information = vec![]; let mut tags = vec![]; - // If error occurs from macro expansion, add related info pointing to - // where the error originated - if !is_from_macro(&primary_span.file_name) && primary_span.expansion.is_some() { - let def_loc = map_span_to_location_naive(&primary_span, workspace_root); - related_information.push(DiagnosticRelatedInformation { - location: def_loc, - message: "Error originated from macro here".to_string(), - }); - } - for secondary_span in rd.spans.iter().filter(|s| !s.is_primary) { let related = map_secondary_span_to_related(secondary_span, workspace_root); if let Some(related) = related { @@ -231,15 +222,11 @@ pub(crate) fn map_rust_diagnostic_to_lsp( // These secondary messages usually duplicate the content of the // primary span label. - primary_span_label = None; + needs_primary_span_label = false; } } } - if let Some(primary_span_label) = primary_span_label { - write!(&mut message, "\n{}", primary_span_label).unwrap(); - } - if is_unused_or_unnecessary(rd) { tags.push(DiagnosticTag::Unnecessary); } @@ -248,21 +235,45 @@ pub(crate) fn map_rust_diagnostic_to_lsp( tags.push(DiagnosticTag::Deprecated); } - let diagnostic = Diagnostic { - range: location.range, - severity, - code: code.map(NumberOrString::String), - source: Some(source), - message, - related_information: if !related_information.is_empty() { - Some(related_information) - } else { - None - }, - tags: if !tags.is_empty() { Some(tags) } else { None }, - }; - - Some(MappedRustDiagnostic { location, diagnostic, fixes }) + primary_spans + .iter() + .map(|primary_span| { + let location = map_span_to_location(&primary_span, workspace_root); + + let mut message = message.clone(); + if needs_primary_span_label { + if let Some(primary_span_label) = &primary_span.label { + write!(&mut message, "\n{}", primary_span_label).unwrap(); + } + } + + // If error occurs from macro expansion, add related info pointing to + // where the error originated + if !is_from_macro(&primary_span.file_name) && primary_span.expansion.is_some() { + let def_loc = map_span_to_location_naive(&primary_span, workspace_root); + related_information.push(DiagnosticRelatedInformation { + location: def_loc, + message: "Error originated from macro here".to_string(), + }); + } + + let diagnostic = Diagnostic { + range: location.range, + severity, + code: code.clone().map(NumberOrString::String), + source: Some(source.clone()), + message, + related_information: if !related_information.is_empty() { + Some(related_information.clone()) + } else { + None + }, + tags: if !tags.is_empty() { Some(tags.clone()) } else { None }, + }; + + MappedRustDiagnostic { location, diagnostic, fixes: fixes.clone() } + }) + .collect() } /// Returns a `Url` object from a given path, will lowercase drive letters if present. diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_clippy_pass_by_ref.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_clippy_pass_by_ref.snap index 47801ae79..9e8f4eff4 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_clippy_pass_by_ref.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_clippy_pass_by_ref.snap @@ -2,98 +2,100 @@ source: crates/ra_cargo_watch/src/conv/test.rs expression: diag --- -MappedRustDiagnostic { - location: Location { - uri: "file:///test/compiler/mir/tagset.rs", - range: Range { - start: Position { - line: 41, - character: 23, - }, - end: Position { - line: 41, - character: 28, +[ + MappedRustDiagnostic { + location: Location { + uri: "file:///test/compiler/mir/tagset.rs", + range: Range { + start: Position { + line: 41, + character: 23, + }, + end: Position { + line: 41, + character: 28, + }, }, }, - }, - diagnostic: Diagnostic { - range: Range { - start: Position { - line: 41, - character: 23, - }, - end: Position { - line: 41, - character: 28, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 41, + character: 23, + }, + end: Position { + line: 41, + character: 28, + }, }, - }, - severity: Some( - Warning, - ), - code: Some( - String( - "trivially_copy_pass_by_ref", + severity: Some( + Warning, ), - ), - source: Some( - "clippy", - ), - message: "this argument is passed by reference, but would be more efficient if passed by value\n#[warn(clippy::trivially_copy_pass_by_ref)] implied by #[warn(clippy::all)]\nfor further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref", - related_information: Some( - [ - DiagnosticRelatedInformation { - location: Location { - uri: "file:///test/compiler/lib.rs", - range: Range { - start: Position { - line: 0, - character: 8, - }, - end: Position { - line: 0, - character: 19, + code: Some( + String( + "trivially_copy_pass_by_ref", + ), + ), + source: Some( + "clippy", + ), + message: "this argument is passed by reference, but would be more efficient if passed by value\n#[warn(clippy::trivially_copy_pass_by_ref)] implied by #[warn(clippy::all)]\nfor further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref", + related_information: Some( + [ + DiagnosticRelatedInformation { + location: Location { + uri: "file:///test/compiler/lib.rs", + range: Range { + start: Position { + line: 0, + character: 8, + }, + end: Position { + line: 0, + character: 19, + }, }, }, + message: "lint level defined here", }, - message: "lint level defined here", - }, - ], - ), - tags: None, - }, - fixes: [ - CodeAction { - title: "consider passing by value instead", - kind: Some( - "quickfix", + ], ), - diagnostics: None, - edit: Some( - WorkspaceEdit { - changes: Some( - { - "file:///test/compiler/mir/tagset.rs": [ - TextEdit { - range: Range { - start: Position { - line: 41, - character: 23, - }, - end: Position { - line: 41, - character: 28, + tags: None, + }, + fixes: [ + CodeAction { + title: "consider passing by value instead", + kind: Some( + "quickfix", + ), + diagnostics: None, + edit: Some( + WorkspaceEdit { + changes: Some( + { + "file:///test/compiler/mir/tagset.rs": [ + TextEdit { + range: Range { + start: Position { + line: 41, + character: 23, + }, + end: Position { + line: 41, + character: 28, + }, }, + new_text: "self", }, - new_text: "self", - }, - ], - }, - ), - document_changes: None, - }, - ), - command: None, - is_preferred: None, - }, - ], -} + ], + }, + ), + document_changes: None, + }, + ), + command: None, + is_preferred: None, + }, + ], + }, +] diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_handles_macro_location.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_handles_macro_location.snap index 12eb32df4..61ae0c9ae 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_handles_macro_location.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_handles_macro_location.snap @@ -2,45 +2,47 @@ source: crates/ra_cargo_watch/src/conv/test.rs expression: diag --- -MappedRustDiagnostic { - location: Location { - uri: "file:///test/src/main.rs", - range: Range { - start: Position { - line: 1, - character: 4, - }, - end: Position { - line: 1, - character: 26, +[ + MappedRustDiagnostic { + location: Location { + uri: "file:///test/src/main.rs", + range: Range { + start: Position { + line: 1, + character: 4, + }, + end: Position { + line: 1, + character: 26, + }, }, }, - }, - diagnostic: Diagnostic { - range: Range { - start: Position { - line: 1, - character: 4, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 1, + character: 4, + }, + end: Position { + line: 1, + character: 26, + }, }, - end: Position { - line: 1, - character: 26, - }, - }, - severity: Some( - Error, - ), - code: Some( - String( - "E0277", + severity: Some( + Error, ), - ), - source: Some( - "rustc", - ), - message: "can\'t compare `{integer}` with `&str`\nthe trait `std::cmp::PartialEq<&str>` is not implemented for `{integer}`", - related_information: None, - tags: None, + code: Some( + String( + "E0277", + ), + ), + source: Some( + "rustc", + ), + message: "can\'t compare `{integer}` with `&str`\nthe trait `std::cmp::PartialEq<&str>` is not implemented for `{integer}`", + related_information: None, + tags: None, + }, + fixes: [], }, - fixes: [], -} +] diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_macro_compiler_error.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_macro_compiler_error.snap index 7b83a7cd0..641da1a58 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_macro_compiler_error.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_macro_compiler_error.snap @@ -2,60 +2,62 @@ source: crates/ra_cargo_watch/src/conv/test.rs expression: diag --- -MappedRustDiagnostic { - location: Location { - uri: "file:///test/crates/ra_hir_def/src/data.rs", - range: Range { - start: Position { - line: 79, - character: 15, - }, - end: Position { - line: 79, - character: 41, +[ + MappedRustDiagnostic { + location: Location { + uri: "file:///test/crates/ra_hir_def/src/data.rs", + range: Range { + start: Position { + line: 79, + character: 15, + }, + end: Position { + line: 79, + character: 41, + }, }, }, - }, - diagnostic: Diagnostic { - range: Range { - start: Position { - line: 79, - character: 15, - }, - end: Position { - line: 79, - character: 41, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 79, + character: 15, + }, + end: Position { + line: 79, + character: 41, + }, }, - }, - severity: Some( - Error, - ), - code: None, - source: Some( - "rustc", - ), - message: "Please register your known path in the path module", - related_information: Some( - [ - DiagnosticRelatedInformation { - location: Location { - uri: "file:///test/crates/ra_hir_def/src/path.rs", - range: Range { - start: Position { - line: 264, - character: 8, - }, - end: Position { - line: 264, - character: 76, + severity: Some( + Error, + ), + code: None, + source: Some( + "rustc", + ), + message: "Please register your known path in the path module", + related_information: Some( + [ + DiagnosticRelatedInformation { + location: Location { + uri: "file:///test/crates/ra_hir_def/src/path.rs", + range: Range { + start: Position { + line: 264, + character: 8, + }, + end: Position { + line: 264, + character: 76, + }, }, }, + message: "Error originated from macro here", }, - message: "Error originated from macro here", - }, - ], - ), - tags: None, + ], + ), + tags: None, + }, + fixes: [], }, - fixes: [], -} +] diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_multi_line_fix.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_multi_line_fix.snap index 23c4f5a2c..0557a2e79 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_multi_line_fix.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_multi_line_fix.snap @@ -2,111 +2,113 @@ source: crates/ra_cargo_watch/src/conv/test.rs expression: diag --- -MappedRustDiagnostic { - location: Location { - uri: "file:///test/src/main.rs", - range: Range { - start: Position { - line: 3, - character: 4, - }, - end: Position { - line: 3, - character: 5, +[ + MappedRustDiagnostic { + location: Location { + uri: "file:///test/src/main.rs", + range: Range { + start: Position { + line: 3, + character: 4, + }, + end: Position { + line: 3, + character: 5, + }, }, }, - }, - diagnostic: Diagnostic { - range: Range { - start: Position { - line: 3, - character: 4, - }, - end: Position { - line: 3, - character: 5, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 3, + character: 4, + }, + end: Position { + line: 3, + character: 5, + }, }, - }, - severity: Some( - Warning, - ), - code: Some( - String( - "let_and_return", + severity: Some( + Warning, ), - ), - source: Some( - "clippy", - ), - message: "returning the result of a let binding from a block\n`#[warn(clippy::let_and_return)]` on by default\nfor further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return", - related_information: Some( - [ - DiagnosticRelatedInformation { - location: Location { - uri: "file:///test/src/main.rs", - range: Range { - start: Position { - line: 2, - character: 4, - }, - end: Position { - line: 2, - character: 30, + code: Some( + String( + "let_and_return", + ), + ), + source: Some( + "clippy", + ), + message: "returning the result of a let binding from a block\n`#[warn(clippy::let_and_return)]` on by default\nfor further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return", + related_information: Some( + [ + DiagnosticRelatedInformation { + location: Location { + uri: "file:///test/src/main.rs", + range: Range { + start: Position { + line: 2, + character: 4, + }, + end: Position { + line: 2, + character: 30, + }, }, }, + message: "unnecessary let binding", }, - message: "unnecessary let binding", - }, - ], - ), - tags: None, - }, - fixes: [ - CodeAction { - title: "return the expression directly", - kind: Some( - "quickfix", + ], ), - diagnostics: None, - edit: Some( - WorkspaceEdit { - changes: Some( - { - "file:///test/src/main.rs": [ - TextEdit { - range: Range { - start: Position { - line: 2, - character: 4, - }, - end: Position { - line: 2, - character: 30, + tags: None, + }, + fixes: [ + CodeAction { + title: "return the expression directly", + kind: Some( + "quickfix", + ), + diagnostics: None, + edit: Some( + WorkspaceEdit { + changes: Some( + { + "file:///test/src/main.rs": [ + TextEdit { + range: Range { + start: Position { + line: 2, + character: 4, + }, + end: Position { + line: 2, + character: 30, + }, }, + new_text: "", }, - new_text: "", - }, - TextEdit { - range: Range { - start: Position { - line: 3, - character: 4, - }, - end: Position { - line: 3, - character: 5, + TextEdit { + range: Range { + start: Position { + line: 3, + character: 4, + }, + end: Position { + line: 3, + character: 5, + }, }, + new_text: "(0..10).collect()", }, - new_text: "(0..10).collect()", - }, - ], - }, - ), - document_changes: None, - }, - ), - command: None, - is_preferred: None, - }, - ], -} + ], + }, + ), + document_changes: None, + }, + ), + command: None, + is_preferred: None, + }, + ], + }, +] diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_incompatible_type_for_trait.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_incompatible_type_for_trait.snap index 54679c5db..754bc33a4 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_incompatible_type_for_trait.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_incompatible_type_for_trait.snap @@ -2,45 +2,47 @@ source: crates/ra_cargo_watch/src/conv/test.rs expression: diag --- -MappedRustDiagnostic { - location: Location { - uri: "file:///test/compiler/ty/list_iter.rs", - range: Range { - start: Position { - line: 51, - character: 4, - }, - end: Position { - line: 51, - character: 47, +[ + MappedRustDiagnostic { + location: Location { + uri: "file:///test/compiler/ty/list_iter.rs", + range: Range { + start: Position { + line: 51, + character: 4, + }, + end: Position { + line: 51, + character: 47, + }, }, }, - }, - diagnostic: Diagnostic { - range: Range { - start: Position { - line: 51, - character: 4, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 51, + character: 4, + }, + end: Position { + line: 51, + character: 47, + }, }, - end: Position { - line: 51, - character: 47, - }, - }, - severity: Some( - Error, - ), - code: Some( - String( - "E0053", + severity: Some( + Error, ), - ), - source: Some( - "rustc", - ), - message: "method `next` has an incompatible type for trait\nexpected type `fn(&mut ty::list_iter::ListIterator<\'list, M>) -> std::option::Option<&ty::Ref>`\n found type `fn(&ty::list_iter::ListIterator<\'list, M>) -> std::option::Option<&\'list ty::Ref>`", - related_information: None, - tags: None, + code: Some( + String( + "E0053", + ), + ), + source: Some( + "rustc", + ), + message: "method `next` has an incompatible type for trait\nexpected type `fn(&mut ty::list_iter::ListIterator<\'list, M>) -> std::option::Option<&ty::Ref>`\n found type `fn(&ty::list_iter::ListIterator<\'list, M>) -> std::option::Option<&\'list ty::Ref>`", + related_information: None, + tags: None, + }, + fixes: [], }, - fixes: [], -} +] diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_mismatched_type.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_mismatched_type.snap index 57df4ceaf..78b7f7cc8 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_mismatched_type.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_mismatched_type.snap @@ -2,45 +2,47 @@ source: crates/ra_cargo_watch/src/conv/test.rs expression: diag --- -MappedRustDiagnostic { - location: Location { - uri: "file:///test/runtime/compiler_support.rs", - range: Range { - start: Position { - line: 47, - character: 64, - }, - end: Position { - line: 47, - character: 69, +[ + MappedRustDiagnostic { + location: Location { + uri: "file:///test/runtime/compiler_support.rs", + range: Range { + start: Position { + line: 47, + character: 64, + }, + end: Position { + line: 47, + character: 69, + }, }, }, - }, - diagnostic: Diagnostic { - range: Range { - start: Position { - line: 47, - character: 64, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 47, + character: 64, + }, + end: Position { + line: 47, + character: 69, + }, }, - end: Position { - line: 47, - character: 69, - }, - }, - severity: Some( - Error, - ), - code: Some( - String( - "E0308", + severity: Some( + Error, ), - ), - source: Some( - "rustc", - ), - message: "mismatched types\nexpected usize, found u32", - related_information: None, - tags: None, + code: Some( + String( + "E0308", + ), + ), + source: Some( + "rustc", + ), + message: "mismatched types\nexpected usize, found u32", + related_information: None, + tags: None, + }, + fixes: [], }, - fixes: [], -} +] diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_unused_variable.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_unused_variable.snap index 8bab09540..5989ed202 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_unused_variable.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_unused_variable.snap @@ -2,83 +2,85 @@ source: crates/ra_cargo_watch/src/conv/test.rs expression: diag --- -MappedRustDiagnostic { - location: Location { - uri: "file:///test/driver/subcommand/repl.rs", - range: Range { - start: Position { - line: 290, - character: 8, - }, - end: Position { - line: 290, - character: 11, +[ + MappedRustDiagnostic { + location: Location { + uri: "file:///test/driver/subcommand/repl.rs", + range: Range { + start: Position { + line: 290, + character: 8, + }, + end: Position { + line: 290, + character: 11, + }, }, }, - }, - diagnostic: Diagnostic { - range: Range { - start: Position { - line: 290, - character: 8, - }, - end: Position { - line: 290, - character: 11, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 290, + character: 8, + }, + end: Position { + line: 290, + character: 11, + }, }, - }, - severity: Some( - Warning, - ), - code: Some( - String( - "unused_variables", + severity: Some( + Warning, ), - ), - source: Some( - "rustc", - ), - message: "unused variable: `foo`\n#[warn(unused_variables)] on by default", - related_information: None, - tags: Some( - [ - Unnecessary, - ], - ), - }, - fixes: [ - CodeAction { - title: "consider prefixing with an underscore", - kind: Some( - "quickfix", + code: Some( + String( + "unused_variables", + ), ), - diagnostics: None, - edit: Some( - WorkspaceEdit { - changes: Some( - { - "file:///test/driver/subcommand/repl.rs": [ - TextEdit { - range: Range { - start: Position { - line: 290, - character: 8, - }, - end: Position { - line: 290, - character: 11, - }, - }, - new_text: "_foo", - }, - ], - }, - ), - document_changes: None, - }, + source: Some( + "rustc", + ), + message: "unused variable: `foo`\n#[warn(unused_variables)] on by default", + related_information: None, + tags: Some( + [ + Unnecessary, + ], ), - command: None, - is_preferred: None, }, - ], -} + fixes: [ + CodeAction { + title: "consider prefixing with an underscore", + kind: Some( + "quickfix", + ), + diagnostics: None, + edit: Some( + WorkspaceEdit { + changes: Some( + { + "file:///test/driver/subcommand/repl.rs": [ + TextEdit { + range: Range { + start: Position { + line: 290, + character: 8, + }, + end: Position { + line: 290, + character: 11, + }, + }, + new_text: "_foo", + }, + ], + }, + ), + document_changes: None, + }, + ), + command: None, + is_preferred: None, + }, + ], + }, +] diff --git a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_wrong_number_of_parameters.snap b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_wrong_number_of_parameters.snap index 69301078d..e34b546dc 100644 --- a/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_wrong_number_of_parameters.snap +++ b/crates/ra_cargo_watch/src/conv/snapshots/ra_cargo_watch__conv__test__snap_rustc_wrong_number_of_parameters.snap @@ -2,64 +2,66 @@ source: crates/ra_cargo_watch/src/conv/test.rs expression: diag --- -MappedRustDiagnostic { - location: Location { - uri: "file:///test/compiler/ty/select.rs", - range: Range { - start: Position { - line: 103, - character: 17, - }, - end: Position { - line: 103, - character: 29, +[ + MappedRustDiagnostic { + location: Location { + uri: "file:///test/compiler/ty/select.rs", + range: Range { + start: Position { + line: 103, + character: 17, + }, + end: Position { + line: 103, + character: 29, + }, }, }, - }, - diagnostic: Diagnostic { - range: Range { - start: Position { - line: 103, - character: 17, - }, - end: Position { - line: 103, - character: 29, + diagnostic: Diagnostic { + range: Range { + start: Position { + line: 103, + character: 17, + }, + end: Position { + line: 103, + character: 29, + }, }, - }, - severity: Some( - Error, - ), - code: Some( - String( - "E0061", + severity: Some( + Error, ), - ), - source: Some( - "rustc", - ), - message: "this function takes 2 parameters but 3 parameters were supplied\nexpected 2 parameters", - related_information: Some( - [ - DiagnosticRelatedInformation { - location: Location { - uri: "file:///test/compiler/ty/select.rs", - range: Range { - start: Position { - line: 218, - character: 4, - }, - end: Position { - line: 230, - character: 5, + code: Some( + String( + "E0061", + ), + ), + source: Some( + "rustc", + ), + message: "this function takes 2 parameters but 3 parameters were supplied\nexpected 2 parameters", + related_information: Some( + [ + DiagnosticRelatedInformation { + location: Location { + uri: "file:///test/compiler/ty/select.rs", + range: Range { + start: Position { + line: 218, + character: 4, + }, + end: Position { + line: 230, + character: 5, + }, }, }, + message: "defined here", }, - message: "defined here", - }, - ], - ), - tags: None, + ], + ), + tags: None, + }, + fixes: [], }, - fixes: [], -} +] diff --git a/crates/ra_cargo_watch/src/conv/test.rs b/crates/ra_cargo_watch/src/conv/test.rs index c880dcdc3..4e81455ca 100644 --- a/crates/ra_cargo_watch/src/conv/test.rs +++ b/crates/ra_cargo_watch/src/conv/test.rs @@ -58,7 +58,7 @@ fn snap_rustc_incompatible_type_for_trait() { ); let workspace_root = PathBuf::from("/test/"); - let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root); insta::assert_debug_snapshot!(diag); } @@ -141,7 +141,7 @@ fn snap_rustc_unused_variable() { ); let workspace_root = PathBuf::from("/test/"); - let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root); insta::assert_debug_snapshot!(diag); } @@ -266,7 +266,7 @@ fn snap_rustc_wrong_number_of_parameters() { ); let workspace_root = PathBuf::from("/test/"); - let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root); insta::assert_debug_snapshot!(diag); } @@ -387,7 +387,7 @@ fn snap_clippy_pass_by_ref() { ); let workspace_root = PathBuf::from("/test/"); - let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root); insta::assert_debug_snapshot!(diag); } @@ -431,7 +431,7 @@ fn snap_rustc_mismatched_type() { ); let workspace_root = PathBuf::from("/test/"); - let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root); insta::assert_debug_snapshot!(diag); } @@ -703,7 +703,7 @@ fn snap_handles_macro_location() { ); let workspace_root = PathBuf::from("/test/"); - let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root); insta::assert_debug_snapshot!(diag); } @@ -933,7 +933,7 @@ fn snap_macro_compiler_error() { ); let workspace_root = PathBuf::from("/test/"); - let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root); insta::assert_debug_snapshot!(diag); } @@ -1067,6 +1067,6 @@ fn snap_multi_line_fix() { ); let workspace_root = PathBuf::from("/test/"); - let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root).expect("couldn't map diagnostic"); + let diag = map_rust_diagnostic_to_lsp(&diag, &workspace_root); insta::assert_debug_snapshot!(diag); } diff --git a/crates/ra_cargo_watch/src/lib.rs b/crates/ra_cargo_watch/src/lib.rs index f07c34549..94b9c03d0 100644 --- a/crates/ra_cargo_watch/src/lib.rs +++ b/crates/ra_cargo_watch/src/lib.rs @@ -197,23 +197,23 @@ impl CheckWatcherThread { } CheckEvent::Msg(Message::CompilerMessage(msg)) => { - let map_result = - match map_rust_diagnostic_to_lsp(&msg.message, &self.workspace_root) { - Some(map_result) => map_result, - None => return, - }; - - let MappedRustDiagnostic { location, diagnostic, fixes } = map_result; - let fixes = fixes - .into_iter() - .map(|fix| { - CodeAction { diagnostics: Some(vec![diagnostic.clone()]), ..fix }.into() - }) - .collect(); + let map_result = map_rust_diagnostic_to_lsp(&msg.message, &self.workspace_root); + if map_result.is_empty() { + return; + } - task_send - .send(CheckTask::AddDiagnostic { url: location.uri, diagnostic, fixes }) - .unwrap(); + for MappedRustDiagnostic { location, diagnostic, fixes } in map_result { + let fixes = fixes + .into_iter() + .map(|fix| { + CodeAction { diagnostics: Some(vec![diagnostic.clone()]), ..fix }.into() + }) + .collect(); + + task_send + .send(CheckTask::AddDiagnostic { url: location.uri, diagnostic, fixes }) + .unwrap(); + } } CheckEvent::Msg(Message::BuildScriptExecuted(_msg)) => {} -- cgit v1.2.3