@@ -18,12 +18,18 @@ import javax.annotation.processing.Messager
1818import javax.lang.model.element.Element
1919import javax.lang.model.element.TypeElement
2020import javax.lang.model.util.Elements
21- import javax.tools.Diagnostic.Kind.*
21+ import javax.tools.Diagnostic.Kind.ERROR
2222
2323private const val FUNC_CLEAR_CACHE = " clearCache"
2424
2525class RepositoryFactory (private val messager : Messager , private val elements : Elements ) {
2626
27+ private val Element .repositoryPackage
28+ get() = elements.packageOf(this )
29+
30+ private val Element .superInterfaceClassName
31+ get() = ClassName .bestGuess(" ${elements.packageOf(this )} .${this .simpleName} " )
32+
2733 fun create (elements : Set <Element >): List <Repository > = elements.mapNotNull { create(it) }
2834
2935 fun create (element : Element ): Repository ? {
@@ -34,27 +40,33 @@ class RepositoryFactory(private val messager: Messager, private val elements: El
3440 return null
3541 }
3642
37- val proto = kotlinMetadata.data.classProto
38- if (proto .classKind != INTERFACE ) {
43+ val classData : ClassData = kotlinMetadata.data
44+ if (classData.classProto .classKind != INTERFACE ) {
3945 messager.printMessage(ERROR , " @AppOmegaRepository can't be applied to $element : must be a Kotlin interface" )
4046 return null
4147 }
4248
43- val repositoryPackage = elements.packageOf(element)
44- val repositoryName = element.repositoryName
49+ val functions = classData.getFunctions(element).toMutableList()
50+ val parameters = classData.getParameters().toMutableList()
51+ element.interfaces.forEach {
52+ val parentElement = create(it.asTypeElement()) ? : return @forEach
53+ functions + = parentElement.functions
54+ parameters + = parentElement.properties
55+ }
4556
46- val classProto = kotlinMetadata.data.classProto
47- val nameResolver = kotlinMetadata.data.nameResolver
48- val superInterfaceClassName = ClassName .bestGuess(" ${elements.packageOf(element)} .${element.simpleName} " )
57+ return Repository (
58+ element.repositoryPackage,
59+ element.repositoryName,
60+ element.superInterfaceClassName,
61+ parameters,
62+ functions
63+ )
64+ }
4965
50- val properties = classProto.propertyList.mapNotNull { property ->
66+ private fun ClassData.getParameters (): List <Parameter > {
67+ return classProto.propertyList.mapNotNull { property ->
5168 property.toParameter(nameResolver)
5269 }
53- val functions = classProto.functionList.mapNotNull {
54- it.toFunction(element, nameResolver)
55- }
56-
57- return Repository (repositoryPackage, repositoryName, superInterfaceClassName, properties, functions)
5870 }
5971
6072 private fun ProtoBuf.Property.toParameter (nameResolver : NameResolver ): Parameter ? {
@@ -63,16 +75,20 @@ class RepositoryFactory(private val messager: Messager, private val elements: El
6375 val className = returnType.getClassName(nameResolver)
6476 val parameterizedBy = getParameterTypes(returnType, nameResolver)
6577
66- messager.printMessage(WARNING , " parameterName $parameterName $parameterizedBy " )
67-
6878 return Parameter (parameterName, Type (className, parameterizedBy, returnType.nullable))
6979 }
7080
81+ private fun ClassData.getFunctions (element : Element ): List <Function > {
82+ return classProto.functionList.mapNotNull { function ->
83+ function.toFunction(element, nameResolver)
84+ }
85+ }
86+
7187 private fun ProtoBuf.Function.toFunction (element : Element , nameResolver : NameResolver ): Function ? {
7288 if (modality != ProtoBuf .Modality .ABSTRACT ) return null
7389
7490 val functionName = nameResolver.getName(this )
75- if (functionName == FUNC_CLEAR_CACHE ) return null
91+ if (functionName == FUNC_CLEAR_CACHE ) return null
7692
7793 val parameters = valueParameterList.map {
7894 it.toParameter(nameResolver)
0 commit comments