Skip to content

Commit a373bfe

Browse files
committed
Make discriminant enum generated by VariantDiscriminant derive macro match its source item
1 parent b492206 commit a373bfe

File tree

4 files changed

+217
-2
lines changed

4 files changed

+217
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Please make sure to add your changes to the appropriate categories:
2222

2323
- Added enum-level `#[enumcapsulate(discriminant(…))]` helper attribute for `VariantDiscriminant` derive macro, allowing for customizing `repr = …` and `name = …` for the generated enum.
2424
- Added variant-level `#[enumcapsulate(discriminant(…))]` helper attribute for `VariantDiscriminant` derive macro, allowing for customizing `value = …` and `name = …` for the generated variant.
25-
- Made enum generate by `VariantDiscriminant` derive macro implement `Ord + PartialOrd`.
25+
- Made enum generated by `VariantDiscriminant` derive macro implement `Ord + PartialOrd`.
2626

2727
### Changed
2828

@@ -31,6 +31,7 @@ Please make sure to add your changes to the appropriate categories:
3131
- Made `Encapsulate` derive macro no longer derive `VariantDiscriminant`.
3232
- Removed potentially confusing `#[enumcapsulate(include(…))]` helper attributes.
3333
- Merged `#[enumcapsulate(field(index = …))]` and `#[enumcapsulate(field(name = "…"))]` into a single polymorph `#[enumcapsulate(field = …)]`
34+
- Made enum generated by `VariantDiscriminant` derive macro have the same level of visibility as its source item.
3435

3536
### Deprecated
3637

macros/src/enum_deriver.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,8 @@ impl EnumDeriver {
554554

555555
let enum_config = VariantDiscriminantDeriveEnumConfig::from_enum(&self.item)?;
556556

557+
let visibility = &self.item.vis;
558+
557559
let mut discriminant_enum_ident = quote::format_ident!("{enum_ident}Discriminant");
558560
let mut repr_attr: Option<TokenStream2> = None;
559561

@@ -619,7 +621,7 @@ impl EnumDeriver {
619621
let discriminant_enum = quote! {
620622
#repr_attr
621623
#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)]
622-
pub enum #discriminant_enum_ident {
624+
#visibility enum #discriminant_enum_ident {
623625
#(#discriminant_variants)*
624626
}
625627
};
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
use enumcapsulate::VariantDiscriminant;
2+
pub enum PubEnum {}
3+
pub enum PubEnumDiscriminant {}
4+
#[automatically_derived]
5+
impl ::core::marker::Copy for PubEnumDiscriminant {}
6+
#[automatically_derived]
7+
impl ::core::clone::Clone for PubEnumDiscriminant {
8+
#[inline]
9+
fn clone(&self) -> PubEnumDiscriminant {
10+
*self
11+
}
12+
}
13+
#[automatically_derived]
14+
impl ::core::cmp::Ord for PubEnumDiscriminant {
15+
#[inline]
16+
fn cmp(&self, other: &PubEnumDiscriminant) -> ::core::cmp::Ordering {
17+
match *self {}
18+
}
19+
}
20+
#[automatically_derived]
21+
impl ::core::cmp::PartialOrd for PubEnumDiscriminant {
22+
#[inline]
23+
fn partial_cmp(
24+
&self,
25+
other: &PubEnumDiscriminant,
26+
) -> ::core::option::Option<::core::cmp::Ordering> {
27+
match *self {}
28+
}
29+
}
30+
#[automatically_derived]
31+
impl ::core::cmp::Eq for PubEnumDiscriminant {
32+
#[inline]
33+
#[doc(hidden)]
34+
#[coverage(off)]
35+
fn assert_receiver_is_total_eq(&self) -> () {}
36+
}
37+
#[automatically_derived]
38+
impl ::core::marker::StructuralPartialEq for PubEnumDiscriminant {}
39+
#[automatically_derived]
40+
impl ::core::cmp::PartialEq for PubEnumDiscriminant {
41+
#[inline]
42+
fn eq(&self, other: &PubEnumDiscriminant) -> bool {
43+
match *self {}
44+
}
45+
}
46+
#[automatically_derived]
47+
impl ::core::hash::Hash for PubEnumDiscriminant {
48+
#[inline]
49+
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
50+
match *self {}
51+
}
52+
}
53+
#[automatically_derived]
54+
impl ::core::fmt::Debug for PubEnumDiscriminant {
55+
#[inline]
56+
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
57+
match *self {}
58+
}
59+
}
60+
impl ::enumcapsulate::VariantDiscriminant for PubEnum {
61+
type Discriminant = PubEnumDiscriminant;
62+
fn variant_discriminant(&self) -> Self::Discriminant {
63+
match self {
64+
_ => ::core::panicking::panic("internal error: entered unreachable code"),
65+
}
66+
}
67+
}
68+
pub(crate) enum PubCrateEnum {}
69+
pub(crate) enum PubCrateEnumDiscriminant {}
70+
#[automatically_derived]
71+
impl ::core::marker::Copy for PubCrateEnumDiscriminant {}
72+
#[automatically_derived]
73+
impl ::core::clone::Clone for PubCrateEnumDiscriminant {
74+
#[inline]
75+
fn clone(&self) -> PubCrateEnumDiscriminant {
76+
*self
77+
}
78+
}
79+
#[automatically_derived]
80+
impl ::core::cmp::Ord for PubCrateEnumDiscriminant {
81+
#[inline]
82+
fn cmp(&self, other: &PubCrateEnumDiscriminant) -> ::core::cmp::Ordering {
83+
match *self {}
84+
}
85+
}
86+
#[automatically_derived]
87+
impl ::core::cmp::PartialOrd for PubCrateEnumDiscriminant {
88+
#[inline]
89+
fn partial_cmp(
90+
&self,
91+
other: &PubCrateEnumDiscriminant,
92+
) -> ::core::option::Option<::core::cmp::Ordering> {
93+
match *self {}
94+
}
95+
}
96+
#[automatically_derived]
97+
impl ::core::cmp::Eq for PubCrateEnumDiscriminant {
98+
#[inline]
99+
#[doc(hidden)]
100+
#[coverage(off)]
101+
fn assert_receiver_is_total_eq(&self) -> () {}
102+
}
103+
#[automatically_derived]
104+
impl ::core::marker::StructuralPartialEq for PubCrateEnumDiscriminant {}
105+
#[automatically_derived]
106+
impl ::core::cmp::PartialEq for PubCrateEnumDiscriminant {
107+
#[inline]
108+
fn eq(&self, other: &PubCrateEnumDiscriminant) -> bool {
109+
match *self {}
110+
}
111+
}
112+
#[automatically_derived]
113+
impl ::core::hash::Hash for PubCrateEnumDiscriminant {
114+
#[inline]
115+
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
116+
match *self {}
117+
}
118+
}
119+
#[automatically_derived]
120+
impl ::core::fmt::Debug for PubCrateEnumDiscriminant {
121+
#[inline]
122+
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
123+
match *self {}
124+
}
125+
}
126+
impl ::enumcapsulate::VariantDiscriminant for PubCrateEnum {
127+
type Discriminant = PubCrateEnumDiscriminant;
128+
fn variant_discriminant(&self) -> Self::Discriminant {
129+
match self {
130+
_ => ::core::panicking::panic("internal error: entered unreachable code"),
131+
}
132+
}
133+
}
134+
pub(self) enum PubSelfEnum {}
135+
pub(self) enum PubSelfEnumDiscriminant {}
136+
#[automatically_derived]
137+
impl ::core::marker::Copy for PubSelfEnumDiscriminant {}
138+
#[automatically_derived]
139+
impl ::core::clone::Clone for PubSelfEnumDiscriminant {
140+
#[inline]
141+
fn clone(&self) -> PubSelfEnumDiscriminant {
142+
*self
143+
}
144+
}
145+
#[automatically_derived]
146+
impl ::core::cmp::Ord for PubSelfEnumDiscriminant {
147+
#[inline]
148+
fn cmp(&self, other: &PubSelfEnumDiscriminant) -> ::core::cmp::Ordering {
149+
match *self {}
150+
}
151+
}
152+
#[automatically_derived]
153+
impl ::core::cmp::PartialOrd for PubSelfEnumDiscriminant {
154+
#[inline]
155+
fn partial_cmp(
156+
&self,
157+
other: &PubSelfEnumDiscriminant,
158+
) -> ::core::option::Option<::core::cmp::Ordering> {
159+
match *self {}
160+
}
161+
}
162+
#[automatically_derived]
163+
impl ::core::cmp::Eq for PubSelfEnumDiscriminant {
164+
#[inline]
165+
#[doc(hidden)]
166+
#[coverage(off)]
167+
fn assert_receiver_is_total_eq(&self) -> () {}
168+
}
169+
#[automatically_derived]
170+
impl ::core::marker::StructuralPartialEq for PubSelfEnumDiscriminant {}
171+
#[automatically_derived]
172+
impl ::core::cmp::PartialEq for PubSelfEnumDiscriminant {
173+
#[inline]
174+
fn eq(&self, other: &PubSelfEnumDiscriminant) -> bool {
175+
match *self {}
176+
}
177+
}
178+
#[automatically_derived]
179+
impl ::core::hash::Hash for PubSelfEnumDiscriminant {
180+
#[inline]
181+
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
182+
match *self {}
183+
}
184+
}
185+
#[automatically_derived]
186+
impl ::core::fmt::Debug for PubSelfEnumDiscriminant {
187+
#[inline]
188+
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
189+
match *self {}
190+
}
191+
}
192+
impl ::enumcapsulate::VariantDiscriminant for PubSelfEnum {
193+
type Discriminant = PubSelfEnumDiscriminant;
194+
fn variant_discriminant(&self) -> Self::Discriminant {
195+
match self {
196+
_ => ::core::panicking::panic("internal error: entered unreachable code"),
197+
}
198+
}
199+
}
200+
fn main() {}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use enumcapsulate::VariantDiscriminant;
2+
3+
#[derive(VariantDiscriminant)]
4+
pub enum PubEnum {}
5+
6+
#[derive(VariantDiscriminant)]
7+
pub(crate) enum PubCrateEnum {}
8+
9+
#[derive(VariantDiscriminant)]
10+
pub(self) enum PubSelfEnum {}
11+
12+
fn main() {}

0 commit comments

Comments
 (0)