Remove duplicated loop when computing doc cfgs · rust-lang/rust@d9f250a (original) (raw)
`@@ -1013,7 +1013,6 @@ pub(crate) fn extract_cfg_from_attrs<'a, I: Iterator<Item = &'a hir::Attribute>
`
1013
1013
`tcx: TyCtxt<'_>,
`
1014
1014
`hidden_cfg: &FxHashSet,
`
1015
1015
`) -> Option<Arc> {
`
1016
``
`-
let sess = tcx.sess;
`
1017
1016
`let doc_cfg_active = tcx.features().doc_cfg();
`
1018
1017
`let doc_auto_cfg_active = tcx.features().doc_auto_cfg();
`
1019
1018
``
`@@ -1034,9 +1033,27 @@ pub(crate) fn extract_cfg_from_attrs<'a, I: Iterator<Item = &'a hir::Attribute>
`
1034
1033
`.filter(|attr| attr.has_name(sym::cfg))
`
1035
1034
`.peekable();
`
1036
1035
`if doc_cfg.peek().is_some() && doc_cfg_active {
`
1037
``
`-
doc_cfg
`
1038
``
`-
.filter_map(|attr| Cfg::parse(&attr).ok())
`
1039
``
`-
.fold(Cfg::True, |cfg, new_cfg| cfg & new_cfg)
`
``
1036
`+
let sess = tcx.sess;
`
``
1037
`+
doc_cfg.fold(Cfg::True, |mut cfg, item| {
`
``
1038
`+
if let Some(cfg_mi) =
`
``
1039
`+
item.meta_item().and_then(|item| rustc_expand::config::parse_cfg(item, sess))
`
``
1040
`+
{
`
``
1041
`+
// The result is unused here but we can gate unstable predicates
`
``
1042
`+
rustc_attr_parsing::cfg_matches(
`
``
1043
`+
cfg_mi,
`
``
1044
`+
tcx.sess,
`
``
1045
`+
rustc_ast::CRATE_NODE_ID,
`
``
1046
`+
Some(tcx.features()),
`
``
1047
`+
);
`
``
1048
`+
match Cfg::parse(cfg_mi) {
`
``
1049
`+
Ok(new_cfg) => cfg &= new_cfg,
`
``
1050
`+
Err(e) => {
`
``
1051
`+
sess.dcx().span_err(e.span, e.msg);
`
``
1052
`+
}
`
``
1053
`+
}
`
``
1054
`+
}
`
``
1055
`+
cfg
`
``
1056
`+
})
`
1040
1057
`} else if doc_auto_cfg_active {
`
1041
1058
`` // If there is no doc(cfg())
, then we retrieve the cfg()
attributes (because
``
1042
1059
`` // doc(cfg())
overrides cfg()
).
``
`@@ -1053,40 +1070,6 @@ pub(crate) fn extract_cfg_from_attrs<'a, I: Iterator<Item = &'a hir::Attribute>
`
1053
1070
`Cfg::True
`
1054
1071
`};
`
1055
1072
``
1056
``
`-
for attr in attrs.clone() {
`
1057
``
`-
// #[doc]
`
1058
``
`-
if attr.doc_str().is_none() && attr.has_name(sym::doc) {
`
1059
``
`-
// #[doc(...)]
`
1060
``
`-
if let Some(list) = attr.meta_item_list() {
`
1061
``
`-
for item in list {
`
1062
``
`-
// #[doc(hidden)]
`
1063
``
`-
if !item.has_name(sym::cfg) {
`
1064
``
`-
continue;
`
1065
``
`-
}
`
1066
``
`-
// #[doc(cfg(...))]
`
1067
``
`-
if let Some(cfg_mi) = item
`
1068
``
`-
.meta_item()
`
1069
``
`-
.and_then(|item| rustc_expand::config::parse_cfg(item, sess))
`
1070
``
`-
{
`
1071
``
`-
// The result is unused here but we can gate unstable predicates
`
1072
``
`-
rustc_attr_parsing::cfg_matches(
`
1073
``
`-
cfg_mi,
`
1074
``
`-
tcx.sess,
`
1075
``
`-
rustc_ast::CRATE_NODE_ID,
`
1076
``
`-
Some(tcx.features()),
`
1077
``
`-
);
`
1078
``
`-
match Cfg::parse(cfg_mi) {
`
1079
``
`-
Ok(new_cfg) => cfg &= new_cfg,
`
1080
``
`-
Err(e) => {
`
1081
``
`-
sess.dcx().span_err(e.span, e.msg);
`
1082
``
`-
}
`
1083
``
`-
}
`
1084
``
`-
}
`
1085
``
`-
}
`
1086
``
`-
}
`
1087
``
`-
}
`
1088
``
`-
}
`
1089
``
-
1090
1073
`// treat #[target_feature(enable = "feat")] attributes as if they were
`
1091
1074
`// #[doc(cfg(target_feature = "feat"))] attributes as well
`
1092
1075
`for attr in hir_attr_lists(attrs, sym::target_feature) {
`