Skip to content

Commit ffaa6fc

Browse files
authored
Merge pull request #2661 from topecongiro/issue-2645
Preserve comments between attribute and use item
2 parents af5976c + 0c5631e commit ffaa6fc

File tree

4 files changed

+36
-14
lines changed

4 files changed

+36
-14
lines changed

Diff for: src/imports.rs

+24-12
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use syntax::ast::{self, UseTreeKind};
1515
use syntax::codemap::{self, BytePos, Span, DUMMY_SP};
1616

1717
use codemap::SpanUtils;
18+
use comment::combine_strs_with_missing_comments;
1819
use config::IndentStyle;
1920
use lists::{definitive_tactic, itemize_list, write_list, ListFormatting, ListItem, Separator};
2021
use rewrite::{Rewrite, RewriteContext};
@@ -118,6 +119,17 @@ impl PartialEq for UseTree {
118119
}
119120
impl Eq for UseTree {}
120121

122+
impl Spanned for UseTree {
123+
fn span(&self) -> Span {
124+
let lo = if let Some(ref attrs) = self.attrs {
125+
attrs.iter().next().map_or(self.span.lo(), |a| a.span.lo())
126+
} else {
127+
self.span.lo()
128+
};
129+
mk_sp(lo, self.span.hi())
130+
}
131+
}
132+
121133
impl UseSegment {
122134
// Clone a version of self with any top-level alias removed.
123135
fn remove_alias(&self) -> UseSegment {
@@ -219,26 +231,26 @@ impl fmt::Display for UseTree {
219231
impl UseTree {
220232
// Rewrite use tree with `use ` and a trailing `;`.
221233
pub fn rewrite_top_level(&self, context: &RewriteContext, shape: Shape) -> Option<String> {
222-
let mut result = String::with_capacity(256);
223-
if let Some(ref attrs) = self.attrs {
224-
result.push_str(&attrs.rewrite(context, shape)?);
225-
if !result.is_empty() {
226-
result.push_str(&shape.indent.to_string_with_newline(context.config));
227-
}
228-
}
229-
230234
let vis = self.visibility
231235
.as_ref()
232236
.map_or(Cow::from(""), |vis| ::utils::format_visibility(&vis));
233-
result.push_str(&self.rewrite(context, shape.offset_left(vis.len())?)
237+
let use_str = self.rewrite(context, shape.offset_left(vis.len())?)
234238
.map(|s| {
235239
if s.is_empty() {
236240
s.to_owned()
237241
} else {
238242
format!("{}use {};", vis, s)
239243
}
240-
})?);
241-
Some(result)
244+
})?;
245+
if let Some(ref attrs) = self.attrs {
246+
let attr_str = attrs.rewrite(context, shape)?;
247+
let lo = attrs.last().as_ref()?.span().hi();
248+
let hi = self.span.lo();
249+
let span = mk_sp(lo, hi);
250+
combine_strs_with_missing_comments(context, &attr_str, &use_str, span, shape, false)
251+
} else {
252+
Some(use_str)
253+
}
242254
}
243255

244256
// FIXME: Use correct span?
@@ -267,7 +279,7 @@ impl UseTree {
267279
use_tree,
268280
None,
269281
Some(item.vis.clone()),
270-
Some(item.span().lo()),
282+
Some(item.span.lo()),
271283
if item.attrs.is_empty() {
272284
None
273285
} else {

Diff for: src/reorder.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ fn rewrite_reorderable_items(
128128
cloned.iter(),
129129
"",
130130
";",
131-
|item| item.span.lo(),
132-
|item| item.span.hi(),
131+
|item| item.span().lo(),
132+
|item| item.span().hi(),
133133
|_item| Some("".to_owned()),
134134
span.lo(),
135135
span.hi(),

Diff for: tests/source/imports.rs

+5
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,8 @@ use a::{b::{c::*}};
8888
use a::{b::{c::{}}};
8989
use a::{b::{c::d}};
9090
use a::{b::{c::{xxx, yyy, zzz}}};
91+
92+
// #2645
93+
/// This line is not affected.
94+
// This line is deleted.
95+
use c;

Diff for: tests/target/imports.rs

+5
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,8 @@ use fooo::{baar::foobar::{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, yyyyyyyyyyyyyyyyyyyy
9595
use a::b::c::d;
9696
use a::b::c::*;
9797
use a::b::c::{xxx, yyy, zzz};
98+
99+
// #2645
100+
/// This line is not affected.
101+
// This line is deleted.
102+
use c;

0 commit comments

Comments
 (0)