From c86899e9da2d16bd1061980cd1a1425f4ca14898 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 5 Apr 2010 17:50:53 +0400 Subject: [PATCH] IDEA-53369 Groovy Editor -> Map Keys In Parenthetical Expressions All Considered Identical --- .../groovy/annotator/GroovyAnnotator.java | 49 +++++++------------ .../groovy/lang/GroovyHighlightingTest.java | 2 + .../highlighting/DuplicateMapKeys.groovy | 2 + 3 files changed, 23 insertions(+), 30 deletions(-) create mode 100644 plugins/groovy/testdata/highlighting/DuplicateMapKeys.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index d114ec046a7d..601ba52d8a88 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -33,6 +33,7 @@ import com.intellij.psi.infos.CandidateInfo; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.MultiMap; import gnu.trove.THashSet; import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NotNull; @@ -365,31 +366,28 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { @Override public void visitListOrMap(GrListOrMap listOrMap) { - final Map> map = DuplicatesUtil.factorDuplicates(listOrMap.getNamedArguments(), new TObjectHashingStrategy() { - public int computeHashCode(GrNamedArgument arg) { - final GrArgumentLabel label = arg.getLabel(); - if (label == null) return 0; + MultiMap map = new MultiMap(); + + for (GrNamedArgument element : listOrMap.getNamedArguments()) { + final GrArgumentLabel label = element.getLabel(); + if (label != null) { final String name = label.getName(); - if (name == null) return 0; - return name.hashCode(); - } - - public boolean equals(GrNamedArgument arg1, GrNamedArgument arg2) { - final GrArgumentLabel label1 = arg1.getLabel(); - final GrArgumentLabel label2 = arg2.getLabel(); - if (label1 == null || label2 == null) { - return label1 == null && label2 == null; + if (name != null) { + map.putValue(name, element); } - final String name1 = label1.getName(); - final String name2 = label2.getName(); - if (name1 == null || name2 == null) { - return name1 == null && name2 == null; - } - return name1.equals(name2); } - }); + } - processDuplicates(map, myHolder); + for (String key : map.keySet()) { + final Collection arguments = map.get(key); + if (arguments.size() > 1) { + final List args = new ArrayList(arguments); + for (int i = 1; i < args.size(); i++) { + GrNamedArgument namedArgument = args.get(i); + myHolder.createWarningAnnotation(namedArgument.getLabel(), GroovyBundle.message("duplicate.element.in.the.map")); + } + } + } } @Override @@ -734,15 +732,6 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { } } - protected static void processDuplicates(Map> map, AnnotationHolder holder) { - for (List args : map.values()) { - for (int i = 1; i < args.size(); i++) { - GrNamedArgument namedArgument = args.get(i); - holder.createWarningAnnotation(namedArgument, GroovyBundle.message("duplicate.element.in.the.map")); - } - } - } - private static void registerAbstractMethodFix(Annotation annotation, GrMethod method, boolean makeClassAbstract) { if (method.getBlock() == null) { annotation.registerFix(new AddMethodBodyFix(method)); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java index 3cf292ba7117..7083e7fef480 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java @@ -224,6 +224,8 @@ public class GroovyHighlightingTest extends LightCodeInsightFixtureTestCase { public void testSuperConstructorInvocation() throws Exception {doTest();} + public void testDuplicateMapKeys() throws Exception {doTest();} + public void testIndexPropertyAccess() throws Exception { doTest(); } diff --git a/plugins/groovy/testdata/highlighting/DuplicateMapKeys.groovy b/plugins/groovy/testdata/highlighting/DuplicateMapKeys.groovy new file mode 100644 index 000000000000..ea162db4a8fa --- /dev/null +++ b/plugins/groovy/testdata/highlighting/DuplicateMapKeys.groovy @@ -0,0 +1,2 @@ +x = [ (person.firstNameKey):person.firstName, (person.lastNameKey):person.lastName ] +x = [2:1, 2:2] \ No newline at end of file