AnnotationMethod.java revision 97d6ddf47f4ff1abb3ed5201ce5232163f5325b1
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 */ 1697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarpackage com.android.databinding.reflection.annotation; 1797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 1897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarimport com.android.databinding.reflection.ModelClass; 1997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarimport com.android.databinding.reflection.ModelMethod; 2097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarimport com.android.databinding.reflection.SdkUtil; 2197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarimport com.android.databinding.reflection.TypeUtil; 2279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 2379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport java.util.List; 2479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 2579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.element.ExecutableElement; 2679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.element.Modifier; 2779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.DeclaredType; 2879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.ExecutableType; 2979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.TypeMirror; 30a7e767e576adebcddf043ad34ccb8dd167f777b3George Mountimport javax.lang.model.util.Types; 3179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 3297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarclass AnnotationMethod implements ModelMethod { 33a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount final ExecutableType mMethod; 3479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount final DeclaredType mDeclaringType; 35a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount final ExecutableElement mExecutableElement; 3697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar int mApiLevel = -1; // calculated on demand 3779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 38a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount public AnnotationMethod(DeclaredType declaringType, ExecutableElement executableElement) { 3979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount mDeclaringType = declaringType; 40a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount mExecutableElement = executableElement; 4197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar Types typeUtils = AnnotationAnalyzer.get().getTypeUtils(); 42a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount mMethod = (ExecutableType) typeUtils.asMemberOf(declaringType, executableElement); 4379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 4479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 4579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 4679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public ModelClass getDeclaringClass() { 4779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return new AnnotationClass(mDeclaringType); 4879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 4979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 5079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 5179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public ModelClass[] getParameterTypes() { 52a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount List<? extends TypeMirror> parameters = mMethod.getParameterTypes(); 5379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount ModelClass[] parameterTypes = new ModelClass[parameters.size()]; 5479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount for (int i = 0; i < parameters.size(); i++) { 55a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount parameterTypes[i] = new AnnotationClass(parameters.get(i)); 5679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 5779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return parameterTypes; 5879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 5979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 6079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 6179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public String getName() { 62a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount return mExecutableElement.getSimpleName().toString(); 6379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 6479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 6579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 6679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public ModelClass getReturnType(List<ModelClass> args) { 67a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount TypeMirror returnType = mMethod.getReturnType(); 6879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount // TODO: support argument-supplied types 6979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount // for example: public T[] toArray(T[] arr) 7079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return new AnnotationClass(returnType); 7179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 7279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 7379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 7479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public boolean isPublic() { 75a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount return mExecutableElement.getModifiers().contains(Modifier.PUBLIC); 7679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 7779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount 7879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount @Override 7979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public boolean isStatic() { 80a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount return mExecutableElement.getModifiers().contains(Modifier.STATIC); 8179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount } 8297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 8397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar @Override 8497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public int getMinApi() { 8597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if (mApiLevel == -1) { 8697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar mApiLevel = SdkUtil.getMinApi(this); 8797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 8897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar return mApiLevel; 8997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 9097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 9197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar @Override 9297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public String getJniDescription() { 9397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar return TypeUtil.getInstance().getDescription(this); 9497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 9597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 9697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar @Override 9797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public String toString() { 9897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar return "AnnotationMethod{" + 9997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "mMethod=" + mMethod + 10097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar ", mDeclaringType=" + mDeclaringType + 10197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar ", mExecutableElement=" + mExecutableElement + 10297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar ", mApiLevel=" + mApiLevel + 10397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar '}'; 10497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 10579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount} 106