Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any global flag for Groovy static compilation?

I know that since Groovy 2.0 there are annotations for static compilation. However it's ease to omit such annotation by accident and still run into troubles.

Is there any way to achieve the opposite compiler behaviour, like compile static all project files by default and compile dynamic only files chosen by purpose with some kind @CompileDynamic annotation for example?

like image 292
topr Avatar asked Aug 08 '12 14:08

topr


1 Answers

I have found some (I believe recently introduced) feature which allows doing so with Gradle.

In build.gradle file for the project containing groovy sources we need to add following lines:

compileGroovy {
    configure(groovyOptions) {
        configurationScript = file("$rootDir/config/groovy/compiler-config.groovy")
    }
}

or compileTestGroovy { ... for applying the same to test sources. Keep in mind that neither static compilation nor type checking works well with Spock Framework though. Spock by its nature utilizes dynamic 'groovyness' a lot.

Then on a root of the project create folder config/groovy/ and a file named compiler-config.groovy within. The content of the file is as follows:

import groovy.transform.CompileStatic

withConfig(configuration) {
    ast(CompileStatic)
}

Obviously path and name of the configurationScript may vary and it's up to you. It shouldn't rather go to the same src/main/groovy though as it would be mixing totally separate concerns.

The same may be done with groovy.transform.TypeChecked or any other annotation, of course.

To reverse applied behaviour on certain classes or methods then @CompileDynamic annotation or @TypeChecked(TypeCheckingMode.SKIP) respectively may be used.

I'm not sure how to achieve the same when no Gradle is in use as build tool. I may update this answer in the future with such info though.

like image 196
topr Avatar answered Nov 16 '22 02:11

topr