rustdoc: Extract AttributesExt::lists trait method as function
The two implementations were identical, so there's no need to use a trait method.
This commit is contained in:
parent
e2fcdb8d36
commit
5ccd6c04e5
3 changed files with 24 additions and 35 deletions
|
|
@ -186,8 +186,7 @@ fn generate_item_with_correct_attrs(
|
|||
// For glob re-exports the item may or may not exist to be re-exported (potentially the cfgs
|
||||
// on the path up until the glob can be removed, and only cfgs on the globbed item itself
|
||||
// matter), for non-inlined re-exports see #85043.
|
||||
let is_inline = inline::load_attrs(cx, import_id.to_def_id())
|
||||
.lists(sym::doc)
|
||||
let is_inline = hir_attr_lists(inline::load_attrs(cx, import_id.to_def_id()), sym::doc)
|
||||
.get_word_attr(sym::inline)
|
||||
.is_some()
|
||||
|| (is_glob_import(cx.tcx, import_id)
|
||||
|
|
@ -979,13 +978,14 @@ fn clean_proc_macro<'tcx>(
|
|||
) -> ItemKind {
|
||||
let attrs = cx.tcx.hir().attrs(item.hir_id());
|
||||
if kind == MacroKind::Derive
|
||||
&& let Some(derive_name) = attrs.lists(sym::proc_macro_derive).find_map(|mi| mi.ident())
|
||||
&& let Some(derive_name) =
|
||||
hir_attr_lists(attrs, sym::proc_macro_derive).find_map(|mi| mi.ident())
|
||||
{
|
||||
*name = derive_name.name;
|
||||
}
|
||||
|
||||
let mut helpers = Vec::new();
|
||||
for mi in attrs.lists(sym::proc_macro_derive) {
|
||||
for mi in hir_attr_lists(attrs, sym::proc_macro_derive) {
|
||||
if !mi.has_name(sym::attributes) {
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2985,7 +2985,7 @@ fn clean_use_statement_inner<'tcx>(
|
|||
|
||||
let visibility = cx.tcx.visibility(import.owner_id);
|
||||
let attrs = cx.tcx.hir().attrs(import.hir_id());
|
||||
let inline_attr = attrs.lists(sym::doc).get_word_attr(sym::inline);
|
||||
let inline_attr = hir_attr_lists(attrs, sym::doc).get_word_attr(sym::inline);
|
||||
let pub_underscore = visibility.is_public() && name == kw::Underscore;
|
||||
let current_mod = cx.tcx.parent_module_from_def_id(import.owner_id.def_id);
|
||||
let import_def_id = import.owner_id.def_id;
|
||||
|
|
|
|||
|
|
@ -980,18 +980,24 @@ pub(crate) struct Module {
|
|||
}
|
||||
|
||||
pub(crate) trait AttributesExt {
|
||||
type AttributeIterator<'a>: Iterator<Item = ast::MetaItemInner>
|
||||
where
|
||||
Self: 'a;
|
||||
type Attributes<'a>: Iterator<Item = &'a hir::Attribute>
|
||||
where
|
||||
Self: 'a;
|
||||
|
||||
fn lists(&self, name: Symbol) -> Self::AttributeIterator<'_>;
|
||||
|
||||
fn iter(&self) -> Self::Attributes<'_>;
|
||||
}
|
||||
|
||||
pub fn hir_attr_lists<A: AttributesExt + ?Sized>(
|
||||
attrs: &A,
|
||||
name: Symbol,
|
||||
) -> impl Iterator<Item = ast::MetaItemInner> + use<'_, A> {
|
||||
attrs
|
||||
.iter()
|
||||
.filter(move |attr| attr.has_name(name))
|
||||
.filter_map(ast::attr::AttributeExt::meta_item_list)
|
||||
.flatten()
|
||||
}
|
||||
|
||||
pub fn extract_cfg_from_attrs<A: AttributesExt + ?Sized>(
|
||||
attrs: &A,
|
||||
tcx: TyCtxt<'_>,
|
||||
|
|
@ -1066,7 +1072,7 @@ pub fn extract_cfg_from_attrs<A: AttributesExt + ?Sized>(
|
|||
|
||||
// treat #[target_feature(enable = "feat")] attributes as if they were
|
||||
// #[doc(cfg(target_feature = "feat"))] attributes as well
|
||||
for attr in attrs.lists(sym::target_feature) {
|
||||
for attr in hir_attr_lists(attrs, sym::target_feature) {
|
||||
if attr.has_name(sym::enable) {
|
||||
if attr.value_str().is_some() {
|
||||
// Clone `enable = "feat"`, change to `target_feature = "feat"`.
|
||||
|
|
@ -1085,38 +1091,19 @@ pub fn extract_cfg_from_attrs<A: AttributesExt + ?Sized>(
|
|||
}
|
||||
|
||||
impl AttributesExt for [hir::Attribute] {
|
||||
type AttributeIterator<'a> = impl Iterator<Item = ast::MetaItemInner> + 'a;
|
||||
type Attributes<'a> = impl Iterator<Item = &'a hir::Attribute> + 'a;
|
||||
|
||||
fn lists(&self, name: Symbol) -> Self::AttributeIterator<'_> {
|
||||
self.iter()
|
||||
.filter(move |attr| attr.has_name(name))
|
||||
.filter_map(ast::attr::AttributeExt::meta_item_list)
|
||||
.flatten()
|
||||
}
|
||||
|
||||
fn iter(&self) -> Self::Attributes<'_> {
|
||||
self.iter()
|
||||
}
|
||||
}
|
||||
|
||||
impl AttributesExt for [(Cow<'_, hir::Attribute>, Option<DefId>)] {
|
||||
type AttributeIterator<'a>
|
||||
= impl Iterator<Item = ast::MetaItemInner> + 'a
|
||||
where
|
||||
Self: 'a;
|
||||
type Attributes<'a>
|
||||
= impl Iterator<Item = &'a hir::Attribute> + 'a
|
||||
where
|
||||
Self: 'a;
|
||||
|
||||
fn lists(&self, name: Symbol) -> Self::AttributeIterator<'_> {
|
||||
AttributesExt::iter(self)
|
||||
.filter(move |attr| attr.has_name(name))
|
||||
.filter_map(hir::Attribute::meta_item_list)
|
||||
.flatten()
|
||||
}
|
||||
|
||||
fn iter(&self) -> Self::Attributes<'_> {
|
||||
self.iter().map(move |(attr, _)| match attr {
|
||||
Cow::Borrowed(attr) => *attr,
|
||||
|
|
@ -1188,7 +1175,7 @@ pub(crate) struct Attributes {
|
|||
|
||||
impl Attributes {
|
||||
pub(crate) fn lists(&self, name: Symbol) -> impl Iterator<Item = ast::MetaItemInner> + '_ {
|
||||
self.other_attrs.lists(name)
|
||||
hir_attr_lists(&self.other_attrs[..], name)
|
||||
}
|
||||
|
||||
pub(crate) fn has_doc_flag(&self, flag: Symbol) -> bool {
|
||||
|
|
@ -1255,7 +1242,9 @@ impl Attributes {
|
|||
pub(crate) fn get_doc_aliases(&self) -> Box<[Symbol]> {
|
||||
let mut aliases = FxIndexSet::default();
|
||||
|
||||
for attr in self.other_attrs.lists(sym::doc).filter(|a| a.has_name(sym::alias)) {
|
||||
for attr in
|
||||
hir_attr_lists(&self.other_attrs[..], sym::doc).filter(|a| a.has_name(sym::alias))
|
||||
{
|
||||
if let Some(values) = attr.meta_item_list() {
|
||||
for l in values {
|
||||
if let Some(lit) = l.lit()
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ use tracing::debug;
|
|||
|
||||
use crate::clean::cfg::Cfg;
|
||||
use crate::clean::utils::{inherits_doc_hidden, should_ignore_res};
|
||||
use crate::clean::{AttributesExt, NestedAttributesExt, reexport_chain};
|
||||
use crate::clean::{NestedAttributesExt, hir_attr_lists, reexport_chain};
|
||||
use crate::core;
|
||||
|
||||
/// This module is used to store stuff from Rust's AST in a more convenient
|
||||
|
|
@ -247,8 +247,8 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
let document_hidden = self.cx.render_options.document_hidden;
|
||||
let use_attrs = tcx.hir().attrs(tcx.local_def_id_to_hir_id(def_id));
|
||||
// Don't inline `doc(hidden)` imports so they can be stripped at a later stage.
|
||||
let is_no_inline = use_attrs.lists(sym::doc).has_word(sym::no_inline)
|
||||
|| (document_hidden && use_attrs.lists(sym::doc).has_word(sym::hidden));
|
||||
let is_no_inline = hir_attr_lists(use_attrs, sym::doc).has_word(sym::no_inline)
|
||||
|| (document_hidden && hir_attr_lists(use_attrs, sym::doc).has_word(sym::hidden));
|
||||
|
||||
if is_no_inline {
|
||||
return false;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue