- match item.node {
- ast::ItemKind::Use(ref tree) => self.format_import(item, tree),
- ast::ItemKind::Impl(..) => {
- let snippet = self.snippet(item.span);
- let where_span_end = snippet
- .find_uncommented("{")
- .map(|x| BytePos(x as u32) + source!(self, item.span).lo());
- let block_indent = self.block_indent.clone();
- let rw =
- self.with_context(|ctx| format_impl(&ctx, item, block_indent, where_span_end));
- self.push_rewrite(item.span, rw);
- }
- ast::ItemKind::Trait(..) => {
- let block_indent = self.block_indent.clone();
- let rw = self.with_context(|ctx| format_trait(&ctx, item, block_indent));
- self.push_rewrite(item.span, rw);
- }
- ast::ItemKind::TraitAlias(ref generics, ref generic_bounds) => {
- let shape = Shape::indented(self.block_indent, self.config);
- let rw = format_trait_alias(
- &self.get_context(),
- item.ident,
- generics,
- generic_bounds,
- shape,
- );
- self.push_rewrite(item.span, rw);
- }
- ast::ItemKind::ExternCrate(_) => {
- let rw = rewrite_extern_crate(&self.get_context(), item);
- self.push_rewrite(item.span, rw);
- }
- ast::ItemKind::Struct(..) | ast::ItemKind::Union(..) => {
- self.visit_struct(&StructParts::from_item(item));
- }
- ast::ItemKind::Enum(ref def, ref generics) => {
- self.format_missing_with_indent(source!(self, item.span).lo());
- self.visit_enum(item.ident, &item.vis, def, generics, item.span);
- self.last_pos = source!(self, item.span).hi();
- }
- ast::ItemKind::Mod(ref module) => {
- let is_inline = !is_mod_decl(item);
- self.format_missing_with_indent(source!(self, item.span).lo());
- self.format_mod(module, &item.vis, item.span, item.ident, attrs, is_inline);
- }
- ast::ItemKind::Mac(ref mac) => {
- self.visit_mac(mac, Some(item.ident), MacroPosition::Item);
- }
- ast::ItemKind::ForeignMod(ref foreign_mod) => {
- self.format_missing_with_indent(source!(self, item.span).lo());
- self.format_foreign_mod(foreign_mod, item.span);
- }
- ast::ItemKind::Static(..) | ast::ItemKind::Const(..) => {
- self.visit_static(&StaticParts::from_item(item));
- }
- ast::ItemKind::Fn(ref decl, fn_header, ref generics, ref body) => {
- let inner_attrs = inner_attributes(&item.attrs);
- self.visit_fn(
- visit::FnKind::ItemFn(item.ident, fn_header, &item.vis, body),
- generics,
- decl,
- item.span,
- ast::Defaultness::Final,
- Some(&inner_attrs),
- )
- }
- ast::ItemKind::Ty(ref ty, ref generics) => {
- let rewrite = rewrite_type_alias(
- &self.get_context(),
- self.block_indent,
- item.ident,
- ty,
- generics,
- &item.vis,
- );
- self.push_rewrite(item.span, rewrite);
- }
- ast::ItemKind::Existential(ref generic_bounds, ref generics) => {
- let rewrite = rewrite_existential_type(
- &self.get_context(),
- self.block_indent,
- item.ident,
- generic_bounds,
- generics,
- &item.vis,
- );
- self.push_rewrite(item.span, rewrite);
- }
- ast::ItemKind::GlobalAsm(..) => {
- let snippet = Some(self.snippet(item.span).to_owned());
- self.push_rewrite(item.span, snippet);
- }
- ast::ItemKind::MacroDef(ref def) => {
- let rewrite = rewrite_macro_def(
- &self.get_context(),
- self.shape(),
- self.block_indent,
- def,
- item.ident,
- &item.vis,
- item.span,
- );
- self.push_rewrite(item.span, rewrite);
- }
+ if should_visit_node_again {
+ match item.kind {
+ ast::ItemKind::Use(ref tree) => self.format_import(item, tree),
+ ast::ItemKind::Impl { .. } => {
+ let block_indent = self.block_indent;
+ let rw = self.with_context(|ctx| format_impl(&ctx, item, block_indent));
+ self.push_rewrite(item.span, rw);
+ }
+ ast::ItemKind::Trait(..) => {
+ let block_indent = self.block_indent;
+ let rw = self.with_context(|ctx| format_trait(&ctx, item, block_indent));
+ self.push_rewrite(item.span, rw);
+ }
+ ast::ItemKind::TraitAlias(ref generics, ref generic_bounds) => {
+ let shape = Shape::indented(self.block_indent, self.config);
+ let rw = format_trait_alias(
+ &self.get_context(),
+ item.ident,
+ &item.vis,
+ generics,
+ generic_bounds,
+ shape,
+ );
+ self.push_rewrite(item.span, rw);
+ }
+ ast::ItemKind::ExternCrate(_) => {
+ let rw = rewrite_extern_crate(&self.get_context(), item, self.shape());
+ let span = if attrs.is_empty() {
+ item.span
+ } else {
+ mk_sp(attrs[0].span.lo(), item.span.hi())
+ };
+ self.push_rewrite(span, rw);
+ }
+ ast::ItemKind::Struct(..) | ast::ItemKind::Union(..) => {
+ self.visit_struct(&StructParts::from_item(item));
+ }
+ ast::ItemKind::Enum(ref def, ref generics) => {
+ self.format_missing_with_indent(source!(self, item.span).lo());
+ self.visit_enum(item.ident, &item.vis, def, generics, item.span);
+ self.last_pos = source!(self, item.span).hi();
+ }
+ ast::ItemKind::Mod(ref module) => {
+ let is_inline = !is_mod_decl(item);
+ self.format_missing_with_indent(source!(self, item.span).lo());
+ self.format_mod(module, &item.vis, item.span, item.ident, attrs, is_inline);
+ }
+ ast::ItemKind::MacCall(ref mac) => {
+ self.visit_mac(mac, Some(item.ident), MacroPosition::Item);
+ }
+ ast::ItemKind::ForeignMod(ref foreign_mod) => {
+ self.format_missing_with_indent(source!(self, item.span).lo());
+ self.format_foreign_mod(foreign_mod, item.span);
+ }
+ ast::ItemKind::Static(..) | ast::ItemKind::Const(..) => {
+ self.visit_static(&StaticParts::from_item(item));
+ }
+ ast::ItemKind::Fn(defaultness, ref fn_signature, ref generics, Some(ref body)) => {
+ let inner_attrs = inner_attributes(&item.attrs);
+ let fn_ctxt = match fn_signature.header.ext {
+ ast::Extern::None => visit::FnCtxt::Free,
+ _ => visit::FnCtxt::Foreign,
+ };
+ self.visit_fn(
+ visit::FnKind::Fn(
+ fn_ctxt,
+ item.ident,
+ &fn_signature,
+ &item.vis,
+ Some(body),
+ ),
+ generics,
+ &fn_signature.decl,
+ item.span,
+ defaultness,
+ Some(&inner_attrs),
+ )
+ }
+ ast::ItemKind::Fn(_, ref fn_signature, ref generics, None) => {
+ let indent = self.block_indent;
+ let rewrite = self.rewrite_required_fn(
+ indent,
+ item.ident,
+ &fn_signature,
+ generics,
+ item.span,
+ );
+
+ self.push_rewrite(item.span, rewrite);
+ }
+ ast::ItemKind::TyAlias(_, ref generics, ref generic_bounds, ref ty) => match ty {
+ Some(ty) => {
+ let rewrite = rewrite_type_alias(
+ item.ident,
+ Some(&*ty),
+ generics,
+ Some(generic_bounds),
+ &self.get_context(),
+ self.block_indent,
+ &item.vis,
+ item.span,
+ );
+ self.push_rewrite(item.span, rewrite);
+ }
+ None => {
+ let rewrite = rewrite_opaque_type(
+ &self.get_context(),
+ self.block_indent,
+ item.ident,
+ generic_bounds,
+ generics,
+ &item.vis,
+ item.span,
+ );
+ self.push_rewrite(item.span, rewrite);
+ }
+ },
+ ast::ItemKind::GlobalAsm(..) => {
+ let snippet = Some(self.snippet(item.span).to_owned());
+ self.push_rewrite(item.span, snippet);
+ }
+ ast::ItemKind::MacroDef(ref def) => {
+ let rewrite = rewrite_macro_def(
+ &self.get_context(),
+ self.shape(),
+ self.block_indent,
+ def,
+ item.ident,
+ &item.vis,
+ item.span,
+ );
+ self.push_rewrite(item.span, rewrite);
+ }
+ };