From 1eabcc213662fc1caba3a839c3ae5c10319b4256 Mon Sep 17 00:00:00 2001 From: Henrique Mota Date: Fri, 30 Nov 2018 10:04:28 -0200 Subject: [PATCH 1/3] Correcting @ClosureParams to correct type --- .../groovy/runtime/StringGroovyMethods.java | 16 ++-- .../runtime/StringGroovyMethodsTest.java | 93 +++++++++++++++++++ 2 files changed, 101 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java index 3f55c5892d4..de98eeb7ab4 100644 --- a/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java +++ b/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java @@ -925,7 +925,7 @@ public static String find(CharSequence self, CharSequence regex) { * @see #find(String, java.util.regex.Pattern, groovy.lang.Closure) * @since 1.8.2 */ - public static String find(CharSequence self, CharSequence regex, @ClosureParams(value=SimpleType.class, options="java.lang.String[]") Closure closure) { + public static String find(CharSequence self, CharSequence regex, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { return find(self, Pattern.compile(regex.toString()), closure); } @@ -1020,7 +1020,7 @@ public static String find(CharSequence self, Pattern pattern) { * @see #find(String, java.util.regex.Pattern, groovy.lang.Closure) * @since 1.8.2 */ - public static String find(CharSequence self, Pattern pattern, @ClosureParams(value=SimpleType.class, options="java.lang.String[]") Closure closure) { + public static String find(CharSequence self, Pattern pattern, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { Matcher matcher = pattern.matcher(self.toString()); if (matcher.find()) { if (hasGroup(matcher)) { @@ -1051,7 +1051,7 @@ public static String find(String self, Pattern pattern) { * @see #find(CharSequence, java.util.regex.Pattern, groovy.lang.Closure) */ @Deprecated - public static String find(String self, Pattern pattern, @ClosureParams(value=SimpleType.class, options="java.lang.String[]") Closure closure) { + public static String find(String self, Pattern pattern, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { return find((CharSequence) self, pattern, closure); } @@ -1069,7 +1069,7 @@ public static String find(String self, String regex) { * @see #find(CharSequence, CharSequence, groovy.lang.Closure) */ @Deprecated - public static String find(String self, String regex, @ClosureParams(value=SimpleType.class, options="java.lang.String[]") Closure closure) { + public static String find(String self, String regex, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { return find((CharSequence) self, (CharSequence) regex, closure); } @@ -1125,7 +1125,7 @@ public static List findAll(CharSequence self, CharSequence regex) { * @see #findAll(CharSequence, Pattern, groovy.lang.Closure) * @since 1.8.2 */ - public static List findAll(CharSequence self, CharSequence regex, @ClosureParams(value=SimpleType.class, options="java.lang.String[]") Closure closure) { + public static List findAll(CharSequence self, CharSequence regex, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { return findAll(self, Pattern.compile(regex.toString()), closure); } @@ -1191,7 +1191,7 @@ public static List findAll(CharSequence self, Pattern pattern) { * @see #findAll(String, java.util.regex.Pattern, groovy.lang.Closure) * @since 1.8.2 */ - public static List findAll(CharSequence self, Pattern pattern, @ClosureParams(value=SimpleType.class, options="java.lang.String[]") Closure closure) { + public static List findAll(CharSequence self, Pattern pattern, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { Matcher matcher = pattern.matcher(self.toString()); return DefaultGroovyMethods.collect(matcher, closure); } @@ -1210,7 +1210,7 @@ public static List findAll(String self, Pattern pattern) { * @see #findAll(CharSequence, java.util.regex.Pattern, groovy.lang.Closure) */ @Deprecated - public static List findAll(String self, Pattern pattern, @ClosureParams(value=SimpleType.class, options="java.lang.String[]") Closure closure) { + public static List findAll(String self, Pattern pattern, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { return findAll((CharSequence) self, pattern, closure); } @@ -1228,7 +1228,7 @@ public static List findAll(String self, String regex) { * @see #findAll(CharSequence, CharSequence, groovy.lang.Closure) */ @Deprecated - public static List findAll(String self, String regex, @ClosureParams(value=SimpleType.class, options="java.lang.String[]") Closure closure) { + public static List findAll(String self, String regex, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { return findAll((CharSequence) self, (CharSequence) regex, closure); } diff --git a/src/test/org/codehaus/groovy/runtime/StringGroovyMethodsTest.java b/src/test/org/codehaus/groovy/runtime/StringGroovyMethodsTest.java index ea73e9745ff..de1806ec970 100644 --- a/src/test/org/codehaus/groovy/runtime/StringGroovyMethodsTest.java +++ b/src/test/org/codehaus/groovy/runtime/StringGroovyMethodsTest.java @@ -18,15 +18,20 @@ */ package org.codehaus.groovy.runtime; +import groovy.lang.Closure; import groovy.util.GroovyTestCase; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; /** * @author James Strachan * @author Marc Guillemot * @author Brad Long + * @author Henrique Mota */ public class StringGroovyMethodsTest extends GroovyTestCase { @@ -125,4 +130,92 @@ public void testIsBlank() { assertFalse(StringGroovyMethods.isBlank("abc\t")); assertFalse(StringGroovyMethods.isBlank("\tabc\t")); } + + public void testFindAllFromCharSequenceWithClosure(){ + CharSequence charSequence = new StringBuilder().append("ABCD"); + String regex = "(A)(B)(C)(D)"; + Closure closure = createClosureForFindOrFindAll(); + List result = StringGroovyMethods.findAll(charSequence, regex, closure); + List expectedResult = Collections.singletonList("B"); + assertEquals(expectedResult, result); + } + + public void testFindAllFromCharSequenceWithPatternAndClosure(){ + CharSequence charSequence = new StringBuilder().append("ABCD"); + Pattern pattern = Pattern.compile("(A)(B)(C)(D)"); + Closure closure = createClosureForFindOrFindAll(); + List result = StringGroovyMethods.findAll(charSequence, pattern, closure); + List expectedResult = Collections.singletonList("B"); + assertEquals(expectedResult, result); + } + + public void testFindAllFromStringWithClosure(){ + String string = "ABCD"; + String regex = "(A)(B)(C)(D)"; + Closure closure = createClosureForFindOrFindAll(); + List result = StringGroovyMethods.findAll(string, regex, closure); + List expectedResult = Collections.singletonList("B"); + assertEquals(expectedResult, result); + } + + public void testFindAllFromStringWithPatternAndClosure(){ + String string = "ABCD"; + Pattern pattern = Pattern.compile("(A)(B)(C)(D)"); + Closure closure = createClosureForFindOrFindAll(); + List result = StringGroovyMethods.findAll(string, pattern, closure); + List expectedResult = Collections.singletonList("B"); + assertEquals(expectedResult, result); + } + + + + public void testFindFromCharSequenceWithClosure(){ + CharSequence charSequence = new StringBuilder().append("ABCD"); + String regex = "(A)(B)(C)(D)"; + Closure closure = createClosureForFindOrFindAll(); + String result = StringGroovyMethods.find(charSequence, regex, closure); + String expectedResult = "B"; + assertEquals(expectedResult, result); + } + + public void testFindFromCharSequenceWithPatternAndClosure(){ + CharSequence charSequence = new StringBuilder().append("ABCD"); + Pattern pattern = Pattern.compile("(A)(B)(C)(D)"); + Closure closure = createClosureForFindOrFindAll(); + String result = StringGroovyMethods.find(charSequence, pattern, closure); + String expectedResult = "B"; + assertEquals(expectedResult, result); + } + + public void testFindFromStringWithClosure(){ + String string = "ABCD"; + String regex = "(A)(B)(C)(D)"; + Closure closure = createClosureForFindOrFindAll(); + String result = StringGroovyMethods.find(string, regex, closure); + String expectedResult = "B"; + assertEquals(expectedResult, result); + } + + public void testFindFromStringWithPatternAndClosure(){ + String string = "ABCD"; + Pattern pattern = Pattern.compile("(A)(B)(C)(D)"); + Closure closure = createClosureForFindOrFindAll(); + String result = StringGroovyMethods.find(string, pattern, closure); + String expectedResult = "B"; + assertEquals(expectedResult, result); + } + + + + private Closure createClosureForFindOrFindAll(){ + return new Closure(this) { + @Override + public String call(Object arguments) { + assertTrue(arguments instanceof List); + Object element = ((List)arguments).get(2); + assertTrue(element instanceof String); + return element.toString(); + } + }; + } } From 6d15aa05418160f1b1490ad08f4764ff96fcc585 Mon Sep 17 00:00:00 2001 From: Henrique Mota Date: Fri, 30 Nov 2018 17:16:26 -0200 Subject: [PATCH 2/3] Correcting @ClosureParams to correct types --- .../groovy/runtime/StringGroovyMethods.java | 16 ++++++++-------- .../groovy/runtime/StringGroovyMethodsTest.java | 9 ++++++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java index de98eeb7ab4..472e5aa6173 100644 --- a/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java +++ b/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java @@ -925,7 +925,7 @@ public static String find(CharSequence self, CharSequence regex) { * @see #find(String, java.util.regex.Pattern, groovy.lang.Closure) * @since 1.8.2 */ - public static String find(CharSequence self, CharSequence regex, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { + public static String find(CharSequence self, CharSequence regex, @ClosureParams(value=FromString.class, options={"java.util.List","java.lang.String[]"}) Closure closure) { return find(self, Pattern.compile(regex.toString()), closure); } @@ -1020,7 +1020,7 @@ public static String find(CharSequence self, Pattern pattern) { * @see #find(String, java.util.regex.Pattern, groovy.lang.Closure) * @since 1.8.2 */ - public static String find(CharSequence self, Pattern pattern, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { + public static String find(CharSequence self, Pattern pattern, @ClosureParams(value=FromString.class, options={"java.util.List","java.lang.String[]"}) Closure closure) { Matcher matcher = pattern.matcher(self.toString()); if (matcher.find()) { if (hasGroup(matcher)) { @@ -1051,7 +1051,7 @@ public static String find(String self, Pattern pattern) { * @see #find(CharSequence, java.util.regex.Pattern, groovy.lang.Closure) */ @Deprecated - public static String find(String self, Pattern pattern, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { + public static String find(String self, Pattern pattern, @ClosureParams(value=FromString.class, options={"java.util.List","java.lang.String[]"}) Closure closure) { return find((CharSequence) self, pattern, closure); } @@ -1069,7 +1069,7 @@ public static String find(String self, String regex) { * @see #find(CharSequence, CharSequence, groovy.lang.Closure) */ @Deprecated - public static String find(String self, String regex, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { + public static String find(String self, String regex, @ClosureParams(value=FromString.class, options={"java.util.List","java.lang.String[]"}) Closure closure) { return find((CharSequence) self, (CharSequence) regex, closure); } @@ -1125,7 +1125,7 @@ public static List findAll(CharSequence self, CharSequence regex) { * @see #findAll(CharSequence, Pattern, groovy.lang.Closure) * @since 1.8.2 */ - public static List findAll(CharSequence self, CharSequence regex, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { + public static List findAll(CharSequence self, CharSequence regex, @ClosureParams(value=FromString.class, options={"java.util.List","java.lang.String[]"}) Closure closure) { return findAll(self, Pattern.compile(regex.toString()), closure); } @@ -1191,7 +1191,7 @@ public static List findAll(CharSequence self, Pattern pattern) { * @see #findAll(String, java.util.regex.Pattern, groovy.lang.Closure) * @since 1.8.2 */ - public static List findAll(CharSequence self, Pattern pattern, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { + public static List findAll(CharSequence self, Pattern pattern, @ClosureParams(value=FromString.class, options={"java.util.List","java.lang.String[]"}) Closure closure) { Matcher matcher = pattern.matcher(self.toString()); return DefaultGroovyMethods.collect(matcher, closure); } @@ -1210,7 +1210,7 @@ public static List findAll(String self, Pattern pattern) { * @see #findAll(CharSequence, java.util.regex.Pattern, groovy.lang.Closure) */ @Deprecated - public static List findAll(String self, Pattern pattern, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { + public static List findAll(String self, Pattern pattern, @ClosureParams(value=FromString.class, options={"java.util.List","java.lang.String[]"}) Closure closure) { return findAll((CharSequence) self, pattern, closure); } @@ -1228,7 +1228,7 @@ public static List findAll(String self, String regex) { * @see #findAll(CharSequence, CharSequence, groovy.lang.Closure) */ @Deprecated - public static List findAll(String self, String regex, @ClosureParams(value=FromString.class, options="java.util.List") Closure closure) { + public static List findAll(String self, String regex, @ClosureParams(value=FromString.class, options={"java.util.List","java.lang.String[]"}) Closure closure) { return findAll((CharSequence) self, (CharSequence) regex, closure); } diff --git a/src/test/org/codehaus/groovy/runtime/StringGroovyMethodsTest.java b/src/test/org/codehaus/groovy/runtime/StringGroovyMethodsTest.java index de1806ec970..84073421fdd 100644 --- a/src/test/org/codehaus/groovy/runtime/StringGroovyMethodsTest.java +++ b/src/test/org/codehaus/groovy/runtime/StringGroovyMethodsTest.java @@ -212,9 +212,12 @@ private Closure createClosureForFindOrFindAll(){ @Override public String call(Object arguments) { assertTrue(arguments instanceof List); - Object element = ((List)arguments).get(2); - assertTrue(element instanceof String); - return element.toString(); + return ((List)arguments).get(2).toString(); + } + + @Override + public String call(Object... args) { + return call((Object) args); } }; } From ac212bb14e0e1d460f29438240c6d092b542c7ac Mon Sep 17 00:00:00 2001 From: Henrique Mota Date: Mon, 3 Dec 2018 07:28:04 -0200 Subject: [PATCH 3/3] This closes #834 --- .../transform/stc/ClosureParamTypeInferenceSTCTest.groovy | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy index 0e7f2965d42..39c8bd065ae 100644 --- a/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy +++ b/src/test/groovy/transform/stc/ClosureParamTypeInferenceSTCTest.groovy @@ -428,6 +428,12 @@ import groovy.transform.stc.ClosureParams ''', 'Expected parameter of type java.lang.String but got java.util.Date' } + void testStringGroovyMethodsFindMethodWithList() { + assertScript ''' + "75001 Paris".find(/(\\d{5}\\s(\\w+))/) { List all -> println all*.toUpperCase() } +''' + } + void testInferenceForDGM_countIterableOrIterator() { assertScript ''' assert ['Groovy','Java'].count { it.length() > 4 } == 1