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/b739c2a9
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/b739c2a9
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/b739c2a9

Branch: refs/heads/master
Commit: b739c2a9b5f7660101858fb50039b5f4ed66dfa2
Parents: 8ee9cbc
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:51:34 2016 +1000

----------------------------------------------------------------------
 .../groovy/transform/trait/TraitComposer.java   | 26 +++++++++++++-------
 1 file changed, 17 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/b739c2a9/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..d49837b 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;
 import static org.codehaus.groovy.ast.tools.GenericsUtils.newClass;
@@ -142,7 +151,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);
                 }
@@ -282,12 +291,9 @@ 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
@@ -315,14 +321,16 @@ 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);
                 GenericsType[] newGt = 
GenericsUtils.applyGenericsContextToPlaceHolders(methodSpec, 
helperMethod.getGenericsTypes());
                 forwarder.setGenericsTypes(newGt);
             }

Reply via email to