You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/03/26 16:59:55 UTC
[groovy] branch GROOVY_3_0_X updated: GROOVY-10552: `@AutoImplement`: set type parameters
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
The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
new 4e5b0b7 GROOVY-10552: `@AutoImplement`: set type parameters
4e5b0b7 is described below
commit 4e5b0b7b22891a3a7852909e1a740a2734b0fceb
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Mar 26 11:15:47 2022 -0500
GROOVY-10552: `@AutoImplement`: set type parameters
---
.../codehaus/groovy/ast/tools/GenericsUtils.java | 16 ++++++++-------
.../transform/AutoImplementASTTransformation.java | 3 ++-
.../transform/AutoImplementTransformTest.groovy | 24 ++++++++++++++++++++++
3 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
index 84d328d..3142345 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
@@ -329,14 +329,16 @@ public class GenericsUtils {
public static MethodNode correctToGenericsSpec(Map<String, ClassNode> genericsSpec, MethodNode mn) {
if (genericsSpec == null) return mn;
if (mn.getGenericsTypes() != null) genericsSpec = addMethodGenerics(mn, genericsSpec);
- ClassNode correctedType = correctToGenericsSpecRecurse(genericsSpec, mn.getReturnType());
- Parameter[] origParameters = mn.getParameters();
- Parameter[] newParameters = new Parameter[origParameters.length];
- for (int i = 0; i < origParameters.length; i++) {
- Parameter origParameter = origParameters[i];
- newParameters[i] = new Parameter(correctToGenericsSpecRecurse(genericsSpec, origParameter.getType()), origParameter.getName(), origParameter.getInitialExpression());
+ ClassNode returnType = correctToGenericsSpecRecurse(genericsSpec, mn.getReturnType());
+ Parameter[] oldParameters = mn.getParameters(); int nParameters= oldParameters.length;
+ Parameter[] newParameters = new Parameter[nParameters];
+ for (int i = 0; i < nParameters; i += 1) {
+ Parameter oldParameter = oldParameters[i];
+ newParameters[i] = new Parameter(correctToGenericsSpecRecurse(genericsSpec, oldParameter.getType()), oldParameter.getName(), oldParameter.getInitialExpression());
}
- return new MethodNode(mn.getName(), mn.getModifiers(), correctedType, newParameters, mn.getExceptions(), mn.getCode());
+ MethodNode newMethod = new MethodNode(mn.getName(), mn.getModifiers(), returnType, newParameters, mn.getExceptions(), mn.getCode());
+ newMethod.setGenericsTypes(mn.getGenericsTypes());
+ return newMethod;
}
public static ClassNode correctToGenericsSpecRecurse(Map<String, ClassNode> genericsSpec, ClassNode type) {
diff --git a/src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
index d96c620..b81bbdd 100644
--- a/src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/AutoImplementASTTransformation.java
@@ -103,7 +103,7 @@ public class AutoImplementASTTransformation extends AbstractASTTransformation {
private void createMethods(final ClassNode cNode, final ClassNode exception, final String message, final ClosureExpression code) {
for (MethodNode candidate : getAllCorrectedMethodsMap(cNode).values()) {
if (candidate.isAbstract()) {
- addGeneratedMethod(cNode,
+ MethodNode mNode = addGeneratedMethod(cNode,
candidate.getName(),
candidate.getModifiers() & 0x7, // visibility only
candidate.getReturnType(),
@@ -111,6 +111,7 @@ public class AutoImplementASTTransformation extends AbstractASTTransformation {
candidate.getExceptions(),
createMethodBody(cNode, candidate, exception, message, code)
);
+ mNode.setGenericsTypes(candidate.getGenericsTypes()); // GROOVY-10552
}
}
}
diff --git a/src/test/org/codehaus/groovy/transform/AutoImplementTransformTest.groovy b/src/test/org/codehaus/groovy/transform/AutoImplementTransformTest.groovy
index 05b108f..3d64556 100644
--- a/src/test/org/codehaus/groovy/transform/AutoImplementTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/AutoImplementTransformTest.groovy
@@ -308,4 +308,28 @@ final class AutoImplementTransformTest {
assert !(new ThisClassFails().findAll())
'''
}
+
+ @Test // GROOVY-10552
+ void testMethodWithTypeParameter() {
+ assertScript '''
+ interface I {
+ def <T> T m(List<T> list)
+ }
+
+ @groovy.transform.AutoImplement
+ class C implements I {
+ }
+
+ Object result = new C().m([])
+ assert result == null
+ '''
+
+ assertScript '''
+ @groovy.transform.AutoImplement
+ class C implements java.sql.Connection {
+ }
+
+ new C().commit()
+ '''
+ }
}