syntax: Rename variants of SyntaxExtension for consistency
This commit is contained in:
@@ -614,7 +614,7 @@ impl<'a> CrateLoader<'a> {
|
|||||||
match decl {
|
match decl {
|
||||||
ProcMacro::CustomDerive { trait_name, attributes, client } => {
|
ProcMacro::CustomDerive { trait_name, attributes, client } => {
|
||||||
let attrs = attributes.iter().cloned().map(Symbol::intern).collect::<Vec<_>>();
|
let attrs = attributes.iter().cloned().map(Symbol::intern).collect::<Vec<_>>();
|
||||||
(trait_name, SyntaxExtension::ProcMacroDerive(
|
(trait_name, SyntaxExtension::Derive(
|
||||||
Box::new(ProcMacroDerive {
|
Box::new(ProcMacroDerive {
|
||||||
client,
|
client,
|
||||||
attrs: attrs.clone(),
|
attrs: attrs.clone(),
|
||||||
@@ -624,13 +624,13 @@ impl<'a> CrateLoader<'a> {
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
ProcMacro::Attr { name, client } => {
|
ProcMacro::Attr { name, client } => {
|
||||||
(name, SyntaxExtension::AttrProcMacro(
|
(name, SyntaxExtension::Attr(
|
||||||
Box::new(AttrProcMacro { client }),
|
Box::new(AttrProcMacro { client }),
|
||||||
root.edition,
|
root.edition,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
ProcMacro::Bang { name, client } => {
|
ProcMacro::Bang { name, client } => {
|
||||||
(name, SyntaxExtension::ProcMacro {
|
(name, SyntaxExtension::Bang {
|
||||||
expander: Box::new(BangProcMacro { client }),
|
expander: Box::new(BangProcMacro { client }),
|
||||||
allow_internal_unstable: None,
|
allow_internal_unstable: None,
|
||||||
edition: root.edition,
|
edition: root.edition,
|
||||||
|
|||||||
@@ -430,7 +430,7 @@ impl cstore::CStore {
|
|||||||
use syntax_ext::proc_macro_impl::BangProcMacro;
|
use syntax_ext::proc_macro_impl::BangProcMacro;
|
||||||
|
|
||||||
let client = proc_macro::bridge::client::Client::expand1(proc_macro::quote);
|
let client = proc_macro::bridge::client::Client::expand1(proc_macro::quote);
|
||||||
let ext = SyntaxExtension::ProcMacro {
|
let ext = SyntaxExtension::Bang {
|
||||||
expander: Box::new(BangProcMacro { client }),
|
expander: Box::new(BangProcMacro { client }),
|
||||||
allow_internal_unstable: Some(vec![sym::proc_macro_def_site].into()),
|
allow_internal_unstable: Some(vec![sym::proc_macro_def_site].into()),
|
||||||
edition: data.root.edition,
|
edition: data.root.edition,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use rustc::lint::{EarlyLintPassObject, LateLintPassObject, LintId, Lint};
|
|||||||
use rustc::session::Session;
|
use rustc::session::Session;
|
||||||
use rustc::util::nodemap::FxHashMap;
|
use rustc::util::nodemap::FxHashMap;
|
||||||
|
|
||||||
use syntax::ext::base::{SyntaxExtension, NamedSyntaxExtension, NormalTT};
|
use syntax::ext::base::{SyntaxExtension, NamedSyntaxExtension};
|
||||||
use syntax::ext::base::MacroExpanderFn;
|
use syntax::ext::base::MacroExpanderFn;
|
||||||
use syntax::ext::hygiene::Transparency;
|
use syntax::ext::hygiene::Transparency;
|
||||||
use syntax::symbol::{Symbol, sym};
|
use syntax::symbol::{Symbol, sym};
|
||||||
@@ -89,7 +89,7 @@ impl<'a> Registry<'a> {
|
|||||||
if name == sym::macro_rules {
|
if name == sym::macro_rules {
|
||||||
panic!("user-defined macros may not be named `macro_rules`");
|
panic!("user-defined macros may not be named `macro_rules`");
|
||||||
}
|
}
|
||||||
if let NormalTT { def_info: ref mut def_info @ None, .. } = extension {
|
if let SyntaxExtension::LegacyBang { def_info: ref mut def_info @ None, .. } = extension {
|
||||||
*def_info = Some((ast::CRATE_NODE_ID, self.krate_span));
|
*def_info = Some((ast::CRATE_NODE_ID, self.krate_span));
|
||||||
}
|
}
|
||||||
self.syntax_exts.push((name, extension));
|
self.syntax_exts.push((name, extension));
|
||||||
@@ -98,10 +98,10 @@ impl<'a> Registry<'a> {
|
|||||||
/// Register a macro of the usual kind.
|
/// Register a macro of the usual kind.
|
||||||
///
|
///
|
||||||
/// This is a convenience wrapper for `register_syntax_extension`.
|
/// This is a convenience wrapper for `register_syntax_extension`.
|
||||||
/// It builds for you a `NormalTT` that calls `expander`,
|
/// It builds for you a `SyntaxExtension::LegacyBang` that calls `expander`,
|
||||||
/// and also takes care of interning the macro's name.
|
/// and also takes care of interning the macro's name.
|
||||||
pub fn register_macro(&mut self, name: &str, expander: MacroExpanderFn) {
|
pub fn register_macro(&mut self, name: &str, expander: MacroExpanderFn) {
|
||||||
self.register_syntax_extension(Symbol::intern(name), NormalTT {
|
self.register_syntax_extension(Symbol::intern(name), SyntaxExtension::LegacyBang {
|
||||||
expander: Box::new(expander),
|
expander: Box::new(expander),
|
||||||
def_info: None,
|
def_info: None,
|
||||||
transparency: Transparency::SemiTransparent,
|
transparency: Transparency::SemiTransparent,
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ impl<'a> base::Resolver for Resolver<'a> {
|
|||||||
fn check_unused_macros(&self) {
|
fn check_unused_macros(&self) {
|
||||||
for did in self.unused_macros.iter() {
|
for did in self.unused_macros.iter() {
|
||||||
let id_span = match *self.macro_map[did] {
|
let id_span = match *self.macro_map[did] {
|
||||||
SyntaxExtension::NormalTT { def_info, .. } => def_info,
|
SyntaxExtension::LegacyBang { def_info, .. } => def_info,
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
if let Some((id, span)) = id_span {
|
if let Some((id, span)) = id_span {
|
||||||
@@ -586,7 +586,7 @@ impl<'a> Resolver<'a> {
|
|||||||
match self.resolve_macro_to_res(derive, MacroKind::Derive,
|
match self.resolve_macro_to_res(derive, MacroKind::Derive,
|
||||||
&parent_scope, true, force) {
|
&parent_scope, true, force) {
|
||||||
Ok((_, ext)) => {
|
Ok((_, ext)) => {
|
||||||
if let SyntaxExtension::ProcMacroDerive(_, helpers, _) = &*ext {
|
if let SyntaxExtension::Derive(_, helpers, _) = &*ext {
|
||||||
if helpers.contains(&ident.name) {
|
if helpers.contains(&ident.name) {
|
||||||
let binding =
|
let binding =
|
||||||
(Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper),
|
(Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper),
|
||||||
|
|||||||
@@ -471,7 +471,7 @@ fn build_macro(cx: &DocContext<'_>, did: DefId, name: ast::Name) -> clean::ItemE
|
|||||||
}
|
}
|
||||||
LoadedMacro::ProcMacro(ext) => {
|
LoadedMacro::ProcMacro(ext) => {
|
||||||
let helpers = match &*ext {
|
let helpers = match &*ext {
|
||||||
&SyntaxExtension::ProcMacroDerive(_, ref syms, ..) => { syms.clean(cx) }
|
&SyntaxExtension::Derive(_, ref syms, ..) => { syms.clean(cx) }
|
||||||
_ => Vec::new(),
|
_ => Vec::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -433,7 +433,7 @@ fn macro_resolve(cx: &DocContext<'_>, path_str: &str) -> Option<Res> {
|
|||||||
if let Res::Def(DefKind::Macro(MacroKind::ProcMacroStub), _) = res {
|
if let Res::Def(DefKind::Macro(MacroKind::ProcMacroStub), _) = res {
|
||||||
// skip proc-macro stubs, they'll cause `get_macro` to crash
|
// skip proc-macro stubs, they'll cause `get_macro` to crash
|
||||||
} else {
|
} else {
|
||||||
if let SyntaxExtension::NormalTT { .. } = *resolver.get_macro(res) {
|
if let SyntaxExtension::LegacyBang { .. } = *resolver.get_macro(res) {
|
||||||
return Some(res.map_id(|_| panic!("unexpected id")));
|
return Some(res.map_id(|_| panic!("unexpected id")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
pub use SyntaxExtension::*;
|
|
||||||
|
|
||||||
use crate::ast::{self, Attribute, Name, PatKind};
|
use crate::ast::{self, Attribute, Name, PatKind};
|
||||||
use crate::attr::HasAttrs;
|
use crate::attr::HasAttrs;
|
||||||
use crate::source_map::{SourceMap, Spanned, respan};
|
use crate::source_map::{SourceMap, Spanned, respan};
|
||||||
@@ -553,7 +551,7 @@ impl MacroKind {
|
|||||||
/// An enum representing the different kinds of syntax extensions.
|
/// An enum representing the different kinds of syntax extensions.
|
||||||
pub enum SyntaxExtension {
|
pub enum SyntaxExtension {
|
||||||
/// A token-based function-like macro.
|
/// A token-based function-like macro.
|
||||||
ProcMacro {
|
Bang {
|
||||||
/// An expander with signature TokenStream -> TokenStream.
|
/// An expander with signature TokenStream -> TokenStream.
|
||||||
expander: Box<dyn ProcMacro + sync::Sync + sync::Send>,
|
expander: Box<dyn ProcMacro + sync::Sync + sync::Send>,
|
||||||
/// Whitelist of unstable features that are treated as stable inside this macro.
|
/// Whitelist of unstable features that are treated as stable inside this macro.
|
||||||
@@ -563,7 +561,7 @@ pub enum SyntaxExtension {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/// An AST-based function-like macro.
|
/// An AST-based function-like macro.
|
||||||
NormalTT {
|
LegacyBang {
|
||||||
/// An expander with signature TokenStream -> AST.
|
/// An expander with signature TokenStream -> AST.
|
||||||
expander: Box<dyn TTMacroExpander + sync::Sync + sync::Send>,
|
expander: Box<dyn TTMacroExpander + sync::Sync + sync::Send>,
|
||||||
/// Some info about the macro's definition point.
|
/// Some info about the macro's definition point.
|
||||||
@@ -583,7 +581,7 @@ pub enum SyntaxExtension {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/// A token-based attribute macro.
|
/// A token-based attribute macro.
|
||||||
AttrProcMacro(
|
Attr(
|
||||||
/// An expander with signature (TokenStream, TokenStream) -> TokenStream.
|
/// An expander with signature (TokenStream, TokenStream) -> TokenStream.
|
||||||
/// The first TokenSteam is the attribute itself, the second is the annotated item.
|
/// The first TokenSteam is the attribute itself, the second is the annotated item.
|
||||||
/// The produced TokenSteam replaces the input TokenSteam.
|
/// The produced TokenSteam replaces the input TokenSteam.
|
||||||
@@ -593,7 +591,7 @@ pub enum SyntaxExtension {
|
|||||||
),
|
),
|
||||||
|
|
||||||
/// An AST-based attribute macro.
|
/// An AST-based attribute macro.
|
||||||
MultiModifier(
|
LegacyAttr(
|
||||||
/// An expander with signature (AST, AST) -> AST.
|
/// An expander with signature (AST, AST) -> AST.
|
||||||
/// The first AST fragment is the attribute itself, the second is the annotated item.
|
/// The first AST fragment is the attribute itself, the second is the annotated item.
|
||||||
/// The produced AST fragment replaces the input AST fragment.
|
/// The produced AST fragment replaces the input AST fragment.
|
||||||
@@ -608,7 +606,7 @@ pub enum SyntaxExtension {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/// A token-based derive macro.
|
/// A token-based derive macro.
|
||||||
ProcMacroDerive(
|
Derive(
|
||||||
/// An expander with signature TokenStream -> TokenStream (not yet).
|
/// An expander with signature TokenStream -> TokenStream (not yet).
|
||||||
/// The produced TokenSteam is appended to the input TokenSteam.
|
/// The produced TokenSteam is appended to the input TokenSteam.
|
||||||
Box<dyn MultiItemModifier + sync::Sync + sync::Send>,
|
Box<dyn MultiItemModifier + sync::Sync + sync::Send>,
|
||||||
@@ -619,7 +617,7 @@ pub enum SyntaxExtension {
|
|||||||
),
|
),
|
||||||
|
|
||||||
/// An AST-based derive macro.
|
/// An AST-based derive macro.
|
||||||
BuiltinDerive(
|
LegacyDerive(
|
||||||
/// An expander with signature AST -> AST.
|
/// An expander with signature AST -> AST.
|
||||||
/// The produced AST fragment is appended to the input AST fragment.
|
/// The produced AST fragment is appended to the input AST fragment.
|
||||||
Box<dyn MultiItemModifier + sync::Sync + sync::Send>,
|
Box<dyn MultiItemModifier + sync::Sync + sync::Send>,
|
||||||
@@ -630,41 +628,38 @@ impl SyntaxExtension {
|
|||||||
/// Returns which kind of macro calls this syntax extension.
|
/// Returns which kind of macro calls this syntax extension.
|
||||||
pub fn kind(&self) -> MacroKind {
|
pub fn kind(&self) -> MacroKind {
|
||||||
match *self {
|
match *self {
|
||||||
SyntaxExtension::NormalTT { .. } |
|
SyntaxExtension::Bang { .. } |
|
||||||
SyntaxExtension::ProcMacro { .. } =>
|
SyntaxExtension::LegacyBang { .. } => MacroKind::Bang,
|
||||||
MacroKind::Bang,
|
SyntaxExtension::Attr(..) |
|
||||||
SyntaxExtension::NonMacroAttr { .. } |
|
SyntaxExtension::LegacyAttr(..) |
|
||||||
SyntaxExtension::MultiModifier(..) |
|
SyntaxExtension::NonMacroAttr { .. } => MacroKind::Attr,
|
||||||
SyntaxExtension::AttrProcMacro(..) =>
|
SyntaxExtension::Derive(..) |
|
||||||
MacroKind::Attr,
|
SyntaxExtension::LegacyDerive(..) => MacroKind::Derive,
|
||||||
SyntaxExtension::ProcMacroDerive(..) |
|
|
||||||
SyntaxExtension::BuiltinDerive(..) =>
|
|
||||||
MacroKind::Derive,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn default_transparency(&self) -> Transparency {
|
pub fn default_transparency(&self) -> Transparency {
|
||||||
match *self {
|
match *self {
|
||||||
SyntaxExtension::NormalTT { transparency, .. } => transparency,
|
SyntaxExtension::LegacyBang { transparency, .. } => transparency,
|
||||||
SyntaxExtension::ProcMacro { .. } |
|
SyntaxExtension::Bang { .. } |
|
||||||
SyntaxExtension::AttrProcMacro(..) |
|
SyntaxExtension::Attr(..) |
|
||||||
SyntaxExtension::ProcMacroDerive(..) |
|
SyntaxExtension::Derive(..) |
|
||||||
SyntaxExtension::NonMacroAttr { .. } => Transparency::Opaque,
|
SyntaxExtension::NonMacroAttr { .. } => Transparency::Opaque,
|
||||||
SyntaxExtension::MultiModifier(..) |
|
SyntaxExtension::LegacyAttr(..) |
|
||||||
SyntaxExtension::BuiltinDerive(..) => Transparency::SemiTransparent,
|
SyntaxExtension::LegacyDerive(..) => Transparency::SemiTransparent,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn edition(&self, default_edition: Edition) -> Edition {
|
pub fn edition(&self, default_edition: Edition) -> Edition {
|
||||||
match *self {
|
match *self {
|
||||||
SyntaxExtension::NormalTT { edition, .. } |
|
SyntaxExtension::Bang { edition, .. } |
|
||||||
SyntaxExtension::ProcMacro { edition, .. } |
|
SyntaxExtension::LegacyBang { edition, .. } |
|
||||||
SyntaxExtension::AttrProcMacro(.., edition) |
|
SyntaxExtension::Attr(.., edition) |
|
||||||
SyntaxExtension::ProcMacroDerive(.., edition) => edition,
|
SyntaxExtension::Derive(.., edition) => edition,
|
||||||
// Unstable legacy stuff
|
// Unstable legacy stuff
|
||||||
SyntaxExtension::NonMacroAttr { .. } |
|
SyntaxExtension::NonMacroAttr { .. } |
|
||||||
SyntaxExtension::MultiModifier(..) |
|
SyntaxExtension::LegacyAttr(..) |
|
||||||
SyntaxExtension::BuiltinDerive(..) => default_edition,
|
SyntaxExtension::LegacyDerive(..) => default_edition,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -389,7 +389,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
let item = match self.cx.resolver.resolve_macro_path(
|
let item = match self.cx.resolver.resolve_macro_path(
|
||||||
path, MacroKind::Derive, Mark::root(), Vec::new(), false) {
|
path, MacroKind::Derive, Mark::root(), Vec::new(), false) {
|
||||||
Ok(ext) => match *ext {
|
Ok(ext) => match *ext {
|
||||||
BuiltinDerive(..) => item_with_markers.clone(),
|
SyntaxExtension::LegacyDerive(..) => item_with_markers.clone(),
|
||||||
_ => item.clone(),
|
_ => item.clone(),
|
||||||
},
|
},
|
||||||
_ => item.clone(),
|
_ => item.clone(),
|
||||||
@@ -548,7 +548,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if let NonMacroAttr { mark_used: false } = *ext {} else {
|
if let SyntaxExtension::NonMacroAttr { mark_used: false } = *ext {} else {
|
||||||
// Macro attrs are always used when expanded,
|
// Macro attrs are always used when expanded,
|
||||||
// non-macro attrs are considered used when the field says so.
|
// non-macro attrs are considered used when the field says so.
|
||||||
attr::mark_used(&attr);
|
attr::mark_used(&attr);
|
||||||
@@ -564,18 +564,18 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
match *ext {
|
match *ext {
|
||||||
NonMacroAttr { .. } => {
|
SyntaxExtension::NonMacroAttr { .. } => {
|
||||||
attr::mark_known(&attr);
|
attr::mark_known(&attr);
|
||||||
item.visit_attrs(|attrs| attrs.push(attr));
|
item.visit_attrs(|attrs| attrs.push(attr));
|
||||||
Some(invoc.fragment_kind.expect_from_annotatables(iter::once(item)))
|
Some(invoc.fragment_kind.expect_from_annotatables(iter::once(item)))
|
||||||
}
|
}
|
||||||
MultiModifier(ref mac) => {
|
SyntaxExtension::LegacyAttr(ref mac) => {
|
||||||
let meta = attr.parse_meta(self.cx.parse_sess)
|
let meta = attr.parse_meta(self.cx.parse_sess)
|
||||||
.map_err(|mut e| { e.emit(); }).ok()?;
|
.map_err(|mut e| { e.emit(); }).ok()?;
|
||||||
let item = mac.expand(self.cx, attr.span, &meta, item);
|
let item = mac.expand(self.cx, attr.span, &meta, item);
|
||||||
Some(invoc.fragment_kind.expect_from_annotatables(item))
|
Some(invoc.fragment_kind.expect_from_annotatables(item))
|
||||||
}
|
}
|
||||||
AttrProcMacro(ref mac, ..) => {
|
SyntaxExtension::Attr(ref mac, ..) => {
|
||||||
self.gate_proc_macro_attr_item(attr.span, &item);
|
self.gate_proc_macro_attr_item(attr.span, &item);
|
||||||
let item_tok = TokenTree::token(token::Interpolated(Lrc::new(match item {
|
let item_tok = TokenTree::token(token::Interpolated(Lrc::new(match item {
|
||||||
Annotatable::Item(item) => token::NtItem(item),
|
Annotatable::Item(item) => token::NtItem(item),
|
||||||
@@ -592,7 +592,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
self.gate_proc_macro_expansion(attr.span, &res);
|
self.gate_proc_macro_expansion(attr.span, &res);
|
||||||
res
|
res
|
||||||
}
|
}
|
||||||
ProcMacroDerive(..) | BuiltinDerive(..) => {
|
SyntaxExtension::Derive(..) | SyntaxExtension::LegacyDerive(..) => {
|
||||||
self.cx.span_err(attr.span, &format!("`{}` is a derive macro", attr.path));
|
self.cx.span_err(attr.span, &format!("`{}` is a derive macro", attr.path));
|
||||||
self.cx.trace_macros_diag();
|
self.cx.trace_macros_diag();
|
||||||
invoc.fragment_kind.dummy(attr.span)
|
invoc.fragment_kind.dummy(attr.span)
|
||||||
@@ -747,7 +747,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let opt_expanded = match *ext {
|
let opt_expanded = match *ext {
|
||||||
NormalTT {
|
SyntaxExtension::LegacyBang {
|
||||||
ref expander,
|
ref expander,
|
||||||
def_info,
|
def_info,
|
||||||
ref allow_internal_unstable,
|
ref allow_internal_unstable,
|
||||||
@@ -774,20 +774,22 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MultiModifier(..) | AttrProcMacro(..) | SyntaxExtension::NonMacroAttr { .. } => {
|
SyntaxExtension::Attr(..) |
|
||||||
|
SyntaxExtension::LegacyAttr(..) |
|
||||||
|
SyntaxExtension::NonMacroAttr { .. } => {
|
||||||
self.cx.span_err(path.span,
|
self.cx.span_err(path.span,
|
||||||
&format!("`{}` can only be used in attributes", path));
|
&format!("`{}` can only be used in attributes", path));
|
||||||
self.cx.trace_macros_diag();
|
self.cx.trace_macros_diag();
|
||||||
kind.dummy(span)
|
kind.dummy(span)
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcMacroDerive(..) | BuiltinDerive(..) => {
|
SyntaxExtension::Derive(..) | SyntaxExtension::LegacyDerive(..) => {
|
||||||
self.cx.span_err(path.span, &format!("`{}` is a derive macro", path));
|
self.cx.span_err(path.span, &format!("`{}` is a derive macro", path));
|
||||||
self.cx.trace_macros_diag();
|
self.cx.trace_macros_diag();
|
||||||
kind.dummy(span)
|
kind.dummy(span)
|
||||||
}
|
}
|
||||||
|
|
||||||
SyntaxExtension::ProcMacro { ref expander, ref allow_internal_unstable, edition } => {
|
SyntaxExtension::Bang { ref expander, ref allow_internal_unstable, edition } => {
|
||||||
if ident.name != kw::Invalid {
|
if ident.name != kw::Invalid {
|
||||||
let msg =
|
let msg =
|
||||||
format!("macro {}! expects no ident argument, given '{}'", path, ident);
|
format!("macro {}! expects no ident argument, given '{}'", path, ident);
|
||||||
@@ -885,9 +887,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
match ext {
|
match ext {
|
||||||
ProcMacroDerive(expander, ..) | BuiltinDerive(expander) => {
|
SyntaxExtension::Derive(expander, ..) | SyntaxExtension::LegacyDerive(expander) => {
|
||||||
let meta = match ext {
|
let meta = match ext {
|
||||||
ProcMacroDerive(..) => ast::MetaItem { // FIXME(jseyfried) avoid this
|
SyntaxExtension::Derive(..) => ast::MetaItem { // FIXME(jseyfried) avoid this
|
||||||
path: Path::from_ident(Ident::invalid()),
|
path: Path::from_ident(Ident::invalid()),
|
||||||
span: DUMMY_SP,
|
span: DUMMY_SP,
|
||||||
node: ast::MetaItemKind::Word,
|
node: ast::MetaItemKind::Word,
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
use crate::{ast, attr};
|
use crate::{ast, attr};
|
||||||
use crate::edition::Edition;
|
use crate::edition::Edition;
|
||||||
use crate::ext::base::{DummyResult, ExtCtxt, MacResult, SyntaxExtension};
|
use crate::ext::base::{DummyResult, ExtCtxt, MacResult, SyntaxExtension, TTMacroExpander};
|
||||||
use crate::ext::base::{NormalTT, TTMacroExpander};
|
|
||||||
use crate::ext::expand::{AstFragment, AstFragmentKind};
|
use crate::ext::expand::{AstFragment, AstFragmentKind};
|
||||||
use crate::ext::hygiene::Transparency;
|
use crate::ext::hygiene::Transparency;
|
||||||
use crate::ext::tt::macro_parser::{Success, Error, Failure};
|
use crate::ext::tt::macro_parser::{Success, Error, Failure};
|
||||||
@@ -425,7 +424,7 @@ pub fn compile(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
NormalTT {
|
SyntaxExtension::LegacyBang {
|
||||||
expander,
|
expander,
|
||||||
def_info: Some((def.id, def.span)),
|
def_info: Some((def.id, def.span)),
|
||||||
transparency,
|
transparency,
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ macro_rules! derive_traits {
|
|||||||
$(
|
$(
|
||||||
resolver.add_builtin(
|
resolver.add_builtin(
|
||||||
ast::Ident::with_empty_ctxt(Symbol::intern($name)),
|
ast::Ident::with_empty_ctxt(Symbol::intern($name)),
|
||||||
Lrc::new(SyntaxExtension::BuiltinDerive(Box::new(BuiltinDerive($func))))
|
Lrc::new(SyntaxExtension::LegacyDerive(Box::new(BuiltinDerive($func))))
|
||||||
);
|
);
|
||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ pub mod proc_macro_impl;
|
|||||||
|
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
use syntax::ext::base::{MacroExpanderFn, NormalTT, NamedSyntaxExtension, MultiModifier};
|
|
||||||
|
use syntax::ext::base::{MacroExpanderFn, NamedSyntaxExtension, SyntaxExtension};
|
||||||
use syntax::ext::hygiene::Transparency;
|
use syntax::ext::hygiene::Transparency;
|
||||||
use syntax::edition::Edition;
|
use syntax::edition::Edition;
|
||||||
use syntax::symbol::{sym, Symbol};
|
use syntax::symbol::{sym, Symbol};
|
||||||
@@ -57,7 +58,7 @@ pub fn register_builtins(resolver: &mut dyn syntax::ext::base::Resolver,
|
|||||||
macro_rules! register {
|
macro_rules! register {
|
||||||
($( $name:ident: $f:expr, )*) => { $(
|
($( $name:ident: $f:expr, )*) => { $(
|
||||||
register(Symbol::intern(stringify!($name)),
|
register(Symbol::intern(stringify!($name)),
|
||||||
NormalTT {
|
SyntaxExtension::LegacyBang {
|
||||||
expander: Box::new($f as MacroExpanderFn),
|
expander: Box::new($f as MacroExpanderFn),
|
||||||
def_info: None,
|
def_info: None,
|
||||||
transparency: Transparency::SemiTransparent,
|
transparency: Transparency::SemiTransparent,
|
||||||
@@ -95,13 +96,13 @@ pub fn register_builtins(resolver: &mut dyn syntax::ext::base::Resolver,
|
|||||||
assert: assert::expand_assert,
|
assert: assert::expand_assert,
|
||||||
}
|
}
|
||||||
|
|
||||||
register(sym::test_case, MultiModifier(Box::new(test_case::expand)));
|
register(sym::test_case, SyntaxExtension::LegacyAttr(Box::new(test_case::expand)));
|
||||||
register(sym::test, MultiModifier(Box::new(test::expand_test)));
|
register(sym::test, SyntaxExtension::LegacyAttr(Box::new(test::expand_test)));
|
||||||
register(sym::bench, MultiModifier(Box::new(test::expand_bench)));
|
register(sym::bench, SyntaxExtension::LegacyAttr(Box::new(test::expand_bench)));
|
||||||
|
|
||||||
// format_args uses `unstable` things internally.
|
// format_args uses `unstable` things internally.
|
||||||
register(Symbol::intern("format_args"),
|
register(Symbol::intern("format_args"),
|
||||||
NormalTT {
|
SyntaxExtension::LegacyBang {
|
||||||
expander: Box::new(format::expand_format_args),
|
expander: Box::new(format::expand_format_args),
|
||||||
def_info: None,
|
def_info: None,
|
||||||
transparency: Transparency::SemiTransparent,
|
transparency: Transparency::SemiTransparent,
|
||||||
@@ -112,7 +113,7 @@ pub fn register_builtins(resolver: &mut dyn syntax::ext::base::Resolver,
|
|||||||
edition,
|
edition,
|
||||||
});
|
});
|
||||||
register(sym::format_args_nl,
|
register(sym::format_args_nl,
|
||||||
NormalTT {
|
SyntaxExtension::LegacyBang {
|
||||||
expander: Box::new(format::expand_format_args_nl),
|
expander: Box::new(format::expand_format_args_nl),
|
||||||
def_info: None,
|
def_info: None,
|
||||||
transparency: Transparency::SemiTransparent,
|
transparency: Transparency::SemiTransparent,
|
||||||
|
|||||||
@@ -10,12 +10,10 @@ extern crate rustc_plugin;
|
|||||||
|
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
use syntax::ext::hygiene;
|
|
||||||
use syntax::ext::build::AstBuilder;
|
use syntax::ext::build::AstBuilder;
|
||||||
use syntax::ext::base::{TTMacroExpander, ExtCtxt, MacResult, MacEager, NormalTT};
|
use syntax::ext::base::{SyntaxExtension, TTMacroExpander, ExtCtxt, MacResult, MacEager};
|
||||||
use syntax::ext::hygiene::Transparency;
|
use syntax::ext::hygiene::Transparency;
|
||||||
use syntax::print::pprust;
|
use syntax::print::pprust;
|
||||||
use syntax::ptr::P;
|
|
||||||
use syntax::symbol::Symbol;
|
use syntax::symbol::Symbol;
|
||||||
use syntax_pos::Span;
|
use syntax_pos::Span;
|
||||||
use syntax::tokenstream::TokenStream;
|
use syntax::tokenstream::TokenStream;
|
||||||
@@ -30,7 +28,7 @@ impl TTMacroExpander for Expander {
|
|||||||
ecx: &'cx mut ExtCtxt,
|
ecx: &'cx mut ExtCtxt,
|
||||||
sp: Span,
|
sp: Span,
|
||||||
_: TokenStream,
|
_: TokenStream,
|
||||||
_: Option<Span>) -> Box<MacResult+'cx> {
|
_: Option<Span>) -> Box<dyn MacResult+'cx> {
|
||||||
let args = self.args.iter().map(|i| pprust::meta_list_item_to_string(i))
|
let args = self.args.iter().map(|i| pprust::meta_list_item_to_string(i))
|
||||||
.collect::<Vec<_>>().join(", ");
|
.collect::<Vec<_>>().join(", ");
|
||||||
MacEager::expr(ecx.expr_str(sp, Symbol::intern(&args)))
|
MacEager::expr(ecx.expr_str(sp, Symbol::intern(&args)))
|
||||||
@@ -41,7 +39,7 @@ impl TTMacroExpander for Expander {
|
|||||||
pub fn plugin_registrar(reg: &mut Registry) {
|
pub fn plugin_registrar(reg: &mut Registry) {
|
||||||
let args = reg.args().to_owned();
|
let args = reg.args().to_owned();
|
||||||
reg.register_syntax_extension(Symbol::intern("plugin_args"),
|
reg.register_syntax_extension(Symbol::intern("plugin_args"),
|
||||||
NormalTT {
|
SyntaxExtension::LegacyBang {
|
||||||
expander: Box::new(Expander { args: args, }),
|
expander: Box::new(Expander { args: args, }),
|
||||||
def_info: None,
|
def_info: None,
|
||||||
transparency: Transparency::SemiTransparent,
|
transparency: Transparency::SemiTransparent,
|
||||||
|
|||||||
Reference in New Issue
Block a user