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

Eric Milles commented on GROOVY-10075:
--------------------------------------

Okay, because the method does not declare its own generic types, the lower path 
is used here:
{code:java}
    protected static boolean typeCheckMethodsWithGenerics(final ClassNode 
receiver, final ClassNode[] argumentTypes, final MethodNode candidateMethod) {
        boolean isExtensionMethod = candidateMethod instanceof 
ExtensionMethodNode;
        if (!isExtensionMethod
                && receiver.isUsingGenerics()
                && receiver.equals(CLASS_Type)
                && !candidateMethod.getDeclaringClass().equals(CLASS_Type)) {
            return 
typeCheckMethodsWithGenerics(receiver.getGenericsTypes()[0].getType(), 
argumentTypes, candidateMethod);
        }
        // both candidate method and receiver have generic information so a 
check is possible
        GenericsType[] genericsTypes = candidateMethod.getGenericsTypes();
        boolean methodUsesGenerics = (genericsTypes != null && 
genericsTypes.length > 0);
        if (isExtensionMethod && methodUsesGenerics) {
            ClassNode[] dgmArgs = new ClassNode[argumentTypes.length + 1];
            dgmArgs[0] = receiver;
            System.arraycopy(argumentTypes, 0, dgmArgs, 1, 
argumentTypes.length);
            MethodNode extensionMethodNode = ((ExtensionMethodNode) 
candidateMethod).getExtensionMethodNode();
            return 
typeCheckMethodsWithGenerics(extensionMethodNode.getDeclaringClass(), dgmArgs, 
extensionMethodNode, true);
        } else {
            return typeCheckMethodsWithGenerics(receiver, argumentTypes, 
candidateMethod, false);
        }
    }
{code}

And that means the receiver type is not properly checked against the "self" 
parameter type.

> Static compiler incorrectly typechecks extension modules
> --------------------------------------------------------
>
>                 Key: GROOVY-10075
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10075
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation
>    Affects Versions: 2.4.15, 3.0.8
>         Environment: macOS 10.15.7
> OpenJDK Zulu 11.0.3
> Groovy 3.0.8
> Gradle 6.8
>            Reporter: Felix Scheinost
>            Assignee: Eric Milles
>            Priority: Major
>
> I think I found a bug in static typechecking of extension modules.
> I tested two variants:
>  # Fixed generic: _static void getTestString(List<String> self)_
>  ## In this case the bug affects both method calls and property access e.g. 
> _integerList.getTestString()_ and _integerList__.testString_ both compile
>  # With generic constraint: _static <S extends String> void 
> getTestStringOrSubclass(List<S> self)_ 
>  ## In this case the bug only affects property access e.g. 
> _integerList.__getTestStringOrSubclass__()_ doesn't compile but 
> _integerList.testStringOrSubclass_ compiles
> I prepared an example project here: 
> [https://github.com/felixscheinost/test-groovy-static-extensions]
> Please have a look at 
> [https://github.com/felixscheinost/test-groovy-static-extensions/blob/master/src/main/groovy/org/example/App.groovy]
>  
> Thanks!



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to