From 1b9ba31da805c1f4fd578e58aff664467b64adc1 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 22 Jul 2014 15:34:08 +0400 Subject: [PATCH] cast from Short to char is prohibited --- .../intellij/psi/util/TypeConversionUtil.java | 3 + .../advHighlighting7/PolymorphicTypeCast.java | 92 +++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index 754eebd36f44..42f1494bad2e 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -128,6 +128,9 @@ public class TypeConversionUtil { return boxedType != null && areTypesConvertible(boxedType, toType); } if (!fromIsPrimitive) { + // 5.5. Casting Contexts + if ((fromTypeRank == SHORT_RANK || fromTypeRank == BYTE_RANK) && toTypeRank == CHAR_RANK) return false; + if (fromType instanceof PsiClassType) { if (languageLevel == null) { languageLevel = ((PsiClassType)fromType).getLanguageLevel(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java index 8be16fc1db85..8ba3ea4f8037 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java @@ -94,4 +94,96 @@ class C { void asLongs(Integer i) { long l = (long) i; } + + void foo(Object o) {} + public void cast2(Byte operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } + public void cast2(Short operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } + public void cast2(Character operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } + public void cast2(Integer operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } + public void cast2(Long operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } + public void cast2(Float operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } + public void cast2(Double operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } + public void cast2(Boolean operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } + public void cast2(Object operand) { + foo((byte)operand); + foo((short)operand); + foo((char)operand); + foo((int)operand); + foo((long)operand); + foo((float)operand); + foo((double)operand); + foo((boolean)operand); + } } \ No newline at end of file