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