|
15 | 15 | */ |
16 | 16 | package org.androidannotations.helper; |
17 | 17 |
|
18 | | -import com.sun.codemodel.*; |
| 18 | +import com.sun.codemodel.JClass; |
| 19 | +import com.sun.codemodel.JClassAlreadyExistsException; |
| 20 | +import com.sun.codemodel.JDefinedClass; |
| 21 | +import com.sun.codemodel.JExpression; |
| 22 | +import com.sun.codemodel.JFieldRef; |
| 23 | +import com.sun.codemodel.JFieldVar; |
| 24 | +import com.sun.codemodel.JInvocation; |
| 25 | +import com.sun.codemodel.JMethod; |
| 26 | +import com.sun.codemodel.JMod; |
| 27 | +import com.sun.codemodel.JVar; |
19 | 28 | import org.androidannotations.holder.HasIntentBuilder; |
20 | 29 |
|
21 | 30 | import javax.lang.model.type.TypeKind; |
|
25 | 34 | import java.util.HashMap; |
26 | 35 | import java.util.Map; |
27 | 36 |
|
28 | | -import static com.sun.codemodel.JExpr.*; |
29 | | -import static com.sun.codemodel.JMod.*; |
30 | | -import static org.androidannotations.helper.CanonicalNameConstants.*; |
| 37 | +import static com.sun.codemodel.JExpr._new; |
| 38 | +import static com.sun.codemodel.JExpr._super; |
| 39 | +import static com.sun.codemodel.JExpr.cast; |
| 40 | +import static com.sun.codemodel.JExpr.ref; |
| 41 | +import static com.sun.codemodel.JMod.PUBLIC; |
| 42 | +import static com.sun.codemodel.JMod.STATIC; |
| 43 | +import static org.androidannotations.helper.CanonicalNameConstants.PARCELABLE; |
| 44 | +import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE; |
| 45 | +import static org.androidannotations.helper.CanonicalNameConstants.STRING; |
31 | 46 |
|
32 | 47 | public abstract class IntentBuilder { |
33 | 48 |
|
@@ -91,37 +106,33 @@ public JMethod getPutExtraMethod(TypeMirror elementType, String parameterName, J |
91 | 106 | } |
92 | 107 |
|
93 | 108 | private JMethod addPutExtraMethod(TypeMirror elementType, String parameterName, JFieldVar extraKeyField) { |
94 | | - boolean castToSerializable = false; |
95 | | - boolean castToParcelable = false; |
| 109 | + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.getIntentBuilderClass(), parameterName); |
| 110 | + JClass parameterClass = codeModelHelper.typeMirrorToJClass(elementType, holder); |
| 111 | + JVar extraParameterVar = method.param(parameterClass, parameterName); |
| 112 | + JInvocation superCall = getSuperPutExtraInvocation(elementType, extraParameterVar, extraKeyField); |
| 113 | + method.body()._return(superCall); |
| 114 | + return method; |
| 115 | + } |
| 116 | + |
| 117 | + public JInvocation getSuperPutExtraInvocation(TypeMirror elementType, JVar extraParam, JFieldVar extraKeyField) { |
| 118 | + JExpression extraParameterArg = extraParam; |
| 119 | + // Cast to Parcelable or Serializable if needed |
96 | 120 | if (elementType.getKind() == TypeKind.DECLARED) { |
97 | 121 | Elements elementUtils = holder.processingEnvironment().getElementUtils(); |
98 | 122 | TypeMirror parcelableType = elementUtils.getTypeElement(PARCELABLE).asType(); |
99 | 123 | if (!typeUtils.isSubtype(elementType, parcelableType)) { |
100 | 124 | TypeMirror stringType = elementUtils.getTypeElement(STRING).asType(); |
101 | 125 | if (!typeUtils.isSubtype(elementType, stringType)) { |
102 | | - castToSerializable = true; |
| 126 | + extraParameterArg = cast(holder.classes().SERIALIZABLE, extraParameterArg); |
103 | 127 | } |
104 | 128 | } else { |
105 | 129 | TypeMirror serializableType = elementUtils.getTypeElement(SERIALIZABLE).asType(); |
106 | 130 | if (typeUtils.isSubtype(elementType, serializableType)) { |
107 | | - castToParcelable = true; |
| 131 | + extraParameterArg = cast(holder.classes().PARCELABLE, extraParameterArg); |
108 | 132 | } |
109 | 133 | } |
110 | 134 | } |
111 | | - |
112 | | - JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.getIntentBuilderClass(), parameterName); |
113 | | - JClass parameterClass = codeModelHelper.typeMirrorToJClass(elementType, holder); |
114 | | - JVar extraParameterVar = method.param(parameterClass, parameterName); |
115 | | - JInvocation invocation = _super().invoke("extra").arg(extraKeyField); |
116 | | - if (castToSerializable) { |
117 | | - invocation.arg(cast(holder.classes().SERIALIZABLE, extraParameterVar)); |
118 | | - } else if (castToParcelable) { |
119 | | - invocation.arg(cast(holder.classes().PARCELABLE, extraParameterVar)); |
120 | | - } else { |
121 | | - invocation.arg(extraParameterVar); |
122 | | - } |
123 | | - method.body()._return(invocation); |
124 | | - return method; |
| 135 | + return _super().invoke("extra").arg(extraKeyField).arg(extraParameterArg); |
125 | 136 | } |
126 | 137 |
|
127 | 138 | protected abstract JClass getSuperClass(); |
|
0 commit comments