in src/main/java/org/codehaus/groovy/tools/javac/JavaStubGenerator.java [719:803]
private void printMethod(final PrintWriter out, final ClassNode classNode, final MethodNode methodNode) {
if (methodNode.isStaticConstructor()) return;
if (methodNode.isPrivate() || !Utilities.isJavaIdentifier(methodNode.getName())) return;
if (methodNode.isSynthetic() && ("$getStaticMetaClass".equals(methodNode.getName()))) return;
printAnnotations(out, methodNode);
if (!isInterfaceOrTrait(classNode)) {
int modifiers = methodNode.getModifiers();
if (classNode.isEnum()) modifiers &= ~Opcodes.ACC_ABSTRACT;
else if (isDefaultTraitImpl(methodNode)) modifiers ^= Opcodes.ACC_ABSTRACT;
if (methodNode.isSyntheticPublic() && hasPackageScopeXform(methodNode, PackageScopeTarget.METHODS)) modifiers &= ~Opcodes.ACC_PUBLIC;
printModifiers(out, modifiers);
} else if (methodNode.isDefault()) {
out.print("default ");
} else if (methodNode.isStatic()) {
out.print("static ");
}
printTypeParameters(out, methodNode.getGenericsTypes());
out.print(" ");
printType(out, methodNode.getReturnType());
out.print(" ");
out.print(methodNode.getName());
printParams(out, methodNode);
ClassNode[] exceptions = methodNode.getExceptions();
printExceptions(out, exceptions);
boolean skipBody = (isAbstract(methodNode) && !classNode.isEnum()) || Traits.isTrait(classNode);
if (!skipBody) {
ClassNode type = methodNode.getReturnType();
if (isPrimitiveBoolean(type)) {
out.println(" { return false; }");
} else if (!isPrimitiveType(type)) {
out.println(" { return null; }");
} else if (!isPrimitiveVoid(type)) {
out.println(" { return 0; }");
} else { // void return type
out.println(" { }");
}
} else {
if (classNode.isAnnotationDefinition() && methodNode.hasAnnotationDefault()) {
Statement fs = methodNode.getFirstStatement();
if (fs instanceof ExpressionStatement) {
ExpressionStatement es = (ExpressionStatement) fs;
Expression re = es.getExpression();
ClassNode rt = methodNode.getReturnType();
Consumer<Expression> valuePrinter = (value) -> {
if (isClassType(rt) || (rt.isArray() && isClassType(rt.getComponentType()))) {
if ("groovy.lang.Closure".equals(value.getType().getName())) {
out.print("groovy.lang.Closure.class");
return;
}
String valueText = value.getText();
out.print(valueText);
if (!valueText.endsWith(".class")) {
out.print(".class");
}
} else if (value instanceof ConstantExpression) {
printValue(out, rt, value);
} else {
out.print(value.getText());
}
};
out.print(" default ");
if (re instanceof ListExpression) {
out.print("{ ");
ListExpression le = (ListExpression) re;
boolean first = true;
for (Expression e : le.getExpressions()) {
if (first) first = false; else out.print(", ");
valuePrinter.accept(e);
}
out.print(" }");
} else {
valuePrinter.accept(re);
}
}
}
out.println(";");
}
}