Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Refator BundleHelper and add support for type variables
  • Loading branch information
WonderCsabo committed Jun 4, 2015
commit 23bca37c79657608047e4d7b7bdcf2612131fae3
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@
import java.util.List;
import java.util.Map;

import javax.lang.model.element.TypeElement;
import javax.lang.model.type.ArrayType;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.type.TypeVariable;

import org.androidannotations.holder.GeneratedClassHolder;

Expand Down Expand Up @@ -86,12 +86,14 @@ public class BundleHelper {
private String methodNameToSave;
private String methodNameToRestore;

private TypeMirror upperBound;

public BundleHelper(AnnotationHelper helper, TypeMirror element) {
annotationHelper = helper;
this.element = element;

String typeString = element.toString();
TypeElement elementType = annotationHelper.typeElementFromQualifiedName(typeString);
TypeMirror type = element;

if (METHOD_SUFFIX_BY_TYPE_NAME.containsKey(typeString)) {

Expand All @@ -105,15 +107,18 @@ public BundleHelper(AnnotationHelper helper, TypeMirror element) {
boolean hasTypeArguments = false;
if (arrayType.getComponentType() instanceof DeclaredType) {
DeclaredType declaredType = (DeclaredType) arrayType.getComponentType();
typeString = declaredType.asElement().toString();
type = declaredType;
hasTypeArguments = declaredType.getTypeArguments().size() > 0;
} else if (arrayType.getComponentType().getKind() == TypeKind.TYPEVAR) {
type = arrayType.getComponentType();
upperBound = getUpperBound(type);
restoreCallNeedCastStatement = true;
restoreCallNeedsSuppressWarning = true;
} else {
typeString = arrayType.getComponentType().toString();
type = arrayType.getComponentType();
}

elementType = annotationHelper.typeElementFromQualifiedName(typeString);

if (isTypeParcelable(elementType)) {
if (isTypeParcelable(type)) {
methodNameToSave = "put" + "ParcelableArray";
methodNameToRestore = "get" + "ParcelableArray";

Expand All @@ -135,11 +140,10 @@ public BundleHelper(AnnotationHelper helper, TypeMirror element) {
TypeMirror typeArgument = typeArguments.get(0);
if (typeArgument instanceof DeclaredType) {
declaredType = (DeclaredType) typeArgument;
typeString = declaredType.asElement().toString();
elementType = annotationHelper.typeElementFromQualifiedName(typeString);
type = declaredType;
hasTypeArguments = declaredType.getTypeArguments().size() > 0;
}
if (isTypeParcelable(elementType)) {
if (isTypeParcelable(type)) {
methodNameToSave = "put" + "ParcelableArrayList";
methodNameToRestore = "get" + "ParcelableArrayList";

Expand All @@ -159,15 +163,10 @@ public BundleHelper(AnnotationHelper helper, TypeMirror element) {

} else {

boolean hasTypeArguments = false;
if (element instanceof DeclaredType) {
DeclaredType declaredType = (DeclaredType) element;
typeString = declaredType.asElement().toString();
elementType = annotationHelper.typeElementFromQualifiedName(typeString);
hasTypeArguments = declaredType.getTypeArguments().size() > 0;
}
boolean hasTypeArguments = element.getKind() == TypeKind.DECLARED && hasTypeArguments(element) || //
element.getKind() == TypeKind.TYPEVAR && hasTypeArguments(getUpperBound(element));

if (isTypeParcelable(elementType)) {
if (isTypeParcelable(type)) {
methodNameToSave = "put" + "Parcelable";
methodNameToRestore = "get" + "Parcelable";
} else {
Expand All @@ -186,9 +185,19 @@ public String getMethodNameToSave() {
return methodNameToSave;
}

private boolean isTypeParcelable(TypeElement elementType) {
TypeElement parcelableType = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.PARCELABLE);
return elementType != null && annotationHelper.isSubtype(elementType, parcelableType);
private boolean isTypeParcelable(TypeMirror typeMirror) {
TypeMirror parcelableType = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.PARCELABLE).asType();
return annotationHelper.isSubtype(typeMirror, parcelableType);
}

private TypeMirror getUpperBound(TypeMirror type) {
TypeVariable typeVariable = (TypeVariable) type;
return typeVariable.getUpperBound();
}

private boolean hasTypeArguments(TypeMirror type) {
DeclaredType declaredType = (DeclaredType) type;
return declaredType.getTypeArguments().size() > 0;
}

public JExpression getExpressionToRestoreFromIntentOrBundle(JClass variableClass, JExpression intent, JExpression extras, JExpression extraKey, JMethod method, GeneratedClassHolder holder) {
Expand All @@ -202,7 +211,12 @@ public JExpression getExpressionToRestoreFromIntentOrBundle(JClass variableClass
public JExpression getExpressionToRestoreFromBundle(JClass variableClass, JExpression bundle, JExpression extraKey, JMethod method, GeneratedClassHolder holder) {
JExpression expressionToRestore;
if (methodNameToRestore.equals("getParcelableArray")) {
JClass erasure = variableClass.elementType().erasure().array();
JClass erasure;
if (upperBound != null) {
erasure = codeModelHelper.typeMirrorToJClass(upperBound, holder).erasure().array();
} else {
erasure = variableClass.elementType().erasure().array();
}
expressionToRestore = holder.refClass(org.androidannotations.api.bundle.BundleHelper.class).staticInvoke("getParcelableArray").arg(bundle).arg(extraKey).arg(erasure.dotclass());
} else {
expressionToRestore = JExpr.invoke(bundle, methodNameToRestore).arg(extraKey);
Expand Down