From ac71f3f436d32fd97e26d62e6140cb1600718564 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Sat, 5 May 2012 13:46:09 +0400 Subject: [PATCH] fixed PY-6505 "Replace + with string formatting operator" is available in a context which has nothing to do with strings --- .../PyStringConcatenationToFormatIntention.java | 10 ++++++++-- .../testData/intentions/beforeStringConcatToFormat2.py | 3 +++ .../testSrc/com/jetbrains/python/PyIntentionTest.java | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 python/testData/intentions/beforeStringConcatToFormat2.py diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/PyStringConcatenationToFormatIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/PyStringConcatenationToFormatIntention.java index d6d21c5c7e84..70c50026a554 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/PyStringConcatenationToFormatIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/PyStringConcatenationToFormatIntention.java @@ -12,6 +12,9 @@ import com.intellij.util.NotNullFunction; import com.jetbrains.python.PyBundle; import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.impl.PyBuiltinCache; +import com.jetbrains.python.psi.types.PyTypeChecker; +import com.jetbrains.python.psi.types.TypeEvalContext; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -46,9 +49,12 @@ public class PyStringConcatenationToFormatIntention extends BaseIntentionAction return false; } boolean hasReferenceOrCall = false; + final PyBuiltinCache cache = PyBuiltinCache.getInstance(element); for (PyExpression expression: expressions) { - if (expression instanceof PyReferenceExpression - || expression instanceof PyCallExpression) + if ((expression instanceof PyReferenceExpression + || expression instanceof PyCallExpression) && + PyTypeChecker.match(cache.getStringType(LanguageLevel.forElement(expression)), + expression.getType(TypeEvalContext.fast()), TypeEvalContext.fast())) hasReferenceOrCall = true; else if (!(expression instanceof PyStringLiteralExpression)) return false; diff --git a/python/testData/intentions/beforeStringConcatToFormat2.py b/python/testData/intentions/beforeStringConcatToFormat2.py new file mode 100644 index 000000000000..23ec7b88d905 --- /dev/null +++ b/python/testData/intentions/beforeStringConcatToFormat2.py @@ -0,0 +1,3 @@ +foo = [] +bar = [] +foo = foo + bar \ 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 64d461ad0d2b..7ca593abcf07 100644 --- a/python/testSrc/com/jetbrains/python/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/PyIntentionTest.java @@ -110,6 +110,10 @@ public class PyIntentionTest extends PyTestCase { doTest(PyBundle.message("INTN.replace.plus.with.format.operator")); } + public void testStringConcatToFormat2() { //PY-6505 + doNegativeTest(PyBundle.message("INTN.replace.plus.with.format.operator")); + } + public void testConvertFormatOperatorToMethod() { doTest(PyBundle.message("INTN.replace.with.method"), LanguageLevel.PYTHON26); }