private static Optional<InvalidateMethod> of1(TypeInfo typeInfo, MethodInfo method, AnnotationInfo annotation) {
String annotationName = annotation.simpleName();
if (method.hasModifierInfo(ModifierInfo.FINAL)) {
method.compilationError("@%s method cannot be final", annotationName);
return Optional.empty();
}
if (method.hasAccessInfo(AccessInfo.PRIVATE)) {
method.compilationError("@%s method cannot be private", annotationName);
return Optional.empty();
}
SimpleTypeInfo returnTypeInfo = method.returnTypeInfo();
boolean self = returnTypeInfo.equals(typeInfo.toSimpleTypeInfo());
if (!returnTypeInfo.equals(SimpleTypePrimitives.VOID) && !self) {
method.compilationError("@%s method must return void or self", annotationName);
return Optional.empty();
}
InvalidateMethod invalidateMethod = new InvalidateMethod(method, annotation, self);
return Optional.of(invalidateMethod);
}