Skip to content

Commit 7405f16

Browse files
committed
Fix indent for merge_imports
Example --- ```rust mod tests { use foo$0::bar; use foo::baz; fn feature() {} } ``` **Before this PR** ```rust mod tests { use foo::{bar, baz}; fn feature() {} } ``` **After this PR** ```rust mod tests { use foo::{bar, baz}; fn feature() {} } ```
1 parent 9d58a93 commit 7405f16

File tree

2 files changed

+74
-9
lines changed

2 files changed

+74
-9
lines changed

crates/ide-assists/src/handlers/merge_imports.rs

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,21 @@ trait Merge: AstNode + Clone {
106106
) -> Option<Vec<Edit>> {
107107
let mut edits = Vec::new();
108108
let mut merged = self.clone();
109+
let mut replace = self;
110+
let mut update_replace = |item: Self| {
111+
if item.syntax().text_range().start() < replace.syntax().text_range().start() {
112+
std::mem::replace(&mut replace, item)
113+
} else {
114+
item
115+
}
116+
};
117+
109118
for item in items {
110119
merged = merged.try_merge(&item, cfg)?;
111-
edits.push(Edit::Remove(item.into_either()));
120+
edits.push(Edit::Remove(update_replace(item).into_either()));
112121
}
113122
if !edits.is_empty() {
114-
edits.push(Edit::replace(self, merged));
123+
edits.push(Edit::replace(replace, merged));
115124
Some(edits)
116125
} else {
117126
None
@@ -563,6 +572,62 @@ use foo::{bar, baz};
563572
);
564573
}
565574

575+
#[test]
576+
fn mod_indent_whitespace() {
577+
check_assist(
578+
merge_imports,
579+
r"
580+
mod tests {
581+
use foo$0::bar;
582+
use foo::baz;
583+
fn feature() {}
584+
}
585+
",
586+
r"
587+
mod tests {
588+
use foo::{bar, baz};
589+
fn feature() {}
590+
}
591+
",
592+
);
593+
check_assist(
594+
merge_imports,
595+
r"
596+
mod tests {
597+
use foo$0::bar;
598+
use foo::baz;
599+
600+
fn feature() {}
601+
}
602+
",
603+
r"
604+
mod tests {
605+
use foo::{bar, baz};
606+
607+
fn feature() {}
608+
}
609+
",
610+
);
611+
check_assist(
612+
merge_imports,
613+
r"
614+
mod tests {
615+
use foo::bar;
616+
use foo$0::baz;
617+
618+
fn feature() {}
619+
}
620+
",
621+
r"
622+
mod tests {
623+
use foo::{bar, baz};
624+
625+
fn feature() {}
626+
}
627+
",
628+
);
629+
}
630+
566631
#[test]
567632
fn works_with_trailing_comma() {
568633
check_assist(

crates/syntax/src/syntax_editor/edits.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -214,18 +214,18 @@ impl Removable for ast::Use {
214214
fn remove(&self, editor: &mut SyntaxEditor) {
215215
let make = SyntaxFactory::without_mappings();
216216

217-
let next_ws = self
217+
let prev_ws = self
218218
.syntax()
219-
.next_sibling_or_token()
219+
.prev_sibling_or_token()
220220
.and_then(|it| it.into_token())
221221
.and_then(ast::Whitespace::cast);
222-
if let Some(next_ws) = next_ws {
223-
let ws_text = next_ws.syntax().text();
224-
if let Some(rest) = ws_text.strip_prefix('\n') {
222+
if let Some(prev_ws) = prev_ws {
223+
let ws_text = prev_ws.syntax().text();
224+
if let Some(rest) = ws_text.trim_end_matches(' ').strip_suffix('\n') {
225225
if rest.is_empty() {
226-
editor.delete(next_ws.syntax());
226+
editor.delete(prev_ws.syntax());
227227
} else {
228-
editor.replace(next_ws.syntax(), make.whitespace(rest));
228+
editor.replace(prev_ws.syntax(), make.whitespace(rest));
229229
}
230230
}
231231
}

0 commit comments

Comments
 (0)