Skip to content

Commit 09c7688

Browse files
Simplify AttributesExt::cfg function and remove error emissions since they are not useful
1 parent 8fac41a commit 09c7688

File tree

3 files changed

+45
-27
lines changed

3 files changed

+45
-27
lines changed

Diff for: src/librustdoc/clean/types.rs

+10-27
Original file line numberDiff line numberDiff line change
@@ -776,48 +776,31 @@ impl AttributesExt for [ast::Attribute] {
776776
let sess = tcx.sess;
777777
let doc_cfg_active = tcx.features().doc_cfg;
778778

779-
trait SingleExt {
780-
type Item;
781-
fn single(self) -> Option<Self::Item>;
782-
}
783-
784-
impl<T: IntoIterator> SingleExt for T {
785-
type Item = T::Item;
786-
fn single(self) -> Option<Self::Item> {
787-
let mut iter = self.into_iter();
788-
let item = iter.next()?;
789-
if iter.next().is_some() {
790-
return None;
791-
}
792-
Some(item)
779+
fn single<T: IntoIterator>(it: T) -> Option<T::Item> {
780+
let mut iter = it.into_iter();
781+
let item = iter.next()?;
782+
if iter.next().is_some() {
783+
return None;
793784
}
785+
Some(item)
794786
}
795787

796788
let mut cfg = if doc_cfg_active {
797789
let mut doc_cfg = self
798790
.iter()
799791
.filter(|attr| attr.has_name(sym::doc))
800-
.filter_map(|attr| Some(attr.meta_item_list()?.single()?))
792+
.flat_map(|attr| attr.meta_item_list().unwrap_or_else(Vec::new))
801793
.filter(|attr| attr.has_name(sym::cfg))
802-
.filter_map(|attr| Some(attr.meta_item_list()?.single()?.meta_item()?.clone()))
803794
.peekable();
804795
if doc_cfg.peek().is_some() {
805796
doc_cfg
806-
.filter_map(|attr| {
807-
Cfg::parse(&attr)
808-
.map_err(|e| sess.diagnostic().span_err(e.span, e.msg))
809-
.ok()
810-
})
797+
.filter_map(|attr| Cfg::parse(attr.meta_item()?).ok())
811798
.fold(Cfg::True, |cfg, new_cfg| cfg & new_cfg)
812799
} else {
813800
self.iter()
814801
.filter(|attr| attr.has_name(sym::cfg))
815-
.filter_map(|attr| Some(attr.meta_item_list()?.single()?.meta_item()?.clone()))
816-
.filter_map(|attr| {
817-
Cfg::parse(&attr)
818-
.map_err(|e| sess.diagnostic().span_err(e.span, e.msg))
819-
.ok()
820-
})
802+
.filter_map(|attr| single(attr.meta_item_list()?))
803+
.filter_map(|attr| Cfg::parse(attr.meta_item()?).ok())
821804
.filter(|cfg| !hidden_cfg.contains(cfg))
822805
.fold(Cfg::True, |cfg, new_cfg| cfg & new_cfg)
823806
}

Diff for: src/test/rustdoc-ui/doc-cfg.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#![feature(doc_cfg)]
2+
3+
#[doc(cfg(), cfg(foo, bar))]
4+
//~^ ERROR
5+
//~^^ ERROR
6+
#[doc(cfg(foo), cfg(bar))] // ok!
7+
#[doc(cfg())] //~ ERROR
8+
#[doc(cfg(foo, bar))] //~ ERROR
9+
pub fn foo() {}

Diff for: src/test/rustdoc-ui/doc-cfg.stderr

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
error: `cfg` predicate is not specified
2+
--> $DIR/doc-cfg.rs:3:7
3+
|
4+
LL | #[doc(cfg(), cfg(foo, bar))]
5+
| ^^^^^
6+
7+
error: multiple `cfg` predicates are specified
8+
--> $DIR/doc-cfg.rs:3:23
9+
|
10+
LL | #[doc(cfg(), cfg(foo, bar))]
11+
| ^^^
12+
13+
error: `cfg` predicate is not specified
14+
--> $DIR/doc-cfg.rs:7:7
15+
|
16+
LL | #[doc(cfg())]
17+
| ^^^^^
18+
19+
error: multiple `cfg` predicates are specified
20+
--> $DIR/doc-cfg.rs:8:16
21+
|
22+
LL | #[doc(cfg(foo, bar))]
23+
| ^^^
24+
25+
error: aborting due to 4 previous errors
26+

0 commit comments

Comments
 (0)