mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-03 16:10:00 +00:00
Update ContributesNodeProcessor so that generated classes follow naming convention
This commit is contained in:
@@ -14,16 +14,16 @@ import kotlin.reflect.KClass
|
|||||||
* Adds Node to the specified component graph.
|
* Adds Node to the specified component graph.
|
||||||
* Equivalent to the following declaration:
|
* Equivalent to the following declaration:
|
||||||
*
|
*
|
||||||
|
* ```
|
||||||
* @BindingContainer
|
* @BindingContainer
|
||||||
* @ContributesTo(Scope::class)
|
* @ContributesTo(Scope::class)
|
||||||
* abstract class YourNodeBindingContainer {
|
* interface YourNodeBindingContainer {
|
||||||
|
* @Binds
|
||||||
* @Binds
|
* @IntoMap
|
||||||
* @IntoMap
|
* @NodeKey(YourNode::class)
|
||||||
* @NodeKey(YourNode::class)
|
* fun bindYourNodeAssistedFactory(factory: YourNodeAssistedFactory): AssistedNodeFactory<*>
|
||||||
* abstract fun bindYourNodeFactory(factory: YourNode.Factory): AssistedNodeFactory<*>
|
* }
|
||||||
*}
|
* ```
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
annotation class ContributesNode(
|
annotation class ContributesNode(
|
||||||
|
|||||||
@@ -61,32 +61,32 @@ class ContributesNodeProcessor(
|
|||||||
if (config.enableLogging) {
|
if (config.enableLogging) {
|
||||||
logger.warn("Processing ${ksClass.qualifiedName?.asString()}")
|
logger.warn("Processing ${ksClass.qualifiedName?.asString()}")
|
||||||
}
|
}
|
||||||
generateModule(ksClass)
|
generateBindingContainer(ksClass)
|
||||||
generateFactory(ksClass)
|
generateFactory(ksClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
return invalidSymbols
|
return invalidSymbols
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateModule(ksClass: KSClassDeclaration) {
|
private fun generateBindingContainer(ksClass: KSClassDeclaration) {
|
||||||
val annotation = ksClass.annotations.find { it.shortName.asString() == "ContributesNode" }!!
|
val annotation = ksClass.annotations.find { it.shortName.asString() == "ContributesNode" }!!
|
||||||
val scope = annotation.arguments.find { it.name?.asString() == "scope" }!!.value as KSType
|
val scope = annotation.arguments.find { it.name?.asString() == "scope" }!!.value as KSType
|
||||||
val modulePackage = ksClass.packageName.asString()
|
val bindingContainerPackage = ksClass.packageName.asString()
|
||||||
val moduleClassName = "${ksClass.simpleName.asString()}_Module"
|
val bindingContainerClassName = "${ksClass.simpleName.asString()}BindingContainer"
|
||||||
val nodeClassName = ClassName.bestGuess(ksClass.qualifiedName!!.asString())
|
val nodeClassName = ClassName.bestGuess(ksClass.qualifiedName!!.asString())
|
||||||
val content = FileSpec.builder(
|
val content = FileSpec.builder(
|
||||||
packageName = modulePackage,
|
packageName = bindingContainerPackage,
|
||||||
fileName = moduleClassName,
|
fileName = bindingContainerClassName,
|
||||||
)
|
)
|
||||||
.addType(
|
.addType(
|
||||||
TypeSpec.interfaceBuilder(moduleClassName)
|
TypeSpec.interfaceBuilder(bindingContainerClassName)
|
||||||
.addAnnotation(AnnotationSpec.builder(Origin::class).addMember(CLASS_PLACEHOLDER, nodeClassName).build())
|
.addAnnotation(AnnotationSpec.builder(Origin::class).addMember(CLASS_PLACEHOLDER, nodeClassName).build())
|
||||||
.addAnnotation(BindingContainer::class)
|
.addAnnotation(BindingContainer::class)
|
||||||
.addAnnotation(AnnotationSpec.builder(ContributesTo::class).addMember(CLASS_PLACEHOLDER, scope.toTypeName()).build())
|
.addAnnotation(AnnotationSpec.builder(ContributesTo::class).addMember(CLASS_PLACEHOLDER, scope.toTypeName()).build())
|
||||||
.addFunction(
|
.addFunction(
|
||||||
FunSpec.builder("bind${ksClass.simpleName.asString()}Factory")
|
FunSpec.builder("bind${ksClass.simpleName.asString()}AssistedFactory")
|
||||||
.addModifiers(KModifier.ABSTRACT)
|
.addModifiers(KModifier.ABSTRACT)
|
||||||
.addParameter("factory", ClassName(modulePackage, "${ksClass.simpleName.asString()}_AssistedFactory"))
|
.addParameter("factory", ClassName(bindingContainerPackage, "${ksClass.simpleName.asString()}AssistedFactory"))
|
||||||
.returns(ClassName.bestGuess(assistedNodeFactoryFqName.asString()).parameterizedBy(STAR))
|
.returns(ClassName.bestGuess(assistedNodeFactoryFqName.asString()).parameterizedBy(STAR))
|
||||||
.addAnnotation(Binds::class)
|
.addAnnotation(Binds::class)
|
||||||
.addAnnotation(IntoMap::class)
|
.addAnnotation(IntoMap::class)
|
||||||
@@ -114,7 +114,7 @@ class ContributesNodeProcessor(
|
|||||||
@OptIn(KspExperimental::class)
|
@OptIn(KspExperimental::class)
|
||||||
private fun generateFactory(ksClass: KSClassDeclaration) {
|
private fun generateFactory(ksClass: KSClassDeclaration) {
|
||||||
val generatedPackage = ksClass.packageName.asString()
|
val generatedPackage = ksClass.packageName.asString()
|
||||||
val assistedFactoryClassName = "${ksClass.simpleName.asString()}_AssistedFactory"
|
val assistedFactoryClassName = "${ksClass.simpleName.asString()}AssistedFactory"
|
||||||
val constructor = ksClass.getConstructors().first { it.parameters.isNotEmpty() }
|
val constructor = ksClass.getConstructors().first { it.parameters.isNotEmpty() }
|
||||||
val assistedParameters = constructor.parameters.filter { it.isAnnotationPresent(Assisted::class) }
|
val assistedParameters = constructor.parameters.filter { it.isAnnotationPresent(Assisted::class) }
|
||||||
if (assistedParameters.size != 2) {
|
if (assistedParameters.size != 2) {
|
||||||
|
|||||||
Reference in New Issue
Block a user