Skip to content

Commit

Permalink
ord: Distinguish field name from our local variable name
Browse files Browse the repository at this point in the history
  • Loading branch information
ijackson committed Jan 8, 2024
1 parent 926483b commit 2279fdb
Showing 1 changed file with 16 additions and 17 deletions.
33 changes: 16 additions & 17 deletions src/trait_handlers/ord/ord_enum.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::collections::BTreeMap;

use quote::quote;
use quote::{format_ident, quote};
use syn::{spanned::Spanned, Data, DeriveInput, Field, Fields, Ident, Meta, Path, Type};

use super::{
Expand Down Expand Up @@ -56,11 +56,11 @@ impl TraitHandler for OrdEnumHandler {
Fields::Named(_) => {
all_unit = false;

let mut pattern_token_stream = proc_macro2::TokenStream::new();
let mut pattern2_token_stream = proc_macro2::TokenStream::new();
let mut pattern_self_token_stream = proc_macro2::TokenStream::new();
let mut pattern_other_token_stream = proc_macro2::TokenStream::new();
let mut block_token_stream = proc_macro2::TokenStream::new();

let mut fields: BTreeMap<isize, (&Field, &Ident, Ident, FieldAttribute)> =
let mut fields: BTreeMap<isize, (&Field, Ident, Ident, FieldAttribute)> =
BTreeMap::new();

for (index, field) in variant.fields.iter().enumerate() {
Expand All @@ -72,20 +72,19 @@ impl TraitHandler for OrdEnumHandler {
}
.build_from_attributes(&field.attrs, traits)?;

let field_name = field.ident.as_ref().unwrap();
let field_name_real = field.ident.as_ref().unwrap();
let field_name_var_self = format_ident!("_s_{}", field_name_real);
let field_name_var_other = format_ident!("_o_{}", field_name_real);

if field_attribute.ignore {
pattern_token_stream.extend(quote!(#field_name: _,));
pattern2_token_stream.extend(quote!(#field_name: _,));
pattern_self_token_stream.extend(quote!(#field_name_real: _,));
pattern_other_token_stream.extend(quote!(#field_name_real: _,));

continue;
}

let field_name2: Ident =
syn::parse_str(&format!("_{}", field_name)).unwrap();

pattern_token_stream.extend(quote!(#field_name,));
pattern2_token_stream.extend(quote!(#field_name: #field_name2,));
pattern_self_token_stream.extend(quote!(#field_name_real: #field_name_var_self,));
pattern_other_token_stream.extend(quote!(#field_name_real: #field_name_var_other,));

let rank = field_attribute.rank;

Expand All @@ -96,18 +95,18 @@ impl TraitHandler for OrdEnumHandler {
));
}

fields.insert(rank, (field, field_name, field_name2, field_attribute));
fields.insert(rank, (field, field_name_var_self, field_name_var_other, field_attribute));
}

for (field, field_name, field_name2, field_attribute) in fields.values() {
for (field, field_name_var_self, field_name_var_other, field_attribute) in fields.values() {
let cmp = field_attribute.method.as_ref().unwrap_or_else(|| {
ord_types.push(&field.ty);

&built_in_cmp
});

block_token_stream.extend(quote! {
match #cmp(#field_name, #field_name2) {
match #cmp(#field_name_var_self, #field_name_var_other) {
::core::cmp::Ordering::Equal => (),
::core::cmp::Ordering::Greater => return ::core::cmp::Ordering::Greater,
::core::cmp::Ordering::Less => return ::core::cmp::Ordering::Less,
Expand All @@ -116,8 +115,8 @@ impl TraitHandler for OrdEnumHandler {
}

arms_token_stream.extend(quote! {
Self::#variant_ident { #pattern_token_stream } => {
if let Self::#variant_ident { #pattern2_token_stream } = other {
Self::#variant_ident { #pattern_self_token_stream } => {
if let Self::#variant_ident { #pattern_other_token_stream } = other {
#block_token_stream
}
}
Expand Down

0 comments on commit 2279fdb

Please sign in to comment.