You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2021/05/29 15:52:00 UTC
[jira] [Resolved] (GROOVY-5942) CompileStatic error changes when
portions of app moved from groovy to java or order of compilation changed
[ https://issues.apache.org/jira/browse/GROOVY-5942?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Eric Milles resolved GROOVY-5942.
---------------------------------
Resolution: Fixed
The access checks have been corrected. See {{org.codehaus.groovy.classgen.AsmClassGenerator#isFieldDirectlyAccessible}}.
> CompileStatic error changes when portions of app moved from groovy to java or order of compilation changed
> ----------------------------------------------------------------------------------------------------------
>
> Key: GROOVY-5942
> URL: https://issues.apache.org/jira/browse/GROOVY-5942
> Project: Groovy
> Issue Type: Bug
> Components: Static compilation
> Affects Versions: 2.0.6
> Reporter: Andy Clement
> Priority: Major
>
> These 3 files:
> {code}Top.groovy
> package q;
> public class Top {
> protected String m = "xyz";
> }
> {code}
> {code}Bottom.groovy
> package q;
> class Bottom extends Top {}
> {code}
> {code}Simple.groovy
> package p;
> @groovy.transform.CompileStatic
> public class Simple {
> public static void main(String[] argv) {
> print new Bottom().m;
> }
> {code}
> compile all with groovyc, returns:
> {code}
> groovyc Simple.groovy Top.groovy Bottom.groovy
> org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
> Simple.groovy: 7: Access to q.Bottom#m is forbidden @ line 7, column 11.
> print new Bottom().m;
> ^
> 1 error
> {code}
> If we change Top.groovy > Top.java, it will compile clean:
> {code}
> groovyc -j Simple.groovy Top.java Bottom.groovy
> {code}
> If we kept the all groovy version and change the order, it will also compile clean:
> {code}
> groovyc Top.groovy Bottom.groovy Simple.groovy
> {code}
> I believe it is due to a combination of two things.
> When the code generation step runs, whether the error comes out depends on whether Bottom has been tagged with "GroovyObject", which the call to the verifier adds.
> When compiling them in the mixed case, stub generation forces the verifier to run on Bottom, it gets GroovyObject and then things compile clean.
> When compiling all as groovy, if Simple is built first then Bottom does not have GroovyObject (error comes out), if Simple is built last, Bottom does have GroovyObject (errors does not come out).
> In Groovy-Eclipse I improved the situation by pulling the call to the verifier out of the classgen step in CompilationUnit and running it as an earlier verify step. This ensures all files get verified (and GroovyObject added) before the AsmClassGenerator runs (which is what produces the message).
> On top of that I think the error should probably be coming out in all cases (unless groovy allows breaking these vis rules, I'm not sure on that) but the check doesn't seem quite right:
> In StaticTypesCallSiteWriter
> {code}
> private static boolean isDirectAccessAllowed(FieldNode a, ClassNode receiver, boolean isSamePackage) {
>
> ....
> ....
> // no getter
> return a.isPublic() || (a.isProtected() && isSamePackage);
> }
> {code}
> protected doesn't mean you can access it if in the same package, which I think is what that condition check implies. Default visibility means same package. protected means class hierarchy visibility.
> There is a piece of grails-core that currently compiles cleanly because of this situation. If the error were to be switched on for all variants, grails-core will need refactoring.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)