Compare commits

..

2 Commits

Author SHA1 Message Date
David Tolnay af31449cb1 Run test suite on wa-serde-derive 2022-07-01 17:56:18 -07:00
David Tolnay 1afae183b0 Compile serde_derive to wasm 2022-07-01 17:55:51 -07:00
30 changed files with 110 additions and 105 deletions
-1
View File
@@ -1,7 +1,6 @@
[workspace] [workspace]
members = [ members = [
"serde", "serde",
"serde_derive",
"serde_derive_internals", "serde_derive_internals",
"serde_test", "serde_test",
"test_suite", "test_suite",
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde" name = "serde"
version = "1.0.140" # remember to update html_root_url and serde_derive dependency version = "1.0.137" # remember to update html_root_url and serde_derive dependency
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
rust-version = "1.13" rust-version = "1.13"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
@@ -15,7 +15,7 @@ include = ["build.rs", "src/**/*.rs", "crates-io.md", "README.md", "LICENSE-APAC
build = "build.rs" build = "build.rs"
[dependencies] [dependencies]
serde_derive = { version = "=1.0.140", optional = true, path = "../serde_derive" } serde_derive = { version = "=1.0.137", optional = true, path = "../serde_derive" }
[dev-dependencies] [dev-dependencies]
serde_derive = { version = "1.0", path = "../serde_derive" } serde_derive = { version = "1.0", path = "../serde_derive" }
-5
View File
@@ -708,11 +708,6 @@ impl<T> DeserializeOwned for T where T: for<'de> Deserialize<'de> {}
/// where /// where
/// A: SeqAccess<'de>, /// A: SeqAccess<'de>,
/// { /// {
/// // Decrease the number of reallocations if there are many elements
/// if let Some(size_hint) = seq.size_hint() {
/// self.0.reserve(size_hint);
/// }
///
/// // Visit each element in the inner array and push it onto /// // Visit each element in the inner array and push it onto
/// // the existing vector. /// // the existing vector.
/// while let Some(elem) = seq.next_element()? { /// while let Some(elem) = seq.next_element()? {
+8 -52
View File
@@ -128,7 +128,9 @@ where
type Deserializer = UnitDeserializer<E>; type Deserializer = UnitDeserializer<E>;
fn into_deserializer(self) -> UnitDeserializer<E> { fn into_deserializer(self) -> UnitDeserializer<E> {
UnitDeserializer::new() UnitDeserializer {
marker: PhantomData,
}
} }
} }
@@ -139,15 +141,6 @@ pub struct UnitDeserializer<E> {
impl_copy_clone!(UnitDeserializer); impl_copy_clone!(UnitDeserializer);
impl<E> UnitDeserializer<E> {
#[allow(missing_docs)]
pub fn new() -> Self {
UnitDeserializer {
marker: PhantomData,
}
}
}
impl<'de, E> de::Deserializer<'de> for UnitDeserializer<E> impl<'de, E> de::Deserializer<'de> for UnitDeserializer<E>
where where
E: de::Error, E: de::Error,
@@ -243,15 +236,8 @@ macro_rules! primitive_deserializer {
type Deserializer = $name<E>; type Deserializer = $name<E>;
fn into_deserializer(self) -> $name<E> { fn into_deserializer(self) -> $name<E> {
$name::new(self)
}
}
impl<E> $name<E> {
#[allow(missing_docs)]
pub fn new(value: $ty) -> Self {
$name { $name {
value: value, value: self,
marker: PhantomData, marker: PhantomData,
} }
} }
@@ -322,15 +308,8 @@ where
type Deserializer = U32Deserializer<E>; type Deserializer = U32Deserializer<E>;
fn into_deserializer(self) -> U32Deserializer<E> { fn into_deserializer(self) -> U32Deserializer<E> {
U32Deserializer::new(self)
}
}
impl<E> U32Deserializer<E> {
#[allow(missing_docs)]
pub fn new(value: u32) -> Self {
U32Deserializer { U32Deserializer {
value: value, value: self,
marker: PhantomData, marker: PhantomData,
} }
} }
@@ -411,15 +390,8 @@ where
type Deserializer = StrDeserializer<'a, E>; type Deserializer = StrDeserializer<'a, E>;
fn into_deserializer(self) -> StrDeserializer<'a, E> { fn into_deserializer(self) -> StrDeserializer<'a, E> {
StrDeserializer::new(self)
}
}
impl<'a, E> StrDeserializer<'a, E> {
#[allow(missing_docs)]
pub fn new(value: &'a str) -> Self {
StrDeserializer { StrDeserializer {
value: value, value: self,
marker: PhantomData, marker: PhantomData,
} }
} }
@@ -589,16 +561,8 @@ where
type Deserializer = StringDeserializer<E>; type Deserializer = StringDeserializer<E>;
fn into_deserializer(self) -> StringDeserializer<E> { fn into_deserializer(self) -> StringDeserializer<E> {
StringDeserializer::new(self)
}
}
#[cfg(any(feature = "std", feature = "alloc"))]
impl<E> StringDeserializer<E> {
#[allow(missing_docs)]
pub fn new(value: String) -> Self {
StringDeserializer { StringDeserializer {
value: value, value: self,
marker: PhantomData, marker: PhantomData,
} }
} }
@@ -692,16 +656,8 @@ where
type Deserializer = CowStrDeserializer<'a, E>; type Deserializer = CowStrDeserializer<'a, E>;
fn into_deserializer(self) -> CowStrDeserializer<'a, E> { fn into_deserializer(self) -> CowStrDeserializer<'a, E> {
CowStrDeserializer::new(self)
}
}
#[cfg(any(feature = "std", feature = "alloc"))]
impl<'a, E> CowStrDeserializer<'a, E> {
#[allow(missing_docs)]
pub fn new(value: Cow<'a, str>) -> Self {
CowStrDeserializer { CowStrDeserializer {
value: value, value: self,
marker: PhantomData, marker: PhantomData,
} }
} }
+1 -3
View File
@@ -84,7 +84,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Serde types in rustdoc of other crates get linked to here. // Serde types in rustdoc of other crates get linked to here.
#![doc(html_root_url = "https://docs.rs/serde/1.0.140")] #![doc(html_root_url = "https://docs.rs/serde/1.0.137")]
// Support using Serde without the standard library! // Support using Serde without the standard library!
#![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), no_std)]
// Unstable functionality only if the user asks for it. For tracking and // Unstable functionality only if the user asks for it. For tracking and
@@ -120,10 +120,8 @@
// correctly used // correctly used
derive_partial_eq_without_eq, derive_partial_eq_without_eq,
enum_glob_use, enum_glob_use,
explicit_auto_deref,
let_underscore_drop, let_underscore_drop,
map_err_ignore, map_err_ignore,
new_without_default,
result_unit_err, result_unit_err,
wildcard_imports, wildcard_imports,
// not practical // not practical
+7 -3
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_derive" name = "serde_derive"
version = "1.0.140" # remember to update html_root_url version = "1.0.137" # remember to update html_root_url
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
rust-version = "1.31" rust-version = "1.31"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
@@ -17,8 +17,7 @@ default = []
deserialize_in_place = [] deserialize_in_place = []
[lib] [lib]
name = "serde_derive" crate-type = ["cdylib"]
proc-macro = true
[dependencies] [dependencies]
proc-macro2 = "1.0" proc-macro2 = "1.0"
@@ -30,3 +29,8 @@ serde = { version = "1.0", path = "../serde" }
[package.metadata.docs.rs] [package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"] targets = ["x86_64-unknown-linux-gnu"]
[workspace]
[patch.crates-io]
proc-macro2 = { git = "https://github.com/dtolnay/watt" }
+4 -4
View File
@@ -13,14 +13,14 @@ fn main() {
// Underscore const names stabilized in Rust 1.37: // Underscore const names stabilized in Rust 1.37:
// https://blog.rust-lang.org/2019/08/15/Rust-1.37.0.html#using-unnamed-const-items-for-macros // https://blog.rust-lang.org/2019/08/15/Rust-1.37.0.html#using-unnamed-const-items-for-macros
if minor < 37 { if minor >= 37 {
println!("cargo:rustc-cfg=no_underscore_consts"); println!("cargo:rustc-cfg=underscore_consts");
} }
// The ptr::addr_of! macro stabilized in Rust 1.51: // The ptr::addr_of! macro stabilized in Rust 1.51:
// https://blog.rust-lang.org/2021/03/25/Rust-1.51.0.html#stabilized-apis // https://blog.rust-lang.org/2021/03/25/Rust-1.51.0.html#stabilized-apis
if minor < 51 { if minor >= 51 {
println!("cargo:rustc-cfg=no_ptr_addr_of"); println!("cargo:rustc-cfg=ptr_addr_of");
} }
} }
+3 -3
View File
@@ -12,10 +12,10 @@ pub fn wrap_in_const(
) -> TokenStream { ) -> TokenStream {
let try_replacement = try::replacement(); let try_replacement = try::replacement();
let dummy_const = if cfg!(no_underscore_consts) { let dummy_const = if cfg!(underscore_consts) {
format_ident!("_IMPL_{}_FOR_{}", trait_, unraw(ty))
} else {
format_ident!("_") format_ident!("_")
} else {
format_ident!("_IMPL_{}_FOR_{}", trait_, unraw(ty))
}; };
let use_serde = match serde_path { let use_serde = match serde_path {
+19 -16
View File
@@ -13,7 +13,7 @@
//! //!
//! [https://serde.rs/derive.html]: https://serde.rs/derive.html //! [https://serde.rs/derive.html]: https://serde.rs/derive.html
#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.140")] #![doc(html_root_url = "https://docs.rs/serde_derive/1.0.137")]
#![allow(unknown_lints, bare_trait_objects)] #![allow(unknown_lints, bare_trait_objects)]
// Ignored clippy lints // Ignored clippy lints
#![allow( #![allow(
@@ -68,12 +68,11 @@ extern crate quote;
#[macro_use] #[macro_use]
extern crate syn; extern crate syn;
extern crate proc_macro;
extern crate proc_macro2; extern crate proc_macro2;
mod internals; mod internals;
use proc_macro::TokenStream; use proc_macro2::TokenStream;
use syn::DeriveInput; use syn::DeriveInput;
#[macro_use] #[macro_use]
@@ -87,23 +86,27 @@ mod pretend;
mod ser; mod ser;
mod try; mod try;
#[proc_macro_derive(Serialize, attributes(serde))] #[no_mangle]
pub fn derive_serialize(input: TokenStream) -> TokenStream { pub extern "C" fn derive_serialize(input: TokenStream) -> TokenStream {
let mut input = parse_macro_input!(input as DeriveInput); let mut input: DeriveInput = match syn::parse2(input) {
ser::expand_derive_serialize(&mut input) Ok(input) => input,
.unwrap_or_else(to_compile_errors) Err(err) => return err.to_compile_error(),
.into() };
ser::expand_derive_serialize(&mut input).unwrap_or_else(to_compile_errors)
} }
#[proc_macro_derive(Deserialize, attributes(serde))] #[no_mangle]
pub fn derive_deserialize(input: TokenStream) -> TokenStream { pub extern "C" fn derive_deserialize(input: TokenStream) -> TokenStream {
let mut input = parse_macro_input!(input as DeriveInput); let mut input: DeriveInput = match syn::parse2(input) {
de::expand_derive_deserialize(&mut input) Ok(input) => input,
.unwrap_or_else(to_compile_errors) Err(err) => return err.to_compile_error(),
.into() };
de::expand_derive_deserialize(&mut input).unwrap_or_else(to_compile_errors)
} }
fn to_compile_errors(errors: Vec<syn::Error>) -> proc_macro2::TokenStream { fn to_compile_errors(errors: Vec<syn::Error>) -> TokenStream {
let compile_errors = errors.iter().map(syn::Error::to_compile_error); let compile_errors = errors.iter().map(syn::Error::to_compile_error);
quote!(#(#compile_errors)*) quote!(#(#compile_errors)*)
} }
+2 -2
View File
@@ -97,7 +97,7 @@ fn pretend_fields_used_struct_packed(cont: &Container, fields: &[Field]) -> Toke
let members = fields.iter().map(|field| &field.member).collect::<Vec<_>>(); let members = fields.iter().map(|field| &field.member).collect::<Vec<_>>();
#[cfg(not(no_ptr_addr_of))] #[cfg(ptr_addr_of)]
{ {
quote! { quote! {
match _serde::__private::None::<&#type_ident #ty_generics> { match _serde::__private::None::<&#type_ident #ty_generics> {
@@ -111,7 +111,7 @@ fn pretend_fields_used_struct_packed(cont: &Container, fields: &[Field]) -> Toke
} }
} }
#[cfg(no_ptr_addr_of)] #[cfg(not(ptr_addr_of))]
{ {
let placeholders = (0usize..).map(|i| format_ident!("__v{}", i)); let placeholders = (0usize..).map(|i| format_ident!("__v{}", i));
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "serde_test" name = "serde_test"
version = "1.0.140" # remember to update html_root_url version = "1.0.137" # remember to update html_root_url
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"] authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
rust-version = "1.13" rust-version = "1.13"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
+1 -1
View File
@@ -144,7 +144,7 @@
//! # } //! # }
//! ``` //! ```
#![doc(html_root_url = "https://docs.rs/serde_test/1.0.140")] #![doc(html_root_url = "https://docs.rs/serde_test/1.0.137")]
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))] #![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
// Ignored clippy lints // Ignored clippy lints
#![cfg_attr(feature = "cargo-clippy", allow(float_cmp, needless_doctest_main))] #![cfg_attr(feature = "cargo-clippy", allow(float_cmp, needless_doctest_main))]
+4 -2
View File
@@ -21,7 +21,9 @@ fnv = "1.0"
macrotest = "=1.0.9" macrotest = "=1.0.9"
prettyplease = "=0.1.14" prettyplease = "=0.1.14"
rustversion = "1.0" rustversion = "1.0"
serde = { path = "../serde", features = ["rc", "derive"] } serde = { path = "../serde", features = ["rc"] }
serde_derive = { path = "../serde_derive", features = ["deserialize_in_place"] } wa-serde-derive = { path = "../wa-serde-derive" }
serde_test = { path = "../serde_test" } serde_test = { path = "../serde_test" }
trybuild = { version = "1.0.49", features = ["diff"] } trybuild = { version = "1.0.49", features = ["diff"] }
[workspace]
+2
View File
@@ -1,3 +1,5 @@
#![cfg(any())]
#[cfg_attr(target_os = "emscripten", ignore)] #[cfg_attr(target_os = "emscripten", ignore)]
#[rustversion::attr(not(nightly), ignore)] #[rustversion::attr(not(nightly), ignore)]
#[cfg_attr(miri, ignore)] #[cfg_attr(miri, ignore)]
+1
View File
@@ -11,6 +11,7 @@
use serde::de::{self, MapAccess, Unexpected, Visitor}; use serde::de::{self, MapAccess, Unexpected, Visitor};
use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde_derive::{Deserialize, Serialize};
use std::collections::{BTreeMap, HashMap}; use std::collections::{BTreeMap, HashMap};
use std::convert::TryFrom; use std::convert::TryFrom;
+1
View File
@@ -5,6 +5,7 @@
)] )]
use serde::{Deserialize, Deserializer}; use serde::{Deserialize, Deserializer};
use serde_derive::Deserialize;
use serde_test::{assert_de_tokens, assert_de_tokens_error, Token}; use serde_test::{assert_de_tokens, assert_de_tokens_error, Token};
use std::borrow::Cow; use std::borrow::Cow;
+1
View File
@@ -34,6 +34,7 @@ use std::sync::atomic::{AtomicI64, AtomicU64};
use fnv::FnvHasher; use fnv::FnvHasher;
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use serde::{Deserialize, Deserializer}; use serde::{Deserialize, Deserializer};
use serde_derive::Deserialize;
use serde_test::{assert_de_tokens, Configure, Token}; use serde_test::{assert_de_tokens, Configure, Token};
#[macro_use] #[macro_use]
+1
View File
@@ -7,6 +7,7 @@
use serde::de::IntoDeserializer; use serde::de::IntoDeserializer;
use serde::Deserialize; use serde::Deserialize;
use serde_derive::Deserialize;
use serde_test::{assert_de_tokens_error, Token}; use serde_test::{assert_de_tokens_error, Token};
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
+1
View File
@@ -2,6 +2,7 @@
// successfully when there are a variety of generics and non-(de)serializable // successfully when there are a variety of generics and non-(de)serializable
// types involved. // types involved.
#![cfg(any())]
#![deny(warnings)] #![deny(warnings)]
#![allow( #![allow(
unknown_lints, unknown_lints,
+1 -1
View File
@@ -2,7 +2,7 @@
#![allow(clippy::derive_partial_eq_without_eq)] #![allow(clippy::derive_partial_eq_without_eq)]
use serde::Deserialize; use serde_derive::Deserialize;
use serde_test::{assert_de_tokens, Token}; use serde_test::{assert_de_tokens, Token};
#[test] #[test]
+1
View File
@@ -5,6 +5,7 @@ use serde::de::{
DeserializeSeed, EnumAccess, IgnoredAny, IntoDeserializer, VariantAccess, Visitor, DeserializeSeed, EnumAccess, IgnoredAny, IntoDeserializer, VariantAccess, Visitor,
}; };
use serde::{forward_to_deserialize_any, Deserialize, Deserializer}; use serde::{forward_to_deserialize_any, Deserialize, Deserializer};
use serde_derive::Deserialize;
#[derive(PartialEq, Debug, Deserialize)] #[derive(PartialEq, Debug, Deserialize)]
enum Target { enum Target {
+1 -1
View File
@@ -8,7 +8,7 @@
mod bytes; mod bytes;
use serde::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use serde_test::{ use serde_test::{
assert_de_tokens, assert_de_tokens_error, assert_ser_tokens, assert_tokens, Token, assert_de_tokens, assert_de_tokens_error, assert_ser_tokens, assert_tokens, Token,
}; };
+1 -1
View File
@@ -1,6 +1,6 @@
#![allow(clippy::redundant_field_names)] #![allow(clippy::redundant_field_names)]
use serde::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
mod remote { mod remote {
pub struct Unit; pub struct Unit;
+1 -1
View File
@@ -1,6 +1,6 @@
#![allow(clippy::used_underscore_binding)] #![allow(clippy::used_underscore_binding)]
use serde::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
#[test] #[test]
fn test_self() { fn test_self() {
+8 -5
View File
@@ -22,7 +22,7 @@ use std::str;
use std::sync::atomic::{AtomicI64, AtomicU64}; use std::sync::atomic::{AtomicI64, AtomicU64};
use fnv::FnvHasher; use fnv::FnvHasher;
use serde::Serialize; use serde_derive::Serialize;
use serde_test::{assert_ser_tokens, assert_ser_tokens_error, Configure, Token}; use serde_test::{assert_ser_tokens, assert_ser_tokens_error, Configure, Token};
#[macro_use] #[macro_use]
@@ -800,14 +800,17 @@ fn test_never_result() {
#[test] #[test]
#[cfg(unix)] #[cfg(unix)]
fn test_cannot_serialize_paths() { fn test_cannot_serialize_paths() {
use std::ffi::OsStr; let path = unsafe { str::from_utf8_unchecked(b"Hello \xF0\x90\x80World") };
use std::os::unix::ffi::OsStrExt;
assert_ser_tokens_error( assert_ser_tokens_error(
&Path::new(OsStr::from_bytes(b"Hello \xF0\x90\x80World")), &Path::new(path),
&[], &[],
"path contains invalid UTF-8 characters", "path contains invalid UTF-8 characters",
); );
let mut path_buf = PathBuf::new();
path_buf.push(path);
assert_ser_tokens_error(&path_buf, &[], "path contains invalid UTF-8 characters");
} }
#[test] #[test]
+1 -1
View File
@@ -2,7 +2,7 @@
#[test] #[test]
fn test_gen_custom_serde() { fn test_gen_custom_serde() {
#[derive(serde::Serialize, serde::Deserialize)] #[derive(serde_derive::Serialize, serde_derive::Deserialize)]
#[serde(crate = "fake_serde")] #[serde(crate = "fake_serde")]
struct Foo; struct Foo;
+1
View File
@@ -3,6 +3,7 @@
use serde::de::value::{self, MapAccessDeserializer}; use serde::de::value::{self, MapAccessDeserializer};
use serde::de::{IntoDeserializer, MapAccess, Visitor}; use serde::de::{IntoDeserializer, MapAccess, Visitor};
use serde::{Deserialize, Deserializer}; use serde::{Deserialize, Deserializer};
use serde_derive::Deserialize;
use serde_test::{assert_de_tokens, Token}; use serde_test::{assert_de_tokens, Token};
use std::fmt; use std::fmt;
+1
View File
@@ -0,0 +1 @@
*.wasm
+17
View File
@@ -0,0 +1,17 @@
[package]
name = "wa-serde-derive"
version = "0.1.137"
authors = ["David Tolnay <dtolnay@gmail.com>"]
license = "MIT OR Apache-2.0"
description = "serde_derive compiled to wasm"
repository = "https://github.com/dtolnay/watt"
include = ["src"]
[lib]
name = "serde_derive"
proc-macro = true
[dependencies]
watt = "0.4"
[workspace]
+18
View File
@@ -0,0 +1,18 @@
extern crate proc_macro;
extern crate watt;
use proc_macro::TokenStream;
use watt::WasmMacro;
static MACRO: WasmMacro = WasmMacro::new(WASM);
static WASM: &[u8] = include_bytes!("serde_derive.wasm");
#[proc_macro_derive(Serialize, attributes(serde))]
pub fn derive_serialize(input: TokenStream) -> TokenStream {
MACRO.proc_macro_derive("derive_serialize", input)
}
#[proc_macro_derive(Deserialize, attributes(serde))]
pub fn derive_deserialize(input: TokenStream) -> TokenStream {
MACRO.proc_macro_derive("derive_deserialize", input)
}