Enforce the return type of a method in groovy. To be used with GroovyShell.
- Optionally allow subtypes and closure coercion
 - Optionally allow boxing/unboxing
 
Script:
def shouldReturnInt() {
  return "a panda"
}Creating the Shell with EnforceReturnType:
def configuration = new CompilerConfiguration()
def enforceReturnType = new EnforceReturnType(ClassHelper.int_TYPE)
configuration.addCompilationCustomizers(new ASTTransformationCustomizer(enforceReturnType))
def shell = new GroovyShell(new Binding(), configuration)Result when parsing the Script:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script1.groovy: 3: [Static type checking] - Method shouldReturnInt must return int but inferred java.lang.String as return type
 @ line 3, column 18.
             return "a panda"
                    ^
                    
1 error
// Allow subtypes AND coercion
enforceReturnType.allowSubtypes = true
// allow Boxing (int -> Integer) 
enforceReturnType.allowBoxing = true
// allow Unboxing (Integer -> int) 
enforceReturnType.allowUnboxing = true
// limit to non-synthetic MethodNodes named 'int*'
new EnforceReturnType(ClassHelper.int_TYPE,
    { !it.synthetic && it.name.startsWith("int")}
)
You can add a dependency to you build via jitpack.
Please do not use the -SNAPSHOT version.
repositories {
    maven { url 'https://jitpack.io' }
}
dependencies {
    compile 'com.github.MeneDev:groovy-dsl-building-blocks-enforce-return-type:76c7b7325d'
}For more examples have a look at the tests.
This was created as an answer to the question Groovy: How to get statically inferred return type from AST on Stackoverflow.