AnnotationMethod.java revision fead9ca09b117136b35bc5bf137340a754f9eddd
179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount/* 279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * Copyright (C) 2015 The Android Open Source Project 379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * 479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License"); 579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * you may not use this file except in compliance with the License. 679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * You may obtain a copy of the License at 779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * 879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * http://www.apache.org/licenses/LICENSE-2.0 979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * 1079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * Unless required by applicable law or agreed to in writing, software 1179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS, 1279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * See the License for the specific language governing permissions and 1479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount * limitations under the License. 1579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount */ 16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.tool.reflection.annotation; 1797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 18fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.Bindable; 19fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.ModelClass; 20fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.ModelMethod; 21fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.SdkUtil; 22fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.TypeUtil; 23fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount 2479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport java.util.List; 2579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 2679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.element.ExecutableElement; 2779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.element.Modifier; 2879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.DeclaredType; 2979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.ExecutableType; 30fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mountimport javax.lang.model.type.TypeKind; 3179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.TypeMirror; 32a7e767e576adebcddf043ad34ccb8dd167f777b3George Mountimport javax.lang.model.util.Types; 3379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 34fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mountclass AnnotationMethod extends ModelMethod { 35a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount final ExecutableType mMethod; 3679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount final DeclaredType mDeclaringType; 37a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount final ExecutableElement mExecutableElement; 3897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar int mApiLevel = -1; // calculated on demand 3979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 40a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount public AnnotationMethod(DeclaredType declaringType, ExecutableElement executableElement) { 4179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount mDeclaringType = declaringType; 42a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount mExecutableElement = executableElement; 4397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar Types typeUtils = AnnotationAnalyzer.get().getTypeUtils(); 44a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount mMethod = (ExecutableType) typeUtils.asMemberOf(declaringType, executableElement); 4579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 4679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 4779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 4879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public ModelClass getDeclaringClass() { 4979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return new AnnotationClass(mDeclaringType); 5079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 5179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 5279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 5379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public ModelClass[] getParameterTypes() { 54a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount List<? extends TypeMirror> parameters = mMethod.getParameterTypes(); 5579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount ModelClass[] parameterTypes = new ModelClass[parameters.size()]; 5679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount for (int i = 0; i < parameters.size(); i++) { 57a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount parameterTypes[i] = new AnnotationClass(parameters.get(i)); 5879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 5979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return parameterTypes; 6079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 6179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 6279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 6379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public String getName() { 64a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount return mExecutableElement.getSimpleName().toString(); 6579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 6679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 6779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 6879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public ModelClass getReturnType(List<ModelClass> args) { 69a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount TypeMirror returnType = mMethod.getReturnType(); 7079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount // TODO: support argument-supplied types 7179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount // for example: public T[] toArray(T[] arr) 7279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return new AnnotationClass(returnType); 7379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 7479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 7579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 76fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount public boolean isVoid() { 77fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount return mMethod.getReturnType().getKind() == TypeKind.VOID; 78fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount } 79fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount 80fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount @Override 8179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public boolean isPublic() { 82a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount return mExecutableElement.getModifiers().contains(Modifier.PUBLIC); 8379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 8479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 8579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 8679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public boolean isStatic() { 87a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount return mExecutableElement.getModifiers().contains(Modifier.STATIC); 8879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 8997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 9097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar @Override 91fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount public boolean isBindable() { 92fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount return mExecutableElement.getAnnotation(Bindable.class) != null; 93fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount } 94fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount 95fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount @Override 9697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public int getMinApi() { 9797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if (mApiLevel == -1) { 9897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar mApiLevel = SdkUtil.getMinApi(this); 9997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 10097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar return mApiLevel; 10197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 10297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 10397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar @Override 10497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public String getJniDescription() { 10597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar return TypeUtil.getInstance().getDescription(this); 10697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 10797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 10897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar @Override 109fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount public boolean isVarArgs() { 110fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount return mExecutableElement.isVarArgs(); 111fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount } 112fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount 113fa9fe12980ef1103fabe33bf5ff0e2f53042a204George Mount @Override 11497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public String toString() { 11597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar return "AnnotationMethod{" + 11697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "mMethod=" + mMethod + 11797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar ", mDeclaringType=" + mDeclaringType + 11897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar ", mExecutableElement=" + mExecutableElement + 11997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar ", mApiLevel=" + mApiLevel + 12097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar '}'; 12197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 12279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount} 123