Handle nested syn::Type:::Group

Currently, rustc does not pass the exact original TokenStream to
proc-macros in several cases. This has many undesirable effects, such as
losing correct location information in error message.
See rust-lang/rust#43081 for more details

In the future, rustc will begin passing the correct TokenStream to
proc-macros. As a result, `syn` may wrap a type in one or more
`syn::Type::Group`s (if the proc-macro input came from a `macro_rules!` expansion).

I've determined that this can cause `yaserde-derive` to fail to match
a `Type::Path`. This PR should properly handle nested groups, allowing
your crate to work with both old and new input.

If you have any questions, feel free to ask me. See rust-lang/rust#72622
for more details.
This commit is contained in:
Aaron Hill 2020-05-30 23:58:43 -04:00
parent 06dfc427fe
commit 6732d8b38a
No known key found for this signature in database
GPG Key ID: B4087E510E98B164

View File

@ -225,7 +225,11 @@ impl From<&syn::Path> for Field {
impl From<&syn::Field> for Field {
fn from(field: &syn::Field) -> Self {
match field.ty {
let mut ty = &field.ty;
while let syn::Type::Group(g) = ty {
ty = &g.elem;
}
match ty {
Path(ref path) => Field::from(&path.path),
_ => panic!("unable to match {:?}", field.ty),
}