From 1a63f9b815b16ab5c225443ecf424762d4255136 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 9 Sep 2014 16:16:29 +0400 Subject: [PATCH] Refactoring Util: Implement PsiElement.getLineCount() --- .../upDownMover/AbstractJetUpDownMover.java | 13 ++------ .../upDownMover/JetDeclarationMover.java | 9 ++--- .../upDownMover/JetExpressionMover.java | 6 ++-- .../plugin/refactoring/jetRefactoringUtil.kt | 33 ++++++++++++++++++- 4 files changed, 42 insertions(+), 19 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 7d72603f2da..c91facb4393 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/AbstractJetUpDownMover.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/AbstractJetUpDownMover.java @@ -31,6 +31,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetBlockExpression; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFunctionLiteral; +import org.jetbrains.jet.plugin.refactoring.RefactoringPackage; public abstract class AbstractJetUpDownMover extends LineMover { protected AbstractJetUpDownMover() { @@ -83,7 +84,7 @@ public abstract class AbstractJetUpDownMover extends LineMover { } if (comment != null) { - int extension = getElementLineCount(comment, editor); + int extension = RefactoringPackage.getLineCount(comment); if (extendDown) { bottomExtension = extension; } @@ -132,16 +133,6 @@ public abstract class AbstractJetUpDownMover extends LineMover { return sourceRange; } - protected static int getElementLineCount(PsiElement element, Editor editor) { - Document doc = editor.getDocument(); - TextRange spaceRange = element.getTextRange(); - - int startLine = doc.getLineNumber(spaceRange.getStartOffset()); - int endLine = doc.getLineNumber(spaceRange.getEndOffset()); - - return endLine - startLine; - } - protected static int getElementLine(PsiElement element, Editor editor, boolean first) { if (element == null) return -1; 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 a5dc3eff850..bb63a8a301e 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetDeclarationMover.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetDeclarationMover.java @@ -27,6 +27,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.plugin.refactoring.RefactoringPackage; import java.util.ArrayList; import java.util.List; @@ -182,7 +183,7 @@ public class JetDeclarationMover extends AbstractJetUpDownMover { @Override protected PsiElement adjustElement(PsiElement element, Editor editor, boolean first) { - return first ? getTopmostSiblingCommentOrOriginal(element, editor) : element; + return first ? getTopmostSiblingCommentOrOriginal(element) : element; } @Nullable @@ -255,7 +256,7 @@ public class JetDeclarationMover extends AbstractJetUpDownMover { if (target instanceof JetPropertyAccessor && !(sibling instanceof JetPropertyAccessor)) return null; if (!down && start instanceof JetDeclaration) { - start = getTopmostSiblingCommentOrOriginal(start, editor); + start = getTopmostSiblingCommentOrOriginal(start); } else if (start != null && start.getFirstChild() != null) { start = skipInsignificantElements(start.getFirstChild(), true); @@ -311,11 +312,11 @@ public class JetDeclarationMover extends AbstractJetUpDownMover { } @NotNull - private static PsiElement getTopmostSiblingCommentOrOriginal(@NotNull PsiElement originalElement, @NotNull Editor editor) { + private static PsiElement getTopmostSiblingCommentOrOriginal(@NotNull PsiElement originalElement) { PsiElement element = originalElement; PsiElement sibling = element.getPrevSibling(); while (sibling instanceof PsiComment - || (sibling instanceof PsiWhiteSpace && getElementLineCount(sibling, editor) <= 1) + || (sibling instanceof PsiWhiteSpace && !RefactoringPackage.isMultiLine(sibling)) || (sibling != null && (sibling.getText() == null || sibling.getText().isEmpty()))) { if (sibling instanceof PsiComment) { element = sibling; 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 0955997efbf..05ebf441e77 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/upDownMover/JetExpressionMover.java @@ -31,6 +31,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage; import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.plugin.refactoring.RefactoringPackage; import java.util.List; @@ -431,7 +432,6 @@ public class JetExpressionMover extends AbstractJetUpDownMover { } protected static PsiElement adjustSibling( - @NotNull Editor editor, @NotNull LineRange sourceRange, @NotNull MoveInfo info, boolean down @@ -448,7 +448,7 @@ public class JetExpressionMover extends AbstractJetUpDownMover { } if (whiteSpaceTestSubject instanceof PsiWhiteSpace) { - if (getElementLineCount(whiteSpaceTestSubject, editor) > 1) { + if (RefactoringPackage.isMultiLine(whiteSpaceTestSubject)) { int nearLine = down ? sourceRange.endLine : sourceRange.startLine - 1; info.toMove = sourceRange; @@ -524,7 +524,7 @@ public class JetExpressionMover extends AbstractJetUpDownMover { LineRange sourceRange = getSourceRange(firstElement, lastElement, editor, oldRange); if (sourceRange == null) return false; - PsiElement sibling = getLastNonWhiteSiblingInLine(adjustSibling(editor, sourceRange, info, down), editor, down); + PsiElement sibling = getLastNonWhiteSiblingInLine(adjustSibling(sourceRange, info, down), editor, down); // Either reached last sibling, or jumped over multi-line whitespace if (sibling == null) return true; diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt index 8d634b8ce86..0c1869837e9 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/jetRefactoringUtil.kt @@ -62,6 +62,10 @@ import com.intellij.openapi.editor.colors.EditorColorsManager import com.intellij.ui.components.JBList import com.intellij.openapi.ui.popup.JBPopupAdapter import com.intellij.openapi.ui.popup.LightweightWindowEvent +import com.intellij.openapi.editor.Document +import com.intellij.psi.PsiDocumentManager +import com.intellij.psi.PsiElementVisitor +import com.intellij.psi.PsiWhiteSpace /** * Replace [[JetSimpleNameExpression]] (and its enclosing qualifier) with qualified element given by FqName @@ -254,4 +258,31 @@ public class SelectionAwareScopeHighlighter(val editor: Editor) { highlighters.forEach { it.dispose() } highlighters.clear() } -} \ No newline at end of file +} + +fun PsiElement.getLineCount(): Int { + val doc = getContainingFile()?.let { file -> PsiDocumentManager.getInstance(getProject()).getDocument(file) } + if (doc != null) { + val spaceRange = getTextRange() ?: TextRange.EMPTY_RANGE + + val startLine = doc.getLineNumber(spaceRange.getStartOffset()) + val endLine = doc.getLineNumber(spaceRange.getEndOffset()) + + return endLine - startLine + } + + var lineCount = 1 + accept( + object: JetTreeVisitorVoid() { + override fun visitWhiteSpace(space: PsiWhiteSpace) { + if ("\n" in space.getText() ?: "") { + lineCount++ + } + } + } + ) + + return lineCount +} + +fun PsiElement.isMultiLine(): Boolean = getLineCount() > 1 \ No newline at end of file