Skip to content
This repository was archived by the owner on Sep 3, 2020. It is now read-only.

Commit 2c61073

Browse files
committed
Adds alternative grouping like 'akka,java'.
1 parent bea75b3 commit 2c61073

File tree

2 files changed

+63
-10
lines changed

2 files changed

+63
-10
lines changed

src/main/scala/scala/tools/refactoring/implementations/OrganizeImports.scala

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,40 @@ import scala.util.control.NonFatal
1313

1414
object OrganizeImports {
1515
val DefaultGroup = "*"
16+
val InGroupDelimiter = ","
1617
/**
1718
* Abstract algorithms used by the implementation, extracted mostly for testing purposes
1819
*/
1920
private[implementations] object Algos {
2021
def groupImports[ImportT](getImportExpression: ImportT => String)(groups: Seq[String], imports: Seq[ImportT]): Seq[List[ImportT]] = {
21-
val distinctGroups = groups.distinct
22-
val acc = distinctGroups.map(_ -> scala.collection.mutable.ListBuffer.empty[ImportT]).toMap
23-
val assigned = imports.foldLeft(acc) { (acc, imp) =>
22+
val distinctGroups = groups.map(_.split(InGroupDelimiter).sorted.mkString(InGroupDelimiter)).distinct
23+
val groupImportsMap = distinctGroups.map(_ -> scala.collection.mutable.ListBuffer.empty[ImportT]).toMap
24+
val assigned = imports.foldLeft(groupImportsMap) { (groupImportsMap, imp) =>
2425
val expr = getImportExpression(imp)
25-
val inGroup = distinctGroups.filter { group =>
26-
expr.startsWith(group + ".") || expr == group
26+
def isInGroup(group: String) = expr.startsWith(group + ".") || expr == group
27+
distinctGroups.foldLeft[Option[String]](None) { (longestGroup, group) =>
28+
val potential = group.split(InGroupDelimiter).exists { isInGroup }
29+
if (potential) {
30+
val locallyLongest = group.split(InGroupDelimiter).foldLeft(0) { (locallyLongest, group) =>
31+
if (isInGroup(group) && group.length > locallyLongest) {
32+
group.length
33+
} else locallyLongest
34+
}
35+
longestGroup.map { lg =>
36+
val longest = lg.split(InGroupDelimiter).foldLeft(0) { (longest, g) =>
37+
if (isInGroup(g) && g.length > longest)
38+
g.length
39+
else longest
40+
}
41+
if (longest < locallyLongest)
42+
group
43+
else lg
44+
}.orElse(Option(group))
45+
} else longestGroup
46+
}.map { mostSpecificGroup =>
47+
groupImportsMap(mostSpecificGroup) += imp
2748
}
28-
if (inGroup.nonEmpty) {
29-
val mostSpecificGroup = inGroup.sortBy(-_.length).head
30-
acc(mostSpecificGroup) += imp
31-
}
32-
acc
49+
groupImportsMap
3350
}
3451
val unassigned = {
3552
val a = assigned.values.toList.flatten.map(getImportExpression)

src/test/scala/scala/tools/refactoring/implementations/OrganizeImportsAlgosTest.scala

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,42 @@ class OrganizeImportsAlgosTest {
4646
expected = List(List("a.A"), List("a.b.AB"), List("ab.Ab1", "ab.Ab2"), List("abc.Abc1", "abc.Abc2")))
4747
}
4848

49+
@Test
50+
def testGroupImportsWithAlternatives(): Unit = {
51+
testGroupImports(
52+
groups = List("a.c", "a,b.c", "b"),
53+
imports = List("a.b.X", "a.c.Y", "b.a.Y", "b.c.X"),
54+
expected = List(List("a.c.Y"), List("a.b.X", "b.c.X"), List("b.a.Y")))
55+
56+
testGroupImports(
57+
groups = List("a.c", "nonexisting", "a,b.c", "b"),
58+
imports = List("a.b.X", "a.c.Y", "b.a.Y", "b.c.X"),
59+
expected = List(List("a.c.Y"), List("a.b.X", "b.c.X"), List("b.a.Y")))
60+
61+
testGroupImports(
62+
groups = List("a.c", "*", "a,b.c", "b"),
63+
imports = List("a.b.X", "a.c.Y", "b.a.Y", "b.c.X", "d.a.Y"),
64+
expected = List(List("a.c.Y"), List("d.a.Y"), List("a.b.X", "b.c.X"), List("b.a.Y")))
65+
66+
// default group at the end
67+
testGroupImports(
68+
groups = List("a.c", "a,b.c", "b"),
69+
imports = List("a.b.X", "a.c.Y", "b.a.Y", "b.c.X", "d.a.Y"),
70+
expected = List(List("a.c.Y"), List("a.b.X", "b.c.X"), List("b.a.Y"), List("d.a.Y")))
71+
72+
// disordered alternative
73+
testGroupImports(
74+
groups = List("a.c", "b.c,a", "b"),
75+
imports = List("a.b.X", "a.c.Y", "b.a.Y", "b.c.X"),
76+
expected = List(List("a.c.Y"), List("a.b.X", "b.c.X"), List("b.a.Y")))
77+
78+
// disordered and repeated alternative
79+
testGroupImports(
80+
groups = List("a.c", "b.c,a", "b", "a,b.c"),
81+
imports = List("a.b.X", "a.c.Y", "b.a.Y", "b.c.X"),
82+
expected = List(List("a.c.Y"), List("a.b.X", "b.c.X"), List("b.a.Y")))
83+
}
84+
4985
private def testGroupImports(groups: List[String], imports: List[String], expected: List[List[String]]): Unit = {
5086
def getImportExpr(imp: String) = {
5187
val lastDot = imp.lastIndexOf('.')

0 commit comments

Comments
 (0)