sourceSets.main.java.srcDirs = ["src/"]
dependencies {
- implementation project(':dagger-multibind-annotations')
- ksp project(':dagger-multibind-ksp')
+ implementation "ru.fredboy:automultibind-annotations:1.0.0"
+ ksp "ru.fredboy:automultibind-ksp:1.0.0"
api "com.badlogicgames.gdx:gdx:$gdxVersion"
api "com.google.guava:guava:$guavaVersion-android"
package ru.deadsoftware.cavedroid.misc.annotations.multibinding
import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
-import ru.fredboy.cavedroid.ksp.annotations.GenerateSetMultibindingsModule
+import ru.fredboy.automultibind.annotations.BindsIntoSet
-@GenerateSetMultibindingsModule(
+@BindsIntoSet(
interfaceClass = IKeyboardInputHandler::class,
modulePackage = MultibindingConfig.GENERATED_MODULES_PACKAGE,
moduleName = "KeyboardInputHandlersModule"
package ru.deadsoftware.cavedroid.misc.annotations.multibinding
import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
-import ru.fredboy.cavedroid.ksp.annotations.GenerateSetMultibindingsModule
+import ru.fredboy.automultibind.annotations.BindsIntoSet
-@GenerateSetMultibindingsModule(
+@BindsIntoSet(
interfaceClass = IMouseInputHandler::class,
modulePackage = MultibindingConfig.GENERATED_MODULES_PACKAGE,
moduleName = "MouseInputHandlersModule"
package ru.deadsoftware.cavedroid.misc.annotations.multibinding
import ru.deadsoftware.cavedroid.game.actions.placeblock.IPlaceBlockAction
-import ru.fredboy.cavedroid.ksp.annotations.GenerateMapMultibindingsModule
+import ru.fredboy.automultibind.annotations.BindsIntoMapStringKey
-@GenerateMapMultibindingsModule(
+@BindsIntoMapStringKey(
interfaceClass = IPlaceBlockAction::class,
modulePackage = MultibindingConfig.GENERATED_MODULES_PACKAGE,
moduleName = "PlaceBlockActionsModule"
package ru.deadsoftware.cavedroid.misc.annotations.multibinding
import ru.deadsoftware.cavedroid.game.render.IGameRenderer
-import ru.fredboy.cavedroid.ksp.annotations.GenerateSetMultibindingsModule
+import ru.fredboy.automultibind.annotations.BindsIntoSet
-@GenerateSetMultibindingsModule(
+@BindsIntoSet(
interfaceClass = IGameRenderer::class,
modulePackage = MultibindingConfig.GENERATED_MODULES_PACKAGE,
moduleName = "RenderModule"
package ru.deadsoftware.cavedroid.misc.annotations.multibinding
import ru.deadsoftware.cavedroid.game.actions.updateblock.IUpdateBlockAction
-import ru.fredboy.cavedroid.ksp.annotations.GenerateMapMultibindingsModule
+import ru.fredboy.automultibind.annotations.BindsIntoMapStringKey
-@GenerateMapMultibindingsModule(
+@BindsIntoMapStringKey(
interfaceClass = IUpdateBlockAction::class,
modulePackage = MultibindingConfig.GENERATED_MODULES_PACKAGE,
moduleName = "UpdateBlockActionsModule"
package ru.deadsoftware.cavedroid.misc.annotations.multibinding
import ru.deadsoftware.cavedroid.game.actions.useblock.IUseBlockAction
-import ru.fredboy.cavedroid.ksp.annotations.GenerateMapMultibindingsModule
+import ru.fredboy.automultibind.annotations.BindsIntoMapStringKey
-@GenerateMapMultibindingsModule(
+@BindsIntoMapStringKey(
interfaceClass = IUseBlockAction::class,
modulePackage = MultibindingConfig.GENERATED_MODULES_PACKAGE,
moduleName = "UseBlockActionsModule"
package ru.deadsoftware.cavedroid.misc.annotations.multibinding
import ru.deadsoftware.cavedroid.game.actions.useitem.IUseItemAction
-import ru.fredboy.cavedroid.ksp.annotations.GenerateMapMultibindingsModule
+import ru.fredboy.automultibind.annotations.BindsIntoMapStringKey
-@GenerateMapMultibindingsModule(
+@BindsIntoMapStringKey(
interfaceClass = IUseItemAction::class,
modulePackage = MultibindingConfig.GENERATED_MODULES_PACKAGE,
moduleName = "UseItemActionsModule"
+++ /dev/null
-plugins {
- id 'kotlin'
-}
-
-kotlin {
- jvmToolchain(17)
-}
+++ /dev/null
-package ru.fredboy.cavedroid.ksp.annotations
-
-import kotlin.reflect.KClass
-
-/**
- * Annotation annotated with this must include stringKey parameter for key selection in generated module
- */
-@Target(AnnotationTarget.ANNOTATION_CLASS)
-@Retention(AnnotationRetention.SOURCE)
-annotation class GenerateMapMultibindingsModule(
- val interfaceClass: KClass<*>,
- val modulePackage: String,
- val moduleName: String,
-)
+++ /dev/null
-package ru.fredboy.cavedroid.ksp.annotations
-
-import kotlin.reflect.KClass
-
-@Target(AnnotationTarget.ANNOTATION_CLASS)
-@Retention(AnnotationRetention.SOURCE)
-annotation class GenerateSetMultibindingsModule(
- val interfaceClass: KClass<*>,
- val modulePackage: String,
- val moduleName: String,
-)
+++ /dev/null
-plugins {
- id 'kotlin'
- id 'com.google.devtools.ksp' version "$kspVersion"
-}
-
-kotlin {
- jvmToolchain(17)
-}
-
-dependencies {
- implementation project(':dagger-multibind-annotations')
- implementation "com.squareup:kotlinpoet-ksp:$kotlinpoetKspVersion"
- implementation "com.google.devtools.ksp:symbol-processing-api:$kspVersion"
-}
+++ /dev/null
-package ru.fredboy.cavedroid.ksp.processor
-
-import com.google.devtools.ksp.processing.*
-import com.google.devtools.ksp.symbol.KSAnnotated
-import com.google.devtools.ksp.symbol.KSClassDeclaration
-import com.google.devtools.ksp.symbol.KSType
-import com.squareup.kotlinpoet.*
-import com.squareup.kotlinpoet.ksp.toClassName
-import com.squareup.kotlinpoet.ksp.writeTo
-import ru.fredboy.cavedroid.ksp.annotations.GenerateMapMultibindingsModule
-
-class GenerateMapMultibindingsSymbolProcessor(
- private val codeGenerator: CodeGenerator,
- private val logger: KSPLogger,
-) : SymbolProcessor {
-
- private fun generateModule(
- annotationName: String,
- interfaceName: ClassName,
- moduleName: ClassName,
- classes: List<KSClassDeclaration>
- ): FileSpec? {
- if (classes.isEmpty()) {
- return null
- }
-
- val bindings = classes.map { decl ->
- val stringKey = decl.annotations.first { declAnn ->
- declAnn.shortName.getShortName() == annotationName
- }.arguments.firstOrNull { arg ->
- arg.name!!.getShortName() == "stringKey"
- }?.value as? String ?: run {
- logger.error("@${annotationName} must include stringKey parameter for key selection in generated module")
- throw IllegalArgumentException()
- }
-
- val clazz = decl.toClassName()
-
- FunSpec.builder("bind${clazz.simpleName}")
- .addAnnotation(ClassName("dagger", "Binds"))
- .addAnnotation(ClassName("dagger.multibindings", "IntoMap"))
- .addAnnotation(
- AnnotationSpec.builder(ClassName("dagger.multibindings", "StringKey"))
- .addMember("\"$stringKey\"")
- .build()
- )
- .addParameter(ParameterSpec("impl", clazz))
- .returns(interfaceName)
- .addCode("return impl")
- .build()
- }
-
- val moduleObject = TypeSpec.objectBuilder(moduleName)
- .addAnnotation(ClassName("dagger", "Module"))
- .addAnnotation(
- AnnotationSpec.builder(ClassName("javax.annotation.processing", "Generated"))
- .addMember("value = [%S]", this::class.qualifiedName!!)
- .build()
- )
- .addFunctions(bindings)
- .build()
-
- return FileSpec.builder(moduleName)
- .addType(moduleObject)
- .build()
-
- }
-
- private fun processAnnotation(resolver: Resolver, annotation: KSClassDeclaration) {
- val args = annotation.annotations.first {
- it.shortName.getShortName() == "GenerateMapMultibindingsModule"
- }.arguments.takeIf { it.size == 3 } ?: run {
- logger.error("GenerateMapMultibindingsModule should have 3 arguments")
- throw IllegalArgumentException()
- }
-
- val interfaceName = args.first { it.name?.getShortName() == "interfaceClass" }.value as KSType
- val modulePackage = args.first { it.name?.getShortName() == "modulePackage" }.value as String
- val moduleName = args.first { it.name?.getShortName() == "moduleName" }.value as String
-
- val moduleClassName = ClassName(modulePackage, moduleName)
- val elements = resolver.getSymbolsWithAnnotation(annotation.qualifiedName!!.asString())
- .filterIsInstance<KSClassDeclaration>()
- .toList()
-
- logger.info("Found elements: ${elements.joinToString()}")
-
- generateModule(
- annotationName = annotation.qualifiedName!!.getShortName(),
- interfaceName = interfaceName.toClassName(),
- moduleName = moduleClassName,
- classes = elements
- )?.writeTo(codeGenerator, Dependencies(true))
- }
-
- override fun process(resolver: Resolver): List<KSAnnotated> {
- val annotations = resolver.getAnnotatedClasses(GenerateMapMultibindingsModule::class.qualifiedName!!, logger)
- logger.info("Found annotations: ${annotations.joinToString { it.qualifiedName!!.asString() }}")
- annotations.forEach { processAnnotation(resolver, it) }
- return emptyList()
- }
-
-}
\ No newline at end of file
+++ /dev/null
-package ru.fredboy.cavedroid.ksp.processor
-
-import com.google.devtools.ksp.processing.*
-import com.google.devtools.ksp.symbol.KSAnnotated
-import com.google.devtools.ksp.symbol.KSClassDeclaration
-import com.google.devtools.ksp.symbol.KSType
-import com.squareup.kotlinpoet.*
-import com.squareup.kotlinpoet.ksp.toClassName
-import com.squareup.kotlinpoet.ksp.writeTo
-import ru.fredboy.cavedroid.ksp.annotations.GenerateSetMultibindingsModule
-
-class GenerateSetMultibindingsSymbolProcessor(
- private val codeGenerator: CodeGenerator,
- private val logger: KSPLogger,
-) : SymbolProcessor {
-
- private fun generateModule(
- interfaceName: ClassName,
- moduleName: ClassName,
- classes: List<ClassName>
- ): FileSpec? {
- if (classes.isEmpty()) {
- return null
- }
-
- val bindings = classes.map { clazz ->
- FunSpec.builder("bind${clazz.simpleName}")
- .addAnnotation(ClassName("dagger", "Binds"))
- .addAnnotation(ClassName("dagger.multibindings", "IntoSet"))
- .addParameter(ParameterSpec("impl", clazz))
- .returns(interfaceName)
- .addCode("return impl")
- .build()
- }
-
- val moduleObject = TypeSpec.objectBuilder(moduleName)
- .addAnnotation(ClassName("dagger", "Module"))
- .addAnnotation(
- AnnotationSpec.builder(ClassName("javax.annotation.processing", "Generated"))
- .addMember("value = [%S]", this::class.qualifiedName!!)
- .build()
- )
- .addFunctions(bindings)
- .build()
-
- return FileSpec.builder(moduleName)
- .addType(moduleObject)
- .build()
-
- }
-
- private fun processAnnotation(resolver: Resolver, annotation: KSClassDeclaration) {
- val args = annotation.annotations.first {
- it.shortName.getShortName() == "GenerateSetMultibindingsModule"
- }.arguments.takeIf { it.size == 3 } ?: run {
- logger.error("GenerateSetMultibindingsModule should have 3 arguments")
- throw IllegalArgumentException()
- }
-
- val interfaceName = args.first { it.name?.getShortName() == "interfaceClass" }.value as KSType
- val modulePackage = args.first { it.name?.getShortName() == "modulePackage" }.value as String
- val moduleName = args.first { it.name?.getShortName() == "moduleName" }.value as String
-
- val moduleClassName = ClassName(modulePackage, moduleName)
- val elements = resolver.getSymbolsWithAnnotation(annotation.qualifiedName!!.asString())
- .filterIsInstance<KSClassDeclaration>()
- .map(KSClassDeclaration::toClassName)
- .toList()
-
- logger.info("Found elements: ${elements.joinToString()}")
-
- generateModule(
- interfaceName = interfaceName.toClassName(),
- moduleName = moduleClassName,
- classes = elements
- )?.writeTo(codeGenerator, Dependencies(true))
- }
-
- override fun process(resolver: Resolver): List<KSAnnotated> {
- val annotations = resolver.getAnnotatedClasses(GenerateSetMultibindingsModule::class.qualifiedName!!, logger)
- logger.info("Found annotations: ${annotations.joinToString { it.qualifiedName!!.asString() }}")
- annotations.forEach { processAnnotation(resolver, it) }
- return emptyList()
- }
-
-}
\ No newline at end of file
+++ /dev/null
-package ru.fredboy.cavedroid.ksp.processor
-
-import com.google.devtools.ksp.processing.KSPLogger
-import com.google.devtools.ksp.processing.Resolver
-import com.google.devtools.ksp.symbol.KSClassDeclaration
-import com.google.devtools.ksp.symbol.KSNode
-import com.google.devtools.ksp.validate
-import kotlin.reflect.KClass
-
-internal fun Resolver.getAnnotatedClasses(
- annotation: String,
- logger: KSPLogger,
-): Sequence<KSClassDeclaration> {
- logger.info("Resolving annotation $annotation")
- return getSymbolsWithAnnotation(annotation)
- .filterIsInstance<KSClassDeclaration>()
- .filter(KSNode::validate)
-}
\ No newline at end of file
+++ /dev/null
-package ru.fredboy.cavedroid.ksp.provider
-
-import com.google.devtools.ksp.processing.SymbolProcessor
-import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
-import com.google.devtools.ksp.processing.SymbolProcessorProvider
-import ru.fredboy.cavedroid.ksp.processor.GenerateMapMultibindingsSymbolProcessor
-
-internal class GenerateMapMultibindingsSymbolProcessorProvider : SymbolProcessorProvider {
-
- override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
- return GenerateMapMultibindingsSymbolProcessor(
- codeGenerator = environment.codeGenerator,
- logger = environment.logger,
- )
- }
-
-}
\ No newline at end of file
+++ /dev/null
-package ru.fredboy.cavedroid.ksp.provider
-
-import com.google.devtools.ksp.processing.SymbolProcessor
-import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
-import com.google.devtools.ksp.processing.SymbolProcessorProvider
-import ru.fredboy.cavedroid.ksp.processor.GenerateSetMultibindingsSymbolProcessor
-
-internal class GenerateSetMultibindingsSymbolProcessorProvider : SymbolProcessorProvider {
-
- override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
- return GenerateSetMultibindingsSymbolProcessor(
- codeGenerator = environment.codeGenerator,
- logger = environment.logger,
- )
- }
-
-}
\ No newline at end of file
+++ /dev/null
-ru.fredboy.cavedroid.ksp.provider.GenerateSetMultibindingsSymbolProcessorProvider
-ru.fredboy.cavedroid.ksp.provider.GenerateMapMultibindingsSymbolProcessorProvider
-plugins {
- id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
-}
-
include 'desktop', 'android', 'core'
-include 'dagger-multibind-annotations'
-include 'dagger-multibind-ksp'