diff --git a/docs/rules/OrganizeImports.md b/docs/rules/OrganizeImports.md index d275d9935..da4adaf98 100644 --- a/docs/rules/OrganizeImports.md +++ b/docs/rules/OrganizeImports.md @@ -1119,13 +1119,19 @@ the [`OrganizeImports.groups`](#groups) option. ### Value type -Enum: `Ascii | SymbolsFirst | Keep` +Enum: `Ascii | AsciiCaseInsensitive | SymbolsFirst | Keep` #### `Ascii` Sort import statements by ASCII codes. This is the default sorting order that the IntelliJ IDEA Scala import optimizer picks ("lexicographically" option). +#### `AsciiCaseInsensitive` +Sort import statements by ASCII codes, without distinguishing between uppercase +and lowercase letters. Characters that appear between uppercase and lowercase +letters in the ASCII table are ordered before any letters. If two strings are +identical ignoring case, use case-sensitive order to break ties. + #### `SymbolsFirst` Put wildcard imports and grouped imports with braces first, otherwise same as `Ascii`. This replicates IntelliJ IDEA Scala’s "scalastyle diff --git a/scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImports.scala b/scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImports.scala index 6117f4cb0..afb6040d3 100644 --- a/scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImports.scala +++ b/scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImports.scala @@ -377,6 +377,11 @@ class OrganizeImports( // pretty-print an `Importer` into a single line. case ImportsOrder.Ascii => importeesSorted sortBy (i => importerSyntax(i.copy())) + case ImportsOrder.AsciiCaseInsensitive => + importeesSorted sortBy (i => { + val text = importerSyntax(i.copy()) + (text.toLowerCase, text) + }) case ImportsOrder.SymbolsFirst => sortImportersSymbolsFirst(importeesSorted) case ImportsOrder.Keep => diff --git a/scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImportsConfig.scala b/scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImportsConfig.scala index 5977fcf81..87b040c73 100644 --- a/scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImportsConfig.scala +++ b/scalafix-rules/src/main/scala/scalafix/internal/rule/OrganizeImportsConfig.scala @@ -13,11 +13,12 @@ sealed trait ImportsOrder object ImportsOrder { case object Ascii extends ImportsOrder + case object AsciiCaseInsensitive extends ImportsOrder case object SymbolsFirst extends ImportsOrder case object Keep extends ImportsOrder def all: List[ImportsOrder] = - List(Ascii, SymbolsFirst, Keep) + List(Ascii, AsciiCaseInsensitive, SymbolsFirst, Keep) implicit def reader: ConfDecoder[ImportsOrder] = ReaderUtil.fromMap(all.map(x => x.toString -> x).toMap) diff --git a/scalafix-tests/input/src/main/scala/test/organizeImports/ImportsOrderAsciiCaseInsensitive.scala b/scalafix-tests/input/src/main/scala/test/organizeImports/ImportsOrderAsciiCaseInsensitive.scala new file mode 100644 index 000000000..bd83c8367 --- /dev/null +++ b/scalafix-tests/input/src/main/scala/test/organizeImports/ImportsOrderAsciiCaseInsensitive.scala @@ -0,0 +1,22 @@ +/* +rules = [OrganizeImports] +OrganizeImports { + importsOrder = AsciiCaseInsensitive + removeUnused = false +} + */ +package test.organizeImports + +import test.organizeImports.Case.b.c +import test.organizeImports.Case.A.b +import test.organizeImports.Case.A.C +import test.organizeImports.Case.b.b +import test.organizeImports.Case.C.c +import test.organizeImports.Case.A.A +import test.organizeImports.Case.C.a +import test.organizeImports.Case.b.A +import test.organizeImports.Case.C.B +import test.organizeImports.Case.A._a +import test.organizeImports.Case.A._A + +object ImportsOrderAsciiCaseInsensitive diff --git a/scalafix-tests/output/src/main/scala/test/organizeImports/ImportsOrderAsciiCaseInsensitive.scala b/scalafix-tests/output/src/main/scala/test/organizeImports/ImportsOrderAsciiCaseInsensitive.scala new file mode 100644 index 000000000..d9945eabf --- /dev/null +++ b/scalafix-tests/output/src/main/scala/test/organizeImports/ImportsOrderAsciiCaseInsensitive.scala @@ -0,0 +1,15 @@ +package test.organizeImports + +import test.organizeImports.Case.A._A +import test.organizeImports.Case.A._a +import test.organizeImports.Case.A.A +import test.organizeImports.Case.A.b +import test.organizeImports.Case.A.C +import test.organizeImports.Case.b.A +import test.organizeImports.Case.b.b +import test.organizeImports.Case.b.c +import test.organizeImports.Case.C.a +import test.organizeImports.Case.C.B +import test.organizeImports.Case.C.c + +object ImportsOrderAsciiCaseInsensitive diff --git a/scalafix-tests/shared/src/main/scala/test/organizeImports/Case.scala b/scalafix-tests/shared/src/main/scala/test/organizeImports/Case.scala new file mode 100644 index 000000000..30cde6237 --- /dev/null +++ b/scalafix-tests/shared/src/main/scala/test/organizeImports/Case.scala @@ -0,0 +1,21 @@ +package test.organizeImports + +object Case { + object A { + object A + object b + object C + object _a + object _A + } + object b { + object A + object b + object c + } + object C { + object a + object B + object c + } +}