From dd5841d56dc0b2f32b972f370b5e266c705fa96b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 4 Nov 2013 16:26:17 +0100 Subject: [PATCH] optimize imports inserts blank lines between groups also when we don't have any missorted imports (PY-8355) --- .../codeInsight/imports/PyImportOptimizer.java | 17 ++++++++++++++--- .../optimizeImports/insertBlankLines.after.py | 10 ++++++++++ .../optimizeImports/insertBlankLines.py | 9 +++++++++ .../jetbrains/python/PyOptimizeImportsTest.java | 4 ++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 python/testData/optimizeImports/insertBlankLines.after.py create mode 100644 python/testData/optimizeImports/insertBlankLines.py diff --git a/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java b/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java index 6d5e3c850de2..0ebcaca758f0 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java @@ -107,11 +107,19 @@ public class PyImportOptimizer implements ImportOptimizer { prioritize(importStatement, toImport); } } - if (myMissorted) { + if (myMissorted || needBlankLinesBetweenGroups()) { applyResults(); } } + private boolean needBlankLinesBetweenGroups() { + int nonEmptyGroups = 0; + if (myBuiltinImports.size() > 0) nonEmptyGroups++; + if (myThirdPartyImports.size() > 0) nonEmptyGroups++; + if (myProjectImports.size() > 0) nonEmptyGroups++; + return nonEmptyGroups > 1; + } + private void prioritize(PyImportStatementBase importStatement, @Nullable PsiElement toImport) { if (toImport != null && !(toImport instanceof PsiFileSystemItem)) { toImport = toImport.getContainingFile(); @@ -143,7 +151,10 @@ public class PyImportOptimizer implements ImportOptimizer { addImports(myThirdPartyImports); addImports(myProjectImports); PsiElement lastElement = myImportBlock.get(myImportBlock.size()-1); - myFile.deleteChildRange(findFirstNonFutureImport(), lastElement); + PyImportStatementBase firstNonFutureImport = findFirstNonFutureImport(); + if (firstNonFutureImport != null) { + myFile.deleteChildRange(firstNonFutureImport, lastElement); + } for (PyImportStatementBase anImport : myBuiltinImports) { anImport.putCopyableUserData(PyBlock.IMPORT_GROUP_BEGIN, null); } @@ -155,7 +166,7 @@ public class PyImportOptimizer implements ImportOptimizer { return importStatement; } } - return myImportBlock.get(0); + return null; } private static void markGroupBegin(List imports) { diff --git a/python/testData/optimizeImports/insertBlankLines.after.py b/python/testData/optimizeImports/insertBlankLines.after.py new file mode 100644 index 000000000000..e3719e04dcc0 --- /dev/null +++ b/python/testData/optimizeImports/insertBlankLines.after.py @@ -0,0 +1,10 @@ +from __future__ import with_statement +import sys +import datetime + +import foo +from bar import * + + +sys.path +datetime.datetime diff --git a/python/testData/optimizeImports/insertBlankLines.py b/python/testData/optimizeImports/insertBlankLines.py new file mode 100644 index 000000000000..9e77f444d6eb --- /dev/null +++ b/python/testData/optimizeImports/insertBlankLines.py @@ -0,0 +1,9 @@ +from __future__ import with_statement +import sys +import datetime +import foo +from bar import * + + +sys.path +datetime.datetime diff --git a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java index 8aeb1f885d71..7070954534f4 100644 --- a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java +++ b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java @@ -63,6 +63,10 @@ public class PyOptimizeImportsTest extends PyTestCase { doTest(); } + public void testInsertBlankLines() { // PY-8355 + doTest(); + } + private void doTest() { myFixture.configureByFile("optimizeImports/" + getTestName(true) + ".py"); OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent()));