| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.databinding.tool.reflection.annotation; |
| |
| import android.databinding.tool.reflection.ModelClass; |
| import android.databinding.tool.reflection.ModelMethod; |
| import android.databinding.tool.reflection.TypeUtil; |
| |
| import java.util.List; |
| |
| import javax.lang.model.type.ArrayType; |
| import javax.lang.model.type.ExecutableType; |
| import javax.lang.model.type.TypeMirror; |
| import javax.lang.model.type.TypeVariable; |
| |
| public class AnnotationTypeUtil extends TypeUtil { |
| javax.lang.model.util.Types mTypes; |
| |
| public AnnotationTypeUtil( |
| AnnotationAnalyzer annotationAnalyzer) { |
| mTypes = annotationAnalyzer.getTypeUtils(); |
| } |
| |
| @Override |
| public String getDescription(ModelClass modelClass) { |
| // TODO use interface |
| return modelClass.getCanonicalName().replace('.', '/'); |
| } |
| |
| @Override |
| public String getDescription(ModelMethod modelMethod) { |
| // TODO use interface |
| return modelMethod.getName() + getDescription( |
| ((AnnotationMethod) modelMethod).mExecutableElement.asType()); |
| } |
| |
| private String getDescription(TypeMirror typeMirror) { |
| if (typeMirror == null) { |
| throw new UnsupportedOperationException(); |
| } |
| switch (typeMirror.getKind()) { |
| case BOOLEAN: |
| return BOOLEAN; |
| case BYTE: |
| return BYTE; |
| case SHORT: |
| return SHORT; |
| case INT: |
| return INT; |
| case LONG: |
| return LONG; |
| case CHAR: |
| return CHAR; |
| case FLOAT: |
| return FLOAT; |
| case DOUBLE: |
| return DOUBLE; |
| case DECLARED: |
| return CLASS_PREFIX + mTypes.erasure(typeMirror).toString().replace('.', '/') + CLASS_SUFFIX; |
| case VOID: |
| return VOID; |
| case ARRAY: |
| final ArrayType arrayType = (ArrayType) typeMirror; |
| final String componentType = getDescription(arrayType.getComponentType()); |
| return ARRAY + componentType; |
| case TYPEVAR: |
| final TypeVariable typeVariable = (TypeVariable) typeMirror; |
| final String name = typeVariable.toString(); |
| return CLASS_PREFIX + name.replace('.', '/') + CLASS_SUFFIX; |
| case EXECUTABLE: |
| final ExecutableType executableType = (ExecutableType) typeMirror; |
| final int argStart = mTypes.erasure(executableType).toString().indexOf('('); |
| final String methodName = executableType.toString().substring(0, argStart); |
| final String args = joinArgs(executableType.getParameterTypes()); |
| // TODO detect constructor? |
| return methodName + "(" + args + ")" + getDescription( |
| executableType.getReturnType()); |
| default: |
| throw new UnsupportedOperationException("cannot understand type " |
| + typeMirror.toString() + ", kind:" + typeMirror.getKind().name()); |
| } |
| } |
| |
| private String joinArgs(List<? extends TypeMirror> mirrorList) { |
| StringBuilder result = new StringBuilder(); |
| for (TypeMirror mirror : mirrorList) { |
| result.append(getDescription(mirror)); |
| } |
| return result.toString(); |
| } |
| } |