diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index 73ad57b3953..47d884f3c93 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -310,12 +310,21 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { 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 "") } - if (typeStr == "java.lang.String" || typeStr == "char") + if (typeStr == "char") { text = text.replace("\\\\([0-3]?[0-7]{1,2})".toRegex()) { String.format("\\u%04x", Integer.parseInt(it.groupValues[1], 8)) } + } if (typeStr == "java.lang.String") { + text = text.replace("((?:\\\\)*)\\\\([0-3]?[0-7]{1,2})".toRegex()) { + val leadingBackslashes = it.groupValues[1] + if (leadingBackslashes.length % 2 == 0) { + String.format("%s\\u%04x", leadingBackslashes, Integer.parseInt(it.groupValues[2], 8)) + } else { + it.value + } + } text = text.replace("\\$([A-Za-z]+|\\{)".toRegex(), "\\\\$0") } } diff --git a/j2k/testData/fileOrElement/strings/escapedBackslash.java b/j2k/testData/fileOrElement/strings/escapedBackslash.java new file mode 100644 index 00000000000..00ea5ba28c4 --- /dev/null +++ b/j2k/testData/fileOrElement/strings/escapedBackslash.java @@ -0,0 +1,8 @@ +public class A { + private String s1 = "\1"; + private String s2 = "\\1"; + private String s3 = "\\\1"; + private String s4 = "\\\\1"; + private String s5 = "\\\\\1"; + private String s6 = "\1\1"; +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/strings/escapedBackslash.kt b/j2k/testData/fileOrElement/strings/escapedBackslash.kt new file mode 100644 index 00000000000..375da9bebe0 --- /dev/null +++ b/j2k/testData/fileOrElement/strings/escapedBackslash.kt @@ -0,0 +1,8 @@ +class A { + private val s1 = "\u0001" + private val s2 = "\\1" + private val s3 = "\\\u0001" + private val s4 = "\\\\1" + private val s5 = "\\\\\u0001" + private val s6 = "\u0001\u0001" +} \ No newline at end of file diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index b3bb20c2a24..933d292faf6 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -4430,6 +4430,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/strings"), Pattern.compile("^(.+)\\.java$"), TargetBackend.ANY, true); } + @TestMetadata("escapedBackslash.java") + public void testEscapedBackslash() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/escapedBackslash.java"); + doTest(fileName); + } + @TestMetadata("escapedDollar.java") public void testEscapedDollar() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/escapedDollar.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 6c8f6cb517f..9f6dca091f4 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -4430,6 +4430,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/strings"), Pattern.compile("^(.+)\\.java$"), TargetBackend.ANY, true); } + @TestMetadata("escapedBackslash.java") + public void testEscapedBackslash() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/escapedBackslash.java"); + doTest(fileName); + } + @TestMetadata("escapedDollar.java") public void testEscapedDollar() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/escapedDollar.java");