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

Eric Milles commented on GROOVY-9059:
-------------------------------------

Taking another look at this, it appears that 
{{GenericsUtils.addMethodGenerics}} is where the information loss occurs for 
groovyc.

{code:java}
    public static Map<String, ClassNode> addMethodGenerics(MethodNode current, 
Map<String, ClassNode> oldSpec) {
        Map<String, ClassNode> ret = new HashMap<String, ClassNode>(oldSpec);
        // ret starts with the original type specs, now add gts for the current 
method if any
        GenericsType[] sgts = current.getGenericsTypes();
        if (sgts != null) {
            for (GenericsType sgt : sgts) {
                String name = sgt.getName();
                if (sgt.isPlaceholder()) {
                    ClassNode redirect;
                    if (sgt.getUpperBounds() != null) {
                        redirect = sgt.getUpperBounds()[0];
                    } else if (sgt.getLowerBound() != null) {
                        redirect = sgt.getLowerBound();
                    } else {
                        redirect = ClassHelper.OBJECT_TYPE;
                    }
                    ClassNode type = ClassHelper.makeWithoutCaching(name);
                    type.setGenericsPlaceHolder(true); // type is "O" and 
redirect is "T -> Object"
                    type.setRedirect(redirect); // after this, type is "O -> 
Object"; "T" has been lost
                    ret.put(name, type);
                } else {
                    ret.put(name, sgt.getType());
                }
            }
        }
        return ret;
    }
{code}

For the {{correctToGenericsSpec}} calls to work after this, "T" must be 
retained in the redirect of "O".

> Failed to parse/compile generic methods with "extends"
> ------------------------------------------------------
>
>                 Key: GROOVY-9059
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9059
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation
>    Affects Versions: 2.4.16, 3.0.0-alpha-4, 2.5.6
>            Reporter: Xiaoguang Wang
>            Priority: Major
>         Attachments: image-2019-03-30-13-10-20-819.png
>
>
>  
> {code:java}
> import groovy.transform.CompileStatic
> // This bug affects: groovy-2.4.16, groovy-2.5.6, groovy-3.0.0-alpha-4
> // This bug also affect IDEA's syntax parser
> interface X<T> {
>     // Intellij IDEA reports that 'public' is not necessary
>     // BUT without the 'public' modifier, there is a syntax error
>     public <T> T foo(T o);
> }
> interface Y<T> {
>     public <O extends T> O foo(O o);
> }
> @CompileStatic
> class TestGroovyGeneric {
>     static void main(String[] args) {
>         def x = new X<String>() {
>             // it compiles
>             // BUT: Intellij IDEA reports: ERROR: Method 'foo' is not 
> implemented
>             @Override
>             String foo(String o) { return o }
>         }
>         // Strangely, such code compiles
>         // BUT: Intellij IDEA reports: ERROR: Method 'foo' is not implemented
>         def y1 = new Y<String>() {
>             @Override
>             public <String> String foo(String o) { return o }
>         }
>         // Can not compile:
>         // BUT: Intellij IDEA reports no error ....
>         def y2 = new Y<String>() {
>             @Override
>             String foo(String o) { return o }
>         }
>     }
> }
> {code}
> !image-2019-03-30-13-10-20-819.png!
>  



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Reply via email to