mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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
-1
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user