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)