mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-23 04:48:01 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 97bc1e08e7 | |||
| 7ffb74f5bb | |||
| f25e6d3ea9 | |||
| 431cbe48b7 | |||
| 5405ab319d | |||
| 0f9a930c4f | |||
| 1a449bb3d0 | |||
| c0e8164792 | |||
| a3a7e4085f | |||
| 149c87d7c2 |
@@ -9,9 +9,9 @@ default = ["serde_codegen"]
|
||||
nightly = ["serde_macros"]
|
||||
|
||||
[build-dependencies]
|
||||
serde_codegen = { version = "^0.7.12", optional = true }
|
||||
serde_codegen = { version = "^0.7.13", optional = true }
|
||||
|
||||
[dependencies]
|
||||
serde = "^0.7.12"
|
||||
serde = "^0.7.13"
|
||||
serde_json = "^0.7.0"
|
||||
serde_macros = { version = "^0.7.12", optional = true }
|
||||
serde_macros = { version = "^0.7.13", optional = true }
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "serde"
|
||||
version = "0.7.12"
|
||||
version = "0.7.13"
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "A generic serialization/deserialization framework"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "serde_codegen"
|
||||
version = "0.7.12"
|
||||
version = "0.7.13"
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "Macros to auto-generate implementations for the serde framework"
|
||||
|
||||
+11
-6
@@ -8,6 +8,7 @@ use syntax::ptr::P;
|
||||
use syntax::tokenstream::TokenTree;
|
||||
|
||||
use bound;
|
||||
use span;
|
||||
use internals::ast::{Body, Field, Item, Style, Variant};
|
||||
use internals::{attr, Error};
|
||||
|
||||
@@ -44,7 +45,7 @@ pub fn expand_derive_deserialize(
|
||||
let builder = aster::AstBuilder::new().span(span);
|
||||
|
||||
let impl_item = deserialize_item(cx, &builder, &item);
|
||||
push(Annotatable::Item(impl_item))
|
||||
push(span::record_expansion(cx, impl_item, "Deserialize"))
|
||||
}
|
||||
|
||||
fn deserialize_item(
|
||||
@@ -394,6 +395,7 @@ fn deserialize_seq(
|
||||
fields: &[Field],
|
||||
is_struct: bool,
|
||||
) -> P<ast::Expr> {
|
||||
let mut index_in_seq = 0usize;
|
||||
let let_values: Vec<_> = fields.iter()
|
||||
.enumerate()
|
||||
.map(|(i, field)| {
|
||||
@@ -419,14 +421,17 @@ fn deserialize_seq(
|
||||
})
|
||||
}
|
||||
};
|
||||
quote_stmt!(cx,
|
||||
let assign = quote_stmt!(cx,
|
||||
let $name = match $visit {
|
||||
Some(value) => { value },
|
||||
None => {
|
||||
return Err(_serde::de::Error::end_of_stream());
|
||||
try!(visitor.end());
|
||||
return Err(_serde::de::Error::invalid_length($index_in_seq));
|
||||
}
|
||||
};
|
||||
).unwrap()
|
||||
).unwrap();
|
||||
index_in_seq += 1;
|
||||
assign
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
@@ -1092,10 +1097,10 @@ fn deserialize_map(
|
||||
}
|
||||
}
|
||||
|
||||
$extract_values
|
||||
|
||||
try!(visitor.end());
|
||||
|
||||
$extract_values
|
||||
|
||||
Ok($result)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
mod bound;
|
||||
mod de;
|
||||
mod ser;
|
||||
mod span;
|
||||
|
||||
@@ -6,6 +6,7 @@ use syntax::ext::base::{Annotatable, ExtCtxt};
|
||||
use syntax::ptr::P;
|
||||
|
||||
use bound;
|
||||
use span;
|
||||
use internals::ast::{Body, Field, Item, Style, Variant};
|
||||
use internals::{attr, Error};
|
||||
|
||||
@@ -38,7 +39,7 @@ pub fn expand_derive_serialize(
|
||||
let builder = aster::AstBuilder::new().span(span);
|
||||
|
||||
let impl_item = serialize_item(cx, &builder, &item);
|
||||
push(Annotatable::Item(impl_item))
|
||||
push(span::record_expansion(cx, impl_item, "Serialize"))
|
||||
}
|
||||
|
||||
fn serialize_item(
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
use syntax::ast;
|
||||
use syntax::codemap::{self, ExpnId, Span};
|
||||
use syntax::ext::base::{Annotatable, ExtCtxt};
|
||||
use syntax::fold::{self, Folder};
|
||||
use syntax::parse::token::intern;
|
||||
use syntax::ptr::P;
|
||||
|
||||
pub fn record_expansion(
|
||||
cx: &ExtCtxt,
|
||||
item: P<ast::Item>,
|
||||
derive: &str,
|
||||
) -> Annotatable {
|
||||
let info = codemap::ExpnInfo {
|
||||
call_site: codemap::DUMMY_SP,
|
||||
callee: codemap::NameAndSpan {
|
||||
format: codemap::MacroAttribute(intern(&format!("derive({})", derive))),
|
||||
span: None,
|
||||
allow_internal_unstable: false,
|
||||
},
|
||||
};
|
||||
let expn_id = cx.codemap().record_expansion(info);
|
||||
|
||||
let mut respanner = Respanner { expn_id: expn_id };
|
||||
let item = item.map(|item| respanner.fold_item_simple(item));
|
||||
Annotatable::Item(item)
|
||||
}
|
||||
|
||||
struct Respanner {
|
||||
expn_id: ExpnId,
|
||||
}
|
||||
|
||||
impl Folder for Respanner {
|
||||
fn new_span(&mut self, span: Span) -> Span {
|
||||
Span {
|
||||
expn_id: self.expn_id,
|
||||
.. span
|
||||
}
|
||||
}
|
||||
|
||||
fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac {
|
||||
fold::noop_fold_mac(mac, self)
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "serde_macros"
|
||||
version = "0.7.12"
|
||||
version = "0.7.13"
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "Macros to auto-generate implementations for the serde framework"
|
||||
@@ -18,14 +18,15 @@ nightly-testing = ["clippy", "serde/nightly-testing", "serde_codegen/nightly-tes
|
||||
|
||||
[dependencies]
|
||||
clippy = { version = "^0.*", optional = true }
|
||||
serde_codegen = { version = "^0.7.12", path = "../serde_codegen", default-features = false, features = ["nightly"] }
|
||||
serde_codegen = { version = "^0.7.13", path = "../serde_codegen", default-features = false, features = ["nightly"] }
|
||||
|
||||
[dev-dependencies]
|
||||
clippy = "^0.0.78"
|
||||
compiletest_rs = "^0.2.0"
|
||||
fnv = "1.0"
|
||||
rustc-serialize = "^0.3.16"
|
||||
serde = { version = "^0.7.12", path = "../serde" }
|
||||
serde_test = { version = "^0.7.12", path = "../serde_test" }
|
||||
serde = { version = "^0.7.13", path = "../serde" }
|
||||
serde_test = { version = "^0.7.13", path = "../serde_test" }
|
||||
|
||||
[[test]]
|
||||
name = "test"
|
||||
|
||||
@@ -20,6 +20,11 @@ fn run_mode(mode: &'static str) {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn compile_test() {
|
||||
fn compile_fail() {
|
||||
run_mode("compile-fail");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn run_pass() {
|
||||
run_mode("run-pass");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#![feature(custom_derive, plugin)]
|
||||
#![plugin(serde_macros, clippy)]
|
||||
|
||||
#![deny(identity_op)]
|
||||
|
||||
// The derived implementation uses 0+1 to add up the number of fields
|
||||
// serialized, which Clippy warns about. If the expansion info is registered
|
||||
// correctly, the Clippy lint is not triggered.
|
||||
#[derive(Serialize)]
|
||||
struct A { b: u8 }
|
||||
|
||||
fn main() {}
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "serde_test"
|
||||
version = "0.7.12"
|
||||
version = "0.7.13"
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "Token De/Serializer for testing De/Serialize implementations"
|
||||
@@ -11,4 +11,4 @@ keywords = ["serde", "serialization"]
|
||||
include = ["Cargo.toml", "src/**/*.rs"]
|
||||
|
||||
[dependencies]
|
||||
serde = { version = "0.7.12", path = "../serde" }
|
||||
serde = { version = "0.7.13", path = "../serde" }
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "serde_testing"
|
||||
version = "0.7.12"
|
||||
version = "0.7.13"
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "A generic serialization/deserialization framework"
|
||||
|
||||
@@ -946,3 +946,31 @@ fn test_missing_renamed_field_enum() {
|
||||
Error::MissingField("d"),
|
||||
);
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Deserialize)]
|
||||
enum InvalidLengthEnum {
|
||||
A(i32, i32, i32),
|
||||
B(#[serde(skip_deserializing)] i32, i32, i32),
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_invalid_length_enum() {
|
||||
assert_de_tokens_error::<InvalidLengthEnum>(
|
||||
&[
|
||||
Token::EnumSeqStart("InvalidLengthEnum", "A", Some(3)),
|
||||
Token::EnumSeqSep,
|
||||
Token::I32(1),
|
||||
Token::EnumSeqEnd,
|
||||
],
|
||||
Error::InvalidLength(1),
|
||||
);
|
||||
assert_de_tokens_error::<InvalidLengthEnum>(
|
||||
&[
|
||||
Token::EnumSeqStart("InvalidLengthEnum", "B", Some(3)),
|
||||
Token::EnumSeqSep,
|
||||
Token::I32(1),
|
||||
Token::EnumSeqEnd,
|
||||
],
|
||||
Error::InvalidLength(1),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user