[ 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)