mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-14 05:51:01 +00:00
Improve error when a 'de lifetime parameter already exists
This commit is contained in:
@@ -82,6 +82,11 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result<Tokens, Str
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn precondition(cx: &Ctxt, cont: &Container) {
|
fn precondition(cx: &Ctxt, cont: &Container) {
|
||||||
|
precondition_sized(cx, cont);
|
||||||
|
precondition_no_de_lifetime(cx, cont);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn precondition_sized(cx: &Ctxt, cont: &Container) {
|
||||||
if let Data::Struct(_, ref fields) = cont.data {
|
if let Data::Struct(_, ref fields) = cont.data {
|
||||||
if let Some(last) = fields.last() {
|
if let Some(last) = fields.last() {
|
||||||
if let syn::Type::Slice(_) = *last.ty {
|
if let syn::Type::Slice(_) = *last.ty {
|
||||||
@@ -91,6 +96,17 @@ fn precondition(cx: &Ctxt, cont: &Container) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn precondition_no_de_lifetime(cx: &Ctxt, cont: &Container) {
|
||||||
|
if let BorrowedLifetimes::Borrowed(_) = borrowed_lifetimes(cont) {
|
||||||
|
for param in cont.generics.lifetimes() {
|
||||||
|
if param.lifetime.to_string() == "'de" {
|
||||||
|
cx.error("cannot deserialize when there is a lifetime parameter called 'de");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct Parameters {
|
struct Parameters {
|
||||||
/// Name of the type the `derive` is on.
|
/// Name of the type the `derive` is on.
|
||||||
local: syn::Ident,
|
local: syn::Ident,
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2018 Serde Developers
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate serde_derive;
|
||||||
|
|
||||||
|
#[derive(Deserialize)] //~ ERROR: proc-macro derive panicked
|
||||||
|
struct S<'de> {
|
||||||
|
s: &'de str, //~^^ HELP: cannot deserialize when there is a lifetime parameter called 'de
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user