diff --git a/python/src/com/jetbrains/python/PythonParserDefinition.java b/python/src/com/jetbrains/python/PythonParserDefinition.java index dc669835fc17..77434a455797 100644 --- a/python/src/com/jetbrains/python/PythonParserDefinition.java +++ b/python/src/com/jetbrains/python/PythonParserDefinition.java @@ -100,6 +100,7 @@ public class PythonParserDefinition implements ParserDefinition { } public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) { + if(left.getElementType() == PyTokenTypes.END_OF_LINE_COMMENT) return SpaceRequirements.MUST_LINE_BREAK; final Lexer lexer = createLexer(left.getPsi().getProject()); return LanguageUtil.canStickTokensTogetherByLexer(left, right, lexer, 0); } diff --git a/python/src/com/jetbrains/python/formatter/PyBlock.java b/python/src/com/jetbrains/python/formatter/PyBlock.java index 94f967632305..59dc7c973b93 100644 --- a/python/src/com/jetbrains/python/formatter/PyBlock.java +++ b/python/src/com/jetbrains/python/formatter/PyBlock.java @@ -24,11 +24,11 @@ import com.intellij.psi.TokenType; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.PythonLanguage; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -191,7 +191,9 @@ public class PyBlock implements Block { IElementType parentType = _node.getElementType(); IElementType type1 = childNode1.getElementType(); IElementType type2 = childNode2.getElementType(); - + if (PyElementTypes.STATEMENTS.contains(type1) && PyElementTypes.STATEMENTS.contains(type2)){ + return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, false, 1); + } /* if (type1 == PyTokenTypes.COLON && type2 == PyElementTypes.STATEMENT_LIST) { return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, true, Integer.MAX_VALUE); @@ -212,6 +214,7 @@ public class PyBlock implements Block { //return new PySpacingProcessor(getNode(), childNode1, childNode2, // _settings).getResult(); //return Spacing.createSpacing(0, Integer.MAX_VALUE, 1, true, Integer.MAX_VALUE); + return null; } diff --git a/python/src/com/jetbrains/python/validation/AddImportAction.java b/python/src/com/jetbrains/python/validation/AddImportAction.java index d641d10f3c6f..17ea8fee17ef 100644 --- a/python/src/com/jetbrains/python/validation/AddImportAction.java +++ b/python/src/com/jetbrains/python/validation/AddImportAction.java @@ -8,24 +8,27 @@ import com.intellij.codeInsight.daemon.impl.ShowAutoImportPass; import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.hint.QuestionAction; import com.intellij.codeInspection.HintAction; -import com.intellij.lang.ASTNode; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.Factory; -import com.intellij.psi.impl.source.tree.LeafElement; +import com.intellij.psi.PsiComment; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; import com.intellij.psi.search.FilenameIndex; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.jetbrains.python.PythonLanguage; +import com.jetbrains.python.psi.PyImportStatement; import com.jetbrains.python.psi.PyReferenceExpression; import org.jetbrains.annotations.NotNull; public class AddImportAction implements HintAction, QuestionAction { private final PsiReference myReference; private Project myProject; + private static final Logger LOG = Logger.getInstance("#" + AddImportAction.class.getName()); public AddImportAction(final PsiReference reference) { myReference = reference; @@ -62,20 +65,23 @@ public class AddImportAction implements HintAction, QuestionAction { final String referenceName = ((PyReferenceExpression)myReference).getReferencedName(); final PsiFile[] files = FilenameIndex.getFilesByName(myProject, referenceName + ".py", GlobalSearchScope.allScope(myProject)); if (files.length == 1) { - String text = "\n"; - LeafElement ws = Factory.createSingleLeafElement(TokenType.WHITE_SPACE, text, 0, text.length(), null, file.getManager()); - final ASTNode importNodeToInsert = PythonLanguage.getInstance().getElementGenerator() - .createImportStatementFromText(myProject, "import " + referenceName).getNode(); - final PsiElement element = getFirstNonComment(file); - file.getNode().addChild(importNodeToInsert, element != null ? element.getNode() : file.getFirstChild().getNode()); - file.getNode().addChild(ws, importNodeToInsert); + final PyImportStatement importNodeToInsert = PythonLanguage.getInstance().getElementGenerator().createImportStatementFromText(myProject, "import " + referenceName); + try { + file.addBefore(importNodeToInsert, getFirstNonComment(file)); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } } } }); } private static PsiElement getFirstNonComment(final PsiFile file) { - return PsiTreeUtil.skipSiblingsForward(file.getFirstChild(), PsiComment.class); + final PsiElement firstChild = file.getFirstChild(); + LOG.assertTrue(firstChild != null); + final PsiElement element = PsiTreeUtil.skipSiblingsForward(firstChild, PsiComment.class); + return element != null ? element : firstChild; } public boolean startInWriteAction() {