Unify processing dict keys (PY-27375)

This commit is contained in:
Semyon Proshev
2018-03-22 21:48:58 +03:00
parent 8f1b015e5d
commit 8a8cca6580
2 changed files with 35 additions and 11 deletions
@@ -20,7 +20,6 @@ import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import java.util.HashMap;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.inspections.quickfix.PyRemoveDictKeyQuickFix;
import com.jetbrains.python.psi.*;
@@ -28,6 +27,7 @@ import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
/**
@@ -63,13 +63,13 @@ public class PyDictDuplicateKeysInspection extends PyInspection {
final Map<String, PyElement> map = new HashMap<>();
for (PyExpression exp : elements) {
final PyExpression key = ((PyKeyValueExpression)exp).getKey();
if (key instanceof PyNumericLiteralExpression
|| key instanceof PyStringLiteralExpression || key instanceof PyReferenceExpression) {
if (map.keySet().contains(key.getText())) {
registerProblem(key, "Dictionary contains duplicate keys " + key.getText(), new PyRemoveDictKeyQuickFix());
registerProblem(map.get(key.getText()), "Dictionary contains duplicate keys " + key.getText(), new PyRemoveDictKeyQuickFix());
final String keyValue = getKeyValue(key);
if (keyValue != null) {
if (map.keySet().contains(keyValue)) {
registerProblem(key, "Dictionary contains duplicate keys " + keyValue, new PyRemoveDictKeyQuickFix());
registerProblem(map.get(keyValue), "Dictionary contains duplicate keys " + keyValue, new PyRemoveDictKeyQuickFix());
}
map.put(key.getText(), key);
map.put(keyValue, key);
}
}
}
@@ -99,11 +99,22 @@ public class PyDictDuplicateKeysInspection extends PyInspection {
}
}
@Nullable
private static String getKeyValue(@NotNull PsiElement node) {
final PsiElement parent = node.getParent();
if (parent instanceof PyKeywordArgument && ((PyKeywordArgument)parent).getKeywordNode() == node) {
return ((PyKeywordArgument)parent).getKeyword();
}
return node instanceof PyStringLiteralExpression
? ((PyStringLiteralExpression)node).getStringValue()
: node instanceof PyLiteralExpression || node instanceof PyReferenceExpression
? node.getText()
: null;
}
private void checkKey(final Map<String, PsiElement> map, final PsiElement node) {
if (node == null) return;
String key = node.getText();
if (node instanceof PyStringLiteralExpression)
key = ((PyStringLiteralExpression)node).getStringValue();
String key = getKeyValue(node);
if (map.keySet().contains(key)) {
registerProblem(node, "Dictionary contains duplicate keys " + key);
registerProblem(map.get(key), "Dictionary contains duplicate keys " + key);
@@ -1,5 +1,5 @@
dict = {<warning descr="Dictionary contains duplicate keys key_1">key_1</warning> : 1, key_2: 2, <warning descr="Dictionary contains duplicate keys key_1">key_1</warning> : 3}
dict = {'key_1' : 1, <warning descr="Dictionary contains duplicate keys 'key_2'">'key_2'</warning>: 2, <warning descr="Dictionary contains duplicate keys 'key_2'">'key_2'</warning> : 3}
dict = {'key_1' : 1, <warning descr="Dictionary contains duplicate keys key_2">'key_2'</warning>: 2, <warning descr="Dictionary contains duplicate keys key_2">'key_2'</warning> : 3}
a = {}
{'key_1' : 1, 'key_2': 2}
@@ -15,3 +15,16 @@ dict = dict(((<warning descr="Dictionary contains duplicate keys key">'key'</war
dict = dict(((<warning descr="Dictionary contains duplicate keys key">'key'</warning>, 666), ('k', 123)), <warning descr="Dictionary contains duplicate keys key">key</warning>=4)
dict([('key', 666), ('ky', 123)])
# PY-27375
d = {<warning descr="Dictionary contains duplicate keys a">'a'</warning>: 1, <warning descr="Dictionary contains duplicate keys a">"a"</warning>: 2}
d = dict([(<warning descr="Dictionary contains duplicate keys a">'a'</warning>, 1), (<warning descr="Dictionary contains duplicate keys a">"a"</warning>, 2)])
d = {<warning descr="Dictionary contains duplicate keys 1">1</warning>: 1, <warning descr="Dictionary contains duplicate keys 1">1</warning>: 2}
d = dict([(<warning descr="Dictionary contains duplicate keys 1">1</warning>, 1), (<warning descr="Dictionary contains duplicate keys 1">1</warning>, 2)])
d = {<warning descr="Dictionary contains duplicate keys True">True</warning>: 1, <warning descr="Dictionary contains duplicate keys True">True</warning>: 2}
d = dict([(<warning descr="Dictionary contains duplicate keys True">True</warning>, 1), (<warning descr="Dictionary contains duplicate keys True">True</warning>, 2)])
d = {<warning descr="Dictionary contains duplicate keys None">None</warning>: 1, <warning descr="Dictionary contains duplicate keys None">None</warning>: 2}
d = dict([(<warning descr="Dictionary contains duplicate keys None">None</warning>, 1), (<warning descr="Dictionary contains duplicate keys None">None</warning>, 2)])