Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv/src/server_impl/rust_analyzer_span.rs')
-rw-r--r--crates/proc-macro-srv/src/server_impl/rust_analyzer_span.rs33
1 files changed, 13 insertions, 20 deletions
diff --git a/crates/proc-macro-srv/src/server_impl/rust_analyzer_span.rs b/crates/proc-macro-srv/src/server_impl/rust_analyzer_span.rs
index 6b6bfcc934..61eb4243f8 100644
--- a/crates/proc-macro-srv/src/server_impl/rust_analyzer_span.rs
+++ b/crates/proc-macro-srv/src/server_impl/rust_analyzer_span.rs
@@ -4,30 +4,25 @@
//! It is an unfortunate result of how the proc-macro API works that we need to look into the
//! concrete representation of the spans, and as such, RustRover cannot make use of this unless they
//! change their representation to be compatible with rust-analyzer's.
-use std::{
- collections::{HashMap, HashSet},
- ops::{Bound, Range},
-};
+use std::ops::{Bound, Range};
use intern::Symbol;
use rustc_proc_macro::bridge::server;
-use span::{FIXUP_ERASED_FILE_AST_ID_MARKER, Span, TextRange, TextSize};
+use span::{ErasedFileAstId, Span, TextRange, TextSize};
use crate::{
- ProcMacroClientHandle,
+ ProcMacroClientHandle, TrackedEnv,
bridge::{Diagnostic, ExpnGlobals, Literal, TokenTree},
server_impl::literal_from_str,
};
pub struct RaSpanServer<'a> {
- // FIXME: Report this back to the caller to track as dependencies
- pub tracked_env_vars: HashMap<Box<str>, Option<Box<str>>>,
- // FIXME: Report this back to the caller to track as dependencies
- pub tracked_paths: HashSet<Box<str>>,
+ pub tracked_env: &'a mut TrackedEnv,
pub call_site: Span,
pub def_site: Span,
pub mixed_site: Span,
pub callback: Option<ProcMacroClientHandle<'a>>,
+ pub fixup_id: ErasedFileAstId,
}
impl server::Server for RaSpanServer<'_> {
@@ -56,10 +51,10 @@ impl server::Server for RaSpanServer<'_> {
}
fn track_env_var(&mut self, var: &str, value: Option<&str>) {
- self.tracked_env_vars.insert(var.into(), value.map(Into::into));
+ self.tracked_env.env_vars.insert(var.into(), value.map(Into::into));
}
fn track_path(&mut self, path: &str) {
- self.tracked_paths.insert(path.into());
+ self.tracked_env.paths.insert(path.into());
}
fn literal_from_str(&mut self, s: &str) -> Result<Literal<Self::Span>, String> {
@@ -185,16 +180,14 @@ impl server::Server for RaSpanServer<'_> {
fn span_join(&mut self, first: Self::Span, second: Self::Span) -> Option<Self::Span> {
// We can't modify the span range for fixup spans, those are meaningful to fixup, so just
// prefer the non-fixup span.
- if first.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
+ if first.anchor.ast_id == self.fixup_id {
return Some(second);
}
- if second.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
+ if second.anchor.ast_id == self.fixup_id {
return Some(first);
}
- // FIXME: Once we can talk back to the client, implement a "long join" request for anchors
- // that differ in [AstId]s as joining those spans requires resolving the AstIds.
if first.anchor != second.anchor {
- return None;
+ return self.callback.as_mut()?.span_join(first, second);
}
// Differing context, we can't merge these so prefer the one that's root
if first.ctx != second.ctx {
@@ -217,7 +210,7 @@ impl server::Server for RaSpanServer<'_> {
end: Bound<usize>,
) -> Option<Self::Span> {
// We can't modify the span range for fixup spans, those are meaningful to fixup.
- if span.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
+ if span.anchor.ast_id == self.fixup_id {
return Some(span);
}
let length = span.range.len().into();
@@ -260,7 +253,7 @@ impl server::Server for RaSpanServer<'_> {
fn span_end(&mut self, span: Self::Span) -> Self::Span {
// We can't modify the span range for fixup spans, those are meaningful to fixup.
- if span.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
+ if span.anchor.ast_id == self.fixup_id {
return span;
}
Span { range: TextRange::empty(span.range.end()), ..span }
@@ -268,7 +261,7 @@ impl server::Server for RaSpanServer<'_> {
fn span_start(&mut self, span: Self::Span) -> Self::Span {
// We can't modify the span range for fixup spans, those are meaningful to fixup.
- if span.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
+ if span.anchor.ast_id == self.fixup_id {
return span;
}
Span { range: TextRange::empty(span.range.start()), ..span }