diff --git a/python/src/com/jetbrains/python/refactoring/PyReplaceExpressionUtil.java b/python/src/com/jetbrains/python/refactoring/PyReplaceExpressionUtil.java index 2cebb3ec2720..4a8d2b9d8551 100644 --- a/python/src/com/jetbrains/python/refactoring/PyReplaceExpressionUtil.java +++ b/python/src/com/jetbrains/python/refactoring/PyReplaceExpressionUtil.java @@ -61,21 +61,26 @@ public class PyReplaceExpressionUtil implements PyElementTypes { private PyReplaceExpressionUtil() {} + /** + * @param oldExpr old expression that will be substituted + * @param newExpr new expression to substitute with + * @return whether new expression should be wrapped in parenthesis to preserve original semantics + */ public static boolean isNeedParenthesis(@NotNull final PyElement oldExpr, @NotNull final PyElement newExpr) { final PyElement parentExpr = (PyElement)oldExpr.getParent(); if (parentExpr instanceof PyArgumentList) { return newExpr instanceof PyTupleExpression; } - if (!(parentExpr instanceof PyExpression)) { + if (parentExpr instanceof PyParenthesizedExpression || !(parentExpr instanceof PyExpression)) { return false; } - int newPriority = getExpressionPriority(newExpr); - int parentPriority = getExpressionPriority(parentExpr); + final int newPriority = getExpressionPriority(newExpr); + final int parentPriority = getExpressionPriority(parentExpr); if (parentPriority > newPriority) { return true; } else if (parentPriority == newPriority && parentPriority != 0) { if (parentExpr instanceof PyBinaryExpression) { - PyBinaryExpression binaryExpression = (PyBinaryExpression)parentExpr; + final PyBinaryExpression binaryExpression = (PyBinaryExpression)parentExpr; if (isNotAssociative(binaryExpression) && oldExpr.equals(binaryExpression.getRightExpression())) { return true; } diff --git a/python/testData/refactoring/inlinelocal/referenceInParenthesis.after.py b/python/testData/refactoring/inlinelocal/referenceInParenthesis.after.py new file mode 100644 index 000000000000..67bea27b020e --- /dev/null +++ b/python/testData/refactoring/inlinelocal/referenceInParenthesis.after.py @@ -0,0 +1,3 @@ +print ('spam!' * 42) +('spam!' * 42) +hex('spam!' * 42) \ No newline at end of file diff --git a/python/testData/refactoring/inlinelocal/referenceInParenthesis.before.py b/python/testData/refactoring/inlinelocal/referenceInParenthesis.before.py new file mode 100644 index 000000000000..da3059f478cd --- /dev/null +++ b/python/testData/refactoring/inlinelocal/referenceInParenthesis.before.py @@ -0,0 +1,5 @@ +x = 'spam!' * 42 + +print (x) +(x) +hex(x) \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyInlineLocalTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyInlineLocalTest.java index 4f02da1038ff..a86cf066bd4a 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/PyInlineLocalTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/PyInlineLocalTest.java @@ -81,7 +81,13 @@ public class PyInlineLocalTest extends PyTestCase { doTest(); } + // PY-12401 public void testComment() { doTest(); } + + // PY-13114 + public void testReferenceInParenthesis() { + doTest(); + } }