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