You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2015/10/31 01:14:32 UTC

incubator-groovy git commit: GROOVY-7645: Stub generator unescapes escaped backslashes in String annotation values (closes #168)

Repository: incubator-groovy
Updated Branches:
  refs/heads/master 24af0ede2 -> 4a04e4af2


GROOVY-7645: Stub generator unescapes escaped backslashes in String annotation values (closes #168)


Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/4a04e4af
Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/4a04e4af
Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/4a04e4af

Branch: refs/heads/master
Commit: 4a04e4af2e74de9c790083f9e4a457c097e9cd0b
Parents: 24af0ed
Author: paulk <pa...@asert.com.au>
Authored: Fri Oct 30 19:20:11 2015 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Fri Oct 30 19:20:11 2015 +1000

----------------------------------------------------------------------
 .../codehaus/groovy/runtime/InvokerHelper.java  | 18 ++++++++-----
 .../groovy/tools/javac/JavaStubGenerator.java   |  4 ++-
 .../EscapingOfStringAnnotationValuesTest.groovy | 27 ++++++++++++--------
 3 files changed, 30 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/4a04e4af/src/main/org/codehaus/groovy/runtime/InvokerHelper.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/runtime/InvokerHelper.java b/src/main/org/codehaus/groovy/runtime/InvokerHelper.java
index 21b4509..bf8bbc1 100644
--- a/src/main/org/codehaus/groovy/runtime/InvokerHelper.java
+++ b/src/main/org/codehaus/groovy/runtime/InvokerHelper.java
@@ -616,13 +616,7 @@ public class InvokerHelper {
         }
         if (arguments instanceof String) {
             if (verbose) {
-                String arg = ((String) arguments)
-                        // must replace backslashes first, as the other replacements add backslashes not to be escaped
-                        .replace("\\", "\\\\")      // backslash
-                        .replace("\n", "\\n")    // line feed
-                        .replaceAll("\\r", "\\\\r")      // carriage return
-                        .replaceAll("\\t", "\\\\t")      // tab
-                        .replaceAll("\\f", "\\\\f")      // form feed
+                String arg = escapeBackslashes((String) arguments)
                         .replaceAll("'", "\\\\'");    // single quotation mark
                 return "\'" + arg + "\'";
             } else {
@@ -634,6 +628,16 @@ public class InvokerHelper {
         return arguments.toString();
     }
 
+    public static String escapeBackslashes(String orig) {
+        // must replace backslashes first, as the other replacements add backslashes not to be escaped
+        return orig
+                .replace("\\", "\\\\")           // backslash
+                .replace("\n", "\\n")            // line feed
+                .replaceAll("\\r", "\\\\r")      // carriage return
+                .replaceAll("\\t", "\\\\t")      // tab
+                .replaceAll("\\f", "\\\\f");     // form feed
+    }
+
     private static String formatMap(Map map, boolean verbose, int maxSize) {
         if (map.isEmpty()) {
             return "[:]";

http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/4a04e4af/src/main/org/codehaus/groovy/tools/javac/JavaStubGenerator.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/tools/javac/JavaStubGenerator.java b/src/main/org/codehaus/groovy/tools/javac/JavaStubGenerator.java
index 66bc312..6770a57 100644
--- a/src/main/org/codehaus/groovy/tools/javac/JavaStubGenerator.java
+++ b/src/main/org/codehaus/groovy/tools/javac/JavaStubGenerator.java
@@ -34,6 +34,7 @@ import org.codehaus.groovy.ast.stmt.Statement;
 import org.codehaus.groovy.classgen.FinalVariableAnalyzer;
 import org.codehaus.groovy.classgen.Verifier;
 import org.codehaus.groovy.control.ResolveVisitor;
+import org.codehaus.groovy.runtime.InvokerHelper;
 import org.codehaus.groovy.tools.Utilities;
 import org.codehaus.groovy.transform.trait.Traits;
 import org.objectweb.asm.Opcodes;
@@ -963,7 +964,8 @@ public class JavaStubGenerator {
     }
 
     private static String escapeSpecialChars(String value) {
-        return value.replace("\n", "\\n").replace("\r", "\\r").replace("\"", "\\\"");
+        return InvokerHelper.escapeBackslashes(value).replace("\"", "\\\"");
+
     }
 
     private static boolean isInterfaceOrTrait(ClassNode cn) {

http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/4a04e4af/src/test/org/codehaus/groovy/tools/stubgenerator/EscapingOfStringAnnotationValuesTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/tools/stubgenerator/EscapingOfStringAnnotationValuesTest.groovy b/src/test/org/codehaus/groovy/tools/stubgenerator/EscapingOfStringAnnotationValuesTest.groovy
index a06dd50..7f70435 100644
--- a/src/test/org/codehaus/groovy/tools/stubgenerator/EscapingOfStringAnnotationValuesTest.groovy
+++ b/src/test/org/codehaus/groovy/tools/stubgenerator/EscapingOfStringAnnotationValuesTest.groovy
@@ -19,10 +19,7 @@
 package org.codehaus.groovy.tools.stubgenerator
 
 /**
- * Test case for GROOVY-4470, GROOVY-4604 and GROOVY-4601
- *
- * @author Peter Niederwieser
- * @author Guillaume Laforge
+ * Test case for GROOVY-4470, GROOVY-4604, GROOVY-4601, GROOVY-7645
  */
 class EscapingOfStringAnnotationValuesTest extends StringSourcesStubTestCase {
 
@@ -36,27 +33,35 @@ class EscapingOfStringAnnotationValuesTest extends StringSourcesStubTestCase {
                     }
                 ''',
 
-                'StringAnnUsage.groovy': '''
+                'StringAnnUsage1.groovy': '''
                     |@StringAnn(str = """Now that's what
                     |I
                     |\tcall an
                     |  "unescaped"
                     |String!""")
-                    |class StringAnnUsage {}
+                    |class StringAnnUsage1 {}
                 '''.stripMargin('|'),
 
-                'StringAnnoUser.groovy': '''
+                'StringAnnUsage2.groovy': '''
                     @StringAnn(str = 'single quote string with "double quote string"')
-                    class StringAnnoUser {}
+                    class StringAnnUsage2 {}
+                ''',
+
+                'StringAnnUsage3.groovy': '''
+                    @StringAnn(str = '{id:[^.]\\\\.[^.]}')
+                    class StringAnnUsage3 {}
                 '''
         ]
     }
 
     void verifyStubs() {
-        def ann1 = classes['StringAnnUsage'].annotations[0]
-        assert "\"Now that's what\\nI\\n\tcall an\\n  \\\"unescaped\\\"\\nString!\"" == ann1.getNamedParameter("str")
+        def ann1 = classes['StringAnnUsage1'].annotations[0]
+        assert "\"Now that's what\\nI\\n\\tcall an\\n  \\\"unescaped\\\"\\nString!\"" == ann1.getNamedParameter("str")
 
-        def ann2 = classes['StringAnnoUser'].annotations[0]
+        def ann2 = classes['StringAnnUsage2'].annotations[0]
         assert '"single quote string with \\"double quote string\\""' == ann2.getNamedParameter("str")
+
+        def ann3 = classes['StringAnnUsage3'].annotations[0]
+        assert '"{id:[^.]\\\\.[^.]}"' == ann3.getNamedParameter("str")
     }
 }
\ No newline at end of file