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)