diff options
Diffstat (limited to 'crates/ra_cargo_watch/src/conv.rs')
-rw-r--r-- | crates/ra_cargo_watch/src/conv.rs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/crates/ra_cargo_watch/src/conv.rs b/crates/ra_cargo_watch/src/conv.rs index dedb0751e..ac0f1d28a 100644 --- a/crates/ra_cargo_watch/src/conv.rs +++ b/crates/ra_cargo_watch/src/conv.rs | |||
@@ -50,15 +50,20 @@ fn map_macro_span_to_location( | |||
50 | None | 50 | None |
51 | } | 51 | } |
52 | 52 | ||
53 | /// Converts a Rust span to a LSP location | 53 | /// Converts a Rust span to a LSP location, resolving macro expansion site if neccesary |
54 | fn map_span_to_location(span: &DiagnosticSpan, workspace_root: &PathBuf) -> Location { | 54 | fn map_span_to_location(span: &DiagnosticSpan, workspace_root: &PathBuf) -> Location { |
55 | if is_from_macro(&span.file_name) && span.expansion.is_some() { | 55 | if span.expansion.is_some() { |
56 | let expansion = span.expansion.as_ref().unwrap(); | 56 | let expansion = span.expansion.as_ref().unwrap(); |
57 | if let Some(macro_range) = map_macro_span_to_location(&expansion, workspace_root) { | 57 | if let Some(macro_range) = map_macro_span_to_location(&expansion, workspace_root) { |
58 | return macro_range; | 58 | return macro_range; |
59 | } | 59 | } |
60 | } | 60 | } |
61 | 61 | ||
62 | map_span_to_location_naive(span, workspace_root) | ||
63 | } | ||
64 | |||
65 | /// Converts a Rust span to a LSP location | ||
66 | fn map_span_to_location_naive(span: &DiagnosticSpan, workspace_root: &PathBuf) -> Location { | ||
62 | let mut file_name = workspace_root.clone(); | 67 | let mut file_name = workspace_root.clone(); |
63 | file_name.push(&span.file_name); | 68 | file_name.push(&span.file_name); |
64 | let uri = url_from_path_with_drive_lowercasing(file_name).unwrap(); | 69 | let uri = url_from_path_with_drive_lowercasing(file_name).unwrap(); |
@@ -228,6 +233,16 @@ pub(crate) fn map_rust_diagnostic_to_lsp( | |||
228 | let mut related_information = vec![]; | 233 | let mut related_information = vec![]; |
229 | let mut tags = vec![]; | 234 | let mut tags = vec![]; |
230 | 235 | ||
236 | // If error occurs from macro expansion, add related info pointing to | ||
237 | // where the error originated | ||
238 | if !is_from_macro(&primary_span.file_name) && primary_span.expansion.is_some() { | ||
239 | let def_loc = map_span_to_location_naive(&primary_span, workspace_root); | ||
240 | related_information.push(DiagnosticRelatedInformation { | ||
241 | location: def_loc, | ||
242 | message: "Error originated from macro here".to_string(), | ||
243 | }); | ||
244 | } | ||
245 | |||
231 | for secondary_span in rd.spans.iter().filter(|s| !s.is_primary) { | 246 | for secondary_span in rd.spans.iter().filter(|s| !s.is_primary) { |
232 | let related = map_secondary_span_to_related(secondary_span, workspace_root); | 247 | let related = map_secondary_span_to_related(secondary_span, workspace_root); |
233 | if let Some(related) = related { | 248 | if let Some(related) = related { |