Skip to content

Commit b4d8a55

Browse files
committed
Change serde_path to crate
Also changed the generated code to have at least one thing refer to the path directly, rather than via `use` -- This shows that the impl *can* work without `use`, but doesn't actually do all the work to remove the `use` lines unless we decide we need this feature to work on the 2015 edition
1 parent 0e6ce8f commit b4d8a55

4 files changed

Lines changed: 20 additions & 12 deletions

File tree

serde_derive/src/de.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<TokenStream
6060
}
6161
};
6262

63-
Ok(dummy::wrap_in_const(cont.attrs.serde_path(), "DESERIALIZE", ident, impl_block))
63+
Ok(dummy::wrap_in_const(cont.attrs.custom_serde_path(), "DESERIALIZE", ident, impl_block))
6464
}
6565

6666
fn precondition(cx: &Ctxt, cont: &Container) {

serde_derive/src/internals/attr.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use internals::Ctxt;
22
use proc_macro2::{Group, Span, TokenStream, TokenTree};
33
use quote::ToTokens;
4+
use std::borrow::Cow;
45
use std::collections::BTreeSet;
56
use std::str::FromStr;
67
use syn;
@@ -299,7 +300,7 @@ impl Container {
299300
let mut remote = Attr::none(cx, "remote");
300301
let mut field_identifier = BoolAttr::none(cx, "field_identifier");
301302
let mut variant_identifier = BoolAttr::none(cx, "variant_identifier");
302-
let mut serde_path = Attr::none(cx, "serde_path");
303+
let mut serde_path = Attr::none(cx, "crate");
303304

304305
for meta_items in item.attrs.iter().filter_map(get_serde_meta_items) {
305306
for meta_item in meta_items {
@@ -584,8 +585,8 @@ impl Container {
584585
variant_identifier.set_true(word);
585586
}
586587

587-
// Parse `#[serde(serde_path = "foo")]`
588-
Meta(NameValue(ref m)) if m.ident == "serde_path" => {
588+
// Parse `#[serde(crate = "foo")]`
589+
Meta(NameValue(ref m)) if m.ident == "crate" => {
589590
if let Ok(path) = parse_lit_into_path(cx, &m.ident, &m.lit) {
590591
serde_path.set(&m.ident, path)
591592
}
@@ -682,9 +683,15 @@ impl Container {
682683
self.has_flatten = true;
683684
}
684685

685-
pub fn serde_path(&self) -> Option<&syn::Path> {
686+
pub fn custom_serde_path(&self) -> Option<&syn::Path> {
686687
self.serde_path.as_ref()
687688
}
689+
690+
pub fn serde_path<'a>(&'a self) -> Cow<'a, syn::Path> {
691+
self.custom_serde_path()
692+
.map(Cow::Borrowed)
693+
.unwrap_or_else(|| Cow::Owned(parse_quote!(_serde)))
694+
}
688695
}
689696

690697
fn decide_tag(

serde_derive/src/ser.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@ pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result<TokenStream,
2222
let params = Parameters::new(&cont);
2323
let (impl_generics, ty_generics, where_clause) = params.generics.split_for_impl();
2424
let body = Stmts(serialize_body(&cont, &params));
25+
let serde = cont.attrs.serde_path();
2526

2627
let impl_block = if let Some(remote) = cont.attrs.remote() {
2728
let vis = &input.vis;
2829
let used = pretend::pretend_used(&cont);
2930
quote! {
3031
impl #impl_generics #ident #ty_generics #where_clause {
31-
#vis fn serialize<__S>(__self: &#remote #ty_generics, __serializer: __S) -> _serde::export::Result<__S::Ok, __S::Error>
32+
#vis fn serialize<__S>(__self: &#remote #ty_generics, __serializer: __S) -> #serde::export::Result<__S::Ok, __S::Error>
3233
where
33-
__S: _serde::Serializer,
34+
__S: #serde::Serializer,
3435
{
3536
#used
3637
#body
@@ -40,18 +41,18 @@ pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result<TokenStream,
4041
} else {
4142
quote! {
4243
#[automatically_derived]
43-
impl #impl_generics _serde::Serialize for #ident #ty_generics #where_clause {
44-
fn serialize<__S>(&self, __serializer: __S) -> _serde::export::Result<__S::Ok, __S::Error>
44+
impl #impl_generics #serde::Serialize for #ident #ty_generics #where_clause {
45+
fn serialize<__S>(&self, __serializer: __S) -> #serde::export::Result<__S::Ok, __S::Error>
4546
where
46-
__S: _serde::Serializer,
47+
__S: #serde::Serializer,
4748
{
4849
#body
4950
}
5051
}
5152
}
5253
};
5354

54-
Ok(dummy::wrap_in_const(cont.attrs.serde_path(), "SERIALIZE", ident, impl_block))
55+
Ok(dummy::wrap_in_const(cont.attrs.custom_serde_path(), "SERIALIZE", ident, impl_block))
5556
}
5657

5758
fn precondition(cx: &Ctxt, cont: &Container) {

test_suite/tests/test_serde_path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#[test]
22
fn test_gen_custom_serde() {
33
#[derive(serde::Serialize, serde::Deserialize)]
4-
#[serde(serde_path = "fake_serde")]
4+
#[serde(crate = "fake_serde")]
55
struct Foo;
66

77
// Would be overlapping if serde::Serialize were implemented

0 commit comments

Comments
 (0)