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