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;
}