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 933d180afc6f..6147cfd50df1 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 @@ -1241,7 +1241,7 @@ public class GenericsHighlightUtil { PsiElement parent = list.getParent(); if (parent instanceof PsiClass) { PsiClass klass = (PsiClass)parent; - if (PsiUtil.typeParametersIterator(klass).hasNext() && klass.getExtendsList() == list) { + if (hasGenericSignature(klass) && klass.getExtendsList() == list) { PsiClass throwableClass = null; for (PsiJavaCodeReferenceElement refElement : list.getReferenceElements()) { PsiElement resolved = refElement.resolve(); @@ -1277,7 +1277,7 @@ public class GenericsHighlightUtil { } static HighlightInfo checkGenericCannotExtendException(PsiAnonymousClass anonymousClass) { - if (PsiUtil.typeParametersIterator(anonymousClass).hasNext() && + if (hasGenericSignature(anonymousClass) && InheritanceUtil.isInheritor(anonymousClass, true, CommonClassNames.JAVA_LANG_THROWABLE)) { String message = JavaErrorMessages.message("generic.extend.exception"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(anonymousClass.getBaseClassReference()).descriptionAndTooltip(message).create(); @@ -1285,6 +1285,15 @@ public class GenericsHighlightUtil { return null; } + private static boolean hasGenericSignature(PsiClass klass) { + PsiClass containingClass = klass; + while (containingClass != null && PsiUtil.isLocalOrAnonymousClass(containingClass)) { + if (containingClass.hasTypeParameters()) return true; + containingClass = PsiTreeUtil.getParentOfType(containingClass, PsiClass.class); + } + return containingClass != null && PsiUtil.typeParametersIterator(containingClass).hasNext(); + } + static HighlightInfo checkEnumMustNotBeLocal(final PsiClass aClass) { if (!aClass.isEnum()) return null; PsiElement parent = aClass.getParent(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/GenericThrowTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/GenericThrowTypes.java index 2bd384cfe2da..8a3c15a1c64f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/GenericThrowTypes.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/GenericThrowTypes.java @@ -15,4 +15,10 @@ class C { class LocalExn extends Exception {} throw new RuntimeException() {}; } + + { + class LocalGenerics { + class Ex extends Exception {} + } + } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java index 1db66d660d67..8047d70ad8b5 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java @@ -20,7 +20,6 @@ import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection; import com.intellij.codeInspection.uncheckedWarnings.UncheckedWarningLocalInspection; import com.intellij.codeInspection.unusedImport.UnusedImportInspection; -import com.intellij.idea.Bombed; import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.LanguageLevelProjectExtension; @@ -32,8 +31,6 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.testFramework.IdeaTestUtil; import org.jetbrains.annotations.NotNull; -import java.util.Calendar; - public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { private static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/genericsHighlighting"; @@ -428,7 +425,6 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testAvoidDblSubstitutionDuringErasureOfParameterTypesOfMethodSignature() { doTest8Incompatibility(false); } public void testUncheckedWarningWhenCastingFromCapturedWildcard() { doTest8Incompatibility(true); } public void testEnclosingRefInTopLevelClassExtendingInnerWhichExtendsItsOuter() { doTest8Incompatibility(true); } - @Bombed(day = 13, month = Calendar.OCTOBER, user = "anna") public void testGenericThrowTypes() { doTest5(false); } public void testClassInWrongPackage() { doTest6(false); } public void testRecursiveParamBoundsWhenSuperSubstitution() { doTest6(false); }