From 0264d70a549263bee51d4a0a2d405cc9c10b0b7c Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Mon, 16 Nov 2009 20:04:09 +0300 Subject: [PATCH] IDEADEV-40959: ClassCastException at ConvertConcatenationToGstringIntention.processIntention() on applying "Convert concatenation to GString" intention to GString literals with backslash --- .../ConvertConcatenationToGstringIntention.java | 3 ++- .../conversions/ConvertGStringToStringIntention.java | 3 ++- .../plugins/groovy/lang/psi/util/GrStringUtil.java | 11 ++++++----- .../intentions/ConvertConcatenationToGstringTest.java | 8 ++++++++ .../convertConcatenationToGstring/Quotes2.groovy | 1 + .../Quotes2_after.groovy | 1 + .../QuotesInMultilineString.groovy | 1 + .../QuotesInMultilineString_after.groovy | 2 ++ 8 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 plugins/groovy/testdata/intentions/convertConcatenationToGstring/Quotes2.groovy create mode 100644 plugins/groovy/testdata/intentions/convertConcatenationToGstring/Quotes2_after.groovy create mode 100644 plugins/groovy/testdata/intentions/convertConcatenationToGstring/QuotesInMultilineString.groovy create mode 100644 plugins/groovy/testdata/intentions/convertConcatenationToGstring/QuotesInMultilineString_after.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertConcatenationToGstringIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertConcatenationToGstringIntention.java index 805627b679ac..cb1f0fe744f7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertConcatenationToGstringIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertConcatenationToGstringIntention.java @@ -73,7 +73,8 @@ public class ConvertConcatenationToGstringIntention extends Intention { builder.append(GrStringUtil.removeQuotes(operand.getText())); } else if (operand instanceof GrLiteral) { - String text = GrStringUtil.escapeSymbolsForGString(GrStringUtil.removeQuotes(operand.getText())); + String text = GrStringUtil.escapeSymbolsForGString(GrStringUtil.removeQuotes(operand.getText()), false); + if (text.contains("\n")) text = GrStringUtil.escapeSymbolsForGString(text, true); builder.append(text); } else if (MyPredicate.satisfiedBy(operand, false)) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertGStringToStringIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertGStringToStringIntention.java index 99cafafb297e..e22e9c7d93dd 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertGStringToStringIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertGStringToStringIntention.java @@ -148,7 +148,8 @@ public class ConvertGStringToStringIntention extends Intention { } if (text.length() == 0) return null; - String escaped = GrStringUtil.escapeSymbolsForString(text); + String escaped = GrStringUtil.escapeSymbolsForString(text, false); + if (escaped.contains("\n")) escaped = GrStringUtil.escapeSymbolsForGString(escaped, true); return GrStringUtil.addQuotes(escaped, false); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java index 7660636bf087..cef2484d2291 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GrStringUtil.java @@ -27,7 +27,7 @@ public class GrStringUtil { private GrStringUtil() { } - public static String escapeSymbolsForGString(String s) { + public static String escapeSymbolsForGString(String s, boolean escapeDoubleQuotes) { StringBuilder b = new StringBuilder(); final char[] chars = s.toCharArray(); final int len = chars.length - 1; @@ -43,7 +43,7 @@ public class GrStringUtil { b.append('\n'); i++; } - else if (next == '"') { + else if (escapeDoubleQuotes && next == '"') { b.append('"'); i++; } @@ -64,7 +64,7 @@ public class GrStringUtil { return b.toString(); } - public static String escapeSymbolsForString(String s) { + public static String escapeSymbolsForString(String s, boolean escapeQuotes) { StringBuilder b = new StringBuilder(); final char[] chars = s.toCharArray(); final int len = chars.length - 1; @@ -78,7 +78,7 @@ public class GrStringUtil { else if (next == 'n') { b.append('\n'); } - else if (next == '\'') { + else if (escapeQuotes && next == '\'') { b.append(next); } else { @@ -166,7 +166,8 @@ public class GrStringUtil { literal = addAllBracesInGString((GrString)literal); } - String literalText = escapeSymbolsForGString(removeQuotes(literal.getText())); + String literalText = escapeSymbolsForGString(removeQuotes(literal.getText()), false); + if(literalText.contains("\n")) literalText=escapeSymbolsForGString(literalText, true); final GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(grString.getProject()); final GrExpression expression = factory.createExpressionFromText("\"${}" + literalText + "\""); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertConcatenationToGstringTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertConcatenationToGstringTest.java index 684207391d49..e58e3d72d49a 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertConcatenationToGstringTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertConcatenationToGstringTest.java @@ -62,4 +62,12 @@ public class ConvertConcatenationToGstringTest extends GrIntentionTestCase { public void testQuotes() throws Exception { doTest("Convert concatenation to GString", true); } + + public void testQuotes2() throws Exception { + doTest("Convert concatenation to GString", true); + } + + public void testQuotesInMultilineString() throws Exception { + doTest("Convert concatenation to GString", true); + } } diff --git a/plugins/groovy/testdata/intentions/convertConcatenationToGstring/Quotes2.groovy b/plugins/groovy/testdata/intentions/convertConcatenationToGstring/Quotes2.groovy new file mode 100644 index 000000000000..487d5c8b9cd1 --- /dev/null +++ b/plugins/groovy/testdata/intentions/convertConcatenationToGstring/Quotes2.groovy @@ -0,0 +1 @@ +def s = "Say \"hello\" to the" + " world" \ No newline at end of file diff --git a/plugins/groovy/testdata/intentions/convertConcatenationToGstring/Quotes2_after.groovy b/plugins/groovy/testdata/intentions/convertConcatenationToGstring/Quotes2_after.groovy new file mode 100644 index 000000000000..d90197755161 --- /dev/null +++ b/plugins/groovy/testdata/intentions/convertConcatenationToGstring/Quotes2_after.groovy @@ -0,0 +1 @@ +def s = "Say \"hello\" to the world" \ No newline at end of file diff --git a/plugins/groovy/testdata/intentions/convertConcatenationToGstring/QuotesInMultilineString.groovy b/plugins/groovy/testdata/intentions/convertConcatenationToGstring/QuotesInMultilineString.groovy new file mode 100644 index 000000000000..18ebdb015c82 --- /dev/null +++ b/plugins/groovy/testdata/intentions/convertConcatenationToGstring/QuotesInMultilineString.groovy @@ -0,0 +1 @@ +def s = "Say \"hello\" \n to" + " the world" \ No newline at end of file diff --git a/plugins/groovy/testdata/intentions/convertConcatenationToGstring/QuotesInMultilineString_after.groovy b/plugins/groovy/testdata/intentions/convertConcatenationToGstring/QuotesInMultilineString_after.groovy new file mode 100644 index 000000000000..2456ae7bf13d --- /dev/null +++ b/plugins/groovy/testdata/intentions/convertConcatenationToGstring/QuotesInMultilineString_after.groovy @@ -0,0 +1,2 @@ +def s = """Say "hello" + to the world""" \ No newline at end of file