Detect escaped backslashes

#KT-15761 Fixed
This commit is contained in:
Dmitry Neverov
2017-05-09 21:58:38 +02:00
committed by Simon Ogorodnik
parent 9c4f897d31
commit 31478f8efa
5 changed files with 38 additions and 1 deletions
@@ -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")
}
}
@@ -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";
}
@@ -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"
}
@@ -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");
@@ -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");