This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new 71febc875f Use efficient `replaceAll` instead
71febc875f is described below

commit 71febc875fdcc5993eac2eb15993ca34bde7a1c4
Author: Daniel Sun <[email protected]>
AuthorDate: Tue Jan 14 23:27:40 2025 +0900

    Use efficient `replaceAll` instead
---
 .../groovy/parser/antlr4/util/StringUtils.java     | 66 +++++++++++-----------
 1 file changed, 34 insertions(+), 32 deletions(-)

diff --git 
a/src/main/java/org/apache/groovy/parser/antlr4/util/StringUtils.java 
b/src/main/java/org/apache/groovy/parser/antlr4/util/StringUtils.java
index 1c80045e5b..f4d431b53c 100644
--- a/src/main/java/org/apache/groovy/parser/antlr4/util/StringUtils.java
+++ b/src/main/java/org/apache/groovy/parser/antlr4/util/StringUtils.java
@@ -18,14 +18,13 @@
  */
 package org.apache.groovy.parser.antlr4.util;
 
-import groovy.lang.Closure;
 import org.apache.groovy.util.Maps;
 
 import java.util.Map;
+import java.util.function.Function;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import static org.codehaus.groovy.runtime.StringGroovyMethods.replaceAll;
-
 /**
  * Utilities for handling strings
  *
@@ -57,17 +56,30 @@ public class StringUtils {
 
     public static String replaceHexEscapes(String text) {
                if (!text.contains(BACKSLASH)) return text;
-               return replaceAll((CharSequence) text, HEX_ESCAPES_PATTERN, 
REPLACE_HEX_ESCAPES);
+               return replaceAll(text, HEX_ESCAPES_PATTERN, m -> {
+            final String _0 = m.group(0), _1 = m.group(1), _2 = m.group(2);
+            if (isLengthOdd(_1)) return _0;
+            return _1 + new String(Character.toChars(Integer.parseInt(_2, 
16)));
+        });
        }
 
        public static String replaceOctalEscapes(String text) {
                if (!text.contains(BACKSLASH)) return text;
-               return replaceAll((CharSequence) text, OCTAL_ESCAPES_PATTERN, 
REPLACE_OCTAL_ESCAPES);
+               return replaceAll(text, OCTAL_ESCAPES_PATTERN, m -> {
+            final String _0 = m.group(0), _1 = m.group(1), _2 = m.group(2);
+            if (isLengthOdd(_1)) return _0;
+            return _1 + new String(Character.toChars(Integer.parseInt(_2, 8)));
+        });
        }
 
     public static String replaceStandardEscapes(String text) {
                if (!text.contains(BACKSLASH)) return text;
-               final String result = replaceAll((CharSequence) text, 
STANDARD_ESCAPES_PATTERN, REPLACE_STANDARD_ESCAPES);
+               final String result = replaceAll(text, 
STANDARD_ESCAPES_PATTERN, m -> {
+            final String _0 = m.group(0), _1 = m.group(1), _2 = m.group(2);
+            if (isLengthOdd(_1)) return _0;
+            final Character character = STANDARD_ESCAPES.get(_2.charAt(0));
+            return _1 + (character != null ? character : _2);
+        });
                return replace(result,"\\\\", "\\");
        }
 
@@ -166,10 +178,25 @@ public class StringUtils {
 
     private static String replaceLineEscape(String text) {
         if (!text.contains(BACKSLASH)) return text;
-        text = replaceAll((CharSequence) text, LINE_ESCAPE_PATTERN, 
REPLACE_LINE_ESCAPE);
+        text = replaceAll(text, LINE_ESCAPE_PATTERN, m -> {
+            final String _0 = m.group(0), _1 = m.group(1);
+            if (isLengthOdd(_1)) return _0;
+            return _1;
+        });
         return text;
     }
 
+    private static String replaceAll(final CharSequence input, final Pattern 
pattern, final Function<? super Matcher, String> replaceFunction) {
+        final Matcher matcher = pattern.matcher(input);
+        final StringBuilder result = new StringBuilder(input.length() + 
matcher.groupCount() * 8);
+        while (matcher.find()) {
+            final String replacement = replaceFunction.apply(matcher);
+            matcher.appendReplacement(result, 
Matcher.quoteReplacement(replacement));
+        }
+        matcher.appendTail(result);
+        return result.toString();
+    }
+
     private static boolean isLengthOdd(String str) {
         return null != str && str.length() % 2 == 1;
     }
@@ -193,29 +220,4 @@ public class StringUtils {
         'r', '\r',
         's', ' '
     );
-    private static final Closure<String> REPLACE_STANDARD_ESCAPES = new 
Closure<String>(null, null) {
-        String doCall(String _0, String _1, String _2) {
-            if (isLengthOdd(_1)) return _0;
-            final Character character = STANDARD_ESCAPES.get(_2.charAt(0));
-            return _1 + (character != null ? character : _2);
-        }
-    };
-    private static final Closure<String> REPLACE_OCTAL_ESCAPES = new 
Closure<String>(null, null) {
-        String doCall(String _0, String _1, String _2) {
-            if (isLengthOdd(_1)) return _0;
-            return _1 + new String(Character.toChars(Integer.parseInt(_2, 8)));
-        }
-    };
-    private static final Closure<String> REPLACE_HEX_ESCAPES = new 
Closure<String>(null, null) {
-        String doCall(String _0, String _1, String _2) {
-            if (isLengthOdd(_1)) return _0;
-            return _1 + new String(Character.toChars(Integer.parseInt(_2, 
16)));
-        }
-    };
-    private static final Closure<String> REPLACE_LINE_ESCAPE = new 
Closure<String>(null, null) {
-        String doCall(String _0, String _1) {
-            if (isLengthOdd(_1)) return _0;
-            return _1;
-        }
-    };
 }

Reply via email to