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.rs19
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
54fn map_span_to_location(span: &DiagnosticSpan, workspace_root: &PathBuf) -> Location { 54fn 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
66fn 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 {