From 673c35c9c899179bd0df6174b9948c9d3535a8ef Mon Sep 17 00:00:00 2001 From: yDelouis Date: Thu, 20 Mar 2014 23:44:29 +0100 Subject: [PATCH 1/3] Allow any order for @CheckedChange annotated method's parameters --- .../handler/CheckedChangeHandler.java | 22 ++++--- .../helper/ValidatorParameterHelper.java | 62 +++++++++++++------ .../test15/CheckedChangeHandledActivity.java | 4 +- 3 files changed, 60 insertions(+), 28 deletions(-) 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 ac0df7c8c6..f0070b00b1 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java @@ -17,6 +17,7 @@ import com.sun.codemodel.*; import org.androidannotations.annotations.CheckedChange; +import org.androidannotations.helper.CanonicalNameConstants; import org.androidannotations.model.AnnotationElements; import org.androidannotations.process.IsValid; @@ -24,6 +25,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; @@ -40,7 +42,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 @@ -52,14 +58,14 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror protected void processParameters(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/helper/ValidatorParameterHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java index 716c6d03a2..84a62590a1 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; @@ -136,28 +137,53 @@ public void hasZeroOrOneViewOrTwoViewBooleanParameters(ExecutableElement executa } } - public void hasZeroOrOneCompoundButtonOrTwoCompoundButtonBooleanParameters(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(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); + public void hasZeroOrOneBooleanParameter(ExecutableElement executableElement, IsValid valid) { + hasZeroOrOneParameterOfPrimitiveType(CanonicalNameConstants.BOOLEAN, TypeKind.BOOLEAN, 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(); + } + parameterOfTypeFound = true; } - 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 hasNoOtherParameterThanCompoundButtonOrBoolean(ExecutableElement executableElement, IsValid valid) { + String[] types = new String[]{CanonicalNameConstants.COMPOUND_BUTTON, CanonicalNameConstants.BOOLEAN, "boolean"}; + hasNotOtherParameterThanTypes(types, executableElement, valid); + } + + 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/src/main/java/org/androidannotations/test15/CheckedChangeHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CheckedChangeHandledActivity.java index 25e5076c52..20b16828f9 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CheckedChangeHandledActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CheckedChangeHandledActivity.java @@ -29,7 +29,7 @@ public void conventionButton(CompoundButton evt, boolean hasFocus) { } @CheckedChange - public void snakeCaseButton() { + public void snakeCaseButton(boolean hasFocus, CompoundButton evt) { } @@ -44,7 +44,7 @@ public void overridenConventionButton() { } @CheckedChange - public void buttonWithViewArgument() { + public void buttonWithViewArgument(boolean hasFocus) { } From d3db0bdf2bac3dd6df7fb05c5914ccc03b704812 Mon Sep 17 00:00:00 2001 From: yDelouis Date: Thu, 27 Mar 2014 22:06:32 +0100 Subject: [PATCH 2/3] Allow any order for @Touch annotated method's parameters --- .../handler/TouchHandler.java | 44 +++++++------------ .../helper/ValidatorParameterHelper.java | 41 ++++++----------- .../res/layout/clickable_widgets.xml | 8 +++- .../test15/TouchesHandledActivity.java | 4 ++ 4 files changed, 39 insertions(+), 58 deletions(-) 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 2a980ae542..31033a26fd 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,11 @@ */ 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.model.AnnotationElements; +import org.androidannotations.process.IsValid; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; @@ -23,20 +27,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.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 { @@ -52,7 +43,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 @@ -71,21 +66,12 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror protected void processParameters(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 84a62590a1..7451c41588 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java @@ -145,6 +145,14 @@ public void hasZeroOrOneBooleanParameter(ExecutableElement executableElement, Is 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()) { @@ -177,6 +185,11 @@ public void hasNoOtherParameterThanCompoundButtonOrBoolean(ExecutableElement exe hasNotOtherParameterThanTypes(types, executableElement, valid); } + public void hasNoOtherParameterThanMotionEventOrView(ExecutableElement executableElement, IsValid valid) { + String[] types = new String[]{CanonicalNameConstants.MOTION_EVENT, CanonicalNameConstants.VIEW}; + hasNotOtherParameterThanTypes(types, executableElement, valid); + } + private void hasNotOtherParameterThanTypes(String[] typesCanonicalNames, ExecutableElement executableElement, IsValid valid) { Collection types = Arrays.asList(typesCanonicalNames); for (VariableElement parameter : executableElement.getParameters()) { @@ -188,34 +201,6 @@ private void hasNotOtherParameterThanTypes(String[] typesCanonicalNames, Executa } } - public void hasOneMotionEventOrTwoMotionEventViewParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); - - 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(); - - boolean isViewAndMotion = firstParameterType.equals(CanonicalNameConstants.VIEW) && secondParameterType.equals(CanonicalNameConstants.MOTION_EVENT); - boolean isMotionAndView = firstParameterType.equals(CanonicalNameConstants.MOTION_EVENT) && secondParameterType.equals(CanonicalNameConstants.VIEW); - - 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); - } - } - } - } - public void hasOneOrTwoParametersAndFirstIsDb(ExecutableElement executableElement, IsValid valid) { List parameters = executableElement.getParameters(); 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" /> -