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)); } }