• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use internals::respan::respan;
2 use internals::symbol::*;
3 use internals::{ungroup, Ctxt};
4 use proc_macro2::{Spacing, Span, TokenStream, TokenTree};
5 use quote::ToTokens;
6 use std::borrow::Cow;
7 use std::collections::BTreeSet;
8 use syn;
9 use syn::parse::{self, Parse, ParseStream};
10 use syn::punctuated::Punctuated;
11 use syn::Ident;
12 use syn::Meta::{List, NameValue, Path};
13 use syn::NestedMeta::{Lit, Meta};
14 
15 // This module handles parsing of `#[serde(...)]` attributes. The entrypoints
16 // are `attr::Container::from_ast`, `attr::Variant::from_ast`, and
17 // `attr::Field::from_ast`. Each returns an instance of the corresponding
18 // struct. Note that none of them return a Result. Unrecognized, malformed, or
19 // duplicated attributes result in a span_err but otherwise are ignored. The
20 // user will see errors simultaneously for all bad attributes in the crate
21 // rather than just the first.
22 
23 pub use internals::case::RenameRule;
24 
25 struct Attr<'c, T> {
26     cx: &'c Ctxt,
27     name: Symbol,
28     tokens: TokenStream,
29     value: Option<T>,
30 }
31 
32 impl<'c, T> Attr<'c, T> {
none(cx: &'c Ctxt, name: Symbol) -> Self33     fn none(cx: &'c Ctxt, name: Symbol) -> Self {
34         Attr {
35             cx,
36             name,
37             tokens: TokenStream::new(),
38             value: None,
39         }
40     }
41 
set<A: ToTokens>(&mut self, obj: A, value: T)42     fn set<A: ToTokens>(&mut self, obj: A, value: T) {
43         let tokens = obj.into_token_stream();
44 
45         if self.value.is_some() {
46             self.cx
47                 .error_spanned_by(tokens, format!("duplicate serde attribute `{}`", self.name));
48         } else {
49             self.tokens = tokens;
50             self.value = Some(value);
51         }
52     }
53 
set_opt<A: ToTokens>(&mut self, obj: A, value: Option<T>)54     fn set_opt<A: ToTokens>(&mut self, obj: A, value: Option<T>) {
55         if let Some(value) = value {
56             self.set(obj, value);
57         }
58     }
59 
set_if_none(&mut self, value: T)60     fn set_if_none(&mut self, value: T) {
61         if self.value.is_none() {
62             self.value = Some(value);
63         }
64     }
65 
get(self) -> Option<T>66     fn get(self) -> Option<T> {
67         self.value
68     }
69 
get_with_tokens(self) -> Option<(TokenStream, T)>70     fn get_with_tokens(self) -> Option<(TokenStream, T)> {
71         match self.value {
72             Some(v) => Some((self.tokens, v)),
73             None => None,
74         }
75     }
76 }
77 
78 struct BoolAttr<'c>(Attr<'c, ()>);
79 
80 impl<'c> BoolAttr<'c> {
none(cx: &'c Ctxt, name: Symbol) -> Self81     fn none(cx: &'c Ctxt, name: Symbol) -> Self {
82         BoolAttr(Attr::none(cx, name))
83     }
84 
set_true<A: ToTokens>(&mut self, obj: A)85     fn set_true<A: ToTokens>(&mut self, obj: A) {
86         self.0.set(obj, ());
87     }
88 
get(&self) -> bool89     fn get(&self) -> bool {
90         self.0.value.is_some()
91     }
92 }
93 
94 struct VecAttr<'c, T> {
95     cx: &'c Ctxt,
96     name: Symbol,
97     first_dup_tokens: TokenStream,
98     values: Vec<T>,
99 }
100 
101 impl<'c, T> VecAttr<'c, T> {
none(cx: &'c Ctxt, name: Symbol) -> Self102     fn none(cx: &'c Ctxt, name: Symbol) -> Self {
103         VecAttr {
104             cx,
105             name,
106             first_dup_tokens: TokenStream::new(),
107             values: Vec::new(),
108         }
109     }
110 
insert<A: ToTokens>(&mut self, obj: A, value: T)111     fn insert<A: ToTokens>(&mut self, obj: A, value: T) {
112         if self.values.len() == 1 {
113             self.first_dup_tokens = obj.into_token_stream();
114         }
115         self.values.push(value);
116     }
117 
at_most_one(mut self) -> Result<Option<T>, ()>118     fn at_most_one(mut self) -> Result<Option<T>, ()> {
119         if self.values.len() > 1 {
120             let dup_token = self.first_dup_tokens;
121             self.cx.error_spanned_by(
122                 dup_token,
123                 format!("duplicate serde attribute `{}`", self.name),
124             );
125             Err(())
126         } else {
127             Ok(self.values.pop())
128         }
129     }
130 
get(self) -> Vec<T>131     fn get(self) -> Vec<T> {
132         self.values
133     }
134 }
135 
136 pub struct Name {
137     serialize: String,
138     serialize_renamed: bool,
139     deserialize: String,
140     deserialize_renamed: bool,
141     deserialize_aliases: Vec<String>,
142 }
143 
144 #[allow(deprecated)]
unraw(ident: &Ident) -> String145 fn unraw(ident: &Ident) -> String {
146     // str::trim_start_matches was added in 1.30, trim_left_matches deprecated
147     // in 1.33. We currently support rustc back to 1.15 so we need to continue
148     // to use the deprecated one.
149     ident.to_string().trim_left_matches("r#").to_owned()
150 }
151 
152 impl Name {
from_attrs( source_name: String, ser_name: Attr<String>, de_name: Attr<String>, de_aliases: Option<VecAttr<String>>, ) -> Name153     fn from_attrs(
154         source_name: String,
155         ser_name: Attr<String>,
156         de_name: Attr<String>,
157         de_aliases: Option<VecAttr<String>>,
158     ) -> Name {
159         let deserialize_aliases = match de_aliases {
160             Some(de_aliases) => {
161                 let mut alias_list = BTreeSet::new();
162                 for alias_name in de_aliases.get() {
163                     alias_list.insert(alias_name);
164                 }
165                 alias_list.into_iter().collect()
166             }
167             None => Vec::new(),
168         };
169 
170         let ser_name = ser_name.get();
171         let ser_renamed = ser_name.is_some();
172         let de_name = de_name.get();
173         let de_renamed = de_name.is_some();
174         Name {
175             serialize: ser_name.unwrap_or_else(|| source_name.clone()),
176             serialize_renamed: ser_renamed,
177             deserialize: de_name.unwrap_or(source_name),
178             deserialize_renamed: de_renamed,
179             deserialize_aliases,
180         }
181     }
182 
183     /// Return the container name for the container when serializing.
serialize_name(&self) -> String184     pub fn serialize_name(&self) -> String {
185         self.serialize.clone()
186     }
187 
188     /// Return the container name for the container when deserializing.
deserialize_name(&self) -> String189     pub fn deserialize_name(&self) -> String {
190         self.deserialize.clone()
191     }
192 
deserialize_aliases(&self) -> Vec<String>193     fn deserialize_aliases(&self) -> Vec<String> {
194         let mut aliases = self.deserialize_aliases.clone();
195         let main_name = self.deserialize_name();
196         if !aliases.contains(&main_name) {
197             aliases.push(main_name);
198         }
199         aliases
200     }
201 }
202 
203 pub struct RenameAllRules {
204     serialize: RenameRule,
205     deserialize: RenameRule,
206 }
207 
208 /// Represents struct or enum attribute information.
209 pub struct Container {
210     name: Name,
211     transparent: bool,
212     deny_unknown_fields: bool,
213     default: Default,
214     rename_all_rules: RenameAllRules,
215     ser_bound: Option<Vec<syn::WherePredicate>>,
216     de_bound: Option<Vec<syn::WherePredicate>>,
217     tag: TagType,
218     type_from: Option<syn::Type>,
219     type_try_from: Option<syn::Type>,
220     type_into: Option<syn::Type>,
221     remote: Option<syn::Path>,
222     identifier: Identifier,
223     has_flatten: bool,
224     serde_path: Option<syn::Path>,
225     is_packed: bool,
226     /// Error message generated when type can't be deserialized
227     expecting: Option<String>,
228 }
229 
230 /// Styles of representing an enum.
231 pub enum TagType {
232     /// The default.
233     ///
234     /// ```json
235     /// {"variant1": {"key1": "value1", "key2": "value2"}}
236     /// ```
237     External,
238 
239     /// `#[serde(tag = "type")]`
240     ///
241     /// ```json
242     /// {"type": "variant1", "key1": "value1", "key2": "value2"}
243     /// ```
244     Internal { tag: String },
245 
246     /// `#[serde(tag = "t", content = "c")]`
247     ///
248     /// ```json
249     /// {"t": "variant1", "c": {"key1": "value1", "key2": "value2"}}
250     /// ```
251     Adjacent { tag: String, content: String },
252 
253     /// `#[serde(untagged)]`
254     ///
255     /// ```json
256     /// {"key1": "value1", "key2": "value2"}
257     /// ```
258     None,
259 }
260 
261 /// Whether this enum represents the fields of a struct or the variants of an
262 /// enum.
263 #[derive(Copy, Clone)]
264 pub enum Identifier {
265     /// It does not.
266     No,
267 
268     /// This enum represents the fields of a struct. All of the variants must be
269     /// unit variants, except possibly one which is annotated with
270     /// `#[serde(other)]` and is a newtype variant.
271     Field,
272 
273     /// This enum represents the variants of an enum. All of the variants must
274     /// be unit variants.
275     Variant,
276 }
277 
278 impl Identifier {
279     #[cfg(feature = "deserialize_in_place")]
is_some(self) -> bool280     pub fn is_some(self) -> bool {
281         match self {
282             Identifier::No => false,
283             Identifier::Field | Identifier::Variant => true,
284         }
285     }
286 }
287 
288 impl Container {
289     /// Extract out the `#[serde(...)]` attributes from an item.
from_ast(cx: &Ctxt, item: &syn::DeriveInput) -> Self290     pub fn from_ast(cx: &Ctxt, item: &syn::DeriveInput) -> Self {
291         let mut ser_name = Attr::none(cx, RENAME);
292         let mut de_name = Attr::none(cx, RENAME);
293         let mut transparent = BoolAttr::none(cx, TRANSPARENT);
294         let mut deny_unknown_fields = BoolAttr::none(cx, DENY_UNKNOWN_FIELDS);
295         let mut default = Attr::none(cx, DEFAULT);
296         let mut rename_all_ser_rule = Attr::none(cx, RENAME_ALL);
297         let mut rename_all_de_rule = Attr::none(cx, RENAME_ALL);
298         let mut ser_bound = Attr::none(cx, BOUND);
299         let mut de_bound = Attr::none(cx, BOUND);
300         let mut untagged = BoolAttr::none(cx, UNTAGGED);
301         let mut internal_tag = Attr::none(cx, TAG);
302         let mut content = Attr::none(cx, CONTENT);
303         let mut type_from = Attr::none(cx, FROM);
304         let mut type_try_from = Attr::none(cx, TRY_FROM);
305         let mut type_into = Attr::none(cx, INTO);
306         let mut remote = Attr::none(cx, REMOTE);
307         let mut field_identifier = BoolAttr::none(cx, FIELD_IDENTIFIER);
308         let mut variant_identifier = BoolAttr::none(cx, VARIANT_IDENTIFIER);
309         let mut serde_path = Attr::none(cx, CRATE);
310         let mut expecting = Attr::none(cx, EXPECTING);
311 
312         for meta_item in item
313             .attrs
314             .iter()
315             .flat_map(|attr| get_serde_meta_items(cx, attr))
316             .flatten()
317         {
318             match &meta_item {
319                 // Parse `#[serde(rename = "foo")]`
320                 Meta(NameValue(m)) if m.path == RENAME => {
321                     if let Ok(s) = get_lit_str(cx, RENAME, &m.lit) {
322                         ser_name.set(&m.path, s.value());
323                         de_name.set(&m.path, s.value());
324                     }
325                 }
326 
327                 // Parse `#[serde(rename(serialize = "foo", deserialize = "bar"))]`
328                 Meta(List(m)) if m.path == RENAME => {
329                     if let Ok((ser, de)) = get_renames(cx, &m.nested) {
330                         ser_name.set_opt(&m.path, ser.map(syn::LitStr::value));
331                         de_name.set_opt(&m.path, de.map(syn::LitStr::value));
332                     }
333                 }
334 
335                 // Parse `#[serde(rename_all = "foo")]`
336                 Meta(NameValue(m)) if m.path == RENAME_ALL => {
337                     if let Ok(s) = get_lit_str(cx, RENAME_ALL, &m.lit) {
338                         match RenameRule::from_str(&s.value()) {
339                             Ok(rename_rule) => {
340                                 rename_all_ser_rule.set(&m.path, rename_rule);
341                                 rename_all_de_rule.set(&m.path, rename_rule);
342                             }
343                             Err(err) => cx.error_spanned_by(s, err),
344                         }
345                     }
346                 }
347 
348                 // Parse `#[serde(rename_all(serialize = "foo", deserialize = "bar"))]`
349                 Meta(List(m)) if m.path == RENAME_ALL => {
350                     if let Ok((ser, de)) = get_renames(cx, &m.nested) {
351                         if let Some(ser) = ser {
352                             match RenameRule::from_str(&ser.value()) {
353                                 Ok(rename_rule) => rename_all_ser_rule.set(&m.path, rename_rule),
354                                 Err(err) => cx.error_spanned_by(ser, err),
355                             }
356                         }
357                         if let Some(de) = de {
358                             match RenameRule::from_str(&de.value()) {
359                                 Ok(rename_rule) => rename_all_de_rule.set(&m.path, rename_rule),
360                                 Err(err) => cx.error_spanned_by(de, err),
361                             }
362                         }
363                     }
364                 }
365 
366                 // Parse `#[serde(transparent)]`
367                 Meta(Path(word)) if word == TRANSPARENT => {
368                     transparent.set_true(word);
369                 }
370 
371                 // Parse `#[serde(deny_unknown_fields)]`
372                 Meta(Path(word)) if word == DENY_UNKNOWN_FIELDS => {
373                     deny_unknown_fields.set_true(word);
374                 }
375 
376                 // Parse `#[serde(default)]`
377                 Meta(Path(word)) if word == DEFAULT => match &item.data {
378                     syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields {
379                         syn::Fields::Named(_) => {
380                             default.set(word, Default::Default);
381                         }
382                         syn::Fields::Unnamed(_) | syn::Fields::Unit => cx.error_spanned_by(
383                             fields,
384                             "#[serde(default)] can only be used on structs with named fields",
385                         ),
386                     },
387                     syn::Data::Enum(syn::DataEnum { enum_token, .. }) => cx.error_spanned_by(
388                         enum_token,
389                         "#[serde(default)] can only be used on structs with named fields",
390                     ),
391                     syn::Data::Union(syn::DataUnion { union_token, .. }) => cx.error_spanned_by(
392                         union_token,
393                         "#[serde(default)] can only be used on structs with named fields",
394                     ),
395                 },
396 
397                 // Parse `#[serde(default = "...")]`
398                 Meta(NameValue(m)) if m.path == DEFAULT => {
399                     if let Ok(path) = parse_lit_into_expr_path(cx, DEFAULT, &m.lit) {
400                         match &item.data {
401                             syn::Data::Struct(syn::DataStruct { fields, .. }) => {
402                                 match fields {
403                                     syn::Fields::Named(_) => {
404                                         default.set(&m.path, Default::Path(path));
405                                     }
406                                     syn::Fields::Unnamed(_) | syn::Fields::Unit => cx
407                                         .error_spanned_by(
408                                             fields,
409                                             "#[serde(default = \"...\")] can only be used on structs with named fields",
410                                         ),
411                                 }
412                             }
413                             syn::Data::Enum(syn::DataEnum { enum_token, .. }) => cx
414                                 .error_spanned_by(
415                                     enum_token,
416                                     "#[serde(default = \"...\")] can only be used on structs with named fields",
417                                 ),
418                             syn::Data::Union(syn::DataUnion {
419                                 union_token, ..
420                             }) => cx.error_spanned_by(
421                                 union_token,
422                                 "#[serde(default = \"...\")] can only be used on structs with named fields",
423                             ),
424                         }
425                     }
426                 }
427 
428                 // Parse `#[serde(bound = "T: SomeBound")]`
429                 Meta(NameValue(m)) if m.path == BOUND => {
430                     if let Ok(where_predicates) = parse_lit_into_where(cx, BOUND, BOUND, &m.lit) {
431                         ser_bound.set(&m.path, where_predicates.clone());
432                         de_bound.set(&m.path, where_predicates);
433                     }
434                 }
435 
436                 // Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
437                 Meta(List(m)) if m.path == BOUND => {
438                     if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
439                         ser_bound.set_opt(&m.path, ser);
440                         de_bound.set_opt(&m.path, de);
441                     }
442                 }
443 
444                 // Parse `#[serde(untagged)]`
445                 Meta(Path(word)) if word == UNTAGGED => match item.data {
446                     syn::Data::Enum(_) => {
447                         untagged.set_true(word);
448                     }
449                     syn::Data::Struct(syn::DataStruct { struct_token, .. }) => {
450                         cx.error_spanned_by(
451                             struct_token,
452                             "#[serde(untagged)] can only be used on enums",
453                         );
454                     }
455                     syn::Data::Union(syn::DataUnion { union_token, .. }) => {
456                         cx.error_spanned_by(
457                             union_token,
458                             "#[serde(untagged)] can only be used on enums",
459                         );
460                     }
461                 },
462 
463                 // Parse `#[serde(tag = "type")]`
464                 Meta(NameValue(m)) if m.path == TAG => {
465                     if let Ok(s) = get_lit_str(cx, TAG, &m.lit) {
466                         match &item.data {
467                             syn::Data::Enum(_) => {
468                                 internal_tag.set(&m.path, s.value());
469                             }
470                             syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields {
471                                 syn::Fields::Named(_) => {
472                                     internal_tag.set(&m.path, s.value());
473                                 }
474                                 syn::Fields::Unnamed(_) | syn::Fields::Unit => {
475                                     cx.error_spanned_by(
476                                             fields,
477                                             "#[serde(tag = \"...\")] can only be used on enums and structs with named fields",
478                                         );
479                                 }
480                             },
481                             syn::Data::Union(syn::DataUnion { union_token, .. }) => {
482                                 cx.error_spanned_by(
483                                     union_token,
484                                     "#[serde(tag = \"...\")] can only be used on enums and structs with named fields",
485                                 );
486                             }
487                         }
488                     }
489                 }
490 
491                 // Parse `#[serde(content = "c")]`
492                 Meta(NameValue(m)) if m.path == CONTENT => {
493                     if let Ok(s) = get_lit_str(cx, CONTENT, &m.lit) {
494                         match &item.data {
495                             syn::Data::Enum(_) => {
496                                 content.set(&m.path, s.value());
497                             }
498                             syn::Data::Struct(syn::DataStruct { struct_token, .. }) => {
499                                 cx.error_spanned_by(
500                                     struct_token,
501                                     "#[serde(content = \"...\")] can only be used on enums",
502                                 );
503                             }
504                             syn::Data::Union(syn::DataUnion { union_token, .. }) => {
505                                 cx.error_spanned_by(
506                                     union_token,
507                                     "#[serde(content = \"...\")] can only be used on enums",
508                                 );
509                             }
510                         }
511                     }
512                 }
513 
514                 // Parse `#[serde(from = "Type")]
515                 Meta(NameValue(m)) if m.path == FROM => {
516                     if let Ok(from_ty) = parse_lit_into_ty(cx, FROM, &m.lit) {
517                         type_from.set_opt(&m.path, Some(from_ty));
518                     }
519                 }
520 
521                 // Parse `#[serde(try_from = "Type")]
522                 Meta(NameValue(m)) if m.path == TRY_FROM => {
523                     if let Ok(try_from_ty) = parse_lit_into_ty(cx, TRY_FROM, &m.lit) {
524                         type_try_from.set_opt(&m.path, Some(try_from_ty));
525                     }
526                 }
527 
528                 // Parse `#[serde(into = "Type")]
529                 Meta(NameValue(m)) if m.path == INTO => {
530                     if let Ok(into_ty) = parse_lit_into_ty(cx, INTO, &m.lit) {
531                         type_into.set_opt(&m.path, Some(into_ty));
532                     }
533                 }
534 
535                 // Parse `#[serde(remote = "...")]`
536                 Meta(NameValue(m)) if m.path == REMOTE => {
537                     if let Ok(path) = parse_lit_into_path(cx, REMOTE, &m.lit) {
538                         if is_primitive_path(&path, "Self") {
539                             remote.set(&m.path, item.ident.clone().into());
540                         } else {
541                             remote.set(&m.path, path);
542                         }
543                     }
544                 }
545 
546                 // Parse `#[serde(field_identifier)]`
547                 Meta(Path(word)) if word == FIELD_IDENTIFIER => {
548                     field_identifier.set_true(word);
549                 }
550 
551                 // Parse `#[serde(variant_identifier)]`
552                 Meta(Path(word)) if word == VARIANT_IDENTIFIER => {
553                     variant_identifier.set_true(word);
554                 }
555 
556                 // Parse `#[serde(crate = "foo")]`
557                 Meta(NameValue(m)) if m.path == CRATE => {
558                     if let Ok(path) = parse_lit_into_path(cx, CRATE, &m.lit) {
559                         serde_path.set(&m.path, path)
560                     }
561                 }
562 
563                 // Parse `#[serde(expecting = "a message")]`
564                 Meta(NameValue(m)) if m.path == EXPECTING => {
565                     if let Ok(s) = get_lit_str(cx, EXPECTING, &m.lit) {
566                         expecting.set(&m.path, s.value());
567                     }
568                 }
569 
570                 Meta(meta_item) => {
571                     let path = meta_item
572                         .path()
573                         .into_token_stream()
574                         .to_string()
575                         .replace(' ', "");
576                     cx.error_spanned_by(
577                         meta_item.path(),
578                         format!("unknown serde container attribute `{}`", path),
579                     );
580                 }
581 
582                 Lit(lit) => {
583                     cx.error_spanned_by(lit, "unexpected literal in serde container attribute");
584                 }
585             }
586         }
587 
588         let mut is_packed = false;
589         for attr in &item.attrs {
590             if attr.path.is_ident("repr") {
591                 let _ = attr.parse_args_with(|input: ParseStream| {
592                     while let Some(token) = input.parse()? {
593                         if let TokenTree::Ident(ident) = token {
594                             is_packed |= ident == "packed";
595                         }
596                     }
597                     Ok(())
598                 });
599             }
600         }
601 
602         Container {
603             name: Name::from_attrs(unraw(&item.ident), ser_name, de_name, None),
604             transparent: transparent.get(),
605             deny_unknown_fields: deny_unknown_fields.get(),
606             default: default.get().unwrap_or(Default::None),
607             rename_all_rules: RenameAllRules {
608                 serialize: rename_all_ser_rule.get().unwrap_or(RenameRule::None),
609                 deserialize: rename_all_de_rule.get().unwrap_or(RenameRule::None),
610             },
611             ser_bound: ser_bound.get(),
612             de_bound: de_bound.get(),
613             tag: decide_tag(cx, item, untagged, internal_tag, content),
614             type_from: type_from.get(),
615             type_try_from: type_try_from.get(),
616             type_into: type_into.get(),
617             remote: remote.get(),
618             identifier: decide_identifier(cx, item, field_identifier, variant_identifier),
619             has_flatten: false,
620             serde_path: serde_path.get(),
621             is_packed,
622             expecting: expecting.get(),
623         }
624     }
625 
name(&self) -> &Name626     pub fn name(&self) -> &Name {
627         &self.name
628     }
629 
rename_all_rules(&self) -> &RenameAllRules630     pub fn rename_all_rules(&self) -> &RenameAllRules {
631         &self.rename_all_rules
632     }
633 
transparent(&self) -> bool634     pub fn transparent(&self) -> bool {
635         self.transparent
636     }
637 
deny_unknown_fields(&self) -> bool638     pub fn deny_unknown_fields(&self) -> bool {
639         self.deny_unknown_fields
640     }
641 
default(&self) -> &Default642     pub fn default(&self) -> &Default {
643         &self.default
644     }
645 
ser_bound(&self) -> Option<&[syn::WherePredicate]>646     pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> {
647         self.ser_bound.as_ref().map(|vec| &vec[..])
648     }
649 
de_bound(&self) -> Option<&[syn::WherePredicate]>650     pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> {
651         self.de_bound.as_ref().map(|vec| &vec[..])
652     }
653 
tag(&self) -> &TagType654     pub fn tag(&self) -> &TagType {
655         &self.tag
656     }
657 
type_from(&self) -> Option<&syn::Type>658     pub fn type_from(&self) -> Option<&syn::Type> {
659         self.type_from.as_ref()
660     }
661 
type_try_from(&self) -> Option<&syn::Type>662     pub fn type_try_from(&self) -> Option<&syn::Type> {
663         self.type_try_from.as_ref()
664     }
665 
type_into(&self) -> Option<&syn::Type>666     pub fn type_into(&self) -> Option<&syn::Type> {
667         self.type_into.as_ref()
668     }
669 
remote(&self) -> Option<&syn::Path>670     pub fn remote(&self) -> Option<&syn::Path> {
671         self.remote.as_ref()
672     }
673 
is_packed(&self) -> bool674     pub fn is_packed(&self) -> bool {
675         self.is_packed
676     }
677 
identifier(&self) -> Identifier678     pub fn identifier(&self) -> Identifier {
679         self.identifier
680     }
681 
has_flatten(&self) -> bool682     pub fn has_flatten(&self) -> bool {
683         self.has_flatten
684     }
685 
mark_has_flatten(&mut self)686     pub fn mark_has_flatten(&mut self) {
687         self.has_flatten = true;
688     }
689 
custom_serde_path(&self) -> Option<&syn::Path>690     pub fn custom_serde_path(&self) -> Option<&syn::Path> {
691         self.serde_path.as_ref()
692     }
693 
serde_path(&self) -> Cow<syn::Path>694     pub fn serde_path(&self) -> Cow<syn::Path> {
695         self.custom_serde_path()
696             .map_or_else(|| Cow::Owned(parse_quote!(_serde)), Cow::Borrowed)
697     }
698 
699     /// Error message generated when type can't be deserialized.
700     /// If `None`, default message will be used
expecting(&self) -> Option<&str>701     pub fn expecting(&self) -> Option<&str> {
702         self.expecting.as_ref().map(String::as_ref)
703     }
704 }
705 
decide_tag( cx: &Ctxt, item: &syn::DeriveInput, untagged: BoolAttr, internal_tag: Attr<String>, content: Attr<String>, ) -> TagType706 fn decide_tag(
707     cx: &Ctxt,
708     item: &syn::DeriveInput,
709     untagged: BoolAttr,
710     internal_tag: Attr<String>,
711     content: Attr<String>,
712 ) -> TagType {
713     match (
714         untagged.0.get_with_tokens(),
715         internal_tag.get_with_tokens(),
716         content.get_with_tokens(),
717     ) {
718         (None, None, None) => TagType::External,
719         (Some(_), None, None) => TagType::None,
720         (None, Some((_, tag)), None) => {
721             // Check that there are no tuple variants.
722             if let syn::Data::Enum(data) = &item.data {
723                 for variant in &data.variants {
724                     match &variant.fields {
725                         syn::Fields::Named(_) | syn::Fields::Unit => {}
726                         syn::Fields::Unnamed(fields) => {
727                             if fields.unnamed.len() != 1 {
728                                 cx.error_spanned_by(
729                                     variant,
730                                     "#[serde(tag = \"...\")] cannot be used with tuple variants",
731                                 );
732                                 break;
733                             }
734                         }
735                     }
736                 }
737             }
738             TagType::Internal { tag }
739         }
740         (Some((untagged_tokens, _)), Some((tag_tokens, _)), None) => {
741             cx.error_spanned_by(
742                 untagged_tokens,
743                 "enum cannot be both untagged and internally tagged",
744             );
745             cx.error_spanned_by(
746                 tag_tokens,
747                 "enum cannot be both untagged and internally tagged",
748             );
749             TagType::External // doesn't matter, will error
750         }
751         (None, None, Some((content_tokens, _))) => {
752             cx.error_spanned_by(
753                 content_tokens,
754                 "#[serde(tag = \"...\", content = \"...\")] must be used together",
755             );
756             TagType::External
757         }
758         (Some((untagged_tokens, _)), None, Some((content_tokens, _))) => {
759             cx.error_spanned_by(
760                 untagged_tokens,
761                 "untagged enum cannot have #[serde(content = \"...\")]",
762             );
763             cx.error_spanned_by(
764                 content_tokens,
765                 "untagged enum cannot have #[serde(content = \"...\")]",
766             );
767             TagType::External
768         }
769         (None, Some((_, tag)), Some((_, content))) => TagType::Adjacent { tag, content },
770         (Some((untagged_tokens, _)), Some((tag_tokens, _)), Some((content_tokens, _))) => {
771             cx.error_spanned_by(
772                 untagged_tokens,
773                 "untagged enum cannot have #[serde(tag = \"...\", content = \"...\")]",
774             );
775             cx.error_spanned_by(
776                 tag_tokens,
777                 "untagged enum cannot have #[serde(tag = \"...\", content = \"...\")]",
778             );
779             cx.error_spanned_by(
780                 content_tokens,
781                 "untagged enum cannot have #[serde(tag = \"...\", content = \"...\")]",
782             );
783             TagType::External
784         }
785     }
786 }
787 
decide_identifier( cx: &Ctxt, item: &syn::DeriveInput, field_identifier: BoolAttr, variant_identifier: BoolAttr, ) -> Identifier788 fn decide_identifier(
789     cx: &Ctxt,
790     item: &syn::DeriveInput,
791     field_identifier: BoolAttr,
792     variant_identifier: BoolAttr,
793 ) -> Identifier {
794     match (
795         &item.data,
796         field_identifier.0.get_with_tokens(),
797         variant_identifier.0.get_with_tokens(),
798     ) {
799         (_, None, None) => Identifier::No,
800         (_, Some((field_identifier_tokens, _)), Some((variant_identifier_tokens, _))) => {
801             cx.error_spanned_by(
802                 field_identifier_tokens,
803                 "#[serde(field_identifier)] and #[serde(variant_identifier)] cannot both be set",
804             );
805             cx.error_spanned_by(
806                 variant_identifier_tokens,
807                 "#[serde(field_identifier)] and #[serde(variant_identifier)] cannot both be set",
808             );
809             Identifier::No
810         }
811         (syn::Data::Enum(_), Some(_), None) => Identifier::Field,
812         (syn::Data::Enum(_), None, Some(_)) => Identifier::Variant,
813         (syn::Data::Struct(syn::DataStruct { struct_token, .. }), Some(_), None) => {
814             cx.error_spanned_by(
815                 struct_token,
816                 "#[serde(field_identifier)] can only be used on an enum",
817             );
818             Identifier::No
819         }
820         (syn::Data::Union(syn::DataUnion { union_token, .. }), Some(_), None) => {
821             cx.error_spanned_by(
822                 union_token,
823                 "#[serde(field_identifier)] can only be used on an enum",
824             );
825             Identifier::No
826         }
827         (syn::Data::Struct(syn::DataStruct { struct_token, .. }), None, Some(_)) => {
828             cx.error_spanned_by(
829                 struct_token,
830                 "#[serde(variant_identifier)] can only be used on an enum",
831             );
832             Identifier::No
833         }
834         (syn::Data::Union(syn::DataUnion { union_token, .. }), None, Some(_)) => {
835             cx.error_spanned_by(
836                 union_token,
837                 "#[serde(variant_identifier)] can only be used on an enum",
838             );
839             Identifier::No
840         }
841     }
842 }
843 
844 /// Represents variant attribute information
845 pub struct Variant {
846     name: Name,
847     rename_all_rules: RenameAllRules,
848     ser_bound: Option<Vec<syn::WherePredicate>>,
849     de_bound: Option<Vec<syn::WherePredicate>>,
850     skip_deserializing: bool,
851     skip_serializing: bool,
852     other: bool,
853     serialize_with: Option<syn::ExprPath>,
854     deserialize_with: Option<syn::ExprPath>,
855     borrow: Option<syn::Meta>,
856 }
857 
858 impl Variant {
from_ast(cx: &Ctxt, variant: &syn::Variant) -> Self859     pub fn from_ast(cx: &Ctxt, variant: &syn::Variant) -> Self {
860         let mut ser_name = Attr::none(cx, RENAME);
861         let mut de_name = Attr::none(cx, RENAME);
862         let mut de_aliases = VecAttr::none(cx, RENAME);
863         let mut skip_deserializing = BoolAttr::none(cx, SKIP_DESERIALIZING);
864         let mut skip_serializing = BoolAttr::none(cx, SKIP_SERIALIZING);
865         let mut rename_all_ser_rule = Attr::none(cx, RENAME_ALL);
866         let mut rename_all_de_rule = Attr::none(cx, RENAME_ALL);
867         let mut ser_bound = Attr::none(cx, BOUND);
868         let mut de_bound = Attr::none(cx, BOUND);
869         let mut other = BoolAttr::none(cx, OTHER);
870         let mut serialize_with = Attr::none(cx, SERIALIZE_WITH);
871         let mut deserialize_with = Attr::none(cx, DESERIALIZE_WITH);
872         let mut borrow = Attr::none(cx, BORROW);
873 
874         for meta_item in variant
875             .attrs
876             .iter()
877             .flat_map(|attr| get_serde_meta_items(cx, attr))
878             .flatten()
879         {
880             match &meta_item {
881                 // Parse `#[serde(rename = "foo")]`
882                 Meta(NameValue(m)) if m.path == RENAME => {
883                     if let Ok(s) = get_lit_str(cx, RENAME, &m.lit) {
884                         ser_name.set(&m.path, s.value());
885                         de_name.set_if_none(s.value());
886                         de_aliases.insert(&m.path, s.value());
887                     }
888                 }
889 
890                 // Parse `#[serde(rename(serialize = "foo", deserialize = "bar"))]`
891                 Meta(List(m)) if m.path == RENAME => {
892                     if let Ok((ser, de)) = get_multiple_renames(cx, &m.nested) {
893                         ser_name.set_opt(&m.path, ser.map(syn::LitStr::value));
894                         for de_value in de {
895                             de_name.set_if_none(de_value.value());
896                             de_aliases.insert(&m.path, de_value.value());
897                         }
898                     }
899                 }
900 
901                 // Parse `#[serde(alias = "foo")]`
902                 Meta(NameValue(m)) if m.path == ALIAS => {
903                     if let Ok(s) = get_lit_str(cx, ALIAS, &m.lit) {
904                         de_aliases.insert(&m.path, s.value());
905                     }
906                 }
907 
908                 // Parse `#[serde(rename_all = "foo")]`
909                 Meta(NameValue(m)) if m.path == RENAME_ALL => {
910                     if let Ok(s) = get_lit_str(cx, RENAME_ALL, &m.lit) {
911                         match RenameRule::from_str(&s.value()) {
912                             Ok(rename_rule) => {
913                                 rename_all_ser_rule.set(&m.path, rename_rule);
914                                 rename_all_de_rule.set(&m.path, rename_rule);
915                             }
916                             Err(err) => cx.error_spanned_by(s, err),
917                         }
918                     }
919                 }
920 
921                 // Parse `#[serde(rename_all(serialize = "foo", deserialize = "bar"))]`
922                 Meta(List(m)) if m.path == RENAME_ALL => {
923                     if let Ok((ser, de)) = get_renames(cx, &m.nested) {
924                         if let Some(ser) = ser {
925                             match RenameRule::from_str(&ser.value()) {
926                                 Ok(rename_rule) => rename_all_ser_rule.set(&m.path, rename_rule),
927                                 Err(err) => cx.error_spanned_by(ser, err),
928                             }
929                         }
930                         if let Some(de) = de {
931                             match RenameRule::from_str(&de.value()) {
932                                 Ok(rename_rule) => rename_all_de_rule.set(&m.path, rename_rule),
933                                 Err(err) => cx.error_spanned_by(de, err),
934                             }
935                         }
936                     }
937                 }
938 
939                 // Parse `#[serde(skip)]`
940                 Meta(Path(word)) if word == SKIP => {
941                     skip_serializing.set_true(word);
942                     skip_deserializing.set_true(word);
943                 }
944 
945                 // Parse `#[serde(skip_deserializing)]`
946                 Meta(Path(word)) if word == SKIP_DESERIALIZING => {
947                     skip_deserializing.set_true(word);
948                 }
949 
950                 // Parse `#[serde(skip_serializing)]`
951                 Meta(Path(word)) if word == SKIP_SERIALIZING => {
952                     skip_serializing.set_true(word);
953                 }
954 
955                 // Parse `#[serde(other)]`
956                 Meta(Path(word)) if word == OTHER => {
957                     other.set_true(word);
958                 }
959 
960                 // Parse `#[serde(bound = "T: SomeBound")]`
961                 Meta(NameValue(m)) if m.path == BOUND => {
962                     if let Ok(where_predicates) = parse_lit_into_where(cx, BOUND, BOUND, &m.lit) {
963                         ser_bound.set(&m.path, where_predicates.clone());
964                         de_bound.set(&m.path, where_predicates);
965                     }
966                 }
967 
968                 // Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
969                 Meta(List(m)) if m.path == BOUND => {
970                     if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
971                         ser_bound.set_opt(&m.path, ser);
972                         de_bound.set_opt(&m.path, de);
973                     }
974                 }
975 
976                 // Parse `#[serde(with = "...")]`
977                 Meta(NameValue(m)) if m.path == WITH => {
978                     if let Ok(path) = parse_lit_into_expr_path(cx, WITH, &m.lit) {
979                         let mut ser_path = path.clone();
980                         ser_path
981                             .path
982                             .segments
983                             .push(Ident::new("serialize", Span::call_site()).into());
984                         serialize_with.set(&m.path, ser_path);
985                         let mut de_path = path;
986                         de_path
987                             .path
988                             .segments
989                             .push(Ident::new("deserialize", Span::call_site()).into());
990                         deserialize_with.set(&m.path, de_path);
991                     }
992                 }
993 
994                 // Parse `#[serde(serialize_with = "...")]`
995                 Meta(NameValue(m)) if m.path == SERIALIZE_WITH => {
996                     if let Ok(path) = parse_lit_into_expr_path(cx, SERIALIZE_WITH, &m.lit) {
997                         serialize_with.set(&m.path, path);
998                     }
999                 }
1000 
1001                 // Parse `#[serde(deserialize_with = "...")]`
1002                 Meta(NameValue(m)) if m.path == DESERIALIZE_WITH => {
1003                     if let Ok(path) = parse_lit_into_expr_path(cx, DESERIALIZE_WITH, &m.lit) {
1004                         deserialize_with.set(&m.path, path);
1005                     }
1006                 }
1007 
1008                 // Defer `#[serde(borrow)]` and `#[serde(borrow = "'a + 'b")]`
1009                 Meta(m) if m.path() == BORROW => match &variant.fields {
1010                     syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => {
1011                         borrow.set(m.path(), m.clone());
1012                     }
1013                     _ => {
1014                         cx.error_spanned_by(
1015                             variant,
1016                             "#[serde(borrow)] may only be used on newtype variants",
1017                         );
1018                     }
1019                 },
1020 
1021                 Meta(meta_item) => {
1022                     let path = meta_item
1023                         .path()
1024                         .into_token_stream()
1025                         .to_string()
1026                         .replace(' ', "");
1027                     cx.error_spanned_by(
1028                         meta_item.path(),
1029                         format!("unknown serde variant attribute `{}`", path),
1030                     );
1031                 }
1032 
1033                 Lit(lit) => {
1034                     cx.error_spanned_by(lit, "unexpected literal in serde variant attribute");
1035                 }
1036             }
1037         }
1038 
1039         Variant {
1040             name: Name::from_attrs(unraw(&variant.ident), ser_name, de_name, Some(de_aliases)),
1041             rename_all_rules: RenameAllRules {
1042                 serialize: rename_all_ser_rule.get().unwrap_or(RenameRule::None),
1043                 deserialize: rename_all_de_rule.get().unwrap_or(RenameRule::None),
1044             },
1045             ser_bound: ser_bound.get(),
1046             de_bound: de_bound.get(),
1047             skip_deserializing: skip_deserializing.get(),
1048             skip_serializing: skip_serializing.get(),
1049             other: other.get(),
1050             serialize_with: serialize_with.get(),
1051             deserialize_with: deserialize_with.get(),
1052             borrow: borrow.get(),
1053         }
1054     }
1055 
name(&self) -> &Name1056     pub fn name(&self) -> &Name {
1057         &self.name
1058     }
1059 
aliases(&self) -> Vec<String>1060     pub fn aliases(&self) -> Vec<String> {
1061         self.name.deserialize_aliases()
1062     }
1063 
rename_by_rules(&mut self, rules: &RenameAllRules)1064     pub fn rename_by_rules(&mut self, rules: &RenameAllRules) {
1065         if !self.name.serialize_renamed {
1066             self.name.serialize = rules.serialize.apply_to_variant(&self.name.serialize);
1067         }
1068         if !self.name.deserialize_renamed {
1069             self.name.deserialize = rules.deserialize.apply_to_variant(&self.name.deserialize);
1070         }
1071     }
1072 
rename_all_rules(&self) -> &RenameAllRules1073     pub fn rename_all_rules(&self) -> &RenameAllRules {
1074         &self.rename_all_rules
1075     }
1076 
ser_bound(&self) -> Option<&[syn::WherePredicate]>1077     pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> {
1078         self.ser_bound.as_ref().map(|vec| &vec[..])
1079     }
1080 
de_bound(&self) -> Option<&[syn::WherePredicate]>1081     pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> {
1082         self.de_bound.as_ref().map(|vec| &vec[..])
1083     }
1084 
skip_deserializing(&self) -> bool1085     pub fn skip_deserializing(&self) -> bool {
1086         self.skip_deserializing
1087     }
1088 
skip_serializing(&self) -> bool1089     pub fn skip_serializing(&self) -> bool {
1090         self.skip_serializing
1091     }
1092 
other(&self) -> bool1093     pub fn other(&self) -> bool {
1094         self.other
1095     }
1096 
serialize_with(&self) -> Option<&syn::ExprPath>1097     pub fn serialize_with(&self) -> Option<&syn::ExprPath> {
1098         self.serialize_with.as_ref()
1099     }
1100 
deserialize_with(&self) -> Option<&syn::ExprPath>1101     pub fn deserialize_with(&self) -> Option<&syn::ExprPath> {
1102         self.deserialize_with.as_ref()
1103     }
1104 }
1105 
1106 /// Represents field attribute information
1107 pub struct Field {
1108     name: Name,
1109     skip_serializing: bool,
1110     skip_deserializing: bool,
1111     skip_serializing_if: Option<syn::ExprPath>,
1112     default: Default,
1113     serialize_with: Option<syn::ExprPath>,
1114     deserialize_with: Option<syn::ExprPath>,
1115     ser_bound: Option<Vec<syn::WherePredicate>>,
1116     de_bound: Option<Vec<syn::WherePredicate>>,
1117     borrowed_lifetimes: BTreeSet<syn::Lifetime>,
1118     getter: Option<syn::ExprPath>,
1119     flatten: bool,
1120     transparent: bool,
1121 }
1122 
1123 /// Represents the default to use for a field when deserializing.
1124 pub enum Default {
1125     /// Field must always be specified because it does not have a default.
1126     None,
1127     /// The default is given by `std::default::Default::default()`.
1128     Default,
1129     /// The default is given by this function.
1130     Path(syn::ExprPath),
1131 }
1132 
1133 impl Default {
is_none(&self) -> bool1134     pub fn is_none(&self) -> bool {
1135         match self {
1136             Default::None => true,
1137             Default::Default | Default::Path(_) => false,
1138         }
1139     }
1140 }
1141 
1142 impl Field {
1143     /// Extract out the `#[serde(...)]` attributes from a struct field.
from_ast( cx: &Ctxt, index: usize, field: &syn::Field, attrs: Option<&Variant>, container_default: &Default, ) -> Self1144     pub fn from_ast(
1145         cx: &Ctxt,
1146         index: usize,
1147         field: &syn::Field,
1148         attrs: Option<&Variant>,
1149         container_default: &Default,
1150     ) -> Self {
1151         let mut ser_name = Attr::none(cx, RENAME);
1152         let mut de_name = Attr::none(cx, RENAME);
1153         let mut de_aliases = VecAttr::none(cx, RENAME);
1154         let mut skip_serializing = BoolAttr::none(cx, SKIP_SERIALIZING);
1155         let mut skip_deserializing = BoolAttr::none(cx, SKIP_DESERIALIZING);
1156         let mut skip_serializing_if = Attr::none(cx, SKIP_SERIALIZING_IF);
1157         let mut default = Attr::none(cx, DEFAULT);
1158         let mut serialize_with = Attr::none(cx, SERIALIZE_WITH);
1159         let mut deserialize_with = Attr::none(cx, DESERIALIZE_WITH);
1160         let mut ser_bound = Attr::none(cx, BOUND);
1161         let mut de_bound = Attr::none(cx, BOUND);
1162         let mut borrowed_lifetimes = Attr::none(cx, BORROW);
1163         let mut getter = Attr::none(cx, GETTER);
1164         let mut flatten = BoolAttr::none(cx, FLATTEN);
1165 
1166         let ident = match &field.ident {
1167             Some(ident) => unraw(ident),
1168             None => index.to_string(),
1169         };
1170 
1171         let variant_borrow = attrs
1172             .and_then(|variant| variant.borrow.as_ref())
1173             .map(|borrow| Meta(borrow.clone()));
1174 
1175         for meta_item in field
1176             .attrs
1177             .iter()
1178             .flat_map(|attr| get_serde_meta_items(cx, attr))
1179             .flatten()
1180             .chain(variant_borrow)
1181         {
1182             match &meta_item {
1183                 // Parse `#[serde(rename = "foo")]`
1184                 Meta(NameValue(m)) if m.path == RENAME => {
1185                     if let Ok(s) = get_lit_str(cx, RENAME, &m.lit) {
1186                         ser_name.set(&m.path, s.value());
1187                         de_name.set_if_none(s.value());
1188                         de_aliases.insert(&m.path, s.value());
1189                     }
1190                 }
1191 
1192                 // Parse `#[serde(rename(serialize = "foo", deserialize = "bar"))]`
1193                 Meta(List(m)) if m.path == RENAME => {
1194                     if let Ok((ser, de)) = get_multiple_renames(cx, &m.nested) {
1195                         ser_name.set_opt(&m.path, ser.map(syn::LitStr::value));
1196                         for de_value in de {
1197                             de_name.set_if_none(de_value.value());
1198                             de_aliases.insert(&m.path, de_value.value());
1199                         }
1200                     }
1201                 }
1202 
1203                 // Parse `#[serde(alias = "foo")]`
1204                 Meta(NameValue(m)) if m.path == ALIAS => {
1205                     if let Ok(s) = get_lit_str(cx, ALIAS, &m.lit) {
1206                         de_aliases.insert(&m.path, s.value());
1207                     }
1208                 }
1209 
1210                 // Parse `#[serde(default)]`
1211                 Meta(Path(word)) if word == DEFAULT => {
1212                     default.set(word, Default::Default);
1213                 }
1214 
1215                 // Parse `#[serde(default = "...")]`
1216                 Meta(NameValue(m)) if m.path == DEFAULT => {
1217                     if let Ok(path) = parse_lit_into_expr_path(cx, DEFAULT, &m.lit) {
1218                         default.set(&m.path, Default::Path(path));
1219                     }
1220                 }
1221 
1222                 // Parse `#[serde(skip_serializing)]`
1223                 Meta(Path(word)) if word == SKIP_SERIALIZING => {
1224                     skip_serializing.set_true(word);
1225                 }
1226 
1227                 // Parse `#[serde(skip_deserializing)]`
1228                 Meta(Path(word)) if word == SKIP_DESERIALIZING => {
1229                     skip_deserializing.set_true(word);
1230                 }
1231 
1232                 // Parse `#[serde(skip)]`
1233                 Meta(Path(word)) if word == SKIP => {
1234                     skip_serializing.set_true(word);
1235                     skip_deserializing.set_true(word);
1236                 }
1237 
1238                 // Parse `#[serde(skip_serializing_if = "...")]`
1239                 Meta(NameValue(m)) if m.path == SKIP_SERIALIZING_IF => {
1240                     if let Ok(path) = parse_lit_into_expr_path(cx, SKIP_SERIALIZING_IF, &m.lit) {
1241                         skip_serializing_if.set(&m.path, path);
1242                     }
1243                 }
1244 
1245                 // Parse `#[serde(serialize_with = "...")]`
1246                 Meta(NameValue(m)) if m.path == SERIALIZE_WITH => {
1247                     if let Ok(path) = parse_lit_into_expr_path(cx, SERIALIZE_WITH, &m.lit) {
1248                         serialize_with.set(&m.path, path);
1249                     }
1250                 }
1251 
1252                 // Parse `#[serde(deserialize_with = "...")]`
1253                 Meta(NameValue(m)) if m.path == DESERIALIZE_WITH => {
1254                     if let Ok(path) = parse_lit_into_expr_path(cx, DESERIALIZE_WITH, &m.lit) {
1255                         deserialize_with.set(&m.path, path);
1256                     }
1257                 }
1258 
1259                 // Parse `#[serde(with = "...")]`
1260                 Meta(NameValue(m)) if m.path == WITH => {
1261                     if let Ok(path) = parse_lit_into_expr_path(cx, WITH, &m.lit) {
1262                         let mut ser_path = path.clone();
1263                         ser_path
1264                             .path
1265                             .segments
1266                             .push(Ident::new("serialize", Span::call_site()).into());
1267                         serialize_with.set(&m.path, ser_path);
1268                         let mut de_path = path;
1269                         de_path
1270                             .path
1271                             .segments
1272                             .push(Ident::new("deserialize", Span::call_site()).into());
1273                         deserialize_with.set(&m.path, de_path);
1274                     }
1275                 }
1276 
1277                 // Parse `#[serde(bound = "T: SomeBound")]`
1278                 Meta(NameValue(m)) if m.path == BOUND => {
1279                     if let Ok(where_predicates) = parse_lit_into_where(cx, BOUND, BOUND, &m.lit) {
1280                         ser_bound.set(&m.path, where_predicates.clone());
1281                         de_bound.set(&m.path, where_predicates);
1282                     }
1283                 }
1284 
1285                 // Parse `#[serde(bound(serialize = "...", deserialize = "..."))]`
1286                 Meta(List(m)) if m.path == BOUND => {
1287                     if let Ok((ser, de)) = get_where_predicates(cx, &m.nested) {
1288                         ser_bound.set_opt(&m.path, ser);
1289                         de_bound.set_opt(&m.path, de);
1290                     }
1291                 }
1292 
1293                 // Parse `#[serde(borrow)]`
1294                 Meta(Path(word)) if word == BORROW => {
1295                     if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) {
1296                         borrowed_lifetimes.set(word, borrowable);
1297                     }
1298                 }
1299 
1300                 // Parse `#[serde(borrow = "'a + 'b")]`
1301                 Meta(NameValue(m)) if m.path == BORROW => {
1302                     if let Ok(lifetimes) = parse_lit_into_lifetimes(cx, BORROW, &m.lit) {
1303                         if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) {
1304                             for lifetime in &lifetimes {
1305                                 if !borrowable.contains(lifetime) {
1306                                     cx.error_spanned_by(
1307                                         field,
1308                                         format!(
1309                                             "field `{}` does not have lifetime {}",
1310                                             ident, lifetime
1311                                         ),
1312                                     );
1313                                 }
1314                             }
1315                             borrowed_lifetimes.set(&m.path, lifetimes);
1316                         }
1317                     }
1318                 }
1319 
1320                 // Parse `#[serde(getter = "...")]`
1321                 Meta(NameValue(m)) if m.path == GETTER => {
1322                     if let Ok(path) = parse_lit_into_expr_path(cx, GETTER, &m.lit) {
1323                         getter.set(&m.path, path);
1324                     }
1325                 }
1326 
1327                 // Parse `#[serde(flatten)]`
1328                 Meta(Path(word)) if word == FLATTEN => {
1329                     flatten.set_true(word);
1330                 }
1331 
1332                 Meta(meta_item) => {
1333                     let path = meta_item
1334                         .path()
1335                         .into_token_stream()
1336                         .to_string()
1337                         .replace(' ', "");
1338                     cx.error_spanned_by(
1339                         meta_item.path(),
1340                         format!("unknown serde field attribute `{}`", path),
1341                     );
1342                 }
1343 
1344                 Lit(lit) => {
1345                     cx.error_spanned_by(lit, "unexpected literal in serde field attribute");
1346                 }
1347             }
1348         }
1349 
1350         // Is skip_deserializing, initialize the field to Default::default() unless a
1351         // different default is specified by `#[serde(default = "...")]` on
1352         // ourselves or our container (e.g. the struct we are in).
1353         if let Default::None = *container_default {
1354             if skip_deserializing.0.value.is_some() {
1355                 default.set_if_none(Default::Default);
1356             }
1357         }
1358 
1359         let mut borrowed_lifetimes = borrowed_lifetimes.get().unwrap_or_default();
1360         if !borrowed_lifetimes.is_empty() {
1361             // Cow<str> and Cow<[u8]> never borrow by default:
1362             //
1363             //     impl<'de, 'a, T: ?Sized> Deserialize<'de> for Cow<'a, T>
1364             //
1365             // A #[serde(borrow)] attribute enables borrowing that corresponds
1366             // roughly to these impls:
1367             //
1368             //     impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, str>
1369             //     impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, [u8]>
1370             if is_cow(&field.ty, is_str) {
1371                 let mut path = syn::Path {
1372                     leading_colon: None,
1373                     segments: Punctuated::new(),
1374                 };
1375                 let span = Span::call_site();
1376                 path.segments.push(Ident::new("_serde", span).into());
1377                 path.segments.push(Ident::new("__private", span).into());
1378                 path.segments.push(Ident::new("de", span).into());
1379                 path.segments
1380                     .push(Ident::new("borrow_cow_str", span).into());
1381                 let expr = syn::ExprPath {
1382                     attrs: Vec::new(),
1383                     qself: None,
1384                     path,
1385                 };
1386                 deserialize_with.set_if_none(expr);
1387             } else if is_cow(&field.ty, is_slice_u8) {
1388                 let mut path = syn::Path {
1389                     leading_colon: None,
1390                     segments: Punctuated::new(),
1391                 };
1392                 let span = Span::call_site();
1393                 path.segments.push(Ident::new("_serde", span).into());
1394                 path.segments.push(Ident::new("__private", span).into());
1395                 path.segments.push(Ident::new("de", span).into());
1396                 path.segments
1397                     .push(Ident::new("borrow_cow_bytes", span).into());
1398                 let expr = syn::ExprPath {
1399                     attrs: Vec::new(),
1400                     qself: None,
1401                     path,
1402                 };
1403                 deserialize_with.set_if_none(expr);
1404             }
1405         } else if is_implicitly_borrowed(&field.ty) {
1406             // Types &str and &[u8] are always implicitly borrowed. No need for
1407             // a #[serde(borrow)].
1408             collect_lifetimes(&field.ty, &mut borrowed_lifetimes);
1409         }
1410 
1411         Field {
1412             name: Name::from_attrs(ident, ser_name, de_name, Some(de_aliases)),
1413             skip_serializing: skip_serializing.get(),
1414             skip_deserializing: skip_deserializing.get(),
1415             skip_serializing_if: skip_serializing_if.get(),
1416             default: default.get().unwrap_or(Default::None),
1417             serialize_with: serialize_with.get(),
1418             deserialize_with: deserialize_with.get(),
1419             ser_bound: ser_bound.get(),
1420             de_bound: de_bound.get(),
1421             borrowed_lifetimes,
1422             getter: getter.get(),
1423             flatten: flatten.get(),
1424             transparent: false,
1425         }
1426     }
1427 
name(&self) -> &Name1428     pub fn name(&self) -> &Name {
1429         &self.name
1430     }
1431 
aliases(&self) -> Vec<String>1432     pub fn aliases(&self) -> Vec<String> {
1433         self.name.deserialize_aliases()
1434     }
1435 
rename_by_rules(&mut self, rules: &RenameAllRules)1436     pub fn rename_by_rules(&mut self, rules: &RenameAllRules) {
1437         if !self.name.serialize_renamed {
1438             self.name.serialize = rules.serialize.apply_to_field(&self.name.serialize);
1439         }
1440         if !self.name.deserialize_renamed {
1441             self.name.deserialize = rules.deserialize.apply_to_field(&self.name.deserialize);
1442         }
1443     }
1444 
skip_serializing(&self) -> bool1445     pub fn skip_serializing(&self) -> bool {
1446         self.skip_serializing
1447     }
1448 
skip_deserializing(&self) -> bool1449     pub fn skip_deserializing(&self) -> bool {
1450         self.skip_deserializing
1451     }
1452 
skip_serializing_if(&self) -> Option<&syn::ExprPath>1453     pub fn skip_serializing_if(&self) -> Option<&syn::ExprPath> {
1454         self.skip_serializing_if.as_ref()
1455     }
1456 
default(&self) -> &Default1457     pub fn default(&self) -> &Default {
1458         &self.default
1459     }
1460 
serialize_with(&self) -> Option<&syn::ExprPath>1461     pub fn serialize_with(&self) -> Option<&syn::ExprPath> {
1462         self.serialize_with.as_ref()
1463     }
1464 
deserialize_with(&self) -> Option<&syn::ExprPath>1465     pub fn deserialize_with(&self) -> Option<&syn::ExprPath> {
1466         self.deserialize_with.as_ref()
1467     }
1468 
ser_bound(&self) -> Option<&[syn::WherePredicate]>1469     pub fn ser_bound(&self) -> Option<&[syn::WherePredicate]> {
1470         self.ser_bound.as_ref().map(|vec| &vec[..])
1471     }
1472 
de_bound(&self) -> Option<&[syn::WherePredicate]>1473     pub fn de_bound(&self) -> Option<&[syn::WherePredicate]> {
1474         self.de_bound.as_ref().map(|vec| &vec[..])
1475     }
1476 
borrowed_lifetimes(&self) -> &BTreeSet<syn::Lifetime>1477     pub fn borrowed_lifetimes(&self) -> &BTreeSet<syn::Lifetime> {
1478         &self.borrowed_lifetimes
1479     }
1480 
getter(&self) -> Option<&syn::ExprPath>1481     pub fn getter(&self) -> Option<&syn::ExprPath> {
1482         self.getter.as_ref()
1483     }
1484 
flatten(&self) -> bool1485     pub fn flatten(&self) -> bool {
1486         self.flatten
1487     }
1488 
transparent(&self) -> bool1489     pub fn transparent(&self) -> bool {
1490         self.transparent
1491     }
1492 
mark_transparent(&mut self)1493     pub fn mark_transparent(&mut self) {
1494         self.transparent = true;
1495     }
1496 }
1497 
1498 type SerAndDe<T> = (Option<T>, Option<T>);
1499 
get_ser_and_de<'a, 'b, T, F>( cx: &'b Ctxt, attr_name: Symbol, metas: &'a Punctuated<syn::NestedMeta, Token![,]>, f: F, ) -> Result<(VecAttr<'b, T>, VecAttr<'b, T>), ()> where T: 'a, F: Fn(&Ctxt, Symbol, Symbol, &'a syn::Lit) -> Result<T, ()>,1500 fn get_ser_and_de<'a, 'b, T, F>(
1501     cx: &'b Ctxt,
1502     attr_name: Symbol,
1503     metas: &'a Punctuated<syn::NestedMeta, Token![,]>,
1504     f: F,
1505 ) -> Result<(VecAttr<'b, T>, VecAttr<'b, T>), ()>
1506 where
1507     T: 'a,
1508     F: Fn(&Ctxt, Symbol, Symbol, &'a syn::Lit) -> Result<T, ()>,
1509 {
1510     let mut ser_meta = VecAttr::none(cx, attr_name);
1511     let mut de_meta = VecAttr::none(cx, attr_name);
1512 
1513     for meta in metas {
1514         match meta {
1515             Meta(NameValue(meta)) if meta.path == SERIALIZE => {
1516                 if let Ok(v) = f(cx, attr_name, SERIALIZE, &meta.lit) {
1517                     ser_meta.insert(&meta.path, v);
1518                 }
1519             }
1520 
1521             Meta(NameValue(meta)) if meta.path == DESERIALIZE => {
1522                 if let Ok(v) = f(cx, attr_name, DESERIALIZE, &meta.lit) {
1523                     de_meta.insert(&meta.path, v);
1524                 }
1525             }
1526 
1527             _ => {
1528                 cx.error_spanned_by(
1529                     meta,
1530                     format!(
1531                         "malformed {0} attribute, expected `{0}(serialize = ..., deserialize = ...)`",
1532                         attr_name
1533                     ),
1534                 );
1535                 return Err(());
1536             }
1537         }
1538     }
1539 
1540     Ok((ser_meta, de_meta))
1541 }
1542 
get_renames<'a>( cx: &Ctxt, items: &'a Punctuated<syn::NestedMeta, Token![,]>, ) -> Result<SerAndDe<&'a syn::LitStr>, ()>1543 fn get_renames<'a>(
1544     cx: &Ctxt,
1545     items: &'a Punctuated<syn::NestedMeta, Token![,]>,
1546 ) -> Result<SerAndDe<&'a syn::LitStr>, ()> {
1547     let (ser, de) = get_ser_and_de(cx, RENAME, items, get_lit_str2)?;
1548     Ok((ser.at_most_one()?, de.at_most_one()?))
1549 }
1550 
get_multiple_renames<'a>( cx: &Ctxt, items: &'a Punctuated<syn::NestedMeta, Token![,]>, ) -> Result<(Option<&'a syn::LitStr>, Vec<&'a syn::LitStr>), ()>1551 fn get_multiple_renames<'a>(
1552     cx: &Ctxt,
1553     items: &'a Punctuated<syn::NestedMeta, Token![,]>,
1554 ) -> Result<(Option<&'a syn::LitStr>, Vec<&'a syn::LitStr>), ()> {
1555     let (ser, de) = get_ser_and_de(cx, RENAME, items, get_lit_str2)?;
1556     Ok((ser.at_most_one()?, de.get()))
1557 }
1558 
get_where_predicates( cx: &Ctxt, items: &Punctuated<syn::NestedMeta, Token![,]>, ) -> Result<SerAndDe<Vec<syn::WherePredicate>>, ()>1559 fn get_where_predicates(
1560     cx: &Ctxt,
1561     items: &Punctuated<syn::NestedMeta, Token![,]>,
1562 ) -> Result<SerAndDe<Vec<syn::WherePredicate>>, ()> {
1563     let (ser, de) = get_ser_and_de(cx, BOUND, items, parse_lit_into_where)?;
1564     Ok((ser.at_most_one()?, de.at_most_one()?))
1565 }
1566 
get_serde_meta_items(cx: &Ctxt, attr: &syn::Attribute) -> Result<Vec<syn::NestedMeta>, ()>1567 pub fn get_serde_meta_items(cx: &Ctxt, attr: &syn::Attribute) -> Result<Vec<syn::NestedMeta>, ()> {
1568     if attr.path != SERDE {
1569         return Ok(Vec::new());
1570     }
1571 
1572     match attr.parse_meta() {
1573         Ok(List(meta)) => Ok(meta.nested.into_iter().collect()),
1574         Ok(other) => {
1575             cx.error_spanned_by(other, "expected #[serde(...)]");
1576             Err(())
1577         }
1578         Err(err) => {
1579             cx.syn_error(err);
1580             Err(())
1581         }
1582     }
1583 }
1584 
get_lit_str<'a>(cx: &Ctxt, attr_name: Symbol, lit: &'a syn::Lit) -> Result<&'a syn::LitStr, ()>1585 fn get_lit_str<'a>(cx: &Ctxt, attr_name: Symbol, lit: &'a syn::Lit) -> Result<&'a syn::LitStr, ()> {
1586     get_lit_str2(cx, attr_name, attr_name, lit)
1587 }
1588 
get_lit_str2<'a>( cx: &Ctxt, attr_name: Symbol, meta_item_name: Symbol, lit: &'a syn::Lit, ) -> Result<&'a syn::LitStr, ()>1589 fn get_lit_str2<'a>(
1590     cx: &Ctxt,
1591     attr_name: Symbol,
1592     meta_item_name: Symbol,
1593     lit: &'a syn::Lit,
1594 ) -> Result<&'a syn::LitStr, ()> {
1595     if let syn::Lit::Str(lit) = lit {
1596         Ok(lit)
1597     } else {
1598         cx.error_spanned_by(
1599             lit,
1600             format!(
1601                 "expected serde {} attribute to be a string: `{} = \"...\"`",
1602                 attr_name, meta_item_name
1603             ),
1604         );
1605         Err(())
1606     }
1607 }
1608 
parse_lit_into_path(cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit) -> Result<syn::Path, ()>1609 fn parse_lit_into_path(cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit) -> Result<syn::Path, ()> {
1610     let string = get_lit_str(cx, attr_name, lit)?;
1611     parse_lit_str(string).map_err(|_| {
1612         cx.error_spanned_by(lit, format!("failed to parse path: {:?}", string.value()))
1613     })
1614 }
1615 
parse_lit_into_expr_path( cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit, ) -> Result<syn::ExprPath, ()>1616 fn parse_lit_into_expr_path(
1617     cx: &Ctxt,
1618     attr_name: Symbol,
1619     lit: &syn::Lit,
1620 ) -> Result<syn::ExprPath, ()> {
1621     let string = get_lit_str(cx, attr_name, lit)?;
1622     parse_lit_str(string).map_err(|_| {
1623         cx.error_spanned_by(lit, format!("failed to parse path: {:?}", string.value()))
1624     })
1625 }
1626 
parse_lit_into_where( cx: &Ctxt, attr_name: Symbol, meta_item_name: Symbol, lit: &syn::Lit, ) -> Result<Vec<syn::WherePredicate>, ()>1627 fn parse_lit_into_where(
1628     cx: &Ctxt,
1629     attr_name: Symbol,
1630     meta_item_name: Symbol,
1631     lit: &syn::Lit,
1632 ) -> Result<Vec<syn::WherePredicate>, ()> {
1633     let string = get_lit_str2(cx, attr_name, meta_item_name, lit)?;
1634     if string.value().is_empty() {
1635         return Ok(Vec::new());
1636     }
1637 
1638     let where_string = syn::LitStr::new(&format!("where {}", string.value()), string.span());
1639 
1640     parse_lit_str::<syn::WhereClause>(&where_string)
1641         .map(|wh| wh.predicates.into_iter().collect())
1642         .map_err(|err| cx.error_spanned_by(lit, err))
1643 }
1644 
parse_lit_into_ty(cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit) -> Result<syn::Type, ()>1645 fn parse_lit_into_ty(cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit) -> Result<syn::Type, ()> {
1646     let string = get_lit_str(cx, attr_name, lit)?;
1647 
1648     parse_lit_str(string).map_err(|_| {
1649         cx.error_spanned_by(
1650             lit,
1651             format!("failed to parse type: {} = {:?}", attr_name, string.value()),
1652         )
1653     })
1654 }
1655 
1656 // Parses a string literal like "'a + 'b + 'c" containing a nonempty list of
1657 // lifetimes separated by `+`.
parse_lit_into_lifetimes( cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit, ) -> Result<BTreeSet<syn::Lifetime>, ()>1658 fn parse_lit_into_lifetimes(
1659     cx: &Ctxt,
1660     attr_name: Symbol,
1661     lit: &syn::Lit,
1662 ) -> Result<BTreeSet<syn::Lifetime>, ()> {
1663     let string = get_lit_str(cx, attr_name, lit)?;
1664     if string.value().is_empty() {
1665         cx.error_spanned_by(lit, "at least one lifetime must be borrowed");
1666         return Err(());
1667     }
1668 
1669     struct BorrowedLifetimes(Punctuated<syn::Lifetime, Token![+]>);
1670 
1671     impl Parse for BorrowedLifetimes {
1672         fn parse(input: ParseStream) -> parse::Result<Self> {
1673             Punctuated::parse_separated_nonempty(input).map(BorrowedLifetimes)
1674         }
1675     }
1676 
1677     if let Ok(BorrowedLifetimes(lifetimes)) = parse_lit_str(string) {
1678         let mut set = BTreeSet::new();
1679         for lifetime in lifetimes {
1680             if !set.insert(lifetime.clone()) {
1681                 cx.error_spanned_by(lit, format!("duplicate borrowed lifetime `{}`", lifetime));
1682             }
1683         }
1684         return Ok(set);
1685     }
1686 
1687     cx.error_spanned_by(
1688         lit,
1689         format!("failed to parse borrowed lifetimes: {:?}", string.value()),
1690     );
1691     Err(())
1692 }
1693 
is_implicitly_borrowed(ty: &syn::Type) -> bool1694 fn is_implicitly_borrowed(ty: &syn::Type) -> bool {
1695     is_implicitly_borrowed_reference(ty) || is_option(ty, is_implicitly_borrowed_reference)
1696 }
1697 
is_implicitly_borrowed_reference(ty: &syn::Type) -> bool1698 fn is_implicitly_borrowed_reference(ty: &syn::Type) -> bool {
1699     is_reference(ty, is_str) || is_reference(ty, is_slice_u8)
1700 }
1701 
1702 // Whether the type looks like it might be `std::borrow::Cow<T>` where elem="T".
1703 // This can have false negatives and false positives.
1704 //
1705 // False negative:
1706 //
1707 //     use std::borrow::Cow as Pig;
1708 //
1709 //     #[derive(Deserialize)]
1710 //     struct S<'a> {
1711 //         #[serde(borrow)]
1712 //         pig: Pig<'a, str>,
1713 //     }
1714 //
1715 // False positive:
1716 //
1717 //     type str = [i16];
1718 //
1719 //     #[derive(Deserialize)]
1720 //     struct S<'a> {
1721 //         #[serde(borrow)]
1722 //         cow: Cow<'a, str>,
1723 //     }
is_cow(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool1724 fn is_cow(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool {
1725     let path = match ungroup(ty) {
1726         syn::Type::Path(ty) => &ty.path,
1727         _ => {
1728             return false;
1729         }
1730     };
1731     let seg = match path.segments.last() {
1732         Some(seg) => seg,
1733         None => {
1734             return false;
1735         }
1736     };
1737     let args = match &seg.arguments {
1738         syn::PathArguments::AngleBracketed(bracketed) => &bracketed.args,
1739         _ => {
1740             return false;
1741         }
1742     };
1743     seg.ident == "Cow"
1744         && args.len() == 2
1745         && match (&args[0], &args[1]) {
1746             (syn::GenericArgument::Lifetime(_), syn::GenericArgument::Type(arg)) => elem(arg),
1747             _ => false,
1748         }
1749 }
1750 
is_option(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool1751 fn is_option(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool {
1752     let path = match ungroup(ty) {
1753         syn::Type::Path(ty) => &ty.path,
1754         _ => {
1755             return false;
1756         }
1757     };
1758     let seg = match path.segments.last() {
1759         Some(seg) => seg,
1760         None => {
1761             return false;
1762         }
1763     };
1764     let args = match &seg.arguments {
1765         syn::PathArguments::AngleBracketed(bracketed) => &bracketed.args,
1766         _ => {
1767             return false;
1768         }
1769     };
1770     seg.ident == "Option"
1771         && args.len() == 1
1772         && match &args[0] {
1773             syn::GenericArgument::Type(arg) => elem(arg),
1774             _ => false,
1775         }
1776 }
1777 
1778 // Whether the type looks like it might be `&T` where elem="T". This can have
1779 // false negatives and false positives.
1780 //
1781 // False negative:
1782 //
1783 //     type Yarn = str;
1784 //
1785 //     #[derive(Deserialize)]
1786 //     struct S<'a> {
1787 //         r: &'a Yarn,
1788 //     }
1789 //
1790 // False positive:
1791 //
1792 //     type str = [i16];
1793 //
1794 //     #[derive(Deserialize)]
1795 //     struct S<'a> {
1796 //         r: &'a str,
1797 //     }
is_reference(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool1798 fn is_reference(ty: &syn::Type, elem: fn(&syn::Type) -> bool) -> bool {
1799     match ungroup(ty) {
1800         syn::Type::Reference(ty) => ty.mutability.is_none() && elem(&ty.elem),
1801         _ => false,
1802     }
1803 }
1804 
is_str(ty: &syn::Type) -> bool1805 fn is_str(ty: &syn::Type) -> bool {
1806     is_primitive_type(ty, "str")
1807 }
1808 
is_slice_u8(ty: &syn::Type) -> bool1809 fn is_slice_u8(ty: &syn::Type) -> bool {
1810     match ungroup(ty) {
1811         syn::Type::Slice(ty) => is_primitive_type(&ty.elem, "u8"),
1812         _ => false,
1813     }
1814 }
1815 
is_primitive_type(ty: &syn::Type, primitive: &str) -> bool1816 fn is_primitive_type(ty: &syn::Type, primitive: &str) -> bool {
1817     match ungroup(ty) {
1818         syn::Type::Path(ty) => ty.qself.is_none() && is_primitive_path(&ty.path, primitive),
1819         _ => false,
1820     }
1821 }
1822 
is_primitive_path(path: &syn::Path, primitive: &str) -> bool1823 fn is_primitive_path(path: &syn::Path, primitive: &str) -> bool {
1824     path.leading_colon.is_none()
1825         && path.segments.len() == 1
1826         && path.segments[0].ident == primitive
1827         && path.segments[0].arguments.is_empty()
1828 }
1829 
1830 // All lifetimes that this type could borrow from a Deserializer.
1831 //
1832 // For example a type `S<'a, 'b>` could borrow `'a` and `'b`. On the other hand
1833 // a type `for<'a> fn(&'a str)` could not borrow `'a` from the Deserializer.
1834 //
1835 // This is used when there is an explicit or implicit `#[serde(borrow)]`
1836 // attribute on the field so there must be at least one borrowable lifetime.
borrowable_lifetimes( cx: &Ctxt, name: &str, field: &syn::Field, ) -> Result<BTreeSet<syn::Lifetime>, ()>1837 fn borrowable_lifetimes(
1838     cx: &Ctxt,
1839     name: &str,
1840     field: &syn::Field,
1841 ) -> Result<BTreeSet<syn::Lifetime>, ()> {
1842     let mut lifetimes = BTreeSet::new();
1843     collect_lifetimes(&field.ty, &mut lifetimes);
1844     if lifetimes.is_empty() {
1845         cx.error_spanned_by(
1846             field,
1847             format!("field `{}` has no lifetimes to borrow", name),
1848         );
1849         Err(())
1850     } else {
1851         Ok(lifetimes)
1852     }
1853 }
1854 
collect_lifetimes(ty: &syn::Type, out: &mut BTreeSet<syn::Lifetime>)1855 fn collect_lifetimes(ty: &syn::Type, out: &mut BTreeSet<syn::Lifetime>) {
1856     match ty {
1857         syn::Type::Slice(ty) => {
1858             collect_lifetimes(&ty.elem, out);
1859         }
1860         syn::Type::Array(ty) => {
1861             collect_lifetimes(&ty.elem, out);
1862         }
1863         syn::Type::Ptr(ty) => {
1864             collect_lifetimes(&ty.elem, out);
1865         }
1866         syn::Type::Reference(ty) => {
1867             out.extend(ty.lifetime.iter().cloned());
1868             collect_lifetimes(&ty.elem, out);
1869         }
1870         syn::Type::Tuple(ty) => {
1871             for elem in &ty.elems {
1872                 collect_lifetimes(elem, out);
1873             }
1874         }
1875         syn::Type::Path(ty) => {
1876             if let Some(qself) = &ty.qself {
1877                 collect_lifetimes(&qself.ty, out);
1878             }
1879             for seg in &ty.path.segments {
1880                 if let syn::PathArguments::AngleBracketed(bracketed) = &seg.arguments {
1881                     for arg in &bracketed.args {
1882                         match arg {
1883                             syn::GenericArgument::Lifetime(lifetime) => {
1884                                 out.insert(lifetime.clone());
1885                             }
1886                             syn::GenericArgument::Type(ty) => {
1887                                 collect_lifetimes(ty, out);
1888                             }
1889                             syn::GenericArgument::Binding(binding) => {
1890                                 collect_lifetimes(&binding.ty, out);
1891                             }
1892                             syn::GenericArgument::Constraint(_)
1893                             | syn::GenericArgument::Const(_) => {}
1894                         }
1895                     }
1896                 }
1897             }
1898         }
1899         syn::Type::Paren(ty) => {
1900             collect_lifetimes(&ty.elem, out);
1901         }
1902         syn::Type::Group(ty) => {
1903             collect_lifetimes(&ty.elem, out);
1904         }
1905         syn::Type::Macro(ty) => {
1906             collect_lifetimes_from_tokens(ty.mac.tokens.clone(), out);
1907         }
1908         syn::Type::BareFn(_)
1909         | syn::Type::Never(_)
1910         | syn::Type::TraitObject(_)
1911         | syn::Type::ImplTrait(_)
1912         | syn::Type::Infer(_)
1913         | syn::Type::Verbatim(_) => {}
1914 
1915         #[cfg(test)]
1916         syn::Type::__TestExhaustive(_) => unimplemented!(),
1917         #[cfg(not(test))]
1918         _ => {}
1919     }
1920 }
1921 
collect_lifetimes_from_tokens(tokens: TokenStream, out: &mut BTreeSet<syn::Lifetime>)1922 fn collect_lifetimes_from_tokens(tokens: TokenStream, out: &mut BTreeSet<syn::Lifetime>) {
1923     let mut iter = tokens.into_iter();
1924     while let Some(tt) = iter.next() {
1925         match &tt {
1926             TokenTree::Punct(op) if op.as_char() == '\'' && op.spacing() == Spacing::Joint => {
1927                 if let Some(TokenTree::Ident(ident)) = iter.next() {
1928                     out.insert(syn::Lifetime {
1929                         apostrophe: op.span(),
1930                         ident,
1931                     });
1932                 }
1933             }
1934             TokenTree::Group(group) => {
1935                 let tokens = group.stream();
1936                 collect_lifetimes_from_tokens(tokens, out);
1937             }
1938             _ => {}
1939         }
1940     }
1941 }
1942 
parse_lit_str<T>(s: &syn::LitStr) -> parse::Result<T> where T: Parse,1943 fn parse_lit_str<T>(s: &syn::LitStr) -> parse::Result<T>
1944 where
1945     T: Parse,
1946 {
1947     let tokens = spanned_tokens(s)?;
1948     syn::parse2(tokens)
1949 }
1950 
spanned_tokens(s: &syn::LitStr) -> parse::Result<TokenStream>1951 fn spanned_tokens(s: &syn::LitStr) -> parse::Result<TokenStream> {
1952     let stream = syn::parse_str(&s.value())?;
1953     Ok(respan(stream, s.span()))
1954 }
1955