Skip to content

Commit e7de065

Browse files
author
Drozdov Artyom
committed
fix: integrated with method generics params
1 parent ac5ada6 commit e7de065

3 files changed

Lines changed: 20 additions & 26 deletions

File tree

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

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
import javax.lang.model.element.Element;
2424
import javax.lang.model.element.ExecutableElement;
2525
import javax.lang.model.element.TypeElement;
26-
import javax.lang.model.element.TypeParameterElement;
2726
import javax.lang.model.element.VariableElement;
2827
import javax.lang.model.type.ArrayType;
2928
import javax.lang.model.type.DeclaredType;
3029
import javax.lang.model.type.ExecutableType;
3130
import javax.lang.model.type.TypeKind;
3231
import javax.lang.model.type.TypeMirror;
32+
import javax.lang.model.type.TypeVariable;
3333
import javax.lang.model.type.WildcardType;
3434
import javax.lang.model.util.ElementFilter;
3535
import javax.lang.model.util.Types;
@@ -123,15 +123,15 @@ public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, Gene
123123

124124
DeclaredType generatedClass = (DeclaredType) holder.getAnnotatedElement().asType();
125125
Types typeUtils = holder.processingEnvironment().getTypeUtils();
126-
ExecutableType generalisedElement = (ExecutableType) typeUtils.asMemberOf(generatedClass, executableElement);
126+
ExecutableType executableType = (ExecutableType) typeUtils.asMemberOf(generatedClass, executableElement);
127127

128128
String methodName = executableElement.getSimpleName().toString();
129-
JClass returnType = typeMirrorToJClass(generalisedElement.getReturnType(), holder);
129+
JClass returnType = typeMirrorToJClass(executableType.getReturnType(), holder);
130130

131131
List<Parameter> parameters = new ArrayList<Parameter>();
132132
for (int i = 0; i < executableElement.getParameters().size(); i++) {
133133
VariableElement parameter = executableElement.getParameters().get(i);
134-
TypeMirror parameterType = generalisedElement.getParameterTypes().get(i);
134+
TypeMirror parameterType = executableType.getParameterTypes().get(i);
135135

136136
String parameterName = parameter.getSimpleName().toString();
137137
JClass parameterClass = typeMirrorToJClass(parameterType, holder);
@@ -147,6 +147,13 @@ public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, Gene
147147
JMethod method = holder.getGeneratedClass().method(JMod.PUBLIC, returnType, methodName);
148148
method.annotate(Override.class);
149149

150+
System.out.println(executableType.getTypeVariables());
151+
for (TypeVariable typeParameter : executableType.getTypeVariables()) {
152+
TypeMirror bound = typeParameter.getUpperBound();
153+
JClass jClassBounds = typeMirrorToJClass(bound, holder);
154+
method.generify(typeParameter.toString(), jClassBounds);
155+
}
156+
150157
for (Parameter parameter : parameters) {
151158
method.param(JMod.FINAL, parameter.jClass, parameter.name);
152159
}
@@ -156,21 +163,6 @@ public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, Gene
156163
method._throws(thrownType);
157164
}
158165

159-
for (TypeParameterElement typeParameter : executableElement.getTypeParameters()) {
160-
List<? extends TypeMirror> bounds = typeParameter.getBounds();
161-
162-
JClass jClassBounds;
163-
if (bounds.isEmpty()) {
164-
jClassBounds = holder.classes().OBJECT;
165-
} else {
166-
// Currently Codemodel can't generate generics with multiple
167-
// classes like this <T extends Number & Serializable>.
168-
// So we only take the first class
169-
jClassBounds = typeMirrorToJClass(bounds.get(0), holder);
170-
}
171-
method.generify(typeParameter.toString(), jClassBounds);
172-
}
173-
174166
callSuperMethod(method, holder, method.body());
175167

176168
return method;

‎AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/ebean/SomeGenericBean.java‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.androidannotations.annotations.Background;
44
import org.androidannotations.annotations.EBean;
5+
import org.androidannotations.annotations.UiThread;
56

67
import java.util.List;
78

@@ -10,16 +11,18 @@ public class SomeGenericBean<T> {
1011

1112
@Background
1213
void someMethod(List<? super T> list){
13-
1414
}
1515

1616
void someOtherMethod(List<? super T> list){
17-
1817
}
1918

2019
@Background
21-
<N extends T> void someParameterizedMetnod(List<? super N> lst, List<? extends N> lst2) {
20+
<N extends T> void someParameterizedMethod(List<? super N> lst, List<? extends N> lst2) {
21+
}
2222

23+
@UiThread
24+
<T, S extends Number> void emptyUiMethod(List<? extends T> param, List<? super S> param2) {
2325
}
2426

27+
2528
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,9 @@
2626
@EActivity
2727
public class ActivityWithGenerics extends Activity {
2828

29-
// @UiThread
30-
// <T, S extends Number & List<String>> void emptyUiMethod(T param, S param2) {
31-
// // Not possible due to Codemodel's constraints
32-
// }
29+
//@UiThread
30+
//<T, S extends Number & List<String>> void emptyUiMethod(T param, S param2) {
31+
//}
3332

3433
@UiThread
3534
<T, S extends Number> void emptyUiMethod(List<? extends T> param, List<? super S> param2) {

0 commit comments

Comments
 (0)