mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-25 01:07:56 +00:00
@@ -8,6 +8,7 @@ use syntax::ptr::P;
|
|||||||
use syntax::tokenstream::TokenTree;
|
use syntax::tokenstream::TokenTree;
|
||||||
|
|
||||||
use bound;
|
use bound;
|
||||||
|
use span;
|
||||||
use internals::ast::{Body, Field, Item, Style, Variant};
|
use internals::ast::{Body, Field, Item, Style, Variant};
|
||||||
use internals::{attr, Error};
|
use internals::{attr, Error};
|
||||||
|
|
||||||
@@ -44,7 +45,7 @@ pub fn expand_derive_deserialize(
|
|||||||
let builder = aster::AstBuilder::new().span(span);
|
let builder = aster::AstBuilder::new().span(span);
|
||||||
|
|
||||||
let impl_item = deserialize_item(cx, &builder, &item);
|
let impl_item = deserialize_item(cx, &builder, &item);
|
||||||
push(Annotatable::Item(impl_item))
|
push(span::record_expansion(cx, impl_item, "Deserialize"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_item(
|
fn deserialize_item(
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
mod bound;
|
mod bound;
|
||||||
mod de;
|
mod de;
|
||||||
mod ser;
|
mod ser;
|
||||||
|
mod span;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use syntax::ext::base::{Annotatable, ExtCtxt};
|
|||||||
use syntax::ptr::P;
|
use syntax::ptr::P;
|
||||||
|
|
||||||
use bound;
|
use bound;
|
||||||
|
use span;
|
||||||
use internals::ast::{Body, Field, Item, Style, Variant};
|
use internals::ast::{Body, Field, Item, Style, Variant};
|
||||||
use internals::{attr, Error};
|
use internals::{attr, Error};
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@ pub fn expand_derive_serialize(
|
|||||||
let builder = aster::AstBuilder::new().span(span);
|
let builder = aster::AstBuilder::new().span(span);
|
||||||
|
|
||||||
let impl_item = serialize_item(cx, &builder, &item);
|
let impl_item = serialize_item(cx, &builder, &item);
|
||||||
push(Annotatable::Item(impl_item))
|
push(span::record_expansion(cx, impl_item, "Serialize"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_item(
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,6 +21,7 @@ clippy = { version = "^0.*", optional = true }
|
|||||||
serde_codegen = { version = "^0.7.12", path = "../serde_codegen", default-features = false, features = ["nightly"] }
|
serde_codegen = { version = "^0.7.12", path = "../serde_codegen", default-features = false, features = ["nightly"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
clippy = "^0.0.78"
|
||||||
compiletest_rs = "^0.2.0"
|
compiletest_rs = "^0.2.0"
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
rustc-serialize = "^0.3.16"
|
rustc-serialize = "^0.3.16"
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ fn run_mode(mode: &'static str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn compile_test() {
|
fn compile_fail() {
|
||||||
run_mode("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() {}
|
||||||
Reference in New Issue
Block a user