prettyplease/
item.rs

1use crate::algorithm::Printer;
2use crate::iter::IterDelimited;
3use crate::path::PathKind;
4use crate::INDENT;
5use proc_macro2::TokenStream;
6use syn::{
7    Fields, FnArg, ForeignItem, ForeignItemFn, ForeignItemMacro, ForeignItemStatic,
8    ForeignItemType, ImplItem, ImplItemConst, ImplItemFn, ImplItemMacro, ImplItemType, Item,
9    ItemConst, ItemEnum, ItemExternCrate, ItemFn, ItemForeignMod, ItemImpl, ItemMacro, ItemMod,
10    ItemStatic, ItemStruct, ItemTrait, ItemTraitAlias, ItemType, ItemUnion, ItemUse, Receiver,
11    Signature, StaticMutability, TraitItem, TraitItemConst, TraitItemFn, TraitItemMacro,
12    TraitItemType, Type, UseGlob, UseGroup, UseName, UsePath, UseRename, UseTree, Variadic,
13};
14
15impl Printer {
16    pub fn item(&mut self, item: &Item) {
17        match item {
18            #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
19            Item::Const(item) => self.item_const(item),
20            Item::Enum(item) => self.item_enum(item),
21            Item::ExternCrate(item) => self.item_extern_crate(item),
22            Item::Fn(item) => self.item_fn(item),
23            Item::ForeignMod(item) => self.item_foreign_mod(item),
24            Item::Impl(item) => self.item_impl(item),
25            Item::Macro(item) => self.item_macro(item),
26            Item::Mod(item) => self.item_mod(item),
27            Item::Static(item) => self.item_static(item),
28            Item::Struct(item) => self.item_struct(item),
29            Item::Trait(item) => self.item_trait(item),
30            Item::TraitAlias(item) => self.item_trait_alias(item),
31            Item::Type(item) => self.item_type(item),
32            Item::Union(item) => self.item_union(item),
33            Item::Use(item) => self.item_use(item),
34            Item::Verbatim(item) => self.item_verbatim(item),
35            _ => unimplemented!("unknown Item"),
36        }
37    }
38
39    fn item_const(&mut self, item: &ItemConst) {
40        self.outer_attrs(&item.attrs);
41        self.cbox(0);
42        self.visibility(&item.vis);
43        self.word("const ");
44        self.ident(&item.ident);
45        self.generics(&item.generics);
46        self.word(": ");
47        self.ty(&item.ty);
48        self.word(" = ");
49        self.neverbreak();
50        self.expr(&item.expr);
51        self.word(";");
52        self.end();
53        self.hardbreak();
54    }
55
56    fn item_enum(&mut self, item: &ItemEnum) {
57        self.outer_attrs(&item.attrs);
58        self.cbox(INDENT);
59        self.visibility(&item.vis);
60        self.word("enum ");
61        self.ident(&item.ident);
62        self.generics(&item.generics);
63        self.where_clause_for_body(&item.generics.where_clause);
64        self.word("{");
65        self.hardbreak_if_nonempty();
66        for variant in &item.variants {
67            self.variant(variant);
68            self.word(",");
69            self.hardbreak();
70        }
71        self.offset(-INDENT);
72        self.end();
73        self.word("}");
74        self.hardbreak();
75    }
76
77    fn item_extern_crate(&mut self, item: &ItemExternCrate) {
78        self.outer_attrs(&item.attrs);
79        self.visibility(&item.vis);
80        self.word("extern crate ");
81        self.ident(&item.ident);
82        if let Some((_as_token, rename)) = &item.rename {
83            self.word(" as ");
84            self.ident(rename);
85        }
86        self.word(";");
87        self.hardbreak();
88    }
89
90    fn item_fn(&mut self, item: &ItemFn) {
91        self.outer_attrs(&item.attrs);
92        self.cbox(INDENT);
93        self.visibility(&item.vis);
94        self.signature(&item.sig);
95        self.where_clause_for_body(&item.sig.generics.where_clause);
96        self.word("{");
97        self.hardbreak_if_nonempty();
98        self.inner_attrs(&item.attrs);
99        for stmt in &item.block.stmts {
100            self.stmt(stmt);
101        }
102        self.offset(-INDENT);
103        self.end();
104        self.word("}");
105        self.hardbreak();
106    }
107
108    fn item_foreign_mod(&mut self, item: &ItemForeignMod) {
109        self.outer_attrs(&item.attrs);
110        self.cbox(INDENT);
111        if item.unsafety.is_some() {
112            self.word("unsafe ");
113        }
114        self.abi(&item.abi);
115        self.word("{");
116        self.hardbreak_if_nonempty();
117        self.inner_attrs(&item.attrs);
118        for foreign_item in &item.items {
119            self.foreign_item(foreign_item);
120        }
121        self.offset(-INDENT);
122        self.end();
123        self.word("}");
124        self.hardbreak();
125    }
126
127    fn item_impl(&mut self, item: &ItemImpl) {
128        self.outer_attrs(&item.attrs);
129        self.cbox(INDENT);
130        self.ibox(-INDENT);
131        self.cbox(INDENT);
132        if item.defaultness.is_some() {
133            self.word("default ");
134        }
135        if item.unsafety.is_some() {
136            self.word("unsafe ");
137        }
138        self.word("impl");
139        self.generics(&item.generics);
140        self.end();
141        self.nbsp();
142        if let Some((negative_polarity, path, _for_token)) = &item.trait_ {
143            if negative_polarity.is_some() {
144                self.word("!");
145            }
146            self.path(path, PathKind::Type);
147            self.space();
148            self.word("for ");
149        }
150        self.ty(&item.self_ty);
151        self.end();
152        self.where_clause_for_body(&item.generics.where_clause);
153        self.word("{");
154        self.hardbreak_if_nonempty();
155        self.inner_attrs(&item.attrs);
156        for impl_item in &item.items {
157            self.impl_item(impl_item);
158        }
159        self.offset(-INDENT);
160        self.end();
161        self.word("}");
162        self.hardbreak();
163    }
164
165    fn item_macro(&mut self, item: &ItemMacro) {
166        self.outer_attrs(&item.attrs);
167        let semicolon = true;
168        self.mac(&item.mac, item.ident.as_ref(), semicolon);
169        self.hardbreak();
170    }
171
172    fn item_mod(&mut self, item: &ItemMod) {
173        self.outer_attrs(&item.attrs);
174        self.cbox(INDENT);
175        self.visibility(&item.vis);
176        if item.unsafety.is_some() {
177            self.word("unsafe ");
178        }
179        self.word("mod ");
180        self.ident(&item.ident);
181        if let Some((_brace, items)) = &item.content {
182            self.word(" {");
183            self.hardbreak_if_nonempty();
184            self.inner_attrs(&item.attrs);
185            for item in items {
186                self.item(item);
187            }
188            self.offset(-INDENT);
189            self.end();
190            self.word("}");
191        } else {
192            self.word(";");
193            self.end();
194        }
195        self.hardbreak();
196    }
197
198    fn item_static(&mut self, item: &ItemStatic) {
199        self.outer_attrs(&item.attrs);
200        self.cbox(0);
201        self.visibility(&item.vis);
202        self.word("static ");
203        self.static_mutability(&item.mutability);
204        self.ident(&item.ident);
205        self.word(": ");
206        self.ty(&item.ty);
207        self.word(" = ");
208        self.neverbreak();
209        self.expr(&item.expr);
210        self.word(";");
211        self.end();
212        self.hardbreak();
213    }
214
215    fn item_struct(&mut self, item: &ItemStruct) {
216        self.outer_attrs(&item.attrs);
217        self.cbox(INDENT);
218        self.visibility(&item.vis);
219        self.word("struct ");
220        self.ident(&item.ident);
221        self.generics(&item.generics);
222        match &item.fields {
223            Fields::Named(fields) => {
224                self.where_clause_for_body(&item.generics.where_clause);
225                self.word("{");
226                self.hardbreak_if_nonempty();
227                for field in &fields.named {
228                    self.field(field);
229                    self.word(",");
230                    self.hardbreak();
231                }
232                self.offset(-INDENT);
233                self.end();
234                self.word("}");
235            }
236            Fields::Unnamed(fields) => {
237                self.fields_unnamed(fields);
238                self.where_clause_semi(&item.generics.where_clause);
239                self.end();
240            }
241            Fields::Unit => {
242                self.where_clause_semi(&item.generics.where_clause);
243                self.end();
244            }
245        }
246        self.hardbreak();
247    }
248
249    fn item_trait(&mut self, item: &ItemTrait) {
250        self.outer_attrs(&item.attrs);
251        self.cbox(INDENT);
252        self.visibility(&item.vis);
253        if item.unsafety.is_some() {
254            self.word("unsafe ");
255        }
256        if item.auto_token.is_some() {
257            self.word("auto ");
258        }
259        self.word("trait ");
260        self.ident(&item.ident);
261        self.generics(&item.generics);
262        for supertrait in item.supertraits.iter().delimited() {
263            if supertrait.is_first {
264                self.word(": ");
265            } else {
266                self.word(" + ");
267            }
268            self.type_param_bound(&supertrait);
269        }
270        self.where_clause_for_body(&item.generics.where_clause);
271        self.word("{");
272        self.hardbreak_if_nonempty();
273        self.inner_attrs(&item.attrs);
274        for trait_item in &item.items {
275            self.trait_item(trait_item);
276        }
277        self.offset(-INDENT);
278        self.end();
279        self.word("}");
280        self.hardbreak();
281    }
282
283    fn item_trait_alias(&mut self, item: &ItemTraitAlias) {
284        self.outer_attrs(&item.attrs);
285        self.cbox(INDENT);
286        self.visibility(&item.vis);
287        self.word("trait ");
288        self.ident(&item.ident);
289        self.generics(&item.generics);
290        self.word(" = ");
291        self.neverbreak();
292        for bound in item.bounds.iter().delimited() {
293            if !bound.is_first {
294                self.space();
295                self.word("+ ");
296            }
297            self.type_param_bound(&bound);
298        }
299        self.where_clause_semi(&item.generics.where_clause);
300        self.end();
301        self.hardbreak();
302    }
303
304    fn item_type(&mut self, item: &ItemType) {
305        self.outer_attrs(&item.attrs);
306        self.cbox(INDENT);
307        self.visibility(&item.vis);
308        self.word("type ");
309        self.ident(&item.ident);
310        self.generics(&item.generics);
311        self.where_clause_oneline(&item.generics.where_clause);
312        self.word("= ");
313        self.neverbreak();
314        self.ibox(-INDENT);
315        self.ty(&item.ty);
316        self.end();
317        self.word(";");
318        self.end();
319        self.hardbreak();
320    }
321
322    fn item_union(&mut self, item: &ItemUnion) {
323        self.outer_attrs(&item.attrs);
324        self.cbox(INDENT);
325        self.visibility(&item.vis);
326        self.word("union ");
327        self.ident(&item.ident);
328        self.generics(&item.generics);
329        self.where_clause_for_body(&item.generics.where_clause);
330        self.word("{");
331        self.hardbreak_if_nonempty();
332        for field in &item.fields.named {
333            self.field(field);
334            self.word(",");
335            self.hardbreak();
336        }
337        self.offset(-INDENT);
338        self.end();
339        self.word("}");
340        self.hardbreak();
341    }
342
343    fn item_use(&mut self, item: &ItemUse) {
344        self.outer_attrs(&item.attrs);
345        self.visibility(&item.vis);
346        self.word("use ");
347        if item.leading_colon.is_some() {
348            self.word("::");
349        }
350        self.use_tree(&item.tree);
351        self.word(";");
352        self.hardbreak();
353    }
354
355    #[cfg(not(feature = "verbatim"))]
356    fn item_verbatim(&mut self, item: &TokenStream) {
357        if !item.is_empty() {
358            unimplemented!("Item::Verbatim `{}`", item);
359        }
360        self.hardbreak();
361    }
362
363    #[cfg(feature = "verbatim")]
364    fn item_verbatim(&mut self, tokens: &TokenStream) {
365        use syn::parse::{Parse, ParseStream, Result};
366        use syn::punctuated::Punctuated;
367        use syn::{
368            braced, parenthesized, token, Attribute, Generics, Ident, Lifetime, Token, Visibility,
369        };
370        use verbatim::{
371            FlexibleItemConst, FlexibleItemFn, FlexibleItemStatic, FlexibleItemType,
372            WhereClauseLocation,
373        };
374
375        enum ItemVerbatim {
376            Empty,
377            Ellipsis,
378            ConstFlexible(FlexibleItemConst),
379            FnFlexible(FlexibleItemFn),
380            ImplFlexible(ImplFlexible),
381            Macro2(Macro2),
382            StaticFlexible(FlexibleItemStatic),
383            TypeFlexible(FlexibleItemType),
384            UseBrace(UseBrace),
385        }
386
387        struct ImplFlexible {
388            attrs: Vec<Attribute>,
389            vis: Visibility,
390            defaultness: bool,
391            unsafety: bool,
392            generics: Generics,
393            constness: ImplConstness,
394            negative_impl: bool,
395            trait_: Option<Type>,
396            self_ty: Type,
397            items: Vec<ImplItem>,
398        }
399
400        enum ImplConstness {
401            None,
402            MaybeConst,
403            Const,
404        }
405
406        struct Macro2 {
407            attrs: Vec<Attribute>,
408            vis: Visibility,
409            ident: Ident,
410            args: Option<TokenStream>,
411            body: TokenStream,
412        }
413
414        struct UseBrace {
415            attrs: Vec<Attribute>,
416            vis: Visibility,
417            trees: Punctuated<RootUseTree, Token![,]>,
418        }
419
420        struct RootUseTree {
421            leading_colon: Option<Token![::]>,
422            inner: UseTree,
423        }
424
425        impl Parse for ImplConstness {
426            fn parse(input: ParseStream) -> Result<Self> {
427                if input.parse::<Option<Token![?]>>()?.is_some() {
428                    input.parse::<Token![const]>()?;
429                    Ok(ImplConstness::MaybeConst)
430                } else if input.parse::<Option<Token![const]>>()?.is_some() {
431                    Ok(ImplConstness::Const)
432                } else {
433                    Ok(ImplConstness::None)
434                }
435            }
436        }
437
438        impl Parse for RootUseTree {
439            fn parse(input: ParseStream) -> Result<Self> {
440                Ok(RootUseTree {
441                    leading_colon: input.parse()?,
442                    inner: input.parse()?,
443                })
444            }
445        }
446
447        impl Parse for ItemVerbatim {
448            fn parse(input: ParseStream) -> Result<Self> {
449                if input.is_empty() {
450                    return Ok(ItemVerbatim::Empty);
451                } else if input.peek(Token![...]) {
452                    input.parse::<Token![...]>()?;
453                    return Ok(ItemVerbatim::Ellipsis);
454                }
455
456                let mut attrs = input.call(Attribute::parse_outer)?;
457                let vis: Visibility = input.parse()?;
458
459                let lookahead = input.lookahead1();
460                if lookahead.peek(Token![const]) && (input.peek2(Ident) || input.peek2(Token![_])) {
461                    let defaultness = false;
462                    let flexible_item = FlexibleItemConst::parse(attrs, vis, defaultness, input)?;
463                    Ok(ItemVerbatim::ConstFlexible(flexible_item))
464                } else if input.peek(Token![const])
465                    || lookahead.peek(Token![async])
466                    || lookahead.peek(Token![unsafe]) && !input.peek2(Token![impl])
467                    || lookahead.peek(Token![extern])
468                    || lookahead.peek(Token![fn])
469                {
470                    let defaultness = false;
471                    let flexible_item = FlexibleItemFn::parse(attrs, vis, defaultness, input)?;
472                    Ok(ItemVerbatim::FnFlexible(flexible_item))
473                } else if lookahead.peek(Token![default])
474                    || input.peek(Token![unsafe])
475                    || lookahead.peek(Token![impl])
476                {
477                    let defaultness = input.parse::<Option<Token![default]>>()?.is_some();
478                    let unsafety = input.parse::<Option<Token![unsafe]>>()?.is_some();
479                    input.parse::<Token![impl]>()?;
480                    let has_generics = input.peek(Token![<])
481                        && (input.peek2(Token![>])
482                            || input.peek2(Token![#])
483                            || (input.peek2(Ident) || input.peek2(Lifetime))
484                                && (input.peek3(Token![:])
485                                    || input.peek3(Token![,])
486                                    || input.peek3(Token![>])
487                                    || input.peek3(Token![=]))
488                            || input.peek2(Token![const]));
489                    let mut generics: Generics = if has_generics {
490                        input.parse()?
491                    } else {
492                        Generics::default()
493                    };
494                    let constness: ImplConstness = input.parse()?;
495                    let negative_impl =
496                        !input.peek2(token::Brace) && input.parse::<Option<Token![!]>>()?.is_some();
497                    let first_ty: Type = input.parse()?;
498                    let (trait_, self_ty) = if input.parse::<Option<Token![for]>>()?.is_some() {
499                        (Some(first_ty), input.parse()?)
500                    } else {
501                        (None, first_ty)
502                    };
503                    generics.where_clause = input.parse()?;
504                    let content;
505                    braced!(content in input);
506                    let inner_attrs = content.call(Attribute::parse_inner)?;
507                    attrs.extend(inner_attrs);
508                    let mut items = Vec::new();
509                    while !content.is_empty() {
510                        items.push(content.parse()?);
511                    }
512                    Ok(ItemVerbatim::ImplFlexible(ImplFlexible {
513                        attrs,
514                        vis,
515                        defaultness,
516                        unsafety,
517                        generics,
518                        constness,
519                        negative_impl,
520                        trait_,
521                        self_ty,
522                        items,
523                    }))
524                } else if lookahead.peek(Token![macro]) {
525                    input.parse::<Token![macro]>()?;
526                    let ident: Ident = input.parse()?;
527                    let args = if input.peek(token::Paren) {
528                        let paren_content;
529                        parenthesized!(paren_content in input);
530                        Some(paren_content.parse::<TokenStream>()?)
531                    } else {
532                        None
533                    };
534                    let brace_content;
535                    braced!(brace_content in input);
536                    let body: TokenStream = brace_content.parse()?;
537                    Ok(ItemVerbatim::Macro2(Macro2 {
538                        attrs,
539                        vis,
540                        ident,
541                        args,
542                        body,
543                    }))
544                } else if lookahead.peek(Token![static]) {
545                    let flexible_item = FlexibleItemStatic::parse(attrs, vis, input)?;
546                    Ok(ItemVerbatim::StaticFlexible(flexible_item))
547                } else if lookahead.peek(Token![type]) {
548                    let defaultness = false;
549                    let flexible_item = FlexibleItemType::parse(
550                        attrs,
551                        vis,
552                        defaultness,
553                        input,
554                        WhereClauseLocation::BeforeEq,
555                    )?;
556                    Ok(ItemVerbatim::TypeFlexible(flexible_item))
557                } else if lookahead.peek(Token![use]) {
558                    input.parse::<Token![use]>()?;
559                    let content;
560                    braced!(content in input);
561                    let trees = content.parse_terminated(RootUseTree::parse, Token![,])?;
562                    input.parse::<Token![;]>()?;
563                    Ok(ItemVerbatim::UseBrace(UseBrace { attrs, vis, trees }))
564                } else {
565                    Err(lookahead.error())
566                }
567            }
568        }
569
570        let item: ItemVerbatim = match syn::parse2(tokens.clone()) {
571            Ok(item) => item,
572            Err(_) => unimplemented!("Item::Verbatim `{}`", tokens),
573        };
574
575        match item {
576            ItemVerbatim::Empty => {
577                self.hardbreak();
578            }
579            ItemVerbatim::Ellipsis => {
580                self.word("...");
581                self.hardbreak();
582            }
583            ItemVerbatim::ConstFlexible(item) => {
584                self.flexible_item_const(&item);
585            }
586            ItemVerbatim::FnFlexible(item) => {
587                self.flexible_item_fn(&item);
588            }
589            ItemVerbatim::ImplFlexible(item) => {
590                self.outer_attrs(&item.attrs);
591                self.cbox(INDENT);
592                self.ibox(-INDENT);
593                self.cbox(INDENT);
594                self.visibility(&item.vis);
595                if item.defaultness {
596                    self.word("default ");
597                }
598                if item.unsafety {
599                    self.word("unsafe ");
600                }
601                self.word("impl");
602                self.generics(&item.generics);
603                self.end();
604                self.nbsp();
605                match item.constness {
606                    ImplConstness::None => {}
607                    ImplConstness::MaybeConst => self.word("?const "),
608                    ImplConstness::Const => self.word("const "),
609                }
610                if item.negative_impl {
611                    self.word("!");
612                }
613                if let Some(trait_) = &item.trait_ {
614                    self.ty(trait_);
615                    self.space();
616                    self.word("for ");
617                }
618                self.ty(&item.self_ty);
619                self.end();
620                self.where_clause_for_body(&item.generics.where_clause);
621                self.word("{");
622                self.hardbreak_if_nonempty();
623                self.inner_attrs(&item.attrs);
624                for impl_item in &item.items {
625                    self.impl_item(impl_item);
626                }
627                self.offset(-INDENT);
628                self.end();
629                self.word("}");
630                self.hardbreak();
631            }
632            ItemVerbatim::Macro2(item) => {
633                self.outer_attrs(&item.attrs);
634                self.visibility(&item.vis);
635                self.word("macro ");
636                self.ident(&item.ident);
637                if let Some(args) = &item.args {
638                    self.word("(");
639                    self.cbox(INDENT);
640                    self.zerobreak();
641                    self.ibox(0);
642                    self.macro_rules_tokens(args.clone(), true);
643                    self.end();
644                    self.zerobreak();
645                    self.offset(-INDENT);
646                    self.end();
647                    self.word(")");
648                }
649                self.word(" {");
650                if !item.body.is_empty() {
651                    self.neverbreak();
652                    self.cbox(INDENT);
653                    self.hardbreak();
654                    self.ibox(0);
655                    self.macro_rules_tokens(item.body.clone(), false);
656                    self.end();
657                    self.hardbreak();
658                    self.offset(-INDENT);
659                    self.end();
660                }
661                self.word("}");
662                self.hardbreak();
663            }
664            ItemVerbatim::StaticFlexible(item) => {
665                self.flexible_item_static(&item);
666            }
667            ItemVerbatim::TypeFlexible(item) => {
668                self.flexible_item_type(&item);
669            }
670            ItemVerbatim::UseBrace(item) => {
671                self.outer_attrs(&item.attrs);
672                self.visibility(&item.vis);
673                self.word("use ");
674                if item.trees.len() == 1 {
675                    self.word("::");
676                    self.use_tree(&item.trees[0].inner);
677                } else {
678                    self.cbox(INDENT);
679                    self.word("{");
680                    self.zerobreak();
681                    self.ibox(0);
682                    for use_tree in item.trees.iter().delimited() {
683                        if use_tree.leading_colon.is_some() {
684                            self.word("::");
685                        }
686                        self.use_tree(&use_tree.inner);
687                        if !use_tree.is_last {
688                            self.word(",");
689                            let mut use_tree = &use_tree.inner;
690                            while let UseTree::Path(use_path) = use_tree {
691                                use_tree = &use_path.tree;
692                            }
693                            if let UseTree::Group(_) = use_tree {
694                                self.hardbreak();
695                            } else {
696                                self.space();
697                            }
698                        }
699                    }
700                    self.end();
701                    self.trailing_comma(true);
702                    self.offset(-INDENT);
703                    self.word("}");
704                    self.end();
705                }
706                self.word(";");
707                self.hardbreak();
708            }
709        }
710    }
711
712    fn use_tree(&mut self, use_tree: &UseTree) {
713        match use_tree {
714            UseTree::Path(use_path) => self.use_path(use_path),
715            UseTree::Name(use_name) => self.use_name(use_name),
716            UseTree::Rename(use_rename) => self.use_rename(use_rename),
717            UseTree::Glob(use_glob) => self.use_glob(use_glob),
718            UseTree::Group(use_group) => self.use_group(use_group),
719        }
720    }
721
722    fn use_path(&mut self, use_path: &UsePath) {
723        self.ident(&use_path.ident);
724        self.word("::");
725        self.use_tree(&use_path.tree);
726    }
727
728    fn use_name(&mut self, use_name: &UseName) {
729        self.ident(&use_name.ident);
730    }
731
732    fn use_rename(&mut self, use_rename: &UseRename) {
733        self.ident(&use_rename.ident);
734        self.word(" as ");
735        self.ident(&use_rename.rename);
736    }
737
738    fn use_glob(&mut self, use_glob: &UseGlob) {
739        let _ = use_glob;
740        self.word("*");
741    }
742
743    fn use_group(&mut self, use_group: &UseGroup) {
744        if use_group.items.is_empty() {
745            self.word("{}");
746        } else if use_group.items.len() == 1
747            && match &use_group.items[0] {
748                UseTree::Rename(use_rename) => use_rename.ident != "self",
749                _ => true,
750            }
751        {
752            self.use_tree(&use_group.items[0]);
753        } else {
754            self.cbox(INDENT);
755            self.word("{");
756            self.zerobreak();
757            self.ibox(0);
758            for use_tree in use_group.items.iter().delimited() {
759                self.use_tree(&use_tree);
760                if !use_tree.is_last {
761                    self.word(",");
762                    let mut use_tree = *use_tree;
763                    while let UseTree::Path(use_path) = use_tree {
764                        use_tree = &use_path.tree;
765                    }
766                    if let UseTree::Group(_) = use_tree {
767                        self.hardbreak();
768                    } else {
769                        self.space();
770                    }
771                }
772            }
773            self.end();
774            self.trailing_comma(true);
775            self.offset(-INDENT);
776            self.word("}");
777            self.end();
778        }
779    }
780
781    fn foreign_item(&mut self, foreign_item: &ForeignItem) {
782        match foreign_item {
783            #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
784            ForeignItem::Fn(item) => self.foreign_item_fn(item),
785            ForeignItem::Static(item) => self.foreign_item_static(item),
786            ForeignItem::Type(item) => self.foreign_item_type(item),
787            ForeignItem::Macro(item) => self.foreign_item_macro(item),
788            ForeignItem::Verbatim(item) => self.foreign_item_verbatim(item),
789            _ => unimplemented!("unknown ForeignItem"),
790        }
791    }
792
793    fn foreign_item_fn(&mut self, foreign_item: &ForeignItemFn) {
794        self.outer_attrs(&foreign_item.attrs);
795        self.cbox(INDENT);
796        self.visibility(&foreign_item.vis);
797        self.signature(&foreign_item.sig);
798        self.where_clause_semi(&foreign_item.sig.generics.where_clause);
799        self.end();
800        self.hardbreak();
801    }
802
803    fn foreign_item_static(&mut self, foreign_item: &ForeignItemStatic) {
804        self.outer_attrs(&foreign_item.attrs);
805        self.cbox(0);
806        self.visibility(&foreign_item.vis);
807        self.word("static ");
808        self.static_mutability(&foreign_item.mutability);
809        self.ident(&foreign_item.ident);
810        self.word(": ");
811        self.ty(&foreign_item.ty);
812        self.word(";");
813        self.end();
814        self.hardbreak();
815    }
816
817    fn foreign_item_type(&mut self, foreign_item: &ForeignItemType) {
818        self.outer_attrs(&foreign_item.attrs);
819        self.cbox(0);
820        self.visibility(&foreign_item.vis);
821        self.word("type ");
822        self.ident(&foreign_item.ident);
823        self.generics(&foreign_item.generics);
824        self.word(";");
825        self.end();
826        self.hardbreak();
827    }
828
829    fn foreign_item_macro(&mut self, foreign_item: &ForeignItemMacro) {
830        self.outer_attrs(&foreign_item.attrs);
831        let semicolon = true;
832        self.mac(&foreign_item.mac, None, semicolon);
833        self.hardbreak();
834    }
835
836    #[cfg(not(feature = "verbatim"))]
837    fn foreign_item_verbatim(&mut self, foreign_item: &TokenStream) {
838        if !foreign_item.is_empty() {
839            unimplemented!("ForeignItem::Verbatim `{}`", foreign_item);
840        }
841        self.hardbreak();
842    }
843
844    #[cfg(feature = "verbatim")]
845    fn foreign_item_verbatim(&mut self, tokens: &TokenStream) {
846        use syn::parse::{Parse, ParseStream, Result};
847        use syn::{Attribute, Token, Visibility};
848        use verbatim::{FlexibleItemFn, FlexibleItemStatic, FlexibleItemType, WhereClauseLocation};
849
850        enum ForeignItemVerbatim {
851            Empty,
852            Ellipsis,
853            FnFlexible(FlexibleItemFn),
854            StaticFlexible(FlexibleItemStatic),
855            TypeFlexible(FlexibleItemType),
856        }
857
858        impl Parse for ForeignItemVerbatim {
859            fn parse(input: ParseStream) -> Result<Self> {
860                if input.is_empty() {
861                    return Ok(ForeignItemVerbatim::Empty);
862                } else if input.peek(Token![...]) {
863                    input.parse::<Token![...]>()?;
864                    return Ok(ForeignItemVerbatim::Ellipsis);
865                }
866
867                let attrs = input.call(Attribute::parse_outer)?;
868                let vis: Visibility = input.parse()?;
869                let defaultness = false;
870
871                let lookahead = input.lookahead1();
872                if lookahead.peek(Token![const])
873                    || lookahead.peek(Token![async])
874                    || lookahead.peek(Token![unsafe])
875                    || lookahead.peek(Token![extern])
876                    || lookahead.peek(Token![fn])
877                {
878                    let flexible_item = FlexibleItemFn::parse(attrs, vis, defaultness, input)?;
879                    Ok(ForeignItemVerbatim::FnFlexible(flexible_item))
880                } else if lookahead.peek(Token![static]) {
881                    let flexible_item = FlexibleItemStatic::parse(attrs, vis, input)?;
882                    Ok(ForeignItemVerbatim::StaticFlexible(flexible_item))
883                } else if lookahead.peek(Token![type]) {
884                    let flexible_item = FlexibleItemType::parse(
885                        attrs,
886                        vis,
887                        defaultness,
888                        input,
889                        WhereClauseLocation::Both,
890                    )?;
891                    Ok(ForeignItemVerbatim::TypeFlexible(flexible_item))
892                } else {
893                    Err(lookahead.error())
894                }
895            }
896        }
897
898        let foreign_item: ForeignItemVerbatim = match syn::parse2(tokens.clone()) {
899            Ok(foreign_item) => foreign_item,
900            Err(_) => unimplemented!("ForeignItem::Verbatim `{}`", tokens),
901        };
902
903        match foreign_item {
904            ForeignItemVerbatim::Empty => {
905                self.hardbreak();
906            }
907            ForeignItemVerbatim::Ellipsis => {
908                self.word("...");
909                self.hardbreak();
910            }
911            ForeignItemVerbatim::FnFlexible(foreign_item) => {
912                self.flexible_item_fn(&foreign_item);
913            }
914            ForeignItemVerbatim::StaticFlexible(foreign_item) => {
915                self.flexible_item_static(&foreign_item);
916            }
917            ForeignItemVerbatim::TypeFlexible(foreign_item) => {
918                self.flexible_item_type(&foreign_item);
919            }
920        }
921    }
922
923    fn trait_item(&mut self, trait_item: &TraitItem) {
924        match trait_item {
925            #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
926            TraitItem::Const(item) => self.trait_item_const(item),
927            TraitItem::Fn(item) => self.trait_item_fn(item),
928            TraitItem::Type(item) => self.trait_item_type(item),
929            TraitItem::Macro(item) => self.trait_item_macro(item),
930            TraitItem::Verbatim(item) => self.trait_item_verbatim(item),
931            _ => unimplemented!("unknown TraitItem"),
932        }
933    }
934
935    fn trait_item_const(&mut self, trait_item: &TraitItemConst) {
936        self.outer_attrs(&trait_item.attrs);
937        self.cbox(0);
938        self.word("const ");
939        self.ident(&trait_item.ident);
940        self.generics(&trait_item.generics);
941        self.word(": ");
942        self.ty(&trait_item.ty);
943        if let Some((_eq_token, default)) = &trait_item.default {
944            self.word(" = ");
945            self.neverbreak();
946            self.expr(default);
947        }
948        self.word(";");
949        self.end();
950        self.hardbreak();
951    }
952
953    fn trait_item_fn(&mut self, trait_item: &TraitItemFn) {
954        self.outer_attrs(&trait_item.attrs);
955        self.cbox(INDENT);
956        self.signature(&trait_item.sig);
957        if let Some(block) = &trait_item.default {
958            self.where_clause_for_body(&trait_item.sig.generics.where_clause);
959            self.word("{");
960            self.hardbreak_if_nonempty();
961            self.inner_attrs(&trait_item.attrs);
962            for stmt in &block.stmts {
963                self.stmt(stmt);
964            }
965            self.offset(-INDENT);
966            self.end();
967            self.word("}");
968        } else {
969            self.where_clause_semi(&trait_item.sig.generics.where_clause);
970            self.end();
971        }
972        self.hardbreak();
973    }
974
975    fn trait_item_type(&mut self, trait_item: &TraitItemType) {
976        self.outer_attrs(&trait_item.attrs);
977        self.cbox(INDENT);
978        self.word("type ");
979        self.ident(&trait_item.ident);
980        self.generics(&trait_item.generics);
981        for bound in trait_item.bounds.iter().delimited() {
982            if bound.is_first {
983                self.word(": ");
984            } else {
985                self.space();
986                self.word("+ ");
987            }
988            self.type_param_bound(&bound);
989        }
990        if let Some((_eq_token, default)) = &trait_item.default {
991            self.word(" = ");
992            self.neverbreak();
993            self.ibox(-INDENT);
994            self.ty(default);
995            self.end();
996        }
997        self.where_clause_oneline_semi(&trait_item.generics.where_clause);
998        self.end();
999        self.hardbreak();
1000    }
1001
1002    fn trait_item_macro(&mut self, trait_item: &TraitItemMacro) {
1003        self.outer_attrs(&trait_item.attrs);
1004        let semicolon = true;
1005        self.mac(&trait_item.mac, None, semicolon);
1006        self.hardbreak();
1007    }
1008
1009    #[cfg(not(feature = "verbatim"))]
1010    fn trait_item_verbatim(&mut self, trait_item: &TokenStream) {
1011        if !trait_item.is_empty() {
1012            unimplemented!("TraitItem::Verbatim `{}`", trait_item);
1013        }
1014        self.hardbreak();
1015    }
1016
1017    #[cfg(feature = "verbatim")]
1018    fn trait_item_verbatim(&mut self, tokens: &TokenStream) {
1019        use syn::parse::{Parse, ParseStream, Result};
1020        use syn::{Attribute, Ident, Token, Visibility};
1021        use verbatim::{FlexibleItemConst, FlexibleItemType, WhereClauseLocation};
1022
1023        enum TraitItemVerbatim {
1024            Empty,
1025            Ellipsis,
1026            ConstFlexible(FlexibleItemConst),
1027            TypeFlexible(FlexibleItemType),
1028            PubOrDefault(PubOrDefaultTraitItem),
1029        }
1030
1031        struct PubOrDefaultTraitItem {
1032            attrs: Vec<Attribute>,
1033            vis: Visibility,
1034            defaultness: bool,
1035            trait_item: TraitItem,
1036        }
1037
1038        impl Parse for TraitItemVerbatim {
1039            fn parse(input: ParseStream) -> Result<Self> {
1040                if input.is_empty() {
1041                    return Ok(TraitItemVerbatim::Empty);
1042                } else if input.peek(Token![...]) {
1043                    input.parse::<Token![...]>()?;
1044                    return Ok(TraitItemVerbatim::Ellipsis);
1045                }
1046
1047                let attrs = input.call(Attribute::parse_outer)?;
1048                let vis: Visibility = input.parse()?;
1049                let defaultness = input.parse::<Option<Token![default]>>()?.is_some();
1050
1051                let lookahead = input.lookahead1();
1052                if lookahead.peek(Token![const]) && (input.peek2(Ident) || input.peek2(Token![_])) {
1053                    let flexible_item = FlexibleItemConst::parse(attrs, vis, defaultness, input)?;
1054                    Ok(TraitItemVerbatim::ConstFlexible(flexible_item))
1055                } else if lookahead.peek(Token![type]) {
1056                    let flexible_item = FlexibleItemType::parse(
1057                        attrs,
1058                        vis,
1059                        defaultness,
1060                        input,
1061                        WhereClauseLocation::AfterEq,
1062                    )?;
1063                    Ok(TraitItemVerbatim::TypeFlexible(flexible_item))
1064                } else if (input.peek(Token![const])
1065                    || lookahead.peek(Token![async])
1066                    || lookahead.peek(Token![unsafe])
1067                    || lookahead.peek(Token![extern])
1068                    || lookahead.peek(Token![fn]))
1069                    && (!matches!(vis, Visibility::Inherited) || defaultness)
1070                {
1071                    Ok(TraitItemVerbatim::PubOrDefault(PubOrDefaultTraitItem {
1072                        attrs,
1073                        vis,
1074                        defaultness,
1075                        trait_item: input.parse()?,
1076                    }))
1077                } else {
1078                    Err(lookahead.error())
1079                }
1080            }
1081        }
1082
1083        let impl_item: TraitItemVerbatim = match syn::parse2(tokens.clone()) {
1084            Ok(impl_item) => impl_item,
1085            Err(_) => unimplemented!("TraitItem::Verbatim `{}`", tokens),
1086        };
1087
1088        match impl_item {
1089            TraitItemVerbatim::Empty => {
1090                self.hardbreak();
1091            }
1092            TraitItemVerbatim::Ellipsis => {
1093                self.word("...");
1094                self.hardbreak();
1095            }
1096            TraitItemVerbatim::ConstFlexible(trait_item) => {
1097                self.flexible_item_const(&trait_item);
1098            }
1099            TraitItemVerbatim::TypeFlexible(trait_item) => {
1100                self.flexible_item_type(&trait_item);
1101            }
1102            TraitItemVerbatim::PubOrDefault(trait_item) => {
1103                self.outer_attrs(&trait_item.attrs);
1104                self.visibility(&trait_item.vis);
1105                if trait_item.defaultness {
1106                    self.word("default ");
1107                }
1108                self.trait_item(&trait_item.trait_item);
1109            }
1110        }
1111    }
1112
1113    fn impl_item(&mut self, impl_item: &ImplItem) {
1114        match impl_item {
1115            #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
1116            ImplItem::Const(item) => self.impl_item_const(item),
1117            ImplItem::Fn(item) => self.impl_item_fn(item),
1118            ImplItem::Type(item) => self.impl_item_type(item),
1119            ImplItem::Macro(item) => self.impl_item_macro(item),
1120            ImplItem::Verbatim(item) => self.impl_item_verbatim(item),
1121            _ => unimplemented!("unknown ImplItem"),
1122        }
1123    }
1124
1125    fn impl_item_const(&mut self, impl_item: &ImplItemConst) {
1126        self.outer_attrs(&impl_item.attrs);
1127        self.cbox(0);
1128        self.visibility(&impl_item.vis);
1129        if impl_item.defaultness.is_some() {
1130            self.word("default ");
1131        }
1132        self.word("const ");
1133        self.ident(&impl_item.ident);
1134        self.generics(&impl_item.generics);
1135        self.word(": ");
1136        self.ty(&impl_item.ty);
1137        self.word(" = ");
1138        self.neverbreak();
1139        self.expr(&impl_item.expr);
1140        self.word(";");
1141        self.end();
1142        self.hardbreak();
1143    }
1144
1145    fn impl_item_fn(&mut self, impl_item: &ImplItemFn) {
1146        self.outer_attrs(&impl_item.attrs);
1147        self.cbox(INDENT);
1148        self.visibility(&impl_item.vis);
1149        if impl_item.defaultness.is_some() {
1150            self.word("default ");
1151        }
1152        self.signature(&impl_item.sig);
1153        self.where_clause_for_body(&impl_item.sig.generics.where_clause);
1154        self.word("{");
1155        self.hardbreak_if_nonempty();
1156        self.inner_attrs(&impl_item.attrs);
1157        for stmt in &impl_item.block.stmts {
1158            self.stmt(stmt);
1159        }
1160        self.offset(-INDENT);
1161        self.end();
1162        self.word("}");
1163        self.hardbreak();
1164    }
1165
1166    fn impl_item_type(&mut self, impl_item: &ImplItemType) {
1167        self.outer_attrs(&impl_item.attrs);
1168        self.cbox(INDENT);
1169        self.visibility(&impl_item.vis);
1170        if impl_item.defaultness.is_some() {
1171            self.word("default ");
1172        }
1173        self.word("type ");
1174        self.ident(&impl_item.ident);
1175        self.generics(&impl_item.generics);
1176        self.word(" = ");
1177        self.neverbreak();
1178        self.ibox(-INDENT);
1179        self.ty(&impl_item.ty);
1180        self.end();
1181        self.where_clause_oneline_semi(&impl_item.generics.where_clause);
1182        self.end();
1183        self.hardbreak();
1184    }
1185
1186    fn impl_item_macro(&mut self, impl_item: &ImplItemMacro) {
1187        self.outer_attrs(&impl_item.attrs);
1188        let semicolon = true;
1189        self.mac(&impl_item.mac, None, semicolon);
1190        self.hardbreak();
1191    }
1192
1193    #[cfg(not(feature = "verbatim"))]
1194    fn impl_item_verbatim(&mut self, impl_item: &TokenStream) {
1195        if !impl_item.is_empty() {
1196            unimplemented!("ImplItem::Verbatim `{}`", impl_item);
1197        }
1198        self.hardbreak();
1199    }
1200
1201    #[cfg(feature = "verbatim")]
1202    fn impl_item_verbatim(&mut self, tokens: &TokenStream) {
1203        use syn::parse::{Parse, ParseStream, Result};
1204        use syn::{Attribute, Ident, Token, Visibility};
1205        use verbatim::{FlexibleItemConst, FlexibleItemFn, FlexibleItemType, WhereClauseLocation};
1206
1207        enum ImplItemVerbatim {
1208            Empty,
1209            Ellipsis,
1210            ConstFlexible(FlexibleItemConst),
1211            FnFlexible(FlexibleItemFn),
1212            TypeFlexible(FlexibleItemType),
1213        }
1214
1215        impl Parse for ImplItemVerbatim {
1216            fn parse(input: ParseStream) -> Result<Self> {
1217                if input.is_empty() {
1218                    return Ok(ImplItemVerbatim::Empty);
1219                } else if input.peek(Token![...]) {
1220                    input.parse::<Token![...]>()?;
1221                    return Ok(ImplItemVerbatim::Ellipsis);
1222                }
1223
1224                let attrs = input.call(Attribute::parse_outer)?;
1225                let vis: Visibility = input.parse()?;
1226                let defaultness = input.parse::<Option<Token![default]>>()?.is_some();
1227
1228                let lookahead = input.lookahead1();
1229                if lookahead.peek(Token![const]) && (input.peek2(Ident) || input.peek2(Token![_])) {
1230                    let flexible_item = FlexibleItemConst::parse(attrs, vis, defaultness, input)?;
1231                    Ok(ImplItemVerbatim::ConstFlexible(flexible_item))
1232                } else if input.peek(Token![const])
1233                    || lookahead.peek(Token![async])
1234                    || lookahead.peek(Token![unsafe])
1235                    || lookahead.peek(Token![extern])
1236                    || lookahead.peek(Token![fn])
1237                {
1238                    let flexible_item = FlexibleItemFn::parse(attrs, vis, defaultness, input)?;
1239                    Ok(ImplItemVerbatim::FnFlexible(flexible_item))
1240                } else if lookahead.peek(Token![type]) {
1241                    let flexible_item = FlexibleItemType::parse(
1242                        attrs,
1243                        vis,
1244                        defaultness,
1245                        input,
1246                        WhereClauseLocation::AfterEq,
1247                    )?;
1248                    Ok(ImplItemVerbatim::TypeFlexible(flexible_item))
1249                } else {
1250                    Err(lookahead.error())
1251                }
1252            }
1253        }
1254
1255        let impl_item: ImplItemVerbatim = match syn::parse2(tokens.clone()) {
1256            Ok(impl_item) => impl_item,
1257            Err(_) => unimplemented!("ImplItem::Verbatim `{}`", tokens),
1258        };
1259
1260        match impl_item {
1261            ImplItemVerbatim::Empty => {
1262                self.hardbreak();
1263            }
1264            ImplItemVerbatim::Ellipsis => {
1265                self.word("...");
1266                self.hardbreak();
1267            }
1268            ImplItemVerbatim::ConstFlexible(impl_item) => {
1269                self.flexible_item_const(&impl_item);
1270            }
1271            ImplItemVerbatim::FnFlexible(impl_item) => {
1272                self.flexible_item_fn(&impl_item);
1273            }
1274            ImplItemVerbatim::TypeFlexible(impl_item) => {
1275                self.flexible_item_type(&impl_item);
1276            }
1277        }
1278    }
1279
1280    fn signature(&mut self, signature: &Signature) {
1281        if signature.constness.is_some() {
1282            self.word("const ");
1283        }
1284        if signature.asyncness.is_some() {
1285            self.word("async ");
1286        }
1287        if signature.unsafety.is_some() {
1288            self.word("unsafe ");
1289        }
1290        if let Some(abi) = &signature.abi {
1291            self.abi(abi);
1292        }
1293        self.word("fn ");
1294        self.ident(&signature.ident);
1295        self.generics(&signature.generics);
1296        self.word("(");
1297        self.neverbreak();
1298        self.cbox(0);
1299        self.zerobreak();
1300        for input in signature.inputs.iter().delimited() {
1301            self.fn_arg(&input);
1302            let is_last = input.is_last && signature.variadic.is_none();
1303            self.trailing_comma(is_last);
1304        }
1305        if let Some(variadic) = &signature.variadic {
1306            self.variadic(variadic);
1307            self.zerobreak();
1308        }
1309        self.offset(-INDENT);
1310        self.end();
1311        self.word(")");
1312        self.cbox(-INDENT);
1313        self.return_type(&signature.output);
1314        self.end();
1315    }
1316
1317    fn fn_arg(&mut self, fn_arg: &FnArg) {
1318        match fn_arg {
1319            FnArg::Receiver(receiver) => self.receiver(receiver),
1320            FnArg::Typed(pat_type) => self.pat_type(pat_type),
1321        }
1322    }
1323
1324    fn receiver(&mut self, receiver: &Receiver) {
1325        self.outer_attrs(&receiver.attrs);
1326        if let Some((_ampersand, lifetime)) = &receiver.reference {
1327            self.word("&");
1328            if let Some(lifetime) = lifetime {
1329                self.lifetime(lifetime);
1330                self.nbsp();
1331            }
1332        }
1333        if receiver.mutability.is_some() {
1334            self.word("mut ");
1335        }
1336        self.word("self");
1337        if receiver.colon_token.is_some() {
1338            self.word(": ");
1339            self.ty(&receiver.ty);
1340        } else {
1341            let consistent = match (&receiver.reference, &receiver.mutability, &*receiver.ty) {
1342                (Some(_), mutability, Type::Reference(ty)) => {
1343                    mutability.is_some() == ty.mutability.is_some()
1344                        && match &*ty.elem {
1345                            Type::Path(ty) => ty.qself.is_none() && ty.path.is_ident("Self"),
1346                            _ => false,
1347                        }
1348                }
1349                (None, _, Type::Path(ty)) => ty.qself.is_none() && ty.path.is_ident("Self"),
1350                _ => false,
1351            };
1352            if !consistent {
1353                self.word(": ");
1354                self.ty(&receiver.ty);
1355            }
1356        }
1357    }
1358
1359    fn variadic(&mut self, variadic: &Variadic) {
1360        self.outer_attrs(&variadic.attrs);
1361        if let Some((pat, _colon)) = &variadic.pat {
1362            self.pat(pat);
1363            self.word(": ");
1364        }
1365        self.word("...");
1366    }
1367
1368    fn static_mutability(&mut self, mutability: &StaticMutability) {
1369        match mutability {
1370            #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
1371            StaticMutability::Mut(_) => self.word("mut "),
1372            StaticMutability::None => {}
1373            _ => unimplemented!("unknown StaticMutability"),
1374        }
1375    }
1376}
1377
1378#[cfg(feature = "verbatim")]
1379mod verbatim {
1380    use crate::algorithm::Printer;
1381    use crate::iter::IterDelimited;
1382    use crate::INDENT;
1383    use syn::ext::IdentExt;
1384    use syn::parse::{ParseStream, Result};
1385    use syn::{
1386        braced, token, Attribute, Block, Expr, Generics, Ident, Signature, StaticMutability, Stmt,
1387        Token, Type, TypeParamBound, Visibility, WhereClause,
1388    };
1389
1390    pub struct FlexibleItemConst {
1391        pub attrs: Vec<Attribute>,
1392        pub vis: Visibility,
1393        pub defaultness: bool,
1394        pub ident: Ident,
1395        pub generics: Generics,
1396        pub ty: Type,
1397        pub value: Option<Expr>,
1398    }
1399
1400    pub struct FlexibleItemFn {
1401        pub attrs: Vec<Attribute>,
1402        pub vis: Visibility,
1403        pub defaultness: bool,
1404        pub sig: Signature,
1405        pub body: Option<Vec<Stmt>>,
1406    }
1407
1408    pub struct FlexibleItemStatic {
1409        pub attrs: Vec<Attribute>,
1410        pub vis: Visibility,
1411        pub mutability: StaticMutability,
1412        pub ident: Ident,
1413        pub ty: Option<Type>,
1414        pub expr: Option<Expr>,
1415    }
1416
1417    pub struct FlexibleItemType {
1418        pub attrs: Vec<Attribute>,
1419        pub vis: Visibility,
1420        pub defaultness: bool,
1421        pub ident: Ident,
1422        pub generics: Generics,
1423        pub bounds: Vec<TypeParamBound>,
1424        pub definition: Option<Type>,
1425        pub where_clause_after_eq: Option<WhereClause>,
1426    }
1427
1428    pub enum WhereClauseLocation {
1429        // type Ty<T> where T: 'static = T;
1430        BeforeEq,
1431        // type Ty<T> = T where T: 'static;
1432        AfterEq,
1433        // TODO: goes away once the migration period on rust-lang/rust#89122 is over
1434        Both,
1435    }
1436
1437    impl FlexibleItemConst {
1438        pub fn parse(
1439            attrs: Vec<Attribute>,
1440            vis: Visibility,
1441            defaultness: bool,
1442            input: ParseStream,
1443        ) -> Result<Self> {
1444            input.parse::<Token![const]>()?;
1445            let ident = input.call(Ident::parse_any)?;
1446            let mut generics: Generics = input.parse()?;
1447            input.parse::<Token![:]>()?;
1448            let ty: Type = input.parse()?;
1449            let value = if input.parse::<Option<Token![=]>>()?.is_some() {
1450                let expr: Expr = input.parse()?;
1451                Some(expr)
1452            } else {
1453                None
1454            };
1455            generics.where_clause = input.parse()?;
1456            input.parse::<Token![;]>()?;
1457
1458            Ok(FlexibleItemConst {
1459                attrs,
1460                vis,
1461                defaultness,
1462                ident,
1463                generics,
1464                ty,
1465                value,
1466            })
1467        }
1468    }
1469
1470    impl FlexibleItemFn {
1471        pub fn parse(
1472            mut attrs: Vec<Attribute>,
1473            vis: Visibility,
1474            defaultness: bool,
1475            input: ParseStream,
1476        ) -> Result<Self> {
1477            let sig: Signature = input.parse()?;
1478
1479            let lookahead = input.lookahead1();
1480            let body = if lookahead.peek(Token![;]) {
1481                input.parse::<Token![;]>()?;
1482                None
1483            } else if lookahead.peek(token::Brace) {
1484                let content;
1485                braced!(content in input);
1486                attrs.extend(content.call(Attribute::parse_inner)?);
1487                Some(content.call(Block::parse_within)?)
1488            } else {
1489                return Err(lookahead.error());
1490            };
1491
1492            Ok(FlexibleItemFn {
1493                attrs,
1494                vis,
1495                defaultness,
1496                sig,
1497                body,
1498            })
1499        }
1500    }
1501
1502    impl FlexibleItemStatic {
1503        pub fn parse(attrs: Vec<Attribute>, vis: Visibility, input: ParseStream) -> Result<Self> {
1504            input.parse::<Token![static]>()?;
1505            let mutability: StaticMutability = input.parse()?;
1506            let ident = input.parse()?;
1507
1508            let lookahead = input.lookahead1();
1509            let has_type = lookahead.peek(Token![:]);
1510            let has_expr = lookahead.peek(Token![=]);
1511            if !has_type && !has_expr {
1512                return Err(lookahead.error());
1513            }
1514
1515            let ty: Option<Type> = if has_type {
1516                input.parse::<Token![:]>()?;
1517                input.parse().map(Some)?
1518            } else {
1519                None
1520            };
1521
1522            let expr: Option<Expr> = if input.parse::<Option<Token![=]>>()?.is_some() {
1523                input.parse().map(Some)?
1524            } else {
1525                None
1526            };
1527
1528            input.parse::<Token![;]>()?;
1529
1530            Ok(FlexibleItemStatic {
1531                attrs,
1532                vis,
1533                mutability,
1534                ident,
1535                ty,
1536                expr,
1537            })
1538        }
1539    }
1540
1541    impl FlexibleItemType {
1542        pub fn parse(
1543            attrs: Vec<Attribute>,
1544            vis: Visibility,
1545            defaultness: bool,
1546            input: ParseStream,
1547            where_clause_location: WhereClauseLocation,
1548        ) -> Result<Self> {
1549            input.parse::<Token![type]>()?;
1550            let ident: Ident = input.parse()?;
1551            let mut generics: Generics = input.parse()?;
1552
1553            let mut bounds = Vec::new();
1554            if input.parse::<Option<Token![:]>>()?.is_some() {
1555                loop {
1556                    if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) {
1557                        break;
1558                    }
1559                    bounds.push(input.parse::<TypeParamBound>()?);
1560                    if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) {
1561                        break;
1562                    }
1563                    input.parse::<Token![+]>()?;
1564                }
1565            }
1566
1567            match where_clause_location {
1568                WhereClauseLocation::BeforeEq | WhereClauseLocation::Both => {
1569                    generics.where_clause = input.parse()?;
1570                }
1571                WhereClauseLocation::AfterEq => {}
1572            }
1573
1574            let definition = if input.parse::<Option<Token![=]>>()?.is_some() {
1575                Some(input.parse()?)
1576            } else {
1577                None
1578            };
1579
1580            let where_clause_after_eq = match where_clause_location {
1581                WhereClauseLocation::AfterEq | WhereClauseLocation::Both
1582                    if generics.where_clause.is_none() =>
1583                {
1584                    input.parse()?
1585                }
1586                _ => None,
1587            };
1588
1589            input.parse::<Token![;]>()?;
1590
1591            Ok(FlexibleItemType {
1592                attrs,
1593                vis,
1594                defaultness,
1595                ident,
1596                generics,
1597                bounds,
1598                definition,
1599                where_clause_after_eq,
1600            })
1601        }
1602    }
1603
1604    impl Printer {
1605        pub fn flexible_item_const(&mut self, item: &FlexibleItemConst) {
1606            self.outer_attrs(&item.attrs);
1607            self.cbox(INDENT);
1608            self.visibility(&item.vis);
1609            if item.defaultness {
1610                self.word("default ");
1611            }
1612            self.word("const ");
1613            self.ident(&item.ident);
1614            self.generics(&item.generics);
1615            self.word(": ");
1616            self.cbox(-INDENT);
1617            self.ty(&item.ty);
1618            self.end();
1619            if let Some(value) = &item.value {
1620                self.word(" = ");
1621                self.neverbreak();
1622                self.ibox(-INDENT);
1623                self.expr(value);
1624                self.end();
1625            }
1626            self.where_clause_oneline_semi(&item.generics.where_clause);
1627            self.end();
1628            self.hardbreak();
1629        }
1630
1631        pub fn flexible_item_fn(&mut self, item: &FlexibleItemFn) {
1632            self.outer_attrs(&item.attrs);
1633            self.cbox(INDENT);
1634            self.visibility(&item.vis);
1635            if item.defaultness {
1636                self.word("default ");
1637            }
1638            self.signature(&item.sig);
1639            if let Some(body) = &item.body {
1640                self.where_clause_for_body(&item.sig.generics.where_clause);
1641                self.word("{");
1642                self.hardbreak_if_nonempty();
1643                self.inner_attrs(&item.attrs);
1644                for stmt in body {
1645                    self.stmt(stmt);
1646                }
1647                self.offset(-INDENT);
1648                self.end();
1649                self.word("}");
1650            } else {
1651                self.where_clause_semi(&item.sig.generics.where_clause);
1652                self.end();
1653            }
1654            self.hardbreak();
1655        }
1656
1657        pub fn flexible_item_static(&mut self, item: &FlexibleItemStatic) {
1658            self.outer_attrs(&item.attrs);
1659            self.cbox(0);
1660            self.visibility(&item.vis);
1661            self.word("static ");
1662            self.static_mutability(&item.mutability);
1663            self.ident(&item.ident);
1664            if let Some(ty) = &item.ty {
1665                self.word(": ");
1666                self.ty(ty);
1667            }
1668            if let Some(expr) = &item.expr {
1669                self.word(" = ");
1670                self.neverbreak();
1671                self.expr(expr);
1672            }
1673            self.word(";");
1674            self.end();
1675            self.hardbreak();
1676        }
1677
1678        pub fn flexible_item_type(&mut self, item: &FlexibleItemType) {
1679            self.outer_attrs(&item.attrs);
1680            self.cbox(INDENT);
1681            self.visibility(&item.vis);
1682            if item.defaultness {
1683                self.word("default ");
1684            }
1685            self.word("type ");
1686            self.ident(&item.ident);
1687            self.generics(&item.generics);
1688            for bound in item.bounds.iter().delimited() {
1689                if bound.is_first {
1690                    self.word(": ");
1691                } else {
1692                    self.space();
1693                    self.word("+ ");
1694                }
1695                self.type_param_bound(&bound);
1696            }
1697            if let Some(definition) = &item.definition {
1698                self.where_clause_oneline(&item.generics.where_clause);
1699                self.word("= ");
1700                self.neverbreak();
1701                self.ibox(-INDENT);
1702                self.ty(definition);
1703                self.end();
1704                self.where_clause_oneline_semi(&item.where_clause_after_eq);
1705            } else {
1706                self.where_clause_oneline_semi(&item.generics.where_clause);
1707            }
1708            self.end();
1709            self.hardbreak();
1710        }
1711    }
1712}