Remove with-syntex feature of serde_codegen
This commit is contained in:
parent
d7dadd83b6
commit
a5b8e806f8
@ -11,22 +11,14 @@ keywords = ["serde", "serialization"]
|
||||
include = ["Cargo.toml", "src/**/*.rs"]
|
||||
|
||||
[features]
|
||||
default = ["with-syntex"]
|
||||
unstable = []
|
||||
unstable-testing = ["clippy"]
|
||||
with-syntex = [
|
||||
"syntex",
|
||||
"syntex_syntax",
|
||||
]
|
||||
with-syn = []
|
||||
|
||||
[dependencies]
|
||||
clippy = { version = "0.*", optional = true }
|
||||
quote = "0.3.8"
|
||||
serde_codegen_internals = { version = "=0.11.3", default-features = false, path = "../serde_codegen_internals" }
|
||||
syn = { version = "0.10", features = ["aster", "visit"] }
|
||||
syntex = { version = "0.54", optional = true }
|
||||
syntex_syntax = { version = "0.54", optional = true }
|
||||
|
||||
[badges]
|
||||
travis-ci = { repository = "serde-rs/serde" }
|
||||
|
@ -8,153 +8,14 @@
|
||||
|
||||
extern crate serde_codegen_internals as internals;
|
||||
|
||||
#[cfg(feature = "with-syntex")]
|
||||
extern crate syntex;
|
||||
|
||||
#[cfg(feature = "with-syntex")]
|
||||
extern crate syntex_syntax as syntax;
|
||||
|
||||
extern crate syn;
|
||||
#[macro_use]
|
||||
extern crate quote;
|
||||
|
||||
#[cfg(feature = "with-syntex")]
|
||||
use std::path::Path;
|
||||
|
||||
mod bound;
|
||||
mod de;
|
||||
mod ser;
|
||||
|
||||
#[cfg(feature = "with-syntex")]
|
||||
fn syntex_registry() -> syntex::Registry {
|
||||
use syntax::{ast, fold};
|
||||
|
||||
/// Strip the serde attributes from the crate.
|
||||
#[cfg(feature = "with-syntex")]
|
||||
fn strip_attributes(krate: ast::Crate) -> ast::Crate {
|
||||
/// Helper folder that strips the serde attributes after the extensions have been expanded.
|
||||
struct StripAttributeFolder;
|
||||
|
||||
impl fold::Folder for StripAttributeFolder {
|
||||
fn fold_attribute(&mut self, attr: ast::Attribute) -> Option<ast::Attribute> {
|
||||
if attr.value.name == "serde" {
|
||||
if let ast::MetaItemKind::List(..) = attr.value.node {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
Some(attr)
|
||||
}
|
||||
|
||||
fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac {
|
||||
fold::noop_fold_mac(mac, self)
|
||||
}
|
||||
}
|
||||
|
||||
fold::Folder::fold_crate(&mut StripAttributeFolder, krate)
|
||||
}
|
||||
|
||||
let mut reg = syntex::Registry::new();
|
||||
|
||||
reg.add_attr("feature(custom_derive)");
|
||||
reg.add_attr("feature(custom_attribute)");
|
||||
|
||||
reg.add_decorator("derive_Serialize", shim::expand_derive_serialize);
|
||||
reg.add_decorator("derive_Deserialize", shim::expand_derive_deserialize);
|
||||
|
||||
reg.add_post_expansion_pass(strip_attributes);
|
||||
|
||||
reg
|
||||
}
|
||||
|
||||
#[cfg(feature = "with-syntex")]
|
||||
pub fn expand_str(src: &str) -> Result<String, syntex::Error> {
|
||||
let src = src.to_owned();
|
||||
|
||||
let expand_thread = move || {
|
||||
syntex_registry().expand_str("", "", &src)
|
||||
};
|
||||
|
||||
syntex::with_extra_stack(expand_thread)
|
||||
}
|
||||
|
||||
#[cfg(feature = "with-syntex")]
|
||||
pub fn expand<S, D>(src: S, dst: D) -> Result<(), syntex::Error>
|
||||
where S: AsRef<Path>,
|
||||
D: AsRef<Path>,
|
||||
{
|
||||
let src = src.as_ref().to_owned();
|
||||
let dst = dst.as_ref().to_owned();
|
||||
|
||||
let expand_thread = move || {
|
||||
syntex_registry().expand("", src, dst)
|
||||
};
|
||||
|
||||
syntex::with_extra_stack(expand_thread)
|
||||
}
|
||||
|
||||
macro_rules! shim {
|
||||
($name:ident $pkg:ident :: $func:ident) => {
|
||||
pub fn $func(
|
||||
cx: &mut ::syntax::ext::base::ExtCtxt,
|
||||
span: ::syntax::codemap::Span,
|
||||
meta_item: &::syntax::ast::MetaItem,
|
||||
annotatable: &::syntax::ext::base::Annotatable,
|
||||
push: &mut FnMut(::syntax::ext::base::Annotatable)
|
||||
) {
|
||||
let item = match *annotatable {
|
||||
::syntax::ext::base::Annotatable::Item(ref item) => item,
|
||||
_ => {
|
||||
cx.span_err(
|
||||
meta_item.span,
|
||||
concat!("`#[derive(",
|
||||
stringify!($name),
|
||||
")]` may only be applied to structs and enums"));
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
use syntax::{attr, ast, visit};
|
||||
struct MarkSerdeAttributesUsed;
|
||||
impl<'a> visit::Visitor<'a> for MarkSerdeAttributesUsed {
|
||||
fn visit_attribute(&mut self, attr: &ast::Attribute) {
|
||||
if attr.value.name == "serde" {
|
||||
if let ast::MetaItemKind::List(..) = attr.value.node {
|
||||
attr::mark_used(attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
visit::walk_item(&mut MarkSerdeAttributesUsed, item);
|
||||
|
||||
use syntax::print::pprust;
|
||||
let s = pprust::item_to_string(item);
|
||||
|
||||
use {syn, $pkg};
|
||||
let syn_item = syn::parse_macro_input(&s).unwrap();
|
||||
let expanded = match $pkg::$func(&syn_item) {
|
||||
Ok(expanded) => expanded.to_string(),
|
||||
Err(msg) => {
|
||||
cx.span_err(span, &msg);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
use syntax::parse;
|
||||
let name = stringify!($name).to_string();
|
||||
let sess = cx.parse_sess;
|
||||
let impl_item = parse::parse_item_from_source_str(name, expanded, sess);
|
||||
push(::syntax::ext::base::Annotatable::Item(impl_item.unwrap().unwrap()));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[cfg(feature = "with-syntex")]
|
||||
mod shim {
|
||||
shim!(Serialize ser::expand_derive_serialize);
|
||||
shim!(Deserialize de::expand_derive_deserialize);
|
||||
}
|
||||
|
||||
#[cfg(feature = "with-syn")]
|
||||
#[doc(hidden)]
|
||||
/// Not public API. Use the serde_derive crate.
|
||||
pub fn expand_derive_serialize(item: &str) -> Result<quote::Tokens, String> {
|
||||
@ -162,7 +23,6 @@ pub fn expand_derive_serialize(item: &str) -> Result<quote::Tokens, String> {
|
||||
ser::expand_derive_serialize(&syn_item)
|
||||
}
|
||||
|
||||
#[cfg(feature = "with-syn")]
|
||||
#[doc(hidden)]
|
||||
/// Not public API. Use the serde_derive crate.
|
||||
pub fn expand_derive_deserialize(item: &str) -> Result<quote::Tokens, String> {
|
||||
|
@ -17,11 +17,8 @@ travis-ci = { repository = "serde-rs/serde" }
|
||||
name = "serde_derive"
|
||||
proc-macro = true
|
||||
|
||||
[dependencies.serde_codegen]
|
||||
version = "=0.9.0"
|
||||
path = "../serde_codegen"
|
||||
default-features = false
|
||||
features = ["with-syn"]
|
||||
[dependencies]
|
||||
serde_codegen = { version = "=0.9.0", path = "../serde_codegen" }
|
||||
|
||||
[dev-dependencies]
|
||||
compiletest_rs = "0.2"
|
||||
|
Loading…
Reference in New Issue
Block a user