Skip to content

Commit bac6374

Browse files
committed
Merge branch 'yDelouis-782_Fix_copyNonAAAnnotations' into develop
2 parents c098acb + aab5f20 commit bac6374

2 files changed

Lines changed: 88 additions & 18 deletions

File tree

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

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,57 @@
1515
*/
1616
package org.androidannotations.helper;
1717

18-
import com.sun.codemodel.*;
18+
import static com.sun.codemodel.JExpr._new;
19+
import static com.sun.codemodel.JExpr.lit;
20+
import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX;
21+
22+
import java.io.StringWriter;
23+
import java.lang.annotation.Annotation;
24+
import java.lang.reflect.Field;
25+
import java.util.ArrayList;
26+
import java.util.Collections;
27+
import java.util.HashMap;
28+
import java.util.LinkedHashMap;
29+
import java.util.List;
30+
import java.util.Map;
31+
32+
import javax.lang.model.element.AnnotationMirror;
33+
import javax.lang.model.element.AnnotationValue;
34+
import javax.lang.model.element.Element;
35+
import javax.lang.model.element.ExecutableElement;
36+
import javax.lang.model.element.TypeElement;
37+
import javax.lang.model.element.TypeParameterElement;
38+
import javax.lang.model.element.VariableElement;
39+
import javax.lang.model.type.ArrayType;
40+
import javax.lang.model.type.DeclaredType;
41+
import javax.lang.model.type.TypeKind;
42+
import javax.lang.model.type.TypeMirror;
43+
import javax.lang.model.type.WildcardType;
44+
import javax.lang.model.util.ElementFilter;
45+
import javax.lang.model.util.Types;
46+
1947
import org.androidannotations.annotations.EBean;
2048
import org.androidannotations.holder.EBeanHolder;
2149
import org.androidannotations.holder.EComponentHolder;
2250
import org.androidannotations.holder.GeneratedClassHolder;
2351

24-
import javax.lang.model.element.*;
25-
import javax.lang.model.type.*;
26-
import javax.lang.model.util.ElementFilter;
27-
import javax.lang.model.util.Types;
28-
import java.io.StringWriter;
29-
import java.lang.reflect.Field;
30-
import java.util.*;
31-
32-
import static com.sun.codemodel.JExpr._new;
33-
import static com.sun.codemodel.JExpr.lit;
34-
import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX;
52+
import com.sun.codemodel.JAnnotatable;
53+
import com.sun.codemodel.JAnnotationUse;
54+
import com.sun.codemodel.JBlock;
55+
import com.sun.codemodel.JClass;
56+
import com.sun.codemodel.JCodeModel;
57+
import com.sun.codemodel.JDefinedClass;
58+
import com.sun.codemodel.JExpr;
59+
import com.sun.codemodel.JExpression;
60+
import com.sun.codemodel.JFieldRef;
61+
import com.sun.codemodel.JFormatter;
62+
import com.sun.codemodel.JInvocation;
63+
import com.sun.codemodel.JMethod;
64+
import com.sun.codemodel.JMod;
65+
import com.sun.codemodel.JStatement;
66+
import com.sun.codemodel.JSuperWildcard;
67+
import com.sun.codemodel.JType;
68+
import com.sun.codemodel.JVar;
3569

3670
public class APTCodeModelHelper {
3771

@@ -157,9 +191,12 @@ public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, Gene
157191
String methodName = executableElement.getSimpleName().toString();
158192
JClass returnType = typeMirrorToJClass(executableElement.getReturnType(), holder, actualTypes);
159193
JMethod method = holder.getGeneratedClass().method(JMod.PUBLIC, returnType, methodName);
160-
method.annotate(Override.class);
161194
addNonAAAnotations(method, executableElement.getAnnotationMirrors(), holder);
162195

196+
if (!hasAnnotation(method, Override.class)) {
197+
method.annotate(Override.class);
198+
}
199+
163200
for (Map.Entry<String, JClass> typeDeclaration : methodTypes.entrySet()) {
164201
method.generify(typeDeclaration.getKey(), typeDeclaration.getValue());
165202
}
@@ -217,11 +254,31 @@ public void addNonAAAnotations(JAnnotatable annotatable, List<? extends Annotati
217254
public void addAnnotation(JAnnotatable annotatable, AnnotationMirror annotationMirror, GeneratedClassHolder holder) {
218255
Map<? extends ExecutableElement, ? extends AnnotationValue> parameters = annotationMirror.getElementValues();
219256

220-
JAnnotationUse annotate = annotatable.annotate(typeMirrorToJClass(annotationMirror.getAnnotationType(), holder));
257+
if (!hasAnnotation(annotatable, annotationMirror)) {
258+
JClass annotation = typeMirrorToJClass(annotationMirror.getAnnotationType(), holder);
259+
JAnnotationUse annotate = annotatable.annotate(annotation);
260+
261+
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> param : parameters.entrySet()) {
262+
param.getValue().accept(new AnnotationParamExtractor(annotate, holder, this), param.getKey().getSimpleName().toString());
263+
}
264+
}
265+
}
266+
267+
private boolean hasAnnotation(JAnnotatable annotatable, AnnotationMirror annotationMirror) {
268+
return hasAnnotation(annotatable, annotationMirror.getAnnotationType().toString());
269+
}
221270

222-
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> param : parameters.entrySet()) {
223-
param.getValue().accept(new AnnotationParamExtractor(annotate, holder, this), param.getKey().getSimpleName().toString());
271+
private boolean hasAnnotation(JAnnotatable annotatable, Class<? extends Annotation> annotationClass) {
272+
return hasAnnotation(annotatable, annotationClass.getCanonicalName());
273+
}
274+
275+
private boolean hasAnnotation(JAnnotatable annotatable, String annotationFQN) {
276+
for (JAnnotationUse annotation : annotatable.annotations()) {
277+
if (annotation.getAnnotationClass().fullName().equals(annotationFQN)) {
278+
return true;
279+
}
224280
}
281+
return false;
225282
}
226283

227284
public void callSuperMethod(JMethod superMethod, GeneratedClassHolder holder, JBlock callBlock) {
@@ -339,7 +396,7 @@ public JDefinedClass createDelegatingAnonymousRunnableClass(EComponentHolder hol
339396
/**
340397
* Gets all of the methods of the class and includes the methods of any
341398
* implemented interfaces.
342-
*
399+
*
343400
* @param typeElement
344401
* @return full list of methods.
345402
*/

‎AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/OthersAnnotations.java‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.androidannotations.test15;
1717

18+
import android.os.Parcel;
19+
import android.os.Parcelable;
1820
import com.squareup.otto.Produce;
1921
import com.squareup.otto.Subscribe;
2022
import com.test.ComplexAnnotation;
@@ -33,7 +35,7 @@
3335
@Nullable
3436
@TestTargetClass(String.class)
3537
@ComplexAnnotation(value = @SimpleAnnotation("1"), array = {@SimpleAnnotation("2"), @SimpleAnnotation("3")})
36-
public class OthersAnnotations {
38+
public class OthersAnnotations implements Parcelable {
3739

3840
@Trace
3941
@Background
@@ -51,5 +53,16 @@ public Event produceEvent() {
5153
return new Event();
5254
}
5355

56+
@Override
57+
public int describeContents() {
58+
return 0;
59+
}
60+
61+
@Override
62+
@Background
63+
public void writeToParcel(Parcel parcel, int i) {
64+
65+
}
66+
5467
public static class Event {}
5568
}

0 commit comments

Comments
 (0)