From a78822ddba44dab6493545cf0a5e612286c5392a Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 4 Jun 2013 14:14:46 +0400 Subject: [PATCH] Unify getSourceRange() for declaration and expression movers --- .../upDownMover/AbstractJetUpDownMover.java | 40 +++++++++ .../upDownMover/JetDeclarationMover.java | 84 +++++-------------- .../upDownMover/JetExpressionMover.java | 57 +++---------- 3 files changed, 75 insertions(+), 106 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/AbstractJetUpDownMover.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/AbstractJetUpDownMover.java index 9605c588294..a97f06c754a 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/AbstractJetUpDownMover.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/AbstractJetUpDownMover.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.plugin.codeInsight.upDownMover; import com.intellij.codeInsight.editorActions.moveUpDown.LineMover; import com.intellij.codeInsight.editorActions.moveUpDown.LineRange; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; @@ -14,6 +15,45 @@ public abstract class AbstractJetUpDownMover extends LineMover { protected AbstractJetUpDownMover() { } + protected abstract boolean checkSourceElement(@NotNull PsiElement element); + protected abstract LineRange getElementSourceLineRange(@NotNull PsiElement element, @NotNull Editor editor, @NotNull LineRange oldRange); + + @Nullable + protected LineRange getSourceRange(@NotNull PsiElement firstElement, @NotNull PsiElement lastElement, @NotNull Editor editor, LineRange oldRange) { + if (firstElement == lastElement) { + LineRange sourceRange = getElementSourceLineRange(firstElement, editor, oldRange); + + if (sourceRange != null) { + sourceRange.firstElement = sourceRange.lastElement = firstElement; + } + + return sourceRange; + } + + PsiElement parent = PsiTreeUtil.findCommonParent(firstElement, lastElement); + if (parent == null) return null; + + Pair combinedRange = getElementRange(parent, firstElement, lastElement); + + if (combinedRange == null + || !checkSourceElement(combinedRange.first) + || !checkSourceElement(combinedRange.second)) { + return null; + } + + LineRange lineRange1 = getElementSourceLineRange(combinedRange.first, editor, oldRange); + if (lineRange1 == null) return null; + + LineRange lineRange2 = getElementSourceLineRange(combinedRange.second, editor, oldRange); + if (lineRange2 == null) return null; + + LineRange sourceRange = new LineRange(lineRange1.startLine, lineRange2.endLine); + sourceRange.firstElement = combinedRange.first; + sourceRange.lastElement = combinedRange.second; + + return sourceRange; + } + @Nullable protected static PsiElement getSiblingOfType(@NotNull PsiElement element, boolean down, @NotNull Class type) { return down ? PsiTreeUtil.getNextSiblingOfType(element, type) : PsiTreeUtil.getPrevSiblingOfType(element, type); diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetDeclarationMover.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetDeclarationMover.java index f31dbe9bbf8..eb5fdc3cfeb 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetDeclarationMover.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetDeclarationMover.java @@ -79,34 +79,6 @@ public class JetDeclarationMover extends AbstractJetUpDownMover { return memberSuspects; } - @Nullable - private static LineRange adjustDeclarationRange( - @NotNull JetDeclaration declaration, - @NotNull Editor editor, - @NotNull LineRange lineRange - ) { - Document doc = editor.getDocument(); - TextRange textRange = declaration.getTextRange(); - if (doc.getTextLength() < textRange.getEndOffset()) return null; - - int startLine = editor.offsetToLogicalPosition(textRange.getStartOffset()).line; - int endLine = editor.offsetToLogicalPosition(textRange.getEndOffset()).line + 1; - - if (startLine == lineRange.startLine || startLine == lineRange.endLine - || endLine == lineRange.startLine || endLine == lineRange.endLine) { - return new LineRange(startLine, endLine); - } - - TextRange lineTextRange = new TextRange(doc.getLineStartOffset(lineRange.startLine), - doc.getLineEndOffset(lineRange.endLine)); - for (PsiElement anchor : getDeclarationAnchors(declaration)) { - TextRange suspectTextRange = anchor.getTextRange(); - if (suspectTextRange != null && lineTextRange.intersects(suspectTextRange)) return new LineRange(startLine, endLine); - } - - return null; - } - private static final Class[] DECLARATION_CONTAINER_CLASSES = {JetClassBody.class, JetClassInitializer.class, JetFunction.class, JetPropertyAccessor.class, JetFile.class}; @@ -126,45 +98,35 @@ public class JetDeclarationMover extends AbstractJetUpDownMover { CLASSBODYLIKE_DECLARATION_CONTAINER_CLASSES) ? declaration : null; } - @Nullable - private static LineRange getSourceRange( - @NotNull JetDeclaration firstDecl, - @NotNull JetDeclaration lastDecl, - @NotNull Editor editor, - @NotNull LineRange oldRange - ) { - if (firstDecl == lastDecl) { - LineRange range = adjustDeclarationRange(firstDecl, editor, oldRange); + @Override + protected boolean checkSourceElement(@NotNull PsiElement element) { + return element instanceof JetDeclaration; + } - if (range != null) { - range.firstElement = range.lastElement = firstDecl; - } + @Override + protected LineRange getElementSourceLineRange(@NotNull PsiElement element, @NotNull Editor editor, @NotNull LineRange oldRange) { + JetDeclaration declaration = (JetDeclaration) element; - return range; + Document doc = editor.getDocument(); + TextRange textRange = declaration.getTextRange(); + if (doc.getTextLength() < textRange.getEndOffset()) return null; + + int startLine = editor.offsetToLogicalPosition(textRange.getStartOffset()).line; + int endLine = editor.offsetToLogicalPosition(textRange.getEndOffset()).line + 1; + + if (startLine == oldRange.startLine || startLine == oldRange.endLine + || endLine == oldRange.startLine || endLine == oldRange.endLine) { + return new LineRange(startLine, endLine); } - PsiElement parent = PsiTreeUtil.findCommonParent(firstDecl, lastDecl); - if (parent == null) return null; - - Pair combinedRange = getElementRange(parent, firstDecl, lastDecl); - - if (combinedRange == null - || !(combinedRange.first instanceof JetDeclaration) - || !(combinedRange.second instanceof JetDeclaration)) { - return null; + TextRange lineTextRange = new TextRange(doc.getLineStartOffset(oldRange.startLine), + doc.getLineEndOffset(oldRange.endLine)); + for (PsiElement anchor : getDeclarationAnchors(declaration)) { + TextRange suspectTextRange = anchor.getTextRange(); + if (suspectTextRange != null && lineTextRange.intersects(suspectTextRange)) return new LineRange(startLine, endLine); } - LineRange lineRange1 = adjustDeclarationRange((JetDeclaration) combinedRange.getFirst(), editor, oldRange); - if (lineRange1 == null) return null; - - LineRange lineRange2 = adjustDeclarationRange((JetDeclaration) combinedRange.getSecond(), editor, oldRange); - if (lineRange2 == null) return null; - - LineRange range = new LineRange(lineRange1.startLine, lineRange2.endLine); - range.firstElement = combinedRange.getFirst(); - range.lastElement = combinedRange.getSecond(); - - return range; + return null; } @Nullable diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java index 5909b1ba488..81d4d544464 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java @@ -30,17 +30,6 @@ public class JetExpressionMover extends AbstractJetUpDownMover { private static Class[] FUNCTIONLIKE_ELEMENT_CLASSES = {JetFunction.class, JetPropertyAccessor.class, JetClassInitializer.class}; - @Nullable - private static LineRange getLineRange(@NotNull PsiElement element, @NotNull Editor editor) { - TextRange textRange = element.getTextRange(); - if (editor.getDocument().getTextLength() < textRange.getEndOffset()) return null; - - int startLine = editor.offsetToLogicalPosition(textRange.getStartOffset()).line; - int endLine = editor.offsetToLogicalPosition(textRange.getEndOffset()).line + 1; - - return new LineRange(startLine, endLine); - } - @Nullable private static PsiElement getStandaloneClosingBrace(@NotNull PsiFile file, @NotNull Editor editor) { LineRange range = getLineRangeFromSelection(editor); @@ -259,42 +248,20 @@ public class JetExpressionMover extends AbstractJetUpDownMover { return null; } - @Nullable - private static LineRange getSourceRange(@NotNull PsiElement firstElement, @NotNull PsiElement lastElement, @NotNull Editor editor) { - if (firstElement == lastElement) { - //noinspection ConstantConditions - LineRange sourceRange = getLineRange(firstElement, editor); + @Override + protected boolean checkSourceElement(@NotNull PsiElement element) { + return PsiTreeUtil.instanceOf(element, MOVABLE_ELEMENT_CLASSES); + } - if (sourceRange != null) { - sourceRange.firstElement = sourceRange.lastElement = firstElement; - } + @Override + protected LineRange getElementSourceLineRange(@NotNull PsiElement element, @NotNull Editor editor, @NotNull LineRange oldRange) { + TextRange textRange = element.getTextRange(); + if (editor.getDocument().getTextLength() < textRange.getEndOffset()) return null; - return sourceRange; - } + int startLine = editor.offsetToLogicalPosition(textRange.getStartOffset()).line; + int endLine = editor.offsetToLogicalPosition(textRange.getEndOffset()).line + 1; - //noinspection ConstantConditions - PsiElement parent = PsiTreeUtil.findCommonParent(firstElement, lastElement); - if (parent == null) return null; - - Pair combinedRange = getElementRange(parent, firstElement, lastElement); - - if (combinedRange == null - || !(PsiTreeUtil.instanceOf(combinedRange.first, MOVABLE_ELEMENT_CLASSES)) - || !(PsiTreeUtil.instanceOf(combinedRange.second, MOVABLE_ELEMENT_CLASSES))) { - return null; - } - - LineRange lineRange1 = getLineRange(combinedRange.first, editor); - if (lineRange1 == null) return null; - - LineRange lineRange2 = getLineRange(combinedRange.second, editor); - if (lineRange2 == null) return null; - - LineRange sourceRange = new LineRange(lineRange1.startLine, lineRange2.endLine); - sourceRange.firstElement = combinedRange.first; - sourceRange.lastElement = combinedRange.second; - - return sourceRange; + return new LineRange(startLine, endLine); } @Nullable @@ -415,7 +382,7 @@ public class JetExpressionMover extends AbstractJetUpDownMover { return true; } - LineRange sourceRange = getSourceRange(firstElement, lastElement, editor); + LineRange sourceRange = getSourceRange(firstElement, lastElement, editor, oldRange); if (sourceRange == null) return false; PsiElement sibling = adjustWhiteSpaceSibling(editor, sourceRange, info, down);