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.rs38
1 files changed, 31 insertions, 7 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 1609816971..bcf3600d27 100644
--- a/crates/proc-macro-srv/src/server/rust_analyzer_span.rs
+++ b/crates/proc-macro-srv/src/server/rust_analyzer_span.rs
@@ -12,7 +12,7 @@ use std::{
use ::tt::{TextRange, TextSize};
use proc_macro::bridge::{self, server};
-use span::Span;
+use span::{Span, FIXUP_ERASED_FILE_AST_ID_MARKER};
use crate::server::{
delim_to_external, delim_to_internal, token_stream::TokenStreamBuilder, LiteralFormatter,
@@ -55,6 +55,10 @@ impl server::Types for RaSpanServer {
}
impl server::FreeFunctions for RaSpanServer {
+ fn injected_env_var(&mut self, _: &str) -> Option<std::string::String> {
+ None
+ }
+
fn track_env_var(&mut self, var: &str, value: Option<&str>) {
self.tracked_env_vars.insert(var.into(), value.map(Into::into));
}
@@ -124,9 +128,7 @@ impl server::TokenStream for RaSpanServer {
});
let literal = tt::Literal { text, span: literal.0.span };
- let leaf: ::tt::Leaf<
- ::tt::SpanData<base_db::span::SpanAnchor, base_db::span::SyntaxContextId>,
- > = tt::Leaf::from(literal);
+ let leaf: tt::Leaf = tt::Leaf::from(literal);
let tree = tt::TokenTree::from(leaf);
Self::TokenStream::from_iter(iter::once(tree))
}
@@ -246,6 +248,7 @@ impl server::Span for RaSpanServer {
format!("{:?}", span)
}
fn source_file(&mut self, _span: Self::Span) -> Self::SourceFile {
+ // FIXME stub, requires db
SourceFile {}
}
fn save_span(&mut self, _span: Self::Span) -> usize {
@@ -261,7 +264,7 @@ 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
+ // FIXME requires db, needs special handling wrt fixup spans
None
}
@@ -278,9 +281,20 @@ impl server::Span for RaSpanServer {
Range { start: span.range.start().into(), end: span.range.end().into() }
}
fn 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 {
+ return Some(second);
+ }
+ if second.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
+ 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;
}
+ // Differing context, we can't merge these so prefer the one that's root
if first.ctx != second.ctx {
if first.ctx.is_root() {
return Some(second);
@@ -300,8 +314,10 @@ impl server::Span for RaSpanServer {
start: Bound<usize>,
end: Bound<usize>,
) -> Option<Self::Span> {
- // FIXME requires db to resolve the ast id, THIS IS NOT INCREMENTAL as it works on absolute
- // ranges
+ // 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 {
+ return Some(span);
+ }
let length = span.range.len().into();
let start: u32 = match start {
@@ -341,10 +357,18 @@ impl server::Span for RaSpanServer {
}
fn 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 {
+ return span;
+ }
Span { range: TextRange::empty(span.range.end()), ..span }
}
fn 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 {
+ return span;
+ }
Span { range: TextRange::empty(span.range.start()), ..span }
}