Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv/src/server/rust_analyzer_span.rs')
-rw-r--r--crates/proc-macro-srv/src/server/rust_analyzer_span.rs44
1 files changed, 32 insertions, 12 deletions
diff --git a/crates/proc-macro-srv/src/server/rust_analyzer_span.rs b/crates/proc-macro-srv/src/server/rust_analyzer_span.rs
index 92e1ec0a94..d8648da604 100644
--- a/crates/proc-macro-srv/src/server/rust_analyzer_span.rs
+++ b/crates/proc-macro-srv/src/server/rust_analyzer_span.rs
@@ -1,4 +1,5 @@
use std::{
+ collections::{HashMap, HashSet},
iter,
ops::{Bound, Range},
};
@@ -35,6 +36,10 @@ pub struct FreeFunctions;
pub struct RaSpanServer {
pub(crate) interner: SymbolInternerRef,
+ // 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 call_site: Span,
pub def_site: Span,
pub mixed_site: Span,
@@ -49,11 +54,12 @@ impl server::Types for RaSpanServer {
}
impl server::FreeFunctions for RaSpanServer {
- fn track_env_var(&mut self, _var: &str, _value: Option<&str>) {
- // FIXME: track env var accesses
- // https://github.com/rust-lang/rust/pull/71858
+ fn track_env_var(&mut self, var: &str, value: Option<&str>) {
+ self.tracked_env_vars.insert(var.into(), value.map(Into::into));
+ }
+ fn track_path(&mut self, path: &str) {
+ self.tracked_paths.insert(path.into());
}
- fn track_path(&mut self, _path: &str) {}
fn literal_from_str(
&mut self,
@@ -247,24 +253,38 @@ impl server::Span for RaSpanServer {
/// See PR:
/// https://github.com/rust-lang/rust/pull/55780
fn source_text(&mut self, _span: Self::Span) -> Option<String> {
+ // FIXME requires db
None
}
fn parent(&mut self, _span: Self::Span) -> Option<Self::Span> {
- // FIXME handle span
+ // FIXME requires db, looks up the parent call site
None
}
fn source(&mut self, span: Self::Span) -> Self::Span {
- // FIXME handle span
+ // FIXME requires db, returns the top level call site
span
}
- fn byte_range(&mut self, _span: Self::Span) -> Range<usize> {
- // FIXME handle span
- Range { start: 0, end: 0 }
+ fn byte_range(&mut self, span: Self::Span) -> Range<usize> {
+ // FIXME requires db to resolve the ast id, THIS IS NOT INCREMENTAL
+ Range { start: span.range.start().into(), end: span.range.end().into() }
}
- fn join(&mut self, first: Self::Span, _second: Self::Span) -> Option<Self::Span> {
- // Just return the first span again, because some macros will unwrap the result.
- Some(first)
+ fn join(&mut self, first: Self::Span, second: Self::Span) -> Option<Self::Span> {
+ if first.anchor != second.anchor {
+ return None;
+ }
+ if first.ctx != second.ctx {
+ if first.ctx.is_root() {
+ return Some(second);
+ } else if second.ctx.is_root() {
+ return Some(first);
+ }
+ }
+ Some(Span {
+ range: first.range.cover(second.range),
+ anchor: second.anchor,
+ ctx: second.ctx,
+ })
}
fn subspan(
&mut self,