diff --git a/src/imports.rs b/src/imports.rs index 2f26791639a..1d0caf5a2e4 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -700,6 +700,12 @@ impl UseTree { if self.path.is_empty() || self.contains_comment() { return vec![self]; } + let (mut doc_comments, attributes): (ast::AttrVec, ast::AttrVec) = self + .attrs + .iter() + .cloned() + .flat_map(|attrs| attrs.into_iter()) + .partition(|attr| attr.is_doc_comment()); match &self.path.clone().last().unwrap().kind { UseSegmentKind::List(list) => { if list.len() == 1 && list[0].path.len() == 1 { @@ -720,7 +726,12 @@ impl UseTree { visibility: self.visibility.clone(), // only retain attributes for `ImportGranularity::Item` attrs: match import_granularity { - ImportGranularity::Item => self.attrs.clone(), + ImportGranularity::Item => Some( + doc_comments + .drain(..) + .chain(attributes.iter().cloned()) + .collect(), + ), _ => None, }, }); diff --git a/tests/source/issue-6927/rustdoc_comment.rs b/tests/source/issue-6927/rustdoc_comment.rs new file mode 100644 index 00000000000..806e32562e6 --- /dev/null +++ b/tests/source/issue-6927/rustdoc_comment.rs @@ -0,0 +1,10 @@ +// rustfmt-imports_granularity: Item + +/// rustdoc comment +use a::{a, b, c}; + +// standard comment +use b::{a, b, c}; + +#[doc = "also rustdoc comment"] +use c::{a, b, c}; diff --git a/tests/target/issue-6927/rustdoc_comment.rs b/tests/target/issue-6927/rustdoc_comment.rs new file mode 100644 index 00000000000..80a92ac7a36 --- /dev/null +++ b/tests/target/issue-6927/rustdoc_comment.rs @@ -0,0 +1,18 @@ +// rustfmt-imports_granularity: Item + +/// rustdoc comment +use a::a; +use a::b; +use a::c; + +// standard comment +use b::a; +use b::b; +use b::c; + +#[doc = "also rustdoc comment"] +use c::a; +#[doc = "also rustdoc comment"] +use c::b; +#[doc = "also rustdoc comment"] +use c::c;