From f364a7ec43a0cd50c7fa1f663f1ec8c30c5f3131 Mon Sep 17 00:00:00 2001 From: Marcus Klaas Date: Mon, 18 Apr 2016 18:39:40 +0200 Subject: [PATCH] Add option to force explicit extern ABI's --- src/config.rs | 1 + src/items.rs | 5 +++-- src/types.rs | 2 +- src/utils.rs | 9 ++++++--- tests/source/extern_not_explicit.rs | 14 ++++++++++++++ tests/target/extern_not_explicit.rs | 15 +++++++++++++++ 6 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 tests/source/extern_not_explicit.rs create mode 100644 tests/target/extern_not_explicit.rs diff --git a/src/config.rs b/src/config.rs index 82715c2164a..5632e9a925c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -328,6 +328,7 @@ create_config! { "Maximum width of the args of a function call before falling back to vertical formatting"; struct_lit_width: usize, 16, "Maximum width in the body of a struct lit before falling back to vertical formatting"; + force_explicit_abi: bool, true, "Always print the abi for extern items"; newline_style: NewlineStyle, NewlineStyle::Unix, "Unix or Windows line endings"; fn_brace_style: BraceStyle, BraceStyle::SameLineWhere, "Brace style for functions"; item_brace_style: BraceStyle, BraceStyle::SameLineWhere, "Brace style for structs and enums"; diff --git a/src/items.rs b/src/items.rs index cee1fc4f13e..2566d9a436b 100644 --- a/src/items.rs +++ b/src/items.rs @@ -80,7 +80,8 @@ impl Rewrite for ast::Local { impl<'a> FmtVisitor<'a> { pub fn format_foreign_mod(&mut self, fm: &ast::ForeignMod, span: Span) { - self.buffer.push_str(&::utils::format_abi(fm.abi)); + let abi_str = ::utils::format_abi(fm.abi, self.config.force_explicit_abi); + self.buffer.push_str(&abi_str); let snippet = self.snippet(span); let brace_pos = snippet.find_uncommented("{").unwrap(); @@ -1265,7 +1266,7 @@ fn rewrite_fn_base(context: &RewriteContext, result.push_str(::utils::format_unsafety(unsafety)); if abi != abi::Abi::Rust { - result.push_str(&::utils::format_abi(abi)); + result.push_str(&::utils::format_abi(abi, context.config.force_explicit_abi)); } // fn foo diff --git a/src/types.rs b/src/types.rs index 09cf7e12126..22b518d2463 100644 --- a/src/types.rs +++ b/src/types.rs @@ -608,7 +608,7 @@ fn rewrite_bare_fn(bare_fn: &ast::BareFnTy, result.push_str(&::utils::format_unsafety(bare_fn.unsafety)); if bare_fn.abi != abi::Abi::Rust { - result.push_str(&::utils::format_abi(bare_fn.abi)); + result.push_str(&::utils::format_abi(bare_fn.abi, context.config.force_explicit_abi)); } result.push_str("fn"); diff --git a/src/utils.rs b/src/utils.rs index f9debdbcec3..667c9cd7efd 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -91,9 +91,12 @@ pub fn format_mutability(mutability: ast::Mutability) -> &'static str { } #[inline] -// FIXME(#451): include "C"? -pub fn format_abi(abi: abi::Abi) -> String { - format!("extern {} ", abi) +pub fn format_abi(abi: abi::Abi, explicit_abi: bool) -> String { + if abi == abi::Abi::C && !explicit_abi { + "extern ".into() + } else { + format!("extern {} ", abi) + } } // The width of the first line in s. diff --git a/tests/source/extern_not_explicit.rs b/tests/source/extern_not_explicit.rs new file mode 100644 index 00000000000..9d6c4c2a1cd --- /dev/null +++ b/tests/source/extern_not_explicit.rs @@ -0,0 +1,14 @@ +// rustfmt-force_explicit_abi: false + + extern "C" { + fn some_fn() -> (); + } + + extern "C" fn sup() { + + } + +type funky_func = extern "C" fn (unsafe extern "rust-call" fn(*const JSJitInfo, *mut JSContext, + HandleObject, *mut libc::c_void, u32, + *mut JSVal) + -> u8); diff --git a/tests/target/extern_not_explicit.rs b/tests/target/extern_not_explicit.rs new file mode 100644 index 00000000000..b0f64c4f1cf --- /dev/null +++ b/tests/target/extern_not_explicit.rs @@ -0,0 +1,15 @@ +// rustfmt-force_explicit_abi: false + +extern { + fn some_fn() -> (); +} + +extern fn sup() {} + +type funky_func = extern fn(unsafe extern "rust-call" fn(*const JSJitInfo, + *mut JSContext, + HandleObject, + *mut libc::c_void, + u32, + *mut JSVal) + -> u8);