Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 9bc2ee3

Browse files
11477: fix: Fix cases where `Merge Imports` would drop imports. r=DropDemBits a=DropDemBits Fixes rust-lang#11466 Co-authored-by: DropDemBits <[email protected]>
2 parents aafa40c + a1a23d3 commit 9bc2ee3

File tree

2 files changed

+88
-3
lines changed

2 files changed

+88
-3
lines changed

crates/ide_assists/src/handlers/merge_imports.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,89 @@ use std::{fmt::{Display, Debug}};
252252
);
253253
}
254254

255+
#[test]
256+
fn test_merge_with_nested_self_item() {
257+
check_assist(
258+
merge_imports,
259+
r"
260+
use std$0::{fmt::{Write, Display}};
261+
use std::{fmt::{self, Debug}};
262+
",
263+
r"
264+
use std::{fmt::{Write, Display, self, Debug}};
265+
",
266+
);
267+
}
268+
269+
#[test]
270+
fn test_merge_with_nested_self_item2() {
271+
check_assist(
272+
merge_imports,
273+
r"
274+
use std$0::{fmt::{self, Debug}};
275+
use std::{fmt::{Write, Display}};
276+
",
277+
r"
278+
use std::{fmt::{self, Debug, Write, Display}};
279+
",
280+
);
281+
}
282+
283+
#[test]
284+
fn test_merge_self_with_nested_self_item() {
285+
check_assist(
286+
merge_imports,
287+
r"
288+
use std::{fmt$0::{self, Debug}, fmt::{Write, Display}};
289+
",
290+
r"
291+
use std::{fmt::{self, Debug, Write, Display}};
292+
",
293+
);
294+
}
295+
296+
#[test]
297+
fn test_merge_nested_self_and_empty() {
298+
check_assist(
299+
merge_imports,
300+
r"
301+
use foo::$0{bar::{self}};
302+
use foo::{bar};
303+
",
304+
r"
305+
use foo::{bar::{self}};
306+
",
307+
)
308+
}
309+
310+
#[test]
311+
fn test_merge_nested_empty_and_self() {
312+
check_assist(
313+
merge_imports,
314+
r"
315+
use foo::$0{bar};
316+
use foo::{bar::{self}};
317+
",
318+
r"
319+
use foo::{bar::{self}};
320+
",
321+
)
322+
}
323+
324+
#[test]
325+
fn test_merge_nested_list_self_and_glob() {
326+
check_assist(
327+
merge_imports,
328+
r"
329+
use std$0::{fmt::*};
330+
use std::{fmt::{self, Display}};
331+
",
332+
r"
333+
use std::{fmt::{self, *, Display}};
334+
",
335+
)
336+
}
337+
255338
#[test]
256339
fn test_merge_single_wildcard_diff_prefixes() {
257340
check_assist(

crates/ide_db/src/helpers/merge_imports.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,13 @@ fn recursive_merge(lhs: &ast::UseTree, rhs: &ast::UseTree, merge: MergeBehavior)
115115
let tree_contains_self = |tree: &ast::UseTree| {
116116
tree.use_tree_list()
117117
.map(|tree_list| tree_list.use_trees().any(|it| tree_is_self(&it)))
118-
.unwrap_or(false)
118+
// Glob imports aren't part of the use-tree lists,
119+
// so they need to be handled explicitly
120+
.or_else(|| tree.star_token().map(|_| false))
119121
};
120122
match (tree_contains_self(lhs_t), tree_contains_self(&rhs_t)) {
121-
(true, false) => continue,
122-
(false, true) => {
123+
(Some(true), None) => continue,
124+
(None, Some(true)) => {
123125
ted::replace(lhs_t.syntax(), rhs_t.syntax());
124126
*lhs_t = rhs_t;
125127
continue;

0 commit comments

Comments
 (0)