From 72a09ab59bd4788fa6c6dad0d523af8d69378c3b Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 24 Jul 2019 22:35:02 +0300 Subject: [PATCH] New J2K: correctly convert number literals with underscores #KT-32837 fixed --- .../kotlin/nj2k/conversions/LiteralConversion.kt | 12 +++++++++--- .../newJ2k/literalExpression/underscores.java | 9 +++++++++ .../testData/newJ2k/literalExpression/underscores.kt | 9 +++++++++ ...JavaToKotlinConverterSingleFileTestGenerated.java | 5 +++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 nj2k/testData/newJ2k/literalExpression/underscores.java create mode 100644 nj2k/testData/newJ2k/literalExpression/underscores.kt diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LiteralConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LiteralConversion.kt index 4541f0ad7c2..fe4e5574cdc 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LiteralConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/LiteralConversion.kt @@ -54,7 +54,7 @@ class LiteralConversion : RecursiveApplicableConversionBase() { JKKtLiteralExpressionImpl(literal.replace("((?:\\\\)*)\\\\([0-3]?[0-7]{1,2})".toRegex()) { matchResult -> val leadingBackslashes = matchResult.groupValues[1] if (leadingBackslashes.length % 2 == 0) - kotlin.String.format("%s\\u%04x", leadingBackslashes, java.lang.Integer.parseInt(matchResult.groupValues[2], 8)) + String.format("%s\\u%04x", leadingBackslashes, Integer.parseInt(matchResult.groupValues[2], 8)) else matchResult.value }.replace("\\$([A-Za-z]+|\\{)".toRegex(), "\\\\$0"), JKLiteralExpression.LiteralType.STRING) @@ -71,7 +71,7 @@ class LiteralConversion : RecursiveApplicableConversionBase() { private fun JKLiteralExpression.toIntLiteral(): JKKtLiteralExpression = JKKtLiteralExpressionImpl( literal - .replace("l", "", ignoreCase = true) + .cleanIntAndLongLiterals() .convertHexLiteral(isLongLiteral = false) .convertOctalLiteral(), JKLiteralExpression.LiteralType.INT @@ -81,7 +81,7 @@ class LiteralConversion : RecursiveApplicableConversionBase() { private fun JKLiteralExpression.toLongLiteral(): JKKtLiteralExpression = JKKtLiteralExpressionImpl( literal - .replace("l", "", ignoreCase = true) + .cleanIntAndLongLiterals() .convertHexLiteral(isLongLiteral = true) .convertOctalLiteral() + "L", JKLiteralExpression.LiteralType.LONG @@ -113,4 +113,10 @@ class LiteralConversion : RecursiveApplicableConversionBase() { .replace(".e", "e", ignoreCase = true) .replace(".f", "", ignoreCase = true) .replace("f", "", ignoreCase = true) + .replace("_", "") + + private fun String.cleanIntAndLongLiterals() = + replace("l", "", ignoreCase = true) + .replace("_", "") + } diff --git a/nj2k/testData/newJ2k/literalExpression/underscores.java b/nj2k/testData/newJ2k/literalExpression/underscores.java new file mode 100644 index 00000000000..8d713c55c93 --- /dev/null +++ b/nj2k/testData/newJ2k/literalExpression/underscores.java @@ -0,0 +1,9 @@ +public class TestNumber { + long longLiteral = 123_456_7; + long longHexLiteral = 0xFF_EC_DE_5E; + int intLiteral = 123_4; + float floatLiteral = 123_4.f; + double doubleLiteral = 123_4d; + short shortLiteral = 1_2_3; + byte byteLiteral = 1_2_3; +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/literalExpression/underscores.kt b/nj2k/testData/newJ2k/literalExpression/underscores.kt new file mode 100644 index 00000000000..8307e2a4082 --- /dev/null +++ b/nj2k/testData/newJ2k/literalExpression/underscores.kt @@ -0,0 +1,9 @@ +class TestNumber { + internal var longLiteral: Long = 1234567 + internal var longHexLiteral: Long = -0x1321a2 + internal var intLiteral = 1234 + internal var floatLiteral = 1234f + internal var doubleLiteral = 1234.0 + internal var shortLiteral: Short = 123 + internal var byteLiteral: Byte = 123 +} \ No newline at end of file diff --git a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java index 8e654f04043..0a44abc42f5 100644 --- a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java +++ b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java @@ -3375,6 +3375,11 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew public void testTrueOrFalse() throws Exception { runTest("nj2k/testData/newJ2k/literalExpression/trueOrFalse.java"); } + + @TestMetadata("underscores.java") + public void testUnderscores() throws Exception { + runTest("nj2k/testData/newJ2k/literalExpression/underscores.java"); + } } @TestMetadata("nj2k/testData/newJ2k/localVariable")