[ 
https://issues.apache.org/jira/browse/GROOVY-8832?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16640727#comment-16640727
 ] 

Eric Milles commented on GROOVY-8832:
-------------------------------------

I can test for the unresolved type parameter in {{GenericsUtils}} like this:
{code:java}
    public static GenericsType[] applyGenericsContextToPlaceHolders(Map<String, 
ClassNode> genericsSpec, GenericsType[] oldPlaceHolders) {
        if (oldPlaceHolders==null || oldPlaceHolders.length==0) return 
oldPlaceHolders;
        if (genericsSpec.isEmpty()) return oldPlaceHolders;
        GenericsType[] newTypes = new GenericsType[oldPlaceHolders.length];
        for (int i=0; i<oldPlaceHolders.length; i++) {
            GenericsType old = oldPlaceHolders[i];
            if (!old.isPlaceholder()) throw new GroovyBugError("Given generics 
type "+old+" must be a placeholder!");
            ClassNode fromSpec = genericsSpec.get(old.getName());
            if (fromSpec!=null) {
                /* GRECLIPSE edit
                if (fromSpec.isGenericsPlaceHolder()) {
                    ClassNode[] upper = new ClassNode[]{fromSpec.redirect()};
                    newTypes[i] = new GenericsType(fromSpec, upper, null);
                } else {
                    newTypes[i] = new GenericsType(fromSpec);
                }
                */
                Map<String, ?> placeholders = extractPlaceholders(fromSpec);
                genericsSpec.keySet().forEach(placeholders::remove);
                if (!placeholders.isEmpty()) {
                    System.err.println("Unresolved type params: " + 
placeholders);
                }
                newTypes[i] = fromSpec.asGenericsType();
                // GRECLIPSE end
{code}

> Type parameters for trait method and its bridge method
> ------------------------------------------------------
>
>                 Key: GROOVY-8832
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8832
>             Project: Groovy
>          Issue Type: Question
>          Components: Compiler
>    Affects Versions: 2.4.15, 2.5.3
>            Reporter: Eric Milles
>            Priority: Major
>         Attachments: Events.zip
>
>
> This is related to GROOVY-8815.  When compiling a class that implements the 
> trait {{grails.events.Events}} I am seeing different results for the type 
> parameters.  I'm not sure what the correct generics signatures should be.  
> *What are the correct generics for this scenario?*
> {code:groovy}
> import grails.events.Events
> class Service implements Events {}
> {code}
> And the relevant excerpt from Events:
> {code:groovy}
> def <E extends Event<?>> Bus notify(Object key, Closure<E> supplier)
> {code}
> When {{Service}} is compiled with Gradle, the following methods are created 
> in the class file.  The synthetic method generics look okay, but the bridge 
> method generics have {{E}} as {{java.lang.Object}}.
> {code}
>   // Method descriptor #96 
> (Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;
>   // Signature: 
> <E:Lreactor/bus/Event<+Ljava/lang/Object;>;>(Ljava/lang/Object;Lgroovy/lang/Closure<TE;>;)Lreactor/bus/Bus;
>   // Stack: 8, Locals: 4
>   public synthetic reactor.bus.Bus 
> grails_events_Eventstrait$super$notify(java.lang.Object param0, 
> groovy.lang.Closure param1);
>   // Method descriptor #96 
> (Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;
>   // Signature: 
> <E:Ljava/lang/Object;>(Ljava/lang/Object;Lgroovy/lang/Closure<TE;>;)Lreactor/bus/Bus;
>   // Stack: 5, Locals: 4
>   
> @org.codehaus.groovy.transform.trait.Traits.TraitBridge(traitClass=grails.events.Events,
>     desc="(Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;")
>   public reactor.bus.Bus notify(java.lang.Object arg1, groovy.lang.Closure 
> arg2);
> {code}
> By contrast, when {{Service}} is compiled with Groovy-Eclipse, the following 
> methods are created in the class file.  Again the synthetic method looks okay 
> -- in fact, more accurate to the original.  However the generics for the 
> bridge method contain the unresolved type parameter {{T}}.  This is the 
> actual bug I'm chasing, but I can't say what the right generics should be and 
> why Gradle/Groovyc and Groovy-Eclipse have different answers for both methods.
> {code}
>   // Method descriptor #150 
> (Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;
>   // Signature: 
> <E:Lreactor/bus/Event<*>;>(Ljava/lang/Object;Lgroovy/lang/Closure<TE;>;)Lreactor/bus/Bus;
>   // Stack: 8, Locals: 4
>   public synthetic reactor.bus.Bus 
> grails_events_Eventstrait$super$notify(java.lang.Object arg0, 
> groovy.lang.Closure arg1);
>   // Method descriptor #150 
> (Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;
>   // Signature: 
> <E:Lreactor/bus/Event<TT;>;>(Ljava/lang/Object;Lgroovy/lang/Closure<TE;>;)Lreactor/bus/Bus;
>   // Stack: 5, Locals: 4
>   
> @org.codehaus.groovy.transform.trait.Traits.TraitBridge(traitClass=grails.events.Events,
>     desc="(Ljava/lang/Object;Lgroovy/lang/Closure;)Lreactor/bus/Bus;")
>   public reactor.bus.Bus notify(java.lang.Object arg1, groovy.lang.Closure 
> arg2);
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to