Skip to content

Commit 5225b64

Browse files
committed
Handle pub(restricted)
This commit properly handles pub(restricted) as introduced in RFC 1422 [0]. The syntax support was added in rust-lang#971, but they were not correctly formatted. [0] https://github.com/rust-lang/rfcs/blob/master/text/1422-pub-restricted.md Fixes rust-lang#970
1 parent d6bcfce commit 5225b64

File tree

8 files changed

+140
-25
lines changed

8 files changed

+140
-25
lines changed

Cargo.lock

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ syntex_syntax = "0.32"
2525
log = "0.3"
2626
env_logger = "0.3"
2727
getopts = "0.2"
28+
itertools = "0.4.15"

src/items.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,7 @@ impl<'a> FmtVisitor<'a> {
139139
ast::ForeignItemKind::Static(ref ty, is_mutable) => {
140140
// FIXME(#21): we're dropping potential comments in between the
141141
// function keywords here.
142-
let vis = match format_visibility(&item.vis) {
143-
Some(s) => s,
144-
None => return,
145-
};
142+
let vis = format_visibility(&item.vis);
146143
let mut_str = if is_mutable {
147144
"mut "
148145
} else {
@@ -453,7 +450,7 @@ pub fn format_impl(context: &RewriteContext, item: &ast::Item, offset: Indent) -
453450
ref self_ty,
454451
ref items) = item.node {
455452
let mut result = String::new();
456-
result.push_str(try_opt!(format_visibility(&item.vis)));
453+
result.push_str(&*format_visibility(&item.vis));
457454
result.push_str(format_unsafety(unsafety));
458455
result.push_str("impl");
459456

@@ -623,7 +620,7 @@ pub fn format_trait(context: &RewriteContext, item: &ast::Item, offset: Indent)
623620
item.node {
624621
let mut result = String::new();
625622
let header = format!("{}{}trait {}",
626-
try_opt!(format_visibility(&item.vis)),
623+
format_visibility(&item.vis),
627624
format_unsafety(unsafety),
628625
item.ident);
629626

@@ -945,7 +942,7 @@ pub fn rewrite_type_alias(context: &RewriteContext,
945942
-> Option<String> {
946943
let mut result = String::new();
947944

948-
result.push_str(&try_opt!(format_visibility(&vis)));
945+
result.push_str(&format_visibility(&vis));
949946
result.push_str("type ");
950947
result.push_str(&ident.to_string());
951948

@@ -1013,7 +1010,7 @@ impl Rewrite for ast::StructField {
10131010
}
10141011

10151012
let name = self.ident;
1016-
let vis = try_opt!(format_visibility(&self.vis));
1013+
let vis = format_visibility(&self.vis);
10171014
let mut attr_str = try_opt!(self.attrs
10181015
.rewrite(context, context.config.max_width - offset.width(), offset));
10191016
if !attr_str.is_empty() {
@@ -1042,7 +1039,7 @@ pub fn rewrite_static(prefix: &str,
10421039
context: &RewriteContext)
10431040
-> Option<String> {
10441041
let prefix = format!("{}{} {}{}: ",
1045-
try_opt!(format_visibility(vis)),
1042+
format_visibility(vis),
10461043
prefix,
10471044
format_mutability(mutability),
10481045
ident);
@@ -1260,7 +1257,7 @@ fn rewrite_fn_base(context: &RewriteContext,
12601257

12611258
let mut result = String::with_capacity(1024);
12621259
// Vis unsafety abi.
1263-
result.push_str(try_opt!(format_visibility(vis)));
1260+
result.push_str(&*format_visibility(vis));
12641261

12651262
if let ast::Constness::Const = constness {
12661263
result.push_str("const ");
@@ -1817,7 +1814,7 @@ fn rewrite_where_clause(context: &RewriteContext,
18171814
}
18181815

18191816
fn format_header(item_name: &str, ident: ast::Ident, vis: &ast::Visibility) -> Option<String> {
1820-
Some(format!("{}{}{}", try_opt!(format_visibility(vis)), item_name, ident))
1817+
Some(format!("{}{}{}", format_visibility(vis), item_name, ident))
18211818
}
18221819

18231820
fn format_generics(context: &RewriteContext,

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ extern crate unicode_segmentation;
2424
extern crate regex;
2525
extern crate diff;
2626
extern crate term;
27+
extern crate itertools;
2728

2829
use syntax::ast;
2930
use syntax::codemap::{mk_sp, CodeMap, Span};

src/utils.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11+
use std::borrow::Cow;
1112
use std::cmp::Ordering;
1213

13-
use syntax::ast::{self, Visibility, Attribute, MetaItem, MetaItemKind};
14+
use itertools::Itertools;
15+
16+
use syntax::ast::{self, Visibility, Attribute, MetaItem, MetaItemKind, Path};
1417
use syntax::codemap::{CodeMap, Span, BytePos};
1518
use syntax::abi;
1619

@@ -66,14 +69,24 @@ pub fn extra_offset(text: &str, offset: Indent) -> usize {
6669
}
6770
}
6871

72+
// Uses Cow to avoid allocating in the common cases.
6973
#[inline]
70-
pub fn format_visibility(vis: &Visibility) -> Option<&'static str> {
74+
pub fn format_visibility(vis: &Visibility) -> Cow<'static, str> {
7175
match *vis {
72-
Visibility::Public => Some("pub "),
73-
Visibility::Inherited => Some(""),
74-
// FIXME(#970): Handle new visibility types.
75-
Visibility::Crate(_) => None,
76-
Visibility::Restricted { .. } => None,
76+
Visibility::Public => Cow::from("pub "),
77+
Visibility::Inherited => Cow::from(""),
78+
Visibility::Crate(_) => Cow::from("pub(crate) "),
79+
Visibility::Restricted { ref path, .. } => {
80+
let Path { global, ref segments, .. } = **path;
81+
let prefix = if global {
82+
"::"
83+
} else {
84+
""
85+
};
86+
let mut segments_iter = segments.iter().map(|seg| seg.identifier.name.as_str());
87+
88+
Cow::from(format!("pub({}{}) ", prefix, segments_iter.join("::")))
89+
}
7790
}
7891
}
7992

src/visitor.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -502,9 +502,7 @@ impl<'a> FmtVisitor<'a> {
502502
let local_file_name = self.codemap.span_to_filename(s);
503503
let is_internal = local_file_name == self.codemap.span_to_filename(source!(self, m.inner));
504504

505-
if let Some(vis) = utils::format_visibility(vis) {
506-
self.buffer.push_str(vis);
507-
}
505+
self.buffer.push_str(&*utils::format_visibility(vis));
508506
self.buffer.push_str("mod ");
509507
self.buffer.push_str(&ident.to_string());
510508

@@ -540,10 +538,7 @@ impl<'a> FmtVisitor<'a> {
540538
}
541539

542540
fn format_import(&mut self, vis: &ast::Visibility, vp: &ast::ViewPath, span: Span) {
543-
let vis = match utils::format_visibility(vis) {
544-
Some(s) => s,
545-
None => return,
546-
};
541+
let vis = utils::format_visibility(vis);
547542
let mut offset = self.block_indent;
548543
offset.alignment += vis.len() + "use ".len();
549544
// 1 = ";"

tests/source/pub-restricted.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
pub( super ) enum WriteState<D> {
2+
WriteId {
3+
id: U64Writer,
4+
size: U64Writer,
5+
payload: Option<Writer<D>>,
6+
},
7+
WriteSize {
8+
size: U64Writer,
9+
payload: Option<Writer<D>>,
10+
},
11+
WriteData(Writer<D>),
12+
}
13+
14+
pub( crate ) enum WriteState<D> {
15+
WriteId {
16+
id: U64Writer,
17+
size: U64Writer,
18+
payload: Option<Writer<D>>,
19+
},
20+
WriteSize {
21+
size: U64Writer,
22+
payload: Option<Writer<D>>,
23+
},
24+
WriteData(Writer<D>),
25+
}
26+
27+
pub( ::global:: path :: to::some_mod ) enum WriteState<D> {
28+
WriteId {
29+
id: U64Writer,
30+
size: U64Writer,
31+
payload: Option<Writer<D>>,
32+
},
33+
WriteSize {
34+
size: U64Writer,
35+
payload: Option<Writer<D>>,
36+
},
37+
WriteData(Writer<D>),
38+
}
39+
40+
pub( local:: path :: to::some_mod ) enum WriteState<D> {
41+
WriteId {
42+
id: U64Writer,
43+
size: U64Writer,
44+
payload: Option<Writer<D>>,
45+
},
46+
WriteSize {
47+
size: U64Writer,
48+
payload: Option<Writer<D>>,
49+
},
50+
WriteData(Writer<D>),
51+
}

tests/target/pub-restricted.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
pub(super) enum WriteState<D> {
2+
WriteId {
3+
id: U64Writer,
4+
size: U64Writer,
5+
payload: Option<Writer<D>>,
6+
},
7+
WriteSize {
8+
size: U64Writer,
9+
payload: Option<Writer<D>>,
10+
},
11+
WriteData(Writer<D>),
12+
}
13+
14+
pub(crate) enum WriteState<D> {
15+
WriteId {
16+
id: U64Writer,
17+
size: U64Writer,
18+
payload: Option<Writer<D>>,
19+
},
20+
WriteSize {
21+
size: U64Writer,
22+
payload: Option<Writer<D>>,
23+
},
24+
WriteData(Writer<D>),
25+
}
26+
27+
pub(::global::path::to::some_mod) enum WriteState<D> {
28+
WriteId {
29+
id: U64Writer,
30+
size: U64Writer,
31+
payload: Option<Writer<D>>,
32+
},
33+
WriteSize {
34+
size: U64Writer,
35+
payload: Option<Writer<D>>,
36+
},
37+
WriteData(Writer<D>),
38+
}
39+
40+
pub(local::path::to::some_mod) enum WriteState<D> {
41+
WriteId {
42+
id: U64Writer,
43+
size: U64Writer,
44+
payload: Option<Writer<D>>,
45+
},
46+
WriteSize {
47+
size: U64Writer,
48+
payload: Option<Writer<D>>,
49+
},
50+
WriteData(Writer<D>),
51+
}

0 commit comments

Comments
 (0)