DEADSOFTWARE

Add module code gen
[cavedroid.git] / dagger-multibind-ksp / src / main / kotlin / ru / fredboy / cavedroid / ksp / processor / RendererSymbolProcessor.kt
1 package ru.fredboy.cavedroid.ksp.processor
3 import com.google.devtools.ksp.processing.CodeGenerator
4 import com.google.devtools.ksp.processing.Dependencies
5 import com.google.devtools.ksp.processing.Resolver
6 import com.google.devtools.ksp.processing.SymbolProcessor
7 import com.google.devtools.ksp.symbol.KSAnnotated
8 import com.google.devtools.ksp.symbol.KSClassDeclaration
9 import com.squareup.kotlinpoet.*
10 import com.squareup.kotlinpoet.ksp.toClassName
11 import com.squareup.kotlinpoet.ksp.writeTo
12 import ru.fredboy.cavedroid.ksp.annotations.render.Renderer
13 import java.lang.reflect.Type
15 internal class RendererSymbolProcessor(
16 private val codeGenerator: CodeGenerator,
17 ) : SymbolProcessor {
19 private fun generateModule(renderers: List<ClassName>): FileSpec? {
20 if (renderers.isEmpty()) {
21 return null
22 }
24 val bindings = renderers.map { renderer ->
25 FunSpec.builder("bind${renderer.simpleName}")
26 .addAnnotation(ClassName("dagger", "Binds"))
27 .addAnnotation(ClassName("dagger", "IntoSet"))
28 .addAnnotations(renderer.annotations)
29 .addParameter(ParameterSpec("renderer", renderer))
30 .returns(IGameRendererType)
31 .beginControlFlow("return renderer")
32 .build()
33 }
35 val moduleObject = TypeSpec.objectBuilder(MODULE_NAME)
36 .addAnnotation(ClassName("dagger", "Module"))
37 .addFunctions(bindings)
38 .build()
40 return FileSpec.builder(MODULE_PACKAGE, MODULE_NAME)
41 // .addImport("dagger", "Binds", "Module", "IntoSet")
42 // .addImport("ru.deadsoftware.cavedroid.game", "GameScope")
43 .addType(moduleObject)
44 .build()
46 }
48 override fun process(resolver: Resolver): List<KSAnnotated> {
49 generateModule(
50 resolver.getAnnotatedClasses(MODULE_PACKAGE, Renderer::class)
51 .map(KSClassDeclaration::toClassName)
52 .toList()
53 )?.writeTo(codeGenerator, Dependencies(true))
55 return emptyList()
56 }
58 private object IGameRendererType : Type {
59 override fun getTypeName(): String = "IGameRenderer"
60 }
62 companion object {
63 private const val MODULE_PACKAGE = "ru.deadsoftware.cavedroid.game.render"
64 private const val MODULE_NAME = "RenderModule"
65 }
66 }