diff --git a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java index 86aacfe72aa4..5493d0e605d4 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java @@ -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 IMPORT_BY_NAME_COMPARATOR = new Comparator() { + public static final Comparator IMPORT_TYPE_THEN_NAME_COMPARATOR = new Comparator() { @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 diff --git a/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java b/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java index b9742ad18537..169fe306bfaf 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java @@ -107,7 +107,7 @@ public class PyImportOptimizer implements ImportOptimizer { } private boolean groupsNotSorted() { - final Ordering importOrdering = Ordering.from(AddImportHelper.IMPORT_BY_NAME_COMPARATOR); + final Ordering importOrdering = Ordering.from(AddImportHelper.IMPORT_TYPE_THEN_NAME_COMPARATOR); return SORT_IMPORTS && ContainerUtil.exists(myGroups.values(), new Condition>() { @Override public boolean value(List imports) { @@ -130,7 +130,7 @@ public class PyImportOptimizer implements ImportOptimizer { if (SORT_IMPORTS) { for (ImportPriority priority : myGroups.keySet()) { final List 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); } } diff --git a/python/testData/optimizeImports/alphabeticalOrder.after.py b/python/testData/optimizeImports/alphabeticalOrder.after.py index 285714ac55d1..003304fccc36 100644 --- a/python/testData/optimizeImports/alphabeticalOrder.after.py +++ b/python/testData/optimizeImports/alphabeticalOrder.after.py @@ -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) \ No newline at end of file diff --git a/python/testData/optimizeImports/insertBlankLines.after.py b/python/testData/optimizeImports/insertBlankLines.after.py index 0593937bc805..e24971ff980f 100644 --- a/python/testData/optimizeImports/insertBlankLines.after.py +++ b/python/testData/optimizeImports/insertBlankLines.after.py @@ -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 diff --git a/python/testData/optimizeImports/noExtraBlankLineAfterImportBlock/main.after.py b/python/testData/optimizeImports/noExtraBlankLineAfterImportBlock/main.after.py index 26f0fa7e708a..3ac06caf89ae 100644 --- a/python/testData/optimizeImports/noExtraBlankLineAfterImportBlock/main.after.py +++ b/python/testData/optimizeImports/noExtraBlankLineAfterImportBlock/main.after.py @@ -1,5 +1,5 @@ -from collections import OrderedDict import sys +from collections import OrderedDict from m1 import MyClass diff --git a/python/testData/optimizeImports/orderByType.after.py b/python/testData/optimizeImports/orderByType.after.py index 0593937bc805..e24971ff980f 100644 --- a/python/testData/optimizeImports/orderByType.after.py +++ b/python/testData/optimizeImports/orderByType.after.py @@ -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 diff --git a/python/testData/refactoring/move/module/after/src/a.py b/python/testData/refactoring/move/module/after/src/a.py index 97e6ebff9c01..84c829adb049 100644 --- a/python/testData/refactoring/move/module/after/src/a.py +++ b/python/testData/refactoring/move/module/after/src/a.py @@ -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 diff --git a/python/testData/refactoring/move/moduleToNonPackage/after/src/a.py b/python/testData/refactoring/move/moduleToNonPackage/after/src/a.py index ca4143ce7442..2bf66e2e5c79 100644 --- a/python/testData/refactoring/move/moduleToNonPackage/after/src/a.py +++ b/python/testData/refactoring/move/moduleToNonPackage/after/src/a.py @@ -1,6 +1,6 @@ +import nonp3.m1 from nonp3 import m1 from nonp3.m1 import foo -import nonp3.m1 nonp3.m1.foo m1.bar diff --git a/python/testData/refactoring/move/relativeImportsToModulesInSameMovedPackageNotUpdated/after/src/subpkg/m1.py b/python/testData/refactoring/move/relativeImportsToModulesInSameMovedPackageNotUpdated/after/src/subpkg/m1.py index 659649343f8e..d496de9871d8 100644 --- a/python/testData/refactoring/move/relativeImportsToModulesInSameMovedPackageNotUpdated/after/src/subpkg/m1.py +++ b/python/testData/refactoring/move/relativeImportsToModulesInSameMovedPackageNotUpdated/after/src/subpkg/m1.py @@ -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 diff --git a/python/testData/refactoring/pullup/duplicateImport/SuperClass.after.py b/python/testData/refactoring/pullup/duplicateImport/SuperClass.after.py index beda7cd58320..87bc0a52195a 100644 --- a/python/testData/refactoring/pullup/duplicateImport/SuperClass.after.py +++ b/python/testData/refactoring/pullup/duplicateImport/SuperClass.after.py @@ -1,6 +1,5 @@ -from sys import argv import sys - +from sys import argv class SuperClass(object): def __init__(self):