}
if (psi1 instanceof PyImportStatementBase) {
- if (psi2 instanceof PyImportStatementBase &&
- psi2.getCopyableUserData(IMPORT_GROUP_BEGIN) != null) {
- return Spacing.createSpacing(0, 0, 2, true, 1);
+ if (psi2 instanceof PyImportStatementBase) {
+ if (psi2.getCopyableUserData(IMPORT_GROUP_BEGIN) != null) {
+ return Spacing.createSpacing(0, 0, 2, true, 1);
+ }
+ else if (psi1.getCopyableUserData(IMPORT_GROUP_BEGIN) != null) {
+ // It's a trick to keep spacing consistent when new import statement is inserted
+ // at the beginning of an import group, i.e. if there is a blank line before the next
+ // import we want to save it, but remove line *after* inserted import.
+ return Spacing.createSpacing(0, 0, 1, false, 0);
+ }
}
if (psi2 instanceof PyStatement && !(psi2 instanceof PyImportStatementBase)) {
if (PyUtil.isTopLevel(psi1)) {
import com.intellij.formatting.*;
import com.intellij.lang.ASTNode;
-import com.intellij.lang.LanguageParserDefinitions;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.tree.IElementType;
-import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.tree.TokenSet;
import com.jetbrains.python.PythonDialectsTokenSetProvider;
import com.jetbrains.python.PythonLanguage;
}
protected SpacingBuilder createSpacingBuilder(CodeStyleSettings settings) {
- final IFileElementType file = LanguageParserDefinitions.INSTANCE.forLanguage(PythonLanguage.getInstance()).getFileNodeType();
final PyCodeStyleSettings pySettings = settings.getCustomSettings(PyCodeStyleSettings.class);
final CommonCodeStyleSettings commonSettings = settings.getCommonSettings(PythonLanguage.getInstance());
.between(STATEMENT_OR_DECLARATION, FUNCTION_DECLARATION).blankLines(commonSettings.BLANK_LINES_AROUND_METHOD)
.after(FUNCTION_DECLARATION).blankLines(commonSettings.BLANK_LINES_AROUND_METHOD)
.after(CLASS_DECLARATION).blankLines(commonSettings.BLANK_LINES_AROUND_CLASS)
- // Remove excess blank lines between imports, because ImportOptimizer gets rid of them anyway.
+ // Remove excess blank lines between imports (at most one is allowed).
+ // Note that ImportOptimizer gets rid of them anyway.
// Empty lines between import groups are handles in PyBlock#getSpacing
- .between(IMPORT_STATEMENTS, IMPORT_STATEMENTS).spacing(0, Integer.MAX_VALUE, 1, false, 0)
+ .between(IMPORT_STATEMENTS, IMPORT_STATEMENTS).spacing(0, Integer.MAX_VALUE, 1, false, 1)
.between(STATEMENT_OR_DECLARATION, STATEMENT_OR_DECLARATION).spacing(0, Integer.MAX_VALUE, 1, false, 1)
.between(COLON, STATEMENT_LIST).spacing(1, Integer.MAX_VALUE, 0, true, 0)
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.codeInsight.imports.AddImportHelper;
import com.jetbrains.python.documentation.docstrings.DocStringUtil;
+import com.jetbrains.python.formatter.PyBlock;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyStringLiteralExpression;
import org.jetbrains.annotations.NotNull;
PsiElement problemElement = descriptor.getPsiElement();
PsiFile psiFile = problemElement.getContainingFile();
if (psiFile instanceof PyFile) {
+ problemElement.putCopyableUserData(PyBlock.IMPORT_GROUP_BEGIN, true);
PyFile file = (PyFile)psiFile;
PyStringLiteralExpression docString = DocStringUtil.findDocStringExpression(file);
if (docString != null) {
--- /dev/null
+import os
+import uuid
+
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+from project import something
+
+print(something, _, models, os, uuid)
--- /dev/null
+import os
+import uuid
+
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+from project import something
+
+print(something, _, models, os, uuid)
public void testAlignmentOfEmptyCollectionLiterals() {
doTest();
}
+
+ // PY-17593
+ public void testBlanksBetweenImportsPreservedWithoutOptimizeImports() {
+ doTest();
+ }
}