about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDropDemBits <r3usrlnd@gmail.com>2022-02-14 19:41:49 -0500
committerDropDemBits <r3usrlnd@gmail.com>2022-02-14 19:45:31 -0500
commit86c1251afb1476137ce81b86bf1fa229eecdb5fc (patch)
tree29f5bfd314feb5dad65739a9afbd44dbf7223211
parentdf2eb3c7cbe1a67fc870a4ee5dde6569a6b7deab (diff)
downloadrust-86c1251afb1476137ce81b86bf1fa229eecdb5fc.tar.gz
rust-86c1251afb1476137ce81b86bf1fa229eecdb5fc.zip
fix: Don't drop glob with nested self
-rw-r--r--crates/ide_assists/src/handlers/merge_imports.rs12
-rw-r--r--crates/ide_db/src/helpers/merge_imports.rs3
2 files changed, 15 insertions, 0 deletions
diff --git a/crates/ide_assists/src/handlers/merge_imports.rs b/crates/ide_assists/src/handlers/merge_imports.rs
index cf30897ab42..2ded8c98037 100644
--- a/crates/ide_assists/src/handlers/merge_imports.rs
+++ b/crates/ide_assists/src/handlers/merge_imports.rs
@@ -322,6 +322,18 @@ use foo::{bar::{self}};
     }
 
     #[test]
+    fn test_merge_nested_list_self_and_glob() {
+        check_assist(
+            merge_imports,
+            r"
+use std$0::{fmt::*};
+use std::{fmt::{self, Display}};
+",
+            r"use std::{fmt::{self, *, Display}};",
+        )
+    }
+
+    #[test]
     fn test_merge_single_wildcard_diff_prefixes() {
         check_assist(
             merge_imports,
diff --git a/crates/ide_db/src/helpers/merge_imports.rs b/crates/ide_db/src/helpers/merge_imports.rs
index 614784b4674..f113dccdea9 100644
--- a/crates/ide_db/src/helpers/merge_imports.rs
+++ b/crates/ide_db/src/helpers/merge_imports.rs
@@ -115,6 +115,9 @@ fn recursive_merge(lhs: &ast::UseTree, rhs: &ast::UseTree, merge: MergeBehavior)
                     let tree_contains_self = |tree: &ast::UseTree| {
                         tree.use_tree_list()
                             .map(|tree_list| tree_list.use_trees().any(|it| tree_is_self(&it)))
+                            // Glob imports aren't part of the use-tree lists,
+                            // so they need to be handled explicitly
+                            .or_else(|| tree.star_token().is_some().then(|| false))
                     };
                     match (tree_contains_self(lhs_t), tree_contains_self(&rhs_t)) {
                         (Some(true), None) => continue,