From 00f10ef907b2d6e205bc6ecdd5d539381813df89 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 18 May 2011 11:39:32 +0400 Subject: [PATCH] [ann] Exceptions with interfaces in multi-catch: correct erasure --- .../advHighlighting7/MultiCatch.java | 7 +++++++ .../com/intellij/psi/util/PsiTypesUtil.java | 19 +++++++++++++++++++ .../intellij/psi/util/TypeConversionUtil.java | 12 ++++++------ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java index d856731bead5..84798f6d3a43 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java @@ -56,6 +56,13 @@ abstract class C { try { f(); } catch (E1 | E2 e) { E2 ee = e; } try { f(); } catch (E1 | E2 e) { e = new E1(); } try { f(); } catch (E1 | E2 e) { e = new E(); } + + try { g(); } + catch (IE1 | IE2 e) { + Class clazz1 = e.getClass(); + Class clazz2 = e.getClass(); + Class clazz3 = e.getClass(); + } } } diff --git a/java/openapi/src/com/intellij/psi/util/PsiTypesUtil.java b/java/openapi/src/com/intellij/psi/util/PsiTypesUtil.java index 5b41ef5986bd..1eb3ae340a0e 100644 --- a/java/openapi/src/com/intellij/psi/util/PsiTypesUtil.java +++ b/java/openapi/src/com/intellij/psi/util/PsiTypesUtil.java @@ -116,4 +116,23 @@ public class PsiTypesUtil { public static PsiClassType getClassType(@NotNull PsiClass psiClass) { return JavaPsiFacade.getElementFactory(psiClass.getProject()).createType(psiClass); } + + @Nullable + public static PsiClassType getLowestUpperBoundClassType(@NotNull final PsiDisjunctionType type) { + final PsiType lub = type.getLeastUpperBound(); + if (lub instanceof PsiClassType) { + return (PsiClassType)lub; + } + else if (lub instanceof PsiIntersectionType) { + for (PsiType subType : ((PsiIntersectionType)lub).getConjuncts()) { + if (subType instanceof PsiClassType) { + final PsiClass aClass = ((PsiClassType)subType).resolve(); + if (aClass != null && !aClass.isInterface()) { + return (PsiClassType)subType; + } + } + } + } + return null; + } } diff --git a/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java b/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java index 62b5f319e51e..c5cd6ca8aedd 100644 --- a/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java @@ -23,7 +23,6 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.tree.IElementType; -import com.intellij.util.Function; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; @@ -33,7 +32,10 @@ import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; public class TypeConversionUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.util.TypeConversionUtil"); @@ -1189,10 +1191,8 @@ public class TypeConversionUtil { @Override public PsiType visitDisjunctionType(PsiDisjunctionType disjunctionType) { - final List erased = ContainerUtil.map(disjunctionType.getDisjunctions(), new Function() { - @Override public PsiType fun(PsiType psiType) { return erasure(psiType, beforeSubstitutor); } - }); - return disjunctionType.newDisjunctionType(erased); + final PsiClassType lub = PsiTypesUtil.getLowestUpperBoundClassType(disjunctionType); + return lub != null ? erasure(lub, beforeSubstitutor) : disjunctionType; } }); }