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

Eric Milles edited comment on GROOVY-8572 at 9/10/19 9:24 PM:
--------------------------------------------------------------

Still a problem in 2.4.17.  StaticTypeCheckingVisitor is going into this block 
to generate the error:
{code:java}
    protected void inferDiamondType(final ConstructorCallExpression cce, final 
ClassNode lType) {
        // check if constructor call expression makes use of the diamond 
operator
        ClassNode node = cce.getType();
        if (node.isUsingGenerics() && node instanceof InnerClassNode && 
((InnerClassNode) node).isAnonymous()) {
            ClassNode[] interfaces = node.getInterfaces();
            node = interfaces != null && interfaces.length == 1 ? interfaces[0] 
: node.getUnresolvedSuperClass(false);
            if ((node.getGenericsTypes() == null || 
node.getGenericsTypes().length == 0) && lType.isUsingGenerics()) {
                // InterfaceA<Foo> obj = new InterfaceA<>() { ... }
                // InterfaceA<Foo> obj = new ClassA<>() { ... }
                // ClassA<Foo> obj = new ClassA<>() { ... }
                addStaticTypeError("Cannot use diamond <> with anonymous inner 
classes", cce);
            }
        }
{code}

It goes there because ResolveVisitor is setting usingGenerics to true in 
resolveGenericsTypes and supporting methods.  I'm not sure why ResolveVisitor 
is setting this flag for the anon. inner when the type being resolved is 
{{Map<String,Object>}} or {{List<String>}}, which are types used within the 
anon. inner class body.

https://github.com/apache/groovy/commit/01c5b0acea4768edffd1b2609c651bfeb5121889


was (Author: emilles):
Still a problem in 2.4.17.  StaticTypeCheckingVisitor is going into this block 
to generate the error:
{code:java}
    protected void inferDiamondType(final ConstructorCallExpression cce, final 
ClassNode lType) {
        // check if constructor call expression makes use of the diamond 
operator
        ClassNode node = cce.getType();
        if (node.isUsingGenerics() && node instanceof InnerClassNode && 
((InnerClassNode) node).isAnonymous()) {
            ClassNode[] interfaces = node.getInterfaces();
            node = interfaces != null && interfaces.length == 1 ? interfaces[0] 
: node.getUnresolvedSuperClass(false);
            if ((node.getGenericsTypes() == null || 
node.getGenericsTypes().length == 0) && lType.isUsingGenerics()) {
                // InterfaceA<Foo> obj = new InterfaceA<>() { ... }
                // InterfaceA<Foo> obj = new ClassA<>() { ... }
                // ClassA<Foo> obj = new ClassA<>() { ... }
                addStaticTypeError("Cannot use diamond <> with anonymous inner 
classes", cce);
            }
        }
{code}

It goes there because ResolveVisitor is setting usingGenerics to true in 
resolveGenericsTypes and supporting methods.  I'm not sure why ResolveVisitor 
is setting this flag for the anon. inner when the type being resolved is 
{{Map<String,Object>}} or {{List<String>}}, which are types used within the 
anon. inner class body.

> Groovy 2.4.12 Static compiler fails on nonsense type inference error
> --------------------------------------------------------------------
>
>                 Key: GROOVY-8572
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8572
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static Type Checker
>    Affects Versions: 2.4.12
>            Reporter: Martin Skurla
>            Priority: Major
>
> I am using Gradle which internally currently uses Groovy 2.4.12.
> I am getting the following error:
> {code:java}
> martin@martin-desktop:~/devel/apollo/buildteam/gradle_plugins(master)$ 
> ./gradlew clean test
> > Task :compileGroovy
> startup failed:
> /home/martin/devel/apollo/buildteam/gradle_plugins/src/main/groovy/apollosoft/build/support/gradle/assets/ApolloAssetsDSLExtension.groovy:
>  54: [Static type checking] - Cannot use diamond <> with anonymous inner 
> classes
>  @ line 54, column 28.
>            closure.delegate = new Object() {
>                               ^
> 1 error
> {code}
> It looks like it is wrong, I am not specifying any diamond operator anywhere.



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to