PY-41312 Fix moving selected lines with different folding level

(cherry picked from commit a099d7b13c66615bf54aa7bdd5273770de3afaba)

IJ-MR-4314

GitOrigin-RevId: dffaccd88d13ca77cd281a28c46e9d43513a43c6
This commit is contained in:
andrey.matveev
2021-02-25 10:53:06 +00:00
committed by intellij-monorepo-bot
parent 72f751f5a4
commit 43f00d7705
8 changed files with 56 additions and 4 deletions
@@ -18,10 +18,7 @@ package com.jetbrains.python.codeInsight.editorActions.moveUpDown;
import com.intellij.codeInsight.editorActions.moveUpDown.LineMover;
import com.intellij.codeInsight.editorActions.moveUpDown.LineRange;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.CaretModel;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
@@ -31,6 +28,7 @@ import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.source.PostprocessReformattingAspect;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -69,6 +67,14 @@ public class PyStatementMover extends LineMover {
else if (PsiTreeUtil.isAncestor(elementToMove2, elementToMove1, false)) {
elementToMove1 = elementToMove2;
}
else {
PsiElement commonParent = PsiTreeUtil.findCommonParent(elementToMove1, elementToMove2);
if (commonParent == null) return false;
elementToMove1 = PyPsiUtils.getParentRightBefore(elementToMove1, commonParent);
elementToMove2 = PyPsiUtils.getParentRightBefore(elementToMove2, commonParent);
assert elementToMove1 != null && elementToMove2 != null;
}
info.toMove = new MyLineRange(elementToMove1, elementToMove2);
info.toMove2 = getDestinationScope(file, editor, down ? elementToMove2 : elementToMove1, down);
@@ -0,0 +1,5 @@
pass
<caret><selection>n = 0
while n:
print("spam")</selection>
pass
@@ -0,0 +1,5 @@
pass
pass
<caret><selection>n = 0
while n:
print("spam")</selection>
@@ -0,0 +1,5 @@
<caret><selection>n = 0
while n:
print("spam")</selection>
pass
pass
@@ -0,0 +1,7 @@
pass
<caret><selection>n = 0
while n:
print("spam")</selection>
pass
@@ -0,0 +1,7 @@
pass
<caret><selection>n = 0
while n:
print("spam")</selection>
pass
@@ -0,0 +1,7 @@
pass
<caret><selection>n = 0
while n:
print("spam")</selection>
pass
@@ -238,6 +238,16 @@ public class PyStatementMoverTest extends PyTestCase {
doTest();
}
// PY-41312
public void testMultiLineSelectionDifferentIndentLevelsMoveToEmptyLine() {
doTest();
}
// PY-41312
public void testMultiLineSelectionDifferentIndentLevelsMoveThroughPass() {
doTest();
}
public void testTheSameLevelMultiple() { //PY-10947
doTest();
}