From 8b84f7ab8e2436f7bc5799ac94195fa775a7a358 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 10 Oct 2017 18:12:30 +0200 Subject: [PATCH] include tree ancestors in type parameters iterable (IDEA-179958) anonymous and local classes are inner classes which are not members of any other class, they are implicitly generics if applicable --- .../impl/analysis/GenericsHighlightUtil.java | 9 +++++++++ .../daemon/impl/analysis/HighlightVisitorImpl.java | 10 ++++++---- .../src/com/intellij/psi/util/PsiUtil.java | 4 +++- .../genericsHighlighting/GenericThrowTypes.java | 14 ++++++++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) 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