package com.airbnb.epoxy;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.TypeName;
import java.util.ArrayList;
import java.util.List;
import javax.lang.model.type.TypeMirror;
import static com.airbnb.epoxy.Utils.isViewClickListenerType;
abstract class AttributeInfo {
protected String name;
protected TypeName typeName;
protected TypeMirror typeMirror;
protected String modelName;
protected String modelPackageName;
protected boolean useInHash;
protected boolean ignoreRequireHashCode;
protected boolean generateSetter;
protected List<AnnotationSpec> setterAnnotations = new ArrayList<>();
protected boolean generateGetter;
protected List<AnnotationSpec> getterAnnotations = new ArrayList<>();
protected boolean hasFinalModifier;
protected boolean packagePrivate;
/**
* Track whether there is a setter method for this attribute on a super class so that we can call
* through to super.
*/
protected boolean hasSuperSetter;
// for private fields (Kotlin case)
protected boolean isPrivate;
protected String getterMethodName;
protected String setterMethodName;
/**
* True if this attribute is completely generated as a field on the generated model. False if it
* exists as a user defined attribute in a model super class.
*/
protected boolean isGenerated;
String getName() {
return name;
}
TypeName getTypeName() {
return typeName;
}
public TypeMirror getTypeMirror() {
return typeMirror;
}
boolean useInHash() {
return useInHash;
}
boolean ignoreRequireHashCode() {
return ignoreRequireHashCode;
}
boolean generateSetter() {
return generateSetter;
}
List<AnnotationSpec> getSetterAnnotations() {
return setterAnnotations;
}
boolean generateGetter() {
return generateGetter;
}
List<AnnotationSpec> getGetterAnnotations() {
return getterAnnotations;
}
boolean hasSuperSetterMethod() {
return hasSuperSetter;
}
boolean hasFinalModifier() {
return hasFinalModifier;
}
boolean isPackagePrivate() {
return packagePrivate;
}
String getterCode() {
return isPrivate ? getterMethodName + "()" : name;
}
String setterCode() {
return (isGenerated ? "this." : "super.")
+ (isPrivate ? setterMethodName + "($L)" : name + " = $L");
}
@Override
public String toString() {
return "ModelAttributeData{"
+ "name='" + name + '\''
+ ", type=" + typeName
+ '}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof AttributeInfo)) {
return false;
}
AttributeInfo that = (AttributeInfo) o;
if (!name.equals(that.name)) {
return false;
}
return typeName.equals(that.typeName);
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + typeName.hashCode();
return result;
}
boolean isViewClickListener() {
return isViewClickListenerType(getTypeMirror());
}
String getModelClickListenerName() {
return getName() + GeneratedModelWriter.GENERATED_FIELD_SUFFIX;
}
String getModelName() {
return modelName;
}
String getPackageName() {
return modelPackageName;
}
}