Skip to content

Commit

Permalink
fix: correctly handle different types of empty enums
Browse files Browse the repository at this point in the history
  • Loading branch information
makcandrov committed Dec 11, 2024
1 parent c4aeb07 commit 816e0f2
Show file tree
Hide file tree
Showing 13 changed files with 86 additions and 25 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "quick-impl"
version = "0.1.6"
version = "0.1.7"
edition = "2021"
repository = "https://github.com/makcandrov/quick-impl"
homepage = "https://github.com/makcandrov/quick-impl"
Expand Down
10 changes: 8 additions & 2 deletions src/components/enums/methods/as_ref.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::{Attribute, MethodAttribute};
use crate::config::{build_config, build_enum_doc, build_enum_name};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_types, get_delimiter, with_delimiter};

build_enum_name! { ConfigName, "as_{}" }
build_enum_doc! {
Expand All @@ -31,7 +31,13 @@ pub fn enum_method_as_ref(
let delimiter = get_delimiter(fields);

let ty = destructure_types(fields, quote! { & }, quote! { () }, false);
let destruct = destructure_data(fields, quote! { ref }, TokenStream::new(), delimiter, true);
let destruct = destructure_data(
fields,
quote! { ref },
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
let ret = destructure_data(
fields,
TokenStream::new(),
Expand Down
4 changes: 2 additions & 2 deletions src/components/enums/methods/as_ref_mut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::{Attribute, MethodAttribute};
use crate::config::{build_config, build_enum_doc, build_enum_name};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_types, get_delimiter, with_delimiter};

build_enum_name! { ConfigName, "as_{}_mut" }
build_enum_doc! {
Expand Down Expand Up @@ -34,7 +34,7 @@ pub fn enum_method_as_ref_mut(
let destruct = destructure_data(
fields,
quote! { ref mut },
TokenStream::new(),
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
Expand Down
4 changes: 2 additions & 2 deletions src/components/enums/methods/from.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::{Attribute, MethodAttribute};
use crate::config::{build_config, build_enum_doc, build_enum_name};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_data_with_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_data_with_types, get_delimiter, with_delimiter};

build_enum_name! { ConfigName, "from_{}" }
build_enum_doc! {
Expand Down Expand Up @@ -34,7 +34,7 @@ pub fn enum_method_from(
let destruct = destructure_data(
fields,
TokenStream::new(),
TokenStream::new(),
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
Expand Down
4 changes: 2 additions & 2 deletions src/components/enums/methods/into.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::{Attribute, MethodAttribute};
use crate::config::{build_config, build_enum_doc, build_enum_name};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_types, get_delimiter, with_delimiter};

build_enum_name! { ConfigName, "into_{}" }
build_enum_doc! {
Expand Down Expand Up @@ -34,7 +34,7 @@ pub fn enum_method_into(
let destruct = destructure_data(
fields,
TokenStream::new(),
TokenStream::new(),
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
Expand Down
4 changes: 2 additions & 2 deletions src/components/enums/methods/set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::{Attribute, MethodAttribute};
use crate::config::{build_config, build_enum_doc, build_enum_name};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_data_with_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_data_with_types, get_delimiter, with_delimiter};

build_enum_name! { ConfigName, "set_{}" }
build_enum_doc! {
Expand Down Expand Up @@ -34,7 +34,7 @@ pub fn enum_method_set(
let destruct = destructure_data(
fields,
TokenStream::new(),
TokenStream::new(),
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
Expand Down
4 changes: 2 additions & 2 deletions src/components/enums/methods/try_into.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::{Attribute, MethodAttribute};
use crate::config::{build_config, build_enum_doc, build_enum_name};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_types, get_delimiter, with_delimiter};

build_enum_name! { ConfigName, "try_into_{}" }
build_enum_doc! {
Expand Down Expand Up @@ -34,7 +34,7 @@ pub fn enum_method_try_into(
let destruct = destructure_data(
fields,
TokenStream::new(),
TokenStream::new(),
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
Expand Down
6 changes: 1 addition & 5 deletions src/components/enums/traits/default.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,7 @@ pub fn enum_trait_default(
default_data.extend(quote! { #default, });
where_clause.extend(quote! { #field_ty : ::core::default:: #trait_ident, });
}
let default_data = if variant.fields.is_empty() {
default_data
} else {
with_delimiter(default_data, delimiter)
};
let default_data = with_delimiter(default_data, delimiter);

let content = quote! {
#[doc = #doc]
Expand Down
4 changes: 2 additions & 2 deletions src/components/enums/traits/from.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::Attribute;
use crate::config::{build_config, build_enum_doc};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_types, get_delimiter, with_delimiter};

build_enum_doc! {
ConfigDoc,
Expand All @@ -31,7 +31,7 @@ pub fn enum_trait_from(
let destruct = destructure_data(
fields,
TokenStream::new(),
TokenStream::new(),
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
Expand Down
4 changes: 2 additions & 2 deletions src/components/enums/traits/try_from.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::Attribute;
use crate::config::{build_config, build_enum_doc};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_types, get_delimiter, with_delimiter};

build_enum_doc! {
ConfigDoc,
Expand All @@ -31,7 +31,7 @@ pub fn enum_trait_try_from(
let destruct = destructure_data(
fields,
TokenStream::new(),
TokenStream::new(),
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
Expand Down
4 changes: 2 additions & 2 deletions src/components/enums/traits/try_into.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use syn::Variant;
use crate::attributes::Attribute;
use crate::config::{build_config, build_enum_doc};
use crate::expand::Context;
use crate::tokens::{destructure_data, destructure_types, get_delimiter};
use crate::tokens::{destructure_data, destructure_types, get_delimiter, with_delimiter};

build_enum_doc! {
ConfigDoc,
Expand All @@ -31,7 +31,7 @@ pub fn enum_trait_try_into(
let destruct = destructure_data(
fields,
TokenStream::new(),
TokenStream::new(),
with_delimiter(TokenStream::new(), delimiter),
delimiter,
true,
);
Expand Down
3 changes: 2 additions & 1 deletion src/tokens/delimiter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ use syn::Fields;
pub fn get_delimiter(fields: &Fields) -> Delimiter {
match fields {
Fields::Named(_) => Delimiter::Brace,
Fields::Unnamed(_) | Fields::Unit => Delimiter::Parenthesis,
Fields::Unnamed(_) => Delimiter::Parenthesis,
Fields::Unit => Delimiter::None,
}
}

Expand Down
58 changes: 58 additions & 0 deletions tests/test_enum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,3 +262,61 @@ fn test_enum_lifetimes() {
Test::A(&12, &mut s4)
);
}

#[test]
fn test_empty_enums() {
#[derive(Debug, Clone, Eq, PartialEq, QuickImpl)]
enum TestA {
#[quick_impl(
pub(crate) const is,
const as_ref,
pub as_ref_mut,
pub(crate) from,
pub(crate) into,
set,
pub try_into,
impl Default,
impl From,
impl TryFrom
)]
A,
}

#[derive(Debug, Clone, Eq, PartialEq, QuickImpl)]
enum TestB {
#[quick_impl(
pub(crate) const is,
const as_ref,
pub as_ref_mut,
pub(crate) from,
pub(crate) into,
set,
pub try_into,
impl Default,
impl From,
impl TryFrom
)]
B(),
}

#[derive(Debug, Clone, Eq, PartialEq, QuickImpl)]
enum TestC {
#[quick_impl(
pub(crate) const is,
const as_ref,
pub as_ref_mut,
pub(crate) from,
pub(crate) into,
set,
pub try_into,
impl Default,
impl From,
impl TryFrom
)]
C {},
}

assert_eq!(TestA::A.into_a().unwrap(), ());
assert_eq!(TestB::B().into_b().unwrap(), ());
assert_eq!(TestC::C {}.into_c().unwrap(), ());
}

0 comments on commit 816e0f2

Please sign in to comment.