Skip to content

Commit f40881d

Browse files
rustfmt impl restriction
1 parent 9bf2494 commit f40881d

4 files changed

Lines changed: 95 additions & 3 deletions

File tree

src/tools/rustfmt/src/items.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,7 @@ pub(crate) fn format_trait(
11581158
constness,
11591159
is_auto,
11601160
safety,
1161+
ref impl_restriction,
11611162
ident,
11621163
ref generics,
11631164
ref bounds,
@@ -1166,11 +1167,12 @@ pub(crate) fn format_trait(
11661167

11671168
let mut result = String::with_capacity(128);
11681169
let header = format!(
1169-
"{}{}{}{}trait ",
1170+
"{}{}{}{}{}trait ",
11701171
format_visibility(context, &item.vis),
11711172
format_constness(constness),
11721173
format_safety(safety),
11731174
format_auto(is_auto),
1175+
format_impl_restriction(context, impl_restriction),
11741176
);
11751177
result.push_str(&header);
11761178

src/tools/rustfmt/src/utils.rs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use std::borrow::Cow;
22

33
use rustc_ast::YieldKind;
44
use rustc_ast::ast::{
5-
self, Attribute, MetaItem, MetaItemInner, MetaItemKind, NodeId, Path, Visibility,
6-
VisibilityKind,
5+
self, Attribute, ImplRestriction, MetaItem, MetaItemInner, MetaItemKind, NodeId, Path,
6+
RestrictionKind, Visibility, VisibilityKind,
77
};
88
use rustc_ast_pretty::pprust;
99
use rustc_span::{BytePos, LocalExpnId, Span, Symbol, SyntaxContext, sym, symbol};
@@ -74,6 +74,40 @@ pub(crate) fn format_visibility(
7474
}
7575
}
7676

77+
pub(crate) fn format_impl_restriction(
78+
context: &RewriteContext<'_>,
79+
impl_restriction: &ImplRestriction,
80+
) -> String {
81+
format_restriction("impl", context, &impl_restriction.kind)
82+
}
83+
84+
fn format_restriction(
85+
kw: &'static str,
86+
context: &RewriteContext<'_>,
87+
restriction: &RestrictionKind,
88+
) -> String {
89+
match restriction {
90+
RestrictionKind::Unrestricted => String::new(),
91+
RestrictionKind::Restricted {
92+
ref path,
93+
id: _,
94+
shorthand,
95+
} => {
96+
let Path { ref segments, .. } = **path;
97+
let mut segments_iter = segments.iter().map(|seg| rewrite_ident(context, seg.ident));
98+
if path.is_global() && segments_iter.next().is_none() {
99+
panic!("non-global path in {kw}(restricted)?");
100+
}
101+
// FIXME use `segments_iter.intersperse("::").collect::<String>()` once
102+
// `#![feature(iter_intersperse)]` is re-stabilized.
103+
let path = itertools::join(segments_iter, "::");
104+
let in_str = if *shorthand { "" } else { "in " };
105+
106+
format!("{kw}({in_str}{path}) ")
107+
}
108+
}
109+
}
110+
77111
#[inline]
78112
pub(crate) fn format_coro(coroutine_kind: &ast::CoroutineKind) -> &'static str {
79113
match coroutine_kind {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#![feature(impl_restriction)]
2+
3+
pub
4+
impl(crate)
5+
trait Foo {}
6+
7+
pub impl
8+
( in
9+
crate )
10+
trait
11+
Bar
12+
{}
13+
14+
pub
15+
impl ( in foo
16+
::
17+
bar )
18+
trait Baz {}
19+
20+
pub
21+
const
22+
impl
23+
(self)
24+
trait QuxConst {}
25+
26+
pub
27+
auto impl(
28+
super
29+
)
30+
trait QuxAuto {}
31+
32+
pub
33+
unsafe impl
34+
(in crate)
35+
trait QuxUnsafe {}
36+
37+
pub const
38+
unsafe impl
39+
(in super
40+
::foo)
41+
trait QuxConstUnsafe {}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#![feature(impl_restriction)]
2+
3+
pub impl(crate) trait Foo {}
4+
5+
pub impl(in crate) trait Bar {}
6+
7+
pub impl(in foo::bar) trait Baz {}
8+
9+
pub const impl(self) trait QuxConst {}
10+
11+
pub auto impl(super) trait QuxAuto {}
12+
13+
pub unsafe impl(in crate) trait QuxUnsafe {}
14+
15+
pub const unsafe impl(in super::foo) trait QuxConstUnsafe {}

0 commit comments

Comments
 (0)