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