PY-12018 Sort import by their types and names similar to the behavior of isort

Normal imports go first, then "from" imports.
This commit is contained in:
Mikhail Golubev
2015-09-10 19:02:53 +03:00
parent 5a688d021f
commit 2b0a11e466
10 changed files with 25 additions and 18 deletions
@@ -50,9 +50,17 @@ import static com.jetbrains.python.psi.PyUtil.sure;
public class AddImportHelper {
private static final Logger LOG = Logger.getInstance("#" + AddImportHelper.class.getName());
public static final Comparator<PyImportStatementBase> IMPORT_BY_NAME_COMPARATOR = new Comparator<PyImportStatementBase>() {
public static final Comparator<PyImportStatementBase> IMPORT_TYPE_THEN_NAME_COMPARATOR = new Comparator<PyImportStatementBase>() {
@Override
public int compare(@NotNull PyImportStatementBase import1, @NotNull PyImportStatementBase import2) {
// normal imports go first, then "from" imports
if (import1 instanceof PyImportStatement && import2 instanceof PyFromImportStatement) {
return -1;
}
if (import1 instanceof PyFromImportStatement && import2 instanceof PyImportStatement) {
return 1;
}
final QualifiedName firstName1 = getImportFirstQualifiedName(import1);
final QualifiedName firstName2 = getImportFirstQualifiedName(import2);
// Broken imports go last
@@ -221,7 +229,7 @@ public class AddImportHelper {
if (newImport == null) {
return false;
}
return IMPORT_BY_NAME_COMPARATOR.compare(newImport, existingImport) < 0;
return IMPORT_TYPE_THEN_NAME_COMPARATOR.compare(newImport, existingImport) < 0;
}
@NotNull
@@ -107,7 +107,7 @@ public class PyImportOptimizer implements ImportOptimizer {
}
private boolean groupsNotSorted() {
final Ordering<PyImportStatementBase> importOrdering = Ordering.from(AddImportHelper.IMPORT_BY_NAME_COMPARATOR);
final Ordering<PyImportStatementBase> importOrdering = Ordering.from(AddImportHelper.IMPORT_TYPE_THEN_NAME_COMPARATOR);
return SORT_IMPORTS && ContainerUtil.exists(myGroups.values(), new Condition<List<PyImportStatementBase>>() {
@Override
public boolean value(List<PyImportStatementBase> imports) {
@@ -130,7 +130,7 @@ public class PyImportOptimizer implements ImportOptimizer {
if (SORT_IMPORTS) {
for (ImportPriority priority : myGroups.keySet()) {
final List<PyImportStatementBase> imports = myGroups.get(priority);
Collections.sort(imports, AddImportHelper.IMPORT_BY_NAME_COMPARATOR);
Collections.sort(imports, AddImportHelper.IMPORT_TYPE_THEN_NAME_COMPARATOR);
myGroups.put(priority, imports);
}
}
@@ -1,21 +1,21 @@
from __future__ import absolute_import
from __future__ import unicode_literals
from datetime import timedelta
import sys
from datetime import timedelta
import a
import b
import foo # broken
import z
import # broken
from a import C1
from alphabet import *
from alphabet import A
from alphabet import B, A
from alphabet import C
from alphabet import D
import b
from b import func
import foo # broken
import z
from
import # broken
print(z, b, a, C1, func, sys, abc, foo, timedelta, A, B, C, D)
@@ -3,8 +3,8 @@ from __future__ import with_statement
import datetime
import sys
from bar import *
import foo
from bar import *
sys.path
datetime.datetime
@@ -1,5 +1,5 @@
from collections import OrderedDict
import sys
from collections import OrderedDict
from m1 import MyClass
@@ -3,8 +3,8 @@ from __future__ import with_statement
import datetime
import sys
from bar import *
import foo
from bar import *
sys.path
datetime.datetime
@@ -1,7 +1,7 @@
from p1 import m1
import p1
from p1.m1 import foo
import p1.m1
from p1 import m1
from p1.m1 import foo
p1.m1.foo
m1.bar
@@ -1,6 +1,6 @@
import nonp3.m1
from nonp3 import m1
from nonp3.m1 import foo
import nonp3.m1
nonp3.m1.foo
m1.bar
@@ -1,6 +1,6 @@
import m3
from pkg import m5
import subsubpkg as foo
from pkg import m5
from .subsubpkg import m4
from . import m2
from . import subsubpkg as bar
@@ -1,6 +1,5 @@
from sys import argv
import sys
from sys import argv
class SuperClass(object):
def __init__(self):