11//! Common implementation help for [`PartialOrd`] and [`Ord`].
22
3+ #[ cfg( not( feature = "nightly" ) ) ]
4+ use std:: borrow:: Cow ;
5+
36use proc_macro2:: TokenStream ;
7+ #[ cfg( not( feature = "nightly" ) ) ]
8+ use proc_macro2:: { Literal , Span } ;
49use quote:: quote;
510#[ cfg( not( feature = "nightly" ) ) ]
6- use syn:: Path ;
11+ use syn:: { parse_quote , Expr , ExprLit , LitInt , Path } ;
712
813#[ cfg( not( feature = "nightly" ) ) ]
914use crate :: { item:: Representation , Discriminant , Trait } ;
@@ -139,43 +144,25 @@ pub fn build_ord_signature(
139144 Discriminant :: Single => {
140145 unreachable ! ( "we should only generate this code with multiple variants" )
141146 }
142- Discriminant :: Unit { c } => {
143- // C validation is only needed if custom discriminants are defined.
144- let validate_c = ( * c
145- && variants
146- . iter ( )
147- . any ( |variant| variant. discriminant . is_some ( ) ) )
148- . then ( || {
149- quote ! {
150- #[ repr( C ) ]
151- enum EnsureReprCIsIsize {
152- Test = 0_isize
153- }
154- }
155- } ) ;
156-
147+ Discriminant :: Unit => {
157148 if traits. iter ( ) . any ( |trait_| trait_ == Trait :: Copy ) {
158149 quote ! {
159- #validate_c
160-
161150 #path:: #method( & ( * self as isize ) , & ( * __other as isize ) )
162151 }
163152 } else if traits. iter ( ) . any ( |trait_| trait_ == Trait :: Clone ) {
164153 let clone = DeriveTrait :: Clone . path ( ) ;
165154 quote ! {
166- #validate_c
167-
168155 #path:: #method( & ( #clone:: clone( self ) as isize ) , & ( #clone:: clone( __other) as isize ) )
169156 }
170157 } else {
171158 build_discriminant_order (
172- None , validate_c , item, generics, variants, & path, & method,
159+ None , item, generics, variants, & path, & method,
173160 )
174161 }
175162 }
176- Discriminant :: Data => build_discriminant_order (
177- None , None , item, generics, variants, & path, & method,
178- ) ,
163+ Discriminant :: Data => {
164+ build_discriminant_order ( None , item, generics, variants, & path, & method)
165+ }
179166 Discriminant :: UnitRepr ( repr) => {
180167 if traits. iter ( ) . any ( |trait_| trait_ == Trait :: Copy ) {
181168 quote ! {
@@ -188,15 +175,16 @@ pub fn build_ord_signature(
188175 }
189176 } else {
190177 #[ cfg( feature = "safe" ) ]
191- let body_else = build_discriminant_order (
192- Some ( * repr) ,
193- None ,
194- item,
195- generics,
196- variants,
197- & path,
198- & method,
199- ) ;
178+ let body_else = {
179+ build_discriminant_order (
180+ Some ( * repr) ,
181+ item,
182+ generics,
183+ variants,
184+ & path,
185+ & method,
186+ )
187+ } ;
200188 #[ cfg( not( feature = "safe" ) ) ]
201189 let body_else = quote ! {
202190 #path:: #method(
@@ -220,7 +208,6 @@ pub fn build_ord_signature(
220208 #[ cfg( feature = "safe" ) ]
221209 Discriminant :: DataRepr ( repr) => build_discriminant_order (
222210 Some ( * repr) ,
223- None ,
224211 item,
225212 generics,
226213 variants,
@@ -267,22 +254,16 @@ pub fn build_ord_signature(
267254 }
268255}
269256
270- /// Builds order comparison recursively for all variants .
257+ /// Create `discriminant()` function and use it to do the comparison .
271258#[ cfg( not( feature = "nightly" ) ) ]
272259fn build_discriminant_order (
273260 repr : Option < Representation > ,
274- validate_c : Option < TokenStream > ,
275261 item : & Item ,
276262 generics : & SplitGenerics < ' _ > ,
277263 variants : & [ Data < ' _ > ] ,
278264 path : & Path ,
279265 method : & TokenStream ,
280266) -> TokenStream {
281- use std:: { borrow:: Cow , ops:: Deref } ;
282-
283- use proc_macro2:: { Literal , Span } ;
284- use syn:: { parse_quote, Expr , ExprLit , LitInt } ;
285-
286267 let mut discriminants = Vec :: < Cow < Expr > > :: with_capacity ( variants. len ( ) ) ;
287268 let mut last_expression: Option < ( Option < usize > , usize ) > = None ;
288269
@@ -328,7 +309,6 @@ fn build_discriminant_order(
328309 . zip ( discriminants)
329310 . map ( |( variant, discriminant) | {
330311 let pattern = variant. self_pattern ( ) ;
331- let discriminant = discriminant. deref ( ) ;
332312
333313 quote ! {
334314 #pattern => #discriminant
@@ -347,8 +327,6 @@ fn build_discriminant_order(
347327 } = generics;
348328
349329 quote ! {
350- #validate_c
351-
352330 const fn __discriminant #imp( __this: & #item #ty) -> #repr #where_clause {
353331 match __this {
354332 #( #variants) , *
@@ -361,18 +339,16 @@ fn build_discriminant_order(
361339
362340/// Build `match` arms for [`PartialOrd`] and [`Ord`].
363341pub fn build_ord_body ( trait_ : & DeriveTrait , data : & Data ) -> TokenStream {
364- use DeriveTrait :: * ;
365-
366342 let path = trait_. path ( ) ;
367343 let mut equal = quote ! { :: core:: cmp:: Ordering :: Equal } ;
368344
369345 // Add `Option` to `Ordering` if we are implementing `PartialOrd`.
370346 let method = match trait_ {
371- PartialOrd => {
347+ DeriveTrait :: PartialOrd => {
372348 equal = quote ! { :: core:: option:: Option :: Some ( #equal) } ;
373349 quote ! { partial_cmp }
374350 }
375- Ord => quote ! { cmp } ,
351+ DeriveTrait :: Ord => quote ! { cmp } ,
376352 _ => unreachable ! ( "unsupported trait in `build_ord`" ) ,
377353 } ;
378354
0 commit comments