diff --git a/src/items.rs b/src/items.rs index a11a02be2ae..039dd1e1ae0 100644 --- a/src/items.rs +++ b/src/items.rs @@ -125,6 +125,7 @@ impl Rewrite for ast::Local { // FIXME convert to using rewrite style rather than visitor // FIXME format modules in this style #[allow(dead_code)] +#[derive(Debug)] struct Item<'a> { unsafety: ast::Unsafe, abi: Cow<'static, str>, @@ -153,6 +154,7 @@ impl<'a> Item<'a> { } } +#[derive(Debug)] enum BodyElement<'a> { // Stmt(&'a ast::Stmt), // Field(&'a ast::Field), @@ -174,26 +176,10 @@ pub(crate) struct FnSig<'a> { } impl<'a> FnSig<'a> { - pub(crate) fn new( - decl: &'a ast::FnDecl, - generics: &'a ast::Generics, - vis: ast::Visibility, - ) -> FnSig<'a> { - FnSig { - decl, - generics, - ext: ast::Extern::None, - is_async: Cow::Owned(ast::Async::No), - constness: ast::Const::No, - defaultness: ast::Defaultness::Final, - unsafety: ast::Unsafe::No, - visibility: vis, - } - } - pub(crate) fn from_method_sig( method_sig: &'a ast::FnSig, generics: &'a ast::Generics, + visibility: ast::Visibility, ) -> FnSig<'a> { FnSig { unsafety: method_sig.header.unsafety, @@ -203,7 +189,7 @@ impl<'a> FnSig<'a> { ext: method_sig.header.ext, decl: &*method_sig.decl, generics, - visibility: DEFAULT_VISIBILITY, + visibility, } } @@ -216,9 +202,8 @@ impl<'a> FnSig<'a> { match *fn_kind { visit::FnKind::Fn(fn_ctxt, _, fn_sig, vis, _) => match fn_ctxt { visit::FnCtxt::Assoc(..) => { - let mut fn_sig = FnSig::from_method_sig(fn_sig, generics); + let mut fn_sig = FnSig::from_method_sig(fn_sig, generics, vis.clone()); fn_sig.defaultness = defaultness; - fn_sig.visibility = vis.clone(); fn_sig } _ => FnSig { @@ -347,7 +332,7 @@ impl<'a> FmtVisitor<'a> { &context, indent, ident, - &FnSig::from_method_sig(sig, generics), + &FnSig::from_method_sig(sig, generics, DEFAULT_VISIBILITY), span, FnBraceStyle::None, )?; @@ -3058,11 +3043,27 @@ impl Rewrite for ast::ForeignItem { let span = mk_sp(self.span.lo(), self.span.hi() - BytePos(1)); let item_str = match self.kind { - ast::ForeignItemKind::Fn(_, ref fn_sig, ref generics, _) => rewrite_fn_base( + ast::ForeignItemKind::Fn(defaultness, ref fn_sig, ref generics, Some(ref body)) => { + let mut visitor = FmtVisitor::from_context(context); + visitor.block_indent = shape.indent; + visitor.last_pos = self.span.lo(); + let inner_attrs = inner_attributes(&self.attrs); + let fn_ctxt = visit::FnCtxt::Foreign; + visitor.visit_fn( + visit::FnKind::Fn(fn_ctxt, self.ident, &fn_sig, &self.vis, Some(body)), + generics, + &fn_sig.decl, + self.span, + defaultness, + Some(&inner_attrs), + ); + Some(visitor.buffer.to_owned()) + } + ast::ForeignItemKind::Fn(_, ref fn_sig, ref generics, None) => rewrite_fn_base( context, shape.indent, self.ident, - &FnSig::new(&fn_sig.decl, generics, self.vis.clone()), + &FnSig::from_method_sig(&fn_sig, generics, self.vis.clone()), span, FnBraceStyle::None, ) diff --git a/src/visitor.rs b/src/visitor.rs index ecf72833195..3b9b0a2f967 100644 --- a/src/visitor.rs +++ b/src/visitor.rs @@ -370,7 +370,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> { // Note that this only gets called for function definitions. Required methods // on traits do not get handled here. - fn visit_fn( + pub(crate) fn visit_fn( &mut self, fk: visit::FnKind<'_>, generics: &ast::Generics, diff --git a/tests/source/extern.rs b/tests/source/extern.rs index 564c078ed2c..d0a033b1243 100644 --- a/tests/source/extern.rs +++ b/tests/source/extern.rs @@ -58,6 +58,20 @@ libc::c_long; , mode3: *const c_char, file: *mut FILE) -> *mut FILE; + + + const fn foo( + + ) -> + *mut Bar; + unsafe fn foo( + + ) -> * + mut + Bar; + + pub(super) const fn foo() -> *mut Bar; + pub(crate) unsafe fn foo() -> *mut Bar; } extern { diff --git a/tests/target/extern.rs b/tests/target/extern.rs index d25dba7d1bb..44ed6d4b475 100644 --- a/tests/target/extern.rs +++ b/tests/target/extern.rs @@ -73,6 +73,12 @@ extern "C" { mode3: *const c_char, file: *mut FILE, ) -> *mut FILE; + + const fn foo() -> *mut Bar; + unsafe fn foo() -> *mut Bar; + + pub(super) const fn foo() -> *mut Bar; + pub(crate) unsafe fn foo() -> *mut Bar; } extern "C" {} diff --git a/tests/target/issue-4313.rs b/tests/target/issue-4313.rs new file mode 100644 index 00000000000..c390ee6ba30 --- /dev/null +++ b/tests/target/issue-4313.rs @@ -0,0 +1,5 @@ +extern "C" { + fn f() { + fn g() {} + } +}