From 78f38241220cce2eb7b3f2be1e7dbfe1f24d3aff Mon Sep 17 00:00:00 2001 From: Gabriel Ittner Date: Sun, 16 Jul 2023 14:21:53 +0200 Subject: [PATCH] add optional annotations artifact --- annotations-optional/build.gradle | 12 ++++++ annotations-optional/gradle.properties | 3 ++ .../anvil/annotations/optional/ForScope.kt | 35 ++++++++++++++++ .../anvil/annotations/optional/SingleIn.kt | 40 +++++++++++++++++++ settings.gradle | 1 + 5 files changed, 91 insertions(+) create mode 100644 annotations-optional/build.gradle create mode 100644 annotations-optional/gradle.properties create mode 100644 annotations-optional/src/main/java/com/squareup/anvil/annotations/optional/ForScope.kt create mode 100644 annotations-optional/src/main/java/com/squareup/anvil/annotations/optional/SingleIn.kt diff --git a/annotations-optional/build.gradle b/annotations-optional/build.gradle new file mode 100644 index 000000000..20cfc4a33 --- /dev/null +++ b/annotations-optional/build.gradle @@ -0,0 +1,12 @@ +plugins { + alias(libs.plugins.kotlin.jvm) +} +apply from: rootProject.file('publishing.gradle') + +kotlin { + explicitApi() +} + +dependencies { + api libs.inject +} diff --git a/annotations-optional/gradle.properties b/annotations-optional/gradle.properties new file mode 100644 index 000000000..7e80e29bf --- /dev/null +++ b/annotations-optional/gradle.properties @@ -0,0 +1,3 @@ +POM_NAME=Anvil Optional Annotations +POM_ARTIFACT_ID=annotations-optional +POM_PACKAGING=jar diff --git a/annotations-optional/src/main/java/com/squareup/anvil/annotations/optional/ForScope.kt b/annotations-optional/src/main/java/com/squareup/anvil/annotations/optional/ForScope.kt new file mode 100644 index 000000000..31aba0921 --- /dev/null +++ b/annotations-optional/src/main/java/com/squareup/anvil/annotations/optional/ForScope.kt @@ -0,0 +1,35 @@ +package com.squareup.anvil.annotations.optional + +import kotlin.annotation.AnnotationRetention.RUNTIME +import kotlin.reflect.KClass +import javax.inject.Qualifier + +/** + * A class based [qualfier](Qualifier). + * + * This can be used in combination with other Anvil annotations to avoid having + * to manually define qualifier annotations for each component and to maintain + * consistency. + * + * Example: + * ``` + * interface Authenticator + * + * @ForScope(AppScope::class) + * @ContributesBinding(AppScope::class) + * class CommonAuthenticator @Inject constructor() : Authenticator + * + * @ForScope(UserScope::class) + * @ContributesBinding(UserScope::class) + * class UserAuthenticator @Inject constructor() : Authenticator + * ``` + */ +@Qualifier +@Retention(RUNTIME) +public annotation class ForScope( + /** + * The marker that identifies the component in which the annotated object is + * provided or bound in. + */ + val scope: KClass<*>, +) diff --git a/annotations-optional/src/main/java/com/squareup/anvil/annotations/optional/SingleIn.kt b/annotations-optional/src/main/java/com/squareup/anvil/annotations/optional/SingleIn.kt new file mode 100644 index 000000000..e67591f1f --- /dev/null +++ b/annotations-optional/src/main/java/com/squareup/anvil/annotations/optional/SingleIn.kt @@ -0,0 +1,40 @@ +package com.squareup.anvil.annotations.optional + +import kotlin.annotation.AnnotationRetention.RUNTIME +import kotlin.reflect.KClass +import javax.inject.Scope + +/** + * Identifies a type that the injector only instantiates once for the given + * [scope] marker. + * + * This can be used in combination with other Anvil annotations to avoid having + * to manually define scope annotations for each component and to maintain + * consistency. + * + * Component example: + * ``` + * @SingleIn(AppScope::class) + * @MergeComponent(AppScope::class) + * interface AppComponent + * ``` + * + * Contribution example: + * ``` + * interface Authenticator + * + * @SingleIn(AppScope::class) + * @ContributesBinding(AppScope::class) + * class RealAuthenticator @Inject constructor() : Authenticator + * ``` + * + * See Also: [@Scope](Scope) + */ +@Scope +@Retention(RUNTIME) +public annotation class SingleIn( + /** + * The marker that identifies this scope. + */ + val scope: KClass<*>, +) diff --git a/settings.gradle b/settings.gradle index 232fa9d17..e7d01433b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -39,6 +39,7 @@ dependencyResolutionManagement { } include ':annotations' +include ':annotations-optional' include ':compiler' include ':compiler-api' include ':compiler-utils'