diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java index 339d595dfa6c..1b143d6644ab 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java @@ -60,6 +60,11 @@ public class PsiConditionalExpressionImpl extends ExpressionPsiElement implement if (type1.equals(type2)) return type1; final int typeRank1 = TypeConversionUtil.getTypeRank(type1); final int typeRank2 = TypeConversionUtil.getTypeRank(type2); + + // bug in JLS3, see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6888770 + if (type1 instanceof PsiClassType && type2.equals(PsiPrimitiveType.getUnboxedType(type1))) return type2; + if (type2 instanceof PsiClassType && type1.equals(PsiPrimitiveType.getUnboxedType(type2))) return type1; + if (TypeConversionUtil.isNumericType(typeRank1) && TypeConversionUtil.isNumericType(typeRank2)){ if (typeRank1 == TypeConversionUtil.BYTE_RANK && typeRank2 == TypeConversionUtil.SHORT_RANK) return type2; if (typeRank1 == TypeConversionUtil.SHORT_RANK && typeRank2 == TypeConversionUtil.BYTE_RANK) return type1; @@ -79,10 +84,14 @@ public class PsiConditionalExpressionImpl extends ExpressionPsiElement implement if (!PsiUtil.isLanguageLevel5OrHigher(this)) { return null; } - if (TypeConversionUtil.isPrimitiveAndNotNull(type1)) type1 = ((PsiPrimitiveType)type1).getBoxedType(this); - if (type1 == null) return null; - if (TypeConversionUtil.isPrimitiveAndNotNull(type2)) type2 = ((PsiPrimitiveType)type2).getBoxedType(this); - if (type2 == null) return null; + if (TypeConversionUtil.isPrimitiveAndNotNull(type1)) { + type1 = ((PsiPrimitiveType)type1).getBoxedType(this); + if (type1 == null) return null; + } + if (TypeConversionUtil.isPrimitiveAndNotNull(type2)) { + type2 = ((PsiPrimitiveType)type2).getBoxedType(this); + if (type2 == null) return null; + } return GenericsUtil.getLeastUpperBound(type1, type2, getManager()); } diff --git a/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java b/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java index 69db0f384f9f..7e78384b8530 100644 --- a/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/openapi/src/com/intellij/psi/util/TypeConversionUtil.java @@ -53,7 +53,6 @@ public class TypeConversionUtil { private static final TObjectIntHashMap TYPE_TO_RANK_MAP = new TObjectIntHashMap(); - private static final int BOOL_RANK = 10; public static final int BYTE_RANK = 1; public static final int SHORT_RANK = 2; public static final int CHAR_RANK = 3; @@ -61,6 +60,7 @@ public class TypeConversionUtil { private static final int LONG_RANK = 5; private static final int FLOAT_RANK = 6; private static final int DOUBLE_RANK = 7; + private static final int BOOL_RANK = 10; private static final int STRING_RANK = 100; private static final int MAX_NUMERIC_RANK = DOUBLE_RANK;