@@ -2442,6 +2442,159 @@ fn test_untagged_enum_containing_flatten() {
24422442 ) ;
24432443}
24442444
2445+ #[ test]
2446+ fn test_partially_untagged_enum ( ) {
2447+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2448+ enum Exp {
2449+ Lambda ( u32 , Box < Exp > ) ,
2450+ #[ serde( untagged) ]
2451+ App ( Box < Exp > , Box < Exp > ) ,
2452+ #[ serde( untagged) ]
2453+ Var ( u32 ) ,
2454+ }
2455+ use Exp :: * ;
2456+
2457+ let data = Lambda ( 0 , Box :: new ( App ( Box :: new ( Var ( 0 ) ) , Box :: new ( Var ( 0 ) ) ) ) ) ;
2458+ assert_tokens (
2459+ & data,
2460+ & [
2461+ Token :: TupleVariant {
2462+ name : "Exp" ,
2463+ variant : "Lambda" ,
2464+ len : 2 ,
2465+ } ,
2466+ Token :: U32 ( 0 ) ,
2467+ Token :: Tuple { len : 2 } ,
2468+ Token :: U32 ( 0 ) ,
2469+ Token :: U32 ( 0 ) ,
2470+ Token :: TupleEnd ,
2471+ Token :: TupleVariantEnd ,
2472+ ] ,
2473+ ) ;
2474+ }
2475+
2476+ #[ test]
2477+ fn test_partially_untagged_enum_generic ( ) {
2478+ trait Trait < T > {
2479+ type Assoc ;
2480+ type Assoc2 ;
2481+ }
2482+
2483+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2484+ enum E < A , B , C > where A : Trait < C , Assoc2 =B > {
2485+ A ( A :: Assoc ) ,
2486+ #[ serde( untagged) ]
2487+ B ( A :: Assoc2 ) ,
2488+ }
2489+
2490+ impl < T > Trait < T > for ( ) {
2491+ type Assoc = T ;
2492+ type Assoc2 = bool ;
2493+ }
2494+
2495+ type MyE = E < ( ) , bool , u32 > ;
2496+ use E :: * ;
2497+
2498+ assert_tokens :: < MyE > ( & B ( true ) , & [ Token :: Bool ( true ) ] ) ;
2499+
2500+ assert_tokens :: < MyE > (
2501+ & A ( 5 ) ,
2502+ & [
2503+ Token :: NewtypeVariant {
2504+ name : "E" ,
2505+ variant : "A" ,
2506+ } ,
2507+ Token :: U32 ( 5 ) ,
2508+ ] ,
2509+ ) ;
2510+ }
2511+
2512+ #[ test]
2513+ fn test_partially_untagged_enum_desugared ( ) {
2514+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2515+ enum Test {
2516+ A ( u32 , u32 ) ,
2517+ B ( u32 ) ,
2518+ #[ serde( untagged) ]
2519+ C ( u32 ) ,
2520+ #[ serde( untagged) ]
2521+ D ( u32 , u32 ) ,
2522+ }
2523+ use Test :: * ;
2524+
2525+ mod desugared {
2526+ use super :: * ;
2527+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2528+ pub ( super ) enum Test {
2529+ A ( u32 , u32 ) ,
2530+ B ( u32 ) ,
2531+ }
2532+ }
2533+ use desugared:: Test as TestTagged ;
2534+
2535+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2536+ #[ serde( untagged) ]
2537+ enum TestUntagged {
2538+ Tagged ( TestTagged ) ,
2539+ C ( u32 ) ,
2540+ D ( u32 , u32 ) ,
2541+ }
2542+
2543+ impl From < Test > for TestUntagged {
2544+ fn from ( test : Test ) -> Self {
2545+ match test {
2546+ A ( x, y) => TestUntagged :: Tagged ( TestTagged :: A ( x, y) ) ,
2547+ B ( x) => TestUntagged :: Tagged ( TestTagged :: B ( x) ) ,
2548+ C ( x) => TestUntagged :: C ( x) ,
2549+ D ( x, y) => TestUntagged :: D ( x, y) ,
2550+ }
2551+ }
2552+ }
2553+
2554+ fn assert_tokens_desugared ( value : Test , tokens : & [ Token ] ) {
2555+ assert_tokens ( & value, tokens) ;
2556+ let desugared: TestUntagged = value. into ( ) ;
2557+ assert_tokens ( & desugared, tokens) ;
2558+ }
2559+
2560+ assert_tokens_desugared (
2561+ A ( 0 , 1 ) ,
2562+ & [
2563+ Token :: TupleVariant {
2564+ name : "Test" ,
2565+ variant : "A" ,
2566+ len : 2 ,
2567+ } ,
2568+ Token :: U32 ( 0 ) ,
2569+ Token :: U32 ( 1 ) ,
2570+ Token :: TupleVariantEnd ,
2571+ ] ,
2572+ ) ;
2573+
2574+ assert_tokens_desugared (
2575+ B ( 1 ) ,
2576+ & [
2577+ Token :: NewtypeVariant {
2578+ name : "Test" ,
2579+ variant : "B" ,
2580+ } ,
2581+ Token :: U32 ( 1 ) ,
2582+ ] ,
2583+ ) ;
2584+
2585+ assert_tokens_desugared ( C ( 2 ) , & [ Token :: U32 ( 2 ) ] ) ;
2586+
2587+ assert_tokens_desugared (
2588+ D ( 3 , 5 ) ,
2589+ & [
2590+ Token :: Tuple { len : 2 } ,
2591+ Token :: U32 ( 3 ) ,
2592+ Token :: U32 ( 5 ) ,
2593+ Token :: TupleEnd ,
2594+ ] ,
2595+ ) ;
2596+ }
2597+
24452598#[ test]
24462599fn test_flatten_untagged_enum ( ) {
24472600 #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
0 commit comments