From 0b5dd584ea081a58714d6e25d9c228873bef523a Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Wed, 1 Jul 2015 15:06:20 +0300 Subject: [PATCH] Make non-strict behavior of getNextNonCommentSibling more clear by adding corresponding parameter --- .../jetbrains/python/psi/impl/PyPsiUtils.java | 24 ++++++++++--------- .../codeInsight/PyMethodNameTypedHandler.java | 2 +- .../PyConditionalStatementPartFixer.java | 2 +- .../fixers/PyMissingBracesFixer.java | 4 ++-- .../intentions/PySplitIfIntention.java | 8 +++---- .../python/documentation/DocStringUtil.java | 4 ++-- 6 files changed, 23 insertions(+), 21 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java b/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java index b825956e0b7f..9588f483e782 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java +++ b/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java @@ -83,15 +83,15 @@ public class PyPsiUtils { } /** - * Find first sibling that is neither comment, nor whitespace before given element or this element itself. + * Find first sibling that is neither comment, nor whitespace before given element. + * @param strict prohibit returning element itself */ @Nullable - public static PsiElement getFirstNonCommentBefore(@Nullable PsiElement start) { - PsiElement seeker = start; - while (seeker instanceof PsiWhiteSpace || seeker instanceof PsiComment) { - seeker = seeker.getPrevSibling(); + public static PsiElement getPrevNonCommentSibling(@Nullable PsiElement start, boolean strict) { + if (!strict && !(start instanceof PsiWhiteSpace || start instanceof PsiComment)) { + return start; } - return seeker; + return PsiTreeUtil.skipSiblingsBackward(start, PsiWhiteSpace.class, PsiComment.class); } /** @@ -120,13 +120,15 @@ public class PyPsiUtils { } /** - * Find first sibling that is neither comment, nor whitespace after given element or this element itself. + * Find first sibling that is neither comment, nor whitespace after given element. + * @param strict prohibit returning element itself */ @Nullable - public static PsiElement getFirstNonCommentAfter(@Nullable PsiElement start) { - PsiElement seeker = start; - while (seeker instanceof PsiWhiteSpace || seeker instanceof PsiComment) seeker = seeker.getNextSibling(); - return seeker; + public static PsiElement getNextNonCommentSibling(@Nullable PsiElement start, boolean strict) { + if (!strict && !(start instanceof PsiWhiteSpace || start instanceof PsiComment)) { + return start; + } + return PsiTreeUtil.skipSiblingsForward(start, PsiWhiteSpace.class, PsiComment.class); } /** diff --git a/python/src/com/jetbrains/python/codeInsight/PyMethodNameTypedHandler.java b/python/src/com/jetbrains/python/codeInsight/PyMethodNameTypedHandler.java index 0d394c21bad3..e28a013e144e 100644 --- a/python/src/com/jetbrains/python/codeInsight/PyMethodNameTypedHandler.java +++ b/python/src/com/jetbrains/python/codeInsight/PyMethodNameTypedHandler.java @@ -56,7 +56,7 @@ public class PyMethodNameTypedHandler extends TypedHandlerDelegate { final ASTNode token_node = token.getNode(); if (token_node != null && token_node.getElementType() == PyTokenTypes.IDENTIFIER) { - PsiElement maybe_def = PyPsiUtils.getFirstNonCommentBefore(token.getPrevSibling()); + PsiElement maybe_def = PyPsiUtils.getPrevNonCommentSibling(token.getPrevSibling(), false); if (maybe_def != null) { ASTNode def_node = maybe_def.getNode(); if (def_node != null && def_node.getElementType() == PyTokenTypes.DEF_KEYWORD) { diff --git a/python/src/com/jetbrains/python/codeInsight/editorActions/smartEnter/fixers/PyConditionalStatementPartFixer.java b/python/src/com/jetbrains/python/codeInsight/editorActions/smartEnter/fixers/PyConditionalStatementPartFixer.java index aa2393ad38be..aad981d704fa 100644 --- a/python/src/com/jetbrains/python/codeInsight/editorActions/smartEnter/fixers/PyConditionalStatementPartFixer.java +++ b/python/src/com/jetbrains/python/codeInsight/editorActions/smartEnter/fixers/PyConditionalStatementPartFixer.java @@ -48,7 +48,7 @@ public class PyConditionalStatementPartFixer extends PyFixer { public void doApply(@NotNull Editor editor, @NotNull PySmartEnterProcessor processor, @NotNull PyElement psiElement) throws IncorrectOperationException { if (psiElement instanceof PySetLiteralExpression || psiElement instanceof PyDictLiteralExpression) { - final PsiElement lastChild = PyPsiUtils.getFirstNonCommentBefore(psiElement.getLastChild()); + final PsiElement lastChild = PyPsiUtils.getPrevNonCommentSibling(psiElement.getLastChild(), false); if (lastChild != null && !"}".equals(lastChild.getText())) { editor.getDocument().insertString(lastChild.getTextRange().getEndOffset(), "}"); } @@ -46,7 +46,7 @@ public class PyMissingBracesFixer extends PyFixer { else if (psiElement instanceof PyListLiteralExpression || psiElement instanceof PySliceExpression || psiElement instanceof PySubscriptionExpression) { - final PsiElement lastChild = PyPsiUtils.getFirstNonCommentBefore(psiElement.getLastChild()); + final PsiElement lastChild = PyPsiUtils.getPrevNonCommentSibling(psiElement.getLastChild(), false); if (lastChild != null && !"]".equals(lastChild.getText())) { editor.getDocument().insertString(lastChild.getTextRange().getEndOffset(), "]"); } diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/PySplitIfIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/PySplitIfIntention.java index 4425a8619244..4efc1ab0625b 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/PySplitIfIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/PySplitIfIntention.java @@ -55,11 +55,11 @@ public class PySplitIfIntention extends BaseIntentionAction { final IElementType elementType = elementAtOffset.getNode().getElementType(); if (elementType == PyTokenTypes.COLON) { elementAtOffset = elementAtOffset.getPrevSibling(); - elementAtOffset = PyPsiUtils.getFirstNonCommentBefore(elementAtOffset); + elementAtOffset = PyPsiUtils.getPrevNonCommentSibling(elementAtOffset, false); } else if (elementType == PyTokenTypes.IF_KEYWORD) { elementAtOffset = elementAtOffset.getNextSibling(); - elementAtOffset = PyPsiUtils.getFirstNonCommentAfter(elementAtOffset); + elementAtOffset = PyPsiUtils.getNextNonCommentSibling(elementAtOffset, false); } PsiElement element = PsiTreeUtil.getParentOfType(elementAtOffset, PyBinaryExpression.class, false); @@ -88,11 +88,11 @@ public class PySplitIfIntention extends BaseIntentionAction { final IElementType elementType = elementAtOffset.getNode().getElementType(); if (elementType == PyTokenTypes.COLON) { elementAtOffset = elementAtOffset.getPrevSibling(); - elementAtOffset = PyPsiUtils.getFirstNonCommentBefore(elementAtOffset); + elementAtOffset = PyPsiUtils.getPrevNonCommentSibling(elementAtOffset, false); } else if (elementType == PyTokenTypes.IF_KEYWORD) { elementAtOffset = elementAtOffset.getNextSibling(); - elementAtOffset = PyPsiUtils.getFirstNonCommentAfter(elementAtOffset); + elementAtOffset = PyPsiUtils.getNextNonCommentSibling(elementAtOffset, false); } PyBinaryExpression element = PsiTreeUtil.getParentOfType(elementAtOffset, PyBinaryExpression.class, false); diff --git a/python/src/com/jetbrains/python/documentation/DocStringUtil.java b/python/src/com/jetbrains/python/documentation/DocStringUtil.java index 121e550ee577..001d2c5070f0 100644 --- a/python/src/com/jetbrains/python/documentation/DocStringUtil.java +++ b/python/src/com/jetbrains/python/documentation/DocStringUtil.java @@ -64,8 +64,8 @@ public class DocStringUtil { @Nullable public static PyStringLiteralExpression findDocStringExpression(@Nullable PyElement parent) { if (parent != null) { - PsiElement seeker = PyPsiUtils.getFirstNonCommentAfter(parent.getFirstChild()); - if (seeker instanceof PyExpressionStatement) seeker = PyPsiUtils.getFirstNonCommentAfter(seeker.getFirstChild()); + PsiElement seeker = PyPsiUtils.getNextNonCommentSibling(parent.getFirstChild(), false); + if (seeker instanceof PyExpressionStatement) seeker = PyPsiUtils.getNextNonCommentSibling(seeker.getFirstChild(), false); if (seeker instanceof PyStringLiteralExpression) return (PyStringLiteralExpression)seeker; } return null;