From 2d68b1875b3b2269db173cbf7350ff5970a2da6d Mon Sep 17 00:00:00 2001 From: Valentina Kiryushkina Date: Wed, 14 Sep 2016 15:17:24 +0300 Subject: [PATCH] Fix PY-20752 'Replace with str.format method call' is messed up with tuples --- .../ConvertFormatOperatorToMethodIntention.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/ConvertFormatOperatorToMethodIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/ConvertFormatOperatorToMethodIntention.java index f3e2492c39b7..80e257598c9c 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/ConvertFormatOperatorToMethodIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/ConvertFormatOperatorToMethodIntention.java @@ -34,10 +34,7 @@ import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyBuiltinCache; import com.jetbrains.python.psi.impl.PyPsiUtils; import com.jetbrains.python.psi.impl.PyStringLiteralExpressionImpl; -import com.jetbrains.python.psi.types.PyClassType; -import com.jetbrains.python.psi.types.PyType; -import com.jetbrains.python.psi.types.PyTypeChecker; -import com.jetbrains.python.psi.types.TypeEvalContext; +import com.jetbrains.python.psi.types.*; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -272,7 +269,9 @@ public class ConvertFormatOperatorToMethodIntention extends BaseIntentionAction final String separator = getSeparator(leftExpression); target.append(separator).append(".format"); - if (rhs instanceof PyDictLiteralExpression) target.append("(**").append(paramText).append(")"); + if (rhs instanceof PyReferenceExpression && rhsType instanceof PyTupleType) { + target.append("(*").append(paramText).append(")"); + } else if (rhs instanceof PyCallExpression) { // potential dict(foo=1) -> format(foo=1) final PyCallExpression callExpression = (PyCallExpression)rhs; final PyExpression callee = callExpression.getCallee(); @@ -294,6 +293,11 @@ public class ConvertFormatOperatorToMethodIntention extends BaseIntentionAction } } } + else if (rhsType instanceof PyCollectionType) { + if ("dict".equals(rhsType.getName())) { + target.append("(**").append(paramText).append(")"); + } + } else target.append("(").append(paramText).append(")"); // tuple is ok as is // Correctly handle multiline implicitly concatenated string literals (PY-9176) target.insert(0, '(').append(')');