[
https://issues.apache.org/jira/browse/GROOVY-8863?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Daniel Sun updated GROOVY-8863:
-------------------------------
Fix Version/s: 4.0.4
> Groovy compiler doesn't generate InnerClasses attribute for nested class
> names mentioned in the class file
> ----------------------------------------------------------------------------------------------------------
>
> Key: GROOVY-8863
> URL: https://issues.apache.org/jira/browse/GROOVY-8863
> Project: Groovy
> Issue Type: Bug
> Components: Compiler
> Affects Versions: 2.5.3
> Reporter: Alexander Udalov
> Assignee: Eric Milles
> Priority: Major
> Fix For: 5.0.0-alpha-1, 4.0.4
>
>
> It seems that the Groovy compiler does not generate correct InnerClasses
> attributes when Groovy code uses inner classes, even if those are Java
> classes compiled separately.
> For example, the following code:
> {{class Test {}}
> {{ void f(Thread.State t) {}}}
> {{}}}
> (where java.lang.Thread.State is just an example nested class from JDK) will
> compile by Groovy to a class file Test.class which has no InnerClasses
> attribute. If compiled by Java though, it has the following:
> {{InnerClasses:}}
> {{ public static final #10= #9 of #18; //State=class
> java/lang/Thread$State of class java/lang/Thread}}
> While I couldn't find a statement requiring this attribute to be present for
> all nested classes mentioned in the class file in the JVMS, I believe
> [§4.7.6|https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html#jvms-4.7.6]
> sort of hints at that with the following:
> {quote}If the constant pool of a class or interface C contains at least one
> {{CONSTANT_Class_info}} entry
> ([§4.4.1|https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html#jvms-4.4.1])
> which represents a class or interface that is not a member of a package,
> then there must be exactly one {{InnerClasses}} attribute in the
> {{attributes}} table of the {{ClassFile}} structure for C.
> {quote}
> In this case, there's certainly a CONSTANT_Class_info entry in the
> Groovy-generated class file which represents a non-top-level class, but the
> InnerClasses attribute is missing, so I'd say this violates the spec.
> We've met this issue when refactoring the internal implementation of class
> file reader in the Kotlin compiler, where we [got
> rid|https://github.com/JetBrains/kotlin/commit/9df02b236620e413ef70cea0d1d8ed93cd0b474e]
> of the heuristic that calculated the full class name by replacing dollar
> characters with dots, and started to rely only on the InnerClasses attribute
> to correctly map JVM names to the "real" names of classes. This looked
> correct because at least class files generated by javac always have
> InnerClasses for all nested classes mentioned in the class file (not only in
> signatures, even those used only in method bodies!). However, for Groovy this
> [turned out|https://youtrack.jetbrains.com/issue/KT-27874] not to be the
> case. We'll probably workaround this problem somehow, for example by
> attempting to determine the class name twice, first by InnerClasses attribute
> values and second, by the aforementioned heuristic, but it'll be nice to get
> rid of the latter code in the future once this issue is fixed.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)