From 715c19e75e0e2a88f6c0a5ec8c13ee77737c4798 Mon Sep 17 00:00:00 2001 From: Yusuke Tanaka Date: Sat, 13 Feb 2021 01:13:50 +0900 Subject: [PATCH 1/2] Refactor `get_word_attr` to return only `Option` --- src/librustdoc/clean/mod.rs | 3 ++- src/librustdoc/clean/types.rs | 9 +++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 331bb2a73f962..9a4a9e19e2247 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2163,7 +2163,8 @@ fn clean_use_statement( return Vec::new(); } - let (doc_meta_item, please_inline) = import.attrs.lists(sym::doc).get_word_attr(sym::inline); + let doc_meta_item = import.attrs.lists(sym::doc).get_word_attr(sym::inline); + let please_inline = doc_meta_item.is_some(); let pub_underscore = import.vis.node.is_pub() && name == kw::Underscore; if pub_underscore && please_inline { diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 754f1c2eeeb21..a691819ab7740 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -438,7 +438,7 @@ impl AttributesExt for [ast::Attribute] { crate trait NestedAttributesExt { /// Returns `true` if the attribute list contains a specific `Word` fn has_word(self, word: Symbol) -> bool; - fn get_word_attr(self, word: Symbol) -> (Option, bool); + fn get_word_attr(self, word: Symbol) -> Option; } impl + IntoIterator> @@ -448,11 +448,8 @@ impl + IntoIterator (Option, bool) { - match self.find(|attr| attr.is_word() && attr.has_name(word)) { - Some(a) => (Some(a), true), - None => (None, false), - } + fn get_word_attr(mut self, word: Symbol) -> Option { + self.find(|attr| attr.is_word() && attr.has_name(word)) } } From 681cccad571c99673be4e2ad14bc2048e8894ac8 Mon Sep 17 00:00:00 2001 From: Yusuke Tanaka Date: Sat, 13 Feb 2021 01:48:00 +0900 Subject: [PATCH 2/2] Rename to `inline_attr` and use if-let to extract `NestedMetaItem` --- src/librustdoc/clean/mod.rs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 9a4a9e19e2247..7fc7d9f541cbb 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2163,19 +2163,20 @@ fn clean_use_statement( return Vec::new(); } - let doc_meta_item = import.attrs.lists(sym::doc).get_word_attr(sym::inline); - let please_inline = doc_meta_item.is_some(); + let inline_attr = import.attrs.lists(sym::doc).get_word_attr(sym::inline); let pub_underscore = import.vis.node.is_pub() && name == kw::Underscore; - if pub_underscore && please_inline { - rustc_errors::struct_span_err!( - cx.tcx.sess, - doc_meta_item.unwrap().span(), - E0780, - "anonymous imports cannot be inlined" - ) - .span_label(import.span, "anonymous import") - .emit(); + if pub_underscore { + if let Some(ref inline) = inline_attr { + rustc_errors::struct_span_err!( + cx.tcx.sess, + inline.span(), + E0780, + "anonymous imports cannot be inlined" + ) + .span_label(import.span, "anonymous import") + .emit(); + } } // We consider inlining the documentation of `pub use` statements, but we @@ -2208,7 +2209,7 @@ fn clean_use_statement( } Import::new_glob(resolve_use_source(cx, path), true) } else { - if !please_inline { + if inline_attr.is_none() { if let Res::Def(DefKind::Mod, did) = path.res { if !did.is_local() && did.index == CRATE_DEF_INDEX { // if we're `pub use`ing an extern crate root, don't inline it unless we