Skip to content

Commit 32e5acb

Browse files
committed
proc_macro: Turn quote into a regular built-in macro
Previously in was implemented using a special hack in the metadata loader
1 parent 9b91b9c commit 32e5acb

File tree

6 files changed

+19
-17
lines changed

6 files changed

+19
-17
lines changed

src/libproc_macro/lib.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@
1919

2020
#![feature(nll)]
2121
#![feature(staged_api)]
22+
#![feature(allow_internal_unstable)]
2223
#![feature(const_fn)]
24+
#![feature(decl_macro)]
2325
#![feature(extern_types)]
2426
#![feature(in_band_lifetimes)]
2527
#![feature(optin_builtin_traits)]
2628
#![feature(mem_take)]
2729
#![feature(non_exhaustive)]
30+
#![feature(rustc_attrs)]
2831
#![feature(specialization)]
2932

3033
#![recursion_limit="256"]
@@ -222,11 +225,10 @@ pub mod token_stream {
222225
///
223226
/// Unquoting is done with `$`, and works by taking the single next ident as the unquoted term.
224227
/// To quote `$` itself, use `$$`.
225-
///
226-
/// This is a dummy macro, the actual implementation is in `quote::quote`.`
227228
#[unstable(feature = "proc_macro_quote", issue = "54722")]
228-
#[macro_export]
229-
macro_rules! quote { () => {} }
229+
#[allow_internal_unstable(proc_macro_def_site)]
230+
#[cfg_attr(not(bootstrap), rustc_builtin_macro)]
231+
pub macro quote ($($t:tt)*) { /* compiler built-in */ }
230232

231233
#[unstable(feature = "proc_macro_internals", issue = "27812")]
232234
#[doc(hidden)]

src/libproc_macro/quote.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ macro_rules! quote {
5757
}
5858

5959
/// Quote a `TokenStream` into a `TokenStream`.
60-
/// This is the actual `quote!()` proc macro.
60+
/// This is the actual implementation of the `quote!()` proc macro.
6161
///
62-
/// It is manually loaded in `CStore::load_macro_untracked`.
62+
/// It is loaded by the compiler in `register_builtin_macros`.
6363
#[unstable(feature = "proc_macro_quote", issue = "54722")]
6464
pub fn quote(stream: TokenStream) -> TokenStream {
6565
if stream.is_empty() {

src/librustc_metadata/cstore_impl.rs

+1-11
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,9 @@ use syntax::ast;
3030
use syntax::attr;
3131
use syntax::source_map;
3232
use syntax::edition::Edition;
33-
use syntax::ext::base::{SyntaxExtension, SyntaxExtensionKind};
34-
use syntax::ext::proc_macro::BangProcMacro;
3533
use syntax::parse::source_file_to_stream;
3634
use syntax::parse::parser::emit_unclosed_delims;
37-
use syntax::symbol::{Symbol, sym};
35+
use syntax::symbol::Symbol;
3836
use syntax_pos::{Span, FileName};
3937
use rustc_data_structures::bit_set::BitSet;
4038

@@ -437,14 +435,6 @@ impl cstore::CStore {
437435
let data = self.get_crate_data(id.krate);
438436
if data.is_proc_macro_crate() {
439437
return LoadedMacro::ProcMacro(data.get_proc_macro(id.index, sess).ext);
440-
} else if data.name == sym::proc_macro && data.item_name(id.index) == sym::quote {
441-
let client = proc_macro::bridge::client::Client::expand1(proc_macro::quote);
442-
let kind = SyntaxExtensionKind::Bang(Box::new(BangProcMacro { client }));
443-
let ext = SyntaxExtension {
444-
allow_internal_unstable: Some([sym::proc_macro_def_site][..].into()),
445-
..SyntaxExtension::default(kind, data.root.edition)
446-
};
447-
return LoadedMacro::ProcMacro(Lrc::new(ext));
448438
}
449439

450440
let def = data.get_macro(id.index);

src/libsyntax_ext/lib.rs

+8
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@
77
#![feature(decl_macro)]
88
#![feature(mem_take)]
99
#![feature(nll)]
10+
#![feature(proc_macro_internals)]
11+
#![feature(proc_macro_quote)]
1012
#![feature(rustc_diagnostic_macros)]
1113

14+
extern crate proc_macro;
15+
1216
use crate::deriving::*;
1317

1418
use syntax::ast::Ident;
1519
use syntax::edition::Edition;
1620
use syntax::ext::base::{SyntaxExtension, SyntaxExtensionKind, MacroExpanderFn};
21+
use syntax::ext::proc_macro::BangProcMacro;
1722
use syntax::symbol::sym;
1823

1924
mod error_codes;
@@ -100,4 +105,7 @@ pub fn register_builtin_macros(resolver: &mut dyn syntax::ext::base::Resolver, e
100105
RustcDecodable: decodable::expand_deriving_rustc_decodable,
101106
RustcEncodable: encodable::expand_deriving_rustc_encodable,
102107
}
108+
109+
let client = proc_macro::bridge::client::Client::expand1(proc_macro::quote);
110+
register(sym::quote, SyntaxExtensionKind::Bang(Box::new(BangProcMacro { client })));
103111
}

src/test/ui/auxiliary/cond_plugin.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#![crate_type = "proc-macro"]
55
#![feature(proc_macro_hygiene)]
6+
#![feature(proc_macro_quote)]
67

78
extern crate proc_macro;
89

src/test/ui/auxiliary/proc_macro_def.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#![crate_type = "proc-macro"]
55
#![feature(proc_macro_hygiene)]
6+
#![feature(proc_macro_quote)]
67

78
extern crate proc_macro;
89

0 commit comments

Comments
 (0)