Jonny Carter created GROOVY-11719:
-------------------------------------

             Summary: Generics Compilation Bug
                 Key: GROOVY-11719
                 URL: https://issues.apache.org/jira/browse/GROOVY-11719
             Project: Groovy
          Issue Type: Bug
          Components: Compiler
    Affects Versions: 4.0.28
            Reporter: Jonny Carter


In some cases when compiling scripts dealing with generic classes, the 
{{ResolveVisitor}} can throw an {{UnsupportedOperationException}} by trying to 
put entries in an immutable empty map.

This is the same issue I raised on the [release thread for 
4.0.28|https://lists.apache.org/thread/3srdsx4q3ktmxq5rb3t6jhon7qdfvcwb].

Raised a PR with an automated test to reproduce the issue at 
[https://github.com/apache/groovy/pull/2270], along with a suggested fix. The 
test to reproduce the error looks like this:
{code:java}
    @Test
    void testRecompilingWithGenericsAndConstants() {
        MapFileSystem.instance.modFile('BaseClass.groovy', 'class BaseClass<T> 
{}', gse.@time)

        def tertiaryClassText = '''
            class NotGeneric {
                /**
                 * Not typed on purpose - if typed as String then NotGeneric is 
no longer a dependency of
                 * ParameterisedClass for some reason...
                 */
                public static final Object CONSTANT = "not generic"
            }
        '''
        MapFileSystem.instance.modFile('NotGeneric.groovy', tertiaryClassText, 
gse.@time)

        def subClassText = '''
            class SubClass extends BaseClass<String> {
                public static final String CONSTANT = NotGeneric.CONSTANT
            }
        '''
        MapFileSystem.instance.modFile('SubClass.groovy', subClassText, 
gse.@time)

        MapFileSystem.instance.modFile('scriptUsingGeneric.groovy', 
'SubClass.CONSTANT', gse.@time)


        gse.loadScriptByName('scriptUsingGeneric.groovy')
        sleep 1000

        // make a change to the sub-class so that it gets recompiled
        MapFileSystem.instance.modFile('SubClass.groovy', subClassText + '\n', 
gse.@time)
        gse.loadScriptByName('scriptUsingGeneric.groovy')
    }
{code}
The root cause error is:
{code:java}
Caused by: java.lang.UnsupportedOperationException at 
java.base/java.util.AbstractMap.put(AbstractMap.java:209) at 
org.codehaus.groovy.control.ResolveVisitor.resolveGenericsHeader(ResolveVisitor.java:1452)
 at 
org.codehaus.groovy.control.ResolveVisitor.resolveGenericsHeader(ResolveVisitor.java:1409)
 {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to