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 BeforeEq,
1513 AfterEq,
1515 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}