diff options
| author | Robin Krahl <robin.krahl@ireas.org> | 2020-01-07 11:18:04 +0000 | 
|---|---|---|
| committer | Daniel Mueller <deso@posteo.net> | 2020-01-08 09:20:25 -0800 | 
| commit | 5e20a29b4fdc8a2d442d1093681b396dcb4b816b (patch) | |
| tree | 55ab083fa8999d2ccbb5e921c1ffe52560dca152 /syn/tests | |
| parent | 203e691f46d591a2cc8acdfd850fa9f5b0fb8a98 (diff) | |
| download | nitrocli-5e20a29b4fdc8a2d442d1093681b396dcb4b816b.tar.gz nitrocli-5e20a29b4fdc8a2d442d1093681b396dcb4b816b.tar.bz2 | |
Add structopt dependency in version 0.3.7
This patch series replaces argparse with structopt in the argument
handling code. As a first step, we need structopt as a dependency.
Import subrepo structopt/:structopt at efbdda4753592e27bc430fb01f7b9650b2f3174d
Import subrepo bitflags/:bitflags at 30668016aca6bd3b02c766e8347e0b4080d4c296
Import subrepo clap/:clap at 784524f7eb193e35f81082cc69454c8c21b948f7
Import subrepo heck/:heck at 093d56fbf001e1506e56dbfa38631d99b1066df1
Import subrepo proc-macro-error/:proc-macro-error at 6c4cfe79a622c5de8ae68557993542be46eacae2
Import subrepo proc-macro2/:proc-macro2 at d5d48eddca4566e5438e8a2cbed4a74e049544de
Import subrepo quote/:quote at 727436c6c137b20f0f34dde5d8fda2679b9747ad
Import subrepo rustversion/:rustversion at 0c5663313516263059ce9059ef81fc7a1cf655ca
Import subrepo syn-mid/:syn-mid at 5d3d85414a9e6674e1857ec22a87b96e04a6851a
Import subrepo syn/:syn at e87c27e87f6f4ef8919d0372bdb056d53ef0d8f3
Import subrepo textwrap/:textwrap at abcd618beae3f74841032aa5b53c1086b0a57ca2
Import subrepo unicode-segmentation/:unicode-segmentation at 637c9874c4fe0c205ff27787faf150a40295c6c3
Import subrepo unicode-width/:unicode-width at 3033826f8bf05e82724140a981d5941e48fce393
Import subrepo unicode-xid/:unicode-xid at 4baae9fffb156ba229665b972a9cd5991787ceb7
Diffstat (limited to 'syn/tests')
30 files changed, 9749 insertions, 0 deletions
| diff --git a/syn/tests/common/eq.rs b/syn/tests/common/eq.rs new file mode 100644 index 0000000..098f833 --- /dev/null +++ b/syn/tests/common/eq.rs @@ -0,0 +1,459 @@ +extern crate rustc_data_structures; +extern crate rustc_span; +extern crate rustc_target; +extern crate syntax; + +use std::mem; + +use rustc_data_structures::sync::Lrc; +use rustc_data_structures::thin_vec::ThinVec; +use rustc_span::{Span, SyntaxContext, DUMMY_SP}; +use syntax::ast::{ +    AngleBracketedArgs, AnonConst, Arm, AsmDialect, AssocItem, AssocItemKind, AssocTyConstraint, +    AssocTyConstraintKind, AttrId, AttrItem, AttrKind, AttrStyle, Attribute, BareFnTy, BinOpKind, +    BindingMode, Block, BlockCheckMode, BorrowKind, CaptureBy, Constness, Crate, CrateSugar, +    Defaultness, EnumDef, Expr, ExprKind, Extern, Field, FieldPat, FloatTy, FnDecl, FnHeader, +    FnSig, ForeignItem, ForeignItemKind, ForeignMod, FunctionRetTy, GenericArg, GenericArgs, +    GenericBound, GenericParam, GenericParamKind, Generics, GlobalAsm, Ident, ImplPolarity, +    InlineAsm, InlineAsmOutput, IntTy, IsAsync, IsAuto, Item, ItemKind, Label, Lifetime, Lit, +    LitFloatType, LitIntType, LitKind, Local, Mac, MacArgs, MacDelimiter, MacStmtStyle, MacroDef, +    Mod, Movability, MutTy, Mutability, NodeId, Param, ParenthesizedArgs, Pat, PatKind, Path, +    PathSegment, PolyTraitRef, QSelf, RangeEnd, RangeLimits, RangeSyntax, Stmt, StmtKind, StrLit, +    StrStyle, StructField, TraitBoundModifier, TraitObjectSyntax, TraitRef, Ty, TyKind, UintTy, +    UnOp, UnsafeSource, Unsafety, UseTree, UseTreeKind, Variant, VariantData, VisibilityKind, +    WhereBoundPredicate, WhereClause, WhereEqPredicate, WherePredicate, WhereRegionPredicate, +}; +use syntax::ptr::P; +use syntax::source_map::Spanned; +use syntax::symbol::{sym, Symbol}; +use syntax::token::{self, DelimToken, Token, TokenKind}; +use syntax::tokenstream::{DelimSpan, TokenStream, TokenTree}; +use syntax::util::comments; + +pub trait SpanlessEq { +    fn eq(&self, other: &Self) -> bool; +} + +impl<T: SpanlessEq> SpanlessEq for P<T> { +    fn eq(&self, other: &Self) -> bool { +        SpanlessEq::eq(&**self, &**other) +    } +} + +impl<T: SpanlessEq> SpanlessEq for Lrc<T> { +    fn eq(&self, other: &Self) -> bool { +        SpanlessEq::eq(&**self, &**other) +    } +} + +impl<T: SpanlessEq> SpanlessEq for Option<T> { +    fn eq(&self, other: &Self) -> bool { +        match (self, other) { +            (None, None) => true, +            (Some(this), Some(other)) => SpanlessEq::eq(this, other), +            _ => false, +        } +    } +} + +impl<T: SpanlessEq> SpanlessEq for Vec<T> { +    fn eq(&self, other: &Self) -> bool { +        self.len() == other.len() && self.iter().zip(other).all(|(a, b)| SpanlessEq::eq(a, b)) +    } +} + +impl<T: SpanlessEq> SpanlessEq for ThinVec<T> { +    fn eq(&self, other: &Self) -> bool { +        self.len() == other.len() +            && self +                .iter() +                .zip(other.iter()) +                .all(|(a, b)| SpanlessEq::eq(a, b)) +    } +} + +impl<T: SpanlessEq> SpanlessEq for Spanned<T> { +    fn eq(&self, other: &Self) -> bool { +        SpanlessEq::eq(&self.node, &other.node) +    } +} + +impl<A: SpanlessEq, B: SpanlessEq> SpanlessEq for (A, B) { +    fn eq(&self, other: &Self) -> bool { +        SpanlessEq::eq(&self.0, &other.0) && SpanlessEq::eq(&self.1, &other.1) +    } +} + +impl<A: SpanlessEq, B: SpanlessEq, C: SpanlessEq> SpanlessEq for (A, B, C) { +    fn eq(&self, other: &Self) -> bool { +        SpanlessEq::eq(&self.0, &other.0) +            && SpanlessEq::eq(&self.1, &other.1) +            && SpanlessEq::eq(&self.2, &other.2) +    } +} + +macro_rules! spanless_eq_true { +    ($name:ident) => { +        impl SpanlessEq for $name { +            fn eq(&self, _other: &Self) -> bool { +                true +            } +        } +    }; +} + +spanless_eq_true!(Span); +spanless_eq_true!(DelimSpan); +spanless_eq_true!(AttrId); +spanless_eq_true!(NodeId); +spanless_eq_true!(SyntaxContext); + +macro_rules! spanless_eq_partial_eq { +    ($name:ident) => { +        impl SpanlessEq for $name { +            fn eq(&self, other: &Self) -> bool { +                PartialEq::eq(self, other) +            } +        } +    }; +} + +spanless_eq_partial_eq!(bool); +spanless_eq_partial_eq!(u8); +spanless_eq_partial_eq!(u16); +spanless_eq_partial_eq!(u128); +spanless_eq_partial_eq!(usize); +spanless_eq_partial_eq!(char); +spanless_eq_partial_eq!(Symbol); +spanless_eq_partial_eq!(DelimToken); + +macro_rules! spanless_eq_struct { +    { +        $name:ident; +        $([$field:ident $other:ident])* +        $(![$ignore:ident])* +    } => { +        impl SpanlessEq for $name { +            fn eq(&self, other: &Self) -> bool { +                let $name { $($field,)* $($ignore: _,)* } = self; +                let $name { $($field: $other,)* $($ignore: _,)* } = other; +                $(SpanlessEq::eq($field, $other))&&* +            } +        } +    }; + +    { +        $name:ident; +        $([$field:ident $other:ident])* +        $next:ident +        $($rest:ident)* +        $(!$ignore:ident)* +    } => { +        spanless_eq_struct! { +            $name; +            $([$field $other])* +            [$next other] +            $($rest)* +            $(!$ignore)* +        } +    }; + +    { +        $name:ident; +        $([$field:ident $other:ident])* +        $(![$ignore:ident])* +        !$next:ident +        $(!$rest:ident)* +    } => { +        spanless_eq_struct! { +            $name; +            $([$field $other])* +            $(![$ignore])* +            ![$next] +            $(!$rest)* +        } +    }; +} + +macro_rules! spanless_eq_enum { +    { +        $name:ident; +        $([$variant:ident $([$field:tt $this:ident $other:ident])*])* +    } => { +        impl SpanlessEq for $name { +            fn eq(&self, other: &Self) -> bool { +                match self { +                    $( +                        $name::$variant { .. } => {} +                    )* +                } +                #[allow(unreachable_patterns)] +                match (self, other) { +                    $( +                        ( +                            $name::$variant { $($field: $this),* }, +                            $name::$variant { $($field: $other),* }, +                        ) => { +                            true $(&& SpanlessEq::eq($this, $other))* +                        } +                    )* +                    _ => false, +                } +            } +        } +    }; + +    { +        $name:ident; +        $([$variant:ident $($fields:tt)*])* +        $next:ident [$($named:tt)*] ( $i:tt $($field:tt)* ) +        $($rest:tt)* +    } => { +        spanless_eq_enum! { +            $name; +            $([$variant $($fields)*])* +            $next [$($named)* [$i this other]] ( $($field)* ) +            $($rest)* +        } +    }; + +    { +        $name:ident; +        $([$variant:ident $($fields:tt)*])* +        $next:ident [$($named:tt)*] () +        $($rest:tt)* +    } => { +        spanless_eq_enum! { +            $name; +            $([$variant $($fields)*])* +            [$next $($named)*] +            $($rest)* +        } +    }; + +    { +        $name:ident; +        $([$variant:ident $($fields:tt)*])* +        $next:ident ( $($field:tt)* ) +        $($rest:tt)* +    } => { +        spanless_eq_enum! { +            $name; +            $([$variant $($fields)*])* +            $next [] ( $($field)* ) +            $($rest)* +        } +    }; + +    { +        $name:ident; +        $([$variant:ident $($fields:tt)*])* +        $next:ident +        $($rest:tt)* +    } => { +        spanless_eq_enum! { +            $name; +            $([$variant $($fields)*])* +            [$next] +            $($rest)* +        } +    }; +} + +spanless_eq_struct!(AngleBracketedArgs; span args constraints); +spanless_eq_struct!(AnonConst; id value); +spanless_eq_struct!(Arm; attrs pat guard body span id is_placeholder); +spanless_eq_struct!(AssocItem; attrs id span vis ident defaultness generics kind !tokens); +spanless_eq_struct!(AssocTyConstraint; id ident kind span); +spanless_eq_struct!(AttrItem; path args); +spanless_eq_struct!(Attribute; kind id style span); +spanless_eq_struct!(BareFnTy; unsafety ext generic_params decl); +spanless_eq_struct!(Block; stmts id rules span); +spanless_eq_struct!(Crate; module attrs span); +spanless_eq_struct!(EnumDef; variants); +spanless_eq_struct!(Expr; id kind span attrs); +spanless_eq_struct!(Field; attrs id span ident expr is_shorthand is_placeholder); +spanless_eq_struct!(FieldPat; ident pat is_shorthand attrs id span is_placeholder); +spanless_eq_struct!(FnDecl; inputs output); +spanless_eq_struct!(FnHeader; constness asyncness unsafety ext); +spanless_eq_struct!(FnSig; header decl); +spanless_eq_struct!(ForeignItem; attrs id span vis ident kind tokens); +spanless_eq_struct!(ForeignMod; abi items); +spanless_eq_struct!(GenericParam; id ident attrs bounds is_placeholder kind); +spanless_eq_struct!(Generics; params where_clause span); +spanless_eq_struct!(GlobalAsm; asm); +spanless_eq_struct!(InlineAsm; asm asm_str_style outputs inputs clobbers volatile alignstack dialect); +spanless_eq_struct!(InlineAsmOutput; constraint expr is_rw is_indirect); +spanless_eq_struct!(Item; attrs id span vis ident kind !tokens); +spanless_eq_struct!(Label; ident); +spanless_eq_struct!(Lifetime; id ident); +spanless_eq_struct!(Lit; token kind span); +spanless_eq_struct!(Local; pat ty init id span attrs); +spanless_eq_struct!(Mac; path args prior_type_ascription); +spanless_eq_struct!(MacroDef; body legacy); +spanless_eq_struct!(Mod; inner items inline); +spanless_eq_struct!(MutTy; ty mutbl); +spanless_eq_struct!(Param; attrs ty pat id span is_placeholder); +spanless_eq_struct!(ParenthesizedArgs; span inputs output); +spanless_eq_struct!(Pat; id kind span); +spanless_eq_struct!(Path; span segments); +spanless_eq_struct!(PathSegment; ident id args); +spanless_eq_struct!(PolyTraitRef; bound_generic_params trait_ref span); +spanless_eq_struct!(QSelf; ty path_span position); +spanless_eq_struct!(Stmt; id kind span); +spanless_eq_struct!(StrLit; style symbol suffix span symbol_unescaped); +spanless_eq_struct!(StructField; attrs id span vis ident ty is_placeholder); +spanless_eq_struct!(Token; kind span); +spanless_eq_struct!(TraitRef; path ref_id); +spanless_eq_struct!(Ty; id kind span); +spanless_eq_struct!(UseTree; prefix kind span); +spanless_eq_struct!(Variant; attrs id span vis ident data disr_expr is_placeholder); +spanless_eq_struct!(WhereBoundPredicate; span bound_generic_params bounded_ty bounds); +spanless_eq_struct!(WhereClause; predicates span); +spanless_eq_struct!(WhereEqPredicate; id span lhs_ty rhs_ty); +spanless_eq_struct!(WhereRegionPredicate; span lifetime bounds); +spanless_eq_enum!(AsmDialect; Att Intel); +spanless_eq_enum!(AssocItemKind; Const(0 1) Fn(0 1) TyAlias(0 1) Macro(0)); +spanless_eq_enum!(AssocTyConstraintKind; Equality(ty) Bound(bounds)); +spanless_eq_enum!(AttrKind; Normal(0) DocComment(0)); +spanless_eq_enum!(AttrStyle; Outer Inner); +spanless_eq_enum!(BinOpKind; Add Sub Mul Div Rem And Or BitXor BitAnd BitOr Shl Shr Eq Lt Le Ne Ge Gt); +spanless_eq_enum!(BindingMode; ByRef(0) ByValue(0)); +spanless_eq_enum!(BlockCheckMode; Default Unsafe(0)); +spanless_eq_enum!(BorrowKind; Ref Raw); +spanless_eq_enum!(CaptureBy; Value Ref); +spanless_eq_enum!(Constness; Const NotConst); +spanless_eq_enum!(CrateSugar; PubCrate JustCrate); +spanless_eq_enum!(Defaultness; Default Final); +spanless_eq_enum!(Extern; None Implicit Explicit(0)); +spanless_eq_enum!(FloatTy; F32 F64); +spanless_eq_enum!(ForeignItemKind; Fn(0 1) Static(0 1) Ty Macro(0)); +spanless_eq_enum!(FunctionRetTy; Default(0) Ty(0)); +spanless_eq_enum!(GenericArg; Lifetime(0) Type(0) Const(0)); +spanless_eq_enum!(GenericArgs; AngleBracketed(0) Parenthesized(0)); +spanless_eq_enum!(GenericBound; Trait(0 1) Outlives(0)); +spanless_eq_enum!(GenericParamKind; Lifetime Type(default) Const(ty)); +spanless_eq_enum!(ImplPolarity; Positive Negative); +spanless_eq_enum!(IntTy; Isize I8 I16 I32 I64 I128); +spanless_eq_enum!(IsAsync; Async(closure_id return_impl_trait_id) NotAsync); +spanless_eq_enum!(IsAuto; Yes No); +spanless_eq_enum!(LitFloatType; Suffixed(0) Unsuffixed); +spanless_eq_enum!(LitIntType; Signed(0) Unsigned(0) Unsuffixed); +spanless_eq_enum!(MacArgs; Empty Delimited(0 1 2) Eq(0 1)); +spanless_eq_enum!(MacDelimiter; Parenthesis Bracket Brace); +spanless_eq_enum!(MacStmtStyle; Semicolon Braces NoBraces); +spanless_eq_enum!(Movability; Static Movable); +spanless_eq_enum!(Mutability; Mut Not); +spanless_eq_enum!(RangeEnd; Included(0) Excluded); +spanless_eq_enum!(RangeLimits; HalfOpen Closed); +spanless_eq_enum!(StmtKind; Local(0) Item(0) Expr(0) Semi(0) Mac(0)); +spanless_eq_enum!(StrStyle; Cooked Raw(0)); +spanless_eq_enum!(TokenTree; Token(0) Delimited(0 1 2)); +spanless_eq_enum!(TraitBoundModifier; None Maybe); +spanless_eq_enum!(TraitObjectSyntax; Dyn None); +spanless_eq_enum!(UintTy; Usize U8 U16 U32 U64 U128); +spanless_eq_enum!(UnOp; Deref Not Neg); +spanless_eq_enum!(UnsafeSource; CompilerGenerated UserProvided); +spanless_eq_enum!(Unsafety; Unsafe Normal); +spanless_eq_enum!(UseTreeKind; Simple(0 1 2) Nested(0) Glob); +spanless_eq_enum!(VariantData; Struct(0 1) Tuple(0 1) Unit(0)); +spanless_eq_enum!(VisibilityKind; Public Crate(0) Restricted(path id) Inherited); +spanless_eq_enum!(WherePredicate; BoundPredicate(0) RegionPredicate(0) EqPredicate(0)); +spanless_eq_enum!(ExprKind; Box(0) Array(0) Call(0 1) MethodCall(0 1) Tup(0) +    Binary(0 1 2) Unary(0 1) Lit(0) Cast(0 1) Type(0 1) Let(0 1) If(0 1 2) +    While(0 1 2) ForLoop(0 1 2 3) Loop(0 1) Match(0 1) Closure(0 1 2 3 4 5) +    Block(0 1) Async(0 1 2) Await(0) TryBlock(0) Assign(0 1 2) AssignOp(0 1 2) +    Field(0 1) Index(0 1) Range(0 1 2) Path(0 1) AddrOf(0 1 2) Break(0 1) +    Continue(0) Ret(0) InlineAsm(0) Mac(0) Struct(0 1 2) Repeat(0 1) Paren(0) +    Try(0) Yield(0) Err); +spanless_eq_enum!(ItemKind; ExternCrate(0) Use(0) Static(0 1 2) Const(0 1) +    Fn(0 1 2) Mod(0) ForeignMod(0) GlobalAsm(0) TyAlias(0 1) Enum(0 1) +    Struct(0 1) Union(0 1) Trait(0 1 2 3 4) TraitAlias(0 1) Impl(0 1 2 3 4 5 6) +    Mac(0) MacroDef(0)); +spanless_eq_enum!(LitKind; Str(0 1) ByteStr(0) Byte(0) Char(0) Int(0 1) +    Float(0 1) Bool(0) Err(0)); +spanless_eq_enum!(PatKind; Wild Ident(0 1 2) Struct(0 1 2) TupleStruct(0 1) +    Or(0) Path(0 1) Tuple(0) Box(0) Ref(0 1) Lit(0) Range(0 1 2) Slice(0) Rest +    Paren(0) Mac(0)); +spanless_eq_enum!(TyKind; Slice(0) Array(0 1) Ptr(0) Rptr(0 1) BareFn(0) Never +    Tup(0) Path(0 1) TraitObject(0 1) ImplTrait(0 1) Paren(0) Typeof(0) Infer +    ImplicitSelf Mac(0) Err CVarArgs); + +impl SpanlessEq for Ident { +    fn eq(&self, other: &Self) -> bool { +        self.as_str() == other.as_str() +    } +} + +// Give up on comparing literals inside of macros because there are so many +// equivalent representations of the same literal; they are tested elsewhere +impl SpanlessEq for token::Lit { +    fn eq(&self, other: &Self) -> bool { +        mem::discriminant(self) == mem::discriminant(other) +    } +} + +impl SpanlessEq for RangeSyntax { +    fn eq(&self, _other: &Self) -> bool { +        match self { +            RangeSyntax::DotDotDot | RangeSyntax::DotDotEq => true, +        } +    } +} + +impl SpanlessEq for TokenKind { +    fn eq(&self, other: &Self) -> bool { +        match (self, other) { +            (TokenKind::Literal(this), TokenKind::Literal(other)) => SpanlessEq::eq(this, other), +            (TokenKind::DotDotEq, _) | (TokenKind::DotDotDot, _) => match other { +                TokenKind::DotDotEq | TokenKind::DotDotDot => true, +                _ => false, +            }, +            _ => self == other, +        } +    } +} + +impl SpanlessEq for TokenStream { +    fn eq(&self, other: &Self) -> bool { +        SpanlessEq::eq(&expand_tts(self), &expand_tts(other)) +    } +} + +fn expand_tts(tts: &TokenStream) -> Vec<TokenTree> { +    let mut tokens = Vec::new(); +    for tt in tts.clone().into_trees() { +        let c = match tt { +            TokenTree::Token(Token { +                kind: TokenKind::DocComment(c), +                .. +            }) => c, +            _ => { +                tokens.push(tt); +                continue; +            } +        }; +        let contents = comments::strip_doc_comment_decoration(&c.as_str()); +        let style = comments::doc_comment_style(&c.as_str()); +        tokens.push(TokenTree::token(TokenKind::Pound, DUMMY_SP)); +        if style == AttrStyle::Inner { +            tokens.push(TokenTree::token(TokenKind::Not, DUMMY_SP)); +        } +        let lit = token::Lit { +            kind: token::LitKind::Str, +            symbol: Symbol::intern(&contents), +            suffix: None, +        }; +        let tts = vec![ +            TokenTree::token(TokenKind::Ident(sym::doc, false), DUMMY_SP), +            TokenTree::token(TokenKind::Eq, DUMMY_SP), +            TokenTree::token(TokenKind::Literal(lit), DUMMY_SP), +        ]; +        tokens.push(TokenTree::Delimited( +            DelimSpan::dummy(), +            DelimToken::Bracket, +            tts.into_iter().collect::<TokenStream>().into(), +        )); +    } +    tokens +} diff --git a/syn/tests/common/mod.rs b/syn/tests/common/mod.rs new file mode 100644 index 0000000..3dd2552 --- /dev/null +++ b/syn/tests/common/mod.rs @@ -0,0 +1,19 @@ +#![allow(dead_code)] + +use std::env; + +pub mod eq; +pub mod parse; + +/// Read the `ABORT_AFTER_FAILURE` environment variable, and parse it. +pub fn abort_after() -> usize { +    match env::var("ABORT_AFTER_FAILURE") { +        Ok(s) => s.parse().expect("failed to parse ABORT_AFTER_FAILURE"), +        Err(_) => usize::max_value(), +    } +} + +/// Are we running in travis-ci.org. +pub fn travis_ci() -> bool { +    env::var_os("TRAVIS").is_some() +} diff --git a/syn/tests/common/parse.rs b/syn/tests/common/parse.rs new file mode 100644 index 0000000..fc3bb96 --- /dev/null +++ b/syn/tests/common/parse.rs @@ -0,0 +1,49 @@ +extern crate rustc_expand; +extern crate rustc_parse as parse; +extern crate rustc_span; +extern crate syntax; + +use rustc_span::FileName; +use syntax::ast; +use syntax::ptr::P; +use syntax::sess::ParseSess; +use syntax::source_map::FilePathMapping; + +use std::panic; + +pub fn libsyntax_expr(input: &str) -> Option<P<ast::Expr>> { +    match panic::catch_unwind(|| { +        let sess = ParseSess::new(FilePathMapping::empty()); +        sess.span_diagnostic.set_continue_after_error(false); +        let e = parse::new_parser_from_source_str( +            &sess, +            FileName::Custom("test_precedence".to_string()), +            input.to_string(), +        ) +        .parse_expr(); +        match e { +            Ok(expr) => Some(expr), +            Err(mut diagnostic) => { +                diagnostic.emit(); +                None +            } +        } +    }) { +        Ok(Some(e)) => Some(e), +        Ok(None) => None, +        Err(_) => { +            errorf!("libsyntax panicked\n"); +            None +        } +    } +} + +pub fn syn_expr(input: &str) -> Option<syn::Expr> { +    match syn::parse_str(input) { +        Ok(e) => Some(e), +        Err(msg) => { +            errorf!("syn failed to parse\n{:?}\n", msg); +            None +        } +    } +} diff --git a/syn/tests/debug/gen.rs b/syn/tests/debug/gen.rs new file mode 100644 index 0000000..8450c09 --- /dev/null +++ b/syn/tests/debug/gen.rs @@ -0,0 +1,5633 @@ +// This file is @generated by syn-internal-codegen. +// It is not intended for manual editing. + +use super::{Lite, RefCast}; +use std::fmt::{self, Debug}; +impl Debug for Lite<syn::Abi> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Abi"); +        if let Some(val) = &_val.name { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::LitStr); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("name", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::AngleBracketedGenericArguments> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("AngleBracketedGenericArguments"); +        if let Some(val) = &_val.colon2_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon2); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("colon2_token", Print::ref_cast(val)); +        } +        if !_val.args.is_empty() { +            formatter.field("args", Lite(&_val.args)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Arm> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Arm"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("pat", Lite(&_val.pat)); +        if let Some(val) = &_val.guard { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::If, Box<syn::Expr>)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("guard", Print::ref_cast(val)); +        } +        formatter.field("body", Lite(&_val.body)); +        if let Some(val) = &_val.comma { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Comma); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("comma", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::AttrStyle> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::AttrStyle::Outer => formatter.write_str("Outer"), +            syn::AttrStyle::Inner(_val) => { +                formatter.write_str("Inner")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::Attribute> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Attribute"); +        formatter.field("style", Lite(&_val.style)); +        formatter.field("path", Lite(&_val.path)); +        formatter.field("tokens", Lite(&_val.tokens)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::BareFnArg> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("BareFnArg"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.name { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((proc_macro2::Ident, syn::token::Colon)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.0), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("name", Print::ref_cast(val)); +        } +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::BinOp> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::BinOp::Add(_val) => { +                formatter.write_str("Add")?; +                Ok(()) +            } +            syn::BinOp::Sub(_val) => { +                formatter.write_str("Sub")?; +                Ok(()) +            } +            syn::BinOp::Mul(_val) => { +                formatter.write_str("Mul")?; +                Ok(()) +            } +            syn::BinOp::Div(_val) => { +                formatter.write_str("Div")?; +                Ok(()) +            } +            syn::BinOp::Rem(_val) => { +                formatter.write_str("Rem")?; +                Ok(()) +            } +            syn::BinOp::And(_val) => { +                formatter.write_str("And")?; +                Ok(()) +            } +            syn::BinOp::Or(_val) => { +                formatter.write_str("Or")?; +                Ok(()) +            } +            syn::BinOp::BitXor(_val) => { +                formatter.write_str("BitXor")?; +                Ok(()) +            } +            syn::BinOp::BitAnd(_val) => { +                formatter.write_str("BitAnd")?; +                Ok(()) +            } +            syn::BinOp::BitOr(_val) => { +                formatter.write_str("BitOr")?; +                Ok(()) +            } +            syn::BinOp::Shl(_val) => { +                formatter.write_str("Shl")?; +                Ok(()) +            } +            syn::BinOp::Shr(_val) => { +                formatter.write_str("Shr")?; +                Ok(()) +            } +            syn::BinOp::Eq(_val) => { +                formatter.write_str("Eq")?; +                Ok(()) +            } +            syn::BinOp::Lt(_val) => { +                formatter.write_str("Lt")?; +                Ok(()) +            } +            syn::BinOp::Le(_val) => { +                formatter.write_str("Le")?; +                Ok(()) +            } +            syn::BinOp::Ne(_val) => { +                formatter.write_str("Ne")?; +                Ok(()) +            } +            syn::BinOp::Ge(_val) => { +                formatter.write_str("Ge")?; +                Ok(()) +            } +            syn::BinOp::Gt(_val) => { +                formatter.write_str("Gt")?; +                Ok(()) +            } +            syn::BinOp::AddEq(_val) => { +                formatter.write_str("AddEq")?; +                Ok(()) +            } +            syn::BinOp::SubEq(_val) => { +                formatter.write_str("SubEq")?; +                Ok(()) +            } +            syn::BinOp::MulEq(_val) => { +                formatter.write_str("MulEq")?; +                Ok(()) +            } +            syn::BinOp::DivEq(_val) => { +                formatter.write_str("DivEq")?; +                Ok(()) +            } +            syn::BinOp::RemEq(_val) => { +                formatter.write_str("RemEq")?; +                Ok(()) +            } +            syn::BinOp::BitXorEq(_val) => { +                formatter.write_str("BitXorEq")?; +                Ok(()) +            } +            syn::BinOp::BitAndEq(_val) => { +                formatter.write_str("BitAndEq")?; +                Ok(()) +            } +            syn::BinOp::BitOrEq(_val) => { +                formatter.write_str("BitOrEq")?; +                Ok(()) +            } +            syn::BinOp::ShlEq(_val) => { +                formatter.write_str("ShlEq")?; +                Ok(()) +            } +            syn::BinOp::ShrEq(_val) => { +                formatter.write_str("ShrEq")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::Binding> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Binding"); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Block> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Block"); +        if !_val.stmts.is_empty() { +            formatter.field("stmts", Lite(&_val.stmts)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::BoundLifetimes> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("BoundLifetimes"); +        if !_val.lifetimes.is_empty() { +            formatter.field("lifetimes", Lite(&_val.lifetimes)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ConstParam> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ConstParam"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("ty", Lite(&_val.ty)); +        if let Some(val) = &_val.eq_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Eq); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("eq_token", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.default { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Expr); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("default", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Constraint> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Constraint"); +        formatter.field("ident", Lite(&_val.ident)); +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Data> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Data::Struct(_val) => { +                let mut formatter = formatter.debug_struct("Data::Struct"); +                formatter.field("fields", Lite(&_val.fields)); +                if let Some(val) = &_val.semi_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Semi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("semi_token", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Data::Enum(_val) => { +                let mut formatter = formatter.debug_struct("Data::Enum"); +                if !_val.variants.is_empty() { +                    formatter.field("variants", Lite(&_val.variants)); +                } +                formatter.finish() +            } +            syn::Data::Union(_val) => { +                let mut formatter = formatter.debug_struct("Data::Union"); +                formatter.field("fields", Lite(&_val.fields)); +                formatter.finish() +            } +        } +    } +} +impl Debug for Lite<syn::DataEnum> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("DataEnum"); +        if !_val.variants.is_empty() { +            formatter.field("variants", Lite(&_val.variants)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::DataStruct> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("DataStruct"); +        formatter.field("fields", Lite(&_val.fields)); +        if let Some(val) = &_val.semi_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Semi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("semi_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::DataUnion> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("DataUnion"); +        formatter.field("fields", Lite(&_val.fields)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::DeriveInput> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("DeriveInput"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        formatter.field("data", Lite(&_val.data)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Expr> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Expr::Array(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Array"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if !_val.elems.is_empty() { +                    formatter.field("elems", Lite(&_val.elems)); +                } +                formatter.finish() +            } +            syn::Expr::Assign(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Assign"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("left", Lite(&_val.left)); +                formatter.field("right", Lite(&_val.right)); +                formatter.finish() +            } +            syn::Expr::AssignOp(_val) => { +                let mut formatter = formatter.debug_struct("Expr::AssignOp"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("left", Lite(&_val.left)); +                formatter.field("op", Lite(&_val.op)); +                formatter.field("right", Lite(&_val.right)); +                formatter.finish() +            } +            syn::Expr::Async(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Async"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.capture { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Move); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("capture", Print::ref_cast(val)); +                } +                formatter.field("block", Lite(&_val.block)); +                formatter.finish() +            } +            syn::Expr::Await(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Await"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("base", Lite(&_val.base)); +                formatter.finish() +            } +            syn::Expr::Binary(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Binary"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("left", Lite(&_val.left)); +                formatter.field("op", Lite(&_val.op)); +                formatter.field("right", Lite(&_val.right)); +                formatter.finish() +            } +            syn::Expr::Block(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Block"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.label { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Label); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("label", Print::ref_cast(val)); +                } +                formatter.field("block", Lite(&_val.block)); +                formatter.finish() +            } +            syn::Expr::Box(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Box"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Expr::Break(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Break"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.label { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Lifetime); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("label", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.expr { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(Box<syn::Expr>); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("expr", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Expr::Call(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Call"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("func", Lite(&_val.func)); +                if !_val.args.is_empty() { +                    formatter.field("args", Lite(&_val.args)); +                } +                formatter.finish() +            } +            syn::Expr::Cast(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Cast"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.finish() +            } +            syn::Expr::Closure(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Closure"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.asyncness { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Async); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("asyncness", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.movability { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Static); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("movability", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.capture { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Move); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("capture", Print::ref_cast(val)); +                } +                if !_val.inputs.is_empty() { +                    formatter.field("inputs", Lite(&_val.inputs)); +                } +                formatter.field("output", Lite(&_val.output)); +                formatter.field("body", Lite(&_val.body)); +                formatter.finish() +            } +            syn::Expr::Continue(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Continue"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.label { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Lifetime); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("label", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Expr::Field(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Field"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("base", Lite(&_val.base)); +                formatter.field("member", Lite(&_val.member)); +                formatter.finish() +            } +            syn::Expr::ForLoop(_val) => { +                let mut formatter = formatter.debug_struct("Expr::ForLoop"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.label { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Label); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("label", Print::ref_cast(val)); +                } +                formatter.field("pat", Lite(&_val.pat)); +                formatter.field("expr", Lite(&_val.expr)); +                formatter.field("body", Lite(&_val.body)); +                formatter.finish() +            } +            syn::Expr::Group(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Group"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Expr::If(_val) => { +                let mut formatter = formatter.debug_struct("Expr::If"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("cond", Lite(&_val.cond)); +                formatter.field("then_branch", Lite(&_val.then_branch)); +                if let Some(val) = &_val.else_branch { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print((syn::token::Else, Box<syn::Expr>)); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(&_val.1), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("else_branch", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Expr::Index(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Index"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.field("index", Lite(&_val.index)); +                formatter.finish() +            } +            syn::Expr::Let(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Let"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("pat", Lite(&_val.pat)); +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Expr::Lit(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Lit"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("lit", Lite(&_val.lit)); +                formatter.finish() +            } +            syn::Expr::Loop(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Loop"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.label { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Label); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("label", Print::ref_cast(val)); +                } +                formatter.field("body", Lite(&_val.body)); +                formatter.finish() +            } +            syn::Expr::Macro(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Macro"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("mac", Lite(&_val.mac)); +                formatter.finish() +            } +            syn::Expr::Match(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Match"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                if !_val.arms.is_empty() { +                    formatter.field("arms", Lite(&_val.arms)); +                } +                formatter.finish() +            } +            syn::Expr::MethodCall(_val) => { +                let mut formatter = formatter.debug_struct("Expr::MethodCall"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("receiver", Lite(&_val.receiver)); +                formatter.field("method", Lite(&_val.method)); +                if let Some(val) = &_val.turbofish { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::MethodTurbofish); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("turbofish", Print::ref_cast(val)); +                } +                if !_val.args.is_empty() { +                    formatter.field("args", Lite(&_val.args)); +                } +                formatter.finish() +            } +            syn::Expr::Paren(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Paren"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Expr::Path(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Path"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.qself { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::QSelf); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("qself", Print::ref_cast(val)); +                } +                formatter.field("path", Lite(&_val.path)); +                formatter.finish() +            } +            syn::Expr::Range(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Range"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.from { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(Box<syn::Expr>); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("from", Print::ref_cast(val)); +                } +                formatter.field("limits", Lite(&_val.limits)); +                if let Some(val) = &_val.to { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(Box<syn::Expr>); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("to", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Expr::Reference(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Reference"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.mutability { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Mut); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("mutability", Print::ref_cast(val)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Expr::Repeat(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Repeat"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.field("len", Lite(&_val.len)); +                formatter.finish() +            } +            syn::Expr::Return(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Return"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.expr { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(Box<syn::Expr>); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("expr", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Expr::Struct(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Struct"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("path", Lite(&_val.path)); +                if !_val.fields.is_empty() { +                    formatter.field("fields", Lite(&_val.fields)); +                } +                if let Some(val) = &_val.dot2_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Dot2); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("dot2_token", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.rest { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(Box<syn::Expr>); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("rest", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Expr::Try(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Try"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Expr::TryBlock(_val) => { +                let mut formatter = formatter.debug_struct("Expr::TryBlock"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("block", Lite(&_val.block)); +                formatter.finish() +            } +            syn::Expr::Tuple(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Tuple"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if !_val.elems.is_empty() { +                    formatter.field("elems", Lite(&_val.elems)); +                } +                formatter.finish() +            } +            syn::Expr::Type(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Type"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.finish() +            } +            syn::Expr::Unary(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Unary"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("op", Lite(&_val.op)); +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Expr::Unsafe(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Unsafe"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("block", Lite(&_val.block)); +                formatter.finish() +            } +            syn::Expr::Verbatim(_val) => { +                formatter.write_str("Verbatim")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::Expr::While(_val) => { +                let mut formatter = formatter.debug_struct("Expr::While"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.label { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Label); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("label", Print::ref_cast(val)); +                } +                formatter.field("cond", Lite(&_val.cond)); +                formatter.field("body", Lite(&_val.body)); +                formatter.finish() +            } +            syn::Expr::Yield(_val) => { +                let mut formatter = formatter.debug_struct("Expr::Yield"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.expr { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(Box<syn::Expr>); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("expr", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            _ => unreachable!(), +        } +    } +} +impl Debug for Lite<syn::ExprArray> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprArray"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if !_val.elems.is_empty() { +            formatter.field("elems", Lite(&_val.elems)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprAssign> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprAssign"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("left", Lite(&_val.left)); +        formatter.field("right", Lite(&_val.right)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprAssignOp> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprAssignOp"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("left", Lite(&_val.left)); +        formatter.field("op", Lite(&_val.op)); +        formatter.field("right", Lite(&_val.right)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprAsync> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprAsync"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.capture { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Move); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("capture", Print::ref_cast(val)); +        } +        formatter.field("block", Lite(&_val.block)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprAwait> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprAwait"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("base", Lite(&_val.base)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprBinary> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprBinary"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("left", Lite(&_val.left)); +        formatter.field("op", Lite(&_val.op)); +        formatter.field("right", Lite(&_val.right)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprBlock> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprBlock"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.label { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Label); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("label", Print::ref_cast(val)); +        } +        formatter.field("block", Lite(&_val.block)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprBox> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprBox"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprBreak> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprBreak"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.label { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Lifetime); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("label", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.expr { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(Box<syn::Expr>); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("expr", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprCall> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprCall"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("func", Lite(&_val.func)); +        if !_val.args.is_empty() { +            formatter.field("args", Lite(&_val.args)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprCast> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprCast"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprClosure> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprClosure"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.asyncness { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Async); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("asyncness", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.movability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Static); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("movability", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.capture { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Move); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("capture", Print::ref_cast(val)); +        } +        if !_val.inputs.is_empty() { +            formatter.field("inputs", Lite(&_val.inputs)); +        } +        formatter.field("output", Lite(&_val.output)); +        formatter.field("body", Lite(&_val.body)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprContinue> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprContinue"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.label { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Lifetime); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("label", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprField> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprField"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("base", Lite(&_val.base)); +        formatter.field("member", Lite(&_val.member)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprForLoop> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprForLoop"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.label { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Label); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("label", Print::ref_cast(val)); +        } +        formatter.field("pat", Lite(&_val.pat)); +        formatter.field("expr", Lite(&_val.expr)); +        formatter.field("body", Lite(&_val.body)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprGroup> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprGroup"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprIf> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprIf"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("cond", Lite(&_val.cond)); +        formatter.field("then_branch", Lite(&_val.then_branch)); +        if let Some(val) = &_val.else_branch { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::Else, Box<syn::Expr>)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("else_branch", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprIndex> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprIndex"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.field("index", Lite(&_val.index)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprLet> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprLet"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("pat", Lite(&_val.pat)); +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprLit> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprLit"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("lit", Lite(&_val.lit)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprLoop> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprLoop"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.label { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Label); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("label", Print::ref_cast(val)); +        } +        formatter.field("body", Lite(&_val.body)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprMacro> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprMacro"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("mac", Lite(&_val.mac)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprMatch> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprMatch"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        if !_val.arms.is_empty() { +            formatter.field("arms", Lite(&_val.arms)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprMethodCall> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprMethodCall"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("receiver", Lite(&_val.receiver)); +        formatter.field("method", Lite(&_val.method)); +        if let Some(val) = &_val.turbofish { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::MethodTurbofish); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("turbofish", Print::ref_cast(val)); +        } +        if !_val.args.is_empty() { +            formatter.field("args", Lite(&_val.args)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprParen> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprParen"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprPath> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprPath"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.qself { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::QSelf); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("qself", Print::ref_cast(val)); +        } +        formatter.field("path", Lite(&_val.path)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprRange> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprRange"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.from { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(Box<syn::Expr>); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("from", Print::ref_cast(val)); +        } +        formatter.field("limits", Lite(&_val.limits)); +        if let Some(val) = &_val.to { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(Box<syn::Expr>); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("to", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprReference> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprReference"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.mutability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Mut); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("mutability", Print::ref_cast(val)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprRepeat> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprRepeat"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.field("len", Lite(&_val.len)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprReturn> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprReturn"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.expr { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(Box<syn::Expr>); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("expr", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprStruct> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprStruct"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("path", Lite(&_val.path)); +        if !_val.fields.is_empty() { +            formatter.field("fields", Lite(&_val.fields)); +        } +        if let Some(val) = &_val.dot2_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Dot2); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("dot2_token", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.rest { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(Box<syn::Expr>); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("rest", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprTry> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprTry"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprTryBlock> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprTryBlock"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("block", Lite(&_val.block)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprTuple> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprTuple"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if !_val.elems.is_empty() { +            formatter.field("elems", Lite(&_val.elems)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprType> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprType"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprUnary> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprUnary"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("op", Lite(&_val.op)); +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprUnsafe> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprUnsafe"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("block", Lite(&_val.block)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprWhile> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprWhile"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.label { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Label); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("label", Print::ref_cast(val)); +        } +        formatter.field("cond", Lite(&_val.cond)); +        formatter.field("body", Lite(&_val.body)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ExprYield> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ExprYield"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.expr { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(Box<syn::Expr>); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("expr", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Field> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Field"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        if let Some(val) = &_val.ident { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(proc_macro2::Ident); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("ident", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.colon_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("colon_token", Print::ref_cast(val)); +        } +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::FieldPat> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("FieldPat"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("member", Lite(&_val.member)); +        if let Some(val) = &_val.colon_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("colon_token", Print::ref_cast(val)); +        } +        formatter.field("pat", Lite(&_val.pat)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::FieldValue> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("FieldValue"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("member", Lite(&_val.member)); +        if let Some(val) = &_val.colon_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("colon_token", Print::ref_cast(val)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Fields> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Fields::Named(_val) => { +                let mut formatter = formatter.debug_struct("Fields::Named"); +                if !_val.named.is_empty() { +                    formatter.field("named", Lite(&_val.named)); +                } +                formatter.finish() +            } +            syn::Fields::Unnamed(_val) => { +                let mut formatter = formatter.debug_struct("Fields::Unnamed"); +                if !_val.unnamed.is_empty() { +                    formatter.field("unnamed", Lite(&_val.unnamed)); +                } +                formatter.finish() +            } +            syn::Fields::Unit => formatter.write_str("Unit"), +        } +    } +} +impl Debug for Lite<syn::FieldsNamed> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("FieldsNamed"); +        if !_val.named.is_empty() { +            formatter.field("named", Lite(&_val.named)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::FieldsUnnamed> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("FieldsUnnamed"); +        if !_val.unnamed.is_empty() { +            formatter.field("unnamed", Lite(&_val.unnamed)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::File> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("File"); +        if let Some(val) = &_val.shebang { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(String); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("shebang", Print::ref_cast(val)); +        } +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if !_val.items.is_empty() { +            formatter.field("items", Lite(&_val.items)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::FnArg> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::FnArg::Receiver(_val) => { +                formatter.write_str("Receiver")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::FnArg::Typed(_val) => { +                formatter.write_str("Typed")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::ForeignItem> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::ForeignItem::Fn(_val) => { +                let mut formatter = formatter.debug_struct("ForeignItem::Fn"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("sig", Lite(&_val.sig)); +                formatter.finish() +            } +            syn::ForeignItem::Static(_val) => { +                let mut formatter = formatter.debug_struct("ForeignItem::Static"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                if let Some(val) = &_val.mutability { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Mut); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("mutability", Print::ref_cast(val)); +                } +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.finish() +            } +            syn::ForeignItem::Type(_val) => { +                let mut formatter = formatter.debug_struct("ForeignItem::Type"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                formatter.finish() +            } +            syn::ForeignItem::Macro(_val) => { +                let mut formatter = formatter.debug_struct("ForeignItem::Macro"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("mac", Lite(&_val.mac)); +                if let Some(val) = &_val.semi_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Semi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("semi_token", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::ForeignItem::Verbatim(_val) => { +                formatter.write_str("Verbatim")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            _ => unreachable!(), +        } +    } +} +impl Debug for Lite<syn::ForeignItemFn> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ForeignItemFn"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("sig", Lite(&_val.sig)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ForeignItemMacro> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ForeignItemMacro"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("mac", Lite(&_val.mac)); +        if let Some(val) = &_val.semi_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Semi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("semi_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ForeignItemStatic> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ForeignItemStatic"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        if let Some(val) = &_val.mutability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Mut); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("mutability", Print::ref_cast(val)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ForeignItemType> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ForeignItemType"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::GenericArgument> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::GenericArgument::Lifetime(_val) => { +                formatter.write_str("Lifetime")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::GenericArgument::Type(_val) => { +                formatter.write_str("Type")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::GenericArgument::Binding(_val) => { +                formatter.write_str("Binding")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::GenericArgument::Constraint(_val) => { +                formatter.write_str("Constraint")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::GenericArgument::Const(_val) => { +                formatter.write_str("Const")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::GenericMethodArgument> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::GenericMethodArgument::Type(_val) => { +                formatter.write_str("Type")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::GenericMethodArgument::Const(_val) => { +                formatter.write_str("Const")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::GenericParam> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::GenericParam::Type(_val) => { +                formatter.write_str("Type")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::GenericParam::Lifetime(_val) => { +                formatter.write_str("Lifetime")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::GenericParam::Const(_val) => { +                formatter.write_str("Const")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::Generics> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Generics"); +        if let Some(val) = &_val.lt_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Lt); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("lt_token", Print::ref_cast(val)); +        } +        if !_val.params.is_empty() { +            formatter.field("params", Lite(&_val.params)); +        } +        if let Some(val) = &_val.gt_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Gt); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("gt_token", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.where_clause { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::WhereClause); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("where_clause", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ImplItem> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::ImplItem::Const(_val) => { +                let mut formatter = formatter.debug_struct("ImplItem::Const"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                if let Some(val) = &_val.defaultness { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Default); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("defaultness", Print::ref_cast(val)); +                } +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::ImplItem::Method(_val) => { +                let mut formatter = formatter.debug_struct("ImplItem::Method"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                if let Some(val) = &_val.defaultness { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Default); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("defaultness", Print::ref_cast(val)); +                } +                formatter.field("sig", Lite(&_val.sig)); +                formatter.field("block", Lite(&_val.block)); +                formatter.finish() +            } +            syn::ImplItem::Type(_val) => { +                let mut formatter = formatter.debug_struct("ImplItem::Type"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                if let Some(val) = &_val.defaultness { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Default); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("defaultness", Print::ref_cast(val)); +                } +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("generics", Lite(&_val.generics)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.finish() +            } +            syn::ImplItem::Macro(_val) => { +                let mut formatter = formatter.debug_struct("ImplItem::Macro"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("mac", Lite(&_val.mac)); +                if let Some(val) = &_val.semi_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Semi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("semi_token", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::ImplItem::Verbatim(_val) => { +                formatter.write_str("Verbatim")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            _ => unreachable!(), +        } +    } +} +impl Debug for Lite<syn::ImplItemConst> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ImplItemConst"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        if let Some(val) = &_val.defaultness { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Default); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("defaultness", Print::ref_cast(val)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ImplItemMacro> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ImplItemMacro"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("mac", Lite(&_val.mac)); +        if let Some(val) = &_val.semi_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Semi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("semi_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ImplItemMethod> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ImplItemMethod"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        if let Some(val) = &_val.defaultness { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Default); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("defaultness", Print::ref_cast(val)); +        } +        formatter.field("sig", Lite(&_val.sig)); +        formatter.field("block", Lite(&_val.block)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ImplItemType> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ImplItemType"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        if let Some(val) = &_val.defaultness { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Default); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("defaultness", Print::ref_cast(val)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Index> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Index"); +        formatter.field("index", Lite(&_val.index)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Item> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Item::Const(_val) => { +                let mut formatter = formatter.debug_struct("Item::Const"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Item::Enum(_val) => { +                let mut formatter = formatter.debug_struct("Item::Enum"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("generics", Lite(&_val.generics)); +                if !_val.variants.is_empty() { +                    formatter.field("variants", Lite(&_val.variants)); +                } +                formatter.finish() +            } +            syn::Item::ExternCrate(_val) => { +                let mut formatter = formatter.debug_struct("Item::ExternCrate"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                if let Some(val) = &_val.rename { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print((syn::token::As, proc_macro2::Ident)); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(&_val.1), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("rename", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Item::Fn(_val) => { +                let mut formatter = formatter.debug_struct("Item::Fn"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("sig", Lite(&_val.sig)); +                formatter.field("block", Lite(&_val.block)); +                formatter.finish() +            } +            syn::Item::ForeignMod(_val) => { +                let mut formatter = formatter.debug_struct("Item::ForeignMod"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("abi", Lite(&_val.abi)); +                if !_val.items.is_empty() { +                    formatter.field("items", Lite(&_val.items)); +                } +                formatter.finish() +            } +            syn::Item::Impl(_val) => { +                let mut formatter = formatter.debug_struct("Item::Impl"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.defaultness { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Default); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("defaultness", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.unsafety { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Unsafe); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("unsafety", Print::ref_cast(val)); +                } +                formatter.field("generics", Lite(&_val.generics)); +                if let Some(val) = &_val.trait_ { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print((Option<syn::token::Bang>, syn::Path, syn::token::For)); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt( +                                &( +                                    { +                                        #[derive(RefCast)] +                                        #[repr(transparent)] +                                        struct Print(Option<syn::token::Bang>); +                                        impl Debug for Print { +                                            fn fmt( +                                                &self, +                                                formatter: &mut fmt::Formatter, +                                            ) -> fmt::Result +                                            { +                                                match &self.0 { +                                                    Some(_val) => { +                                                        formatter.write_str("Some")?; +                                                        Ok(()) +                                                    } +                                                    None => formatter.write_str("None"), +                                                } +                                            } +                                        } +                                        Print::ref_cast(&_val.0) +                                    }, +                                    Lite(&_val.1), +                                ), +                                formatter, +                            )?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("trait_", Print::ref_cast(val)); +                } +                formatter.field("self_ty", Lite(&_val.self_ty)); +                if !_val.items.is_empty() { +                    formatter.field("items", Lite(&_val.items)); +                } +                formatter.finish() +            } +            syn::Item::Macro(_val) => { +                let mut formatter = formatter.debug_struct("Item::Macro"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.ident { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(proc_macro2::Ident); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("ident", Print::ref_cast(val)); +                } +                formatter.field("mac", Lite(&_val.mac)); +                if let Some(val) = &_val.semi_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Semi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("semi_token", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Item::Macro2(_val) => { +                let mut formatter = formatter.debug_struct("Item::Macro2"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("rules", Lite(&_val.rules)); +                formatter.finish() +            } +            syn::Item::Mod(_val) => { +                let mut formatter = formatter.debug_struct("Item::Mod"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                if let Some(val) = &_val.content { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print((syn::token::Brace, Vec<syn::Item>)); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(&_val.1), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("content", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.semi { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Semi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("semi", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Item::Static(_val) => { +                let mut formatter = formatter.debug_struct("Item::Static"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                if let Some(val) = &_val.mutability { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Mut); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("mutability", Print::ref_cast(val)); +                } +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Item::Struct(_val) => { +                let mut formatter = formatter.debug_struct("Item::Struct"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("generics", Lite(&_val.generics)); +                formatter.field("fields", Lite(&_val.fields)); +                if let Some(val) = &_val.semi_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Semi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("semi_token", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Item::Trait(_val) => { +                let mut formatter = formatter.debug_struct("Item::Trait"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                if let Some(val) = &_val.unsafety { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Unsafe); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("unsafety", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.auto_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Auto); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("auto_token", Print::ref_cast(val)); +                } +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("generics", Lite(&_val.generics)); +                if let Some(val) = &_val.colon_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Colon); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("colon_token", Print::ref_cast(val)); +                } +                if !_val.supertraits.is_empty() { +                    formatter.field("supertraits", Lite(&_val.supertraits)); +                } +                if !_val.items.is_empty() { +                    formatter.field("items", Lite(&_val.items)); +                } +                formatter.finish() +            } +            syn::Item::TraitAlias(_val) => { +                let mut formatter = formatter.debug_struct("Item::TraitAlias"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("generics", Lite(&_val.generics)); +                if !_val.bounds.is_empty() { +                    formatter.field("bounds", Lite(&_val.bounds)); +                } +                formatter.finish() +            } +            syn::Item::Type(_val) => { +                let mut formatter = formatter.debug_struct("Item::Type"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("generics", Lite(&_val.generics)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.finish() +            } +            syn::Item::Union(_val) => { +                let mut formatter = formatter.debug_struct("Item::Union"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("generics", Lite(&_val.generics)); +                formatter.field("fields", Lite(&_val.fields)); +                formatter.finish() +            } +            syn::Item::Use(_val) => { +                let mut formatter = formatter.debug_struct("Item::Use"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("vis", Lite(&_val.vis)); +                if let Some(val) = &_val.leading_colon { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Colon2); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("leading_colon", Print::ref_cast(val)); +                } +                formatter.field("tree", Lite(&_val.tree)); +                formatter.finish() +            } +            syn::Item::Verbatim(_val) => { +                formatter.write_str("Verbatim")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            _ => unreachable!(), +        } +    } +} +impl Debug for Lite<syn::ItemConst> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemConst"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemEnum> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemEnum"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        if !_val.variants.is_empty() { +            formatter.field("variants", Lite(&_val.variants)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemExternCrate> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemExternCrate"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        if let Some(val) = &_val.rename { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::As, proc_macro2::Ident)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("rename", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemFn> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemFn"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("sig", Lite(&_val.sig)); +        formatter.field("block", Lite(&_val.block)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemForeignMod> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemForeignMod"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("abi", Lite(&_val.abi)); +        if !_val.items.is_empty() { +            formatter.field("items", Lite(&_val.items)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemImpl> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemImpl"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.defaultness { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Default); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("defaultness", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.unsafety { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Unsafe); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("unsafety", Print::ref_cast(val)); +        } +        formatter.field("generics", Lite(&_val.generics)); +        if let Some(val) = &_val.trait_ { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((Option<syn::token::Bang>, syn::Path, syn::token::For)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt( +                        &( +                            { +                                #[derive(RefCast)] +                                #[repr(transparent)] +                                struct Print(Option<syn::token::Bang>); +                                impl Debug for Print { +                                    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                                        match &self.0 { +                                            Some(_val) => { +                                                formatter.write_str("Some")?; +                                                Ok(()) +                                            } +                                            None => formatter.write_str("None"), +                                        } +                                    } +                                } +                                Print::ref_cast(&_val.0) +                            }, +                            Lite(&_val.1), +                        ), +                        formatter, +                    )?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("trait_", Print::ref_cast(val)); +        } +        formatter.field("self_ty", Lite(&_val.self_ty)); +        if !_val.items.is_empty() { +            formatter.field("items", Lite(&_val.items)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemMacro> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemMacro"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.ident { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(proc_macro2::Ident); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("ident", Print::ref_cast(val)); +        } +        formatter.field("mac", Lite(&_val.mac)); +        if let Some(val) = &_val.semi_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Semi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("semi_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemMacro2> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemMacro2"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("rules", Lite(&_val.rules)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemMod> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemMod"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        if let Some(val) = &_val.content { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::Brace, Vec<syn::Item>)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("content", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.semi { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Semi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("semi", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemStatic> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemStatic"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        if let Some(val) = &_val.mutability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Mut); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("mutability", Print::ref_cast(val)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemStruct> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemStruct"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        formatter.field("fields", Lite(&_val.fields)); +        if let Some(val) = &_val.semi_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Semi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("semi_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemTrait> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemTrait"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        if let Some(val) = &_val.unsafety { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Unsafe); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("unsafety", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.auto_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Auto); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("auto_token", Print::ref_cast(val)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        if let Some(val) = &_val.colon_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("colon_token", Print::ref_cast(val)); +        } +        if !_val.supertraits.is_empty() { +            formatter.field("supertraits", Lite(&_val.supertraits)); +        } +        if !_val.items.is_empty() { +            formatter.field("items", Lite(&_val.items)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemTraitAlias> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemTraitAlias"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemType> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemType"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemUnion> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemUnion"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        formatter.field("fields", Lite(&_val.fields)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::ItemUse> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ItemUse"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("vis", Lite(&_val.vis)); +        if let Some(val) = &_val.leading_colon { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon2); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("leading_colon", Print::ref_cast(val)); +        } +        formatter.field("tree", Lite(&_val.tree)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Label> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Label"); +        formatter.field("name", Lite(&_val.name)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Lifetime> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Lifetime"); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::LifetimeDef> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("LifetimeDef"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("lifetime", Lite(&_val.lifetime)); +        if let Some(val) = &_val.colon_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("colon_token", Print::ref_cast(val)); +        } +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Lit> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Lit::Str(_val) => write!(formatter, "{:?}", _val.value()), +            syn::Lit::ByteStr(_val) => write!(formatter, "{:?}", _val.value()), +            syn::Lit::Byte(_val) => write!(formatter, "{:?}", _val.value()), +            syn::Lit::Char(_val) => write!(formatter, "{:?}", _val.value()), +            syn::Lit::Int(_val) => write!(formatter, "{}", _val), +            syn::Lit::Float(_val) => write!(formatter, "{}", _val), +            syn::Lit::Bool(_val) => { +                let mut formatter = formatter.debug_struct("Lit::Bool"); +                formatter.field("value", Lite(&_val.value)); +                formatter.finish() +            } +            syn::Lit::Verbatim(_val) => { +                formatter.write_str("Verbatim")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::LitBool> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("LitBool"); +        formatter.field("value", Lite(&_val.value)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::LitByte> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        write!(formatter, "{:?}", _val.value()) +    } +} +impl Debug for Lite<syn::LitByteStr> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        write!(formatter, "{:?}", _val.value()) +    } +} +impl Debug for Lite<syn::LitChar> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        write!(formatter, "{:?}", _val.value()) +    } +} +impl Debug for Lite<syn::LitFloat> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        write!(formatter, "{}", _val) +    } +} +impl Debug for Lite<syn::LitInt> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        write!(formatter, "{}", _val) +    } +} +impl Debug for Lite<syn::LitStr> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        write!(formatter, "{:?}", _val.value()) +    } +} +impl Debug for Lite<syn::Local> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Local"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("pat", Lite(&_val.pat)); +        if let Some(val) = &_val.init { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::Eq, Box<syn::Expr>)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("init", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Macro> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Macro"); +        formatter.field("path", Lite(&_val.path)); +        formatter.field("delimiter", Lite(&_val.delimiter)); +        formatter.field("tokens", Lite(&_val.tokens)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::MacroDelimiter> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::MacroDelimiter::Paren(_val) => { +                formatter.write_str("Paren")?; +                Ok(()) +            } +            syn::MacroDelimiter::Brace(_val) => { +                formatter.write_str("Brace")?; +                Ok(()) +            } +            syn::MacroDelimiter::Bracket(_val) => { +                formatter.write_str("Bracket")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::Member> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Member::Named(_val) => { +                formatter.write_str("Named")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::Member::Unnamed(_val) => { +                formatter.write_str("Unnamed")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::Meta> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Meta::Path(_val) => { +                formatter.write_str("Path")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::Meta::List(_val) => { +                let mut formatter = formatter.debug_struct("Meta::List"); +                formatter.field("path", Lite(&_val.path)); +                if !_val.nested.is_empty() { +                    formatter.field("nested", Lite(&_val.nested)); +                } +                formatter.finish() +            } +            syn::Meta::NameValue(_val) => { +                let mut formatter = formatter.debug_struct("Meta::NameValue"); +                formatter.field("path", Lite(&_val.path)); +                formatter.field("lit", Lite(&_val.lit)); +                formatter.finish() +            } +        } +    } +} +impl Debug for Lite<syn::MetaList> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("MetaList"); +        formatter.field("path", Lite(&_val.path)); +        if !_val.nested.is_empty() { +            formatter.field("nested", Lite(&_val.nested)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::MetaNameValue> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("MetaNameValue"); +        formatter.field("path", Lite(&_val.path)); +        formatter.field("lit", Lite(&_val.lit)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::MethodTurbofish> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("MethodTurbofish"); +        if !_val.args.is_empty() { +            formatter.field("args", Lite(&_val.args)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::NestedMeta> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::NestedMeta::Meta(_val) => { +                formatter.write_str("Meta")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::NestedMeta::Lit(_val) => { +                formatter.write_str("Lit")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::ParenthesizedGenericArguments> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("ParenthesizedGenericArguments"); +        if !_val.inputs.is_empty() { +            formatter.field("inputs", Lite(&_val.inputs)); +        } +        formatter.field("output", Lite(&_val.output)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Pat> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Pat::Box(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Box"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("pat", Lite(&_val.pat)); +                formatter.finish() +            } +            syn::Pat::Ident(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Ident"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.by_ref { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Ref); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("by_ref", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.mutability { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Mut); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("mutability", Print::ref_cast(val)); +                } +                formatter.field("ident", Lite(&_val.ident)); +                if let Some(val) = &_val.subpat { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print((syn::token::At, Box<syn::Pat>)); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(&_val.1), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("subpat", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Pat::Lit(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Lit"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("expr", Lite(&_val.expr)); +                formatter.finish() +            } +            syn::Pat::Macro(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Macro"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("mac", Lite(&_val.mac)); +                formatter.finish() +            } +            syn::Pat::Or(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Or"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.leading_vert { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Or); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("leading_vert", Print::ref_cast(val)); +                } +                if !_val.cases.is_empty() { +                    formatter.field("cases", Lite(&_val.cases)); +                } +                formatter.finish() +            } +            syn::Pat::Path(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Path"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.qself { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::QSelf); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("qself", Print::ref_cast(val)); +                } +                formatter.field("path", Lite(&_val.path)); +                formatter.finish() +            } +            syn::Pat::Range(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Range"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("lo", Lite(&_val.lo)); +                formatter.field("limits", Lite(&_val.limits)); +                formatter.field("hi", Lite(&_val.hi)); +                formatter.finish() +            } +            syn::Pat::Reference(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Reference"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if let Some(val) = &_val.mutability { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Mut); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("mutability", Print::ref_cast(val)); +                } +                formatter.field("pat", Lite(&_val.pat)); +                formatter.finish() +            } +            syn::Pat::Rest(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Rest"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.finish() +            } +            syn::Pat::Slice(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Slice"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if !_val.elems.is_empty() { +                    formatter.field("elems", Lite(&_val.elems)); +                } +                formatter.finish() +            } +            syn::Pat::Struct(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Struct"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("path", Lite(&_val.path)); +                if !_val.fields.is_empty() { +                    formatter.field("fields", Lite(&_val.fields)); +                } +                if let Some(val) = &_val.dot2_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Dot2); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("dot2_token", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::Pat::Tuple(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Tuple"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                if !_val.elems.is_empty() { +                    formatter.field("elems", Lite(&_val.elems)); +                } +                formatter.finish() +            } +            syn::Pat::TupleStruct(_val) => { +                let mut formatter = formatter.debug_struct("Pat::TupleStruct"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("path", Lite(&_val.path)); +                formatter.field("pat", Lite(&_val.pat)); +                formatter.finish() +            } +            syn::Pat::Type(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Type"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("pat", Lite(&_val.pat)); +                formatter.field("ty", Lite(&_val.ty)); +                formatter.finish() +            } +            syn::Pat::Verbatim(_val) => { +                formatter.write_str("Verbatim")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::Pat::Wild(_val) => { +                let mut formatter = formatter.debug_struct("Pat::Wild"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.finish() +            } +            _ => unreachable!(), +        } +    } +} +impl Debug for Lite<syn::PatBox> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatBox"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("pat", Lite(&_val.pat)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatIdent> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatIdent"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.by_ref { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Ref); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("by_ref", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.mutability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Mut); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("mutability", Print::ref_cast(val)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        if let Some(val) = &_val.subpat { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::At, Box<syn::Pat>)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("subpat", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatLit> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatLit"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("expr", Lite(&_val.expr)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatMacro> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatMacro"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("mac", Lite(&_val.mac)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatOr> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatOr"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.leading_vert { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Or); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("leading_vert", Print::ref_cast(val)); +        } +        if !_val.cases.is_empty() { +            formatter.field("cases", Lite(&_val.cases)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatPath> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatPath"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.qself { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::QSelf); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("qself", Print::ref_cast(val)); +        } +        formatter.field("path", Lite(&_val.path)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatRange> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatRange"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("lo", Lite(&_val.lo)); +        formatter.field("limits", Lite(&_val.limits)); +        formatter.field("hi", Lite(&_val.hi)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatReference> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatReference"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.mutability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Mut); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("mutability", Print::ref_cast(val)); +        } +        formatter.field("pat", Lite(&_val.pat)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatRest> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatRest"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatSlice> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatSlice"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if !_val.elems.is_empty() { +            formatter.field("elems", Lite(&_val.elems)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatStruct> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatStruct"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("path", Lite(&_val.path)); +        if !_val.fields.is_empty() { +            formatter.field("fields", Lite(&_val.fields)); +        } +        if let Some(val) = &_val.dot2_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Dot2); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("dot2_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatTuple> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatTuple"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if !_val.elems.is_empty() { +            formatter.field("elems", Lite(&_val.elems)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatTupleStruct> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatTupleStruct"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("path", Lite(&_val.path)); +        formatter.field("pat", Lite(&_val.pat)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatType> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatType"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("pat", Lite(&_val.pat)); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PatWild> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PatWild"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Path> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Path"); +        if let Some(val) = &_val.leading_colon { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon2); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("leading_colon", Print::ref_cast(val)); +        } +        if !_val.segments.is_empty() { +            formatter.field("segments", Lite(&_val.segments)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::PathArguments> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::PathArguments::None => formatter.write_str("None"), +            syn::PathArguments::AngleBracketed(_val) => { +                let mut formatter = formatter.debug_struct("PathArguments::AngleBracketed"); +                if let Some(val) = &_val.colon2_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Colon2); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("colon2_token", Print::ref_cast(val)); +                } +                if !_val.args.is_empty() { +                    formatter.field("args", Lite(&_val.args)); +                } +                formatter.finish() +            } +            syn::PathArguments::Parenthesized(_val) => { +                let mut formatter = formatter.debug_struct("PathArguments::Parenthesized"); +                if !_val.inputs.is_empty() { +                    formatter.field("inputs", Lite(&_val.inputs)); +                } +                formatter.field("output", Lite(&_val.output)); +                formatter.finish() +            } +        } +    } +} +impl Debug for Lite<syn::PathSegment> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PathSegment"); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("arguments", Lite(&_val.arguments)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PredicateEq> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PredicateEq"); +        formatter.field("lhs_ty", Lite(&_val.lhs_ty)); +        formatter.field("rhs_ty", Lite(&_val.rhs_ty)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::PredicateLifetime> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PredicateLifetime"); +        formatter.field("lifetime", Lite(&_val.lifetime)); +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::PredicateType> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("PredicateType"); +        if let Some(val) = &_val.lifetimes { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::BoundLifetimes); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("lifetimes", Print::ref_cast(val)); +        } +        formatter.field("bounded_ty", Lite(&_val.bounded_ty)); +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::QSelf> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("QSelf"); +        formatter.field("ty", Lite(&_val.ty)); +        formatter.field("position", Lite(&_val.position)); +        if let Some(val) = &_val.as_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::As); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("as_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::RangeLimits> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::RangeLimits::HalfOpen(_val) => { +                formatter.write_str("HalfOpen")?; +                Ok(()) +            } +            syn::RangeLimits::Closed(_val) => { +                formatter.write_str("Closed")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::Receiver> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Receiver"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        if let Some(val) = &_val.reference { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::And, Option<syn::Lifetime>)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt( +                        { +                            #[derive(RefCast)] +                            #[repr(transparent)] +                            struct Print(Option<syn::Lifetime>); +                            impl Debug for Print { +                                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                                    match &self.0 { +                                        Some(_val) => { +                                            formatter.write_str("Some")?; +                                            formatter.write_str("(")?; +                                            Debug::fmt(Lite(_val), formatter)?; +                                            formatter.write_str(")")?; +                                            Ok(()) +                                        } +                                        None => formatter.write_str("None"), +                                    } +                                } +                            } +                            Print::ref_cast(&_val.1) +                        }, +                        formatter, +                    )?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("reference", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.mutability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Mut); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("mutability", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::ReturnType> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::ReturnType::Default => formatter.write_str("Default"), +            syn::ReturnType::Type(_v0, _v1) => { +                let mut formatter = formatter.debug_tuple("Type"); +                formatter.field(Lite(_v1)); +                formatter.finish() +            } +        } +    } +} +impl Debug for Lite<syn::Signature> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Signature"); +        if let Some(val) = &_val.constness { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Const); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("constness", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.asyncness { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Async); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("asyncness", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.unsafety { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Unsafe); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("unsafety", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.abi { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Abi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("abi", Print::ref_cast(val)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        if !_val.inputs.is_empty() { +            formatter.field("inputs", Lite(&_val.inputs)); +        } +        if let Some(val) = &_val.variadic { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Variadic); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("variadic", Print::ref_cast(val)); +        } +        formatter.field("output", Lite(&_val.output)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Stmt> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Stmt::Local(_val) => { +                formatter.write_str("Local")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::Stmt::Item(_val) => { +                formatter.write_str("Item")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::Stmt::Expr(_val) => { +                formatter.write_str("Expr")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::Stmt::Semi(_v0, _v1) => { +                let mut formatter = formatter.debug_tuple("Semi"); +                formatter.field(Lite(_v0)); +                formatter.finish() +            } +        } +    } +} +impl Debug for Lite<syn::TraitBound> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TraitBound"); +        if let Some(val) = &_val.paren_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Paren); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("paren_token", Print::ref_cast(val)); +        } +        formatter.field("modifier", Lite(&_val.modifier)); +        if let Some(val) = &_val.lifetimes { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::BoundLifetimes); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("lifetimes", Print::ref_cast(val)); +        } +        formatter.field("path", Lite(&_val.path)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TraitBoundModifier> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::TraitBoundModifier::None => formatter.write_str("None"), +            syn::TraitBoundModifier::Maybe(_val) => { +                formatter.write_str("Maybe")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::TraitItem> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::TraitItem::Const(_val) => { +                let mut formatter = formatter.debug_struct("TraitItem::Const"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("ty", Lite(&_val.ty)); +                if let Some(val) = &_val.default { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print((syn::token::Eq, syn::Expr)); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(&_val.1), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("default", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::TraitItem::Method(_val) => { +                let mut formatter = formatter.debug_struct("TraitItem::Method"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("sig", Lite(&_val.sig)); +                if let Some(val) = &_val.default { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Block); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("default", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.semi_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Semi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("semi_token", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::TraitItem::Type(_val) => { +                let mut formatter = formatter.debug_struct("TraitItem::Type"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("ident", Lite(&_val.ident)); +                formatter.field("generics", Lite(&_val.generics)); +                if let Some(val) = &_val.colon_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Colon); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("colon_token", Print::ref_cast(val)); +                } +                if !_val.bounds.is_empty() { +                    formatter.field("bounds", Lite(&_val.bounds)); +                } +                if let Some(val) = &_val.default { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print((syn::token::Eq, syn::Type)); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(&_val.1), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("default", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::TraitItem::Macro(_val) => { +                let mut formatter = formatter.debug_struct("TraitItem::Macro"); +                if !_val.attrs.is_empty() { +                    formatter.field("attrs", Lite(&_val.attrs)); +                } +                formatter.field("mac", Lite(&_val.mac)); +                if let Some(val) = &_val.semi_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Semi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("semi_token", Print::ref_cast(val)); +                } +                formatter.finish() +            } +            syn::TraitItem::Verbatim(_val) => { +                formatter.write_str("Verbatim")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            _ => unreachable!(), +        } +    } +} +impl Debug for Lite<syn::TraitItemConst> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TraitItemConst"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("ty", Lite(&_val.ty)); +        if let Some(val) = &_val.default { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::Eq, syn::Expr)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("default", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::TraitItemMacro> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TraitItemMacro"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("mac", Lite(&_val.mac)); +        if let Some(val) = &_val.semi_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Semi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("semi_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::TraitItemMethod> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TraitItemMethod"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("sig", Lite(&_val.sig)); +        if let Some(val) = &_val.default { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Block); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("default", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.semi_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Semi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("semi_token", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::TraitItemType> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TraitItemType"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("generics", Lite(&_val.generics)); +        if let Some(val) = &_val.colon_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("colon_token", Print::ref_cast(val)); +        } +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        if let Some(val) = &_val.default { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::Eq, syn::Type)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("default", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Type> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Type::Array(_val) => { +                let mut formatter = formatter.debug_struct("Type::Array"); +                formatter.field("elem", Lite(&_val.elem)); +                formatter.field("len", Lite(&_val.len)); +                formatter.finish() +            } +            syn::Type::BareFn(_val) => { +                let mut formatter = formatter.debug_struct("Type::BareFn"); +                if let Some(val) = &_val.lifetimes { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::BoundLifetimes); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("lifetimes", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.unsafety { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Unsafe); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("unsafety", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.abi { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Abi); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("abi", Print::ref_cast(val)); +                } +                if !_val.inputs.is_empty() { +                    formatter.field("inputs", Lite(&_val.inputs)); +                } +                if let Some(val) = &_val.variadic { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Variadic); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("variadic", Print::ref_cast(val)); +                } +                formatter.field("output", Lite(&_val.output)); +                formatter.finish() +            } +            syn::Type::Group(_val) => { +                let mut formatter = formatter.debug_struct("Type::Group"); +                formatter.field("elem", Lite(&_val.elem)); +                formatter.finish() +            } +            syn::Type::ImplTrait(_val) => { +                let mut formatter = formatter.debug_struct("Type::ImplTrait"); +                if !_val.bounds.is_empty() { +                    formatter.field("bounds", Lite(&_val.bounds)); +                } +                formatter.finish() +            } +            syn::Type::Infer(_val) => { +                let mut formatter = formatter.debug_struct("Type::Infer"); +                formatter.finish() +            } +            syn::Type::Macro(_val) => { +                let mut formatter = formatter.debug_struct("Type::Macro"); +                formatter.field("mac", Lite(&_val.mac)); +                formatter.finish() +            } +            syn::Type::Never(_val) => { +                let mut formatter = formatter.debug_struct("Type::Never"); +                formatter.finish() +            } +            syn::Type::Paren(_val) => { +                let mut formatter = formatter.debug_struct("Type::Paren"); +                formatter.field("elem", Lite(&_val.elem)); +                formatter.finish() +            } +            syn::Type::Path(_val) => { +                let mut formatter = formatter.debug_struct("Type::Path"); +                if let Some(val) = &_val.qself { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::QSelf); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("qself", Print::ref_cast(val)); +                } +                formatter.field("path", Lite(&_val.path)); +                formatter.finish() +            } +            syn::Type::Ptr(_val) => { +                let mut formatter = formatter.debug_struct("Type::Ptr"); +                if let Some(val) = &_val.const_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Const); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("const_token", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.mutability { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Mut); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("mutability", Print::ref_cast(val)); +                } +                formatter.field("elem", Lite(&_val.elem)); +                formatter.finish() +            } +            syn::Type::Reference(_val) => { +                let mut formatter = formatter.debug_struct("Type::Reference"); +                if let Some(val) = &_val.lifetime { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::Lifetime); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            let _val = &self.0; +                            formatter.write_str("(")?; +                            Debug::fmt(Lite(_val), formatter)?; +                            formatter.write_str(")")?; +                            Ok(()) +                        } +                    } +                    formatter.field("lifetime", Print::ref_cast(val)); +                } +                if let Some(val) = &_val.mutability { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Mut); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("mutability", Print::ref_cast(val)); +                } +                formatter.field("elem", Lite(&_val.elem)); +                formatter.finish() +            } +            syn::Type::Slice(_val) => { +                let mut formatter = formatter.debug_struct("Type::Slice"); +                formatter.field("elem", Lite(&_val.elem)); +                formatter.finish() +            } +            syn::Type::TraitObject(_val) => { +                let mut formatter = formatter.debug_struct("Type::TraitObject"); +                if let Some(val) = &_val.dyn_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::Dyn); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("dyn_token", Print::ref_cast(val)); +                } +                if !_val.bounds.is_empty() { +                    formatter.field("bounds", Lite(&_val.bounds)); +                } +                formatter.finish() +            } +            syn::Type::Tuple(_val) => { +                let mut formatter = formatter.debug_struct("Type::Tuple"); +                if !_val.elems.is_empty() { +                    formatter.field("elems", Lite(&_val.elems)); +                } +                formatter.finish() +            } +            syn::Type::Verbatim(_val) => { +                formatter.write_str("Verbatim")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            _ => unreachable!(), +        } +    } +} +impl Debug for Lite<syn::TypeArray> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeArray"); +        formatter.field("elem", Lite(&_val.elem)); +        formatter.field("len", Lite(&_val.len)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeBareFn> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeBareFn"); +        if let Some(val) = &_val.lifetimes { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::BoundLifetimes); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("lifetimes", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.unsafety { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Unsafe); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("unsafety", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.abi { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Abi); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("abi", Print::ref_cast(val)); +        } +        if !_val.inputs.is_empty() { +            formatter.field("inputs", Lite(&_val.inputs)); +        } +        if let Some(val) = &_val.variadic { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Variadic); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("variadic", Print::ref_cast(val)); +        } +        formatter.field("output", Lite(&_val.output)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeGroup> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeGroup"); +        formatter.field("elem", Lite(&_val.elem)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeImplTrait> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeImplTrait"); +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeInfer> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeInfer"); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeMacro> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeMacro"); +        formatter.field("mac", Lite(&_val.mac)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeNever> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeNever"); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeParam> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeParam"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        if let Some(val) = &_val.colon_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Colon); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("colon_token", Print::ref_cast(val)); +        } +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        if let Some(val) = &_val.eq_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Eq); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("eq_token", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.default { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Type); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("default", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeParamBound> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::TypeParamBound::Trait(_val) => { +                formatter.write_str("Trait")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::TypeParamBound::Lifetime(_val) => { +                formatter.write_str("Lifetime")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::TypeParen> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeParen"); +        formatter.field("elem", Lite(&_val.elem)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypePath> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypePath"); +        if let Some(val) = &_val.qself { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::QSelf); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("qself", Print::ref_cast(val)); +        } +        formatter.field("path", Lite(&_val.path)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypePtr> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypePtr"); +        if let Some(val) = &_val.const_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Const); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("const_token", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.mutability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Mut); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("mutability", Print::ref_cast(val)); +        } +        formatter.field("elem", Lite(&_val.elem)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeReference> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeReference"); +        if let Some(val) = &_val.lifetime { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::Lifetime); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(_val), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("lifetime", Print::ref_cast(val)); +        } +        if let Some(val) = &_val.mutability { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Mut); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("mutability", Print::ref_cast(val)); +        } +        formatter.field("elem", Lite(&_val.elem)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeSlice> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeSlice"); +        formatter.field("elem", Lite(&_val.elem)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeTraitObject> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeTraitObject"); +        if let Some(val) = &_val.dyn_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::Dyn); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("dyn_token", Print::ref_cast(val)); +        } +        if !_val.bounds.is_empty() { +            formatter.field("bounds", Lite(&_val.bounds)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::TypeTuple> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("TypeTuple"); +        if !_val.elems.is_empty() { +            formatter.field("elems", Lite(&_val.elems)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::UnOp> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::UnOp::Deref(_val) => { +                formatter.write_str("Deref")?; +                Ok(()) +            } +            syn::UnOp::Not(_val) => { +                formatter.write_str("Not")?; +                Ok(()) +            } +            syn::UnOp::Neg(_val) => { +                formatter.write_str("Neg")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::UseGlob> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("UseGlob"); +        formatter.finish() +    } +} +impl Debug for Lite<syn::UseGroup> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("UseGroup"); +        if !_val.items.is_empty() { +            formatter.field("items", Lite(&_val.items)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::UseName> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("UseName"); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::UsePath> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("UsePath"); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("tree", Lite(&_val.tree)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::UseRename> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("UseRename"); +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("rename", Lite(&_val.rename)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::UseTree> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::UseTree::Path(_val) => { +                formatter.write_str("Path")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::UseTree::Name(_val) => { +                formatter.write_str("Name")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::UseTree::Rename(_val) => { +                formatter.write_str("Rename")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::UseTree::Glob(_val) => { +                formatter.write_str("Glob")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::UseTree::Group(_val) => { +                formatter.write_str("Group")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} +impl Debug for Lite<syn::Variadic> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Variadic"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::Variant> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("Variant"); +        if !_val.attrs.is_empty() { +            formatter.field("attrs", Lite(&_val.attrs)); +        } +        formatter.field("ident", Lite(&_val.ident)); +        formatter.field("fields", Lite(&_val.fields)); +        if let Some(val) = &_val.discriminant { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print((syn::token::Eq, syn::Expr)); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    let _val = &self.0; +                    formatter.write_str("(")?; +                    Debug::fmt(Lite(&_val.1), formatter)?; +                    formatter.write_str(")")?; +                    Ok(()) +                } +            } +            formatter.field("discriminant", Print::ref_cast(val)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::VisCrate> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("VisCrate"); +        formatter.finish() +    } +} +impl Debug for Lite<syn::VisPublic> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("VisPublic"); +        formatter.finish() +    } +} +impl Debug for Lite<syn::VisRestricted> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("VisRestricted"); +        if let Some(val) = &_val.in_token { +            #[derive(RefCast)] +            #[repr(transparent)] +            struct Print(syn::token::In); +            impl Debug for Print { +                fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                    formatter.write_str("Some")?; +                    Ok(()) +                } +            } +            formatter.field("in_token", Print::ref_cast(val)); +        } +        formatter.field("path", Lite(&_val.path)); +        formatter.finish() +    } +} +impl Debug for Lite<syn::Visibility> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::Visibility::Public(_val) => { +                let mut formatter = formatter.debug_struct("Visibility::Public"); +                formatter.finish() +            } +            syn::Visibility::Crate(_val) => { +                let mut formatter = formatter.debug_struct("Visibility::Crate"); +                formatter.finish() +            } +            syn::Visibility::Restricted(_val) => { +                let mut formatter = formatter.debug_struct("Visibility::Restricted"); +                if let Some(val) = &_val.in_token { +                    #[derive(RefCast)] +                    #[repr(transparent)] +                    struct Print(syn::token::In); +                    impl Debug for Print { +                        fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +                            formatter.write_str("Some")?; +                            Ok(()) +                        } +                    } +                    formatter.field("in_token", Print::ref_cast(val)); +                } +                formatter.field("path", Lite(&_val.path)); +                formatter.finish() +            } +            syn::Visibility::Inherited => formatter.write_str("Inherited"), +        } +    } +} +impl Debug for Lite<syn::WhereClause> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        let mut formatter = formatter.debug_struct("WhereClause"); +        if !_val.predicates.is_empty() { +            formatter.field("predicates", Lite(&_val.predicates)); +        } +        formatter.finish() +    } +} +impl Debug for Lite<syn::WherePredicate> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        let _val = &self.value; +        match _val { +            syn::WherePredicate::Type(_val) => { +                formatter.write_str("Type")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::WherePredicate::Lifetime(_val) => { +                formatter.write_str("Lifetime")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +            syn::WherePredicate::Eq(_val) => { +                formatter.write_str("Eq")?; +                formatter.write_str("(")?; +                Debug::fmt(Lite(_val), formatter)?; +                formatter.write_str(")")?; +                Ok(()) +            } +        } +    } +} diff --git a/syn/tests/debug/mod.rs b/syn/tests/debug/mod.rs new file mode 100644 index 0000000..9c80e2c --- /dev/null +++ b/syn/tests/debug/mod.rs @@ -0,0 +1,110 @@ +mod gen; + +use proc_macro2::{Ident, Literal, TokenStream}; +use ref_cast::RefCast; +use std::fmt::{self, Debug}; +use std::ops::Deref; +use syn::punctuated::Punctuated; + +#[derive(RefCast)] +#[repr(transparent)] +pub struct Lite<T: ?Sized> { +    value: T, +} + +#[allow(non_snake_case)] +pub fn Lite<T: ?Sized>(value: &T) -> &Lite<T> { +    Lite::ref_cast(value) +} + +impl<T: ?Sized> Deref for Lite<T> { +    type Target = T; + +    fn deref(&self) -> &Self::Target { +        &self.value +    } +} + +impl Debug for Lite<bool> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        write!(formatter, "{}", self.value) +    } +} + +impl Debug for Lite<u32> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        write!(formatter, "{}", self.value) +    } +} + +impl Debug for Lite<usize> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        write!(formatter, "{}", self.value) +    } +} + +impl Debug for Lite<String> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        write!(formatter, "{:?}", self.value) +    } +} + +impl Debug for Lite<Ident> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        write!(formatter, "{:?}", self.value.to_string()) +    } +} + +impl Debug for Lite<Literal> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        write!(formatter, "{}", self.value) +    } +} + +impl Debug for Lite<TokenStream> { +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        write!(formatter, "`{}`", self.value) +    } +} + +impl<'a, T> Debug for Lite<&'a T> +where +    Lite<T>: Debug, +{ +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        Debug::fmt(Lite(&*self.value), formatter) +    } +} + +impl<T> Debug for Lite<Box<T>> +where +    Lite<T>: Debug, +{ +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        Debug::fmt(Lite(&*self.value), formatter) +    } +} + +impl<T> Debug for Lite<Vec<T>> +where +    Lite<T>: Debug, +{ +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        formatter +            .debug_list() +            .entries(self.value.iter().map(Lite)) +            .finish() +    } +} + +impl<T, P> Debug for Lite<Punctuated<T, P>> +where +    Lite<T>: Debug, +{ +    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { +        formatter +            .debug_list() +            .entries(self.value.iter().map(Lite)) +            .finish() +    } +} diff --git a/syn/tests/features/error.rs b/syn/tests/features/error.rs new file mode 100644 index 0000000..10ac889 --- /dev/null +++ b/syn/tests/features/error.rs @@ -0,0 +1 @@ +"Hello! You want: cargo test --release --all-features" diff --git a/syn/tests/features/mod.rs b/syn/tests/features/mod.rs new file mode 100644 index 0000000..83fbe13 --- /dev/null +++ b/syn/tests/features/mod.rs @@ -0,0 +1,22 @@ +#[allow(unused_macros)] +macro_rules! hide_from_rustfmt { +    ($mod:item) => { +        $mod +    }; +} + +#[cfg(not(all( +    feature = "derive", +    feature = "full", +    feature = "parsing", +    feature = "printing", +    feature = "visit", +    feature = "visit-mut", +    feature = "fold", +    feature = "clone-impls", +    feature = "extra-traits", +    feature = "proc-macro", +)))] +hide_from_rustfmt! { +    mod error; +} diff --git a/syn/tests/macros/mod.rs b/syn/tests/macros/mod.rs new file mode 100644 index 0000000..3994615 --- /dev/null +++ b/syn/tests/macros/mod.rs @@ -0,0 +1,76 @@ +#[path = "../debug/mod.rs"] +pub mod debug; + +use syn; +use syn::parse::{Parse, Result}; + +#[macro_export] +macro_rules! errorf { +    ($($tt:tt)*) => {{ +        use ::std::io::Write; +        let stderr = ::std::io::stderr(); +        write!(stderr.lock(), $($tt)*).unwrap(); +    }}; +} + +#[macro_export] +macro_rules! punctuated { +    ($($e:expr,)+) => {{ +        let mut seq = ::syn::punctuated::Punctuated::new(); +        $( +            seq.push($e); +        )+ +        seq +    }}; + +    ($($e:expr),+) => { +        punctuated!($($e,)+) +    }; +} + +#[macro_export] +macro_rules! snapshot { +    ($($args:tt)*) => { +        snapshot_impl!(() $($args)*) +    }; +} + +#[macro_export] +macro_rules! snapshot_impl { +    (($expr:ident) as $t:ty, @$snapshot:literal) => { +        let $expr = crate::macros::Tokens::parse::<$t>($expr).unwrap(); +        let debug = crate::macros::debug::Lite(&$expr); +        insta::assert_debug_snapshot!(debug, @$snapshot); +    }; +    (($($expr:tt)*) as $t:ty, @$snapshot:literal) => {{ +        let syntax_tree = crate::macros::Tokens::parse::<$t>($($expr)*).unwrap(); +        let debug = crate::macros::debug::Lite(&syntax_tree); +        insta::assert_debug_snapshot!(debug, @$snapshot); +        syntax_tree +    }}; +    (($($expr:tt)*) , @$snapshot:literal) => {{ +        let syntax_tree = $($expr)*; +        let debug = crate::macros::debug::Lite(&syntax_tree); +        insta::assert_debug_snapshot!(debug, @$snapshot); +        syntax_tree +    }}; +    (($($expr:tt)*) $next:tt $($rest:tt)*) => { +        snapshot_impl!(($($expr)* $next) $($rest)*) +    }; +} + +pub trait Tokens { +    fn parse<T: Parse>(self) -> Result<T>; +} + +impl<'a> Tokens for &'a str { +    fn parse<T: Parse>(self) -> Result<T> { +        syn::parse_str(self) +    } +} + +impl Tokens for proc_macro2::TokenStream { +    fn parse<T: Parse>(self) -> Result<T> { +        syn::parse2(self) +    } +} diff --git a/syn/tests/repo/mod.rs b/syn/tests/repo/mod.rs new file mode 100644 index 0000000..681615c --- /dev/null +++ b/syn/tests/repo/mod.rs @@ -0,0 +1,109 @@ +mod progress; + +use self::progress::Progress; +use crate::common; +use anyhow::Result; +use flate2::read::GzDecoder; +use std::fs; +use std::path::Path; +use tar::Archive; +use walkdir::DirEntry; + +const REVISION: &str = "7979016aff545f7b41cc517031026020b340989d"; + +pub fn base_dir_filter(entry: &DirEntry) -> bool { +    let path = entry.path(); +    if path.is_dir() { +        return true; // otherwise walkdir does not visit the files +    } +    if path.extension().map(|e| e != "rs").unwrap_or(true) { +        return false; +    } +    let path_string = path.to_string_lossy(); +    let path_string = if cfg!(windows) { +        path_string.replace('\\', "/").into() +    } else { +        path_string +    }; +    // TODO assert that parsing fails on the parse-fail cases +    if path_string.starts_with("tests/rust/src/test/parse-fail") +        || path_string.starts_with("tests/rust/src/test/compile-fail") +        || path_string.starts_with("tests/rust/src/test/rustfix") +    { +        return false; +    } + +    if path_string.starts_with("tests/rust/src/test/ui") { +        let stderr_path = path.with_extension("stderr"); +        if stderr_path.exists() { +            // Expected to fail in some way +            return false; +        } +    } + +    match path_string.as_ref() { +        // Deprecated placement syntax +        "tests/rust/src/test/ui/obsolete-in-place/bad.rs" | +        // Deprecated anonymous parameter syntax in traits +        "tests/rust/src/test/ui/error-codes/e0119/auxiliary/issue-23563-a.rs" | +        "tests/rust/src/test/ui/issues/issue-13105.rs" | +        "tests/rust/src/test/ui/issues/issue-13775.rs" | +        "tests/rust/src/test/ui/issues/issue-34074.rs" | +        // Deprecated await macro syntax +        "tests/rust/src/test/ui/async-await/await-macro.rs" | +        // 2015-style dyn that libsyntax rejects +        "tests/rust/src/test/ui/dyn-keyword/dyn-2015-no-warnings-without-lints.rs" | +        // not actually test cases +        "tests/rust/src/test/ui/include-single-expr-helper.rs" | +        "tests/rust/src/test/ui/include-single-expr-helper-1.rs" | +        "tests/rust/src/test/ui/issues/auxiliary/issue-21146-inc.rs" | +        "tests/rust/src/test/ui/macros/auxiliary/macro-comma-support.rs" | +        "tests/rust/src/test/ui/macros/auxiliary/macro-include-items-expr.rs" => false, +        _ => true, +    } +} + +pub fn clone_rust() { +    let needs_clone = match fs::read_to_string("tests/rust/COMMIT") { +        Err(_) => true, +        Ok(contents) => contents.trim() != REVISION, +    }; +    if needs_clone { +        download_and_unpack().unwrap(); +    } +} + +fn download_and_unpack() -> Result<()> { +    let url = format!( +        "https://github.com/rust-lang/rust/archive/{}.tar.gz", +        REVISION +    ); +    let response = reqwest::blocking::get(&url)?.error_for_status()?; +    let progress = Progress::new(response); +    let decoder = GzDecoder::new(progress); +    let mut archive = Archive::new(decoder); +    let prefix = format!("rust-{}", REVISION); + +    let tests_rust = Path::new("tests/rust"); +    if tests_rust.exists() { +        fs::remove_dir_all(tests_rust)?; +    } + +    for entry in archive.entries()? { +        let mut entry = entry?; +        let path = entry.path()?; +        if path == Path::new("pax_global_header") { +            continue; +        } +        let relative = path.strip_prefix(&prefix)?; +        let out = tests_rust.join(relative); +        entry.unpack(&out)?; +        if common::travis_ci() { +            // Something about this makes the travis build not deadlock... +            errorf!("."); +        } +    } + +    fs::write("tests/rust/COMMIT", REVISION)?; +    Ok(()) +} diff --git a/syn/tests/repo/progress.rs b/syn/tests/repo/progress.rs new file mode 100644 index 0000000..28c8a44 --- /dev/null +++ b/syn/tests/repo/progress.rs @@ -0,0 +1,37 @@ +use std::io::{Read, Result}; +use std::time::{Duration, Instant}; + +pub struct Progress<R> { +    bytes: usize, +    tick: Instant, +    stream: R, +} + +impl<R> Progress<R> { +    pub fn new(stream: R) -> Self { +        Progress { +            bytes: 0, +            tick: Instant::now() + Duration::from_millis(2000), +            stream, +        } +    } +} + +impl<R: Read> Read for Progress<R> { +    fn read(&mut self, buf: &mut [u8]) -> Result<usize> { +        let num = self.stream.read(buf)?; +        self.bytes += num; +        let now = Instant::now(); +        if now > self.tick { +            self.tick = now + Duration::from_millis(500); +            errorf!("downloading... {} bytes\n", self.bytes); +        } +        Ok(num) +    } +} + +impl<R> Drop for Progress<R> { +    fn drop(&mut self) { +        errorf!("done ({} bytes)\n", self.bytes); +    } +} diff --git a/syn/tests/test_asyncness.rs b/syn/tests/test_asyncness.rs new file mode 100644 index 0000000..e09e816 --- /dev/null +++ b/syn/tests/test_asyncness.rs @@ -0,0 +1,39 @@ +mod features; + +#[macro_use] +mod macros; + +use syn::{Expr, Item}; + +#[test] +fn test_async_fn() { +    let input = "async fn process() {}"; + +    snapshot!(input as Item, @r###" +    Item::Fn { +        vis: Inherited, +        sig: Signature { +            asyncness: Some, +            ident: "process", +            generics: Generics, +            output: Default, +        }, +        block: Block, +    } +    "###); +} + +#[test] +fn test_async_closure() { +    let input = "async || {}"; + +    snapshot!(input as Expr, @r###" +    Expr::Closure { +        asyncness: Some, +        output: Default, +        body: Expr::Block { +            block: Block, +        }, +    } +    "###); +} diff --git a/syn/tests/test_attribute.rs b/syn/tests/test_attribute.rs new file mode 100644 index 0000000..d77c0c0 --- /dev/null +++ b/syn/tests/test_attribute.rs @@ -0,0 +1,296 @@ +mod features; + +#[macro_use] +mod macros; + +use syn::parse::Parser; +use syn::{Attribute, Meta}; + +#[test] +fn test_meta_item_word() { +    let meta = test("#[foo]"); + +    snapshot!(meta, @r###" +    Path(Path { +        segments: [ +            PathSegment { +                ident: "foo", +                arguments: None, +            }, +        ], +    }) +    "###); +} + +#[test] +fn test_meta_item_name_value() { +    let meta = test("#[foo = 5]"); + +    snapshot!(meta, @r###" +    Meta::NameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        lit: 5, +    } +    "###); +} + +#[test] +fn test_meta_item_bool_value() { +    let meta = test("#[foo = true]"); + +    snapshot!(meta, @r###" +    Meta::NameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        lit: Lit::Bool { +            value: true, +        }, +    } +    "###); + +    let meta = test("#[foo = false]"); + +    snapshot!(meta, @r###" +    Meta::NameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        lit: Lit::Bool { +            value: false, +        }, +    } +    "###); +} + +#[test] +fn test_meta_item_list_lit() { +    let meta = test("#[foo(5)]"); + +    snapshot!(meta, @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Lit(5), +        ], +    } +    "###); +} + +#[test] +fn test_meta_item_list_word() { +    let meta = test("#[foo(bar)]"); + +    snapshot!(meta, @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "bar", +                        arguments: None, +                    }, +                ], +            })), +        ], +    } +    "###); +} + +#[test] +fn test_meta_item_list_name_value() { +    let meta = test("#[foo(bar = 5)]"); + +    snapshot!(meta, @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Meta(Meta::NameValue { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "bar", +                            arguments: None, +                        }, +                    ], +                }, +                lit: 5, +            }), +        ], +    } +    "###); +} + +#[test] +fn test_meta_item_list_bool_value() { +    let meta = test("#[foo(bar = true)]"); + +    snapshot!(meta, @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Meta(Meta::NameValue { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "bar", +                            arguments: None, +                        }, +                    ], +                }, +                lit: Lit::Bool { +                    value: true, +                }, +            }), +        ], +    } +    "###); +} + +#[test] +fn test_meta_item_multiple() { +    let meta = test("#[foo(word, name = 5, list(name2 = 6), word2)]"); + +    snapshot!(meta, @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "word", +                        arguments: None, +                    }, +                ], +            })), +            Meta(Meta::NameValue { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "name", +                            arguments: None, +                        }, +                    ], +                }, +                lit: 5, +            }), +            Meta(Meta::List { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "list", +                            arguments: None, +                        }, +                    ], +                }, +                nested: [ +                    Meta(Meta::NameValue { +                        path: Path { +                            segments: [ +                                PathSegment { +                                    ident: "name2", +                                    arguments: None, +                                }, +                            ], +                        }, +                        lit: 6, +                    }), +                ], +            }), +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "word2", +                        arguments: None, +                    }, +                ], +            })), +        ], +    } +    "###); +} + +#[test] +fn test_bool_lit() { +    let meta = test("#[foo(true)]"); + +    snapshot!(meta, @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Lit(Lit::Bool { +                value: true, +            }), +        ], +    } +    "###); +} + +fn test(input: &str) -> Meta { +    let attrs = Attribute::parse_outer.parse_str(input).unwrap(); + +    assert_eq!(attrs.len(), 1); +    let attr = attrs.into_iter().next().unwrap(); + +    attr.parse_meta().unwrap() +} diff --git a/syn/tests/test_derive_input.rs b/syn/tests/test_derive_input.rs new file mode 100644 index 0000000..e3685ae --- /dev/null +++ b/syn/tests/test_derive_input.rs @@ -0,0 +1,894 @@ +mod features; + +#[macro_use] +mod macros; + +use quote::quote; +use syn::{Data, DeriveInput}; + +#[test] +fn test_unit() { +    let input = quote! { +        struct Unit; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Inherited, +        ident: "Unit", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); +} + +#[test] +fn test_struct() { +    let input = quote! { +        #[derive(Debug, Clone)] +        pub struct Item { +            pub ident: Ident, +            pub attrs: Vec<Attribute> +        } +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        attrs: [ +            Attribute { +                style: Outer, +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "derive", +                            arguments: None, +                        }, +                    ], +                }, +                tokens: `( Debug , Clone )`, +            }, +        ], +        vis: Visibility::Public, +        ident: "Item", +        generics: Generics, +        data: Data::Struct { +            fields: Fields::Named { +                named: [ +                    Field { +                        vis: Visibility::Public, +                        ident: Some("ident"), +                        colon_token: Some, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "Ident", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                    }, +                    Field { +                        vis: Visibility::Public, +                        ident: Some("attrs"), +                        colon_token: Some, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "Vec", +                                        arguments: PathArguments::AngleBracketed { +                                            args: [ +                                                Type(Type::Path { +                                                    path: Path { +                                                        segments: [ +                                                            PathSegment { +                                                                ident: "Attribute", +                                                                arguments: None, +                                                            }, +                                                        ], +                                                    }, +                                                }), +                                            ], +                                        }, +                                    }, +                                ], +                            }, +                        }, +                    }, +                ], +            }, +        }, +    } +    "###); + +    snapshot!(input.attrs[0].parse_meta().unwrap(), @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "derive", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "Debug", +                        arguments: None, +                    }, +                ], +            })), +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "Clone", +                        arguments: None, +                    }, +                ], +            })), +        ], +    } +    "###); +} + +#[test] +fn test_union() { +    let input = quote! { +        union MaybeUninit<T> { +            uninit: (), +            value: T +        } +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Inherited, +        ident: "MaybeUninit", +        generics: Generics { +            lt_token: Some, +            params: [ +                Type(TypeParam { +                    ident: "T", +                }), +            ], +            gt_token: Some, +        }, +        data: Data::Union { +            fields: FieldsNamed { +                named: [ +                    Field { +                        vis: Inherited, +                        ident: Some("uninit"), +                        colon_token: Some, +                        ty: Type::Tuple, +                    }, +                    Field { +                        vis: Inherited, +                        ident: Some("value"), +                        colon_token: Some, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "T", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                    }, +                ], +            }, +        }, +    } +    "###); +} + +#[test] +#[cfg(feature = "full")] +fn test_enum() { +    let input = quote! { +        /// See the std::result module documentation for details. +        #[must_use] +        pub enum Result<T, E> { +            Ok(T), +            Err(E), +            Surprise = 0isize, + +            // Smuggling data into a proc_macro_derive, +            // in the style of https://github.com/dtolnay/proc-macro-hack +            ProcMacroHack = (0, "data").0 +        } +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        attrs: [ +            Attribute { +                style: Outer, +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "doc", +                            arguments: None, +                        }, +                    ], +                }, +                tokens: `= r" See the std::result module documentation for details."`, +            }, +            Attribute { +                style: Outer, +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "must_use", +                            arguments: None, +                        }, +                    ], +                }, +                tokens: ``, +            }, +        ], +        vis: Visibility::Public, +        ident: "Result", +        generics: Generics { +            lt_token: Some, +            params: [ +                Type(TypeParam { +                    ident: "T", +                }), +                Type(TypeParam { +                    ident: "E", +                }), +            ], +            gt_token: Some, +        }, +        data: Data::Enum { +            variants: [ +                Variant { +                    ident: "Ok", +                    fields: Fields::Unnamed { +                        unnamed: [ +                            Field { +                                vis: Inherited, +                                ty: Type::Path { +                                    path: Path { +                                        segments: [ +                                            PathSegment { +                                                ident: "T", +                                                arguments: None, +                                            }, +                                        ], +                                    }, +                                }, +                            }, +                        ], +                    }, +                }, +                Variant { +                    ident: "Err", +                    fields: Fields::Unnamed { +                        unnamed: [ +                            Field { +                                vis: Inherited, +                                ty: Type::Path { +                                    path: Path { +                                        segments: [ +                                            PathSegment { +                                                ident: "E", +                                                arguments: None, +                                            }, +                                        ], +                                    }, +                                }, +                            }, +                        ], +                    }, +                }, +                Variant { +                    ident: "Surprise", +                    fields: Unit, +                    discriminant: Some(Expr::Lit { +                        lit: 0isize, +                    }), +                }, +                Variant { +                    ident: "ProcMacroHack", +                    fields: Unit, +                    discriminant: Some(Expr::Field { +                        base: Expr::Tuple { +                            elems: [ +                                Expr::Lit { +                                    lit: 0, +                                }, +                                Expr::Lit { +                                    lit: "data", +                                }, +                            ], +                        }, +                        member: Unnamed(Index { +                            index: 0, +                        }), +                    }), +                }, +            ], +        }, +    } +    "###); + +    let meta_items: Vec<_> = input +        .attrs +        .into_iter() +        .map(|attr| attr.parse_meta().unwrap()) +        .collect(); + +    snapshot!(meta_items, @r###" +    [ +        Meta::NameValue { +            path: Path { +                segments: [ +                    PathSegment { +                        ident: "doc", +                        arguments: None, +                    }, +                ], +            }, +            lit: " See the std::result module documentation for details.", +        }, +        Path(Path { +            segments: [ +                PathSegment { +                    ident: "must_use", +                    arguments: None, +                }, +            ], +        }), +    ] +    "###); +} + +#[test] +fn test_attr_with_path() { +    let input = quote! { +        #[::attr_args::identity +            fn main() { assert_eq!(foo(), "Hello, world!"); }] +        struct Dummy; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        attrs: [ +            Attribute { +                style: Outer, +                path: Path { +                    leading_colon: Some, +                    segments: [ +                        PathSegment { +                            ident: "attr_args", +                            arguments: None, +                        }, +                        PathSegment { +                            ident: "identity", +                            arguments: None, +                        }, +                    ], +                }, +                tokens: `fn main ( ) { assert_eq ! ( foo ( ) , "Hello, world!" ) ; }`, +            }, +        ], +        vis: Inherited, +        ident: "Dummy", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); + +    assert!(input.attrs[0].parse_meta().is_err()); +} + +#[test] +fn test_attr_with_non_mod_style_path() { +    let input = quote! { +        #[inert <T>] +        struct S; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        attrs: [ +            Attribute { +                style: Outer, +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "inert", +                            arguments: None, +                        }, +                    ], +                }, +                tokens: `< T >`, +            }, +        ], +        vis: Inherited, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); + +    assert!(input.attrs[0].parse_meta().is_err()); +} + +#[test] +fn test_attr_with_mod_style_path_with_self() { +    let input = quote! { +        #[foo::self] +        struct S; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        attrs: [ +            Attribute { +                style: Outer, +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "foo", +                            arguments: None, +                        }, +                        PathSegment { +                            ident: "self", +                            arguments: None, +                        }, +                    ], +                }, +                tokens: ``, +            }, +        ], +        vis: Inherited, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); + +    snapshot!(input.attrs[0].parse_meta().unwrap(), @r###" +    Path(Path { +        segments: [ +            PathSegment { +                ident: "foo", +                arguments: None, +            }, +            PathSegment { +                ident: "self", +                arguments: None, +            }, +        ], +    }) +    "###); +} + +#[test] +fn test_pub_restricted() { +    // Taken from tests/rust/src/test/ui/resolve/auxiliary/privacy-struct-ctor.rs +    let input = quote! { +        pub(in m) struct Z(pub(in m::n) u8); +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Visibility::Restricted { +            in_token: Some, +            path: Path { +                segments: [ +                    PathSegment { +                        ident: "m", +                        arguments: None, +                    }, +                ], +            }, +        }, +        ident: "Z", +        generics: Generics, +        data: Data::Struct { +            fields: Fields::Unnamed { +                unnamed: [ +                    Field { +                        vis: Visibility::Restricted { +                            in_token: Some, +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "m", +                                        arguments: None, +                                    }, +                                    PathSegment { +                                        ident: "n", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "u8", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                    }, +                ], +            }, +            semi_token: Some, +        }, +    } +    "###); +} + +#[test] +fn test_vis_crate() { +    let input = quote! { +        crate struct S; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Visibility::Crate, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); +} + +#[test] +fn test_pub_restricted_crate() { +    let input = quote! { +        pub(crate) struct S; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Visibility::Restricted { +            path: Path { +                segments: [ +                    PathSegment { +                        ident: "crate", +                        arguments: None, +                    }, +                ], +            }, +        }, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); +} + +#[test] +fn test_pub_restricted_super() { +    let input = quote! { +        pub(super) struct S; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Visibility::Restricted { +            path: Path { +                segments: [ +                    PathSegment { +                        ident: "super", +                        arguments: None, +                    }, +                ], +            }, +        }, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); +} + +#[test] +fn test_pub_restricted_in_super() { +    let input = quote! { +        pub(in super) struct S; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Visibility::Restricted { +            in_token: Some, +            path: Path { +                segments: [ +                    PathSegment { +                        ident: "super", +                        arguments: None, +                    }, +                ], +            }, +        }, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); +} + +#[test] +fn test_fields_on_unit_struct() { +    let input = quote! { +        struct S; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Inherited, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); + +    let data = match input.data { +        Data::Struct(data) => data, +        _ => panic!("expected a struct"), +    }; + +    assert_eq!(0, data.fields.iter().count()); +} + +#[test] +fn test_fields_on_named_struct() { +    let input = quote! { +        struct S { +            foo: i32, +            pub bar: String, +        } +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Inherited, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Fields::Named { +                named: [ +                    Field { +                        vis: Inherited, +                        ident: Some("foo"), +                        colon_token: Some, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "i32", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                    }, +                    Field { +                        vis: Visibility::Public, +                        ident: Some("bar"), +                        colon_token: Some, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "String", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                    }, +                ], +            }, +        }, +    } +    "###); + +    let data = match input.data { +        Data::Struct(data) => data, +        _ => panic!("expected a struct"), +    }; + +    snapshot!(data.fields.into_iter().collect::<Vec<_>>(), @r###" +    [ +        Field { +            vis: Inherited, +            ident: Some("foo"), +            colon_token: Some, +            ty: Type::Path { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "i32", +                            arguments: None, +                        }, +                    ], +                }, +            }, +        }, +        Field { +            vis: Visibility::Public, +            ident: Some("bar"), +            colon_token: Some, +            ty: Type::Path { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "String", +                            arguments: None, +                        }, +                    ], +                }, +            }, +        }, +    ] +    "###); +} + +#[test] +fn test_fields_on_tuple_struct() { +    let input = quote! { +        struct S(i32, pub String); +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Inherited, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Fields::Unnamed { +                unnamed: [ +                    Field { +                        vis: Inherited, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "i32", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                    }, +                    Field { +                        vis: Visibility::Public, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "String", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                    }, +                ], +            }, +            semi_token: Some, +        }, +    } +    "###); + +    let data = match input.data { +        Data::Struct(data) => data, +        _ => panic!("expected a struct"), +    }; + +    snapshot!(data.fields.iter().collect::<Vec<_>>(), @r###" +    [ +        Field { +            vis: Inherited, +            ty: Type::Path { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "i32", +                            arguments: None, +                        }, +                    ], +                }, +            }, +        }, +        Field { +            vis: Visibility::Public, +            ty: Type::Path { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "String", +                            arguments: None, +                        }, +                    ], +                }, +            }, +        }, +    ] +    "###); +} + +#[test] +fn test_ambiguous_crate() { +    let input = quote! { +        // The field type is `(crate::X)` not `crate (::X)`. +        struct S(crate::X); +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Inherited, +        ident: "S", +        generics: Generics, +        data: Data::Struct { +            fields: Fields::Unnamed { +                unnamed: [ +                    Field { +                        vis: Inherited, +                        ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "crate", +                                        arguments: None, +                                    }, +                                    PathSegment { +                                        ident: "X", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                    }, +                ], +            }, +            semi_token: Some, +        }, +    } +    "###); +} diff --git a/syn/tests/test_expr.rs b/syn/tests/test_expr.rs new file mode 100644 index 0000000..0edf6ce --- /dev/null +++ b/syn/tests/test_expr.rs @@ -0,0 +1,37 @@ +#[macro_use] +mod macros; + +use std::str::FromStr; + +use proc_macro2::TokenStream; +use syn::{Expr, ExprRange}; + +#[test] +fn test_expr_parse() { +    let code = "..100u32"; +    let tt = TokenStream::from_str(code).unwrap(); +    let expr: Expr = syn::parse2(tt.clone()).unwrap(); +    let expr_range: ExprRange = syn::parse2(tt).unwrap(); +    assert_eq!(expr, Expr::Range(expr_range)); +} + +#[test] +fn test_await() { +    // Must not parse as Expr::Field. +    let expr = syn::parse_str::<Expr>("fut.await").unwrap(); + +    snapshot!(expr, @r###" +    Expr::Await { +        base: Expr::Path { +            path: Path { +                segments: [ +                    PathSegment { +                        ident: "fut", +                        arguments: None, +                    }, +                ], +            }, +        }, +    } +    "###); +} diff --git a/syn/tests/test_generics.rs b/syn/tests/test_generics.rs new file mode 100644 index 0000000..e863b77 --- /dev/null +++ b/syn/tests/test_generics.rs @@ -0,0 +1,285 @@ +mod features; + +#[macro_use] +mod macros; + +use quote::quote; +use syn::{DeriveInput, ItemFn, TypeParamBound, WhereClause, WherePredicate}; + +#[test] +fn test_split_for_impl() { +    let input = quote! { +        struct S<'a, 'b: 'a, #[may_dangle] T: 'a = ()> where T: Debug; +    }; + +    snapshot!(input as DeriveInput, @r###" +    DeriveInput { +        vis: Inherited, +        ident: "S", +        generics: Generics { +            lt_token: Some, +            params: [ +                Lifetime(LifetimeDef { +                    lifetime: Lifetime { +                        ident: "a", +                    }, +                }), +                Lifetime(LifetimeDef { +                    lifetime: Lifetime { +                        ident: "b", +                    }, +                    colon_token: Some, +                    bounds: [ +                        Lifetime { +                            ident: "a", +                        }, +                    ], +                }), +                Type(TypeParam { +                    attrs: [ +                        Attribute { +                            style: Outer, +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "may_dangle", +                                        arguments: None, +                                    }, +                                ], +                            }, +                            tokens: ``, +                        }, +                    ], +                    ident: "T", +                    colon_token: Some, +                    bounds: [ +                        Lifetime(Lifetime { +                            ident: "a", +                        }), +                    ], +                    eq_token: Some, +                    default: Some(Type::Tuple), +                }), +            ], +            gt_token: Some, +            where_clause: Some(WhereClause { +                predicates: [ +                    Type(PredicateType { +                        bounded_ty: Type::Path { +                            path: Path { +                                segments: [ +                                    PathSegment { +                                        ident: "T", +                                        arguments: None, +                                    }, +                                ], +                            }, +                        }, +                        bounds: [ +                            Trait(TraitBound { +                                modifier: None, +                                path: Path { +                                    segments: [ +                                        PathSegment { +                                            ident: "Debug", +                                            arguments: None, +                                        }, +                                    ], +                                }, +                            }), +                        ], +                    }), +                ], +            }), +        }, +        data: Data::Struct { +            fields: Unit, +            semi_token: Some, +        }, +    } +    "###); + +    let generics = input.generics; +    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + +    let generated = quote! { +        impl #impl_generics MyTrait for Test #ty_generics #where_clause {} +    }; +    let expected = quote! { +        impl<'a, 'b: 'a, #[may_dangle] T: 'a> MyTrait +        for Test<'a, 'b, T> +        where +            T: Debug +        {} +    }; +    assert_eq!(generated.to_string(), expected.to_string()); + +    let turbofish = ty_generics.as_turbofish(); +    let generated = quote! { +        Test #turbofish +    }; +    let expected = quote! { +        Test::<'a, 'b, T> +    }; +    assert_eq!(generated.to_string(), expected.to_string()); +} + +#[test] +fn test_ty_param_bound() { +    let tokens = quote!('a); +    snapshot!(tokens as TypeParamBound, @r###" +    Lifetime(Lifetime { +        ident: "a", +    }) +    "###); + +    let tokens = quote!('_); +    snapshot!(tokens as TypeParamBound, @r###" +    Lifetime(Lifetime { +        ident: "_", +    }) +    "###); + +    let tokens = quote!(Debug); +    snapshot!(tokens as TypeParamBound, @r###" +    Trait(TraitBound { +        modifier: None, +        path: Path { +            segments: [ +                PathSegment { +                    ident: "Debug", +                    arguments: None, +                }, +            ], +        }, +    }) +    "###); + +    let tokens = quote!(?Sized); +    snapshot!(tokens as TypeParamBound, @r###" +    Trait(TraitBound { +        modifier: Maybe, +        path: Path { +            segments: [ +                PathSegment { +                    ident: "Sized", +                    arguments: None, +                }, +            ], +        }, +    }) +    "###); +} + +#[test] +fn test_fn_precedence_in_where_clause() { +    // This should parse as two separate bounds, `FnOnce() -> i32` and `Send` - not +    // `FnOnce() -> (i32 + Send)`. +    let input = quote! { +        fn f<G>() +        where +            G: FnOnce() -> i32 + Send, +        { +        } +    }; + +    snapshot!(input as ItemFn, @r###" +    ItemFn { +        vis: Inherited, +        sig: Signature { +            ident: "f", +            generics: Generics { +                lt_token: Some, +                params: [ +                    Type(TypeParam { +                        ident: "G", +                    }), +                ], +                gt_token: Some, +                where_clause: Some(WhereClause { +                    predicates: [ +                        Type(PredicateType { +                            bounded_ty: Type::Path { +                                path: Path { +                                    segments: [ +                                        PathSegment { +                                            ident: "G", +                                            arguments: None, +                                        }, +                                    ], +                                }, +                            }, +                            bounds: [ +                                Trait(TraitBound { +                                    modifier: None, +                                    path: Path { +                                        segments: [ +                                            PathSegment { +                                                ident: "FnOnce", +                                                arguments: PathArguments::Parenthesized { +                                                    output: Type( +                                                        Type::Path { +                                                            path: Path { +                                                                segments: [ +                                                                    PathSegment { +                                                                        ident: "i32", +                                                                        arguments: None, +                                                                    }, +                                                                ], +                                                            }, +                                                        }, +                                                    ), +                                                }, +                                            }, +                                        ], +                                    }, +                                }), +                                Trait(TraitBound { +                                    modifier: None, +                                    path: Path { +                                        segments: [ +                                            PathSegment { +                                                ident: "Send", +                                                arguments: None, +                                            }, +                                        ], +                                    }, +                                }), +                            ], +                        }), +                    ], +                }), +            }, +            output: Default, +        }, +        block: Block, +    } +    "###); + +    let where_clause = input.sig.generics.where_clause.as_ref().unwrap(); +    assert_eq!(where_clause.predicates.len(), 1); + +    let predicate = match &where_clause.predicates[0] { +        WherePredicate::Type(pred) => pred, +        _ => panic!("wrong predicate kind"), +    }; + +    assert_eq!(predicate.bounds.len(), 2, "{:#?}", predicate.bounds); + +    let first_bound = &predicate.bounds[0]; +    assert_eq!(quote!(#first_bound).to_string(), "FnOnce ( ) -> i32"); + +    let second_bound = &predicate.bounds[1]; +    assert_eq!(quote!(#second_bound).to_string(), "Send"); +} + +#[test] +fn test_where_clause_at_end_of_input() { +    let input = quote! { +        where +    }; + +    snapshot!(input as WhereClause, @"WhereClause"); + +    assert_eq!(input.predicates.len(), 0); +} diff --git a/syn/tests/test_grouping.rs b/syn/tests/test_grouping.rs new file mode 100644 index 0000000..4e43ab8 --- /dev/null +++ b/syn/tests/test_grouping.rs @@ -0,0 +1,55 @@ +mod features; + +#[macro_use] +mod macros; + +use proc_macro2::{Delimiter, Group, Literal, Punct, Spacing, TokenStream, TokenTree}; +use syn::Expr; + +use std::iter::FromIterator; + +#[test] +fn test_grouping() { +    let tokens: TokenStream = TokenStream::from_iter(vec![ +        TokenTree::Literal(Literal::i32_suffixed(1)), +        TokenTree::Punct(Punct::new('+', Spacing::Alone)), +        TokenTree::Group(Group::new( +            Delimiter::None, +            TokenStream::from_iter(vec![ +                TokenTree::Literal(Literal::i32_suffixed(2)), +                TokenTree::Punct(Punct::new('+', Spacing::Alone)), +                TokenTree::Literal(Literal::i32_suffixed(3)), +            ]), +        )), +        TokenTree::Punct(Punct::new('*', Spacing::Alone)), +        TokenTree::Literal(Literal::i32_suffixed(4)), +    ]); + +    assert_eq!(tokens.to_string(), "1i32 +  2i32 + 3i32  * 4i32"); + +    snapshot!(tokens as Expr, @r###" +    Expr::Binary { +        left: Expr::Lit { +            lit: 1i32, +        }, +        op: Add, +        right: Expr::Binary { +            left: Expr::Group { +                expr: Expr::Binary { +                    left: Expr::Lit { +                        lit: 2i32, +                    }, +                    op: Add, +                    right: Expr::Lit { +                        lit: 3i32, +                    }, +                }, +            }, +            op: Mul, +            right: Expr::Lit { +                lit: 4i32, +            }, +        }, +    } +    "###); +} diff --git a/syn/tests/test_ident.rs b/syn/tests/test_ident.rs new file mode 100644 index 0000000..7578381 --- /dev/null +++ b/syn/tests/test_ident.rs @@ -0,0 +1,87 @@ +mod features; + +use proc_macro2::{Ident, Span, TokenStream}; +use std::str::FromStr; +use syn::Result; + +fn parse(s: &str) -> Result<Ident> { +    syn::parse2(TokenStream::from_str(s).unwrap()) +} + +fn new(s: &str) -> Ident { +    Ident::new(s, Span::call_site()) +} + +#[test] +fn ident_parse() { +    parse("String").unwrap(); +} + +#[test] +fn ident_parse_keyword() { +    parse("abstract").unwrap_err(); +} + +#[test] +fn ident_parse_empty() { +    parse("").unwrap_err(); +} + +#[test] +fn ident_parse_lifetime() { +    parse("'static").unwrap_err(); +} + +#[test] +fn ident_parse_underscore() { +    parse("_").unwrap_err(); +} + +#[test] +fn ident_parse_number() { +    parse("255").unwrap_err(); +} + +#[test] +fn ident_parse_invalid() { +    parse("a#").unwrap_err(); +} + +#[test] +fn ident_new() { +    new("String"); +} + +#[test] +fn ident_new_keyword() { +    new("abstract"); +} + +#[test] +#[should_panic(expected = "use Option<Ident>")] +fn ident_new_empty() { +    new(""); +} + +#[test] +#[should_panic(expected = "not a valid Ident")] +fn ident_new_lifetime() { +    new("'static"); +} + +#[test] +fn ident_new_underscore() { +    new("_"); +} + +#[test] +#[should_panic(expected = "use Literal instead")] +fn ident_new_number() { +    new("255"); +} + +#[test] +#[should_panic(expected = "\"a#\" is not a valid Ident")] +fn ident_new_invalid() { +    new("a#"); +} diff --git a/syn/tests/test_iterators.rs b/syn/tests/test_iterators.rs new file mode 100644 index 0000000..f107297 --- /dev/null +++ b/syn/tests/test_iterators.rs @@ -0,0 +1,51 @@ +use syn::punctuated::{Pair, Punctuated}; +use syn::Token; + +mod features; + +#[macro_use] +mod macros; + +macro_rules! check_exact_size_iterator { +    ($iter:expr) => {{ +        let iter = $iter; +        let size_hint = iter.size_hint(); +        let len = iter.len(); +        let count = iter.count(); +        assert_eq!(len, count); +        assert_eq!(size_hint, (count, Some(count))); +    }}; +} + +#[test] +fn pairs() { +    let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); + +    check_exact_size_iterator!(p.pairs()); +    check_exact_size_iterator!(p.pairs_mut()); +    check_exact_size_iterator!(p.into_pairs()); + +    let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); + +    assert_eq!(p.pairs().next_back().map(Pair::into_value), Some(&4)); +    assert_eq!( +        p.pairs_mut().next_back().map(Pair::into_value), +        Some(&mut 4) +    ); +    assert_eq!(p.into_pairs().next_back().map(Pair::into_value), Some(4)); +} + +#[test] +fn iter() { +    let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); + +    check_exact_size_iterator!(p.iter()); +    check_exact_size_iterator!(p.iter_mut()); +    check_exact_size_iterator!(p.into_iter()); + +    let mut p: Punctuated<_, Token![,]> = punctuated!(2, 3, 4); + +    assert_eq!(p.iter().next_back(), Some(&4)); +    assert_eq!(p.iter_mut().next_back(), Some(&mut 4)); +    assert_eq!(p.into_iter().next_back(), Some(4)); +} diff --git a/syn/tests/test_lit.rs b/syn/tests/test_lit.rs new file mode 100644 index 0000000..0b300c4 --- /dev/null +++ b/syn/tests/test_lit.rs @@ -0,0 +1,184 @@ +mod features; + +use proc_macro2::{TokenStream, TokenTree}; +use quote::ToTokens; +use std::str::FromStr; +use syn::Lit; + +fn lit(s: &str) -> Lit { +    match TokenStream::from_str(s) +        .unwrap() +        .into_iter() +        .next() +        .unwrap() +    { +        TokenTree::Literal(lit) => Lit::new(lit), +        _ => panic!(), +    } +} + +#[test] +fn strings() { +    fn test_string(s: &str, value: &str) { +        match lit(s) { +            Lit::Str(lit) => { +                assert_eq!(lit.value(), value); +                let again = lit.into_token_stream().to_string(); +                if again != s { +                    test_string(&again, value); +                } +            } +            wrong => panic!("{:?}", wrong), +        } +    } + +    test_string("\"a\"", "a"); +    test_string("\"\\n\"", "\n"); +    test_string("\"\\r\"", "\r"); +    test_string("\"\\t\"", "\t"); +    test_string("\"🐕\"", "🐕"); // NOTE: This is an emoji +    test_string("\"\\\"\"", "\""); +    test_string("\"'\"", "'"); +    test_string("\"\"", ""); +    test_string("\"\\u{1F415}\"", "\u{1F415}"); +    test_string( +        "\"contains\nnewlines\\\nescaped newlines\"", +        "contains\nnewlinesescaped newlines", +    ); +    test_string("r\"raw\nstring\\\nhere\"", "raw\nstring\\\nhere"); +} + +#[test] +fn byte_strings() { +    fn test_byte_string(s: &str, value: &[u8]) { +        match lit(s) { +            Lit::ByteStr(lit) => { +                assert_eq!(lit.value(), value); +                let again = lit.into_token_stream().to_string(); +                if again != s { +                    test_byte_string(&again, value); +                } +            } +            wrong => panic!("{:?}", wrong), +        } +    } + +    test_byte_string("b\"a\"", b"a"); +    test_byte_string("b\"\\n\"", b"\n"); +    test_byte_string("b\"\\r\"", b"\r"); +    test_byte_string("b\"\\t\"", b"\t"); +    test_byte_string("b\"\\\"\"", b"\""); +    test_byte_string("b\"'\"", b"'"); +    test_byte_string("b\"\"", b""); +    test_byte_string( +        "b\"contains\nnewlines\\\nescaped newlines\"", +        b"contains\nnewlinesescaped newlines", +    ); +    test_byte_string("br\"raw\nstring\\\nhere\"", b"raw\nstring\\\nhere"); +} + +#[test] +fn bytes() { +    fn test_byte(s: &str, value: u8) { +        match lit(s) { +            Lit::Byte(lit) => { +                assert_eq!(lit.value(), value); +                let again = lit.into_token_stream().to_string(); +                assert_eq!(again, s); +            } +            wrong => panic!("{:?}", wrong), +        } +    } + +    test_byte("b'a'", b'a'); +    test_byte("b'\\n'", b'\n'); +    test_byte("b'\\r'", b'\r'); +    test_byte("b'\\t'", b'\t'); +    test_byte("b'\\''", b'\''); +    test_byte("b'\"'", b'"'); +} + +#[test] +fn chars() { +    fn test_char(s: &str, value: char) { +        match lit(s) { +            Lit::Char(lit) => { +                assert_eq!(lit.value(), value); +                let again = lit.into_token_stream().to_string(); +                if again != s { +                    test_char(&again, value); +                } +            } +            wrong => panic!("{:?}", wrong), +        } +    } + +    test_char("'a'", 'a'); +    test_char("'\\n'", '\n'); +    test_char("'\\r'", '\r'); +    test_char("'\\t'", '\t'); +    test_char("'🐕'", '🐕'); // NOTE: This is an emoji +    test_char("'\\''", '\''); +    test_char("'\"'", '"'); +    test_char("'\\u{1F415}'", '\u{1F415}'); +} + +#[test] +fn ints() { +    fn test_int(s: &str, value: u64, suffix: &str) { +        match lit(s) { +            Lit::Int(lit) => { +                assert_eq!(lit.base10_digits().parse::<u64>().unwrap(), value); +                assert_eq!(lit.suffix(), suffix); +                let again = lit.into_token_stream().to_string(); +                if again != s { +                    test_int(&again, value, suffix); +                } +            } +            wrong => panic!("{:?}", wrong), +        } +    } + +    test_int("5", 5, ""); +    test_int("5u32", 5, "u32"); +    test_int("5_0", 50, ""); +    test_int("5_____0_____", 50, ""); +    test_int("0x7f", 127, ""); +    test_int("0x7F", 127, ""); +    test_int("0b1001", 9, ""); +    test_int("0o73", 59, ""); +    test_int("0x7Fu8", 127, "u8"); +    test_int("0b1001i8", 9, "i8"); +    test_int("0o73u32", 59, "u32"); +    test_int("0x__7___f_", 127, ""); +    test_int("0x__7___F_", 127, ""); +    test_int("0b_1_0__01", 9, ""); +    test_int("0o_7__3", 59, ""); +    test_int("0x_7F__u8", 127, "u8"); +    test_int("0b__10__0_1i8", 9, "i8"); +    test_int("0o__7__________________3u32", 59, "u32"); +} + +#[test] +fn floats() { +    #[cfg_attr(feature = "cargo-clippy", allow(float_cmp))] +    fn test_float(s: &str, value: f64, suffix: &str) { +        match lit(s) { +            Lit::Float(lit) => { +                assert_eq!(lit.base10_digits().parse::<f64>().unwrap(), value); +                assert_eq!(lit.suffix(), suffix); +                let again = lit.into_token_stream().to_string(); +                if again != s { +                    test_float(&again, value, suffix); +                } +            } +            wrong => panic!("{:?}", wrong), +        } +    } + +    test_float("5.5", 5.5, ""); +    test_float("5.5E12", 5.5e12, ""); +    test_float("5.5e12", 5.5e12, ""); +    test_float("1.0__3e-12", 1.03e-12, ""); +    test_float("1.03e+12", 1.03e12, ""); +} diff --git a/syn/tests/test_meta.rs b/syn/tests/test_meta.rs new file mode 100644 index 0000000..618296e --- /dev/null +++ b/syn/tests/test_meta.rs @@ -0,0 +1,341 @@ +mod features; + +#[macro_use] +mod macros; + +use syn::{Meta, MetaList, MetaNameValue, NestedMeta}; + +#[test] +fn test_parse_meta_item_word() { +    let input = "hello"; + +    snapshot!(input as Meta, @r###" +    Path(Path { +        segments: [ +            PathSegment { +                ident: "hello", +                arguments: None, +            }, +        ], +    }) +    "###); +} + +#[test] +fn test_parse_meta_name_value() { +    let input = "foo = 5"; +    let (inner, meta) = (input, input); + +    snapshot!(inner as MetaNameValue, @r###" +    MetaNameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        lit: 5, +    } +    "###); + +    snapshot!(meta as Meta, @r###" +    Meta::NameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        lit: 5, +    } +    "###); + +    assert_eq!(meta, inner.into()); +} + +#[test] +fn test_parse_meta_name_value_with_keyword() { +    let input = "static = 5"; +    let (inner, meta) = (input, input); + +    snapshot!(inner as MetaNameValue, @r###" +    MetaNameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "static", +                    arguments: None, +                }, +            ], +        }, +        lit: 5, +    } +    "###); + +    snapshot!(meta as Meta, @r###" +    Meta::NameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "static", +                    arguments: None, +                }, +            ], +        }, +        lit: 5, +    } +    "###); + +    assert_eq!(meta, inner.into()); +} + +#[test] +fn test_parse_meta_name_value_with_bool() { +    let input = "true = 5"; +    let (inner, meta) = (input, input); + +    snapshot!(inner as MetaNameValue, @r###" +    MetaNameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "true", +                    arguments: None, +                }, +            ], +        }, +        lit: 5, +    } +    "###); + +    snapshot!(meta as Meta, @r###" +    Meta::NameValue { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "true", +                    arguments: None, +                }, +            ], +        }, +        lit: 5, +    } +    "###); + +    assert_eq!(meta, inner.into()); +} + +#[test] +fn test_parse_meta_item_list_lit() { +    let input = "foo(5)"; +    let (inner, meta) = (input, input); + +    snapshot!(inner as MetaList, @r###" +    MetaList { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Lit(5), +        ], +    } +    "###); + +    snapshot!(meta as Meta, @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Lit(5), +        ], +    } +    "###); + +    assert_eq!(meta, inner.into()); +} + +#[test] +fn test_parse_meta_item_multiple() { +    let input = "foo(word, name = 5, list(name2 = 6), word2)"; +    let (inner, meta) = (input, input); + +    snapshot!(inner as MetaList, @r###" +    MetaList { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "word", +                        arguments: None, +                    }, +                ], +            })), +            Meta(Meta::NameValue { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "name", +                            arguments: None, +                        }, +                    ], +                }, +                lit: 5, +            }), +            Meta(Meta::List { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "list", +                            arguments: None, +                        }, +                    ], +                }, +                nested: [ +                    Meta(Meta::NameValue { +                        path: Path { +                            segments: [ +                                PathSegment { +                                    ident: "name2", +                                    arguments: None, +                                }, +                            ], +                        }, +                        lit: 6, +                    }), +                ], +            }), +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "word2", +                        arguments: None, +                    }, +                ], +            })), +        ], +    } +    "###); + +    snapshot!(meta as Meta, @r###" +    Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "foo", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "word", +                        arguments: None, +                    }, +                ], +            })), +            Meta(Meta::NameValue { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "name", +                            arguments: None, +                        }, +                    ], +                }, +                lit: 5, +            }), +            Meta(Meta::List { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "list", +                            arguments: None, +                        }, +                    ], +                }, +                nested: [ +                    Meta(Meta::NameValue { +                        path: Path { +                            segments: [ +                                PathSegment { +                                    ident: "name2", +                                    arguments: None, +                                }, +                            ], +                        }, +                        lit: 6, +                    }), +                ], +            }), +            Meta(Path(Path { +                segments: [ +                    PathSegment { +                        ident: "word2", +                        arguments: None, +                    }, +                ], +            })), +        ], +    } +    "###); + +    assert_eq!(meta, inner.into()); +} + +#[test] +fn test_parse_nested_meta() { +    let input = "5"; +    snapshot!(input as NestedMeta, @"Lit(5)"); + +    let input = "list(name2 = 6)"; +    snapshot!(input as NestedMeta, @r###" +    Meta(Meta::List { +        path: Path { +            segments: [ +                PathSegment { +                    ident: "list", +                    arguments: None, +                }, +            ], +        }, +        nested: [ +            Meta(Meta::NameValue { +                path: Path { +                    segments: [ +                        PathSegment { +                            ident: "name2", +                            arguments: None, +                        }, +                    ], +                }, +                lit: 6, +            }), +        ], +    }) +    "###); +} diff --git a/syn/tests/test_parse_buffer.rs b/syn/tests/test_parse_buffer.rs new file mode 100644 index 0000000..d3f10c0 --- /dev/null +++ b/syn/tests/test_parse_buffer.rs @@ -0,0 +1,53 @@ +use syn::parenthesized; +use syn::parse::{discouraged::Speculative, Parse, ParseStream, Parser, Result}; + +#[test] +#[should_panic(expected = "Fork was not derived from the advancing parse stream")] +fn smuggled_speculative_cursor_between_sources() { +    struct BreakRules; +    impl Parse for BreakRules { +        fn parse(input1: ParseStream) -> Result<Self> { +            let nested = |input2: ParseStream| { +                input1.advance_to(&input2); +                Ok(Self) +            }; +            nested.parse_str("") +        } +    } + +    syn::parse_str::<BreakRules>("").unwrap(); +} + +#[test] +#[should_panic(expected = "Fork was not derived from the advancing parse stream")] +fn smuggled_speculative_cursor_between_brackets() { +    struct BreakRules; +    impl Parse for BreakRules { +        fn parse(input: ParseStream) -> Result<Self> { +            let a; +            let b; +            parenthesized!(a in input); +            parenthesized!(b in input); +            a.advance_to(&b); +            Ok(Self) +        } +    } + +    syn::parse_str::<BreakRules>("()()").unwrap(); +} + +#[test] +#[should_panic(expected = "Fork was not derived from the advancing parse stream")] +fn smuggled_speculative_cursor_into_brackets() { +    struct BreakRules; +    impl Parse for BreakRules { +        fn parse(input: ParseStream) -> Result<Self> { +            let a; +            parenthesized!(a in input); +            input.advance_to(&a); +            Ok(Self) +        } +    } + +    syn::parse_str::<BreakRules>("()").unwrap(); +} diff --git a/syn/tests/test_pat.rs b/syn/tests/test_pat.rs new file mode 100644 index 0000000..cce4b80 --- /dev/null +++ b/syn/tests/test_pat.rs @@ -0,0 +1,20 @@ +mod features; + +use quote::quote; +use syn::Pat; + +#[test] +fn test_pat_ident() { +    match syn::parse2(quote!(self)).unwrap() { +        Pat::Ident(_) => (), +        value => panic!("expected PatIdent, got {:?}", value), +    } +} + +#[test] +fn test_pat_path() { +    match syn::parse2(quote!(self::CONST)).unwrap() { +        Pat::Path(_) => (), +        value => panic!("expected PatPath, got {:?}", value), +    } +} diff --git a/syn/tests/test_precedence.rs b/syn/tests/test_precedence.rs new file mode 100644 index 0000000..3529c06 --- /dev/null +++ b/syn/tests/test_precedence.rs @@ -0,0 +1,394 @@ +#![cfg(not(syn_disable_nightly_tests))] +#![recursion_limit = "1024"] +#![feature(rustc_private)] + +//! The tests in this module do the following: +//! +//! 1. Parse a given expression in both `syn` and `libsyntax`. +//! 2. Fold over the expression adding brackets around each subexpression (with +//!    some complications - see the `syn_brackets` and `libsyntax_brackets` +//!    methods). +//! 3. Serialize the `syn` expression back into a string, and re-parse it with +//!    `libsyntax`. +//! 4. Respan all of the expressions, replacing the spans with the default +//!    spans. +//! 5. Compare the expressions with one another, if they are not equal fail. + +extern crate rustc_data_structures; +extern crate rustc_span; +extern crate syntax; + +mod features; + +use quote::quote; +use rayon::iter::{IntoParallelIterator, ParallelIterator}; +use regex::Regex; +use rustc_span::edition::Edition; +use syntax::ast; +use syntax::ptr::P; +use walkdir::{DirEntry, WalkDir}; + +use std::fs::File; +use std::io::Read; +use std::process; +use std::sync::atomic::{AtomicUsize, Ordering}; + +use common::eq::SpanlessEq; +use common::parse; + +#[macro_use] +mod macros; + +#[allow(dead_code)] +mod common; + +mod repo; + +/// Test some pre-set expressions chosen by us. +#[test] +fn test_simple_precedence() { +    const EXPRS: &[&str] = &[ +        "1 + 2 * 3 + 4", +        "1 + 2 * ( 3 + 4 )", +        "{ for i in r { } *some_ptr += 1; }", +        "{ loop { break 5; } }", +        "{ if true { () }.mthd() }", +        "{ for i in unsafe { 20 } { } }", +    ]; + +    let mut failed = 0; + +    for input in EXPRS { +        let expr = if let Some(expr) = parse::syn_expr(input) { +            expr +        } else { +            failed += 1; +            continue; +        }; + +        let pf = match test_expressions(vec![expr]) { +            (1, 0) => "passed", +            (0, 1) => { +                failed += 1; +                "failed" +            } +            _ => unreachable!(), +        }; +        errorf!("=== {}: {}\n", input, pf); +    } + +    if failed > 0 { +        panic!("Failed {} tests", failed); +    } +} + +/// Test expressions from rustc, like in `test_round_trip`. +#[test] +fn test_rustc_precedence() { +    repo::clone_rust(); +    let abort_after = common::abort_after(); +    if abort_after == 0 { +        panic!("Skipping all precedence tests"); +    } + +    let passed = AtomicUsize::new(0); +    let failed = AtomicUsize::new(0); + +    // 2018 edition is hard +    let edition_regex = Regex::new(r"\b(async|try)[!(]").unwrap(); + +    WalkDir::new("tests/rust") +        .sort_by(|a, b| a.file_name().cmp(b.file_name())) +        .into_iter() +        .filter_entry(repo::base_dir_filter) +        .collect::<Result<Vec<DirEntry>, walkdir::Error>>() +        .unwrap() +        .into_par_iter() +        .for_each(|entry| { +            let path = entry.path(); +            if path.is_dir() { +                return; +            } + +            // Our version of `libsyntax` can't parse this tests +            if path +                .to_str() +                .unwrap() +                .ends_with("optional_comma_in_match_arm.rs") +            { +                return; +            } + +            let mut file = File::open(path).unwrap(); +            let mut content = String::new(); +            file.read_to_string(&mut content).unwrap(); +            let content = edition_regex.replace_all(&content, "_$0"); + +            let (l_passed, l_failed) = match syn::parse_file(&content) { +                Ok(file) => { +                    let exprs = collect_exprs(file); +                    test_expressions(exprs) +                } +                Err(msg) => { +                    errorf!("syn failed to parse\n{:?}\n", msg); +                    (0, 1) +                } +            }; + +            errorf!( +                "=== {}: {} passed | {} failed\n", +                path.display(), +                l_passed, +                l_failed +            ); + +            passed.fetch_add(l_passed, Ordering::SeqCst); +            let prev_failed = failed.fetch_add(l_failed, Ordering::SeqCst); + +            if prev_failed + l_failed >= abort_after { +                process::exit(1); +            } +        }); + +    let passed = passed.load(Ordering::SeqCst); +    let failed = failed.load(Ordering::SeqCst); + +    errorf!("\n===== Precedence Test Results =====\n"); +    errorf!("{} passed | {} failed\n", passed, failed); + +    if failed > 0 { +        panic!("{} failures", failed); +    } +} + +fn test_expressions(exprs: Vec<syn::Expr>) -> (usize, usize) { +    let mut passed = 0; +    let mut failed = 0; + +    syntax::with_globals(Edition::Edition2018, || { +        for expr in exprs { +            let raw = quote!(#expr).to_string(); + +            let libsyntax_ast = if let Some(e) = libsyntax_parse_and_rewrite(&raw) { +                e +            } else { +                failed += 1; +                errorf!("\nFAIL - libsyntax failed to parse raw\n"); +                continue; +            }; + +            let syn_expr = syn_brackets(expr); +            let syn_ast = if let Some(e) = parse::libsyntax_expr("e!(#syn_expr).to_string()) { +                e +            } else { +                failed += 1; +                errorf!("\nFAIL - libsyntax failed to parse bracketed\n"); +                continue; +            }; + +            if SpanlessEq::eq(&syn_ast, &libsyntax_ast) { +                passed += 1; +            } else { +                failed += 1; +                errorf!("\nFAIL\n{:?}\n!=\n{:?}\n", syn_ast, libsyntax_ast); +            } +        } +    }); + +    (passed, failed) +} + +fn libsyntax_parse_and_rewrite(input: &str) -> Option<P<ast::Expr>> { +    parse::libsyntax_expr(input).and_then(libsyntax_brackets) +} + +/// Wrap every expression which is not already wrapped in parens with parens, to +/// reveal the precidence of the parsed expressions, and produce a stringified +/// form of the resulting expression. +/// +/// This method operates on libsyntax objects. +fn libsyntax_brackets(mut libsyntax_expr: P<ast::Expr>) -> Option<P<ast::Expr>> { +    use rustc_data_structures::thin_vec::ThinVec; +    use rustc_span::DUMMY_SP; +    use std::mem; +    use syntax::ast::{Block, Expr, ExprKind, Field, Mac, Pat, Stmt, StmtKind, Ty}; +    use syntax::mut_visit::MutVisitor; +    use syntax::util::map_in_place::MapInPlace; + +    struct BracketsVisitor { +        failed: bool, +    }; + +    fn flat_map_field<T: MutVisitor>(mut f: Field, vis: &mut T) -> Vec<Field> { +        if f.is_shorthand { +            noop_visit_expr(&mut f.expr, vis); +        } else { +            vis.visit_expr(&mut f.expr); +        } +        vec![f] +    } + +    fn flat_map_stmt<T: MutVisitor>(stmt: Stmt, vis: &mut T) -> Vec<Stmt> { +        let kind = match stmt.kind { +            // Don't wrap toplevel expressions in statements. +            StmtKind::Expr(mut e) => { +                noop_visit_expr(&mut e, vis); +                StmtKind::Expr(e) +            } +            StmtKind::Semi(mut e) => { +                noop_visit_expr(&mut e, vis); +                StmtKind::Semi(e) +            } +            s => s, +        }; + +        vec![Stmt { kind, ..stmt }] +    } + +    fn noop_visit_expr<T: MutVisitor>(e: &mut Expr, vis: &mut T) { +        use syntax::mut_visit::{noop_visit_expr, visit_opt, visit_thin_attrs}; +        match &mut e.kind { +            ExprKind::Struct(path, fields, expr) => { +                vis.visit_path(path); +                fields.flat_map_in_place(|field| flat_map_field(field, vis)); +                visit_opt(expr, |expr| vis.visit_expr(expr)); +                vis.visit_id(&mut e.id); +                vis.visit_span(&mut e.span); +                visit_thin_attrs(&mut e.attrs, vis); +            } +            _ => noop_visit_expr(e, vis), +        } +    } + +    impl MutVisitor for BracketsVisitor { +        fn visit_expr(&mut self, e: &mut P<Expr>) { +            noop_visit_expr(e, self); +            match e.kind { +                ExprKind::If(..) | ExprKind::Block(..) | ExprKind::Let(..) => {} +                _ => { +                    let inner = mem::replace( +                        e, +                        P(Expr { +                            id: ast::DUMMY_NODE_ID, +                            kind: ExprKind::Err, +                            span: DUMMY_SP, +                            attrs: ThinVec::new(), +                        }), +                    ); +                    e.kind = ExprKind::Paren(inner); +                } +            } +        } + +        fn visit_block(&mut self, block: &mut P<Block>) { +            self.visit_id(&mut block.id); +            block +                .stmts +                .flat_map_in_place(|stmt| flat_map_stmt(stmt, self)); +            self.visit_span(&mut block.span); +        } + +        // We don't want to look at expressions that might appear in patterns or +        // types yet. We'll look into comparing those in the future. For now +        // focus on expressions appearing in other places. +        fn visit_pat(&mut self, pat: &mut P<Pat>) { +            let _ = pat; +        } + +        fn visit_ty(&mut self, ty: &mut P<Ty>) { +            let _ = ty; +        } + +        fn visit_mac(&mut self, mac: &mut Mac) { +            // By default when folding over macros, libsyntax panics. This is +            // because it's usually not what you want, you want to run after +            // macro expansion. We do want to do that (syn doesn't do macro +            // expansion), so we implement visit_mac to just return the macro +            // unchanged. +            let _ = mac; +        } +    } + +    let mut folder = BracketsVisitor { failed: false }; +    folder.visit_expr(&mut libsyntax_expr); +    if folder.failed { +        None +    } else { +        Some(libsyntax_expr) +    } +} + +/// Wrap every expression which is not already wrapped in parens with parens, to +/// reveal the precedence of the parsed expressions, and produce a stringified +/// form of the resulting expression. +fn syn_brackets(syn_expr: syn::Expr) -> syn::Expr { +    use syn::fold::*; +    use syn::*; + +    struct ParenthesizeEveryExpr; +    impl Fold for ParenthesizeEveryExpr { +        fn fold_expr(&mut self, expr: Expr) -> Expr { +            match expr { +                Expr::Group(_) => unreachable!(), +                Expr::If(..) | Expr::Unsafe(..) | Expr::Block(..) | Expr::Let(..) => { +                    fold_expr(self, expr) +                } +                _ => Expr::Paren(ExprParen { +                    attrs: Vec::new(), +                    expr: Box::new(fold_expr(self, expr)), +                    paren_token: token::Paren::default(), +                }), +            } +        } + +        fn fold_stmt(&mut self, stmt: Stmt) -> Stmt { +            match stmt { +                // Don't wrap toplevel expressions in statements. +                Stmt::Expr(e) => Stmt::Expr(fold_expr(self, e)), +                Stmt::Semi(e, semi) => Stmt::Semi(fold_expr(self, e), semi), +                s => s, +            } +        } + +        // We don't want to look at expressions that might appear in patterns or +        // types yet. We'll look into comparing those in the future. For now +        // focus on expressions appearing in other places. +        fn fold_pat(&mut self, pat: Pat) -> Pat { +            pat +        } + +        fn fold_type(&mut self, ty: Type) -> Type { +            ty +        } +    } + +    let mut folder = ParenthesizeEveryExpr; +    folder.fold_expr(syn_expr) +} + +/// Walk through a crate collecting all expressions we can find in it. +fn collect_exprs(file: syn::File) -> Vec<syn::Expr> { +    use syn::fold::*; +    use syn::punctuated::Punctuated; +    use syn::*; + +    struct CollectExprs(Vec<Expr>); +    impl Fold for CollectExprs { +        fn fold_expr(&mut self, expr: Expr) -> Expr { +            match expr { +                Expr::Verbatim(tokens) if tokens.is_empty() => {} +                _ => self.0.push(expr), +            } + +            Expr::Tuple(ExprTuple { +                attrs: vec![], +                elems: Punctuated::new(), +                paren_token: token::Paren::default(), +            }) +        } +    } + +    let mut folder = CollectExprs(vec![]); +    folder.fold_file(file); +    folder.0 +} diff --git a/syn/tests/test_receiver.rs b/syn/tests/test_receiver.rs new file mode 100644 index 0000000..168db8f --- /dev/null +++ b/syn/tests/test_receiver.rs @@ -0,0 +1,109 @@ +mod features; + +use syn::{FnArg, Receiver, TraitItemMethod}; + +#[test] +fn test_by_value() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn by_value(self: Self);); +    match sig.receiver() { +        Some(FnArg::Typed(_)) => (), +        value => panic!("expected FnArg::Typed, got {:?}", value), +    } +} + +#[test] +fn test_by_mut_value() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn by_mut(mut self: Self);); +    match sig.receiver() { +        Some(FnArg::Typed(_)) => (), +        value => panic!("expected FnArg::Typed, got {:?}", value), +    } +} + +#[test] +fn test_by_ref() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn by_ref(self: &Self);); +    match sig.receiver() { +        Some(FnArg::Typed(_)) => (), +        value => panic!("expected FnArg::Typed, got {:?}", value), +    } +} + +#[test] +fn test_by_box() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn by_box(self: Box<Self>);); +    match sig.receiver() { +        Some(FnArg::Typed(_)) => (), +        value => panic!("expected FnArg::Typed, got {:?}", value), +    } +} + +#[test] +fn test_by_pin() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn by_pin(self: Pin<Self>);); +    match sig.receiver() { +        Some(FnArg::Typed(_)) => (), +        value => panic!("expected FnArg::Typed, got {:?}", value), +    } +} + +#[test] +fn test_explicit_type() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn explicit_type(self: Pin<MyType>);); +    match sig.receiver() { +        Some(FnArg::Typed(_)) => (), +        value => panic!("expected FnArg::Typed, got {:?}", value), +    } +} + +#[test] +fn test_value_shorthand() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn value_shorthand(self);); +    match sig.receiver() { +        Some(FnArg::Receiver(Receiver { +            reference: None, +            mutability: None, +            .. +        })) => (), +        value => panic!("expected FnArg::Receiver without ref/mut, got {:?}", value), +    } +} + +#[test] +fn test_mut_value_shorthand() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn mut_value_shorthand(mut self);); +    match sig.receiver() { +        Some(FnArg::Receiver(Receiver { +            reference: None, +            mutability: Some(_), +            .. +        })) => (), +        value => panic!("expected FnArg::Receiver with mut, got {:?}", value), +    } +} + +#[test] +fn test_ref_shorthand() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn ref_shorthand(&self);); +    match sig.receiver() { +        Some(FnArg::Receiver(Receiver { +            reference: Some(_), +            mutability: None, +            .. +        })) => (), +        value => panic!("expected FnArg::Receiver with ref, got {:?}", value), +    } +} + +#[test] +fn test_ref_mut_shorthand() { +    let TraitItemMethod { sig, .. } = syn::parse_quote!(fn ref_mut_shorthand(&mut self);); +    match sig.receiver() { +        Some(FnArg::Receiver(Receiver { +            reference: Some(_), +            mutability: Some(_), +            .. +        })) => (), +        value => panic!("expected FnArg::Receiver with ref+mut, got {:?}", value), +    } +} diff --git a/syn/tests/test_round_trip.rs b/syn/tests/test_round_trip.rs new file mode 100644 index 0000000..435bd6a --- /dev/null +++ b/syn/tests/test_round_trip.rs @@ -0,0 +1,151 @@ +#![cfg(not(syn_disable_nightly_tests))] +#![recursion_limit = "1024"] +#![feature(rustc_private)] + +extern crate rustc_expand; +extern crate rustc_parse as parse; +extern crate rustc_span; +extern crate syntax; + +mod features; + +use quote::quote; +use rayon::iter::{IntoParallelIterator, ParallelIterator}; +use rustc_span::edition::Edition; +use rustc_span::FileName; +use syntax::ast; +use syntax::errors::PResult; +use syntax::sess::ParseSess; +use syntax::source_map::FilePathMapping; +use walkdir::{DirEntry, WalkDir}; + +use std::fs::File; +use std::io::Read; +use std::panic; +use std::process; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::time::Instant; + +#[macro_use] +mod macros; + +#[allow(dead_code)] +mod common; + +mod repo; + +use common::eq::SpanlessEq; + +#[test] +fn test_round_trip() { +    repo::clone_rust(); +    let abort_after = common::abort_after(); +    if abort_after == 0 { +        panic!("Skipping all round_trip tests"); +    } + +    let failed = AtomicUsize::new(0); + +    WalkDir::new("tests/rust") +        .sort_by(|a, b| a.file_name().cmp(b.file_name())) +        .into_iter() +        .filter_entry(repo::base_dir_filter) +        .collect::<Result<Vec<DirEntry>, walkdir::Error>>() +        .unwrap() +        .into_par_iter() +        .for_each(|entry| { +            let path = entry.path(); +            if path.is_dir() { +                return; +            } + +            let mut file = File::open(path).unwrap(); +            let mut content = String::new(); +            file.read_to_string(&mut content).unwrap(); + +            let start = Instant::now(); +            let (krate, elapsed) = match syn::parse_file(&content) { +                Ok(krate) => (krate, start.elapsed()), +                Err(msg) => { +                    errorf!("=== {}: syn failed to parse\n{:?}\n", path.display(), msg); +                    let prev_failed = failed.fetch_add(1, Ordering::SeqCst); +                    if prev_failed + 1 >= abort_after { +                        process::exit(1); +                    } +                    return; +                } +            }; +            let back = quote!(#krate).to_string(); + +            let equal = panic::catch_unwind(|| { +                syntax::with_globals(Edition::Edition2018, || { +                    let sess = ParseSess::new(FilePathMapping::empty()); +                    let before = match libsyntax_parse(content, &sess) { +                        Ok(before) => before, +                        Err(mut diagnostic) => { +                            diagnostic.cancel(); +                            if diagnostic +                                .message() +                                .starts_with("file not found for module") +                            { +                                errorf!("=== {}: ignore\n", path.display()); +                            } else { +                                errorf!( +                                "=== {}: ignore - libsyntax failed to parse original content: {}\n", +                                path.display(), +                                diagnostic.message() +                            ); +                            } +                            return true; +                        } +                    }; +                    let after = match libsyntax_parse(back, &sess) { +                        Ok(after) => after, +                        Err(mut diagnostic) => { +                            errorf!("=== {}: libsyntax failed to parse", path.display()); +                            diagnostic.emit(); +                            return false; +                        } +                    }; + +                    if SpanlessEq::eq(&before, &after) { +                        errorf!( +                            "=== {}: pass in {}ms\n", +                            path.display(), +                            elapsed.as_secs() * 1000 +                                + u64::from(elapsed.subsec_nanos()) / 1_000_000 +                        ); +                        true +                    } else { +                        errorf!( +                            "=== {}: FAIL\nbefore: {:#?}\nafter: {:#?}\n", +                            path.display(), +                            before, +                            after, +                        ); +                        false +                    } +                }) +            }); +            match equal { +                Err(_) => errorf!("=== {}: ignoring libsyntax panic\n", path.display()), +                Ok(true) => {} +                Ok(false) => { +                    let prev_failed = failed.fetch_add(1, Ordering::SeqCst); +                    if prev_failed + 1 >= abort_after { +                        process::exit(1); +                    } +                } +            } +        }); + +    let failed = failed.load(Ordering::SeqCst); +    if failed > 0 { +        panic!("{} failures", failed); +    } +} + +fn libsyntax_parse(content: String, sess: &ParseSess) -> PResult<ast::Crate> { +    let name = FileName::Custom("test_round_trip".to_string()); +    parse::parse_crate_from_source_str(name, content, sess) +} diff --git a/syn/tests/test_should_parse.rs b/syn/tests/test_should_parse.rs new file mode 100644 index 0000000..d4f7ac3 --- /dev/null +++ b/syn/tests/test_should_parse.rs @@ -0,0 +1,47 @@ +mod features; + +macro_rules! should_parse { +    ($name:ident, { $($in:tt)* }) => { +        #[test] +        fn $name() { +            // Make sure we can parse the file! +            syn::parse_file(stringify!($($in)*)).unwrap(); +        } +    } +} + +should_parse!(generic_associated_type, { +    impl Foo { +        type Item = &'a i32; +        fn foo<'a>(&'a self) -> Self::Item<'a> {} +    } +}); + +#[rustfmt::skip] +should_parse!(const_generics_use, { +    type X = Foo<5>; +    type Y = Foo<"foo">; +    type Z = Foo<X>; +    type W = Foo<{ X + 10 }>; +}); + +should_parse!(trailing_plus_type, { +    type A = Box<Foo>; +    type A = Box<Foo + 'a>; +    type A = Box<'a + Foo>; +}); + +should_parse!(generic_associated_type_where, { +    trait Foo { +        type Item; +        fn foo<T>(&self, t: T) -> Self::Item<T>; +    } +}); + +should_parse!(match_with_block_expr, { +    fn main() { +        match false { +            _ => {}.a(), +        } +    } +}); diff --git a/syn/tests/test_size.rs b/syn/tests/test_size.rs new file mode 100644 index 0000000..386d4df --- /dev/null +++ b/syn/tests/test_size.rs @@ -0,0 +1,31 @@ +#![cfg(target_pointer_width = "64")] + +mod features; + +use std::mem; +use syn::*; + +#[test] +fn test_expr_size() { +    assert_eq!(mem::size_of::<Expr>(), 280); +} + +#[test] +fn test_item_size() { +    assert_eq!(mem::size_of::<Item>(), 344); +} + +#[test] +fn test_type_size() { +    assert_eq!(mem::size_of::<Type>(), 304); +} + +#[test] +fn test_pat_size() { +    assert_eq!(mem::size_of::<Pat>(), 144); +} + +#[test] +fn test_lit_size() { +    assert_eq!(mem::size_of::<Lit>(), 40); +} diff --git a/syn/tests/test_token_trees.rs b/syn/tests/test_token_trees.rs new file mode 100644 index 0000000..5d7610b --- /dev/null +++ b/syn/tests/test_token_trees.rs @@ -0,0 +1,28 @@ +mod features; + +#[macro_use] +mod macros; + +use proc_macro2::TokenStream; +use quote::quote; +use syn::Lit; + +#[test] +fn test_struct() { +    let input = " +        #[derive(Debug, Clone)] +        pub struct Item { +            pub ident: Ident, +            pub attrs: Vec<Attribute>, +        } +    "; + +    snapshot!(input as TokenStream, @"`# [ derive ( Debug , Clone ) ] pub struct Item { pub ident : Ident , pub attrs : Vec < Attribute >, }`"); +} + +#[test] +fn test_literal_mangling() { +    let code = "0_4"; +    let parsed: Lit = syn::parse_str(code).unwrap(); +    assert_eq!(code, quote!(#parsed).to_string()); +} diff --git a/syn/tests/test_visibility.rs b/syn/tests/test_visibility.rs new file mode 100644 index 0000000..21c49c9 --- /dev/null +++ b/syn/tests/test_visibility.rs @@ -0,0 +1,99 @@ +mod features; + +use proc_macro2::TokenStream; +use syn::parse::{Parse, ParseStream}; +use syn::{Result, Visibility}; + +#[derive(Debug)] +struct VisRest { +    vis: Visibility, +    rest: TokenStream, +} + +impl Parse for VisRest { +    fn parse(input: ParseStream) -> Result<Self> { +        Ok(VisRest { +            vis: input.parse()?, +            rest: input.parse()?, +        }) +    } +} + +macro_rules! assert_vis_parse { +    ($input:expr, Ok($p:pat)) => { +        assert_vis_parse!($input, Ok($p) + ""); +    }; + +    ($input:expr, Ok($p:pat) + $rest:expr) => { +        let expected = $rest.parse::<TokenStream>().unwrap(); +        let parse: VisRest = syn::parse_str($input).unwrap(); + +        match parse.vis { +            $p => {} +            _ => panic!("Expected {}, got {:?}", stringify!($p), parse.vis), +        } + +        // NOTE: Round-trips through `to_string` to avoid potential whitespace +        // diffs. +        assert_eq!(parse.rest.to_string(), expected.to_string()); +    }; + +    ($input:expr, Err) => { +        syn::parse2::<VisRest>($input.parse().unwrap()).unwrap_err(); +    }; +} + +#[test] +fn test_pub() { +    assert_vis_parse!("pub", Ok(Visibility::Public(_))); +} + +#[test] +fn test_crate() { +    assert_vis_parse!("crate", Ok(Visibility::Crate(_))); +} + +#[test] +fn test_inherited() { +    assert_vis_parse!("", Ok(Visibility::Inherited)); +} + +#[test] +fn test_in() { +    assert_vis_parse!("pub(in foo::bar)", Ok(Visibility::Restricted(_))); +} + +#[test] +fn test_pub_crate() { +    assert_vis_parse!("pub(crate)", Ok(Visibility::Restricted(_))); +} + +#[test] +fn test_pub_self() { +    assert_vis_parse!("pub(self)", Ok(Visibility::Restricted(_))); +} + +#[test] +fn test_pub_super() { +    assert_vis_parse!("pub(super)", Ok(Visibility::Restricted(_))); +} + +#[test] +fn test_missing_in() { +    assert_vis_parse!("pub(foo::bar)", Ok(Visibility::Public(_)) + "(foo::bar)"); +} + +#[test] +fn test_missing_in_path() { +    assert_vis_parse!("pub(in)", Err); +} + +#[test] +fn test_crate_path() { +    assert_vis_parse!("pub(crate::A, crate::B)", Ok(Visibility::Public(_)) + "(crate::A, crate::B)"); +} + +#[test] +fn test_junk_after_in() { +    assert_vis_parse!("pub(in some::path @@garbage)", Err); +} diff --git a/syn/tests/zzz_stable.rs b/syn/tests/zzz_stable.rs new file mode 100644 index 0000000..6c768f2 --- /dev/null +++ b/syn/tests/zzz_stable.rs @@ -0,0 +1,33 @@ +#![cfg(syn_disable_nightly_tests)] + +use std::io::{self, Write}; +use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; + +const MSG: &str = "\ +‖ +‖   WARNING: +‖   This is not a nightly compiler so not all tests were able to +‖   run. Syn includes tests that compare Syn's parser against the +‖   compiler's parser, which requires access to unstable libsyntax +‖   data structures and a nightly compiler. +‖ +"; + +#[test] +fn notice() -> io::Result<()> { +    let header = "WARNING"; +    let index_of_header = MSG.find(header).unwrap(); +    let before = &MSG[..index_of_header]; +    let after = &MSG[index_of_header + header.len()..]; + +    let mut stderr = StandardStream::stderr(ColorChoice::Auto); +    stderr.set_color(ColorSpec::new().set_fg(Some(Color::Yellow)))?; +    write!(&mut stderr, "{}", before)?; +    stderr.set_color(ColorSpec::new().set_bold(true).set_fg(Some(Color::Yellow)))?; +    write!(&mut stderr, "{}", header)?; +    stderr.set_color(ColorSpec::new().set_fg(Some(Color::Yellow)))?; +    write!(&mut stderr, "{}", after)?; +    stderr.reset()?; + +    Ok(()) +} | 
