diff --git a/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java b/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java index 8201d8fd4d04..75d3e40aed81 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/PyImportOptimizer.java @@ -282,15 +282,14 @@ public class PyImportOptimizer implements ImportOptimizer { } final PyImportStatementBase firstImport = myImportBlock.get(0); final List boundComments = collectPrecedingLineComments(firstImport).getFirst(); - final PsiElement insertionAnchor = boundComments.isEmpty() ? firstImport : boundComments.get(0); - addImportsBefore(insertionAnchor); - // Remove together with extra whitespaces preceding - final PsiElement nonWhitespaceBefore = PyPsiUtils.getPrevNonWhitespaceSibling(insertionAnchor); - myFile.deleteChildRange(nonWhitespaceBefore != null ? nonWhitespaceBefore.getNextSibling() : insertionAnchor, - ContainerUtil.getLastItem(myImportBlock)); + final PsiElement firstElementToRemove = boundComments.isEmpty() ? firstImport : boundComments.get(0); + final PyImportStatementBase lastImport = ContainerUtil.getLastItem(myImportBlock); + assert lastImport != null; + addImportsAfter(lastImport); + myFile.deleteChildRange(firstElementToRemove, PyPsiUtils.getNextNonWhitespaceSibling(lastImport).getPrevSibling()); } - private void addImportsBefore(@NotNull PsiElement anchor) { + private void addImportsAfter(@NotNull PsiElement anchor) { final StringBuilder content = new StringBuilder(); for (List imports : myGroups.values()) { @@ -325,14 +324,12 @@ public class PyImportOptimizer implements ImportOptimizer { final Project project = anchor.getProject(); final PyElementGenerator generator = PyElementGenerator.getInstance(project); - PyFile file = (PyFile)generator.createDummyFile(LanguageLevel.forElement(anchor), content.toString()); - file = (PyFile)CodeStyleManager.getInstance(project).reformat(file); - final List newImportBlock = file.getImportBlock(); + final PyFile file = (PyFile)generator.createDummyFile(LanguageLevel.forElement(anchor), content.toString()); + final PyFile reformattedFile = (PyFile)CodeStyleManager.getInstance(project).reformat(file); + final List newImportBlock = reformattedFile.getImportBlock(); assert newImportBlock != null; - final PyImportStatementBase lastImport = ContainerUtil.getLastItem(newImportBlock); - assert lastImport != null; - myFile.addRangeBefore(file.getFirstChild(), file.getLastChild(), anchor); + myFile.addRangeAfter(reformattedFile.getFirstChild(), reformattedFile.getLastChild(), anchor); } } } diff --git a/python/testData/optimizeImports/stackDanglingCommentsAtEnd.after.py b/python/testData/optimizeImports/stackDanglingCommentsAtEnd.after.py index 1504c94f3255..11ccb7d33036 100644 --- a/python/testData/optimizeImports/stackDanglingCommentsAtEnd.after.py +++ b/python/testData/optimizeImports/stackDanglingCommentsAtEnd.after.py @@ -4,6 +4,8 @@ # comment after the top-level one + + # comment for abc import abc # comment for sys diff --git a/python/testData/optimizeImports/stackDanglingCommentsAtEnd.py b/python/testData/optimizeImports/stackDanglingCommentsAtEnd.py index de0b28ca68ca..b74eeec56609 100644 --- a/python/testData/optimizeImports/stackDanglingCommentsAtEnd.py +++ b/python/testData/optimizeImports/stackDanglingCommentsAtEnd.py @@ -4,6 +4,8 @@ # comment after the top-level one + + # comment for b import b diff --git a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java index 8269a3b7d994..ac49b50c414d 100644 --- a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java +++ b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java @@ -273,6 +273,7 @@ public class PyOptimizeImportsTest extends PyTestCase { doTest(); } + // PY-23125 public void testStackDanglingCommentsAtEnd() { doTest(); }