You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2016/05/31 04:35:51 UTC

[1/3] groovy git commit: Make sure generics are correct for generified return types. Fixes https://issues.apache.org/jira/browse/GROOVY-7846

Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_4_X fccc0f136 -> 3a5189e8d


Make sure generics are correct for generified return types. Fixes https://issues.apache.org/jira/browse/GROOVY-7846


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/0fcaf69a
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/0fcaf69a
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/0fcaf69a

Branch: refs/heads/GROOVY_2_4_X
Commit: 0fcaf69ae4b152d3ca030eca6f8e76ddf9a1ca0f
Parents: fccc0f1
Author: graemerocher <gr...@gmail.com>
Authored: Fri May 27 11:26:20 2016 +0200
Committer: paulk <pa...@asert.com.au>
Committed: Tue May 31 14:21:09 2016 +1000

----------------------------------------------------------------------
 .../groovy/transform/trait/TraitComposer.java   | 21 ++++----
 .../transform/traitx/Groovy7846Bug.groovy       | 54 ++++++++++++++++++++
 2 files changed, 66 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/0fcaf69a/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java b/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
index 76e47b6..6804aae 100644
--- a/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
+++ b/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
@@ -59,17 +59,10 @@ import org.codehaus.groovy.transform.sc.StaticCompileTransformation;
 import org.objectweb.asm.Opcodes;
 
 import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import static org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse;
+import static org.codehaus.groovy.ast.tools.GenericsUtils.newClass;
 
 /**
  * This class contains a static utility method {@link #doExtendTraits(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.control.CompilationUnit)}
@@ -289,9 +282,12 @@ public abstract class TraitComposer {
         mce.setImplicitThis(false);
 
         genericsSpec = GenericsUtils.addMethodGenerics(helperMethod,genericsSpec);
+        Map<String,ClassNode> methodSpec = new HashMap<String, ClassNode>();
+        methodSpec = GenericsUtils.addMethodGenerics(helperMethod,methodSpec);
 
         ClassNode[] exceptionNodes = correctToGenericsSpecRecurse(genericsSpec, copyExceptions(helperMethod.getExceptions()));
         ClassNode fixedReturnType = correctToGenericsSpecRecurse(genericsSpec, helperMethod.getReturnType());
+
         Expression forwardExpression = genericsSpec.isEmpty()?mce:new CastExpression(fixedReturnType,mce);
         int access = helperMethod.getModifiers();
         // we could rely on the first parameter name ($static$self) but that information is not
@@ -324,6 +320,13 @@ public abstract class TraitComposer {
             newGt = removeNonPlaceHolders(newGt);
             forwarder.setGenericsTypes(newGt);
         }
+        else {
+            GenericsType[] genericsTypes = helperMethod.getGenericsTypes();
+            if(genericsTypes != null) {
+                GenericsType[] newGt = GenericsUtils.applyGenericsContextToPlaceHolders(methodSpec, helperMethod.getGenericsTypes());
+                forwarder.setGenericsTypes(newGt);
+            }
+        }
         // add a helper annotation indicating that it is a bridge method
         AnnotationNode bridgeAnnotation = new AnnotationNode(Traits.TRAITBRIDGE_CLASSNODE);
         bridgeAnnotation.addMember("traitClass", new ClassExpression(trait));

http://git-wip-us.apache.org/repos/asf/groovy/blob/0fcaf69a/src/test/org/codehaus/groovy/transform/traitx/Groovy7846Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/transform/traitx/Groovy7846Bug.groovy b/src/test/org/codehaus/groovy/transform/traitx/Groovy7846Bug.groovy
new file mode 100644
index 0000000..5512235
--- /dev/null
+++ b/src/test/org/codehaus/groovy/transform/traitx/Groovy7846Bug.groovy
@@ -0,0 +1,54 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.transform.traitx
+
+import org.codehaus.groovy.ast.ClassNode
+
+class Groovy7846Bug extends GroovyTestCase {
+
+    void testTraitsShouldAllowGenerifiedReturnTypesInStaticMethods() {
+        def cl = new GroovyClassLoader()
+        cl.parseClass('''
+
+class Foo {
+    static <T> T withClient(@DelegatesTo(Foo) Closure<T> callable ) {
+        callable.call()
+    }
+}
+trait TraitWithStaticMethod<D>  {
+
+    static Collection<D> asCollection(D type) {
+        return [type]
+    }
+
+    static <T> T withClient(@DelegatesTo(Foo) Closure<T> callable ) {
+        callable.call()
+    }
+}
+''')
+        Class cls = cl.parseClass('''
+class Bar implements TraitWithStaticMethod<Bar> {}
+
+''')
+
+        assert new ClassNode(cls).methods
+        assert cls.withClient { true }
+    }
+}
+


[2/3] groovy git commit: Cleanup

Posted by pa...@apache.org.
Cleanup


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/8ab58a5e
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/8ab58a5e
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/8ab58a5e

Branch: refs/heads/GROOVY_2_4_X
Commit: 8ab58a5e516316b6a205baa95a4d99452e6eec65
Parents: 0fcaf69
Author: graemerocher <gr...@gmail.com>
Authored: Fri May 27 11:36:20 2016 +0200
Committer: paulk <pa...@asert.com.au>
Committed: Tue May 31 14:21:11 2016 +1000

----------------------------------------------------------------------
 .../org/codehaus/groovy/transform/trait/TraitComposer.java     | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/8ab58a5e/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java b/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
index 6804aae..afcc0fd 100644
--- a/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
+++ b/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
@@ -62,7 +62,6 @@ import java.lang.reflect.Modifier;
 import java.util.*;
 
 import static org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse;
-import static org.codehaus.groovy.ast.tools.GenericsUtils.newClass;
 
 /**
  * This class contains a static utility method {@link #doExtendTraits(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.control.CompilationUnit)}
@@ -282,8 +281,6 @@ public abstract class TraitComposer {
         mce.setImplicitThis(false);
 
         genericsSpec = GenericsUtils.addMethodGenerics(helperMethod,genericsSpec);
-        Map<String,ClassNode> methodSpec = new HashMap<String, ClassNode>();
-        methodSpec = GenericsUtils.addMethodGenerics(helperMethod,methodSpec);
 
         ClassNode[] exceptionNodes = correctToGenericsSpecRecurse(genericsSpec, copyExceptions(helperMethod.getExceptions()));
         ClassNode fixedReturnType = correctToGenericsSpecRecurse(genericsSpec, helperMethod.getReturnType());
@@ -323,6 +320,9 @@ public abstract class TraitComposer {
         else {
             GenericsType[] genericsTypes = helperMethod.getGenericsTypes();
             if(genericsTypes != null) {
+                Map<String,ClassNode> methodSpec = new HashMap<String, ClassNode>();
+                methodSpec = GenericsUtils.addMethodGenerics(helperMethod,methodSpec);
+
                 GenericsType[] newGt = GenericsUtils.applyGenericsContextToPlaceHolders(methodSpec, helperMethod.getGenericsTypes());
                 forwarder.setGenericsTypes(newGt);
             }


[3/3] groovy git commit: GROOVY-7846: A trait that defines a static method that uses generic return types throws "BUG! Type is null" (comments/trivial formatting - closes #340)

Posted by pa...@apache.org.
GROOVY-7846: A trait that defines a static method that uses generic return types throws "BUG! Type is null" (comments/trivial formatting - closes #340)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/3a5189e8
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/3a5189e8
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/3a5189e8

Branch: refs/heads/GROOVY_2_4_X
Commit: 3a5189e8d2cfd66034c1430b511b43e69909daa8
Parents: 8ab58a5
Author: paulk <pa...@asert.com.au>
Authored: Tue May 31 14:34:47 2016 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Tue May 31 14:34:47 2016 +1000

----------------------------------------------------------------------
 .../groovy/transform/trait/TraitComposer.java   | 22 +++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/3a5189e8/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java b/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
index afcc0fd..b65855c 100644
--- a/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
+++ b/src/main/org/codehaus/groovy/transform/trait/TraitComposer.java
@@ -59,7 +59,16 @@ import org.codehaus.groovy.transform.sc.StaticCompileTransformation;
 import org.objectweb.asm.Opcodes;
 
 import java.lang.reflect.Modifier;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 import static org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse;
 
@@ -141,7 +150,7 @@ public abstract class TraitComposer {
                 System.arraycopy(methodNode.getParameters(), 1, params, 0, params.length);
                 Map<String,ClassNode> methodGenericsSpec = new LinkedHashMap<String, ClassNode>(genericsSpec);
                 MethodNode originalMethod = trait.getMethod(name, params);
-                // Original method may be null in case of a private method
+                // Original method may be null for the case of private or static methods
                 if (originalMethod!=null) {
                     methodGenericsSpec = GenericsUtils.addMethodGenerics(originalMethod, methodGenericsSpec);
                 }
@@ -284,7 +293,6 @@ public abstract class TraitComposer {
 
         ClassNode[] exceptionNodes = correctToGenericsSpecRecurse(genericsSpec, copyExceptions(helperMethod.getExceptions()));
         ClassNode fixedReturnType = correctToGenericsSpecRecurse(genericsSpec, helperMethod.getReturnType());
-
         Expression forwardExpression = genericsSpec.isEmpty()?mce:new CastExpression(fixedReturnType,mce);
         int access = helperMethod.getModifiers();
         // we could rely on the first parameter name ($static$self) but that information is not
@@ -312,14 +320,14 @@ public abstract class TraitComposer {
         if (!copied.isEmpty()) {
             forwarder.addAnnotations(copied);
         }
-        if (originalMethod!=null) {
+        if (originalMethod != null) {
             GenericsType[] newGt = GenericsUtils.applyGenericsContextToPlaceHolders(genericsSpec, originalMethod.getGenericsTypes());
             newGt = removeNonPlaceHolders(newGt);
             forwarder.setGenericsTypes(newGt);
-        }
-        else {
+        } else {
+            // null indicates a static method which may still need generics correction
             GenericsType[] genericsTypes = helperMethod.getGenericsTypes();
-            if(genericsTypes != null) {
+            if (genericsTypes != null) {
                 Map<String,ClassNode> methodSpec = new HashMap<String, ClassNode>();
                 methodSpec = GenericsUtils.addMethodGenerics(helperMethod,methodSpec);