Skip to content

Commit eea4b34

Browse files
Merge pull request #28 from Omega-R/feature/repository_code_generation
Gradle version updated to 3.6.1; kotlin updated to 1.3.71.
2 parents fb88f83 + 7fef08a commit eea4b34

File tree

6 files changed

+52
-22
lines changed

6 files changed

+52
-22
lines changed

app/src/main/java/com/omega_r/base/simple/InspectionRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.omega_r.base.data.OmegaRepository.Strategy
55
import kotlinx.coroutines.channels.ReceiveChannel
66

77
@AppOmegaRepository
8-
interface InspectionRepository {
8+
interface InspectionRepository : ParentRepository {
99

1010
val isAuth: Boolean?
1111
get() = true
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.omega_r.base.simple
2+
3+
interface ParentRepository {
4+
5+
suspend fun parentMethod(): String
6+
7+
}

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ ext {
55
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
66

77
buildscript {
8-
ext.kotlin_version = '1.3.61'
8+
ext.kotlin_version = '1.3.71'
99
repositories {
1010
google()
1111
jcenter()
1212

1313
}
1414
dependencies {
15-
classpath 'com.android.tools.build:gradle:3.5.3'
15+
classpath 'com.android.tools.build:gradle:3.6.1'
1616
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1717
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
1818
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Tue Dec 03 09:01:16 MSK 2019
1+
#Fri Mar 27 12:50:10 MSK 2020
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.omega_r.base.processor.extensions
2+
3+
import javax.lang.model.element.TypeElement
4+
import javax.lang.model.type.DeclaredType
5+
import javax.lang.model.type.TypeMirror
6+
7+
fun TypeMirror.asTypeElement(): TypeElement = (this as DeclaredType).asElement() as TypeElement

processor/src/main/java/com/omega_r/base/processor/factories/RepositoryFactory.kt

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,18 @@ import javax.annotation.processing.Messager
1818
import javax.lang.model.element.Element
1919
import javax.lang.model.element.TypeElement
2020
import javax.lang.model.util.Elements
21-
import javax.tools.Diagnostic.Kind.*
21+
import javax.tools.Diagnostic.Kind.ERROR
2222

2323
private const val FUNC_CLEAR_CACHE = "clearCache"
2424

2525
class 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

Comments
 (0)