mirror of
https://github.com/serde-rs/serde.git
synced 2025-09-30 06:21:26 +00:00
Drop aster dependency
This commit is contained in:
parent
3bf8cda994
commit
bac593573c
@ -23,4 +23,4 @@ proc-macro = true
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
quote = "0.3.8"
|
quote = "0.3.8"
|
||||||
serde_codegen_internals = { version = "=0.13.0", default-features = false, path = "../serde_codegen_internals" }
|
serde_codegen_internals = { version = "=0.13.0", default-features = false, path = "../serde_codegen_internals" }
|
||||||
syn = { version = "0.11", features = ["aster", "visit"] }
|
syn = { version = "0.11", features = ["visit"] }
|
||||||
|
@ -1,10 +1,36 @@
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use syn::{self, aster, visit};
|
use syn::{self, visit};
|
||||||
|
|
||||||
use internals::ast::Item;
|
use internals::ast::Item;
|
||||||
use internals::attr;
|
use internals::attr;
|
||||||
|
|
||||||
|
macro_rules! path {
|
||||||
|
($first:ident $(:: $rest:ident)*) => {
|
||||||
|
syn::Path {
|
||||||
|
global: false,
|
||||||
|
segments: vec![
|
||||||
|
stringify!($first).into(),
|
||||||
|
$(
|
||||||
|
stringify!($rest).into(),
|
||||||
|
)*
|
||||||
|
],
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
(::$first:ident $(:: $rest:ident)*) => {
|
||||||
|
syn::Path {
|
||||||
|
global: true,
|
||||||
|
segments: vec![
|
||||||
|
stringify!($first).into(),
|
||||||
|
$(
|
||||||
|
stringify!($rest).into(),
|
||||||
|
)*
|
||||||
|
],
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// Remove the default from every type parameter because in the generated impls
|
// Remove the default from every type parameter because in the generated impls
|
||||||
// they look like associated types: "error: associated type bindings are not
|
// they look like associated types: "error: associated type bindings are not
|
||||||
// allowed here".
|
// allowed here".
|
||||||
@ -21,9 +47,9 @@ pub fn without_defaults(generics: &syn::Generics) -> syn::Generics {
|
|||||||
pub fn with_where_predicates(generics: &syn::Generics,
|
pub fn with_where_predicates(generics: &syn::Generics,
|
||||||
predicates: &[syn::WherePredicate])
|
predicates: &[syn::WherePredicate])
|
||||||
-> syn::Generics {
|
-> syn::Generics {
|
||||||
aster::from_generics(generics.clone())
|
let mut generics = generics.clone();
|
||||||
.with_predicates(predicates.to_vec())
|
generics.where_clause.predicates.extend_from_slice(predicates);
|
||||||
.build()
|
generics
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_where_predicates_from_fields<F>(item: &Item,
|
pub fn with_where_predicates_from_fields<F>(item: &Item,
|
||||||
@ -32,12 +58,14 @@ pub fn with_where_predicates_from_fields<F>(item: &Item,
|
|||||||
-> syn::Generics
|
-> syn::Generics
|
||||||
where F: Fn(&attr::Field) -> Option<&[syn::WherePredicate]>
|
where F: Fn(&attr::Field) -> Option<&[syn::WherePredicate]>
|
||||||
{
|
{
|
||||||
aster::from_generics(generics.clone())
|
let predicates = item.body
|
||||||
.with_predicates(item.body
|
.all_fields()
|
||||||
.all_fields()
|
.flat_map(|field| from_field(&field.attrs))
|
||||||
.flat_map(|field| from_field(&field.attrs))
|
.flat_map(|predicates| predicates.to_vec());
|
||||||
.flat_map(|predicates| predicates.to_vec()))
|
|
||||||
.build()
|
let mut generics = generics.clone();
|
||||||
|
generics.where_clause.predicates.extend(predicates);
|
||||||
|
generics
|
||||||
}
|
}
|
||||||
|
|
||||||
// Puts the given bound on any generic type parameters that are used in fields
|
// Puts the given bound on any generic type parameters that are used in fields
|
||||||
@ -104,18 +132,50 @@ pub fn with_bound<F>(item: &Item,
|
|||||||
visit::walk_ty(&mut visitor, ty);
|
visit::walk_ty(&mut visitor, ty);
|
||||||
}
|
}
|
||||||
|
|
||||||
aster::from_generics(generics.clone())
|
let new_predicates = generics.ty_params
|
||||||
.with_predicates(generics.ty_params
|
.iter()
|
||||||
.iter()
|
.map(|ty_param| ty_param.ident.clone())
|
||||||
.map(|ty_param| ty_param.ident.clone())
|
.filter(|id| visitor.relevant_ty_params.contains(id))
|
||||||
.filter(|id| visitor.relevant_ty_params.contains(id))
|
.map(|id| {
|
||||||
.map(|id| {
|
syn::WherePredicate::BoundPredicate(syn::WhereBoundPredicate {
|
||||||
aster::where_predicate()
|
bound_lifetimes: Vec::new(),
|
||||||
// the type parameter that is being bounded e.g. T
|
// the type parameter that is being bounded e.g. T
|
||||||
.bound().build(aster::ty().id(id))
|
bounded_ty: syn::Ty::Path(None, id.into()),
|
||||||
// the bound e.g. Serialize
|
// the bound e.g. Serialize
|
||||||
.bound().trait_(bound.clone()).build()
|
bounds: vec![syn::TyParamBound::Trait(
|
||||||
.build()
|
syn::PolyTraitRef {
|
||||||
}))
|
bound_lifetimes: Vec::new(),
|
||||||
.build()
|
trait_ref: bound.clone(),
|
||||||
|
},
|
||||||
|
syn::TraitBoundModifier::None
|
||||||
|
)],
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut generics = generics.clone();
|
||||||
|
generics.where_clause.predicates.extend(new_predicates);
|
||||||
|
generics
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with_lifetime_bound(generics: &syn::Generics,
|
||||||
|
lifetime: &str)
|
||||||
|
-> syn::Generics {
|
||||||
|
let mut generics = generics.clone();
|
||||||
|
|
||||||
|
for lifetime_def in &mut generics.lifetimes {
|
||||||
|
lifetime_def.bounds.push(syn::Lifetime::new(lifetime));
|
||||||
|
}
|
||||||
|
|
||||||
|
for ty_param in &mut generics.ty_params {
|
||||||
|
ty_param.bounds.push(syn::TyParamBound::Region(syn::Lifetime::new(lifetime)));
|
||||||
|
}
|
||||||
|
|
||||||
|
generics.lifetimes.push(syn::LifetimeDef {
|
||||||
|
attrs: Vec::new(),
|
||||||
|
lifetime: syn::Lifetime::new(lifetime),
|
||||||
|
bounds: Vec::new(),
|
||||||
|
});
|
||||||
|
|
||||||
|
generics
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use syn::{self, aster, Ident};
|
use syn::{self, Ident};
|
||||||
use quote::{self, Tokens};
|
use quote::{self, Tokens};
|
||||||
|
|
||||||
use bound;
|
use bound;
|
||||||
@ -41,7 +41,7 @@ fn build_generics(item: &Item) -> syn::Generics {
|
|||||||
let generics = bound::without_defaults(item.generics);
|
let generics = bound::without_defaults(item.generics);
|
||||||
|
|
||||||
let generics =
|
let generics =
|
||||||
bound::with_where_predicates_from_fields(item, &generics, |attrs| attrs.de_bound());
|
bound::with_where_predicates_from_fields(item, &generics, attr::Field::de_bound);
|
||||||
|
|
||||||
match item.attrs.de_bound() {
|
match item.attrs.de_bound() {
|
||||||
Some(predicates) => bound::with_where_predicates(&generics, predicates),
|
Some(predicates) => bound::with_where_predicates(&generics, predicates),
|
||||||
@ -50,11 +50,11 @@ fn build_generics(item: &Item) -> syn::Generics {
|
|||||||
bound::with_bound(item,
|
bound::with_bound(item,
|
||||||
&generics,
|
&generics,
|
||||||
needs_deserialize_bound,
|
needs_deserialize_bound,
|
||||||
&aster::path().ids(&["_serde", "Deserialize"]).build());
|
&path!(_serde::Deserialize));
|
||||||
bound::with_bound(item,
|
bound::with_bound(item,
|
||||||
&generics,
|
&generics,
|
||||||
requires_default,
|
requires_default,
|
||||||
&aster::path().global().ids(&["std", "default", "Default"]).build())
|
&path!(_serde::export::Default))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ extern crate serde_codegen_internals as internals;
|
|||||||
extern crate proc_macro;
|
extern crate proc_macro;
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
mod bound;
|
mod bound;
|
||||||
mod de;
|
mod de;
|
||||||
mod ser;
|
mod ser;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use syn::{self, aster, Ident};
|
use syn::{self, Ident};
|
||||||
use quote::Tokens;
|
use quote::Tokens;
|
||||||
|
|
||||||
use bound;
|
use bound;
|
||||||
@ -38,7 +38,7 @@ fn build_generics(item: &Item) -> syn::Generics {
|
|||||||
let generics = bound::without_defaults(item.generics);
|
let generics = bound::without_defaults(item.generics);
|
||||||
|
|
||||||
let generics =
|
let generics =
|
||||||
bound::with_where_predicates_from_fields(item, &generics, |attrs| attrs.ser_bound());
|
bound::with_where_predicates_from_fields(item, &generics, attr::Field::ser_bound);
|
||||||
|
|
||||||
match item.attrs.ser_bound() {
|
match item.attrs.ser_bound() {
|
||||||
Some(predicates) => bound::with_where_predicates(&generics, predicates),
|
Some(predicates) => bound::with_where_predicates(&generics, predicates),
|
||||||
@ -46,7 +46,7 @@ fn build_generics(item: &Item) -> syn::Generics {
|
|||||||
bound::with_bound(item,
|
bound::with_bound(item,
|
||||||
&generics,
|
&generics,
|
||||||
needs_serialize_bound,
|
needs_serialize_bound,
|
||||||
&aster::path().ids(&["_serde", "Serialize"]).build())
|
&path!(_serde::Serialize))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -469,11 +469,7 @@ fn serialize_adjacently_tagged_variant(ident: &syn::Ident,
|
|||||||
|
|
||||||
let (_, ty_generics, where_clause) = generics.split_for_impl();
|
let (_, ty_generics, where_clause) = generics.split_for_impl();
|
||||||
|
|
||||||
let wrapper_generics = aster::from_generics(generics.clone())
|
let wrapper_generics = bound::with_lifetime_bound(generics, "'__a");
|
||||||
.add_lifetime_bound("'__a")
|
|
||||||
.lifetime_name("'__a")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();
|
let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();
|
||||||
|
|
||||||
quote!({
|
quote!({
|
||||||
@ -771,11 +767,7 @@ fn wrap_serialize_with(ident: &syn::Ident,
|
|||||||
-> Tokens {
|
-> Tokens {
|
||||||
let (_, ty_generics, where_clause) = generics.split_for_impl();
|
let (_, ty_generics, where_clause) = generics.split_for_impl();
|
||||||
|
|
||||||
let wrapper_generics = aster::from_generics(generics.clone())
|
let wrapper_generics = bound::with_lifetime_bound(generics, "'__a");
|
||||||
.add_lifetime_bound("'__a")
|
|
||||||
.lifetime_name("'__a")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();
|
let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();
|
||||||
|
|
||||||
quote!({
|
quote!({
|
||||||
|
Loading…
x
Reference in New Issue
Block a user