EntityProcessor.kt revision 96cc740203eaa752fc85ca7ca722a8de550ae88c
11600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar/* 21600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * Copyright (C) 2016 The Android Open Source Project 31600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * 41600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 51600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * you may not use this file except in compliance with the License. 61600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * You may obtain a copy of the License at 71600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * 81600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 91600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * 101600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * Unless required by applicable law or agreed to in writing, software 111600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 121600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * See the License for the specific language governing permissions and 141600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar * limitations under the License. 151600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar */ 161600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar 17275e7088223c097c1a2df718455bede42bc9efedYigit Boyar@file:Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") 18275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 191600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarpackage com.android.support.room.ext 201600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar 2196cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyarimport com.google.auto.common.AnnotationMirrors 221600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport com.google.auto.common.MoreElements 23275e7088223c097c1a2df718455bede42bc9efedYigit Boyarimport com.google.auto.common.MoreTypes 2496cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyarimport javax.annotation.processing.ProcessingEnvironment 25275e7088223c097c1a2df718455bede42bc9efedYigit Boyarimport javax.lang.model.element.AnnotationValue 261600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport javax.lang.model.element.Element 2796cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyarimport javax.lang.model.element.ElementKind 281600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport javax.lang.model.element.Modifier 2996cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyarimport javax.lang.model.element.TypeElement 3096cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyarimport javax.lang.model.type.TypeKind 31275e7088223c097c1a2df718455bede42bc9efedYigit Boyarimport javax.lang.model.type.TypeMirror 32275e7088223c097c1a2df718455bede42bc9efedYigit Boyarimport javax.lang.model.util.SimpleAnnotationValueVisitor6 331600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarimport kotlin.reflect.KClass 341600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar 351600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarfun Element.hasAnyOf(vararg modifiers: Modifier) : Boolean { 361600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar return this.modifiers.any { modifiers.contains(it) } 371600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar} 381600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar 391600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyarfun Element.hasAnnotation(klass : KClass<out Annotation>) : Boolean { 401600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar return MoreElements.isAnnotationPresent(this, klass.java) 411600cc11df868b62b6ae3995d94a3ec0b86559adYigit Boyar} 424f0db7db556b473393dfc31bba5ea67def574877Yigit Boyar 434f0db7db556b473393dfc31bba5ea67def574877Yigit Boyar/** 444f0db7db556b473393dfc31bba5ea67def574877Yigit Boyar * Checks if it has all of the annotations 454f0db7db556b473393dfc31bba5ea67def574877Yigit Boyar */ 464f0db7db556b473393dfc31bba5ea67def574877Yigit Boyarfun Element.hasAllOf(vararg klasses : KClass<out Annotation>) : Boolean { 474f0db7db556b473393dfc31bba5ea67def574877Yigit Boyar return !klasses.any { !hasAnnotation(it) } 484f0db7db556b473393dfc31bba5ea67def574877Yigit Boyar} 49275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 5096cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar/** 5196cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar * gets all members including super privates. does not handle duplicate field names!!! 5296cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar */ 5396cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar// TODO handle conflicts with super: b/35568142 5496cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyarfun TypeElement.getAllFieldsIncludingPrivateSupers(processingEnvironment: ProcessingEnvironment) : 5596cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar Set<Element> { 5696cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar val myMembers = processingEnvironment.elementUtils.getAllMembers(this).filter { 5796cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar it.kind == ElementKind.FIELD 5896cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar }.toSet() 5996cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar if (superclass.kind != TypeKind.NONE) { 6096cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar return myMembers + MoreTypes.asTypeElement(superclass) 6196cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar .getAllFieldsIncludingPrivateSupers(processingEnvironment) 6296cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar } else { 6396cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar return myMembers 6496cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar } 6596cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar} 6696cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar 67275e7088223c097c1a2df718455bede42bc9efedYigit Boyar// code below taken from dagger2 68275e7088223c097c1a2df718455bede42bc9efedYigit Boyar// compiler/src/main/java/dagger/internal/codegen/ConfigurationAnnotations.java 69275e7088223c097c1a2df718455bede42bc9efedYigit Boyarprivate val TO_LIST_OF_TYPES = object 70275e7088223c097c1a2df718455bede42bc9efedYigit Boyar : SimpleAnnotationValueVisitor6<List<TypeMirror>, Void?>() { 71275e7088223c097c1a2df718455bede42bc9efedYigit Boyar override fun visitArray(values: MutableList<out AnnotationValue>?, p: Void?) 72275e7088223c097c1a2df718455bede42bc9efedYigit Boyar : List<TypeMirror> { 73275e7088223c097c1a2df718455bede42bc9efedYigit Boyar return values?.map { 74275e7088223c097c1a2df718455bede42bc9efedYigit Boyar val tmp = TO_TYPE.visit(it) 75275e7088223c097c1a2df718455bede42bc9efedYigit Boyar tmp 76275e7088223c097c1a2df718455bede42bc9efedYigit Boyar }?.filterNotNull() ?: emptyList() 77275e7088223c097c1a2df718455bede42bc9efedYigit Boyar } 78275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 79275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 80275e7088223c097c1a2df718455bede42bc9efedYigit Boyar override fun defaultAction(o: Any?, p: Void?): List<TypeMirror>? { 81275e7088223c097c1a2df718455bede42bc9efedYigit Boyar return emptyList() 82275e7088223c097c1a2df718455bede42bc9efedYigit Boyar } 83275e7088223c097c1a2df718455bede42bc9efedYigit Boyar} 84275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 85275e7088223c097c1a2df718455bede42bc9efedYigit Boyarprivate val TO_TYPE = object : SimpleAnnotationValueVisitor6<TypeMirror, Void>() { 86275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 87275e7088223c097c1a2df718455bede42bc9efedYigit Boyar override fun visitType(t: TypeMirror, p: Void?): TypeMirror { 88275e7088223c097c1a2df718455bede42bc9efedYigit Boyar return t 89275e7088223c097c1a2df718455bede42bc9efedYigit Boyar } 90275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 91275e7088223c097c1a2df718455bede42bc9efedYigit Boyar override fun defaultAction(o: Any?, p: Void?): TypeMirror { 92275e7088223c097c1a2df718455bede42bc9efedYigit Boyar throw TypeNotPresentException(o!!.toString(), null) 93275e7088223c097c1a2df718455bede42bc9efedYigit Boyar } 94275e7088223c097c1a2df718455bede42bc9efedYigit Boyar} 95275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 96275e7088223c097c1a2df718455bede42bc9efedYigit Boyarfun AnnotationValue.toListOfClassTypes(): List<TypeMirror> { 97275e7088223c097c1a2df718455bede42bc9efedYigit Boyar return TO_LIST_OF_TYPES.visit(this) 98275e7088223c097c1a2df718455bede42bc9efedYigit Boyar} 99275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 100275e7088223c097c1a2df718455bede42bc9efedYigit Boyarfun AnnotationValue.toClassType(): TypeMirror? { 101275e7088223c097c1a2df718455bede42bc9efedYigit Boyar return TO_TYPE.visit(this) 102275e7088223c097c1a2df718455bede42bc9efedYigit Boyar} 103275e7088223c097c1a2df718455bede42bc9efedYigit Boyar 104275e7088223c097c1a2df718455bede42bc9efedYigit Boyarfun TypeMirror.isCollection() : Boolean { 105275e7088223c097c1a2df718455bede42bc9efedYigit Boyar return MoreTypes.isType(this) 106275e7088223c097c1a2df718455bede42bc9efedYigit Boyar && (MoreTypes.isTypeOf(java.util.List::class.java, this) 107275e7088223c097c1a2df718455bede42bc9efedYigit Boyar || MoreTypes.isTypeOf(java.util.Set::class.java, this)) 108275e7088223c097c1a2df718455bede42bc9efedYigit Boyar} 10996cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar 11096cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyarfun Element.getAnnotationValue(annotation : Class<out Annotation>, fieldName : String) : Any? { 11196cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar return MoreElements.getAnnotationMirror(this, annotation) 11296cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar .orNull()?.let { 11396cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar AnnotationMirrors.getAnnotationValue(it, fieldName)?.value 11496cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar } 11596cc740203eaa752fc85ca7ca722a8de550ae88cYigit Boyar} 116