2727import javax .lang .model .element .VariableElement ;
2828import javax .lang .model .type .ArrayType ;
2929import javax .lang .model .type .DeclaredType ;
30+ import javax .lang .model .type .ExecutableType ;
3031import javax .lang .model .type .TypeKind ;
3132import javax .lang .model .type .TypeMirror ;
3233import javax .lang .model .type .WildcardType ;
3334import javax .lang .model .util .ElementFilter ;
35+ import javax .lang .model .util .Types ;
3436
3537import org .androidannotations .holder .EComponentHolder ;
3638import org .androidannotations .holder .GeneratedClassHolder ;
4749import com .sun .codemodel .JMethod ;
4850import com .sun .codemodel .JMod ;
4951import com .sun .codemodel .JStatement ;
52+ import com .sun .codemodel .JSuperWildcard ;
5053import com .sun .codemodel .JType ;
5154import com .sun .codemodel .JVar ;
5255
@@ -73,12 +76,17 @@ public JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder) {
7376
7477 return declaredClass ;
7578 } else if (type instanceof WildcardType ) {
76- // TODO : At his time (01/2013), it is not possible to handle the
77- // super bound because code model does not offer a way to model
78- // statement like " ? super X"
79- // (see http://java.net/jira/browse/CODEMODEL-11)
8079 WildcardType wildcardType = (WildcardType ) type ;
8180
81+ TypeMirror bound = wildcardType .getExtendsBound ();
82+ if (bound == null ) {
83+ bound = wildcardType .getSuperBound ();
84+ if (bound == null ) {
85+ throw new IllegalArgumentException ("There are should be 'extends' or 'super' in the wildcard" );
86+ }
87+ return superWildcard (typeMirrorToJClass (bound , holder ));
88+ }
89+
8290 TypeMirror extendsBound = wildcardType .getExtendsBound ();
8391
8492 if (extendsBound == null ) {
@@ -97,6 +105,10 @@ public JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder) {
97105 }
98106 }
99107
108+ private JClass superWildcard (final JClass bound ) {
109+ return new JSuperWildcard (bound );
110+ }
111+
100112 public static class Parameter {
101113 public final String name ;
102114 public final JClass jClass ;
@@ -109,13 +121,20 @@ public Parameter(String name, JClass jClass) {
109121
110122 public JMethod overrideAnnotatedMethod (ExecutableElement executableElement , GeneratedClassHolder holder ) {
111123
124+ DeclaredType generatedClass = (DeclaredType ) holder .getAnnotatedElement ().asType ();
125+ Types typeUtils = holder .processingEnvironment ().getTypeUtils ();
126+ ExecutableType generalisedElement = (ExecutableType ) typeUtils .asMemberOf (generatedClass , executableElement );
127+
112128 String methodName = executableElement .getSimpleName ().toString ();
113- JClass returnType = typeMirrorToJClass (executableElement .getReturnType (), holder );
129+ JClass returnType = typeMirrorToJClass (generalisedElement .getReturnType (), holder );
114130
115131 List <Parameter > parameters = new ArrayList <Parameter >();
116- for (VariableElement parameter : executableElement .getParameters ()) {
117- String parameterName = parameter .getSimpleName ().toString ();
118- JClass parameterClass = typeMirrorToJClass (parameter .asType (), holder );
132+ for (int i = 0 ; i < executableElement .getParameters ().size (); i ++) {
133+ VariableElement parameter = executableElement .getParameters ().get (i );
134+ TypeMirror parameterType = generalisedElement .getParameterTypes ().get (i );
135+
136+ String parameterName = parameter .getSimpleName ().toString ();
137+ JClass parameterClass = typeMirrorToJClass (parameterType , holder );
119138 parameters .add (new Parameter (parameterName , parameterClass ));
120139 }
121140
@@ -128,11 +147,9 @@ public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, Gene
128147 JMethod method = holder .getGeneratedClass ().method (JMod .PUBLIC , returnType , methodName );
129148 method .annotate (Override .class );
130149
131- for (VariableElement parameter : executableElement .getParameters ()) {
132- String parameterName = parameter .getSimpleName ().toString ();
133- JClass parameterClass = typeMirrorToJClass (parameter .asType (), holder );
134- method .param (JMod .FINAL , parameterClass , parameterName );
135- }
150+ for (Parameter parameter : parameters ) {
151+ method .param (JMod .FINAL , parameter .jClass , parameter .name );
152+ }
136153
137154 for (TypeMirror superThrownType : executableElement .getThrownTypes ()) {
138155 JClass thrownType = typeMirrorToJClass (superThrownType , holder );
0 commit comments