Skip to content

Commit eb80ac3

Browse files
author
Drozdov Artyom
committed
fix: case for parametrized bean with type bounds, added tests for such cases
1 parent 993a680 commit eb80ac3

9 files changed

Lines changed: 84 additions & 25 deletions

File tree

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

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder) {
6262
return typeMirrorToJClass(type, holder, Collections.<String, TypeMirror>emptyMap());
6363
}
6464

65-
public JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder, Map<String, TypeMirror> substitute) {
65+
private JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder, Map<String, TypeMirror> substitute) {
6666

6767
if (type instanceof DeclaredType) {
6868
DeclaredType declaredType = (DeclaredType) type;
@@ -109,7 +109,7 @@ public JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder, M
109109
return refClass.array();
110110
} else {
111111
TypeMirror substituted = substitute.get(type.toString());
112-
if (substituted != null) {
112+
if (substituted != null && type != substituted) {
113113
return typeMirrorToJClass(substituted, holder, substitute);
114114
}
115115
return holder.refClass(type.toString());
@@ -130,9 +130,9 @@ public Parameter(String name, JClass jClass) {
130130
}
131131
}
132132

133-
private Map<String, TypeMirror> getActualTypes(Types typeUtils, DeclaredType baseClass, TypeMirror actualClass) {
133+
private Map<String, TypeMirror> getActualTypes(Types typeUtils, DeclaredType baseClass, TypeMirror annotatedClass) {
134134
List<TypeMirror> superTypes = new ArrayList<TypeMirror>();
135-
superTypes.add(actualClass);
135+
superTypes.add(annotatedClass);
136136
while(!superTypes.isEmpty()) {
137137
TypeMirror x = superTypes.remove(0);
138138
if (typeUtils.isSameType(typeUtils.erasure(x), typeUtils.erasure(baseClass))) {
@@ -152,24 +152,31 @@ private Map<String, TypeMirror> getActualTypes(Types typeUtils, DeclaredType bas
152152
return Collections.emptyMap();
153153
}
154154

155+
public JClass typeBoundsToJClass(GeneratedClassHolder holder, List<? extends TypeMirror> bounds) {
156+
return typeBoundsToJClass(holder, bounds, Collections.<String, TypeMirror>emptyMap());
157+
}
158+
159+
private JClass typeBoundsToJClass(GeneratedClassHolder holder, List<? extends TypeMirror> bounds, Map<String, TypeMirror> actualTypes) {
160+
if (bounds.isEmpty()) {
161+
return holder.classes().OBJECT;
162+
} else {
163+
//TODO resolve <T extends A&B> bounds
164+
return typeMirrorToJClass(bounds.get(0), holder, actualTypes);
165+
}
166+
}
167+
155168
public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, GeneratedClassHolder holder) {
156-
TypeMirror generatedClass = holder.getAnnotatedElement().asType();
157-
DeclaredType originalClass = (DeclaredType) executableElement.getEnclosingElement().asType();
169+
TypeMirror annotatedClass = holder.getAnnotatedElement().asType();
170+
DeclaredType baseClass = (DeclaredType) executableElement.getEnclosingElement().asType();
158171

159172
Types typeUtils = holder.processingEnvironment().getTypeUtils();
160173

161-
Map<String, TypeMirror> actualTypes = getActualTypes(typeUtils, originalClass, generatedClass);
174+
Map<String, TypeMirror> actualTypes = getActualTypes(typeUtils, baseClass, annotatedClass);
162175
Map<String, JClass> methodTypes = new LinkedHashMap<String, JClass>();
163176

164177
for (TypeParameterElement typeParameter : executableElement.getTypeParameters()) {
165178
List<? extends TypeMirror> bounds = typeParameter.getBounds();
166-
JClass jClassBounds;
167-
if (bounds.isEmpty()) {
168-
jClassBounds = holder.classes().OBJECT;
169-
} else {
170-
//TODO resolve <T extends A&B> bounds
171-
jClassBounds = typeMirrorToJClass(bounds.get(0), holder, actualTypes);
172-
}
179+
JClass jClassBounds = typeBoundsToJClass(holder, bounds, actualTypes);
173180
methodTypes.put(typeParameter.toString(), jClassBounds);
174181
}
175182

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@
2424
import javax.lang.model.util.Elements;
2525
import javax.lang.model.util.Types;
2626

27+
import org.androidannotations.helper.APTCodeModelHelper;
2728
import org.androidannotations.helper.ModelConstants;
29+
import org.androidannotations.logger.Logger;
30+
import org.androidannotations.logger.LoggerFactory;
2831
import org.androidannotations.process.ProcessHolder;
2932

3033
import com.sun.codemodel.ClassType;
@@ -37,10 +40,12 @@ public abstract class BaseGeneratedClassHolder implements GeneratedClassHolder {
3740
protected final ProcessHolder processHolder;
3841
protected JDefinedClass generatedClass;
3942
protected final TypeElement annotatedElement;
43+
protected final APTCodeModelHelper codeModelHelper;
4044

4145
public BaseGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception {
4246
this.processHolder = processHolder;
4347
this.annotatedElement = annotatedElement;
48+
this.codeModelHelper = new APTCodeModelHelper();
4449
setGeneratedClass();
4550
}
4651

@@ -51,7 +56,8 @@ protected void setGeneratedClass() throws Exception {
5156

5257
generatedClass = codeModel()._class(PUBLIC | FINAL, subComponentQualifiedName, ClassType.CLASS);
5358
for (TypeParameterElement typeParam : annotatedElement.getTypeParameters()) {
54-
generatedClass.generify(typeParam.getSimpleName().toString());
59+
JClass bound = codeModelHelper.typeBoundsToJClass(this, typeParam.getBounds());
60+
generatedClass.generify(typeParam.getSimpleName().toString(), bound);
5561
}
5662
generatedClass._extends(annotatedComponent);
5763
}

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EComponentWithViewSupportHolder.java‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.androidannotations.api.view.HasViews;
3333
import org.androidannotations.api.view.OnViewChangedListener;
3434
import org.androidannotations.api.view.OnViewChangedNotifier;
35-
import org.androidannotations.helper.APTCodeModelHelper;
3635
import org.androidannotations.helper.ViewNotifierHelper;
3736
import org.androidannotations.process.ProcessHolder;
3837

@@ -47,7 +46,6 @@
4746

4847
public abstract class EComponentWithViewSupportHolder extends EComponentHolder {
4948

50-
private APTCodeModelHelper codeModelHelper;
5149
protected ViewNotifierHelper viewNotifierHelper;
5250
private JBlock onViewChangedBody;
5351
private JVar onViewChangedHasViewsParam;
@@ -60,7 +58,6 @@ public abstract class EComponentWithViewSupportHolder extends EComponentHolder {
6058

6159
public EComponentWithViewSupportHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception {
6260
super(processHolder, annotatedElement);
63-
codeModelHelper = new APTCodeModelHelper();
6461
viewNotifierHelper = new ViewNotifierHelper(this);
6562
}
6663

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EIntentServiceHolder.java‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import javax.lang.model.element.TypeElement;
2121

22-
import org.androidannotations.helper.APTCodeModelHelper;
2322
import org.androidannotations.helper.AndroidManifest;
2423
import org.androidannotations.process.ProcessHolder;
2524

@@ -31,8 +30,6 @@
3130

3231
public class EIntentServiceHolder extends EServiceHolder {
3332

34-
private APTCodeModelHelper codeModelHelper = new APTCodeModelHelper();
35-
3633
private JVar onHandleIntentIntent;
3734
private JMethod onHandleIntentMethod;
3835
private JBlock onHandleIntentBody;

‎AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import javax.lang.model.type.TypeKind;
3030

3131
import org.androidannotations.api.rest.RestErrorHandler;
32-
import org.androidannotations.helper.APTCodeModelHelper;
3332
import org.androidannotations.helper.CanonicalNameConstants;
3433
import org.androidannotations.helper.ModelConstants;
3534
import org.androidannotations.process.ProcessHolder;
@@ -44,8 +43,6 @@
4443

4544
public class RestHolder extends BaseGeneratedClassHolder {
4645

47-
private APTCodeModelHelper codeModelHelper;
48-
4946
private JMethod init;
5047
private JFieldVar rootUrlField;
5148
private JFieldVar restTemplateField;
@@ -56,7 +53,6 @@ public class RestHolder extends BaseGeneratedClassHolder {
5653

5754
public RestHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception {
5855
super(processHolder, annotatedElement);
59-
codeModelHelper = new APTCodeModelHelper();
6056
implementMethods();
6157
}
6258

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.androidannotations.test15.ebean;
2+
3+
import com.squareup.otto.Produce;
4+
5+
import org.androidannotations.annotations.Background;
6+
import org.androidannotations.annotations.EBean;
7+
import org.androidannotations.annotations.UiThread;
8+
9+
import java.util.List;
10+
11+
@EBean
12+
public class SubtypedGenericBean<S extends List<T>, T extends Number> {
13+
14+
@Background
15+
void backgroundMethod(T param, S param2) {
16+
17+
}
18+
19+
@Produce
20+
public T genericMethod() {
21+
return null;
22+
}
23+
24+
@UiThread
25+
<S extends List<T>> void uiMethod(S method) {
26+
27+
}
28+
29+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.androidannotations.test15.ebean;
2+
3+
import org.androidannotations.annotations.EBean;
4+
5+
import java.util.List;
6+
7+
@EBean
8+
public class SubtypedGenericBeanExt<S extends List<Integer>> extends SubtypedGenericBean<S, Integer> {
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.androidannotations.test15.ebean;
2+
3+
import org.androidannotations.annotations.EBean;
4+
5+
import java.util.List;
6+
7+
@EBean
8+
public class SubtypedGenericBeanExt2 extends SubtypedGenericBean<List<Double>, Double> {
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.androidannotations.test15.ebean;
2+
3+
import org.androidannotations.annotations.EBean;
4+
5+
import java.util.ArrayList;
6+
7+
@EBean
8+
public class SubtypedGenericBeanExtExt extends SubtypedGenericBeanExt<ArrayList<Integer>> {
9+
}

0 commit comments

Comments
 (0)