From d246bd8cffdf0a618ccc2290e21532b6210ba90a Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 18 Nov 2016 22:32:03 +0300 Subject: [PATCH] Kapt3: Fix literal expressions for byte and short --- .../stubs/ClassFileToSourceStubConverter.kt | 25 ++++++++++++------- .../kapt3/testData/converter/jvmStatic.txt | 4 +-- .../testData/converter/primitiveTypes.txt | 6 ++--- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 496141e571e..b43306c14d8 100644 --- a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -203,11 +203,8 @@ class ClassFileToSourceStubConverter( val value = field.value - val initializer = when (value) { - is Char -> treeMaker.Literal(TypeTag.CHAR, value.toInt()) - is Byte, is Boolean, is Short, is Int, is Long, is Float, is Double, is String -> treeMaker.Literal(value) - else -> if (isFinal(field.access)) convertLiteralExpression(getDefaultValue(type)) else null - } + val initializer = convertValueOfPrimitiveTypeOrString(value) + ?: if (isFinal(field.access)) convertLiteralExpression(getDefaultValue(type)) else null return treeMaker.VarDef(modifiers, name, typeExpression, initializer) } @@ -346,11 +343,21 @@ class ClassFileToSourceStubConverter( return treeMaker.Annotation(name, values) } + private fun convertValueOfPrimitiveTypeOrString(value: Any?): JCExpression? { + return when (value) { + is Char -> treeMaker.Literal(TypeTag.CHAR, value.toInt()) + is Byte -> treeMaker.TypeCast(treeMaker.TypeIdent(TypeTag.BYTE), treeMaker.Literal(TypeTag.INT, value.toInt())) + is Short -> treeMaker.TypeCast(treeMaker.TypeIdent(TypeTag.SHORT), treeMaker.Literal(TypeTag.INT, value.toInt())) + is Boolean, is Int, is Long, is Float, is Double, is String -> treeMaker.Literal(value) + else -> null + } + } + private fun convertLiteralExpression(value: Any?): JCExpression { + convertValueOfPrimitiveTypeOrString(value)?.let { return it } + return when (value) { null -> treeMaker.Literal(TypeTag.BOT, null) - is Char -> treeMaker.Literal(TypeTag.CHAR, value.toInt()) - is Byte, is Boolean, is Short, is Int, is Long, is Float, is Double, is String -> treeMaker.Literal(value) is ByteArray -> treeMaker.NewArray(null, JavacList.nil(), mapJList(value.asIterable()) { convertLiteralExpression(it) }) is BooleanArray -> treeMaker.NewArray(null, JavacList.nil(), mapJList(value.asIterable()) { convertLiteralExpression(it) }) @@ -375,10 +382,10 @@ class ClassFileToSourceStubConverter( } private fun getDefaultValue(type: Type): Any? = when (type) { - Type.BYTE_TYPE -> 0.toByte() + Type.BYTE_TYPE -> 0 Type.BOOLEAN_TYPE -> false Type.CHAR_TYPE -> '\u0000' - Type.SHORT_TYPE -> 0.toShort() + Type.SHORT_TYPE -> 0 Type.INT_TYPE -> 0 Type.LONG_TYPE -> 0L Type.FLOAT_TYPE -> 0.0F diff --git a/plugins/kapt3/testData/converter/jvmStatic.txt b/plugins/kapt3/testData/converter/jvmStatic.txt index d007f8123b7..c9a476738aa 100644 --- a/plugins/kapt3/testData/converter/jvmStatic.txt +++ b/plugins/kapt3/testData/converter/jvmStatic.txt @@ -1,6 +1,6 @@ public final class JvmStaticTest { - private final byte three = "3"; + private final byte three = (byte)3; private final char d = 'D'; private static final int one = 1; private static final int two = 2; @@ -8,7 +8,7 @@ public final class JvmStaticTest { public static final JvmStaticTest.Companion Companion = null; public final byte getThree() { - return "0"; + return 0; } public final char getD() { diff --git a/plugins/kapt3/testData/converter/primitiveTypes.txt b/plugins/kapt3/testData/converter/primitiveTypes.txt index 9ed3cd231e3..32a5a5d131c 100644 --- a/plugins/kapt3/testData/converter/primitiveTypes.txt +++ b/plugins/kapt3/testData/converter/primitiveTypes.txt @@ -6,9 +6,9 @@ public final class PrimitiveTypes { public static final int intMinValue = -2147483648; public static final int intMaxValue = 2147483647; public static final int intHex = -1; - public static final byte byte0 = "0"; - public static final byte byte50 = "50"; - public static final short short5 = "5"; + public static final byte byte0 = (byte)0; + public static final byte byte50 = (byte)50; + public static final short short5 = (short)5; public static final char charC = 'C'; public static final char char0 = '\u0000'; public static final char char10 = '\n';