From a64c45c9fe14a74f3b3d17b802d829428c1cbfd7 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 11 Oct 2016 14:51:07 +0300 Subject: [PATCH] Fix KT-8091: J2K string with octal escaped chars --- j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt | 3 +++ .../fileOrElement/literalExpression/stringOctalChars.java | 7 +++++++ .../fileOrElement/literalExpression/stringOctalChars.kt | 7 +++++++ .../j2k/JavaToKotlinConverterForWebDemoTestGenerated.java | 6 ++++++ .../j2k/JavaToKotlinConverterSingleFileTestGenerated.java | 6 ++++++ 5 files changed, 29 insertions(+) create mode 100644 j2k/testData/fileOrElement/literalExpression/stringOctalChars.java create mode 100644 j2k/testData/fileOrElement/literalExpression/stringOctalChars.kt diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index 2db5a8947aa..4b95dd6c5a5 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -314,6 +314,9 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { } if (typeStr == "java.lang.String") { + text = text.replace("\\\\([0-3]?[0-7]{1,2})".toRegex(), { + String.format("\\u%04x", Integer.parseInt(it.groupValues[1], 8)) + }) text = text.replace("\\$([A-Za-z]+|\\{)".toRegex(), "\\\\$0") } } diff --git a/j2k/testData/fileOrElement/literalExpression/stringOctalChars.java b/j2k/testData/fileOrElement/literalExpression/stringOctalChars.java new file mode 100644 index 00000000000..48c23433472 --- /dev/null +++ b/j2k/testData/fileOrElement/literalExpression/stringOctalChars.java @@ -0,0 +1,7 @@ +public class A { + public String a = "\770123"; + public String b = "\1110123"; + public String c = "\3770123"; + public String d = "\000Text"; + public String f = "\09"; +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/literalExpression/stringOctalChars.kt b/j2k/testData/fileOrElement/literalExpression/stringOctalChars.kt new file mode 100644 index 00000000000..851ed3112b5 --- /dev/null +++ b/j2k/testData/fileOrElement/literalExpression/stringOctalChars.kt @@ -0,0 +1,7 @@ +class A { + var a = "\u003f0123" + var b = "\u00490123" + var c = "\u00ff0123" + var d = "\u0000Text" + var f = "\u00009" +} \ 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 830da8ac157..7a03a2ec90a 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -3232,6 +3232,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("stringOctalChars.java") + public void testStringOctalChars() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/literalExpression/stringOctalChars.java"); + doTest(fileName); + } + @TestMetadata("trueOrFalse.java") public void testTrueOrFalse() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/literalExpression/trueOrFalse.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 283d15efa01..f3f00ee821f 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -3232,6 +3232,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("stringOctalChars.java") + public void testStringOctalChars() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/literalExpression/stringOctalChars.java"); + doTest(fileName); + } + @TestMetadata("trueOrFalse.java") public void testTrueOrFalse() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/literalExpression/trueOrFalse.java");