From 33aeb0b2af6fb3990ba57b41f95937b3bcec1606 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 28 Apr 2014 16:40:36 +0400 Subject: [PATCH 1/2] fixed PY-12804 PyStatementEffect inspection doesn't wrap exec argument in parenthesis --- .../StatementEffectFunctionCallQuickFix.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java index 1455d7ae4392..95daf466172e 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectFunctionCallQuickFix.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiWhiteSpace; import com.jetbrains.python.PyBundle; +import com.jetbrains.python.PyNames; import com.jetbrains.python.psi.LanguageLevel; import com.jetbrains.python.psi.PyElementGenerator; import com.jetbrains.python.psi.PyExpression; @@ -46,16 +47,19 @@ public class StatementEffectFunctionCallQuickFix implements LocalQuickFix { public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { PsiElement expression = descriptor.getPsiElement(); if (expression != null && expression.isWritable() && expression instanceof PyReferenceExpression) { - PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project); - if ("print".equals(expression.getText())) - replacePrint(expression, elementGenerator); + final String expressionText = expression.getText(); + if (PyNames.PRINT.equals(expressionText) || PyNames.EXEC.equals(expressionText)) + replacePrintExec(expression); else - expression.replace(elementGenerator.createCallExpression(LanguageLevel.forElement(expression), expression.getText())); + expression.replace(PyElementGenerator.getInstance(project).createCallExpression(LanguageLevel.forElement(expression), + expressionText)); } } - private static void replacePrint(PsiElement expression, PyElementGenerator elementGenerator) { - StringBuilder stringBuilder = new StringBuilder("print ("); + private static void replacePrintExec(@NotNull final PsiElement expression) { + final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(expression.getProject()); + final String expressionText = expression.getText(); + final StringBuilder stringBuilder = new StringBuilder(expressionText + " ("); final PsiElement whiteSpace = expression.getContainingFile().findElementAt(expression.getTextOffset() + expression.getTextLength()); PsiElement next = null; @@ -76,7 +80,7 @@ public class StatementEffectFunctionCallQuickFix implements LocalQuickFix { if (next != null) { final String text = next.getText(); stringBuilder.append(text); - if (text.endsWith(",")) + if (text.endsWith(",") && PyNames.PRINT.equals(expressionText)) stringBuilder.append(" end=' '"); next.delete(); } From 7a8f56ca41d0947affa72f7e7668e6b3006fc40e Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 28 Apr 2014 17:04:39 +0400 Subject: [PATCH 2/2] fixed PY-12717 Improper replacement of the `print x, y` statement for Py3+ --- .../quickfix/CompatibilityPrintCallQuickFix.java | 15 ++++++++------- python/testData/inspections/ReplacePrint_after.py | 2 ++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/python/src/com/jetbrains/python/inspections/quickfix/CompatibilityPrintCallQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/CompatibilityPrintCallQuickFix.java index a294b5d9f1a7..bd8936668c5a 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/CompatibilityPrintCallQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/CompatibilityPrintCallQuickFix.java @@ -23,9 +23,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Function; import com.jetbrains.python.PyBundle; -import com.jetbrains.python.psi.LanguageLevel; -import com.jetbrains.python.psi.PyElementGenerator; -import com.jetbrains.python.psi.PyExpression; +import com.jetbrains.python.psi.*; import org.jetbrains.annotations.NotNull; /** @@ -51,9 +49,9 @@ public class CompatibilityPrintCallQuickFix implements LocalQuickFix { } private static void replacePrint(PsiElement expression, PyElementGenerator elementGenerator) { - StringBuilder stringBuilder = new StringBuilder("print("); - - PyExpression[] target = PsiTreeUtil.getChildrenOfType(expression, PyExpression.class); + final StringBuilder stringBuilder = new StringBuilder("print("); + final PyFile file = (PyFile)expression.getContainingFile(); + final PyExpression[] target = PsiTreeUtil.getChildrenOfType(expression, PyExpression.class); if (target != null) { stringBuilder.append(StringUtil.join(target, new Function() { @Override @@ -62,9 +60,12 @@ public class CompatibilityPrintCallQuickFix implements LocalQuickFix { } }, ", ")); } - stringBuilder.append(")"); expression.replace(elementGenerator.createFromText(LanguageLevel.forElement(expression), PyExpression.class, stringBuilder.toString())); + + final PyFromImportStatement statement = elementGenerator.createFromText(LanguageLevel.forElement(expression), PyFromImportStatement.class, + "from __future__ import print_function"); + file.addBefore(statement, file.getStatements().get(0)); } } diff --git a/python/testData/inspections/ReplacePrint_after.py b/python/testData/inspections/ReplacePrint_after.py index 22a695b52668..51bf35ec2c42 100644 --- a/python/testData/inspections/ReplacePrint_after.py +++ b/python/testData/inspections/ReplacePrint_after.py @@ -1 +1,3 @@ +from __future__ import print_function + print("foo") \ No newline at end of file