mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2026-04-02 21:02:34 +00:00
Rollup merge of #151505 - bjorn3:proc_macro_refactors, r=petrochenkov,Kobzol
Various refactors to the proc_macro bridge This reduces the amount of types, traits and other abstractions that are involved with the bridge, which should make it easier to understand and modify. This should also help a bit with getting rid of the type marking hack, which is complicating the code a fair bit. Fixes: rust-lang/rust#139810
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
//! `proc_macro::bridge` newtypes.
|
||||
|
||||
use proc_macro::bridge as pm_bridge;
|
||||
use rustc_proc_macro::bridge as pm_bridge;
|
||||
|
||||
pub use pm_bridge::{DelimSpan, Diagnostic, ExpnGlobals, LitKind};
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
mod proc_macros;
|
||||
mod version;
|
||||
|
||||
use proc_macro::bridge;
|
||||
use rustc_proc_macro::bridge;
|
||||
use std::{fmt, fs, io, time::SystemTime};
|
||||
use temp_dir::TempDir;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//! Proc macro ABI
|
||||
use crate::{ProcMacroClientHandle, ProcMacroKind, ProcMacroSrvSpan, token_stream::TokenStream};
|
||||
use proc_macro::bridge;
|
||||
use rustc_proc_macro::bridge;
|
||||
|
||||
#[repr(transparent)]
|
||||
pub(crate) struct ProcMacros([bridge::client::ProcMacro]);
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
)]
|
||||
#![deny(deprecated_safe, clippy::undocumented_unsafe_blocks)]
|
||||
|
||||
extern crate proc_macro;
|
||||
#[cfg(feature = "in-rust-tree")]
|
||||
extern crate rustc_driver as _;
|
||||
extern crate rustc_proc_macro;
|
||||
|
||||
#[cfg(not(feature = "in-rust-tree"))]
|
||||
extern crate ra_ap_rustc_lexer as rustc_lexer;
|
||||
@@ -52,7 +52,7 @@ use temp_dir::TempDir;
|
||||
|
||||
pub use crate::server_impl::token_id::SpanId;
|
||||
|
||||
pub use proc_macro::Delimiter;
|
||||
pub use rustc_proc_macro::Delimiter;
|
||||
pub use span;
|
||||
|
||||
pub use crate::bridge::*;
|
||||
@@ -181,7 +181,9 @@ impl ProcMacroSrv<'_> {
|
||||
}
|
||||
|
||||
pub trait ProcMacroSrvSpan: Copy + Send + Sync {
|
||||
type Server<'a>: proc_macro::bridge::server::Server<TokenStream = crate::token_stream::TokenStream<Self>>;
|
||||
type Server<'a>: rustc_proc_macro::bridge::server::Server<
|
||||
TokenStream = crate::token_stream::TokenStream<Self>,
|
||||
>;
|
||||
fn make_server<'a>(
|
||||
call_site: Self,
|
||||
def_site: Self,
|
||||
|
||||
@@ -10,7 +10,7 @@ use std::{
|
||||
};
|
||||
|
||||
use intern::Symbol;
|
||||
use proc_macro::bridge::server;
|
||||
use rustc_proc_macro::bridge::server;
|
||||
use span::{FIXUP_ERASED_FILE_AST_ID_MARKER, Span, TextRange, TextSize};
|
||||
|
||||
use crate::{
|
||||
@@ -19,8 +19,6 @@ use crate::{
|
||||
server_impl::literal_from_str,
|
||||
};
|
||||
|
||||
pub struct FreeFunctions;
|
||||
|
||||
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>>>,
|
||||
@@ -33,13 +31,28 @@ pub struct RaSpanServer<'a> {
|
||||
}
|
||||
|
||||
impl server::Types for RaSpanServer<'_> {
|
||||
type FreeFunctions = FreeFunctions;
|
||||
type TokenStream = crate::token_stream::TokenStream<Span>;
|
||||
type Span = Span;
|
||||
type Symbol = Symbol;
|
||||
}
|
||||
|
||||
impl server::FreeFunctions for RaSpanServer<'_> {
|
||||
impl server::Server for RaSpanServer<'_> {
|
||||
fn globals(&mut self) -> ExpnGlobals<Self::Span> {
|
||||
ExpnGlobals {
|
||||
def_site: self.def_site,
|
||||
call_site: self.call_site,
|
||||
mixed_site: self.mixed_site,
|
||||
}
|
||||
}
|
||||
|
||||
fn intern_symbol(ident: &str) -> Self::Symbol {
|
||||
Symbol::intern(ident)
|
||||
}
|
||||
|
||||
fn with_symbol_string(symbol: &Self::Symbol, f: impl FnOnce(&str)) {
|
||||
f(symbol.as_str())
|
||||
}
|
||||
|
||||
fn injected_env_var(&mut self, _: &str) -> Option<std::string::String> {
|
||||
None
|
||||
}
|
||||
@@ -58,13 +71,19 @@ impl server::FreeFunctions for RaSpanServer<'_> {
|
||||
fn emit_diagnostic(&mut self, _: Diagnostic<Self::Span>) {
|
||||
// FIXME handle diagnostic
|
||||
}
|
||||
}
|
||||
|
||||
impl server::TokenStream for RaSpanServer<'_> {
|
||||
fn is_empty(&mut self, stream: &Self::TokenStream) -> bool {
|
||||
fn ts_drop(&mut self, stream: Self::TokenStream) {
|
||||
drop(stream);
|
||||
}
|
||||
|
||||
fn ts_clone(&mut self, stream: &Self::TokenStream) -> Self::TokenStream {
|
||||
stream.clone()
|
||||
}
|
||||
|
||||
fn ts_is_empty(&mut self, stream: &Self::TokenStream) -> bool {
|
||||
stream.is_empty()
|
||||
}
|
||||
fn from_str(&mut self, src: &str) -> Self::TokenStream {
|
||||
fn ts_from_str(&mut self, src: &str) -> Self::TokenStream {
|
||||
Self::TokenStream::from_str(src, self.call_site).unwrap_or_else(|e| {
|
||||
Self::TokenStream::from_str(
|
||||
&format!("compile_error!(\"failed to parse str to token stream: {e}\")"),
|
||||
@@ -73,15 +92,15 @@ impl server::TokenStream for RaSpanServer<'_> {
|
||||
.unwrap()
|
||||
})
|
||||
}
|
||||
fn to_string(&mut self, stream: &Self::TokenStream) -> String {
|
||||
fn ts_to_string(&mut self, stream: &Self::TokenStream) -> String {
|
||||
stream.to_string()
|
||||
}
|
||||
|
||||
fn from_token_tree(&mut self, tree: TokenTree<Self::Span>) -> Self::TokenStream {
|
||||
fn ts_from_token_tree(&mut self, tree: TokenTree<Self::Span>) -> Self::TokenStream {
|
||||
Self::TokenStream::new(vec![tree])
|
||||
}
|
||||
|
||||
fn expand_expr(&mut self, self_: &Self::TokenStream) -> Result<Self::TokenStream, ()> {
|
||||
fn ts_expand_expr(&mut self, self_: &Self::TokenStream) -> Result<Self::TokenStream, ()> {
|
||||
// FIXME: requires db, more importantly this requires name resolution so we would need to
|
||||
// eagerly expand this proc-macro, but we can't know that this proc-macro is eager until we
|
||||
// expand it ...
|
||||
@@ -90,7 +109,7 @@ impl server::TokenStream for RaSpanServer<'_> {
|
||||
Ok(self_.clone())
|
||||
}
|
||||
|
||||
fn concat_trees(
|
||||
fn ts_concat_trees(
|
||||
&mut self,
|
||||
base: Option<Self::TokenStream>,
|
||||
trees: Vec<TokenTree<Self::Span>>,
|
||||
@@ -106,7 +125,7 @@ impl server::TokenStream for RaSpanServer<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn concat_streams(
|
||||
fn ts_concat_streams(
|
||||
&mut self,
|
||||
base: Option<Self::TokenStream>,
|
||||
streams: Vec<Self::TokenStream>,
|
||||
@@ -118,28 +137,26 @@ impl server::TokenStream for RaSpanServer<'_> {
|
||||
stream
|
||||
}
|
||||
|
||||
fn into_trees(&mut self, stream: Self::TokenStream) -> Vec<TokenTree<Self::Span>> {
|
||||
fn ts_into_trees(&mut self, stream: Self::TokenStream) -> Vec<TokenTree<Self::Span>> {
|
||||
(*stream.0).clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl server::Span for RaSpanServer<'_> {
|
||||
fn debug(&mut self, span: Self::Span) -> String {
|
||||
fn span_debug(&mut self, span: Self::Span) -> String {
|
||||
format!("{:?}", span)
|
||||
}
|
||||
fn file(&mut self, span: Self::Span) -> String {
|
||||
fn span_file(&mut self, span: Self::Span) -> String {
|
||||
self.callback.as_mut().map(|cb| cb.file(span.anchor.file_id.file_id())).unwrap_or_default()
|
||||
}
|
||||
fn local_file(&mut self, span: Self::Span) -> Option<String> {
|
||||
fn span_local_file(&mut self, span: Self::Span) -> Option<String> {
|
||||
self.callback.as_mut().and_then(|cb| cb.local_file(span.anchor.file_id.file_id()))
|
||||
}
|
||||
fn save_span(&mut self, _span: Self::Span) -> usize {
|
||||
fn span_save_span(&mut self, _span: Self::Span) -> usize {
|
||||
// FIXME, quote is incompatible with third-party tools
|
||||
// This is called by the quote proc-macro which is expanded when the proc-macro is compiled
|
||||
// As such, r-a will never observe this
|
||||
0
|
||||
}
|
||||
fn recover_proc_macro_span(&mut self, _id: usize) -> Self::Span {
|
||||
fn span_recover_proc_macro_span(&mut self, _id: usize) -> Self::Span {
|
||||
// FIXME, quote is incompatible with third-party tools
|
||||
// This is called by the expansion of quote!, r-a will observe this, but we don't have
|
||||
// access to the spans that were encoded
|
||||
@@ -149,23 +166,23 @@ 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> {
|
||||
fn span_source_text(&mut self, span: Self::Span) -> Option<String> {
|
||||
self.callback.as_mut()?.source_text(span)
|
||||
}
|
||||
|
||||
fn parent(&mut self, _span: Self::Span) -> Option<Self::Span> {
|
||||
fn span_parent(&mut self, _span: Self::Span) -> Option<Self::Span> {
|
||||
// FIXME requires db, looks up the parent call site
|
||||
None
|
||||
}
|
||||
fn source(&mut self, span: Self::Span) -> Self::Span {
|
||||
fn span_source(&mut self, span: Self::Span) -> Self::Span {
|
||||
// FIXME requires db, returns the top level call site
|
||||
span
|
||||
}
|
||||
fn byte_range(&mut self, span: Self::Span) -> Range<usize> {
|
||||
fn span_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> {
|
||||
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 {
|
||||
@@ -193,7 +210,7 @@ impl server::Span for RaSpanServer<'_> {
|
||||
ctx: second.ctx,
|
||||
})
|
||||
}
|
||||
fn subspan(
|
||||
fn span_subspan(
|
||||
&mut self,
|
||||
span: Self::Span,
|
||||
start: Bound<usize>,
|
||||
@@ -237,11 +254,11 @@ impl server::Span for RaSpanServer<'_> {
|
||||
})
|
||||
}
|
||||
|
||||
fn resolved_at(&mut self, span: Self::Span, at: Self::Span) -> Self::Span {
|
||||
fn span_resolved_at(&mut self, span: Self::Span, at: Self::Span) -> Self::Span {
|
||||
Span { ctx: at.ctx, ..span }
|
||||
}
|
||||
|
||||
fn end(&mut self, span: Self::Span) -> Self::Span {
|
||||
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 {
|
||||
return span;
|
||||
@@ -249,7 +266,7 @@ impl server::Span for RaSpanServer<'_> {
|
||||
Span { range: TextRange::empty(span.range.end()), ..span }
|
||||
}
|
||||
|
||||
fn start(&mut self, span: Self::Span) -> Self::Span {
|
||||
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 {
|
||||
return span;
|
||||
@@ -257,38 +274,18 @@ impl server::Span for RaSpanServer<'_> {
|
||||
Span { range: TextRange::empty(span.range.start()), ..span }
|
||||
}
|
||||
|
||||
fn line(&mut self, _span: Self::Span) -> usize {
|
||||
fn span_line(&mut self, _span: Self::Span) -> usize {
|
||||
// FIXME requires db to resolve line index, THIS IS NOT INCREMENTAL
|
||||
1
|
||||
}
|
||||
|
||||
fn column(&mut self, _span: Self::Span) -> usize {
|
||||
fn span_column(&mut self, _span: Self::Span) -> usize {
|
||||
// FIXME requires db to resolve line index, THIS IS NOT INCREMENTAL
|
||||
1
|
||||
}
|
||||
}
|
||||
|
||||
impl server::Symbol for RaSpanServer<'_> {
|
||||
fn normalize_and_validate_ident(&mut self, string: &str) -> Result<Self::Symbol, ()> {
|
||||
fn symbol_normalize_and_validate_ident(&mut self, string: &str) -> Result<Self::Symbol, ()> {
|
||||
// FIXME: nfc-normalize and validate idents
|
||||
Ok(<Self as server::Server>::intern_symbol(string))
|
||||
}
|
||||
}
|
||||
|
||||
impl server::Server for RaSpanServer<'_> {
|
||||
fn globals(&mut self) -> ExpnGlobals<Self::Span> {
|
||||
ExpnGlobals {
|
||||
def_site: self.def_site,
|
||||
call_site: self.call_site,
|
||||
mixed_site: self.mixed_site,
|
||||
}
|
||||
}
|
||||
|
||||
fn intern_symbol(ident: &str) -> Self::Symbol {
|
||||
Symbol::intern(ident)
|
||||
}
|
||||
|
||||
fn with_symbol_string(symbol: &Self::Symbol, f: impl FnOnce(&str)) {
|
||||
f(symbol.as_str())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ use std::{
|
||||
};
|
||||
|
||||
use intern::Symbol;
|
||||
use proc_macro::bridge::server;
|
||||
use rustc_proc_macro::bridge::server;
|
||||
|
||||
use crate::{
|
||||
ProcMacroClientHandle,
|
||||
@@ -25,8 +25,6 @@ impl std::fmt::Debug for SpanId {
|
||||
|
||||
type Span = SpanId;
|
||||
|
||||
pub struct FreeFunctions;
|
||||
|
||||
pub struct SpanIdServer<'a> {
|
||||
// FIXME: Report this back to the caller to track as dependencies
|
||||
pub tracked_env_vars: HashMap<Box<str>, Option<Box<str>>>,
|
||||
@@ -39,161 +37,11 @@ pub struct SpanIdServer<'a> {
|
||||
}
|
||||
|
||||
impl server::Types for SpanIdServer<'_> {
|
||||
type FreeFunctions = FreeFunctions;
|
||||
type TokenStream = crate::token_stream::TokenStream<Span>;
|
||||
type Span = Span;
|
||||
type Symbol = Symbol;
|
||||
}
|
||||
|
||||
impl server::FreeFunctions for SpanIdServer<'_> {
|
||||
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));
|
||||
}
|
||||
fn track_path(&mut self, path: &str) {
|
||||
self.tracked_paths.insert(path.into());
|
||||
}
|
||||
|
||||
fn literal_from_str(&mut self, s: &str) -> Result<Literal<Self::Span>, ()> {
|
||||
literal_from_str(s, self.call_site)
|
||||
}
|
||||
|
||||
fn emit_diagnostic(&mut self, _: Diagnostic<Self::Span>) {}
|
||||
}
|
||||
|
||||
impl server::TokenStream for SpanIdServer<'_> {
|
||||
fn is_empty(&mut self, stream: &Self::TokenStream) -> bool {
|
||||
stream.is_empty()
|
||||
}
|
||||
fn from_str(&mut self, src: &str) -> Self::TokenStream {
|
||||
Self::TokenStream::from_str(src, self.call_site).unwrap_or_else(|e| {
|
||||
Self::TokenStream::from_str(
|
||||
&format!("compile_error!(\"failed to parse str to token stream: {e}\")"),
|
||||
self.call_site,
|
||||
)
|
||||
.unwrap()
|
||||
})
|
||||
}
|
||||
fn to_string(&mut self, stream: &Self::TokenStream) -> String {
|
||||
stream.to_string()
|
||||
}
|
||||
fn from_token_tree(&mut self, tree: TokenTree<Self::Span>) -> Self::TokenStream {
|
||||
Self::TokenStream::new(vec![tree])
|
||||
}
|
||||
|
||||
fn expand_expr(&mut self, self_: &Self::TokenStream) -> Result<Self::TokenStream, ()> {
|
||||
Ok(self_.clone())
|
||||
}
|
||||
|
||||
fn concat_trees(
|
||||
&mut self,
|
||||
base: Option<Self::TokenStream>,
|
||||
trees: Vec<TokenTree<Self::Span>>,
|
||||
) -> Self::TokenStream {
|
||||
match base {
|
||||
Some(mut base) => {
|
||||
for tt in trees {
|
||||
base.push_tree(tt);
|
||||
}
|
||||
base
|
||||
}
|
||||
None => Self::TokenStream::new(trees),
|
||||
}
|
||||
}
|
||||
|
||||
fn concat_streams(
|
||||
&mut self,
|
||||
base: Option<Self::TokenStream>,
|
||||
streams: Vec<Self::TokenStream>,
|
||||
) -> Self::TokenStream {
|
||||
let mut stream = base.unwrap_or_default();
|
||||
for s in streams {
|
||||
stream.push_stream(s);
|
||||
}
|
||||
stream
|
||||
}
|
||||
|
||||
fn into_trees(&mut self, stream: Self::TokenStream) -> Vec<TokenTree<Self::Span>> {
|
||||
(*stream.0).clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl server::Span for SpanIdServer<'_> {
|
||||
fn debug(&mut self, span: Self::Span) -> String {
|
||||
format!("{:?}", span.0)
|
||||
}
|
||||
fn file(&mut self, _span: Self::Span) -> String {
|
||||
String::new()
|
||||
}
|
||||
fn local_file(&mut self, _span: Self::Span) -> Option<String> {
|
||||
None
|
||||
}
|
||||
fn save_span(&mut self, _span: Self::Span) -> usize {
|
||||
0
|
||||
}
|
||||
fn recover_proc_macro_span(&mut self, _id: usize) -> Self::Span {
|
||||
self.call_site
|
||||
}
|
||||
/// Recent feature, not yet in the proc_macro
|
||||
///
|
||||
/// See PR:
|
||||
/// https://github.com/rust-lang/rust/pull/55780
|
||||
fn source_text(&mut self, _span: Self::Span) -> Option<String> {
|
||||
None
|
||||
}
|
||||
|
||||
fn parent(&mut self, _span: Self::Span) -> Option<Self::Span> {
|
||||
None
|
||||
}
|
||||
fn source(&mut self, span: Self::Span) -> Self::Span {
|
||||
span
|
||||
}
|
||||
fn byte_range(&mut self, _span: Self::Span) -> Range<usize> {
|
||||
Range { start: 0, end: 0 }
|
||||
}
|
||||
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 subspan(
|
||||
&mut self,
|
||||
span: Self::Span,
|
||||
_start: Bound<usize>,
|
||||
_end: Bound<usize>,
|
||||
) -> Option<Self::Span> {
|
||||
// Just return the span again, because some macros will unwrap the result.
|
||||
Some(span)
|
||||
}
|
||||
fn resolved_at(&mut self, _span: Self::Span, _at: Self::Span) -> Self::Span {
|
||||
self.call_site
|
||||
}
|
||||
|
||||
fn end(&mut self, _self_: Self::Span) -> Self::Span {
|
||||
self.call_site
|
||||
}
|
||||
|
||||
fn start(&mut self, _self_: Self::Span) -> Self::Span {
|
||||
self.call_site
|
||||
}
|
||||
|
||||
fn line(&mut self, _span: Self::Span) -> usize {
|
||||
1
|
||||
}
|
||||
|
||||
fn column(&mut self, _span: Self::Span) -> usize {
|
||||
1
|
||||
}
|
||||
}
|
||||
|
||||
impl server::Symbol for SpanIdServer<'_> {
|
||||
fn normalize_and_validate_ident(&mut self, string: &str) -> Result<Self::Symbol, ()> {
|
||||
// FIXME: nfc-normalize and validate idents
|
||||
Ok(<Self as server::Server>::intern_symbol(string))
|
||||
}
|
||||
}
|
||||
|
||||
impl server::Server for SpanIdServer<'_> {
|
||||
fn globals(&mut self) -> ExpnGlobals<Self::Span> {
|
||||
ExpnGlobals {
|
||||
@@ -210,4 +58,153 @@ impl server::Server for SpanIdServer<'_> {
|
||||
fn with_symbol_string(symbol: &Self::Symbol, f: impl FnOnce(&str)) {
|
||||
f(symbol.as_str())
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
fn track_path(&mut self, path: &str) {
|
||||
self.tracked_paths.insert(path.into());
|
||||
}
|
||||
|
||||
fn literal_from_str(&mut self, s: &str) -> Result<Literal<Self::Span>, ()> {
|
||||
literal_from_str(s, self.call_site)
|
||||
}
|
||||
|
||||
fn emit_diagnostic(&mut self, _: Diagnostic<Self::Span>) {}
|
||||
|
||||
fn ts_drop(&mut self, stream: Self::TokenStream) {
|
||||
drop(stream);
|
||||
}
|
||||
|
||||
fn ts_clone(&mut self, stream: &Self::TokenStream) -> Self::TokenStream {
|
||||
stream.clone()
|
||||
}
|
||||
|
||||
fn ts_is_empty(&mut self, stream: &Self::TokenStream) -> bool {
|
||||
stream.is_empty()
|
||||
}
|
||||
fn ts_from_str(&mut self, src: &str) -> Self::TokenStream {
|
||||
Self::TokenStream::from_str(src, self.call_site).unwrap_or_else(|e| {
|
||||
Self::TokenStream::from_str(
|
||||
&format!("compile_error!(\"failed to parse str to token stream: {e}\")"),
|
||||
self.call_site,
|
||||
)
|
||||
.unwrap()
|
||||
})
|
||||
}
|
||||
fn ts_to_string(&mut self, stream: &Self::TokenStream) -> String {
|
||||
stream.to_string()
|
||||
}
|
||||
fn ts_from_token_tree(&mut self, tree: TokenTree<Self::Span>) -> Self::TokenStream {
|
||||
Self::TokenStream::new(vec![tree])
|
||||
}
|
||||
|
||||
fn ts_expand_expr(&mut self, self_: &Self::TokenStream) -> Result<Self::TokenStream, ()> {
|
||||
Ok(self_.clone())
|
||||
}
|
||||
|
||||
fn ts_concat_trees(
|
||||
&mut self,
|
||||
base: Option<Self::TokenStream>,
|
||||
trees: Vec<TokenTree<Self::Span>>,
|
||||
) -> Self::TokenStream {
|
||||
match base {
|
||||
Some(mut base) => {
|
||||
for tt in trees {
|
||||
base.push_tree(tt);
|
||||
}
|
||||
base
|
||||
}
|
||||
None => Self::TokenStream::new(trees),
|
||||
}
|
||||
}
|
||||
|
||||
fn ts_concat_streams(
|
||||
&mut self,
|
||||
base: Option<Self::TokenStream>,
|
||||
streams: Vec<Self::TokenStream>,
|
||||
) -> Self::TokenStream {
|
||||
let mut stream = base.unwrap_or_default();
|
||||
for s in streams {
|
||||
stream.push_stream(s);
|
||||
}
|
||||
stream
|
||||
}
|
||||
|
||||
fn ts_into_trees(&mut self, stream: Self::TokenStream) -> Vec<TokenTree<Self::Span>> {
|
||||
(*stream.0).clone()
|
||||
}
|
||||
|
||||
fn span_debug(&mut self, span: Self::Span) -> String {
|
||||
format!("{:?}", span.0)
|
||||
}
|
||||
fn span_file(&mut self, _span: Self::Span) -> String {
|
||||
String::new()
|
||||
}
|
||||
fn span_local_file(&mut self, _span: Self::Span) -> Option<String> {
|
||||
None
|
||||
}
|
||||
fn span_save_span(&mut self, _span: Self::Span) -> usize {
|
||||
0
|
||||
}
|
||||
fn span_recover_proc_macro_span(&mut self, _id: usize) -> Self::Span {
|
||||
self.call_site
|
||||
}
|
||||
/// Recent feature, not yet in the proc_macro
|
||||
///
|
||||
/// See PR:
|
||||
/// https://github.com/rust-lang/rust/pull/55780
|
||||
fn span_source_text(&mut self, _span: Self::Span) -> Option<String> {
|
||||
None
|
||||
}
|
||||
|
||||
fn span_parent(&mut self, _span: Self::Span) -> Option<Self::Span> {
|
||||
None
|
||||
}
|
||||
fn span_source(&mut self, span: Self::Span) -> Self::Span {
|
||||
span
|
||||
}
|
||||
fn span_byte_range(&mut self, _span: Self::Span) -> Range<usize> {
|
||||
Range { start: 0, end: 0 }
|
||||
}
|
||||
fn span_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 span_subspan(
|
||||
&mut self,
|
||||
span: Self::Span,
|
||||
_start: Bound<usize>,
|
||||
_end: Bound<usize>,
|
||||
) -> Option<Self::Span> {
|
||||
// Just return the span again, because some macros will unwrap the result.
|
||||
Some(span)
|
||||
}
|
||||
fn span_resolved_at(&mut self, _span: Self::Span, _at: Self::Span) -> Self::Span {
|
||||
self.call_site
|
||||
}
|
||||
|
||||
fn span_end(&mut self, _self_: Self::Span) -> Self::Span {
|
||||
self.call_site
|
||||
}
|
||||
|
||||
fn span_start(&mut self, _self_: Self::Span) -> Self::Span {
|
||||
self.call_site
|
||||
}
|
||||
|
||||
fn span_line(&mut self, _span: Self::Span) -> usize {
|
||||
1
|
||||
}
|
||||
|
||||
fn span_column(&mut self, _span: Self::Span) -> usize {
|
||||
1
|
||||
}
|
||||
|
||||
fn symbol_normalize_and_validate_ident(&mut self, string: &str) -> Result<Self::Symbol, ()> {
|
||||
// FIXME: nfc-normalize and validate idents
|
||||
Ok(<Self as server::Server>::intern_symbol(string))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@ use core::fmt;
|
||||
use std::{mem, sync::Arc};
|
||||
|
||||
use intern::Symbol;
|
||||
use proc_macro::Delimiter;
|
||||
use rustc_lexer::{DocStyle, LiteralKind};
|
||||
use rustc_proc_macro::Delimiter;
|
||||
|
||||
use crate::bridge::{DelimSpan, Group, Ident, LitKind, Literal, Punct, TokenTree};
|
||||
|
||||
@@ -52,7 +52,7 @@ impl<S> TokenStream<S> {
|
||||
S: SpanLike + Copy,
|
||||
{
|
||||
let mut groups = Vec::new();
|
||||
groups.push((proc_macro::Delimiter::None, 0..0, vec![]));
|
||||
groups.push((rustc_proc_macro::Delimiter::None, 0..0, vec![]));
|
||||
let mut offset = 0;
|
||||
let mut tokens = rustc_lexer::tokenize(s, rustc_lexer::FrontmatterAllowed::No).peekable();
|
||||
while let Some(token) = tokens.next() {
|
||||
@@ -102,7 +102,7 @@ impl<S> TokenStream<S> {
|
||||
};
|
||||
match token.kind {
|
||||
rustc_lexer::TokenKind::OpenParen => {
|
||||
groups.push((proc_macro::Delimiter::Parenthesis, range, vec![]))
|
||||
groups.push((rustc_proc_macro::Delimiter::Parenthesis, range, vec![]))
|
||||
}
|
||||
rustc_lexer::TokenKind::CloseParen if *open_delim != Delimiter::Parenthesis => {
|
||||
return if *open_delim == Delimiter::None {
|
||||
@@ -130,7 +130,7 @@ impl<S> TokenStream<S> {
|
||||
);
|
||||
}
|
||||
rustc_lexer::TokenKind::OpenBrace => {
|
||||
groups.push((proc_macro::Delimiter::Brace, range, vec![]))
|
||||
groups.push((rustc_proc_macro::Delimiter::Brace, range, vec![]))
|
||||
}
|
||||
rustc_lexer::TokenKind::CloseBrace if *open_delim != Delimiter::Brace => {
|
||||
return if *open_delim == Delimiter::None {
|
||||
@@ -158,7 +158,7 @@ impl<S> TokenStream<S> {
|
||||
);
|
||||
}
|
||||
rustc_lexer::TokenKind::OpenBracket => {
|
||||
groups.push((proc_macro::Delimiter::Bracket, range, vec![]))
|
||||
groups.push((rustc_proc_macro::Delimiter::Bracket, range, vec![]))
|
||||
}
|
||||
rustc_lexer::TokenKind::CloseBracket if *open_delim != Delimiter::Bracket => {
|
||||
return if *open_delim == Delimiter::None {
|
||||
@@ -460,10 +460,10 @@ fn display_token_tree<S>(
|
||||
f,
|
||||
"{}",
|
||||
match delimiter {
|
||||
proc_macro::Delimiter::Parenthesis => "(",
|
||||
proc_macro::Delimiter::Brace => "{",
|
||||
proc_macro::Delimiter::Bracket => "[",
|
||||
proc_macro::Delimiter::None => "",
|
||||
rustc_proc_macro::Delimiter::Parenthesis => "(",
|
||||
rustc_proc_macro::Delimiter::Brace => "{",
|
||||
rustc_proc_macro::Delimiter::Bracket => "[",
|
||||
rustc_proc_macro::Delimiter::None => "",
|
||||
}
|
||||
)?;
|
||||
if let Some(stream) = stream {
|
||||
@@ -473,10 +473,10 @@ fn display_token_tree<S>(
|
||||
f,
|
||||
"{}",
|
||||
match delimiter {
|
||||
proc_macro::Delimiter::Parenthesis => ")",
|
||||
proc_macro::Delimiter::Brace => "}",
|
||||
proc_macro::Delimiter::Bracket => "]",
|
||||
proc_macro::Delimiter::None => "",
|
||||
rustc_proc_macro::Delimiter::Parenthesis => ")",
|
||||
rustc_proc_macro::Delimiter::Brace => "}",
|
||||
rustc_proc_macro::Delimiter::Bracket => "]",
|
||||
rustc_proc_macro::Delimiter::None => "",
|
||||
}
|
||||
)?;
|
||||
}
|
||||
@@ -587,16 +587,16 @@ fn debug_token_tree<S: fmt::Debug>(
|
||||
f,
|
||||
"GROUP {}{} {:#?} {:#?} {:#?}",
|
||||
match delimiter {
|
||||
proc_macro::Delimiter::Parenthesis => "(",
|
||||
proc_macro::Delimiter::Brace => "{",
|
||||
proc_macro::Delimiter::Bracket => "[",
|
||||
proc_macro::Delimiter::None => "$",
|
||||
rustc_proc_macro::Delimiter::Parenthesis => "(",
|
||||
rustc_proc_macro::Delimiter::Brace => "{",
|
||||
rustc_proc_macro::Delimiter::Bracket => "[",
|
||||
rustc_proc_macro::Delimiter::None => "$",
|
||||
},
|
||||
match delimiter {
|
||||
proc_macro::Delimiter::Parenthesis => ")",
|
||||
proc_macro::Delimiter::Brace => "}",
|
||||
proc_macro::Delimiter::Bracket => "]",
|
||||
proc_macro::Delimiter::None => "$",
|
||||
rustc_proc_macro::Delimiter::Parenthesis => ")",
|
||||
rustc_proc_macro::Delimiter::Brace => "}",
|
||||
rustc_proc_macro::Delimiter::Bracket => "]",
|
||||
rustc_proc_macro::Delimiter::None => "$",
|
||||
},
|
||||
span.open,
|
||||
span.close,
|
||||
|
||||
Reference in New Issue
Block a user