Use full name to identify a macro in a FileName
.
Before this two macros with same name would be indistinguishable inside a `FileName`. This caused a bug in incremental compilation (see #53097) since two different macros would map out to the same `StableFilemapId`. Fixes #53097.
This commit is contained in:
parent
79fcc58b24
commit
2d7edf908d
11 changed files with 47 additions and 15 deletions
|
@ -287,6 +287,31 @@ impl DefPath {
|
||||||
s
|
s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return filename friendly string of the DefPah with the
|
||||||
|
/// crate-prefix.
|
||||||
|
pub fn to_string_friendly<F>(&self, crate_imported_name: F) -> String
|
||||||
|
where F: FnOnce(CrateNum) -> Symbol
|
||||||
|
{
|
||||||
|
let crate_name_str = crate_imported_name(self.krate).as_str();
|
||||||
|
let mut s = String::with_capacity(crate_name_str.len() + self.data.len() * 16);
|
||||||
|
|
||||||
|
write!(s, "::{}", crate_name_str).unwrap();
|
||||||
|
|
||||||
|
for component in &self.data {
|
||||||
|
if component.disambiguator == 0 {
|
||||||
|
write!(s, "::{}", component.data.as_interned_str()).unwrap();
|
||||||
|
} else {
|
||||||
|
write!(s,
|
||||||
|
"{}[{}]",
|
||||||
|
component.data.as_interned_str(),
|
||||||
|
component.disambiguator)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
/// Return filename friendly string of the DefPah without
|
/// Return filename friendly string of the DefPah without
|
||||||
/// the crate-prefix. This method is useful if you don't have
|
/// the crate-prefix. This method is useful if you don't have
|
||||||
/// a TyCtxt available.
|
/// a TyCtxt available.
|
||||||
|
|
|
@ -606,6 +606,7 @@ impl<'a, 'tcx, 'x> SpecializedDecoder<interpret::AllocId> for CacheDecoder<'a, '
|
||||||
alloc_decoding_session.decode_alloc_id(self)
|
alloc_decoding_session.decode_alloc_id(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx, 'x> SpecializedDecoder<Span> for CacheDecoder<'a, 'tcx, 'x> {
|
impl<'a, 'tcx, 'x> SpecializedDecoder<Span> for CacheDecoder<'a, 'tcx, 'x> {
|
||||||
fn specialized_decode(&mut self) -> Result<Span, Self::Error> {
|
fn specialized_decode(&mut self) -> Result<Span, Self::Error> {
|
||||||
let tag: u8 = Decodable::decode(self)?;
|
let tag: u8 = Decodable::decode(self)?;
|
||||||
|
|
|
@ -256,6 +256,7 @@ impl<'a> CrateLoader<'a> {
|
||||||
|
|
||||||
let cmeta = cstore::CrateMetadata {
|
let cmeta = cstore::CrateMetadata {
|
||||||
name: crate_root.name,
|
name: crate_root.name,
|
||||||
|
imported_name: ident,
|
||||||
extern_crate: Lock::new(None),
|
extern_crate: Lock::new(None),
|
||||||
def_path_table: Lrc::new(def_path_table),
|
def_path_table: Lrc::new(def_path_table),
|
||||||
trait_impls,
|
trait_impls,
|
||||||
|
|
|
@ -53,8 +53,13 @@ pub struct ImportedSourceFile {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct CrateMetadata {
|
pub struct CrateMetadata {
|
||||||
|
/// Original name of the crate.
|
||||||
pub name: Symbol,
|
pub name: Symbol,
|
||||||
|
|
||||||
|
/// Name of the crate as imported. I.e. if imported with
|
||||||
|
/// `extern crate foo as bar;` this will be `bar`.
|
||||||
|
pub imported_name: Symbol,
|
||||||
|
|
||||||
/// Information about the extern crate that caused this crate to
|
/// Information about the extern crate that caused this crate to
|
||||||
/// be loaded. If this is `None`, then the crate was injected
|
/// be loaded. If this is `None`, then the crate was injected
|
||||||
/// (e.g., by the allocator)
|
/// (e.g., by the allocator)
|
||||||
|
|
|
@ -447,8 +447,7 @@ impl cstore::CStore {
|
||||||
let data = self.get_crate_data(id.krate);
|
let data = self.get_crate_data(id.krate);
|
||||||
if let Some(ref proc_macros) = data.proc_macros {
|
if let Some(ref proc_macros) = data.proc_macros {
|
||||||
return LoadedMacro::ProcMacro(proc_macros[id.index.to_proc_macro_index()].1.clone());
|
return LoadedMacro::ProcMacro(proc_macros[id.index.to_proc_macro_index()].1.clone());
|
||||||
} else if data.name == "proc_macro" &&
|
} else if data.name == "proc_macro" && data.item_name(id.index) == "quote" {
|
||||||
self.get_crate_data(id.krate).item_name(id.index) == "quote" {
|
|
||||||
use syntax::ext::base::SyntaxExtension;
|
use syntax::ext::base::SyntaxExtension;
|
||||||
use syntax_ext::proc_macro_impl::BangProcMacro;
|
use syntax_ext::proc_macro_impl::BangProcMacro;
|
||||||
|
|
||||||
|
@ -460,8 +459,9 @@ impl cstore::CStore {
|
||||||
return LoadedMacro::ProcMacro(Lrc::new(ext));
|
return LoadedMacro::ProcMacro(Lrc::new(ext));
|
||||||
}
|
}
|
||||||
|
|
||||||
let (name, def) = data.get_macro(id.index);
|
let def = data.get_macro(id.index);
|
||||||
let source_name = FileName::Macros(name.to_string());
|
let macro_full_name = data.def_path(id.index).to_string_friendly(|_| data.imported_name);
|
||||||
|
let source_name = FileName::Macros(macro_full_name);
|
||||||
|
|
||||||
let source_file = sess.parse_sess.source_map().new_source_file(source_name, def.body);
|
let source_file = sess.parse_sess.source_map().new_source_file(source_name, def.body);
|
||||||
let local_span = Span::new(source_file.start_pos, source_file.end_pos, NO_EXPANSION);
|
let local_span = Span::new(source_file.start_pos, source_file.end_pos, NO_EXPANSION);
|
||||||
|
|
|
@ -1069,10 +1069,10 @@ impl<'a, 'tcx> CrateMetadata {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_macro(&self, id: DefIndex) -> (InternedString, MacroDef) {
|
pub fn get_macro(&self, id: DefIndex) -> MacroDef {
|
||||||
let entry = self.entry(id);
|
let entry = self.entry(id);
|
||||||
match entry.kind {
|
match entry.kind {
|
||||||
EntryKind::MacroDef(macro_def) => (self.item_name(id), macro_def.decode(self)),
|
EntryKind::MacroDef(macro_def) => macro_def.decode(self),
|
||||||
_ => bug!(),
|
_ => bug!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ scoped_thread_local!(pub static GLOBALS: Globals);
|
||||||
#[derive(Debug, Eq, PartialEq, Clone, Ord, PartialOrd, Hash, RustcDecodable, RustcEncodable)]
|
#[derive(Debug, Eq, PartialEq, Clone, Ord, PartialOrd, Hash, RustcDecodable, RustcEncodable)]
|
||||||
pub enum FileName {
|
pub enum FileName {
|
||||||
Real(PathBuf),
|
Real(PathBuf),
|
||||||
/// e.g. "std" macros
|
/// A macro. This includes the full name of the macro, so that there are no clashes.
|
||||||
Macros(String),
|
Macros(String),
|
||||||
/// call to `quote!`
|
/// call to `quote!`
|
||||||
QuoteExpansion,
|
QuoteExpansion,
|
||||||
|
|
|
@ -23,7 +23,7 @@ LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the t
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: expected one of `move`, `|`, or `||`, found `<eof>`
|
error: expected one of `move`, `|`, or `||`, found `<eof>`
|
||||||
--> <passes_ident macros>:1:22
|
--> <::edition_kw_macro_2015::passes_ident macros>:1:22
|
||||||
|
|
|
|
||||||
LL | ( $ i : ident ) => ( $ i )
|
LL | ( $ i : ident ) => ( $ i )
|
||||||
| ^^^ expected one of `move`, `|`, or `||` here
|
| ^^^ expected one of `move`, `|`, or `||` here
|
||||||
|
|
|
@ -23,7 +23,7 @@ LL | r#async = consumes_async_raw!(async); //~ ERROR no rules expected the t
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: expected one of `move`, `|`, or `||`, found `<eof>`
|
error: expected one of `move`, `|`, or `||`, found `<eof>`
|
||||||
--> <passes_ident macros>:1:22
|
--> <::edition_kw_macro_2018::passes_ident macros>:1:22
|
||||||
|
|
|
|
||||||
LL | ( $ i : ident ) => ( $ i )
|
LL | ( $ i : ident ) => ( $ i )
|
||||||
| ^^^ expected one of `move`, `|`, or `||` here
|
| ^^^ expected one of `move`, `|`, or `||` here
|
||||||
|
|
|
@ -60,7 +60,7 @@ LL | define_panic!();
|
||||||
= note: macro-expanded macros do not shadow
|
= note: macro-expanded macros do not shadow
|
||||||
|
|
||||||
error[E0659]: `panic` is ambiguous
|
error[E0659]: `panic` is ambiguous
|
||||||
--> <panic macros>:1:13
|
--> <::std::macros::panic macros>:1:13
|
||||||
|
|
|
|
||||||
LL | ( ) => ( { panic ! ( "explicit panic" ) } ) ; ( $ msg : expr ) => (
|
LL | ( ) => ( { panic ! ( "explicit panic" ) } ) ; ( $ msg : expr ) => (
|
||||||
| ^^^^^ ambiguous name
|
| ^^^^^ ambiguous name
|
||||||
|
|
|
@ -22,7 +22,7 @@ LL | | }
|
||||||
LL | ping!();
|
LL | ping!();
|
||||||
| -------- in this macro invocation
|
| -------- in this macro invocation
|
||||||
|
|
|
|
||||||
::: <ping macros>:1:1
|
::: <::ping::ping macros>:1:1
|
||||||
|
|
|
|
||||||
LL | ( ) => { pong ! ( ) ; }
|
LL | ( ) => { pong ! ( ) ; }
|
||||||
| -------------------------
|
| -------------------------
|
||||||
|
@ -42,7 +42,7 @@ LL | | }
|
||||||
LL | deep!();
|
LL | deep!();
|
||||||
| -------- in this macro invocation (#1)
|
| -------- in this macro invocation (#1)
|
||||||
|
|
|
|
||||||
::: <deep macros>:1:1
|
::: <::ping::deep macros>:1:1
|
||||||
|
|
|
|
||||||
LL | ( ) => { foo ! ( ) ; }
|
LL | ( ) => { foo ! ( ) ; }
|
||||||
| ------------------------
|
| ------------------------
|
||||||
|
@ -50,7 +50,7 @@ LL | ( ) => { foo ! ( ) ; }
|
||||||
| | in this macro invocation (#2)
|
| | in this macro invocation (#2)
|
||||||
| in this expansion of `deep!` (#1)
|
| in this expansion of `deep!` (#1)
|
||||||
|
|
|
|
||||||
::: <foo macros>:1:1
|
::: <::ping::foo macros>:1:1
|
||||||
|
|
|
|
||||||
LL | ( ) => { bar ! ( ) ; }
|
LL | ( ) => { bar ! ( ) ; }
|
||||||
| ------------------------
|
| ------------------------
|
||||||
|
@ -58,7 +58,7 @@ LL | ( ) => { bar ! ( ) ; }
|
||||||
| | in this macro invocation (#3)
|
| | in this macro invocation (#3)
|
||||||
| in this expansion of `foo!` (#2)
|
| in this expansion of `foo!` (#2)
|
||||||
|
|
|
|
||||||
::: <bar macros>:1:1
|
::: <::ping::bar macros>:1:1
|
||||||
|
|
|
|
||||||
LL | ( ) => { ping ! ( ) ; }
|
LL | ( ) => { ping ! ( ) ; }
|
||||||
| -------------------------
|
| -------------------------
|
||||||
|
@ -66,7 +66,7 @@ LL | ( ) => { ping ! ( ) ; }
|
||||||
| | in this macro invocation (#4)
|
| | in this macro invocation (#4)
|
||||||
| in this expansion of `bar!` (#3)
|
| in this expansion of `bar!` (#3)
|
||||||
|
|
|
|
||||||
::: <ping macros>:1:1
|
::: <::ping::ping macros>:1:1
|
||||||
|
|
|
|
||||||
LL | ( ) => { pong ! ( ) ; }
|
LL | ( ) => { pong ! ( ) ; }
|
||||||
| -------------------------
|
| -------------------------
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue