From 54ced00cb4570589176b74dcf7441966030bd140 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 23 Apr 2014 13:06:43 +0200 Subject: [PATCH] highlight all pairs of methods with same erasures (IDEA-124116) --- .../impl/analysis/GenericsHighlightUtil.java | 20 +++++++++++++------ .../impl/analysis/HighlightVisitorImpl.java | 5 ++--- .../PairsWithSameErasure.java | 9 +++++++++ .../daemon/GenericsHighlightingTest.java | 1 + 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/PairsWithSameErasure.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 14c32171c19f..e6de88efc4e0 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -42,6 +42,7 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import gnu.trove.THashMap; +import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -326,7 +327,8 @@ public class GenericsHighlightUtil { if (errorResult == null && languageLevel.isAtLeast(LanguageLevel.JDK_1_7) && referenceElements.length > 1) { //todo suppress erased methods which come from the same class - return checkOverrideEquivalentMethods(languageLevel, aClass); + final Collection result = checkOverrideEquivalentMethods(languageLevel, aClass); + return result != null && result.size() > 0 ? result.iterator().next() : null; } return errorResult; } @@ -380,23 +382,29 @@ public class GenericsHighlightUtil { return null; } - public static HighlightInfo checkOverrideEquivalentMethods(@NotNull LanguageLevel languageLevel, - @NotNull PsiClass aClass) { + public static Collection checkOverrideEquivalentMethods(@NotNull LanguageLevel languageLevel, + @NotNull PsiClass aClass) { + List result = new ArrayList(); final Collection signaturesWithSupers = aClass.getVisibleSignatures(); PsiManager manager = aClass.getManager(); Map sameErasureMethods = new THashMap(MethodSignatureUtil.METHOD_PARAMETERS_ERASURE_EQUALITY); + final Set foundProblems = new THashSet(MethodSignatureUtil.METHOD_PARAMETERS_ERASURE_EQUALITY); for (HierarchicalMethodSignature signature : signaturesWithSupers) { HighlightInfo info = checkSameErasureNotSubSignatureInner(signature, manager, aClass, sameErasureMethods); - if (info != null) return info; + if (info != null && foundProblems.add(signature)) { + result.add(info); + } if (aClass instanceof PsiTypeParameter) { info = HighlightMethodUtil.checkMethodIncompatibleReturnType(signature, signature.getSuperSignatures(), true, HighlightNamesUtil.getClassDeclarationTextRange(aClass)); - if (info != null) return info; + if (info != null) { + result.add(info); + } } } - return null; + return result.isEmpty() ? null : result; } static HighlightInfo checkDefaultMethodOverrideEquivalentToObjectNonPrivate(@NotNull LanguageLevel languageLevel, diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index f386b646f1e4..e390d435707c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -888,8 +888,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh myHolder.add(HighlightClassUtil.checkClassDoesNotCallSuperConstructorOrHandleExceptions(aClass, myRefCountHolder, myResolveHelper)); } if (!myHolder.hasErrorResults()) myHolder.add(HighlightMethodUtil.checkOverrideEquivalentInheritedMethods(aClass, myFile)); - if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkOverrideEquivalentMethods(myLanguageLevel, aClass - )); + if (!myHolder.hasErrorResults()) myHolder.addAll(GenericsHighlightUtil.checkOverrideEquivalentMethods(myLanguageLevel, aClass)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkCyclicInheritance(aClass)); } catch (IndexNotReadyException ignored) { @@ -1045,7 +1044,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (parent instanceof PsiAnonymousClass && ref.equals(((PsiAnonymousClass)parent).getBaseClassReference())) { PsiClass aClass = (PsiClass)parent; - myHolder.add(GenericsHighlightUtil.checkOverrideEquivalentMethods(myLanguageLevel, aClass)); + myHolder.addAll(GenericsHighlightUtil.checkOverrideEquivalentMethods(myLanguageLevel, aClass)); } if (resolved instanceof PsiVariable) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/PairsWithSameErasure.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/PairsWithSameErasure.java new file mode 100644 index 000000000000..f7d2f026491b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/PairsWithSameErasure.java @@ -0,0 +1,9 @@ +import java.util.List; + +class MyClass { + void method1 (Comparable c) {} + void method1(Comparable c) {} + + void method2(List l) {} + void method2(List l) {} +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index c0ef03ce72b3..aaf4d57b87a1 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -74,6 +74,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testEnum() { doTest(LanguageLevel.JDK_1_5, JavaSdkVersion.JDK_1_5, false); } public void testEnum56239() { doTest(LanguageLevel.JDK_1_6, JavaSdkVersion.JDK_1_6, false); } public void testSameErasure() { doTest5(false); } + public void testPairsWithSameErasure() { doTest5(false); } public void testMethods() { doTest5(false); } public void testFields() { doTest5(false); } public void testStaticImports() { doTest5(true); }