/
TypeConverterDefinition.kt
62 lines (50 loc) · 2.18 KB
/
TypeConverterDefinition.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.raizlabs.android.dbflow.processor.definition
import com.raizlabs.android.dbflow.annotation.TypeConverter
import com.raizlabs.android.dbflow.processor.ClassNames
import com.raizlabs.android.dbflow.processor.ProcessorManager
import com.squareup.javapoet.ClassName
import com.squareup.javapoet.TypeName
import javax.lang.model.element.TypeElement
import javax.lang.model.type.DeclaredType
import javax.lang.model.type.MirroredTypesException
import javax.lang.model.type.TypeMirror
/**
* Description: Holds data about type converters in order to write them.
*/
class TypeConverterDefinition(val className: ClassName,
typeMirror: TypeMirror, manager: ProcessorManager,
typeElement: TypeElement? = null) {
var modelTypeName: TypeName? = null
private set
var dbTypeName: TypeName? = null
private set
var allowedSubTypes: List<TypeName>? = null
init {
val annotation = typeElement?.getAnnotation(TypeConverter::class.java)
if (annotation != null) {
val allowedSubTypes: MutableList<TypeName> = mutableListOf()
try {
annotation.allowedSubtypes;
} catch (e: MirroredTypesException) {
val types = e.typeMirrors
types.forEach { allowedSubTypes.add(TypeName.get(it)) }
}
this.allowedSubTypes = allowedSubTypes
}
val types = manager.typeUtils
var typeConverterSuper: DeclaredType? = null
val typeConverter = manager.typeUtils.getDeclaredType(manager.elements
.getTypeElement(ClassNames.TYPE_CONVERTER.toString()))
for (superType in types.directSupertypes(typeMirror)) {
val erasure = types.erasure(superType)
if (types.isAssignable(erasure, typeConverter) || erasure.toString() == typeConverter.toString()) {
typeConverterSuper = superType as DeclaredType
}
}
if (typeConverterSuper != null) {
val typeArgs = typeConverterSuper.typeArguments
dbTypeName = ClassName.get(typeArgs[0])
modelTypeName = ClassName.get(typeArgs[1])
}
}
}