From 58c1aac73905bc859a273b053ad2b2bb4bd595a2 Mon Sep 17 00:00:00 2001 From: Vanand Gasparyan Date: Mon, 25 May 2026 19:53:09 +0200 Subject: [PATCH 1/2] Add test for issue #6927. --- tests/source/issue-6927/rustdoc_comment.rs | 10 ++++++++++ tests/target/issue-6927/rustdoc_comment.rs | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/source/issue-6927/rustdoc_comment.rs create mode 100644 tests/target/issue-6927/rustdoc_comment.rs 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..5599ad2fe44 --- /dev/null +++ b/tests/target/issue-6927/rustdoc_comment.rs @@ -0,0 +1,20 @@ +// rustfmt-imports_granularity: Item + +/// rustdoc comment +use a::a; +/// rustdoc comment +use a::b; +/// rustdoc comment +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; From d97422902b689e61882ee32add79d711a2df925d Mon Sep 17 00:00:00 2001 From: Vanand Gasparyan Date: Tue, 26 May 2026 01:02:07 +0200 Subject: [PATCH 2/2] Retain attributes when flattening for `ImportGranularity::Item` but not rustdoc comments. `rustc_ast::ast::Attribute` represents both attributes (`#[...]`) and rustdoc comments (`///...`). When flattening an import tree, it makes sense to repeat the attributes for each item. Rustdoc comments, however, don't make sense for each item. Fixes issue#6927. --- src/imports.rs | 13 ++++++++++++- tests/target/issue-6927/rustdoc_comment.rs | 2 -- 2 files changed, 12 insertions(+), 3 deletions(-) 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/target/issue-6927/rustdoc_comment.rs b/tests/target/issue-6927/rustdoc_comment.rs index 5599ad2fe44..80a92ac7a36 100644 --- a/tests/target/issue-6927/rustdoc_comment.rs +++ b/tests/target/issue-6927/rustdoc_comment.rs @@ -2,9 +2,7 @@ /// rustdoc comment use a::a; -/// rustdoc comment use a::b; -/// rustdoc comment use a::c; // standard comment