From 4cd2ff040d73157cbf8cd26642f1ae8e10f2d8d1 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 4 Dec 2015 01:03:46 +0900 Subject: [PATCH] J2K: convert hex Java literal to hex Kotlin literal --- .../org/jetbrains/kotlin/j2k/ExpressionConverter.kt | 12 +++++++++++- .../fileOrElement/literalExpression/hex.java | 6 ++++++ j2k/testData/fileOrElement/literalExpression/hex.kt | 10 ++++++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index f21bc3340ef..2c8fe8aed29 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -297,8 +297,18 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { text = text.replace("l", "L") } + fun isHexLiteral(text: String) = text.startsWith("0x") || text.startsWith("0X") + fun isLongField(element: PsiElement): Boolean { + val fieldType = (element as? PsiVariable)?.type ?: return false + return when (fieldType) { + is PsiPrimitiveType -> fieldType.canonicalText == "long" + else -> PsiPrimitiveType.getUnboxedType(fieldType)?.canonicalText == "long" + } + } + if (typeStr == "int") { - text = if (value != null) value.toString() else text + val toIntIsNeeded = value != null && value.toString().toInt() < 0 && !isLongField(expression.parent) + text = if (value != null && !isHexLiteral(text)) value.toString() else text + (if (toIntIsNeeded) ".toInt()" else "") } } diff --git a/j2k/testData/fileOrElement/literalExpression/hex.java b/j2k/testData/fileOrElement/literalExpression/hex.java index fa015fd0331..43de9f2f0c9 100644 --- a/j2k/testData/fileOrElement/literalExpression/hex.java +++ b/j2k/testData/fileOrElement/literalExpression/hex.java @@ -3,5 +3,11 @@ class Test { void test() { int i1 = 0x21; Int i2 = 0x33; + int i3 = 0xffffffff; + int i4 = 0XCCCC; + int i5 = 0x6fffffff; + long l1 = 0xffffffff; + Long l2 = 0xffffffffl; + long l3 = 0xffffffffffL; } } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/literalExpression/hex.kt b/j2k/testData/fileOrElement/literalExpression/hex.kt index 690245b168e..d01b2245902 100644 --- a/j2k/testData/fileOrElement/literalExpression/hex.kt +++ b/j2k/testData/fileOrElement/literalExpression/hex.kt @@ -1,6 +1,12 @@ internal class Test { fun test() { - val i1 = 33 - val i2 = 51 + val i1 = 0x21 + val i2 = 0x33 + val i3 = 0xffffffff.toInt() + val i4 = 0XCCCC + val i5 = 0x6fffffff + val l1: Long = 0xffffffff + val l2 = 0xffffffffL + val l3 = 0xffffffffffL } } \ No newline at end of file