Skip to content

Commit 825e155

Browse files
committed
refactor ABI formatting
Here are two paths of behavior this changes: 1. whenever we see an `extern "Rust"` on a function, we don't strip it from the function (which fixes rust-lang#5701) 2. if `force_explicit_abi` is disabled, we preserve what the user has written. Previously, rustfmt would change `extern "C"` to `extern `, which is not something a code formatter should do.
1 parent a72613b commit 825e155

File tree

5 files changed

+12
-23
lines changed

5 files changed

+12
-23
lines changed

src/items.rs

-2
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ impl<'a> Item<'a> {
248248
abi: format_extern(
249249
ast::Extern::from_abi(fm.abi, DUMMY_SP),
250250
config.force_explicit_abi(),
251-
true,
252251
),
253252
vis: None,
254253
body: fm
@@ -336,7 +335,6 @@ impl<'a> FnSig<'a> {
336335
result.push_str(&format_extern(
337336
self.ext,
338337
context.config.force_explicit_abi(),
339-
false,
340338
));
341339
result
342340
}

src/types.rs

-1
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,6 @@ fn rewrite_bare_fn(
892892
result.push_str(&format_extern(
893893
bare_fn.ext,
894894
context.config.force_explicit_abi(),
895-
false,
896895
));
897896

898897
result.push_str("fn");

src/utils.rs

+8-17
Original file line numberDiff line numberDiff line change
@@ -131,23 +131,14 @@ pub(crate) fn format_mutability(mutability: ast::Mutability) -> &'static str {
131131
}
132132

133133
#[inline]
134-
pub(crate) fn format_extern(
135-
ext: ast::Extern,
136-
explicit_abi: bool,
137-
is_mod: bool,
138-
) -> Cow<'static, str> {
139-
let abi = match ext {
140-
ast::Extern::None => "Rust".to_owned(),
141-
ast::Extern::Implicit(_) => "C".to_owned(),
142-
ast::Extern::Explicit(abi, _) => abi.symbol_unescaped.to_string(),
143-
};
144-
145-
if abi == "Rust" && !is_mod {
146-
Cow::from("")
147-
} else if abi == "C" && !explicit_abi {
148-
Cow::from("extern ")
149-
} else {
150-
Cow::from(format!(r#"extern "{}" "#, abi))
134+
pub(crate) fn format_extern(ext: ast::Extern, force_explicit_abi: bool) -> Cow<'static, str> {
135+
match ext {
136+
ast::Extern::None => Cow::from(""),
137+
ast::Extern::Implicit(_) if force_explicit_abi => Cow::from("extern \"C\" "),
138+
ast::Extern::Implicit(_) => Cow::from("extern "),
139+
ast::Extern::Explicit(abi, _) => {
140+
Cow::from(format!(r#"extern "{}" "#, abi.symbol_unescaped))
141+
}
151142
}
152143
}
153144

tests/target/extern-rust.rs

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
extern "Rust" fn uwu() {}

tests/target/extern_not_explicit.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// rustfmt-force_explicit_abi: false
22

3-
extern {
3+
extern "C" {
44
fn some_fn() -> ();
55
}
66

7-
extern fn sup() {}
7+
extern "C" fn sup() {}
88

9-
type funky_func = extern fn(
9+
type funky_func = extern "C" fn(
1010
unsafe extern "rust-call" fn(
1111
*const JSJitInfo,
1212
*mut JSContext,

0 commit comments

Comments
 (0)