From 877fae21f2a9abf5152a0826ccafc4fcafcd9e31 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 8 Sep 2014 17:55:30 +0400 Subject: [PATCH] fixed PY-13868 Move statement on a comment inside a dict deletes the dict --- .../editorActions/moveUpDown/PyStatementMover.java | 10 +++++----- python/testData/mover/outsideFromDict.py | 5 +++++ python/testData/mover/outsideFromDict_afterDown.py | 5 +++++ python/testData/mover/outsideFromDict_afterUp.py | 5 +++++ .../com/jetbrains/python/PyStatementMoverTest.java | 4 ++++ 5 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 python/testData/mover/outsideFromDict.py create mode 100644 python/testData/mover/outsideFromDict_afterDown.py create mode 100644 python/testData/mover/outsideFromDict_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 65cd5e1a79ce..06b882b2066c 100644 --- a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java +++ b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java @@ -119,10 +119,6 @@ public class PyStatementMover extends LineMover { final int startLine = document.getLineNumber(start); final int endLine = document.getLineNumber(end); - if (elementToMove instanceof PsiComment && destination instanceof PsiComment) { - return new LineRange(lineNumber, lineNumber + 1); - } - if (elementToMove instanceof PyClass || elementToMove instanceof PyFunction) { PyElement scope = statementList == null ? (PyElement)elementToMove.getContainingFile() : statementList; if (destination != null) @@ -137,6 +133,11 @@ public class PyStatementMover extends LineMover { scopeRange = moveInto(elementToMove, file, editor, down, lineEndOffset); if (scopeRange != null) return scopeRange; + if (elementToMove instanceof PsiComment && ( PsiTreeUtil.isAncestor(destination, elementToMove, true)) || + destination instanceof PsiComment) { + return new LineRange(lineNumber, lineNumber + 1); + } + final PyElement scope = statementList == null ? (PyElement)elementToMove.getContainingFile() : statementList; if ((elementToMove instanceof PyClass) || (elementToMove instanceof PyFunction)) return new ScopeRange(scope, scope.getFirstChild(), !down, true); @@ -185,7 +186,6 @@ public class PyStatementMover extends LineMover { if (sibling != null) { final PyStatementList list = sibling.getStatementList(); - assert list != null; return new ScopeRange(list, down ? list.getFirstChild() : list.getLastChild(), !addBefore); } else { diff --git a/python/testData/mover/outsideFromDict.py b/python/testData/mover/outsideFromDict.py new file mode 100644 index 000000000000..52f81fd16a8e --- /dev/null +++ b/python/testData/mover/outsideFromDict.py @@ -0,0 +1,5 @@ +a = { + 1:1, + # test + 2:2 +} diff --git a/python/testData/mover/outsideFromDict_afterDown.py b/python/testData/mover/outsideFromDict_afterDown.py new file mode 100644 index 000000000000..551adfcd7894 --- /dev/null +++ b/python/testData/mover/outsideFromDict_afterDown.py @@ -0,0 +1,5 @@ +a = { + 1:1, + 2:2 + # test +} diff --git a/python/testData/mover/outsideFromDict_afterUp.py b/python/testData/mover/outsideFromDict_afterUp.py new file mode 100644 index 000000000000..36f665bfc69f --- /dev/null +++ b/python/testData/mover/outsideFromDict_afterUp.py @@ -0,0 +1,5 @@ +a = { + # test + 1:1, + 2:2 +} diff --git a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java index 3539150731b6..86a4728f6ce1 100644 --- a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java +++ b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java @@ -260,6 +260,10 @@ public class PyStatementMoverTest extends PyTestCase { doTest(); } + public void testOutsideFromDict() { //PY-11595 + doTest(); + } + public void testWith() { // PY-5202 try { setLanguageLevel(LanguageLevel.PYTHON27);