diff --git a/python/src/com/jetbrains/python/inspections/PyDictCreationInspection.java b/python/src/com/jetbrains/python/inspections/PyDictCreationInspection.java index bf8edf416cd0..778aad164878 100644 --- a/python/src/com/jetbrains/python/inspections/PyDictCreationInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyDictCreationInspection.java @@ -2,7 +2,9 @@ package com.jetbrains.python.inspections; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.openapi.util.Pair; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.PyBundle; import com.jetbrains.python.actions.DictCreationQuickFix; @@ -10,6 +12,9 @@ import com.jetbrains.python.psi.*; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; + /** * @author Alexey.Ivanov */ @@ -39,7 +44,8 @@ public class PyDictCreationInspection extends PyInspection { if (node.getTargets().length != 1) { return; } - String name = node.getTargets()[0].getName(); + final PyExpression target = node.getTargets()[0]; + String name = target.getName(); if (name == null) { return; } @@ -54,7 +60,9 @@ loop: for (Pair targetToValue : assignmentStatement.getTargetsToValuesMapping()) { if (targetToValue.first instanceof PySubscriptionExpression) { PySubscriptionExpression subscriptionExpression = (PySubscriptionExpression)targetToValue.first; - if (name.equals(subscriptionExpression.getOperand().getName()) && subscriptionExpression.getIndexExpression() != null) { + if (name.equals(subscriptionExpression.getOperand().getName()) && + subscriptionExpression.getIndexExpression() != null && + !referencesTarget(targetToValue.second, target)) { if (!availableFix) { quickFix = new DictCreationQuickFix(node); availableFix = true; @@ -73,9 +81,24 @@ loop: } if (availableFix) { - registerProblem(node, "This dictionary creation could be rewritten by dictionary literal", quickFix); + registerProblem(node, "This dictionary creation could be rewritten as a dictionary literal", quickFix); } } } + + private boolean referencesTarget(PyExpression expression, final PyExpression target) { + final List refs = new ArrayList(); + expression.accept(new PyRecursiveElementVisitor() { + @Override + public void visitPyReferenceExpression(PyReferenceExpression node) { + super.visitPyReferenceExpression(node); + final PsiPolyVariantReference ref = node.getReference(); + if (ref.isReferenceTo(target)) { + refs.add(node); + } + } + }); + return !refs.isEmpty(); + } } } diff --git a/python/testData/inspections/PyDictCreationInspection/expected.xml b/python/testData/inspections/PyDictCreationInspection/expected.xml deleted file mode 100644 index df3d39721312..000000000000 --- a/python/testData/inspections/PyDictCreationInspection/expected.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - test.py - 1 - This dictionary creation could be rewritten by dictionary literal - - \ No newline at end of file diff --git a/python/testData/inspections/PyDictCreationInspection/test.py b/python/testData/inspections/PyDictCreationInspection/test.py new file mode 100644 index 000000000000..df4c9c835bc2 --- /dev/null +++ b/python/testData/inspections/PyDictCreationInspection/test.py @@ -0,0 +1,17 @@ +dict = {"n": "n"} +dict["a"], dict["b"] = "a", "b" +dict["k"] = "k" + +dict, a = {"n": "n"} +dict["a"], a["b"] = "a", "b" +dict["k"] = "k" + +d = {} +foo() +d["a"] = 3 + +def someiter(): + yield 1 + yield 2 +dikt = { 'results' : list(someiter()) } +dikt['num_results'] = len(dikt['results']) diff --git a/python/testSrc/com/jetbrains/python/PythonInspectionsTest.java b/python/testSrc/com/jetbrains/python/PythonInspectionsTest.java index a40f8949a72d..6c4838752053 100644 --- a/python/testSrc/com/jetbrains/python/PythonInspectionsTest.java +++ b/python/testSrc/com/jetbrains/python/PythonInspectionsTest.java @@ -102,8 +102,7 @@ public class PythonInspectionsTest extends PyLightFixtureTestCase { } public void testPyDictCreationInspection() throws Throwable { - LocalInspectionTool inspection = new PyDictCreationInspection(); - doTest(getTestName(false), inspection); + doHighlightingTest(PyDictCreationInspection.class); } public void testPyDeprecatedModulesInspection() throws Throwable {