@@ -1076,6 +1076,17 @@ fn writeln_enum<'a, 'b, W: std::io::Write>(w: &mut W, e: &'a syn::ItemEnum, type
1076
1076
writeln ! ( w, "," ) . unwrap ( ) ;
1077
1077
}
1078
1078
write ! ( w, "\t }}" ) . unwrap ( ) ;
1079
+ } else if let syn:: Fields :: Unnamed ( fields) = & var. fields {
1080
+ needs_free = true ;
1081
+ write ! ( w, "(" ) . unwrap ( ) ;
1082
+ for ( idx, field) in fields. unnamed . iter ( ) . enumerate ( ) {
1083
+ if export_status ( & field. attrs ) == ExportStatus :: TestOnly { continue ; }
1084
+ types. write_c_type ( w, & field. ty , None , false ) ;
1085
+ if idx != fields. unnamed . len ( ) - 1 {
1086
+ write ! ( w, "," ) . unwrap ( ) ;
1087
+ }
1088
+ }
1089
+ write ! ( w, ")" ) . unwrap ( ) ;
1079
1090
}
1080
1091
if var. discriminant . is_some ( ) { unimplemented ! ( ) ; }
1081
1092
writeln ! ( w, "," ) . unwrap ( ) ;
@@ -1094,60 +1105,94 @@ fn writeln_enum<'a, 'b, W: std::io::Write>(w: &mut W, e: &'a syn::ItemEnum, type
1094
1105
write!( w, "{}{}, " , if $ref { "ref " } else { "mut " } , field. ident. as_ref( ) . unwrap( ) ) . unwrap( ) ;
1095
1106
}
1096
1107
write!( w, "}} " ) . unwrap( ) ;
1108
+ } else if let syn:: Fields :: Unnamed ( fields) = & var. fields {
1109
+ write!( w, "(" ) . unwrap( ) ;
1110
+ for ( idx, field) in fields. unnamed. iter( ) . enumerate( ) {
1111
+ if export_status( & field. attrs) == ExportStatus :: TestOnly { continue ; }
1112
+ write!( w, "{}{}, " , if $ref { "ref " } else { "mut " } , ( 'a' as u8 + idx as u8 ) as char ) . unwrap( ) ;
1113
+ }
1114
+ write!( w, ") " ) . unwrap( ) ;
1097
1115
}
1098
1116
write!( w, "=>" ) . unwrap( ) ;
1099
- if let syn :: Fields :: Named ( fields ) = & var . fields {
1100
- write! ( w , " {{ \n \t \t \t \t " ) . unwrap ( ) ;
1101
- for field in fields . named . iter ( ) {
1102
- if export_status( & field. attrs) == ExportStatus :: TestOnly { continue ; }
1117
+
1118
+ macro_rules! handle_field_a {
1119
+ ( $ field: expr , $field_ident : expr ) => { {
1120
+ if export_status( & $ field. attrs) == ExportStatus :: TestOnly { continue ; }
1103
1121
let mut sink = :: std:: io:: sink( ) ;
1104
1122
let mut out: & mut dyn std:: io:: Write = if $ref { & mut sink } else { w } ;
1105
1123
let new_var = if $to_c {
1106
- types. write_to_c_conversion_new_var( & mut out, field . ident . as_ref ( ) . unwrap ( ) , & field. ty, None , false )
1124
+ types. write_to_c_conversion_new_var( & mut out, $field_ident , & $ field. ty, None , false )
1107
1125
} else {
1108
- types. write_from_c_conversion_new_var( & mut out, field . ident . as_ref ( ) . unwrap ( ) , & field. ty, None )
1126
+ types. write_from_c_conversion_new_var( & mut out, $field_ident , & $ field. ty, None )
1109
1127
} ;
1110
1128
if $ref || new_var {
1111
1129
if $ref {
1112
- write!( w, "let mut {}_nonref = (*{}).clone();\n \t \t \t \t " , field . ident . as_ref ( ) . unwrap ( ) , field . ident . as_ref ( ) . unwrap ( ) ) . unwrap( ) ;
1130
+ write!( w, "let mut {}_nonref = (*{}).clone();\n \t \t \t \t " , $field_ident , $field_ident ) . unwrap( ) ;
1113
1131
if new_var {
1114
- let nonref_ident = syn:: Ident :: new( & format!( "{}_nonref" , field . ident . as_ref ( ) . unwrap ( ) ) , Span :: call_site( ) ) ;
1132
+ let nonref_ident = syn:: Ident :: new( & format!( "{}_nonref" , $field_ident ) , Span :: call_site( ) ) ;
1115
1133
if $to_c {
1116
- types. write_to_c_conversion_new_var( w, & nonref_ident, & field. ty, None , false ) ;
1134
+ types. write_to_c_conversion_new_var( w, & nonref_ident, & $ field. ty, None , false ) ;
1117
1135
} else {
1118
- types. write_from_c_conversion_new_var( w, & nonref_ident, & field. ty, None ) ;
1136
+ types. write_from_c_conversion_new_var( w, & nonref_ident, & $ field. ty, None ) ;
1119
1137
}
1120
1138
write!( w, "\n \t \t \t \t " ) . unwrap( ) ;
1121
1139
}
1122
1140
} else {
1123
1141
write!( w, "\n \t \t \t \t " ) . unwrap( ) ;
1124
1142
}
1125
1143
}
1144
+ } }
1145
+ }
1146
+ if let syn:: Fields :: Named ( fields) = & var. fields {
1147
+ write!( w, " {{\n \t \t \t \t " ) . unwrap( ) ;
1148
+ for field in fields. named. iter( ) {
1149
+ handle_field_a!( field, field. ident. as_ref( ) . unwrap( ) ) ;
1150
+ }
1151
+ } else if let syn:: Fields :: Unnamed ( fields) = & var. fields {
1152
+ write!( w, " {{\n \t \t \t \t " ) . unwrap( ) ;
1153
+ for ( idx, field) in fields. unnamed. iter( ) . enumerate( ) {
1154
+ handle_field_a!( field, & syn:: Ident :: new( & ( ( 'a' as u8 + idx as u8 ) as char ) . to_string( ) , Span :: call_site( ) ) ) ;
1126
1155
}
1127
1156
} else { write!( w, " " ) . unwrap( ) ; }
1157
+
1128
1158
write!( w, "{}{}::{}" , if $to_c { "" } else { "native" } , e. ident, var. ident) . unwrap( ) ;
1129
- if let syn:: Fields :: Named ( fields) = & var. fields {
1130
- write!( w, " {{" ) . unwrap( ) ;
1131
- for field in fields. named. iter( ) {
1132
- if export_status( & field. attrs) == ExportStatus :: TestOnly { continue ; }
1133
- write!( w, "\n \t \t \t \t \t {}: " , field. ident. as_ref( ) . unwrap( ) ) . unwrap( ) ;
1159
+
1160
+ macro_rules! handle_field_b {
1161
+ ( $field: expr, $field_ident: expr) => { {
1162
+ if export_status( & $field. attrs) == ExportStatus :: TestOnly { continue ; }
1134
1163
if $to_c {
1135
- types. write_to_c_conversion_inline_prefix( w, & field. ty, None , false ) ;
1164
+ types. write_to_c_conversion_inline_prefix( w, & $ field. ty, None , false ) ;
1136
1165
} else {
1137
- types. write_from_c_conversion_prefix( w, & field. ty, None ) ;
1166
+ types. write_from_c_conversion_prefix( w, & $ field. ty, None ) ;
1138
1167
}
1139
- write!( w, "{}{}" ,
1140
- field. ident. as_ref( ) . unwrap( ) ,
1168
+ write!( w, "{}{}" , $field_ident,
1141
1169
if $ref { "_nonref" } else { "" } ) . unwrap( ) ;
1142
1170
if $to_c {
1143
- types. write_to_c_conversion_inline_suffix( w, & field. ty, None , false ) ;
1171
+ types. write_to_c_conversion_inline_suffix( w, & $ field. ty, None , false ) ;
1144
1172
} else {
1145
- types. write_from_c_conversion_suffix( w, & field. ty, None ) ;
1173
+ types. write_from_c_conversion_suffix( w, & $ field. ty, None ) ;
1146
1174
}
1147
1175
write!( w, "," ) . unwrap( ) ;
1176
+ } }
1177
+ }
1178
+
1179
+ if let syn:: Fields :: Named ( fields) = & var. fields {
1180
+ write!( w, " {{" ) . unwrap( ) ;
1181
+ for field in fields. named. iter( ) {
1182
+ if export_status( & field. attrs) == ExportStatus :: TestOnly { continue ; }
1183
+ write!( w, "\n \t \t \t \t \t {}: " , field. ident. as_ref( ) . unwrap( ) ) . unwrap( ) ;
1184
+ handle_field_b!( field, field. ident. as_ref( ) . unwrap( ) ) ;
1148
1185
}
1149
1186
writeln!( w, "\n \t \t \t \t }}" ) . unwrap( ) ;
1150
1187
write!( w, "\t \t \t }}" ) . unwrap( ) ;
1188
+ } else if let syn:: Fields :: Unnamed ( fields) = & var. fields {
1189
+ write!( w, " (" ) . unwrap( ) ;
1190
+ for ( idx, field) in fields. unnamed. iter( ) . enumerate( ) {
1191
+ write!( w, "\n \t \t \t \t \t " ) . unwrap( ) ;
1192
+ handle_field_b!( field, & syn:: Ident :: new( & ( ( 'a' as u8 + idx as u8 ) as char ) . to_string( ) , Span :: call_site( ) ) ) ;
1193
+ }
1194
+ writeln!( w, "\n \t \t \t \t )" ) . unwrap( ) ;
1195
+ write!( w, "\t \t \t }}" ) . unwrap( ) ;
1151
1196
}
1152
1197
writeln!( w, "," ) . unwrap( ) ;
1153
1198
}
0 commit comments