1
Fork 0

Replace proc_macro::SourceFile by Span::{file, local_file}.

This commit is contained in:
Mara Bos 2025-04-11 14:35:00 +02:00
parent 6788ce76c9
commit 3962069982
10 changed files with 61 additions and 93 deletions

View file

@ -1,5 +1,4 @@
use std::ops::{Bound, Range}; use std::ops::{Bound, Range};
use std::sync::Arc;
use ast::token::IdentIsRaw; use ast::token::IdentIsRaw;
use pm::bridge::{ use pm::bridge::{
@ -18,7 +17,7 @@ use rustc_parse::parser::Parser;
use rustc_parse::{exp, new_parser_from_source_str, source_str_to_stream, unwrap_or_emit_fatal}; use rustc_parse::{exp, new_parser_from_source_str, source_str_to_stream, unwrap_or_emit_fatal};
use rustc_session::parse::ParseSess; use rustc_session::parse::ParseSess;
use rustc_span::def_id::CrateNum; use rustc_span::def_id::CrateNum;
use rustc_span::{BytePos, FileName, Pos, SourceFile, Span, Symbol, sym}; use rustc_span::{BytePos, FileName, Pos, Span, Symbol, sym};
use smallvec::{SmallVec, smallvec}; use smallvec::{SmallVec, smallvec};
use crate::base::ExtCtxt; use crate::base::ExtCtxt;
@ -467,7 +466,6 @@ impl<'a, 'b> Rustc<'a, 'b> {
impl server::Types for Rustc<'_, '_> { impl server::Types for Rustc<'_, '_> {
type FreeFunctions = FreeFunctions; type FreeFunctions = FreeFunctions;
type TokenStream = TokenStream; type TokenStream = TokenStream;
type SourceFile = Arc<SourceFile>;
type Span = Span; type Span = Span;
type Symbol = Symbol; type Symbol = Symbol;
} }
@ -673,24 +671,6 @@ impl server::TokenStream for Rustc<'_, '_> {
} }
} }
impl server::SourceFile for Rustc<'_, '_> {
fn eq(&mut self, file1: &Self::SourceFile, file2: &Self::SourceFile) -> bool {
Arc::ptr_eq(file1, file2)
}
fn path(&mut self, file: &Self::SourceFile) -> String {
match &file.name {
FileName::Real(name) => name
.local_path()
.expect("attempting to get a file path in an imported file in `proc_macro::SourceFile::path`")
.to_str()
.expect("non-UTF8 file path in `proc_macro::SourceFile::path`")
.to_string(),
_ => file.name.prefer_local().to_string(),
}
}
}
impl server::Span for Rustc<'_, '_> { impl server::Span for Rustc<'_, '_> {
fn debug(&mut self, span: Self::Span) -> String { fn debug(&mut self, span: Self::Span) -> String {
if self.ecx.ecfg.span_debug { if self.ecx.ecfg.span_debug {
@ -700,8 +680,29 @@ impl server::Span for Rustc<'_, '_> {
} }
} }
fn source_file(&mut self, span: Self::Span) -> Self::SourceFile { fn file(&mut self, span: Self::Span) -> String {
self.psess().source_map().lookup_char_pos(span.lo()).file self.psess()
.source_map()
.lookup_char_pos(span.lo())
.file
.name
.prefer_remapped_unconditionaly()
.to_string()
}
fn local_file(&mut self, span: Self::Span) -> Option<String> {
self.psess()
.source_map()
.lookup_char_pos(span.lo())
.file
.name
.clone()
.into_local_path()
.map(|p| {
p.to_str()
.expect("non-UTF8 file path in `proc_macro::SourceFile::path`")
.to_string()
})
} }
fn parent(&mut self, span: Self::Span) -> Option<Self::Span> { fn parent(&mut self, span: Self::Span) -> Option<Self::Span> {

View file

@ -25,7 +25,10 @@ fn invocation_relative_path_to_absolute(span: Span, path: &str) -> PathBuf {
path.to_path_buf() path.to_path_buf()
} else { } else {
// `/a/b/c/foo/bar.rs` contains the current macro invocation // `/a/b/c/foo/bar.rs` contains the current macro invocation
#[cfg(bootstrap)]
let mut source_file_path = span.source_file().path(); let mut source_file_path = span.source_file().path();
#[cfg(not(bootstrap))]
let mut source_file_path = span.local_file().unwrap();
// `/a/b/c/foo/` // `/a/b/c/foo/`
source_file_path.pop(); source_file_path.pop();
// `/a/b/c/foo/../locales/en-US/example.ftl` // `/a/b/c/foo/../locales/en-US/example.ftl`

View file

@ -111,12 +111,6 @@ impl Clone for TokenStream {
} }
} }
impl Clone for SourceFile {
fn clone(&self) -> Self {
self.clone()
}
}
impl Span { impl Span {
pub(crate) fn def_site() -> Span { pub(crate) fn def_site() -> Span {
Bridge::with(|bridge| bridge.globals.def_site) Bridge::with(|bridge| bridge.globals.def_site)

View file

@ -81,15 +81,8 @@ macro_rules! with_api {
$self: $S::TokenStream $self: $S::TokenStream
) -> Vec<TokenTree<$S::TokenStream, $S::Span, $S::Symbol>>; ) -> Vec<TokenTree<$S::TokenStream, $S::Span, $S::Symbol>>;
}, },
SourceFile {
fn drop($self: $S::SourceFile);
fn clone($self: &$S::SourceFile) -> $S::SourceFile;
fn eq($self: &$S::SourceFile, other: &$S::SourceFile) -> bool;
fn path($self: &$S::SourceFile) -> String;
},
Span { Span {
fn debug($self: $S::Span) -> String; fn debug($self: $S::Span) -> String;
fn source_file($self: $S::Span) -> $S::SourceFile;
fn parent($self: $S::Span) -> Option<$S::Span>; fn parent($self: $S::Span) -> Option<$S::Span>;
fn source($self: $S::Span) -> $S::Span; fn source($self: $S::Span) -> $S::Span;
fn byte_range($self: $S::Span) -> Range<usize>; fn byte_range($self: $S::Span) -> Range<usize>;
@ -97,6 +90,8 @@ macro_rules! with_api {
fn end($self: $S::Span) -> $S::Span; fn end($self: $S::Span) -> $S::Span;
fn line($self: $S::Span) -> usize; fn line($self: $S::Span) -> usize;
fn column($self: $S::Span) -> usize; fn column($self: $S::Span) -> usize;
fn file($self: $S::Span) -> String;
fn local_file($self: $S::Span) -> Option<String>;
fn join($self: $S::Span, other: $S::Span) -> Option<$S::Span>; fn join($self: $S::Span, other: $S::Span) -> Option<$S::Span>;
fn subspan($self: $S::Span, start: Bound<usize>, end: Bound<usize>) -> Option<$S::Span>; fn subspan($self: $S::Span, start: Bound<usize>, end: Bound<usize>) -> Option<$S::Span>;
fn resolved_at($self: $S::Span, at: $S::Span) -> $S::Span; fn resolved_at($self: $S::Span, at: $S::Span) -> $S::Span;
@ -119,7 +114,6 @@ macro_rules! with_api_handle_types {
'owned: 'owned:
FreeFunctions, FreeFunctions,
TokenStream, TokenStream,
SourceFile,
'interned: 'interned:
Span, Span,

View file

@ -82,7 +82,6 @@ with_api_handle_types!(define_server_handles);
pub trait Types { pub trait Types {
type FreeFunctions: 'static; type FreeFunctions: 'static;
type TokenStream: 'static + Clone; type TokenStream: 'static + Clone;
type SourceFile: 'static + Clone;
type Span: 'static + Copy + Eq + Hash; type Span: 'static + Copy + Eq + Hash;
type Symbol: 'static; type Symbol: 'static;
} }

View file

@ -491,12 +491,6 @@ impl Span {
Span(bridge::client::Span::mixed_site()) Span(bridge::client::Span::mixed_site())
} }
/// The original source file into which this span points.
#[unstable(feature = "proc_macro_span", issue = "54725")]
pub fn source_file(&self) -> SourceFile {
SourceFile(self.0.source_file())
}
/// The `Span` for the tokens in the previous macro expansion from which /// The `Span` for the tokens in the previous macro expansion from which
/// `self` was generated from, if any. /// `self` was generated from, if any.
#[unstable(feature = "proc_macro_span", issue = "54725")] #[unstable(feature = "proc_macro_span", issue = "54725")]
@ -546,6 +540,25 @@ impl Span {
self.0.column() self.0.column()
} }
/// The path to the source file in which this span occurs, for display purposes.
///
/// This might not correspond to a valid file system path.
/// It might be remapped, or might be an artificial path such as `"<macro expansion>"`.
#[unstable(feature = "proc_macro_span", issue = "54725")]
pub fn file(&self) -> String {
self.0.file()
}
/// The path to the source file in which this span occurs on disk.
///
/// This is the actual path on disk. It is unaffected by path remapping.
///
/// This path should not be embedded in the output of the macro; prefer `file()` instead.
#[unstable(feature = "proc_macro_span", issue = "54725")]
pub fn local_file(&self) -> Option<PathBuf> {
self.0.local_file().map(|s| PathBuf::from(s))
}
/// Creates a new span encompassing `self` and `other`. /// Creates a new span encompassing `self` and `other`.
/// ///
/// Returns `None` if `self` and `other` are from different files. /// Returns `None` if `self` and `other` are from different files.
@ -614,41 +627,6 @@ impl fmt::Debug for Span {
} }
} }
/// The source file of a given `Span`.
#[unstable(feature = "proc_macro_span", issue = "54725")]
#[derive(Clone)]
pub struct SourceFile(bridge::client::SourceFile);
impl SourceFile {
/// Gets the path to this source file.
///
/// ### Note
///
/// If `--remap-path-prefix` was passed on
/// the command line, the path as given might not actually be valid.
#[unstable(feature = "proc_macro_span", issue = "54725")]
pub fn path(&self) -> PathBuf {
PathBuf::from(self.0.path())
}
}
#[unstable(feature = "proc_macro_span", issue = "54725")]
impl fmt::Debug for SourceFile {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SourceFile").field("path", &self.path()).finish()
}
}
#[unstable(feature = "proc_macro_span", issue = "54725")]
impl PartialEq for SourceFile {
fn eq(&self, other: &Self) -> bool {
self.0.eq(&other.0)
}
}
#[unstable(feature = "proc_macro_span", issue = "54725")]
impl Eq for SourceFile {}
/// A single token or a delimited sequence of token trees (e.g., `[1, (), ..]`). /// A single token or a delimited sequence of token trees (e.g., `[1, (), ..]`).
#[stable(feature = "proc_macro_lib2", since = "1.29.0")] #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
#[derive(Clone)] #[derive(Clone)]

View file

@ -3,9 +3,10 @@
extern crate proc_macro; extern crate proc_macro;
use proc_macro::*;
use std::str::FromStr; use std::str::FromStr;
use proc_macro::*;
// Flatten the TokenStream, removing any toplevel `Delimiter::None`s for // Flatten the TokenStream, removing any toplevel `Delimiter::None`s for
// comparison. // comparison.
fn flatten(ts: TokenStream) -> Vec<TokenTree> { fn flatten(ts: TokenStream) -> Vec<TokenTree> {
@ -136,9 +137,8 @@ pub fn check_expand_expr_file(ts: TokenStream) -> TokenStream {
.to_string(); .to_string();
assert_eq!(input_t, parse_t); assert_eq!(input_t, parse_t);
// Check that the literal matches `Span::call_site().source_file().path()` // Check that the literal matches `Span::call_site().file()`
let expect_t = let expect_t = Literal::string(&Span::call_site().file()).to_string();
Literal::string(&Span::call_site().source_file().path().to_string_lossy()).to_string();
assert_eq!(input_t, expect_t); assert_eq!(input_t, expect_t);
TokenStream::new() TokenStream::new()

View file

@ -79,7 +79,7 @@ fn check_useful_span(token: TokenTree, expected_filename: &str) {
let span = token.span(); let span = token.span();
assert!(span.column() < span.end().column()); assert!(span.column() < span.end().column());
let source_path = span.source_file().path(); let source_path = span.local_file().unwrap();
let filename = source_path.components().last().unwrap(); let filename = source_path.components().last().unwrap();
assert_eq!(filename, Component::Normal(expected_filename.as_ref())); assert_eq!(filename, Component::Normal(expected_filename.as_ref()));
} }

View file

@ -11,10 +11,9 @@ pub fn reemit(input: TokenStream) -> TokenStream {
} }
#[proc_macro] #[proc_macro]
pub fn assert_source_file(input: TokenStream) -> TokenStream { pub fn assert_local_file(input: TokenStream) -> TokenStream {
for tk in input { for tk in input {
let source_file = tk.span().source_file(); assert!(tk.span().local_file().is_some(), "No local file for span: {:?}", tk.span());
assert!(!source_file.as_os_str().is_empty(), "No source file for span: {:?}", tk.span());
} }
"".parse().unwrap() "".parse().unwrap()

View file

@ -8,24 +8,24 @@ extern crate span_test_macros;
extern crate span_api_tests; extern crate span_api_tests;
use span_api_tests::{reemit, assert_source_file, macro_stringify}; use span_api_tests::{reemit, assert_local_file, macro_stringify};
macro_rules! say_hello { macro_rules! say_hello {
($macname:ident) => ( $macname! { "Hello, world!" }) ($macname:ident) => ( $macname! { "Hello, world!" })
} }
assert_source_file! { "Hello, world!" } assert_local_file! { "Hello, world!" }
say_hello! { assert_source_file } say_hello! { assert_local_file }
reemit_legacy! { reemit_legacy! {
assert_source_file! { "Hello, world!" } assert_local_file! { "Hello, world!" }
} }
say_hello_extern! { assert_source_file } say_hello_extern! { assert_local_file }
reemit! { reemit! {
assert_source_file! { "Hello, world!" } assert_local_file! { "Hello, world!" }
} }
fn main() { fn main() {