package com.stanfy.enroscar.async.internal;
import com.squareup.javawriter.JavaWriter;
import java.io.IOException;
import java.util.EnumSet;
import java.util.List;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import static com.stanfy.enroscar.async.internal.GenUtils.operatorContext;
import static com.stanfy.enroscar.async.internal.TypeSupport.LOADER_DESCRIPTION_CLASS;
import static com.stanfy.enroscar.async.internal.TypeSupport.OPERATOR_CONTEXT_CLASS;
import static javax.lang.model.element.Modifier.PUBLIC;
/**
* LoaderDescription class generator.
*/
final class LoaderDescriptionGenerator extends BaseGenerator {
public LoaderDescriptionGenerator(final ProcessingEnvironment env, final TypeElement type,
final List<MethodData> methods) {
super(env, type, methods, GenUtils.SUFFIX_LOADER_DESC);
setExtendsClass(LOADER_DESCRIPTION_CLASS + "<" + getFqcn() + ">");
addImports(LOADER_DESCRIPTION_CLASS, OPERATOR_CONTEXT_CLASS);
for (MethodData d : methods) {
addImports(d.loaderDescriptionTypeSupport.loaderDescriptionImports());
}
}
@Override
protected void writeClassBody(final JavaWriter w) throws IOException {
w.beginConstructor(constructorModifiers(), "final " + operatorContext(operationsClass), "context");
w.emitStatement("super(context)");
w.endConstructor();
w.emitEmptyLine();
for (MethodData data : methods) {
ExecutableElement m = data.method;
String operationName = m.getSimpleName().toString();
w.beginMethod(
data.loaderDescriptionTypeSupport.loaderDescriptionReturnType(w, m, this),
operationName.concat("IsFinished"),
EnumSet.of(PUBLIC)
);
w.emitStatement(data.loaderDescriptionTypeSupport.loaderDescriptionMethodBody(w, m, this));
w.endMethod();
w.beginMethod(
w.compressType(getFqcn()),
operationName.concat("IsStartedDo"),
EnumSet.of(PUBLIC),
"final Runnable", "action"
);
w.emitStatement("addStartAction(%d, action)", getLoaderId(m));
w.emitStatement("return this");
w.endMethod();
}
}
}