From 43f00d7705ccdddb4e64dacb01af1c09e5ba82ad Mon Sep 17 00:00:00 2001 From: "andrey.matveev" Date: Wed, 25 Nov 2020 21:32:23 +0700 Subject: [PATCH] PY-41312 Fix moving selected lines with different folding level (cherry picked from commit a099d7b13c66615bf54aa7bdd5273770de3afaba) IJ-MR-4314 GitOrigin-RevId: dffaccd88d13ca77cd281a28c46e9d43513a43c6 --- .../editorActions/moveUpDown/PyStatementMover.java | 14 ++++++++++---- ...electionDifferentIndentLevelsMoveThroughPass.py | 5 +++++ ...fferentIndentLevelsMoveThroughPass_afterDown.py | 5 +++++ ...DifferentIndentLevelsMoveThroughPass_afterUp.py | 5 +++++ ...electionDifferentIndentLevelsMoveToEmptyLine.py | 7 +++++++ ...fferentIndentLevelsMoveToEmptyLine_afterDown.py | 7 +++++++ ...DifferentIndentLevelsMoveToEmptyLine_afterUp.py | 7 +++++++ .../com/jetbrains/python/PyStatementMoverTest.java | 10 ++++++++++ 8 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass.py create mode 100644 python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass_afterDown.py create mode 100644 python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass_afterUp.py create mode 100644 python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine.py create mode 100644 python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine_afterDown.py create mode 100644 python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine_afterUp.py diff --git a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java index b7fb30af73ad..a1f04eaa57ff 100644 --- a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java +++ b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java @@ -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); diff --git a/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass.py b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass.py new file mode 100644 index 000000000000..468cea1ad496 --- /dev/null +++ b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass.py @@ -0,0 +1,5 @@ +pass +n = 0 +while n: + print("spam") +pass \ No newline at end of file diff --git a/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass_afterDown.py b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass_afterDown.py new file mode 100644 index 000000000000..215c000b1a60 --- /dev/null +++ b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass_afterDown.py @@ -0,0 +1,5 @@ +pass +pass +n = 0 +while n: + print("spam") diff --git a/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass_afterUp.py b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass_afterUp.py new file mode 100644 index 000000000000..b89c72966f4b --- /dev/null +++ b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveThroughPass_afterUp.py @@ -0,0 +1,5 @@ +n = 0 +while n: + print("spam") +pass +pass \ No newline at end of file diff --git a/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine.py b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine.py new file mode 100644 index 000000000000..635871304aff --- /dev/null +++ b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine.py @@ -0,0 +1,7 @@ +pass + +n = 0 +while n: + print("spam") + +pass \ No newline at end of file diff --git a/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine_afterDown.py b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine_afterDown.py new file mode 100644 index 000000000000..f393f2e90d98 --- /dev/null +++ b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine_afterDown.py @@ -0,0 +1,7 @@ +pass + + +n = 0 +while n: + print("spam") +pass \ No newline at end of file diff --git a/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine_afterUp.py b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine_afterUp.py new file mode 100644 index 000000000000..e96403dcc12e --- /dev/null +++ b/python/testData/mover/multiLineSelectionDifferentIndentLevelsMoveToEmptyLine_afterUp.py @@ -0,0 +1,7 @@ +pass +n = 0 +while n: + print("spam") + + +pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java index 66f5441311f5..c57faedfd50c 100644 --- a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java +++ b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java @@ -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(); }