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

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

commit 81ea3227e2dd0246f4a76632638af023cf03f423
Author: Eric Milles <eric.mil...@thomsonreuters.com>
AuthorDate: Fri Mar 8 18:48:17 2024 -0600

    GROOVY-11270: reduce "foo.bar.Baz" to "f.b.Baz" in long error message
    
    3_0_X backport
---
 .../java/groovy/lang/MissingMethodException.java   |   4 +-
 .../org/codehaus/groovy/runtime/InvokerHelper.java |  43 +++++++--
 .../codehaus/groovy/runtime/InvokerHelperTest.java | 106 +++++++++++++--------
 3 files changed, 102 insertions(+), 51 deletions(-)

diff --git a/src/main/java/groovy/lang/MissingMethodException.java 
b/src/main/java/groovy/lang/MissingMethodException.java
index 6a9a857065..072b8ecc76 100644
--- a/src/main/java/groovy/lang/MissingMethodException.java
+++ b/src/main/java/groovy/lang/MissingMethodException.java
@@ -60,9 +60,9 @@ public class MissingMethodException extends 
GroovyRuntimeException {
                 + "."
                 + method
                 + "() is applicable for argument types: ("
-                + InvokerHelper.toTypeString(arguments, 60)
+                + InvokerHelper.toTypeString(arguments, 80)
                 + ") values: "
-                + InvokerHelper.toArrayString(arguments, 60, true)
+                + InvokerHelper.toArrayString(arguments, 80, true)
                 + (type != null ? 
MethodRankHelper.getMethodSuggestionString(method, type, arguments) : "");
     }
 
diff --git a/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java 
b/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
index 6d3afec018..bbb45c4cfb 100644
--- a/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
+++ b/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
@@ -795,19 +795,42 @@ public class InvokerHelper {
         if (arguments == null) {
             return "null";
         }
-        StringBuilder argBuf = new StringBuilder();
-        for (int i = 0; i < arguments.length; i++) {
-            if (maxSize != -1 && argBuf.length() > maxSize) {
-                argBuf.append("...");
-                break;
-            } else {
-                if (i > 0) {
-                    argBuf.append(", ");
+        if (arguments.length == 0) {
+            return "";
+        }
+        if (maxSize < 0) {
+            return Arrays.stream(arguments)
+                    .map(arg -> arg != null ? typeName(arg) : "null")
+                    .collect(java.util.stream.Collectors.joining(", "));
+        }
+
+        StringBuilder plainForm = new StringBuilder();
+        StringBuilder shortForm = new StringBuilder();
+        for (int i = 0; i < arguments.length; i += 1) {
+            String type = arguments[i] != null ? typeName(arguments[i]) : 
"null";
+
+            if (plainForm.length() < maxSize) {
+                if (i > 0) plainForm.append(", ");
+                plainForm.append(type);
+            } else if (plainForm.charAt(plainForm.length() - 1) != '.') {
+                plainForm.append("...");
+            }
+
+            if (shortForm.length() < maxSize) {
+                if (i > 0) shortForm.append(", ");
+                String[] tokens = type.split("\\.");
+                for (int j = 0; j < tokens.length - 1; j += 1) {
+                    // GROOVY-11270: reduce "foo.bar.Baz" to "f.b.Baz"
+                    
shortForm.appendCodePoint(tokens[j].codePointAt(0)).append('.');
                 }
-                argBuf.append(arguments[i] != null ? typeName(arguments[i]) : 
"null");
+                shortForm.append(tokens[tokens.length - 1]);
+            } else {
+                shortForm.append("...");
+                break;
             }
         }
-        return argBuf.toString();
+
+        return (plainForm.length() <= maxSize ? plainForm : 
shortForm).toString();
     }
 
     private static final Set<String> DEFAULT_IMPORT_PKGS = new 
HashSet<String>();
diff --git a/src/test/org/codehaus/groovy/runtime/InvokerHelperTest.java 
b/src/test/org/codehaus/groovy/runtime/InvokerHelperTest.java
index d80ae1437d..5ea13597ec 100644
--- a/src/test/org/codehaus/groovy/runtime/InvokerHelperTest.java
+++ b/src/test/org/codehaus/groovy/runtime/InvokerHelperTest.java
@@ -22,57 +22,85 @@ import groovy.lang.Binding;
 import groovy.lang.GroovyClassLoader;
 import groovy.lang.GroovyCodeSource;
 import groovy.lang.Script;
-import junit.framework.TestCase;
+import org.junit.Test;
 
 import java.util.HashMap;
+import java.util.Map;
 
-import static org.codehaus.groovy.runtime.InvokerHelper.initialCapacity;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
 
+public final class InvokerHelperTest {
 
-public class InvokerHelperTest extends TestCase {
-    private HashMap bindingVariables;
+    private final Map<String, Object> variables = new HashMap<>();
 
-    protected void setUp() throws Exception {
-        bindingVariables = new HashMap();
-        bindingVariables.put("name", "hans");
+    @Test
+    public void testCreateScriptWithScriptClass() throws Exception {
+        try (GroovyClassLoader classLoader = new GroovyClassLoader()) {
+            String controlProperty = "text", controlValue = "I am a script";
+            Class<?> scriptClass = classLoader.parseClass(new GroovyCodeSource(
+                    controlProperty + " = '" + controlValue + "'", 
"testscript", "/groovy/shell"), false);
+
+            Script script = InvokerHelper.createScript(scriptClass, new 
Binding(variables));
+
+            assertSame(variables, script.getBinding().getVariables());
+
+            script.run();
+
+            assertEquals(controlValue, script.getProperty(controlProperty));
+        }
     }
 
+    @Test
     public void testCreateScriptWithNullClass() {
-        Script script = InvokerHelper.createScript(null, new 
Binding(bindingVariables));
-        assertEquals(bindingVariables, script.getBinding().getVariables());
-    }
+        Script script = InvokerHelper.createScript(null, new 
Binding(variables));
 
-    public void testCreateScriptWithScriptClass() {
-        GroovyClassLoader classLoader = new GroovyClassLoader();
-        String controlProperty = "text";
-        String controlValue = "I am a script";
-        String code = controlProperty + " = '" + controlValue + "'";
-        GroovyCodeSource codeSource = new GroovyCodeSource(code, "testscript", 
"/groovy/shell");
-        Class scriptClass = classLoader.parseClass(codeSource, false);
-        Script script = InvokerHelper.createScript(scriptClass, new 
Binding(bindingVariables));
-        assertEquals(bindingVariables, script.getBinding().getVariables());
-        script.run();
-        assertEquals(controlValue, script.getProperty(controlProperty));
+        assertSame(variables, script.getBinding().getVariables());
     }
 
+    @Test
     public void testInitialCapacity() {
-        assertEquals(16, initialCapacity(0));
-        assertEquals(2, initialCapacity(1));
-        assertEquals(4, initialCapacity(2));
-        assertEquals(4, initialCapacity(3));
-        assertEquals(8, initialCapacity(4));
-        assertEquals(8, initialCapacity(5));
-        assertEquals(8, initialCapacity(6));
-        assertEquals(8, initialCapacity(7));
-        assertEquals(16, initialCapacity(8));
-        assertEquals(16, initialCapacity(9));
-        assertEquals(16, initialCapacity(10));
-        assertEquals(16, initialCapacity(11));
-        assertEquals(16, initialCapacity(12));
-        assertEquals(16, initialCapacity(13));
-        assertEquals(16, initialCapacity(14));
-        assertEquals(16, initialCapacity(15));
-        assertEquals(32, initialCapacity(16));
-        assertEquals(32, initialCapacity(17));
+        assertEquals(16, InvokerHelper.initialCapacity(0));
+        assertEquals( 2, InvokerHelper.initialCapacity(1));
+        assertEquals( 4, InvokerHelper.initialCapacity(2));
+        assertEquals( 4, InvokerHelper.initialCapacity(3));
+        assertEquals( 8, InvokerHelper.initialCapacity(4));
+        assertEquals( 8, InvokerHelper.initialCapacity(5));
+        assertEquals( 8, InvokerHelper.initialCapacity(6));
+        assertEquals( 8, InvokerHelper.initialCapacity(7));
+        assertEquals(16, InvokerHelper.initialCapacity(8));
+        assertEquals(16, InvokerHelper.initialCapacity(9));
+        assertEquals(16, InvokerHelper.initialCapacity(10));
+        assertEquals(16, InvokerHelper.initialCapacity(11));
+        assertEquals(16, InvokerHelper.initialCapacity(12));
+        assertEquals(16, InvokerHelper.initialCapacity(13));
+        assertEquals(16, InvokerHelper.initialCapacity(14));
+        assertEquals(16, InvokerHelper.initialCapacity(15));
+        assertEquals(32, InvokerHelper.initialCapacity(16));
+        assertEquals(32, InvokerHelper.initialCapacity(17));
+    }
+
+    @Test
+    public void testToTypeString() {
+        Object[] objects = null;
+        assertEquals("null", InvokerHelper.toTypeString(objects, 42));
+
+        objects = new Object[0];
+        assertEquals("", InvokerHelper.toTypeString(objects, 42));
+
+        objects = new Object[] {null};
+        assertEquals("null", InvokerHelper.toTypeString(objects, 42));
+
+        objects = new Object[] {0};
+        assertEquals("Integer", InvokerHelper.toTypeString(objects, 42));
+
+        objects = new Object[] {0, 1d};
+        assertEquals("Integer, Double", InvokerHelper.toTypeString(objects, 
42));
+
+        objects = new Object[] {new DummyBean(), new DummyBean()}; // 
GROOVY-11270
+        assertEquals("o.c.g.r.DummyBean, o.c.g.r.DummyBean", 
InvokerHelper.toTypeString(objects, 42));
+
+        objects = new Object[] {0f, new DummyBean()};
+        assertEquals("Float, org.codehaus.groovy.runtime.DummyBean", 
InvokerHelper.toTypeString(objects, 44));
     }
 }

Reply via email to