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