Detect escaped backslashes
#KT-15761 Fixed
This commit is contained in:
committed by
Simon Ogorodnik
parent
9c4f897d31
commit
31478f8efa
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user