diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java index 90ff0726f1..06f48bd10b 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java @@ -18,6 +18,7 @@ import com.sun.codemodel.*; import org.androidannotations.annotations.CheckedChange; +import org.androidannotations.helper.CanonicalNameConstants; import org.androidannotations.holder.EComponentWithViewSupportHolder; import org.androidannotations.model.AnnotationElements; import org.androidannotations.process.IsValid; @@ -26,6 +27,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import java.util.List; @@ -43,7 +45,11 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa ExecutableElement executableElement = (ExecutableElement) element; validatorHelper.returnTypeIsVoid(executableElement, valid); - validatorHelper.param.hasZeroOrOneCompoundButtonOrTwoCompoundButtonBooleanParameters(executableElement, valid); + validatorHelper.param.hasZeroOrOneCompoundButtonParameter(executableElement, valid); + + validatorHelper.param.hasZeroOrOneBooleanParameter(executableElement, valid); + + validatorHelper.param.hasNoOtherParameterThanCompoundButtonOrBoolean(executableElement, valid); } @Override @@ -55,14 +61,14 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror protected void processParameters(EComponentWithViewSupportHolder holder, JMethod listenerMethod, JInvocation call, List parameters) { JVar btnParam = listenerMethod.param(classes().COMPOUND_BUTTON, "buttonView"); JVar isCheckedParam = listenerMethod.param(codeModel().BOOLEAN, "isChecked"); - boolean isCheckedParamExists = parameters.size() == 2; - boolean btnParamExists = parameters.size() >= 1; - if (btnParamExists) { - call.arg(btnParam); - } - if (isCheckedParamExists) { - call.arg(isCheckedParam); + for (VariableElement parameter : parameters) { + String parameterType = parameter.asType().toString(); + if (parameterType.equals(CanonicalNameConstants.COMPOUND_BUTTON)) { + call.arg(btnParam); + } else if (parameterType.equals(CanonicalNameConstants.BOOLEAN) || parameter.asType().getKind() == TypeKind.BOOLEAN) { + call.arg(isCheckedParam); + } } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java index d61daf68c8..acaeee9cbb 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java @@ -15,18 +15,20 @@ */ package org.androidannotations.handler; -import java.util.List; +import org.androidannotations.annotations.FocusChange; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; +import java.util.List; -import org.androidannotations.annotations.FocusChange; import org.androidannotations.holder.EComponentWithViewSupportHolder; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -50,7 +52,11 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa validatorHelper.returnTypeIsVoid(executableElement, valid); - validatorHelper.param.hasZeroOrOneViewOrTwoViewBooleanParameters(executableElement, valid); + validatorHelper.param.hasZeroOrOneViewParameter(executableElement, valid); + + validatorHelper.param.hasZeroOrOneBooleanParameter(executableElement, valid); + + validatorHelper.param.hasNoOtherParameterThanViewOrBoolean(executableElement, valid); } @Override @@ -62,14 +68,14 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror protected void processParameters(EComponentWithViewSupportHolder holder, JMethod listenerMethod, JInvocation call, List parameters) { JVar viewParam = listenerMethod.param(classes().VIEW, "view"); JVar hasFocusParam = listenerMethod.param(codeModel().BOOLEAN, "hasFocus"); - boolean hasFocusParamExists = parameters.size() == 2; - boolean viewParamExists = parameters.size() >= 1; - if (viewParamExists) { - call.arg(viewParam); - } - if (hasFocusParamExists) { - call.arg(hasFocusParam); + for (VariableElement parameter : parameters) { + String parameterType = parameter.asType().toString(); + if (parameterType.equals(CanonicalNameConstants.VIEW)) { + call.arg(viewParam); + } else if (parameterType.equals(CanonicalNameConstants.BOOLEAN) || parameter.asType().getKind() == TypeKind.BOOLEAN) { + call.arg(hasFocusParam); + } } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java index 15b1e8779a..42f9755fc4 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java @@ -15,7 +15,12 @@ */ package org.androidannotations.handler; -import java.util.List; +import com.sun.codemodel.*; +import org.androidannotations.annotations.Touch; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; @@ -23,21 +28,7 @@ import javax.lang.model.element.VariableElement; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.Touch; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.holder.EComponentWithViewSupportHolder; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.process.IsValid; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; +import java.util.List; public class TouchHandler extends AbstractListenerHandler { @@ -53,7 +44,11 @@ public void validate(Element element, AnnotationElements validatedElements, IsVa validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); - validatorHelper.param.hasOneMotionEventOrTwoMotionEventViewParameters(executableElement, valid); + validatorHelper.param.hasZeroOrOneMotionEventParameter(executableElement, valid); + + validatorHelper.param.hasZeroOrOneViewParameter(executableElement, valid); + + validatorHelper.param.hasNoOtherParameterThanMotionEventOrView(executableElement, valid); } @Override @@ -72,21 +67,12 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror protected void processParameters(EComponentWithViewSupportHolder holder, JMethod listenerMethod, JInvocation call, List parameters) { JVar viewParam = listenerMethod.param(classes().VIEW, "view"); JVar eventParam = listenerMethod.param(classes().MOTION_EVENT, "event"); - boolean hasItemParameter = parameters.size() == 2; - VariableElement first = parameters.get(0); - String firstType = first.asType().toString(); - if (firstType.equals(CanonicalNameConstants.MOTION_EVENT)) { - call.arg(eventParam); - } else { - call.arg(viewParam); - } - if (hasItemParameter) { - VariableElement second = parameters.get(1); - String secondType = second.asType().toString(); - if (secondType.equals(CanonicalNameConstants.MOTION_EVENT)) { + for (VariableElement parameter : parameters) { + String parameterType = parameter.asType().toString(); + if (parameterType.equals(CanonicalNameConstants.MOTION_EVENT)) { call.arg(eventParam); - } else { + } else if (parameterType.equals(CanonicalNameConstants.VIEW)) { call.arg(viewParam); } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java index 716c6d03a2..b611ae0b8a 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java @@ -23,6 +23,7 @@ import javax.lang.model.type.TypeMirror; import java.util.Arrays; import java.util.List; +import java.util.Collection; import static java.util.Arrays.asList; @@ -110,82 +111,71 @@ public void hasOneOrTwoParametersAndFirstIsBoolean(ExecutableElement executableE } } - public void hasZeroOrOneViewOrTwoViewBooleanParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); + public void hasZeroOrOneCompoundButtonParameter(ExecutableElement executableElement, IsValid valid) { + hasZeroOrOneParameterOfType(CanonicalNameConstants.COMPOUND_BUTTON, executableElement, valid); + } - if (parameters.size() == 0) { - return; - } else if (parameters.size() > 2) { - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "%s can only be used on a method with 0 or 1(View) or 2(View, boolean) parameter, instead of " + parameters.size()); - } else { - VariableElement firstParameter = parameters.get(0); - String firstParameterType = firstParameter.asType().toString(); - if (!firstParameterType.equals(CanonicalNameConstants.VIEW)) { - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "the first parameter must be a " + CanonicalNameConstants.VIEW + ", not a " + firstParameterType); - } - if (parameters.size() == 2) { - VariableElement secondParameter = parameters.get(1); - String secondParameterType = secondParameter.asType().toString(); - if (!secondParameterType.equals(CanonicalNameConstants.BOOLEAN) && !secondParameterType.equals("boolean")) { + public void hasZeroOrOneBooleanParameter(ExecutableElement executableElement, IsValid valid) { + hasZeroOrOneParameterOfPrimitiveType(CanonicalNameConstants.BOOLEAN, TypeKind.BOOLEAN, executableElement, valid); + } + + public void hasZeroOrOneMotionEventParameter(ExecutableElement executableElement, IsValid valid) { + hasZeroOrOneParameterOfType(CanonicalNameConstants.MOTION_EVENT, executableElement, valid); + } + + public void hasZeroOrOneViewParameter(ExecutableElement executableElement, IsValid valid) { + hasZeroOrOneParameterOfType(CanonicalNameConstants.VIEW, executableElement, valid); + } + + private void hasZeroOrOneParameterOfType(String typeCanonicalName, ExecutableElement executableElement, IsValid valid) { + boolean parameterOfTypeFound = false; + for (VariableElement parameter : executableElement.getParameters()) { + String parameterType = parameter.asType().toString(); + if (parameterType.equals(typeCanonicalName)) { + if (parameterOfTypeFound) { + annotationHelper.printAnnotationError(executableElement, "You can declare only one parameter of type "+typeCanonicalName); valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "the second parameter must be a " + CanonicalNameConstants.BOOLEAN + " or boolean, not a " + secondParameterType); } + parameterOfTypeFound = true; } } } - public void hasZeroOrOneCompoundButtonOrTwoCompoundButtonBooleanParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); - - if (parameters.size() == 0) { - return; - } else if (parameters.size() > 2) { - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "%s can only be used on a method with 0 or 1(CompoundButton) or 2(CompoundButton, boolean) parameter, instead of " + parameters.size()); - } else { - VariableElement firstParameter = parameters.get(0); - String firstParameterType = firstParameter.asType().toString(); - if (!firstParameterType.equals(CanonicalNameConstants.COMPOUND_BUTTON)) { - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "the first parameter must be a " + CanonicalNameConstants.COMPOUND_BUTTON + ", not a " + firstParameterType); - } - if (parameters.size() == 2) { - VariableElement secondParameter = parameters.get(1); - String secondParameterType = secondParameter.asType().toString(); - if (!secondParameterType.equals(CanonicalNameConstants.BOOLEAN) && !secondParameterType.equals("boolean")) { + private void hasZeroOrOneParameterOfPrimitiveType(String typeCanonicalName, TypeKind typeKind, ExecutableElement executableElement, IsValid valid) { + boolean parameterOfTypeFound = false; + for (VariableElement parameter : executableElement.getParameters()) { + if (parameter.asType().getKind() == typeKind || parameter.asType().toString().equals(typeCanonicalName)) { + if (parameterOfTypeFound) { + annotationHelper.printAnnotationError(executableElement, "You can declare only one parameter of type "+typeKind.name()+" or "+typeCanonicalName); valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "the second parameter must be a " + CanonicalNameConstants.BOOLEAN + " or boolean, not a " + secondParameterType); } + parameterOfTypeFound = true; } } } - public void hasOneMotionEventOrTwoMotionEventViewParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); + public void hasNoOtherParameterThanCompoundButtonOrBoolean(ExecutableElement executableElement, IsValid valid) { + String[] types = new String[]{CanonicalNameConstants.COMPOUND_BUTTON, CanonicalNameConstants.BOOLEAN, "boolean"}; + hasNotOtherParameterThanTypes(types, executableElement, valid); + } - if (parameters.size() < 1 || parameters.size() > 2) { - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "%s can only be used on a method with 1 (MotionEvent) or 2 (MotionEvent, View) parameters, instead of " + parameters.size()); - } else { - VariableElement firstParameter = parameters.get(0); - String firstParameterType = firstParameter.asType().toString(); - if (parameters.size() == 1 && !firstParameterType.equals(CanonicalNameConstants.MOTION_EVENT)) { - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "the parameter must be a " + CanonicalNameConstants.MOTION_EVENT + ", not a " + firstParameterType); - } - if (parameters.size() == 2) { - VariableElement secondParameter = parameters.get(1); - String secondParameterType = secondParameter.asType().toString(); + public void hasNoOtherParameterThanMotionEventOrView(ExecutableElement executableElement, IsValid valid) { + String[] types = new String[]{CanonicalNameConstants.MOTION_EVENT, CanonicalNameConstants.VIEW}; + hasNotOtherParameterThanTypes(types, executableElement, valid); + } - boolean isViewAndMotion = firstParameterType.equals(CanonicalNameConstants.VIEW) && secondParameterType.equals(CanonicalNameConstants.MOTION_EVENT); - boolean isMotionAndView = firstParameterType.equals(CanonicalNameConstants.MOTION_EVENT) && secondParameterType.equals(CanonicalNameConstants.VIEW); + public void hasNoOtherParameterThanViewOrBoolean(ExecutableElement executableElement, IsValid valid) { + String[] types = new String[]{CanonicalNameConstants.VIEW, CanonicalNameConstants.BOOLEAN, "boolean"}; + hasNotOtherParameterThanTypes(types, executableElement, valid); + } - if (!isViewAndMotion && !isMotionAndView) { - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "the parameters must be a " + CanonicalNameConstants.VIEW + " and a " + CanonicalNameConstants.MOTION_EVENT + ", not a " + firstParameterType + " and a " + secondParameterType); - } + private void hasNotOtherParameterThanTypes(String[] typesCanonicalNames, ExecutableElement executableElement, IsValid valid) { + Collection types = Arrays.asList(typesCanonicalNames); + for (VariableElement parameter : executableElement.getParameters()) { + String parameterType = parameter.asType().toString(); + if (!types.contains(parameterType)) { + annotationHelper.printAnnotationError(executableElement, "You can declare only parameters of type "+Arrays.toString(typesCanonicalNames)); + valid.invalidate(); } } } diff --git a/AndroidAnnotations/functional-test-1-5/res/layout/clickable_widgets.xml b/AndroidAnnotations/functional-test-1-5/res/layout/clickable_widgets.xml index e5c46b7975..fed6f27e4e 100644 --- a/AndroidAnnotations/functional-test-1-5/res/layout/clickable_widgets.xml +++ b/AndroidAnnotations/functional-test-1-5/res/layout/clickable_widgets.xml @@ -56,7 +56,13 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" /> -