Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Minor
-
Resolution: Fixed
-
Affects Version/s: 1.5.7
-
Fix Version/s: 1.6-rc-2, 1.5.8, 1.7-beta-1
-
Component/s: Compiler
-
Labels:None
-
Environment:Windows, XP, JRE 1.6.0
-
Number of attachments :
Description
Trying to use "import static Foo.*" for more than one enum throws on use even though the names don't collide. It's behaving like "with".
enum Foo { A,B }
enum Bar { X,Y }
import static Foo.*
import static Bar.*
a = A
x = X
throws:
java.lang.ExceptionInInitializerError at Script146.class$(Script146) at Script146.run(Script146:9) Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'X' with class 'Foo' to class 'Bar' at Bar.<clinit>(Script146) ... 2 more
Since enums don't have constructors that can be called from outside, enum classes expose method $INIT as a constructor helper via which enum constructors are called and enum values are created.
And then StaticImportVisitor has this logic to find imported static methods by name and argument types.
Since all enum classes have these standard static methods like $INIT()/values() when enum values in the 2nd enum Bar are being created using static call $INIT(
{X, 0}), StaticImportVisitor, starts searching for $INIT in all static imports and finds it in the first static import Foo itself (as $INIT is a standard method) and because of that enum value for Bar gets typecasted to Foo mistakenly and throws this type-casting error that has been reported.
Made the changes in StaticImportVisitor to invoke $INIT of the correct static-imported enum in such a case.
Fixed it on branches 1.5.x, 1.6.x and trunk.