Skip to content

Commit dc0c5f7

Browse files
committed
allow to inject context into @rootcontext annotated method
1 parent bd8f4c1 commit dc0c5f7

2 files changed

Lines changed: 33 additions & 17 deletions

File tree

  • AndroidAnnotations/androidannotations-core

‎AndroidAnnotations/androidannotations-core/androidannotations-api/src/main/java/org/androidannotations/annotations/RootContext.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,6 @@
5959
* </blockquote>
6060
*/
6161
@Retention(RetentionPolicy.CLASS)
62-
@Target(ElementType.FIELD)
62+
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
6363
public @interface RootContext {
6464
}

‎AndroidAnnotations/androidannotations-core/androidannotations/src/main/java/org/androidannotations/internal/core/handler/RootContextHandler.java‎

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import static com.helger.jcodemodel.JExpr.cast;
1919
import static com.helger.jcodemodel.JExpr.lit;
20-
import static com.helger.jcodemodel.JExpr.ref;
2120

2221
import javax.lang.model.element.Element;
2322
import javax.lang.model.type.TypeMirror;
@@ -26,55 +25,72 @@
2625
import org.androidannotations.ElementValidation;
2726
import org.androidannotations.annotations.RootContext;
2827
import org.androidannotations.handler.BaseAnnotationHandler;
28+
import org.androidannotations.handler.MethodInjectionHandler;
2929
import org.androidannotations.helper.CanonicalNameConstants;
30+
import org.androidannotations.helper.InjectHelper;
3031
import org.androidannotations.holder.EBeanHolder;
3132

3233
import com.helger.jcodemodel.AbstractJClass;
34+
import com.helger.jcodemodel.IJAssignmentTarget;
3335
import com.helger.jcodemodel.IJExpression;
3436
import com.helger.jcodemodel.JBlock;
3537
import com.helger.jcodemodel.JConditional;
3638
import com.helger.jcodemodel.JInvocation;
3739

38-
public class RootContextHandler extends BaseAnnotationHandler<EBeanHolder> {
40+
public class RootContextHandler extends BaseAnnotationHandler<EBeanHolder>implements MethodInjectionHandler<EBeanHolder> {
41+
42+
private final InjectHelper<EBeanHolder> injectHelper;
3943

4044
public RootContextHandler(AndroidAnnotationsEnvironment environment) {
4145
super(RootContext.class, environment);
46+
injectHelper = new InjectHelper<>(validatorHelper, this);
4247
}
4348

4449
@Override
4550
public void validate(Element element, ElementValidation validation) {
46-
validatorHelper.enclosingElementHasEBeanAnnotation(element, validation);
51+
injectHelper.validate(RootContext.class, element, validation);
4752

48-
validatorHelper.extendsContext(element, validation);
53+
Element param = injectHelper.getParam(element);
54+
validatorHelper.extendsContext(param, validation);
4955

5056
validatorHelper.isNotPrivate(element, validation);
5157
}
5258

5359
@Override
5460
public void process(Element element, EBeanHolder holder) {
55-
String fieldName = element.getSimpleName().toString();
61+
injectHelper.process(element, holder);
62+
}
63+
64+
@Override
65+
public JBlock getInvocationBlock(EBeanHolder holder) {
66+
return holder.getInitBodyInjectionBlock();
67+
}
5668

57-
TypeMirror elementType = element.asType();
69+
@Override
70+
public void assignValue(JBlock targetBlock, IJAssignmentTarget fieldRef, EBeanHolder holder, Element element, Element param) {
71+
TypeMirror elementType = param.asType();
5872
String typeQualifiedName = elementType.toString();
5973

60-
JBlock body = holder.getInitBodyInjectionBlock();
6174
IJExpression contextRef = holder.getContextRef();
6275

6376
if (CanonicalNameConstants.CONTEXT.equals(typeQualifiedName)) {
64-
body.assign(ref(fieldName), contextRef);
77+
targetBlock.add(fieldRef.assign(contextRef));
6578
} else {
6679
AbstractJClass extendingContextClass = getEnvironment().getJClass(typeQualifiedName);
67-
JConditional cond = body._if(holder.getContextRef()._instanceof(extendingContextClass));
68-
cond._then() //
69-
.assign(ref(fieldName), cast(extendingContextClass, holder.getContextRef()));
80+
81+
JConditional cond = getInvocationBlock(holder)._if(holder.getContextRef()._instanceof(extendingContextClass));
82+
cond._then().add(fieldRef.assign(cast(extendingContextClass, holder.getContextRef())));
7083

7184
JInvocation warningInvoke = getClasses().LOG.staticInvoke("w");
7285
warningInvoke.arg(holder.getGeneratedClass().name());
73-
IJExpression expr = lit("Due to Context class ").plus(holder.getContextRef().invoke("getClass").invoke("getSimpleName")).plus(
74-
lit(", the @RootContext " + extendingContextClass.name() + " won't be populated"));
75-
warningInvoke.arg(expr);
76-
cond._else() //
77-
.add(warningInvoke);
86+
warningInvoke.arg(lit("Due to Context class ").plus(holder.getContextRef().invoke("getClass").invoke("getSimpleName"))
87+
.plus(lit(", the @RootContext " + extendingContextClass.name() + " won't be populated")));
88+
cond._else().add(warningInvoke);
7889
}
7990
}
91+
92+
@Override
93+
public void validateEnclosingElement(Element element, ElementValidation valid) {
94+
validatorHelper.enclosingElementHasEBeanAnnotation(element, valid);
95+
}
8096
}

0 commit comments

Comments
 (0)