AnnotationMethod.java revision 79fc7f3727815ab35bb1bb2e060bfb7db3176eed
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 */
1679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountpackage com.android.databinding.reflection;
1779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
1879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport java.util.List;
1979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
2079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.element.ExecutableElement;
2179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.element.Modifier;
2279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.element.VariableElement;
2379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.DeclaredType;
2479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.ExecutableType;
2579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport javax.lang.model.type.TypeMirror;
2679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
2779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountpublic class AnnotationMethod implements ModelMethod {
2879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    final ExecutableElement mMethod;
2979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    final DeclaredType mDeclaringType;
3079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
3179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    public AnnotationMethod(DeclaredType declaringType, ExecutableElement method) {
3279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        mDeclaringType = declaringType;
3379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        mMethod = method;
3479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    }
3579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
3679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    @Override
3779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    public ModelClass getDeclaringClass() {
3879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        return new AnnotationClass(mDeclaringType);
3979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    }
4079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
4179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    @Override
4279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    public ModelClass[] getParameterTypes() {
4379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        List<? extends VariableElement> parameters = mMethod.getParameters();
4479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        ModelClass[] parameterTypes = new ModelClass[parameters.size()];
4579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        for (int i = 0; i < parameters.size(); i++) {
4679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount            parameterTypes[i] = new AnnotationClass(parameters.get(i).asType());
4779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        }
4879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        return parameterTypes;
4979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    }
5079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
5179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    @Override
5279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    public String getName() {
5379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        return mMethod.getSimpleName().toString();
5479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    }
5579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
5679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    @Override
5779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    public ModelClass getReturnType(List<ModelClass> args) {
5879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        ExecutableType executableType = (ExecutableType) AnnotationAnalyzer.instance.getTypeUtils().asMemberOf(mDeclaringType, mMethod);
5979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        TypeMirror returnType = executableType.getReturnType();
6079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        // TODO: support argument-supplied types
6179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        // for example: public T[] toArray(T[] arr)
6279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        return new AnnotationClass(returnType);
6379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    }
6479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
6579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    @Override
6679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    public boolean isPublic() {
6779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        return mMethod.getModifiers().contains(Modifier.PUBLIC);
6879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    }
6979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount
7079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    @Override
7179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    public boolean isStatic() {
7279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount        return mMethod.getModifiers().contains(Modifier.STATIC);
7379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount    }
7479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount}
75