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::Name(use_name) => use_name.ident != "self",
755 UseTree::Rename(use_rename) => use_rename.ident != "self",
756 _ => true,
757 }
758 {
759 self.use_tree(&use_group.items[0]);
760 } else {
761 self.cbox(INDENT);
762 self.word("{");
763 self.zerobreak();
764 self.ibox(0);
765 for use_tree in use_group.items.iter().delimited() {
766 self.use_tree(&use_tree);
767 if !use_tree.is_last {
768 self.word(",");
769 let mut use_tree = *use_tree;
770 while let UseTree::Path(use_path) = use_tree {
771 use_tree = &use_path.tree;
772 }
773 if let UseTree::Group(_) = use_tree {
774 self.hardbreak();
775 } else {
776 self.space();
777 }
778 }
779 }
780 self.end();
781 self.trailing_comma(true);
782 self.offset(-INDENT);
783 self.word("}");
784 self.end();
785 }
786 }
787
788 fn foreign_item(&mut self, foreign_item: &ForeignItem) {
789 match foreign_item {
790 #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
791 ForeignItem::Fn(item) => self.foreign_item_fn(item),
792 ForeignItem::Static(item) => self.foreign_item_static(item),
793 ForeignItem::Type(item) => self.foreign_item_type(item),
794 ForeignItem::Macro(item) => self.foreign_item_macro(item),
795 ForeignItem::Verbatim(item) => self.foreign_item_verbatim(item),
796 _ => unimplemented!("unknown ForeignItem"),
797 }
798 }
799
800 fn foreign_item_fn(&mut self, foreign_item: &ForeignItemFn) {
801 self.outer_attrs(&foreign_item.attrs);
802 self.cbox(INDENT);
803 self.visibility(&foreign_item.vis);
804 self.signature(
805 &foreign_item.sig,
806 #[cfg(feature = "verbatim")]
807 &verbatim::Safety::Disallowed,
808 );
809 self.where_clause_semi(&foreign_item.sig.generics.where_clause);
810 self.end();
811 self.hardbreak();
812 }
813
814 fn foreign_item_static(&mut self, foreign_item: &ForeignItemStatic) {
815 self.outer_attrs(&foreign_item.attrs);
816 self.cbox(0);
817 self.visibility(&foreign_item.vis);
818 self.word("static ");
819 self.static_mutability(&foreign_item.mutability);
820 self.ident(&foreign_item.ident);
821 self.word(": ");
822 self.ty(&foreign_item.ty);
823 self.word(";");
824 self.end();
825 self.hardbreak();
826 }
827
828 fn foreign_item_type(&mut self, foreign_item: &ForeignItemType) {
829 self.outer_attrs(&foreign_item.attrs);
830 self.cbox(0);
831 self.visibility(&foreign_item.vis);
832 self.word("type ");
833 self.ident(&foreign_item.ident);
834 self.generics(&foreign_item.generics);
835 self.word(";");
836 self.end();
837 self.hardbreak();
838 }
839
840 fn foreign_item_macro(&mut self, foreign_item: &ForeignItemMacro) {
841 self.outer_attrs(&foreign_item.attrs);
842 let semicolon = mac::requires_semi(&foreign_item.mac.delimiter);
843 self.mac(&foreign_item.mac, None, semicolon);
844 self.hardbreak();
845 }
846
847 #[cfg(not(feature = "verbatim"))]
848 fn foreign_item_verbatim(&mut self, foreign_item: &TokenStream) {
849 if !foreign_item.is_empty() {
850 unimplemented!("ForeignItem::Verbatim `{}`", foreign_item);
851 }
852 self.hardbreak();
853 }
854
855 #[cfg(feature = "verbatim")]
856 fn foreign_item_verbatim(&mut self, tokens: &TokenStream) {
857 use syn::parse::{Parse, ParseStream, Result};
858 use syn::{Abi, Attribute, Token, Visibility};
859 use verbatim::{
860 kw, FlexibleItemFn, FlexibleItemStatic, FlexibleItemType, WhereClauseLocation,
861 };
862
863 enum ForeignItemVerbatim {
864 Empty,
865 Ellipsis,
866 FnFlexible(FlexibleItemFn),
867 StaticFlexible(FlexibleItemStatic),
868 TypeFlexible(FlexibleItemType),
869 }
870
871 fn peek_signature(input: ParseStream) -> bool {
872 let fork = input.fork();
873 fork.parse::<Option<Token![const]>>().is_ok()
874 && fork.parse::<Option<Token![async]>>().is_ok()
875 && ((fork.peek(kw::safe) && fork.parse::<kw::safe>().is_ok())
876 || fork.parse::<Option<Token![unsafe]>>().is_ok())
877 && fork.parse::<Option<Abi>>().is_ok()
878 && fork.peek(Token![fn])
879 }
880
881 impl Parse for ForeignItemVerbatim {
882 fn parse(input: ParseStream) -> Result<Self> {
883 if input.is_empty() {
884 return Ok(ForeignItemVerbatim::Empty);
885 } else if input.peek(Token![...]) {
886 input.parse::<Token![...]>()?;
887 return Ok(ForeignItemVerbatim::Ellipsis);
888 }
889
890 let attrs = input.call(Attribute::parse_outer)?;
891 let vis: Visibility = input.parse()?;
892 let defaultness = false;
893
894 let lookahead = input.lookahead1();
895 if lookahead.peek(Token![fn]) || peek_signature(input) {
896 let flexible_item = FlexibleItemFn::parse(attrs, vis, defaultness, input)?;
897 Ok(ForeignItemVerbatim::FnFlexible(flexible_item))
898 } else if lookahead.peek(Token![static])
899 || ((input.peek(Token![unsafe]) || input.peek(kw::safe))
900 && input.peek2(Token![static]))
901 {
902 let flexible_item = FlexibleItemStatic::parse(attrs, vis, input)?;
903 Ok(ForeignItemVerbatim::StaticFlexible(flexible_item))
904 } else if lookahead.peek(Token![type]) {
905 let flexible_item = FlexibleItemType::parse(
906 attrs,
907 vis,
908 defaultness,
909 input,
910 WhereClauseLocation::Both,
911 )?;
912 Ok(ForeignItemVerbatim::TypeFlexible(flexible_item))
913 } else {
914 Err(lookahead.error())
915 }
916 }
917 }
918
919 let foreign_item: ForeignItemVerbatim = match syn::parse2(tokens.clone()) {
920 Ok(foreign_item) => foreign_item,
921 Err(_) => unimplemented!("ForeignItem::Verbatim `{}`", tokens),
922 };
923
924 match foreign_item {
925 ForeignItemVerbatim::Empty => {
926 self.hardbreak();
927 }
928 ForeignItemVerbatim::Ellipsis => {
929 self.word("...");
930 self.hardbreak();
931 }
932 ForeignItemVerbatim::FnFlexible(foreign_item) => {
933 self.flexible_item_fn(&foreign_item);
934 }
935 ForeignItemVerbatim::StaticFlexible(foreign_item) => {
936 self.flexible_item_static(&foreign_item);
937 }
938 ForeignItemVerbatim::TypeFlexible(foreign_item) => {
939 self.flexible_item_type(&foreign_item);
940 }
941 }
942 }
943
944 fn trait_item(&mut self, trait_item: &TraitItem) {
945 match trait_item {
946 #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
947 TraitItem::Const(item) => self.trait_item_const(item),
948 TraitItem::Fn(item) => self.trait_item_fn(item),
949 TraitItem::Type(item) => self.trait_item_type(item),
950 TraitItem::Macro(item) => self.trait_item_macro(item),
951 TraitItem::Verbatim(item) => self.trait_item_verbatim(item),
952 _ => unimplemented!("unknown TraitItem"),
953 }
954 }
955
956 fn trait_item_const(&mut self, trait_item: &TraitItemConst) {
957 self.outer_attrs(&trait_item.attrs);
958 self.cbox(0);
959 self.word("const ");
960 self.ident(&trait_item.ident);
961 self.generics(&trait_item.generics);
962 self.word(": ");
963 self.ty(&trait_item.ty);
964 if let Some((_eq_token, default)) = &trait_item.default {
965 self.word(" = ");
966 self.neverbreak();
967 self.expr(default, FixupContext::NONE);
968 }
969 self.word(";");
970 self.end();
971 self.hardbreak();
972 }
973
974 fn trait_item_fn(&mut self, trait_item: &TraitItemFn) {
975 self.outer_attrs(&trait_item.attrs);
976 self.cbox(INDENT);
977 self.signature(
978 &trait_item.sig,
979 #[cfg(feature = "verbatim")]
980 &verbatim::Safety::Disallowed,
981 );
982 if let Some(block) = &trait_item.default {
983 self.where_clause_for_body(&trait_item.sig.generics.where_clause);
984 self.word("{");
985 self.hardbreak_if_nonempty();
986 self.inner_attrs(&trait_item.attrs);
987 for stmt in block.stmts.iter().delimited() {
988 self.stmt(&stmt, stmt.is_last);
989 }
990 self.offset(-INDENT);
991 self.end();
992 self.word("}");
993 } else {
994 self.where_clause_semi(&trait_item.sig.generics.where_clause);
995 self.end();
996 }
997 self.hardbreak();
998 }
999
1000 fn trait_item_type(&mut self, trait_item: &TraitItemType) {
1001 self.outer_attrs(&trait_item.attrs);
1002 self.cbox(INDENT);
1003 self.word("type ");
1004 self.ident(&trait_item.ident);
1005 self.generics(&trait_item.generics);
1006 for bound in trait_item.bounds.iter().delimited() {
1007 if bound.is_first {
1008 self.word(": ");
1009 } else {
1010 self.space();
1011 self.word("+ ");
1012 }
1013 self.type_param_bound(&bound);
1014 }
1015 if let Some((_eq_token, default)) = &trait_item.default {
1016 self.word(" = ");
1017 self.neverbreak();
1018 self.ibox(-INDENT);
1019 self.ty(default);
1020 self.end();
1021 }
1022 self.where_clause_oneline_semi(&trait_item.generics.where_clause);
1023 self.end();
1024 self.hardbreak();
1025 }
1026
1027 fn trait_item_macro(&mut self, trait_item: &TraitItemMacro) {
1028 self.outer_attrs(&trait_item.attrs);
1029 let semicolon = mac::requires_semi(&trait_item.mac.delimiter);
1030 self.mac(&trait_item.mac, None, semicolon);
1031 self.hardbreak();
1032 }
1033
1034 #[cfg(not(feature = "verbatim"))]
1035 fn trait_item_verbatim(&mut self, trait_item: &TokenStream) {
1036 if !trait_item.is_empty() {
1037 unimplemented!("TraitItem::Verbatim `{}`", trait_item);
1038 }
1039 self.hardbreak();
1040 }
1041
1042 #[cfg(feature = "verbatim")]
1043 fn trait_item_verbatim(&mut self, tokens: &TokenStream) {
1044 use syn::parse::{Parse, ParseStream, Result};
1045 use syn::{Attribute, Ident, Token, Visibility};
1046 use verbatim::{FlexibleItemConst, FlexibleItemType, WhereClauseLocation};
1047
1048 enum TraitItemVerbatim {
1049 Empty,
1050 Ellipsis,
1051 ConstFlexible(FlexibleItemConst),
1052 TypeFlexible(FlexibleItemType),
1053 PubOrDefault(PubOrDefaultTraitItem),
1054 }
1055
1056 struct PubOrDefaultTraitItem {
1057 attrs: Vec<Attribute>,
1058 vis: Visibility,
1059 defaultness: bool,
1060 trait_item: TraitItem,
1061 }
1062
1063 impl Parse for TraitItemVerbatim {
1064 fn parse(input: ParseStream) -> Result<Self> {
1065 if input.is_empty() {
1066 return Ok(TraitItemVerbatim::Empty);
1067 } else if input.peek(Token![...]) {
1068 input.parse::<Token![...]>()?;
1069 return Ok(TraitItemVerbatim::Ellipsis);
1070 }
1071
1072 let attrs = input.call(Attribute::parse_outer)?;
1073 let vis: Visibility = input.parse()?;
1074 let defaultness = input.parse::<Option<Token![default]>>()?.is_some();
1075
1076 let lookahead = input.lookahead1();
1077 if lookahead.peek(Token![const]) && (input.peek2(Ident) || input.peek2(Token![_])) {
1078 let flexible_item = FlexibleItemConst::parse(attrs, vis, defaultness, input)?;
1079 Ok(TraitItemVerbatim::ConstFlexible(flexible_item))
1080 } else if lookahead.peek(Token![type]) {
1081 let flexible_item = FlexibleItemType::parse(
1082 attrs,
1083 vis,
1084 defaultness,
1085 input,
1086 WhereClauseLocation::AfterEq,
1087 )?;
1088 Ok(TraitItemVerbatim::TypeFlexible(flexible_item))
1089 } else if (input.peek(Token![const])
1090 || lookahead.peek(Token![async])
1091 || lookahead.peek(Token![unsafe])
1092 || lookahead.peek(Token![extern])
1093 || lookahead.peek(Token![fn]))
1094 && (!matches!(vis, Visibility::Inherited) || defaultness)
1095 {
1096 Ok(TraitItemVerbatim::PubOrDefault(PubOrDefaultTraitItem {
1097 attrs,
1098 vis,
1099 defaultness,
1100 trait_item: input.parse()?,
1101 }))
1102 } else {
1103 Err(lookahead.error())
1104 }
1105 }
1106 }
1107
1108 let impl_item: TraitItemVerbatim = match syn::parse2(tokens.clone()) {
1109 Ok(impl_item) => impl_item,
1110 Err(_) => unimplemented!("TraitItem::Verbatim `{}`", tokens),
1111 };
1112
1113 match impl_item {
1114 TraitItemVerbatim::Empty => {
1115 self.hardbreak();
1116 }
1117 TraitItemVerbatim::Ellipsis => {
1118 self.word("...");
1119 self.hardbreak();
1120 }
1121 TraitItemVerbatim::ConstFlexible(trait_item) => {
1122 self.flexible_item_const(&trait_item);
1123 }
1124 TraitItemVerbatim::TypeFlexible(trait_item) => {
1125 self.flexible_item_type(&trait_item);
1126 }
1127 TraitItemVerbatim::PubOrDefault(trait_item) => {
1128 self.outer_attrs(&trait_item.attrs);
1129 self.visibility(&trait_item.vis);
1130 if trait_item.defaultness {
1131 self.word("default ");
1132 }
1133 self.trait_item(&trait_item.trait_item);
1134 }
1135 }
1136 }
1137
1138 fn impl_item(&mut self, impl_item: &ImplItem) {
1139 match impl_item {
1140 #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
1141 ImplItem::Const(item) => self.impl_item_const(item),
1142 ImplItem::Fn(item) => self.impl_item_fn(item),
1143 ImplItem::Type(item) => self.impl_item_type(item),
1144 ImplItem::Macro(item) => self.impl_item_macro(item),
1145 ImplItem::Verbatim(item) => self.impl_item_verbatim(item),
1146 _ => unimplemented!("unknown ImplItem"),
1147 }
1148 }
1149
1150 fn impl_item_const(&mut self, impl_item: &ImplItemConst) {
1151 self.outer_attrs(&impl_item.attrs);
1152 self.cbox(0);
1153 self.visibility(&impl_item.vis);
1154 if impl_item.defaultness.is_some() {
1155 self.word("default ");
1156 }
1157 self.word("const ");
1158 self.ident(&impl_item.ident);
1159 self.generics(&impl_item.generics);
1160 self.word(": ");
1161 self.ty(&impl_item.ty);
1162 self.word(" = ");
1163 self.neverbreak();
1164 self.expr(&impl_item.expr, FixupContext::NONE);
1165 self.word(";");
1166 self.end();
1167 self.hardbreak();
1168 }
1169
1170 fn impl_item_fn(&mut self, impl_item: &ImplItemFn) {
1171 self.outer_attrs(&impl_item.attrs);
1172 self.cbox(INDENT);
1173 self.visibility(&impl_item.vis);
1174 if impl_item.defaultness.is_some() {
1175 self.word("default ");
1176 }
1177 self.signature(
1178 &impl_item.sig,
1179 #[cfg(feature = "verbatim")]
1180 &verbatim::Safety::Disallowed,
1181 );
1182 self.where_clause_for_body(&impl_item.sig.generics.where_clause);
1183 self.word("{");
1184 self.hardbreak_if_nonempty();
1185 self.inner_attrs(&impl_item.attrs);
1186 for stmt in impl_item.block.stmts.iter().delimited() {
1187 self.stmt(&stmt, stmt.is_last);
1188 }
1189 self.offset(-INDENT);
1190 self.end();
1191 self.word("}");
1192 self.hardbreak();
1193 }
1194
1195 fn impl_item_type(&mut self, impl_item: &ImplItemType) {
1196 self.outer_attrs(&impl_item.attrs);
1197 self.cbox(INDENT);
1198 self.visibility(&impl_item.vis);
1199 if impl_item.defaultness.is_some() {
1200 self.word("default ");
1201 }
1202 self.word("type ");
1203 self.ident(&impl_item.ident);
1204 self.generics(&impl_item.generics);
1205 self.word(" = ");
1206 self.neverbreak();
1207 self.ibox(-INDENT);
1208 self.ty(&impl_item.ty);
1209 self.end();
1210 self.where_clause_oneline_semi(&impl_item.generics.where_clause);
1211 self.end();
1212 self.hardbreak();
1213 }
1214
1215 fn impl_item_macro(&mut self, impl_item: &ImplItemMacro) {
1216 self.outer_attrs(&impl_item.attrs);
1217 let semicolon = mac::requires_semi(&impl_item.mac.delimiter);
1218 self.mac(&impl_item.mac, None, semicolon);
1219 self.hardbreak();
1220 }
1221
1222 #[cfg(not(feature = "verbatim"))]
1223 fn impl_item_verbatim(&mut self, impl_item: &TokenStream) {
1224 if !impl_item.is_empty() {
1225 unimplemented!("ImplItem::Verbatim `{}`", impl_item);
1226 }
1227 self.hardbreak();
1228 }
1229
1230 #[cfg(feature = "verbatim")]
1231 fn impl_item_verbatim(&mut self, tokens: &TokenStream) {
1232 use syn::parse::{Parse, ParseStream, Result};
1233 use syn::{Attribute, Ident, Token, Visibility};
1234 use verbatim::{FlexibleItemConst, FlexibleItemFn, FlexibleItemType, WhereClauseLocation};
1235
1236 enum ImplItemVerbatim {
1237 Empty,
1238 Ellipsis,
1239 ConstFlexible(FlexibleItemConst),
1240 FnFlexible(FlexibleItemFn),
1241 TypeFlexible(FlexibleItemType),
1242 }
1243
1244 impl Parse for ImplItemVerbatim {
1245 fn parse(input: ParseStream) -> Result<Self> {
1246 if input.is_empty() {
1247 return Ok(ImplItemVerbatim::Empty);
1248 } else if input.peek(Token![...]) {
1249 input.parse::<Token![...]>()?;
1250 return Ok(ImplItemVerbatim::Ellipsis);
1251 }
1252
1253 let attrs = input.call(Attribute::parse_outer)?;
1254 let vis: Visibility = input.parse()?;
1255 let defaultness = input.parse::<Option<Token![default]>>()?.is_some();
1256
1257 let lookahead = input.lookahead1();
1258 if lookahead.peek(Token![const]) && (input.peek2(Ident) || input.peek2(Token![_])) {
1259 let flexible_item = FlexibleItemConst::parse(attrs, vis, defaultness, input)?;
1260 Ok(ImplItemVerbatim::ConstFlexible(flexible_item))
1261 } else if input.peek(Token![const])
1262 || lookahead.peek(Token![async])
1263 || lookahead.peek(Token![unsafe])
1264 || lookahead.peek(Token![extern])
1265 || lookahead.peek(Token![fn])
1266 {
1267 let flexible_item = FlexibleItemFn::parse(attrs, vis, defaultness, input)?;
1268 Ok(ImplItemVerbatim::FnFlexible(flexible_item))
1269 } else if lookahead.peek(Token![type]) {
1270 let flexible_item = FlexibleItemType::parse(
1271 attrs,
1272 vis,
1273 defaultness,
1274 input,
1275 WhereClauseLocation::AfterEq,
1276 )?;
1277 Ok(ImplItemVerbatim::TypeFlexible(flexible_item))
1278 } else {
1279 Err(lookahead.error())
1280 }
1281 }
1282 }
1283
1284 let impl_item: ImplItemVerbatim = match syn::parse2(tokens.clone()) {
1285 Ok(impl_item) => impl_item,
1286 Err(_) => unimplemented!("ImplItem::Verbatim `{}`", tokens),
1287 };
1288
1289 match impl_item {
1290 ImplItemVerbatim::Empty => {
1291 self.hardbreak();
1292 }
1293 ImplItemVerbatim::Ellipsis => {
1294 self.word("...");
1295 self.hardbreak();
1296 }
1297 ImplItemVerbatim::ConstFlexible(impl_item) => {
1298 self.flexible_item_const(&impl_item);
1299 }
1300 ImplItemVerbatim::FnFlexible(impl_item) => {
1301 self.flexible_item_fn(&impl_item);
1302 }
1303 ImplItemVerbatim::TypeFlexible(impl_item) => {
1304 self.flexible_item_type(&impl_item);
1305 }
1306 }
1307 }
1308
1309 fn signature(
1310 &mut self,
1311 signature: &Signature,
1312 #[cfg(feature = "verbatim")] safety: &verbatim::Safety,
1313 ) {
1314 if signature.constness.is_some() {
1315 self.word("const ");
1316 }
1317 if signature.asyncness.is_some() {
1318 self.word("async ");
1319 }
1320 #[cfg(feature = "verbatim")]
1321 {
1322 if let verbatim::Safety::Disallowed = safety {
1323 if signature.unsafety.is_some() {
1324 self.word("unsafe ");
1325 }
1326 } else {
1327 self.safety(safety);
1328 }
1329 }
1330 #[cfg(not(feature = "verbatim"))]
1331 {
1332 if signature.unsafety.is_some() {
1333 self.word("unsafe ");
1334 }
1335 }
1336 if let Some(abi) = &signature.abi {
1337 self.abi(abi);
1338 }
1339 self.word("fn ");
1340 self.ident(&signature.ident);
1341 self.generics(&signature.generics);
1342 self.word("(");
1343 self.neverbreak();
1344 self.cbox(0);
1345 self.zerobreak();
1346 for input in signature.inputs.iter().delimited() {
1347 self.fn_arg(&input);
1348 let is_last = input.is_last && signature.variadic.is_none();
1349 self.trailing_comma(is_last);
1350 }
1351 if let Some(variadic) = &signature.variadic {
1352 self.variadic(variadic);
1353 self.zerobreak();
1354 }
1355 self.offset(-INDENT);
1356 self.end();
1357 self.word(")");
1358 self.cbox(-INDENT);
1359 self.return_type(&signature.output);
1360 self.end();
1361 }
1362
1363 fn fn_arg(&mut self, fn_arg: &FnArg) {
1364 match fn_arg {
1365 FnArg::Receiver(receiver) => self.receiver(receiver),
1366 FnArg::Typed(pat_type) => self.pat_type(pat_type),
1367 }
1368 }
1369
1370 fn receiver(&mut self, receiver: &Receiver) {
1371 self.outer_attrs(&receiver.attrs);
1372 if let Some((_ampersand, lifetime)) = &receiver.reference {
1373 self.word("&");
1374 if let Some(lifetime) = lifetime {
1375 self.lifetime(lifetime);
1376 self.nbsp();
1377 }
1378 }
1379 if receiver.mutability.is_some() {
1380 self.word("mut ");
1381 }
1382 self.word("self");
1383 if receiver.colon_token.is_some() {
1384 self.word(": ");
1385 self.ty(&receiver.ty);
1386 } else {
1387 let consistent = match (&receiver.reference, &receiver.mutability, &*receiver.ty) {
1388 (Some(_), mutability, Type::Reference(ty)) => {
1389 mutability.is_some() == ty.mutability.is_some()
1390 && match &*ty.elem {
1391 Type::Path(ty) => ty.qself.is_none() && ty.path.is_ident("Self"),
1392 _ => false,
1393 }
1394 }
1395 (None, _, Type::Path(ty)) => ty.qself.is_none() && ty.path.is_ident("Self"),
1396 _ => false,
1397 };
1398 if !consistent {
1399 self.word(": ");
1400 self.ty(&receiver.ty);
1401 }
1402 }
1403 }
1404
1405 fn variadic(&mut self, variadic: &Variadic) {
1406 self.outer_attrs(&variadic.attrs);
1407 if let Some((pat, _colon)) = &variadic.pat {
1408 self.pat(pat);
1409 self.word(": ");
1410 }
1411 self.word("...");
1412 }
1413
1414 fn static_mutability(&mut self, mutability: &StaticMutability) {
1415 match mutability {
1416 #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
1417 StaticMutability::Mut(_) => self.word("mut "),
1418 StaticMutability::None => {}
1419 _ => unimplemented!("unknown StaticMutability"),
1420 }
1421 }
1422}
1423
1424#[cfg(feature = "verbatim")]
1425mod verbatim {
1426 use crate::algorithm::Printer;
1427 use crate::fixup::FixupContext;
1428 use crate::iter::IterDelimited;
1429 use crate::INDENT;
1430 use syn::ext::IdentExt;
1431 use syn::parse::{Parse, ParseStream, Result};
1432 use syn::{
1433 braced, token, Attribute, Block, Expr, Generics, Ident, Signature, StaticMutability, Stmt,
1434 Token, Type, TypeParamBound, Visibility, WhereClause,
1435 };
1436
1437 pub mod kw {
1438 syn::custom_keyword!(safe);
1439 }
1440
1441 pub struct FlexibleItemConst {
1442 pub attrs: Vec<Attribute>,
1443 pub vis: Visibility,
1444 pub defaultness: bool,
1445 pub ident: Ident,
1446 pub generics: Generics,
1447 pub ty: Type,
1448 pub value: Option<Expr>,
1449 }
1450
1451 pub struct FlexibleItemFn {
1452 pub attrs: Vec<Attribute>,
1453 pub vis: Visibility,
1454 pub defaultness: bool,
1455 pub safety: Safety,
1456 pub sig: Signature,
1457 pub body: Option<Vec<Stmt>>,
1458 }
1459
1460 pub struct FlexibleItemStatic {
1461 pub attrs: Vec<Attribute>,
1462 pub vis: Visibility,
1463 pub safety: Safety,
1464 pub mutability: StaticMutability,
1465 pub ident: Ident,
1466 pub ty: Option<Type>,
1467 pub expr: Option<Expr>,
1468 }
1469
1470 pub struct FlexibleItemType {
1471 pub attrs: Vec<Attribute>,
1472 pub vis: Visibility,
1473 pub defaultness: bool,
1474 pub ident: Ident,
1475 pub generics: Generics,
1476 pub bounds: Vec<TypeParamBound>,
1477 pub definition: Option<Type>,
1478 pub where_clause_after_eq: Option<WhereClause>,
1479 }
1480
1481 pub enum Safety {
1482 Unsafe,
1483 Safe,
1484 Default,
1485 Disallowed,
1486 }
1487
1488 pub enum WhereClauseLocation {
1489 BeforeEq,
1491 AfterEq,
1493 Both,
1495 }
1496
1497 impl FlexibleItemConst {
1498 pub fn parse(
1499 attrs: Vec<Attribute>,
1500 vis: Visibility,
1501 defaultness: bool,
1502 input: ParseStream,
1503 ) -> Result<Self> {
1504 input.parse::<Token![const]>()?;
1505 let ident = input.call(Ident::parse_any)?;
1506 let mut generics: Generics = input.parse()?;
1507 input.parse::<Token![:]>()?;
1508 let ty: Type = input.parse()?;
1509 let value = if input.parse::<Option<Token![=]>>()?.is_some() {
1510 let expr: Expr = input.parse()?;
1511 Some(expr)
1512 } else {
1513 None
1514 };
1515 generics.where_clause = input.parse()?;
1516 input.parse::<Token![;]>()?;
1517
1518 Ok(FlexibleItemConst {
1519 attrs,
1520 vis,
1521 defaultness,
1522 ident,
1523 generics,
1524 ty,
1525 value,
1526 })
1527 }
1528 }
1529
1530 impl FlexibleItemFn {
1531 pub fn parse(
1532 mut attrs: Vec<Attribute>,
1533 vis: Visibility,
1534 defaultness: bool,
1535 input: ParseStream,
1536 ) -> Result<Self> {
1537 let constness: Option<Token![const]> = input.parse()?;
1538 let asyncness: Option<Token![async]> = input.parse()?;
1539 let safety: Safety = input.parse()?;
1540
1541 let lookahead = input.lookahead1();
1542 let sig: Signature = if lookahead.peek(Token![extern]) || lookahead.peek(Token![fn]) {
1543 input.parse()?
1544 } else {
1545 return Err(lookahead.error());
1546 };
1547
1548 let lookahead = input.lookahead1();
1549 let body = if lookahead.peek(Token![;]) {
1550 input.parse::<Token![;]>()?;
1551 None
1552 } else if lookahead.peek(token::Brace) {
1553 let content;
1554 braced!(content in input);
1555 attrs.extend(content.call(Attribute::parse_inner)?);
1556 Some(content.call(Block::parse_within)?)
1557 } else {
1558 return Err(lookahead.error());
1559 };
1560
1561 Ok(FlexibleItemFn {
1562 attrs,
1563 vis,
1564 defaultness,
1565 safety,
1566 sig: Signature {
1567 constness,
1568 asyncness,
1569 unsafety: None,
1570 ..sig
1571 },
1572 body,
1573 })
1574 }
1575 }
1576
1577 impl FlexibleItemStatic {
1578 pub fn parse(attrs: Vec<Attribute>, vis: Visibility, input: ParseStream) -> Result<Self> {
1579 let safety: Safety = input.parse()?;
1580 input.parse::<Token![static]>()?;
1581 let mutability: StaticMutability = input.parse()?;
1582 let ident = input.parse()?;
1583
1584 let lookahead = input.lookahead1();
1585 let has_type = lookahead.peek(Token![:]);
1586 let has_expr = lookahead.peek(Token![=]);
1587 if !has_type && !has_expr {
1588 return Err(lookahead.error());
1589 }
1590
1591 let ty: Option<Type> = if has_type {
1592 input.parse::<Token![:]>()?;
1593 input.parse().map(Some)?
1594 } else {
1595 None
1596 };
1597
1598 let expr: Option<Expr> = if input.parse::<Option<Token![=]>>()?.is_some() {
1599 input.parse().map(Some)?
1600 } else {
1601 None
1602 };
1603
1604 input.parse::<Token![;]>()?;
1605
1606 Ok(FlexibleItemStatic {
1607 attrs,
1608 vis,
1609 safety,
1610 mutability,
1611 ident,
1612 ty,
1613 expr,
1614 })
1615 }
1616 }
1617
1618 impl FlexibleItemType {
1619 pub fn parse(
1620 attrs: Vec<Attribute>,
1621 vis: Visibility,
1622 defaultness: bool,
1623 input: ParseStream,
1624 where_clause_location: WhereClauseLocation,
1625 ) -> Result<Self> {
1626 input.parse::<Token![type]>()?;
1627 let ident: Ident = input.parse()?;
1628 let mut generics: Generics = input.parse()?;
1629
1630 let mut bounds = Vec::new();
1631 if input.parse::<Option<Token![:]>>()?.is_some() {
1632 loop {
1633 if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) {
1634 break;
1635 }
1636 bounds.push(input.parse::<TypeParamBound>()?);
1637 if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) {
1638 break;
1639 }
1640 input.parse::<Token![+]>()?;
1641 }
1642 }
1643
1644 match where_clause_location {
1645 WhereClauseLocation::BeforeEq | WhereClauseLocation::Both => {
1646 generics.where_clause = input.parse()?;
1647 }
1648 WhereClauseLocation::AfterEq => {}
1649 }
1650
1651 let definition = if input.parse::<Option<Token![=]>>()?.is_some() {
1652 Some(input.parse()?)
1653 } else {
1654 None
1655 };
1656
1657 let where_clause_after_eq = match where_clause_location {
1658 WhereClauseLocation::AfterEq | WhereClauseLocation::Both
1659 if generics.where_clause.is_none() =>
1660 {
1661 input.parse()?
1662 }
1663 _ => None,
1664 };
1665
1666 input.parse::<Token![;]>()?;
1667
1668 Ok(FlexibleItemType {
1669 attrs,
1670 vis,
1671 defaultness,
1672 ident,
1673 generics,
1674 bounds,
1675 definition,
1676 where_clause_after_eq,
1677 })
1678 }
1679 }
1680
1681 impl Parse for Safety {
1682 fn parse(input: ParseStream) -> Result<Self> {
1683 if input.peek(Token![unsafe]) {
1684 input.parse::<Token![unsafe]>()?;
1685 Ok(Safety::Unsafe)
1686 } else if input.peek(kw::safe) {
1687 input.parse::<kw::safe>()?;
1688 Ok(Safety::Safe)
1689 } else {
1690 Ok(Safety::Default)
1691 }
1692 }
1693 }
1694
1695 impl Printer {
1696 pub fn flexible_item_const(&mut self, item: &FlexibleItemConst) {
1697 self.outer_attrs(&item.attrs);
1698 self.cbox(INDENT);
1699 self.visibility(&item.vis);
1700 if item.defaultness {
1701 self.word("default ");
1702 }
1703 self.word("const ");
1704 self.ident(&item.ident);
1705 self.generics(&item.generics);
1706 self.word(": ");
1707 self.cbox(-INDENT);
1708 self.ty(&item.ty);
1709 self.end();
1710 if let Some(value) = &item.value {
1711 self.word(" = ");
1712 self.neverbreak();
1713 self.ibox(-INDENT);
1714 self.expr(value, FixupContext::NONE);
1715 self.end();
1716 }
1717 self.where_clause_oneline_semi(&item.generics.where_clause);
1718 self.end();
1719 self.hardbreak();
1720 }
1721
1722 pub fn flexible_item_fn(&mut self, item: &FlexibleItemFn) {
1723 self.outer_attrs(&item.attrs);
1724 self.cbox(INDENT);
1725 self.visibility(&item.vis);
1726 if item.defaultness {
1727 self.word("default ");
1728 }
1729 self.signature(&item.sig, &item.safety);
1730 if let Some(body) = &item.body {
1731 self.where_clause_for_body(&item.sig.generics.where_clause);
1732 self.word("{");
1733 self.hardbreak_if_nonempty();
1734 self.inner_attrs(&item.attrs);
1735 for stmt in body.iter().delimited() {
1736 self.stmt(&stmt, stmt.is_last);
1737 }
1738 self.offset(-INDENT);
1739 self.end();
1740 self.word("}");
1741 } else {
1742 self.where_clause_semi(&item.sig.generics.where_clause);
1743 self.end();
1744 }
1745 self.hardbreak();
1746 }
1747
1748 pub fn flexible_item_static(&mut self, item: &FlexibleItemStatic) {
1749 self.outer_attrs(&item.attrs);
1750 self.cbox(0);
1751 self.visibility(&item.vis);
1752 self.safety(&item.safety);
1753 self.word("static ");
1754 self.static_mutability(&item.mutability);
1755 self.ident(&item.ident);
1756 if let Some(ty) = &item.ty {
1757 self.word(": ");
1758 self.ty(ty);
1759 }
1760 if let Some(expr) = &item.expr {
1761 self.word(" = ");
1762 self.neverbreak();
1763 self.expr(expr, FixupContext::NONE);
1764 }
1765 self.word(";");
1766 self.end();
1767 self.hardbreak();
1768 }
1769
1770 pub fn flexible_item_type(&mut self, item: &FlexibleItemType) {
1771 self.outer_attrs(&item.attrs);
1772 self.cbox(INDENT);
1773 self.visibility(&item.vis);
1774 if item.defaultness {
1775 self.word("default ");
1776 }
1777 self.word("type ");
1778 self.ident(&item.ident);
1779 self.generics(&item.generics);
1780 for bound in item.bounds.iter().delimited() {
1781 if bound.is_first {
1782 self.word(": ");
1783 } else {
1784 self.space();
1785 self.word("+ ");
1786 }
1787 self.type_param_bound(&bound);
1788 }
1789 if let Some(definition) = &item.definition {
1790 self.where_clause_oneline(&item.generics.where_clause);
1791 self.word("= ");
1792 self.neverbreak();
1793 self.ibox(-INDENT);
1794 self.ty(definition);
1795 self.end();
1796 self.where_clause_oneline_semi(&item.where_clause_after_eq);
1797 } else {
1798 self.where_clause_oneline_semi(&item.generics.where_clause);
1799 }
1800 self.end();
1801 self.hardbreak();
1802 }
1803
1804 pub fn safety(&mut self, safety: &Safety) {
1805 match safety {
1806 Safety::Unsafe => self.word("unsafe "),
1807 Safety::Safe => self.word("safe "),
1808 Safety::Default => {}
1809 Safety::Disallowed => unreachable!(),
1810 }
1811 }
1812 }
1813}