Skip to main content

a9_prettyplease/
item.rs

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