aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_cargo_watch/src/conv.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_cargo_watch/src/conv.rs')
-rw-r--r--crates/ra_cargo_watch/src/conv.rs17
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
50fn map_span_to_location(span: &DiagnosticSpan, workspace_root: &PathBuf) -> Location { 50fn 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
62fn 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 {