Skip to content

Commit

Permalink
Add a scope to the @ContributesApi annotation.
Browse files Browse the repository at this point in the history
  • Loading branch information
vRallev committed May 31, 2022
1 parent 3e4b196 commit 95161e9
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.gpeal.droidconanvilsample.anvilcompilers


import com.google.auto.service.AutoService
import com.gpeal.droidconanvilsample.lib.daggerscopes.AppScope
import com.gpeal.droidconanvilsample.lib.daggerscopes.ContributesApi
import com.squareup.anvil.annotations.ContributesTo
import com.squareup.anvil.compiler.api.AnvilContext
Expand All @@ -27,6 +25,8 @@ import org.jetbrains.kotlin.psi.KtFile
import retrofit2.Retrofit
import java.io.File

private val contributesApiFqName = ContributesApi::class.fqName

@Suppress("unused")
@AutoService(CodeGenerator::class)
class ContributesApiCodeGenerator : CodeGenerator {
Expand All @@ -35,15 +35,20 @@ class ContributesApiCodeGenerator : CodeGenerator {

override fun generateCode(codeGenDir: File, module: ModuleDescriptor, projectFiles: Collection<KtFile>): Collection<GeneratedFile> {
return projectFiles.classAndInnerClassReferences(module)
.filter { it.isAnnotatedWith(ContributesApi::class.fqName) }
.filter { it.isAnnotatedWith(contributesApiFqName) }
.map { generateModule(it, codeGenDir) }
.toList()
}

private fun generateModule(apiClass: ClassReference, codeGenDir: File): GeneratedFile {
val generatedPackage = apiClass.packageFqName.toString()
val moduleClassName = "${apiClass.shortName}_Module"
val scope = AppScope::class.asClassName()

val scope = apiClass.annotations
.single { it.fqName == contributesApiFqName }
.scope()
.asClassName()

// Generate a Dagger module file called MyApi_Module.
val content = FileSpec.buildFile(generatedPackage, moduleClassName) {
addType(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.gpeal.droidconanvilsample.anvilcompilers

import com.google.common.truth.Truth.assertThat
import com.squareup.anvil.annotations.ContributesTo
import com.squareup.anvil.compiler.internal.testing.compileAnvil
import com.tschuchort.compiletesting.KotlinCompilation.ExitCode.OK
import dagger.Provides
import dagger.Reusable
import org.junit.Test
import java.lang.reflect.AnnotatedElement

class ContributesApiCodeGeneratorTest {

Expand All @@ -16,17 +18,27 @@ class ContributesApiCodeGeneratorTest {
import com.gpeal.droidconanvilsample.lib.daggerscopes.ContributesApi
@ContributesApi
@ContributesApi(Any::class)
interface TestApi
"""
) {
assertThat(exitCode).isEqualTo(OK)

val clazz = classLoader.loadClass("com.test.TestApi_Module")

val contributesToAnnotation = clazz.annotation<ContributesTo>()
assertThat(contributesToAnnotation.scope).isEqualTo(Any::class)

val providerMethod = clazz.declaredMethods.single()

assertThat(providerMethod.returnType).isEqualTo(classLoader.loadClass("com.test.TestApi"))
assertThat(providerMethod.annotations.map { it.annotationClass }).containsExactly(Provides::class, Reusable::class)
}
}
}
}

inline fun <reified T> AnnotatedElement.annotationOrNull(): T? =
annotations.singleOrNull { it.annotationClass == T::class } as? T

inline fun <reified T> AnnotatedElement.annotation(): T =
requireNotNull(annotationOrNull<T>()) { "Couldn't find annotation ${T::class}" }
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gpeal.droidconanvilsample.feature.weatherdata

import com.gpeal.droidconanvilsample.lib.daggerscopes.ContributesApi
import com.gpeal.droidconanvilsample.lib.daggerscopes.WeatherScope
import com.squareup.moshi.Json
import retrofit2.http.GET
import retrofit2.http.Path
Expand All @@ -10,7 +11,7 @@ import retrofit2.http.Path
* Normally, you would need to create a Dagger module and provide this by hand.
* Refer to the :anvilcodegen module for how this works.
*/
@ContributesApi
@ContributesApi(WeatherScope::class)
interface WeatherApi {
@GET("data/weather/{query}")
suspend fun getWeather(@Path("query") query: String): WeatherResponse
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.gpeal.droidconanvilsample.lib.daggerscopes

import kotlin.reflect.KClass

/**
* Annotate a retrofit interface with this to automatically contribute it to the [AppScope] graph.
* Annotate a retrofit interface with this to automatically contribute it to the specified scope.
* Equivalent to the following declaration in an application module:
*
* @Provides
Expand All @@ -11,4 +13,4 @@ package com.gpeal.droidconanvilsample.lib.daggerscopes
* The generated code created via the :anvilcodegen module.
*/
@Target(AnnotationTarget.CLASS)
annotation class ContributesApi
annotation class ContributesApi(val scope: KClass<*>)

0 comments on commit 95161e9

Please sign in to comment.