Skip to content

Commit 44c9c67

Browse files
authored
Merge pull request #2306 from fedimser/fedimser/order-case-insensitive
Support case-insensitive sorting
2 parents eacf034 + 0aeae0a commit 44c9c67

File tree

6 files changed

+72
-2
lines changed

6 files changed

+72
-2
lines changed

docs/rules/OrganizeImports.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1119,13 +1119,19 @@ the [`OrganizeImports.groups`](#groups) option.
11191119

11201120
### Value type
11211121

1122-
Enum: `Ascii | SymbolsFirst | Keep`
1122+
Enum: `Ascii | AsciiCaseInsensitive | SymbolsFirst | Keep`
11231123

11241124
#### `Ascii`
11251125
Sort import statements by ASCII codes. This is the default sorting order
11261126
that the IntelliJ IDEA Scala import optimizer picks ("lexicographically"
11271127
option).
11281128

1129+
#### `AsciiCaseInsensitive`
1130+
Sort import statements by ASCII codes, without distinguishing between uppercase
1131+
and lowercase letters. Characters that appear between uppercase and lowercase
1132+
letters in the ASCII table are ordered before any letters. If two strings are
1133+
identical ignoring case, use case-sensitive order to break ties.
1134+
11291135
#### `SymbolsFirst`
11301136
Put wildcard imports and grouped imports with braces first, otherwise
11311137
same as `Ascii`. This replicates IntelliJ IDEA Scala’s "scalastyle

scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImports.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,11 @@ class OrganizeImports(
377377
// pretty-print an `Importer` into a single line.
378378
case ImportsOrder.Ascii =>
379379
importeesSorted sortBy (i => importerSyntax(i.copy()))
380+
case ImportsOrder.AsciiCaseInsensitive =>
381+
importeesSorted sortBy (i => {
382+
val text = importerSyntax(i.copy())
383+
(text.toLowerCase, text)
384+
})
380385
case ImportsOrder.SymbolsFirst =>
381386
sortImportersSymbolsFirst(importeesSorted)
382387
case ImportsOrder.Keep =>

scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImportsConfig.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ sealed trait ImportsOrder
1313

1414
object ImportsOrder {
1515
case object Ascii extends ImportsOrder
16+
case object AsciiCaseInsensitive extends ImportsOrder
1617
case object SymbolsFirst extends ImportsOrder
1718
case object Keep extends ImportsOrder
1819

1920
def all: List[ImportsOrder] =
20-
List(Ascii, SymbolsFirst, Keep)
21+
List(Ascii, AsciiCaseInsensitive, SymbolsFirst, Keep)
2122

2223
implicit def reader: ConfDecoder[ImportsOrder] =
2324
ReaderUtil.fromMap(all.map(x => x.toString -> x).toMap)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
rules = [OrganizeImports]
3+
OrganizeImports {
4+
importsOrder = AsciiCaseInsensitive
5+
removeUnused = false
6+
}
7+
*/
8+
package test.organizeImports
9+
10+
import test.organizeImports.Case.b.c
11+
import test.organizeImports.Case.A.b
12+
import test.organizeImports.Case.A.C
13+
import test.organizeImports.Case.b.b
14+
import test.organizeImports.Case.C.c
15+
import test.organizeImports.Case.A.A
16+
import test.organizeImports.Case.C.a
17+
import test.organizeImports.Case.b.A
18+
import test.organizeImports.Case.C.B
19+
import test.organizeImports.Case.A._a
20+
import test.organizeImports.Case.A._A
21+
22+
object ImportsOrderAsciiCaseInsensitive
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package test.organizeImports
2+
3+
import test.organizeImports.Case.A._A
4+
import test.organizeImports.Case.A._a
5+
import test.organizeImports.Case.A.A
6+
import test.organizeImports.Case.A.b
7+
import test.organizeImports.Case.A.C
8+
import test.organizeImports.Case.b.A
9+
import test.organizeImports.Case.b.b
10+
import test.organizeImports.Case.b.c
11+
import test.organizeImports.Case.C.a
12+
import test.organizeImports.Case.C.B
13+
import test.organizeImports.Case.C.c
14+
15+
object ImportsOrderAsciiCaseInsensitive
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package test.organizeImports
2+
3+
object Case {
4+
object A {
5+
object A
6+
object b
7+
object C
8+
object _a
9+
object _A
10+
}
11+
object b {
12+
object A
13+
object b
14+
object c
15+
}
16+
object C {
17+
object a
18+
object B
19+
object c
20+
}
21+
}

0 commit comments

Comments
 (0)