From d0fd08ab7dd6e27234314194323097165b209f70 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Ricau Date: Mon, 22 Oct 2012 09:30:56 +0200 Subject: [PATCH] Allowing context constructors for @EBean. #347 --- .../helper/ValidatorHelper.java | 27 +++++++++++++++++++ .../processing/EBeanProcessor.java | 11 ++++++++ .../validation/EBeanValidator.java | 2 +- .../test15/ebean/SomeArrayAdapter.java | 15 +++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 AndroidAnnotations/functional-test-1-5/src/main/java/com/googlecode/androidannotations/test15/ebean/SomeArrayAdapter.java diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java index a71ba92e59..e5d53a3749 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java @@ -961,6 +961,33 @@ public void notAlreadyValidated(Element element, AnnotationElements validatedEle } } + public void hasEmptyOrContextConstructor(Element element, IsValid valid) { + List constructors = ElementFilter.constructorsIn(element.getEnclosedElements()); + + if (constructors.size() == 1) { + ExecutableElement constructor = constructors.get(0); + + if (!annotationHelper.isPrivate(constructor)) { + if (constructor.getParameters().size() > 1) { + annotationHelper.printAnnotationError(element, "%s annotated element should have a constructor with one parameter max, of type " + CanonicalNameConstants.CONTEXT); + valid.invalidate(); + } else if (constructor.getParameters().size() == 1) { + VariableElement parameter = constructor.getParameters().get(0); + if (!parameter.asType().toString().equals(CanonicalNameConstants.CONTEXT)) { + annotationHelper.printAnnotationError(element, "%s annotated element should have a constructor with one parameter max, of type " + CanonicalNameConstants.CONTEXT); + valid.invalidate(); + } + } + } else { + annotationHelper.printAnnotationError(element, "%s annotated element should not have a private constructor"); + valid.invalidate(); + } + } else { + annotationHelper.printAnnotationError(element, "%s annotated element should have only one constructor"); + valid.invalidate(); + } + } + public void hasEmptyConstructor(Element element, IsValid valid) { List constructors = ElementFilter.constructorsIn(element.getEnclosedElements()); diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeanProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeanProcessor.java index bc2d596f5f..fa2fe8edc2 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeanProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeanProcessor.java @@ -25,9 +25,12 @@ import static com.sun.codemodel.JMod.STATIC; import java.lang.annotation.Annotation; +import java.util.List; import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; +import javax.lang.model.util.ElementFilter; import com.googlecode.androidannotations.annotations.EBean; import com.googlecode.androidannotations.api.Scope; @@ -125,6 +128,14 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo JBlock constructorBody = constructor.body(); + List constructors = ElementFilter.constructorsIn(element.getEnclosedElements()); + + ExecutableElement superConstructor = constructors.get(0); + + if (superConstructor.getParameters().size() == 1) { + constructorBody.invoke("super").arg(constructorContextParam); + } + constructorBody.assign(contextField, constructorContextParam); constructorBody.invoke(holder.init); diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/validation/EBeanValidator.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/validation/EBeanValidator.java index 138e2d7ac3..e9ff132594 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/validation/EBeanValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/validation/EBeanValidator.java @@ -48,7 +48,7 @@ public boolean validate(Element element, AnnotationElements validatedElements) { validatorHelper.isNotPrivate(element, valid); - validatorHelper.hasEmptyConstructor(element, valid); + validatorHelper.hasEmptyOrContextConstructor(element, valid); return valid.isValid(); } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/com/googlecode/androidannotations/test15/ebean/SomeArrayAdapter.java b/AndroidAnnotations/functional-test-1-5/src/main/java/com/googlecode/androidannotations/test15/ebean/SomeArrayAdapter.java new file mode 100644 index 0000000000..bc0b8b99e9 --- /dev/null +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/com/googlecode/androidannotations/test15/ebean/SomeArrayAdapter.java @@ -0,0 +1,15 @@ +package com.googlecode.androidannotations.test15.ebean; + +import android.content.Context; +import android.widget.ArrayAdapter; + +import com.googlecode.androidannotations.annotations.EBean; + +@EBean +public class SomeArrayAdapter extends ArrayAdapter { + + public SomeArrayAdapter(Context context) { + super(context, android.R.layout.simple_list_item_1); + } + +}