@@ -8,8 +8,8 @@ use proc_macro2::{Ident, Span, TokenStream};
88use proc_macro_error:: { abort, proc_macro_error} ;
99use quote:: { quote, ToTokens } ;
1010use syn:: {
11- parse_macro_input, AttrStyle , Attribute , Data , DeriveInput , Expr , Fields , Index , Lit , Meta ,
12- NestedMeta , Type , TypeGenerics , TypePath ,
11+ parse_macro_input, AttrStyle , Attribute , Data , DeriveInput , Expr , Fields , Index , LitStr , Type ,
12+ TypeGenerics , TypePath ,
1313} ;
1414
1515#[ proc_macro_derive( H5Type , attributes( hdf5) ) ]
@@ -107,55 +107,40 @@ fn is_phantom_data(ty: &Type) -> bool {
107107}
108108
109109fn find_repr ( attrs : & [ Attribute ] , expected : & [ & str ] ) -> Option < Ident > {
110+ let mut repr = None ;
110111 for attr in attrs. iter ( ) {
111112 if attr. style != AttrStyle :: Outer {
112113 continue ;
113114 }
114- let list = match attr. parse_meta ( ) {
115- Ok ( Meta :: List ( list) ) => list,
116- _ => continue ,
117- } ;
118- if !list. path . get_ident ( ) . map_or ( false , |ident| ident == "repr" ) {
115+ if !attr. path ( ) . is_ident ( "repr" ) {
119116 continue ;
120117 }
121- for item in list. nested . iter ( ) {
122- let path = match item {
123- NestedMeta :: Meta ( Meta :: Path ( ref path) ) => path,
124- _ => continue ,
125- } ;
126- let ident = match path. get_ident ( ) {
127- Some ( ident) => ident,
128- _ => continue ,
129- } ;
130- if expected. iter ( ) . any ( |& s| ident == s) {
131- return Some ( Ident :: new ( & ident. to_string ( ) , Span :: call_site ( ) ) ) ;
118+ attr. parse_nested_meta ( |meta| {
119+ if expected. iter ( ) . any ( |s| meta. path . is_ident ( s) ) {
120+ if repr. is_some ( ) {
121+ abort ! ( meta. path, "ambiguous repr attribute" ) ;
122+ } else {
123+ repr = meta. path . get_ident ( ) . cloned ( ) ;
124+ }
132125 }
133- }
126+ Ok ( ( ) )
127+ } )
128+ . ok ( ) ?;
134129 }
135-
136- None
130+ repr
137131}
138132
139133fn find_hdf5_rename ( attrs : & [ Attribute ] ) -> Option < String > {
140- if let Some ( attr) = attrs. iter ( ) . find ( |a| a. path . is_ident ( "hdf5" ) ) {
141- if let Ok ( Meta :: List ( meta_list) ) = attr. parse_meta ( ) {
142- let rename_literal = meta_list. nested . iter ( ) . find_map ( |n| {
143- if let NestedMeta :: Meta ( Meta :: NameValue ( name_value) ) = n {
144- if name_value. path . is_ident ( "rename" ) {
145- return Some ( & name_value. lit ) ;
146- }
147- }
148-
149- None
150- } ) ;
151-
152- if let Some ( Lit :: Str ( renamed) ) = rename_literal {
153- return Some ( renamed. value ( ) ) ;
154- }
134+ let mut rename = None ;
135+ let attr = attrs. iter ( ) . find ( |a| a. path ( ) . is_ident ( "hdf5" ) ) ?;
136+ attr. parse_nested_meta ( |meta| {
137+ if meta. path . is_ident ( "rename" ) && rename. is_none ( ) {
138+ rename = Some ( meta. value ( ) ?. parse :: < LitStr > ( ) ?. value ( ) ) ;
155139 }
156- }
157-
158- None
140+ Ok ( ( ) )
141+ } )
142+ . ok ( ) ?;
143+ rename
159144}
160145
161146fn pluck < ' a , I , F , T , S > ( iter : I , func : F ) -> Vec < S >
0 commit comments