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 388c819d202a..c214f2fa2ae8 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 @@ -48,6 +48,7 @@ import com.intellij.psi.util.*; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.MostlySingularMultiMap; import gnu.trove.THashMap; +import gnu.trove.THashSet; import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -88,6 +89,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } }; private final Map> myDuplicateMethods = new THashMap<>(); + private final Set myOverrideEquivalentMethodsVisitedClasses = new THashSet<>(); private LanguageLevel myLanguageLevel; private JavaSdkVersion myJavaSdkVersion; @@ -194,6 +196,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh myFile = null; myHolder = null; myDuplicateMethods.clear(); + myOverrideEquivalentMethodsVisitedClasses.clear(); } return success; @@ -896,6 +899,10 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (!myHolder.hasErrorResults()) myHolder.add(HighlightMethodUtil.checkMethodMustHaveBody(method, aClass)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightMethodUtil.checkConstructorCallsBaseClassConstructor(method, myRefCountHolder, myResolveHelper)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightMethodUtil.checkStaticMethodOverride(method,myFile)); + if (!myHolder.hasErrorResults() && aClass != null && + myOverrideEquivalentMethodsVisitedClasses.add(aClass)) { + myHolder.addAll(GenericsHighlightUtil.checkOverrideEquivalentMethods(aClass)); + } } else if (parent instanceof PsiClass) { PsiClass aClass = (PsiClass)parent; @@ -909,7 +916,9 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh myHolder.add(HighlightClassUtil.checkClassDoesNotCallSuperConstructorOrHandleExceptions(aClass, myRefCountHolder, myResolveHelper)); } if (!myHolder.hasErrorResults()) myHolder.add(HighlightMethodUtil.checkOverrideEquivalentInheritedMethods(aClass, myFile, myLanguageLevel)); - if (!myHolder.hasErrorResults()) myHolder.addAll(GenericsHighlightUtil.checkOverrideEquivalentMethods(aClass)); + if (!myHolder.hasErrorResults() && myOverrideEquivalentMethodsVisitedClasses.add(aClass)) { + myHolder.addAll(GenericsHighlightUtil.checkOverrideEquivalentMethods(aClass)); + } if (!myHolder.hasErrorResults()) myHolder.add(HighlightClassUtil.checkCyclicInheritance(aClass)); } catch (IndexNotReadyException ignored) { @@ -1067,7 +1076,8 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } } - if (parent instanceof PsiAnonymousClass && ref.equals(((PsiAnonymousClass)parent).getBaseClassReference())) { + if (parent instanceof PsiAnonymousClass && ref.equals(((PsiAnonymousClass)parent).getBaseClassReference()) && + myOverrideEquivalentMethodsVisitedClasses.add((PsiClass)parent)) { PsiClass aClass = (PsiClass)parent; myHolder.addAll(GenericsHighlightUtil.checkOverrideEquivalentMethods(aClass)); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67671.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67671.java index f066058520d1..1ca5b71ae30d 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67671.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/AmbiguousMethodCallIDEA67671.java @@ -8,6 +8,6 @@ interface A class B implements A { - public void foo(Collection x) { } + public void foo(Collection x) { } public & Collection> void foo(S x) { } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/DaemonRespondToChangesTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/DaemonRespondToChangesTest.java index 553d03f628d3..3ef8541e46e4 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/DaemonRespondToChangesTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/DaemonRespondToChangesTest.java @@ -846,6 +846,22 @@ public class DaemonRespondToChangesTest extends DaemonAnalyzerTestCase { assertEmpty(highlightErrors()); } + public void testOverrideMethodsHighlightingPersistWhenTypeInsideMethodBody() throws Throwable { + configureByText(JavaFileType.INSTANCE, "package x; \n" + + "class ClassA {\n" + + " static void sayHello(Class msg) {}\n" + + "}\n" + + + "class ClassB extends ClassA {\n" + + " static void sayHello(Class msg) {\n" + + " }\n" + + "}\n"); + + assertSize(1, highlightErrors()); + type("//my comment inside method body, so class modifier won't be visited"); + assertSize(1, highlightErrors()); + } + public void testLineMarkersClearWhenTypingAtTheEndOfPsiComment() throws Throwable { configureByText(JavaFileType.INSTANCE, "class S {\n//ddd\n}"); StringBuffer log = new StringBuffer();