diff options
author | Haibo Huang <hhb@google.com> | 2020-09-09 19:09:50 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-09-09 19:09:50 +0000 |
commit | d258c35f02065cf36e4b1495bc01e2449eaa1f20 (patch) | |
tree | 2787830eaa7e620839be621224cb18d6f06a0bec /src/ast.rs | |
parent | f16af11a58d91eded2de50661515d1330297ee2e (diff) | |
parent | 497884ee62fb3b409d3c7a76d38eef28ad44862a (diff) | |
download | thiserror-impl-d258c35f02065cf36e4b1495bc01e2449eaa1f20.tar.gz |
Merge "Upgrade rust/crates/thiserror-impl to 1.0.20" am: 34a3122583 am: 033ae1ceeb am: 497884ee62
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/thiserror-impl/+/1414399
Change-Id: Ib9831760cc45d5fa305df52139eabf010cad5868
Diffstat (limited to 'src/ast.rs')
-rw-r--r-- | src/ast.rs | 44 |
1 files changed, 31 insertions, 13 deletions
@@ -1,4 +1,5 @@ use crate::attr::{self, Attrs}; +use proc_macro2::Span; use syn::{ Data, DataEnum, DataStruct, DeriveInput, Error, Fields, Generics, Ident, Index, Member, Result, Type, @@ -55,7 +56,8 @@ impl<'a> Input<'a> { impl<'a> Struct<'a> { fn from_syn(node: &'a DeriveInput, data: &'a DataStruct) -> Result<Self> { let mut attrs = attr::get(&node.attrs)?; - let fields = Field::multiple_from_syn(&data.fields)?; + let span = attrs.span().unwrap_or_else(Span::call_site); + let fields = Field::multiple_from_syn(&data.fields, span)?; if let Some(display) = &mut attrs.display { display.expand_shorthand(&fields); } @@ -72,11 +74,12 @@ impl<'a> Struct<'a> { impl<'a> Enum<'a> { fn from_syn(node: &'a DeriveInput, data: &'a DataEnum) -> Result<Self> { let attrs = attr::get(&node.attrs)?; + let span = attrs.span().unwrap_or_else(Span::call_site); let variants = data .variants .iter() .map(|node| { - let mut variant = Variant::from_syn(node)?; + let mut variant = Variant::from_syn(node, span)?; if let display @ None = &mut variant.attrs.display { *display = attrs.display.clone(); } @@ -99,35 +102,50 @@ impl<'a> Enum<'a> { } impl<'a> Variant<'a> { - fn from_syn(node: &'a syn::Variant) -> Result<Self> { + fn from_syn(node: &'a syn::Variant, span: Span) -> Result<Self> { + let attrs = attr::get(&node.attrs)?; + let span = attrs.span().unwrap_or(span); Ok(Variant { original: node, - attrs: attr::get(&node.attrs)?, + attrs, ident: node.ident.clone(), - fields: Field::multiple_from_syn(&node.fields)?, + fields: Field::multiple_from_syn(&node.fields, span)?, }) } } impl<'a> Field<'a> { - fn multiple_from_syn(fields: &'a Fields) -> Result<Vec<Self>> { + fn multiple_from_syn(fields: &'a Fields, span: Span) -> Result<Vec<Self>> { fields .iter() .enumerate() - .map(|(i, field)| Field::from_syn(i, field)) + .map(|(i, field)| Field::from_syn(i, field, span)) .collect() } - fn from_syn(i: usize, node: &'a syn::Field) -> Result<Self> { + fn from_syn(i: usize, node: &'a syn::Field, span: Span) -> Result<Self> { Ok(Field { original: node, attrs: attr::get(&node.attrs)?, - member: node - .ident - .clone() - .map(Member::Named) - .unwrap_or_else(|| Member::Unnamed(Index::from(i))), + member: node.ident.clone().map(Member::Named).unwrap_or_else(|| { + Member::Unnamed(Index { + index: i as u32, + span, + }) + }), ty: &node.ty, }) } } + +impl Attrs<'_> { + pub fn span(&self) -> Option<Span> { + if let Some(display) = &self.display { + Some(display.fmt.span()) + } else if let Some(transparent) = &self.transparent { + Some(transparent.span) + } else { + None + } + } +} |