From d598c1fefae13a51334c5f012b9e033e64db7484 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 21 Feb 2011 11:19:19 +0300 Subject: [PATCH] fixed PY-2970 Join 2 if's intention alters behavior of code --- .../intentions/PyJoinIfIntention.java | 3 ++- .../intentions/beforeJoinIfMultiStatements.py | 16 ++++++++++++++++ .../com/jetbrains/python/PyIntentionTest.java | 4 ++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 python/testData/intentions/beforeJoinIfMultiStatements.py diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/PyJoinIfIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/PyJoinIfIntention.java index 9b24d8f753b8..720f3f82ba5a 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/PyJoinIfIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/PyJoinIfIntention.java @@ -45,7 +45,8 @@ public class PyJoinIfIntention extends BaseIntentionAction { if (outer != null) { if (outer.getElsePart() != null || outer.getElifParts().length > 0) return false; PyStatement firstStatement = getFirstStatement(outer); - + PyStatementList outerStList = outer.getIfPart().getStatementList(); + if (outerStList != null && outerStList.getStatements().length != 1) return false; if (firstStatement instanceof PyIfStatement) { final PyIfStatement inner = (PyIfStatement)firstStatement; if (inner.getElsePart() != null || inner.getElifParts().length > 0) return false; diff --git a/python/testData/intentions/beforeJoinIfMultiStatements.py b/python/testData/intentions/beforeJoinIfMultiStatements.py new file mode 100644 index 000000000000..98e74d7e1ac5 --- /dev/null +++ b/python/testData/intentions/beforeJoinIfMultiStatements.py @@ -0,0 +1,16 @@ +class A: + def __init__(self, *args, **kwargs): + self.uses_remaining_this_turn = None + self.effects = None + + def foo(self): + if self.can_activate(): + if self.effect_queue is None: + self.effect_queue = list(self.effects) + for effect in self.effect_queue: + effect.activate(source, targets) + self.effect_queue = None + self.uses_remaining_this_turn -= 1 + + def can_activate(self): + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyIntentionTest.java b/python/testSrc/com/jetbrains/python/PyIntentionTest.java index c39c3c0622ec..6c12e1710939 100644 --- a/python/testSrc/com/jetbrains/python/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/PyIntentionTest.java @@ -125,6 +125,10 @@ public class PyIntentionTest extends PyLightFixtureTestCase { doNegativeTest(PyBundle.message("INTN.join.if.text")); } + public void testJoinIfMultiStatements() { //PY-2970 + doNegativeTest(PyBundle.message("INTN.join.if.text")); + } + public void testDictConstructorToLiteralForm() { doTest(PyBundle.message("INTN.convert.dict.constructor.to.dict.literal")); }