1- use std:: collections:: HashSet ;
2-
31use proc_macro2:: Ident ;
42use proc_macro2:: TokenStream ;
53use quote:: format_ident;
@@ -13,6 +11,7 @@ use syn::parse_quote;
1311use crate :: dir_structure_core:: DirStructureCoreInfo ;
1412use crate :: dir_structure_core:: PathSpec ;
1513use crate :: dir_structure_core:: compile_attrs;
14+ use crate :: merge_where_clause;
1615
1716struct DirStructureForField {
1817 read_code : TokenStream ,
@@ -220,8 +219,8 @@ pub fn expand_dir_structure(st: ItemStruct) -> syn::Result<TokenStream> {
220219
221220 let mut field_read_impls = Vec :: new ( ) ;
222221 let mut field_write_impls = Vec :: new ( ) ;
223- let mut read_bounds_b = HashSet :: new ( ) ;
224- let mut write_bounds_b = HashSet :: new ( ) ;
222+ let mut read_bounds_b = Vec :: new ( ) ;
223+ let mut write_bounds_b = Vec :: new ( ) ;
225224
226225 for field in & st. fields {
227226 let DirStructureForField {
@@ -242,8 +241,8 @@ pub fn expand_dir_structure(st: ItemStruct) -> syn::Result<TokenStream> {
242241 write_bounds_b. extend ( write_bounds) ;
243242 }
244243
245- let where_read_clause = merge_where_clauses ( where_clause, read_bounds_b) ;
246- let where_write_clause = merge_where_clauses ( where_clause, write_bounds_b) ;
244+ let where_read_clause = merge_where_clause ( where_clause. cloned ( ) , read_bounds_b) ;
245+ let where_write_clause = merge_where_clause ( where_clause. cloned ( ) , write_bounds_b) ;
247246
248247 let expanded = quote ! {
249248 #[ automatically_derived]
@@ -270,26 +269,3 @@ pub fn expand_dir_structure(st: ItemStruct) -> syn::Result<TokenStream> {
270269
271270 Ok ( expanded)
272271}
273-
274- fn merge_where_clauses (
275- original : Option < & syn:: WhereClause > ,
276- additional : HashSet < WherePredicate > ,
277- ) -> Option < syn:: WhereClause > {
278- if original. is_none ( ) && additional. is_empty ( ) {
279- return None ;
280- }
281- let mut predicates = if let Some ( wc) = original {
282- wc. predicates . clone ( )
283- } else {
284- syn:: punctuated:: Punctuated :: new ( )
285- } ;
286- for p in additional {
287- if !predicates. iter ( ) . any ( |q| q == & p) {
288- predicates. push ( p) ;
289- }
290- }
291- Some ( syn:: WhereClause {
292- where_token : Default :: default ( ) ,
293- predicates,
294- } )
295- }
0 commit comments