diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index 88fff47aa95..7f56f809ea8 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -309,6 +309,10 @@ 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") { + text = text.replace("\\$([A-Za-z]+|\\{)".toRegex(), "\\\\$0") + } } result = LiteralExpression(text) diff --git a/j2k/testData/fileOrElement/strings/escapedDollar.java b/j2k/testData/fileOrElement/strings/escapedDollar.java new file mode 100644 index 00000000000..14435b4d283 --- /dev/null +++ b/j2k/testData/fileOrElement/strings/escapedDollar.java @@ -0,0 +1,6 @@ +public class A { + private String dollar1 = "$a"; + private String dollar2 = "$A"; + private String dollar3 = "${s}"; + private String dollar4 = "$$"; +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/strings/escapedDollar.kt b/j2k/testData/fileOrElement/strings/escapedDollar.kt new file mode 100644 index 00000000000..eca9226783b --- /dev/null +++ b/j2k/testData/fileOrElement/strings/escapedDollar.kt @@ -0,0 +1,6 @@ +class A { + private val dollar1 = "\$a" + private val dollar2 = "\$A" + private val dollar3 = "\${s}" + private val dollar4 = "$$" +} \ 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 2fd2a4b73a6..cbefc2d7565 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -4066,6 +4066,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/strings"), Pattern.compile("^(.+)\\.java$"), true); } + @TestMetadata("escapedDollar.java") + public void testEscapedDollar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/escapedDollar.java"); + doTest(fileName); + } + @TestMetadata("formattedString.java") public void testFormattedString() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/formattedString.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 8fb040e06e7..3484320269d 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -4066,6 +4066,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/strings"), Pattern.compile("^(.+)\\.java$"), true); } + @TestMetadata("escapedDollar.java") + public void testEscapedDollar() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/escapedDollar.java"); + doTest(fileName); + } + @TestMetadata("formattedString.java") public void testFormattedString() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/strings/formattedString.java");