[ https://issues.apache.org/jira/browse/GROOVY-9270?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Tommy Svensson updated GROOVY-9270: ----------------------------------- Description: There is also something very wrong with JIRA! I completely redid this description yesterday to make things very much clearer. I saved several times, and now this original is back! So once you write an issue, it cannot be updated even tough you can edit the text and press save and have the new text shown, but then being back to the original the next day. So I guess I have to close this, and create a new issue, assuming that Jira allows more than one issue from the same person ... ---- Using "instanceof boolean" or using a Trait will cause the compiled code to not work with OSGi/maven-bundle-plugin/bnd. Edited text: I made 2 test classes one Ok and one that bnd says has code in default package: OK: {{public void test(Object o) {}} {{ CallSite[] var2 = $getCallSiteArray();}} {{ if (o instanceof Boolean){ }} {{ var2[0].callCurrent(this, "boolean");}} } } Fail: public void test(Object o) { {{ CallSite[] var2 = $getCallSiteArray();}} {{ if (o instanceof boolean) {}} {{ var2[0].callCurrent(this, "boolean");}} } {{}}} The rest of the class is identical. These comes from decompiled .class files and thus are Java, but they were compile from groovy classes. Now the question is, where do java handle autoboxing ? If it is the compiler then this would explain the result. The "boolean" is a primitive and have no package. If the compiler is responsible for handling this, the problem lies with Groovy which has clearly not boxed the "boolean" in a "Boolean". If its the JDK that handles autoboxing runtime then both cases should behave the same, which they are not. Bnd ([https://bnd.bndtools.org)|https://bnd.bndtools.org)/] tries to import from "." in the "Fail" case and reports: "The default package '.' is not permitted by the Import-Package syntax." I took these 2 test groovy files and moved them to a Java maven module, changed .groovy to .java, added ;, etc to make them valid java. Java will not compile the fail case complaining about "o instanceof boolean" no being valid. "Inconvertible types, cannot cast boolean to Object" is the message you get. Running the "if(o instanceof booelan)" code that Groovy have happily compiled, results in: java.lang.NoClassDefFoundError: boolean I think that Groovy should report the same compilation error, rather than accept something clearly incorrect and fail runtime. Even with @CompileStatic and @TypeChecked annotations Groovy compiles the code without errors. was: Using "instanceof boolean" or using a Trait will cause the compiled code to not work with OSGi/maven-bundle-plugin/bnd. Edited text: I made 2 test classes one Ok and one that bnd says has code in default package: OK: {{public void test(Object o) {}} {{ CallSite[] var2 = $getCallSiteArray();}} {{ if (o instanceof Boolean){ }} {{ var2[0].callCurrent(this, "boolean");}} } } Fail: public void test(Object o) { {{ CallSite[] var2 = $getCallSiteArray();}} {{ if (o instanceof boolean) {}} {{ var2[0].callCurrent(this, "boolean");}} } {{}}} The rest of the class is identical. These comes from decompiled .class files and thus are Java, but they were compile from groovy classes. Now the question is, where do java handle autoboxing ? If it is the compiler then this would explain the result. The "boolean" is a primitive and have no package. If the compiler is responsible for handling this, the problem lies with Groovy which has clearly not boxed the "boolean" in a "Boolean". If its the JDK that handles autoboxing runtime then both cases should behave the same, which they are not. Bnd ([https://bnd.bndtools.org)|https://bnd.bndtools.org)/] tries to import from "." in the "Fail" case and reports: "The default package '.' is not permitted by the Import-Package syntax." I took these 2 test groovy files and moved them to a Java maven module, changed .groovy to .java, added ;, etc to make them valid java. Java will not compile the fail case complaining about "o instanceof boolean" no being valid. "Inconvertible types, cannot cast boolean to Object" is the message you get. Running the "if(o instanceof booelan)" code that Groovy have happily compiled, results in: java.lang.NoClassDefFoundError: boolean I think that Groovy should report the same compilation error, rather than accept something clearly incorrect and fail runtime. Even with @CompileStatic and @TypeChecked annotations Groovy compiles the code without errors. > Using "instanceof boolean" or using a Trait will cause the compiled code to > not work with OSGi/maven-bundle-plugin/bnd > ----------------------------------------------------------------------------------------------------------------------- > > Key: GROOVY-9270 > URL: https://issues.apache.org/jira/browse/GROOVY-9270 > Project: Groovy > Issue Type: Bug > Components: class generator, Compiler > Affects Versions: 3.0.0-beta-3 > Environment: OSX (Mojave) JDK 11. > Reporter: Tommy Svensson > Priority: Major > Time Spent: 40m > Remaining Estimate: 0h > > There is also something very wrong with JIRA! I completely redid this > description yesterday to make things very much clearer. I saved several > times, and now this original is back! So once you write an issue, it cannot > be updated even tough you can edit the text and press save and have the new > text shown, but then being back to the original the next day. So I guess I > have to close this, and create a new issue, assuming that Jira allows more > than one issue from the same person ... > ---- > Using "instanceof boolean" or using a Trait will cause the compiled code to > not work with OSGi/maven-bundle-plugin/bnd. > Edited text: > I made 2 test classes one Ok and one that bnd says has code in default > package: > OK: > {{public void test(Object o) {}} > {{ CallSite[] var2 = $getCallSiteArray();}} > {{ if (o instanceof Boolean){ }} > {{ var2[0].callCurrent(this, "boolean");}} > } > } > Fail: > public void test(Object o) { > {{ CallSite[] var2 = $getCallSiteArray();}} > {{ if (o instanceof boolean) {}} > {{ var2[0].callCurrent(this, "boolean");}} > } > {{}}} > The rest of the class is identical. > > These comes from decompiled .class files and thus are Java, but they were > compile from groovy classes. Now the question is, where do java handle > autoboxing ? If it is the compiler then this would explain the result. The > "boolean" is a primitive and have no package. > If the compiler is responsible for handling this, the problem lies with > Groovy which has clearly not boxed the "boolean" in a "Boolean". > If its the JDK that handles autoboxing runtime then both cases should behave > the same, which they are not. > Bnd ([https://bnd.bndtools.org)|https://bnd.bndtools.org)/] tries to import > from "." in the "Fail" case and reports: "The default package '.' is not > permitted by the Import-Package syntax." > I took these 2 test groovy files and moved them to a Java maven module, > changed .groovy to .java, added ;, etc to make them valid java. Java will not > compile the fail case complaining about "o instanceof boolean" no being > valid. "Inconvertible types, cannot cast boolean to Object" is the message > you get. > Running the "if(o instanceof booelan)" code that Groovy have happily > compiled, results in: java.lang.NoClassDefFoundError: boolean > I think that Groovy should report the same compilation error, rather than > accept something clearly incorrect and fail runtime. > Even with @CompileStatic and @TypeChecked annotations Groovy compiles the > code without errors. > -- This message was sent by Atlassian Jira (v8.3.4#803005)