Skip to content

Commit 9d1b3ca

Browse files
committed
Refactoring common code between ServiceActionProcessor and ExtraProcessor
Refactoring three parts : addCastMethod, addIntentBuilderPutExtraMethod and camelCaseToUpperSnakeCase
1 parent 883af2e commit 9d1b3ca

5 files changed

Lines changed: 95 additions & 114 deletions

File tree

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,25 @@
2323
import static com.sun.codemodel.JMod.PUBLIC;
2424
import static com.sun.codemodel.JMod.STATIC;
2525
import static javax.lang.model.element.ElementKind.CONSTRUCTOR;
26+
import static org.androidannotations.helper.CanonicalNameConstants.PARCELABLE;
27+
import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE;
28+
import static org.androidannotations.helper.CanonicalNameConstants.STRING;
2629

2730
import java.lang.reflect.Field;
2831
import java.util.ArrayList;
2932
import java.util.List;
3033

34+
import javax.annotation.processing.ProcessingEnvironment;
3135
import javax.lang.model.element.Element;
3236
import javax.lang.model.element.ExecutableElement;
3337
import javax.lang.model.element.VariableElement;
3438
import javax.lang.model.type.ArrayType;
3539
import javax.lang.model.type.DeclaredType;
40+
import javax.lang.model.type.TypeKind;
3641
import javax.lang.model.type.TypeMirror;
3742
import javax.lang.model.type.WildcardType;
43+
import javax.lang.model.util.Elements;
44+
import javax.lang.model.util.Types;
3845

3946
import org.androidannotations.processing.EBeanHolder;
4047
import org.androidannotations.processing.EBeansHolder.Classes;
@@ -56,6 +63,7 @@
5663
import com.sun.codemodel.JStatement;
5764
import com.sun.codemodel.JTryBlock;
5865
import com.sun.codemodel.JType;
66+
import com.sun.codemodel.JTypeVar;
5967
import com.sun.codemodel.JVar;
6068

6169
public class APTCodeModelHelper {
@@ -383,4 +391,47 @@ private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, boolean
383391
}
384392
}
385393
}
394+
395+
public JInvocation addIntentBuilderPutExtraMethod(JCodeModel codeModel, EBeanHolder holder, APTCodeModelHelper helper, ProcessingEnvironment processingEnv, JMethod method, TypeMirror elementType, String paramName, String extraName) {
396+
boolean castToSerializable = false;
397+
boolean castToParcelable = false;
398+
if (elementType.getKind() == TypeKind.DECLARED) {
399+
Elements elementUtils = processingEnv.getElementUtils();
400+
Types typeUtils = processingEnv.getTypeUtils();
401+
TypeMirror parcelableType = elementUtils.getTypeElement(PARCELABLE).asType();
402+
if (!typeUtils.isSubtype(elementType, parcelableType)) {
403+
TypeMirror stringType = elementUtils.getTypeElement(STRING).asType();
404+
if (!typeUtils.isSubtype(elementType, stringType)) {
405+
castToSerializable = true;
406+
}
407+
} else {
408+
TypeMirror serializableType = elementUtils.getTypeElement(SERIALIZABLE).asType();
409+
if (typeUtils.isSubtype(elementType, serializableType)) {
410+
castToParcelable = true;
411+
}
412+
}
413+
}
414+
415+
JClass paramClass = helper.typeMirrorToJClass(elementType, holder);
416+
JVar extraParam = method.param(paramClass, paramName);
417+
JBlock body = method.body();
418+
JInvocation invocation = body.invoke(holder.intentField, "putExtra").arg(extraName);
419+
if (castToSerializable) {
420+
return invocation.arg(cast(holder.classes().SERIALIZABLE, extraParam));
421+
} else if (castToParcelable) {
422+
return invocation.arg(cast(holder.classes().PARCELABLE, extraParam));
423+
}
424+
return invocation.arg(extraParam);
425+
}
426+
427+
public void addCastMethod(JCodeModel codeModel, EBeanHolder holder) {
428+
JType objectType = codeModel._ref(Object.class);
429+
JMethod method = holder.generatedClass.method(JMod.PRIVATE, objectType, "cast_");
430+
JTypeVar genericType = method.generify("T");
431+
method.type(genericType);
432+
JVar objectParam = method.param(objectType, "object");
433+
method.annotate(SuppressWarnings.class).param("value", "unchecked");
434+
method.body()._return(JExpr.cast(genericType, objectParam));
435+
holder.cast = method;
436+
}
386437
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CaseHelper.java‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,14 @@ public static String camelCaseToUpperSnakeCase(String camelCase) {
6060
return camelCaseToSnakeCase(camelCase).toUpperCase();
6161
}
6262

63+
public static String camelCaseToUpperSnakeCase(String prefix, String camelCase, String suffix) {
64+
if (prefix != null && !camelCase.startsWith(prefix)) {
65+
camelCase = prefix + "_" + camelCase;
66+
}
67+
if (suffix != null && !camelCase.toLowerCase().endsWith(suffix.toLowerCase())) {
68+
camelCase = camelCase + "_" + suffix;
69+
}
70+
return camelCaseToUpperSnakeCase(camelCase);
71+
}
72+
6373
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ExtraProcessor.java‎

Lines changed: 4 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,16 @@
1818
import static com.sun.codemodel.JExpr._null;
1919
import static com.sun.codemodel.JExpr._super;
2020
import static com.sun.codemodel.JExpr._this;
21-
import static com.sun.codemodel.JExpr.cast;
2221
import static com.sun.codemodel.JExpr.invoke;
2322
import static com.sun.codemodel.JExpr.lit;
2423
import static com.sun.codemodel.JMod.FINAL;
2524
import static com.sun.codemodel.JMod.PRIVATE;
2625
import static com.sun.codemodel.JMod.PUBLIC;
2726
import static com.sun.codemodel.JMod.STATIC;
28-
import static org.androidannotations.helper.CanonicalNameConstants.PARCELABLE;
29-
import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE;
30-
import static org.androidannotations.helper.CanonicalNameConstants.STRING;
3127

3228
import javax.annotation.processing.ProcessingEnvironment;
3329
import javax.lang.model.element.Element;
34-
import javax.lang.model.type.TypeKind;
3530
import javax.lang.model.type.TypeMirror;
36-
import javax.lang.model.util.Elements;
37-
import javax.lang.model.util.Types;
3831

3932
import org.androidannotations.annotations.Extra;
4033
import org.androidannotations.helper.APTCodeModelHelper;
@@ -50,11 +43,9 @@
5043
import com.sun.codemodel.JFieldVar;
5144
import com.sun.codemodel.JInvocation;
5245
import com.sun.codemodel.JMethod;
53-
import com.sun.codemodel.JMod;
5446
import com.sun.codemodel.JPrimitiveType;
5547
import com.sun.codemodel.JTryBlock;
5648
import com.sun.codemodel.JType;
57-
import com.sun.codemodel.JTypeVar;
5849
import com.sun.codemodel.JVar;
5950

6051
public class ExtraProcessor implements DecoratingElementProcessor {
@@ -87,19 +78,14 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) {
8778
Classes classes = holder.classes();
8879

8980
if (!isPrimitive && holder.cast == null) {
90-
generateCastMethod(codeModel, holder);
81+
helper.addCastMethod(codeModel, holder);
9182
}
9283

9384
if (holder.extras == null) {
9485
injectExtras(holder, codeModel);
9586
}
9687

97-
String staticFieldName;
98-
if (fieldName.endsWith("Extra")) {
99-
staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(fieldName);
100-
} else {
101-
staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(fieldName + "Extra");
102-
}
88+
String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(null, fieldName, "Extra");
10389

10490
JFieldVar extraKeyField = holder.generatedClass.field(PUBLIC | STATIC | FINAL, classes.STRING, staticFieldName, lit(extraKey));
10591

@@ -137,53 +123,15 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) {
137123
// flags()
138124
JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.intentBuilderClass, fieldName);
139125

140-
boolean castToSerializable = false;
141-
boolean castToParcelable = false;
142-
TypeMirror extraType = elementType;
143-
if (extraType.getKind() == TypeKind.DECLARED) {
144-
Elements elementUtils = processingEnv.getElementUtils();
145-
Types typeUtils = processingEnv.getTypeUtils();
146-
TypeMirror parcelableType = elementUtils.getTypeElement(PARCELABLE).asType();
147-
if (!typeUtils.isSubtype(extraType, parcelableType)) {
148-
TypeMirror stringType = elementUtils.getTypeElement(STRING).asType();
149-
if (!typeUtils.isSubtype(extraType, stringType)) {
150-
castToSerializable = true;
151-
}
152-
} else {
153-
TypeMirror serializableType = elementUtils.getTypeElement(SERIALIZABLE).asType();
154-
if (typeUtils.isSubtype(extraType, serializableType)) {
155-
castToParcelable = true;
156-
}
157-
}
158-
}
159-
JClass paramClass = helper.typeMirrorToJClass(extraType, holder);
160-
JVar extraParam = method.param(paramClass, fieldName);
126+
helper.addIntentBuilderPutExtraMethod(codeModel, holder, helper, processingEnv, method, elementType, fieldName, staticFieldName);
127+
161128
JBlock body = method.body();
162-
JInvocation invocation = body.invoke(holder.intentField, "putExtra").arg(extraKeyField);
163-
if (castToSerializable) {
164-
invocation.arg(cast(classes.SERIALIZABLE, extraParam));
165-
} else if (castToParcelable) {
166-
invocation.arg(cast(classes.PARCELABLE, extraParam));
167-
} else {
168-
invocation.arg(extraParam);
169-
}
170129
body._return(_this());
171130
}
172131
}
173132

174133
}
175134

176-
private void generateCastMethod(JCodeModel codeModel, EBeanHolder holder) {
177-
JType objectType = codeModel._ref(Object.class);
178-
JMethod method = holder.generatedClass.method(JMod.PRIVATE, objectType, "cast_");
179-
JTypeVar genericType = method.generify("T");
180-
method.type(genericType);
181-
JVar objectParam = method.param(objectType, "object");
182-
method.annotate(SuppressWarnings.class).param("value", "unchecked");
183-
method.body()._return(JExpr.cast(genericType, objectParam));
184-
holder.cast = method;
185-
}
186-
187135
/**
188136
* Adds call to injectExtras_() in onCreate and setIntent() methods.
189137
*/

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ServiceActionProcessor.java‎

Lines changed: 4 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,10 @@
1616
package org.androidannotations.processing;
1717

1818
import static com.sun.codemodel.JExpr._null;
19-
import static com.sun.codemodel.JExpr.cast;
2019
import static com.sun.codemodel.JExpr.lit;
2120
import static com.sun.codemodel.JMod.FINAL;
2221
import static com.sun.codemodel.JMod.PUBLIC;
2322
import static com.sun.codemodel.JMod.STATIC;
24-
import static org.androidannotations.helper.CanonicalNameConstants.PARCELABLE;
25-
import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE;
26-
import static org.androidannotations.helper.CanonicalNameConstants.STRING;
2723

2824
import java.util.ArrayList;
2925
import java.util.List;
@@ -32,10 +28,6 @@
3228
import javax.lang.model.element.Element;
3329
import javax.lang.model.element.ExecutableElement;
3430
import javax.lang.model.element.VariableElement;
35-
import javax.lang.model.type.TypeKind;
36-
import javax.lang.model.type.TypeMirror;
37-
import javax.lang.model.util.Elements;
38-
import javax.lang.model.util.Types;
3931

4032
import org.androidannotations.annotations.ServiceAction;
4133
import org.androidannotations.helper.APTCodeModelHelper;
@@ -50,10 +42,8 @@
5042
import com.sun.codemodel.JFieldVar;
5143
import com.sun.codemodel.JInvocation;
5244
import com.sun.codemodel.JMethod;
53-
import com.sun.codemodel.JMod;
5445
import com.sun.codemodel.JPrimitiveType;
5546
import com.sun.codemodel.JType;
56-
import com.sun.codemodel.JTypeVar;
5747
import com.sun.codemodel.JVar;
5848

5949
public class ServiceActionProcessor implements DecoratingElementProcessor {
@@ -84,12 +74,8 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) {
8474
extraKey = methodName;
8575
}
8676

87-
String staticFieldName;
88-
if (methodName.startsWith("action")) {
89-
staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(methodName);
90-
} else {
91-
staticFieldName = CaseHelper.camelCaseToUpperSnakeCase("action_" + methodName);
92-
}
77+
String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase("action", methodName, null);
78+
9379
JFieldVar actionKeyField = holder.generatedClass.field(PUBLIC | STATIC | FINAL, classes.STRING, staticFieldName, lit(extraKey));
9480

9581
if (holder.onHandleIntentBody != null) {
@@ -108,7 +94,7 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) {
10894
List<? extends VariableElement> methodParameters = executableElement.getParameters();
10995
if (methodParameters.size() > 0) {
11096
if (holder.cast == null) {
111-
generateCastMethod(codeModel, holder);
97+
helper.addCastMethod(codeModel, holder);
11298
}
11399

114100
// Extras
@@ -169,53 +155,13 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) {
169155
// Extras params
170156
for (VariableElement param : methodParameters) {
171157
String paramName = param.getSimpleName().toString();
172-
String extraParamName = paramName + "Extra";
173158

174-
boolean castToSerializable = false;
175-
boolean castToParcelable = false;
176-
TypeMirror extraType = param.asType();
177-
if (extraType.getKind() == TypeKind.DECLARED) {
178-
Elements elementUtils = processingEnv.getElementUtils();
179-
Types typeUtils = processingEnv.getTypeUtils();
180-
TypeMirror parcelableType = elementUtils.getTypeElement(PARCELABLE).asType();
181-
if (!typeUtils.isSubtype(extraType, parcelableType)) {
182-
TypeMirror stringType = elementUtils.getTypeElement(STRING).asType();
183-
if (!typeUtils.isSubtype(extraType, stringType)) {
184-
castToSerializable = true;
185-
}
186-
} else {
187-
TypeMirror serializableType = elementUtils.getTypeElement(SERIALIZABLE).asType();
188-
if (typeUtils.isSubtype(extraType, serializableType)) {
189-
castToParcelable = true;
190-
}
191-
}
192-
}
193-
JClass paramClass = helper.typeMirrorToJClass(extraType, holder);
194-
JVar extraParam = method.param(paramClass, extraParamName);
195-
JInvocation invocation = body.invoke(holder.intentField, "putExtra").arg(paramName);
196-
if (castToSerializable) {
197-
invocation.arg(cast(classes.SERIALIZABLE, extraParam));
198-
} else if (castToParcelable) {
199-
invocation.arg(cast(classes.PARCELABLE, extraParam));
200-
} else {
201-
invocation.arg(extraParam);
202-
}
159+
helper.addIntentBuilderPutExtraMethod(codeModel, holder, helper, processingEnv, method, param.asType(), paramName, paramName);
203160
}
204161

205162
}
206163
body._return(JExpr._this());
207164
}
208165

209166
}
210-
211-
private void generateCastMethod(JCodeModel codeModel, EBeanHolder holder) {
212-
JType objectType = codeModel._ref(Object.class);
213-
JMethod method = holder.generatedClass.method(JMod.PRIVATE, objectType, "cast_");
214-
JTypeVar genericType = method.generify("T");
215-
method.type(genericType);
216-
JVar objectParam = method.param(objectType, "object");
217-
method.annotate(SuppressWarnings.class).param("value", "unchecked");
218-
method.body()._return(JExpr.cast(genericType, objectParam));
219-
holder.cast = method;
220-
}
221167
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.androidannotations.helper;
2+
3+
import junit.framework.Assert;
4+
5+
import org.junit.Test;
6+
7+
public class CaseHelperTest {
8+
9+
@Test
10+
public void testCamelCaseToUpperSnakeCaseString() throws Exception {
11+
Assert.assertEquals("CAMEL_CASE", CaseHelper.camelCaseToUpperSnakeCase("camelCase"));
12+
Assert.assertEquals("CAMEL_CASE", CaseHelper.camelCaseToUpperSnakeCase("camel_case"));
13+
Assert.assertEquals("CAMEL_CASE", CaseHelper.camelCaseToUpperSnakeCase("Camel_Case"));
14+
}
15+
16+
@Test
17+
public void testCamelCaseToUpperSnakeCaseStringStringString() throws Exception {
18+
Assert.assertEquals("CAMEL_CASE", CaseHelper.camelCaseToUpperSnakeCase(null, "camelCase", null));
19+
Assert.assertEquals("PREFIX_CAMEL_CASE", CaseHelper.camelCaseToUpperSnakeCase("prefix", "camelCase", null));
20+
Assert.assertEquals("PREFIX_CAMEL_CASE", CaseHelper.camelCaseToUpperSnakeCase("prefix", "prefixCamelCase", null));
21+
Assert.assertEquals("CAMEL_CASE_SUFFIX", CaseHelper.camelCaseToUpperSnakeCase(null, "camelCase", "suffix"));
22+
Assert.assertEquals("CAMEL_CASE_SUFFIX", CaseHelper.camelCaseToUpperSnakeCase(null, "camelCaseSuffix", "suffix"));
23+
Assert.assertEquals("PREFIX_CAMEL_CASE_SUFFIX", CaseHelper.camelCaseToUpperSnakeCase("prefix", "camelCase", "suffix"));
24+
}
25+
26+
}

0 commit comments

Comments
 (0)