diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-12-29 21:40:42 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-12-29 21:40:42 +0000 |
commit | be37c3369b4a2203ace1d65d65bf6ddb5c7faa45 (patch) | |
tree | 7e1a4317b0f918e6a78995dca73851e3796c06f7 /crates/ra_cargo_watch/src/conv.rs | |
parent | fc77921accbcdf410ea3db6363de9fa3d833eba1 (diff) | |
parent | bca8524fa285f3e583bea7608295c846d71c3315 (diff) |
Merge #2681
2681: cargo-watcher: Resolve macro call site in more cases r=matklad a=kiljacken
This resolves the actual macro call site in a few more cases, f.x. when a macro invokes `compile_error!` (I'm looking at you `ra_hir_def::path::__path`).
Co-authored-by: Emil Lauridsen <[email protected]>
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 { |