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 e274d61663b6..933d180afc6f 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 @@ -1276,6 +1276,15 @@ public class GenericsHighlightUtil { return null; } + static HighlightInfo checkGenericCannotExtendException(PsiAnonymousClass anonymousClass) { + if (PsiUtil.typeParametersIterator(anonymousClass).hasNext() && + 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(); + } + return null; + } + static HighlightInfo checkEnumMustNotBeLocal(final PsiClass aClass) { if (!aClass.isEnum()) return null; PsiElement parent = aClass.getParent(); 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 577ed4e83bd7..efa2be8f485a 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 @@ -1110,10 +1110,12 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } } - if (parent instanceof PsiAnonymousClass && ref.equals(((PsiAnonymousClass)parent).getBaseClassReference()) && - myOverrideEquivalentMethodsVisitedClasses.add((PsiClass)parent)) { - PsiClass aClass = (PsiClass)parent; - myHolder.addAll(GenericsHighlightUtil.checkOverrideEquivalentMethods(aClass)); + if (parent instanceof PsiAnonymousClass && ref.equals(((PsiAnonymousClass)parent).getBaseClassReference())) { + if (myOverrideEquivalentMethodsVisitedClasses.add((PsiClass)parent)) { + PsiClass aClass = (PsiClass)parent; + myHolder.addAll(GenericsHighlightUtil.checkOverrideEquivalentMethods(aClass)); + } + if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkGenericCannotExtendException((PsiAnonymousClass)parent)); } if (resolved instanceof PsiVariable) { diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java index 6c0b646df8e9..911399da0972 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java @@ -911,7 +911,9 @@ public final class PsiUtil extends PsiUtilCore { } if (currentOwner.hasModifierProperty(PsiModifier.STATIC)) break; - currentOwner = currentOwner.getContainingClass(); + currentOwner = currentOwner instanceof PsiClass && isLocalOrAnonymousClass((PsiClass)currentOwner) + ? PsiTreeUtil.getParentOfType(currentOwner, PsiClass.class) + : currentOwner.getContainingClass(); } if (result == null) return EmptyIterable.getInstance(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/GenericThrowTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/GenericThrowTypes.java index fbc456fcb86e..2bd384cfe2da 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/GenericThrowTypes.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/GenericThrowTypes.java @@ -1,4 +1,18 @@ class C { static class MyThrowable extends Throwable { } void test() throws MyThrowable { } + + private class GenericOuter { + public final Exception exn = new Exception() { }; + + { + class LocalExn extends Exception {} + throw new RuntimeException(){}; + } + } + + public void genericMethod() { + class LocalExn extends Exception {} + throw new RuntimeException() {}; + } } \ No newline at end of file