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