diff --git a/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java index 8572d14733be..04352a10c818 100644 --- a/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java @@ -1009,10 +1009,15 @@ class ControlFlowAnalyzer extends JavaJspElementVisitor { final PsiType type = catchBlockParameters[i].getType(); // todo cast param - if (type instanceof PsiClassType && ExceptionUtil.isUncheckedExceptionOrSuperclass((PsiClassType)type) || - type instanceof PsiDisjunctionType && ExceptionUtil.isUncheckedExceptionOrSuperclass(((PsiDisjunctionType)type).getLeastUpperBound())) { + if (type instanceof PsiClassType && ExceptionUtil.isUncheckedExceptionOrSuperclass((PsiClassType)type)) { myUnhandledExceptionCatchBlocks.push(catchBlocks[i]); } + else if (type instanceof PsiDisjunctionType) { + final PsiType lub = ((PsiDisjunctionType)type).getLeastUpperBound(); + if (ExceptionUtil.isUncheckedExceptionOrSuperclass((PsiClassType)lub)) { + myUnhandledExceptionCatchBlocks.push(catchBlocks[i]); + } + } } PsiCodeBlock finallyBlock = statement.getFinallyBlock(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java index b2d50a07080e..2ef2bf65f1dc 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java @@ -5,14 +5,19 @@ abstract class C { private static class E2 extends E { } private static class E3 extends E { } private static class RE extends RuntimeException { } + private interface I { } + private static class IE1 extends E implements I { } + private static class IE2 extends E implements I { } abstract void f() throws E1, E2; + abstract void g() throws IE1, IE2; void m() { try { f(); } catch (E1 | E2 e) { } try { f(); } catch (E2 | E e) { e.printStackTrace(); } try { f(); } catch (E2 | E1 e) { } catch (E e) { } catch (RE e) { } try { f(); } catch (E1 | E e) { E ee = e; } + try { g(); } catch (IE1 | IE2 e) { E ee = e; I ii = e; } try { f(); } catch (E1 | E2 | E3 e) { } try { f(); } catch (E3 | E e) { } diff --git a/java/openapi/src/com/intellij/psi/PsiDisjunctionType.java b/java/openapi/src/com/intellij/psi/PsiDisjunctionType.java index 673413e10e91..e764b3bde987 100644 --- a/java/openapi/src/com/intellij/psi/PsiDisjunctionType.java +++ b/java/openapi/src/com/intellij/psi/PsiDisjunctionType.java @@ -30,7 +30,7 @@ import java.util.List; public class PsiDisjunctionType extends PsiType { private final PsiTypeElement myTypeElement; private final List myTypes; - private final CachedValue myLubCache; + private final CachedValue myLubCache; public PsiDisjunctionType(final PsiTypeElement typeElement) { super(PsiAnnotation.EMPTY_ARRAY); @@ -46,19 +46,18 @@ public class PsiDisjunctionType extends PsiType { })); final CachedValuesManager cacheManager = CachedValuesManager.getManager(myTypeElement.getProject()); - myLubCache = cacheManager.createCachedValue(new CachedValueProvider() { - public Result compute() { + myLubCache = cacheManager.createCachedValue(new CachedValueProvider() { + public Result compute() { PsiType lub = myTypes.get(0); for (int i = 1; i < myTypes.size(); i++) { lub = GenericsUtil.getLeastUpperBound(lub, myTypes.get(i), myTypeElement.getManager()); } - assert lub instanceof PsiClassType : getCanonicalText() + ", " + lub; - return Result.create((PsiClassType)lub, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); + return Result.create(lub, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); } }, false); } - public PsiClassType getLeastUpperBound() { + public PsiType getLeastUpperBound() { return myLubCache.getValue(); } @@ -102,7 +101,11 @@ public class PsiDisjunctionType extends PsiType { @Override public A accept(final PsiTypeVisitor visitor) { - return visitor.visitClassType(getLeastUpperBound()); + final PsiType lub = getLeastUpperBound(); + if (lub instanceof PsiClassType) { + return visitor.visitClassType((PsiClassType)lub); + } + return visitor.visitType(lub); } @Override diff --git a/java/openapi/src/com/intellij/psi/util/PsiUtil.java b/java/openapi/src/com/intellij/psi/util/PsiUtil.java index 68b646d1acce..befbbda05869 100644 --- a/java/openapi/src/com/intellij/psi/util/PsiUtil.java +++ b/java/openapi/src/com/intellij/psi/util/PsiUtil.java @@ -372,7 +372,10 @@ public final class PsiUtil extends PsiUtilBase { return resolveClassInType(((PsiArrayType) type).getComponentType()); } if (type instanceof PsiDisjunctionType) { - return ((PsiDisjunctionType)type).getLeastUpperBound().resolve(); + final PsiType lub = ((PsiDisjunctionType)type).getLeastUpperBound(); + if (lub instanceof PsiClassType) { + return ((PsiClassType)lub).resolve(); + } } return null; }