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

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

The code that satisfies property expressions with extension methods does not 
check the compatibility of the receiver type:
{code:java}
            // GROOVY-5568: the property may be defined by DGM
            List<ClassNode> dgmReceivers = new ArrayList<>(2);
            dgmReceivers.add(receiverType);
            if (isPrimitiveType(receiverType))
                dgmReceivers.add(getWrapper(receiverType));
            for (ClassNode dgmReceiver : dgmReceivers) {
                List<MethodNode> methods = 
findDGMMethodsByNameAndArguments(getSourceUnit().getClassLoader(), dgmReceiver, 
"get" + capName, ClassNode.EMPTY_ARRAY);
                for (MethodNode method : 
findDGMMethodsByNameAndArguments(getSourceUnit().getClassLoader(), dgmReceiver, 
"is" + capName, ClassNode.EMPTY_ARRAY)) {
                    if 
(Boolean_TYPE.equals(getWrapper(method.getReturnType()))) methods.add(method);
                }
                if (!methods.isEmpty()) {
                    List<MethodNode> bestMethods = 
chooseBestMethod(dgmReceiver, methods, ClassNode.EMPTY_ARRAY);
                    if (bestMethods.size() == 1) {
                        MethodNode getter = bestMethods.get(0);
                        if (visitor != null) {
                            visitor.visitMethod(getter);
                        }
                        ClassNode returnType = 
inferReturnTypeGenerics(dgmReceiver, getter, 
ArgumentListExpression.EMPTY_ARGUMENTS);
                        storeInferredTypeForPropertyExpression(pexp, 
returnType);
                        if (readMode) storeTargetMethod(pexp, getter);
                        return true;
                    }
                }
            }
{code}

> 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
>         Attachments: screenshot-1.png
>
>
> 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