package com.airbnb.epoxy;
import com.squareup.javapoet.ClassName;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import static com.airbnb.epoxy.ClassNames.EPOXY_DATA_BINDING_HOLDER;
import static com.airbnb.epoxy.ClassNames.EPOXY_DATA_BINDING_MODEL;
import static com.airbnb.epoxy.Utils.capitalizeFirstLetter;
import static com.airbnb.epoxy.Utils.getElementByName;
class DataBindingModelInfo extends GeneratedModelInfo {
private static final String BINDING_SUFFIX = "Binding";
private final Types typeUtils;
private final Elements elementUtils;
private final LayoutResource layoutResource;
private final String moduleName;
private final ClassName dataBindingClassName;
DataBindingModelInfo(Types typeUtils, Elements elementUtils, LayoutResource layoutResource,
String moduleName) {
this.layoutResource = layoutResource;
this.moduleName = moduleName;
dataBindingClassName = getDataBindingClassNameForResource(layoutResource, moduleName);
this.typeUtils = typeUtils;
this.elementUtils = elementUtils;
superClassElement = (TypeElement) Utils.getElementByName(EPOXY_DATA_BINDING_MODEL,
elementUtils, typeUtils);
superClassName = EPOXY_DATA_BINDING_MODEL;
generatedClassName = buildGeneratedModelName();
parameterizedClassName = generatedClassName;
boundObjectTypeName = EPOXY_DATA_BINDING_HOLDER;
shouldGenerateModel = true;
collectMethodsReturningClassType(superClassElement, typeUtils);
}
void parseDataBindingClass() {
// This databinding class won't exist until the second round of annotation processing since
// it is generated in the first round.
Element dataBindingClass = getElementByName(dataBindingClassName, elementUtils, typeUtils);
HashCodeValidator hashCodeValidator = new HashCodeValidator(typeUtils);
for (Element element : dataBindingClass.getEnclosedElements()) {
if (Utils.isSetterMethod(element)) {
addAttribute(
new DataBindingAttributeInfo(this, ((ExecutableElement) element), hashCodeValidator));
}
}
}
private ClassName getDataBindingClassNameForResource(LayoutResource layoutResource,
String moduleName) {
StringBuilder builder = new StringBuilder();
String[] parts = layoutResource.resourceName.split("_");
for (String part : parts) {
builder.append(capitalizeFirstLetter(part));
}
builder.append(BINDING_SUFFIX);
return ClassName.get(moduleName + ".databinding", builder.toString());
}
private ClassName buildGeneratedModelName() {
String simpleName = dataBindingClassName.simpleName() + "Model" + GENERATED_CLASS_NAME_SUFFIX;
return ClassName.get(moduleName, simpleName);
}
LayoutResource getLayoutResource() {
return layoutResource;
}
}