Skip to content

Commit

Permalink
Move KSP util functions into compiler-utils and make them public
Browse files Browse the repository at this point in the history
  • Loading branch information
WhosNickDoglio committed Oct 17, 2024
1 parent 85f3f28 commit dbb1f8b
Show file tree
Hide file tree
Showing 31 changed files with 366 additions and 264 deletions.
99 changes: 99 additions & 0 deletions compiler-utils/api/compiler-utils.api
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,105 @@ public final class com/squareup/anvil/compiler/internal/PsiUtilsKt {
public final class com/squareup/anvil/compiler/internal/UtilsKt {
public static final fun capitalize (Ljava/lang/String;)Ljava/lang/String;
public static final fun decapitalize (Ljava/lang/String;)Ljava/lang/String;
public static final fun getFqName (Lcom/squareup/kotlinpoet/ClassName;)Lorg/jetbrains/kotlin/name/FqName;
}

public final class com/squareup/anvil/compiler/internal/ksp/KSAnnotationExtensionsKt {
public static final fun argumentAt (Lcom/google/devtools/ksp/symbol/KSAnnotation;Ljava/lang/String;)Lcom/google/devtools/ksp/symbol/KSValueArgument;
public static final fun boundTypeOrNull (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Lcom/google/devtools/ksp/symbol/KSType;
public static final fun checkNoDuplicateScope (Ljava/util/List;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Z)V
public static final fun checkNoDuplicateScopeAndBoundType (Ljava/util/List;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)V
public static final fun classNameArgumentAt (Lcom/google/devtools/ksp/symbol/KSAnnotation;Ljava/lang/String;)Lcom/squareup/kotlinpoet/ClassName;
public static final fun classNameArrayArgumentAt (Lcom/google/devtools/ksp/symbol/KSAnnotation;Ljava/lang/String;)Ljava/util/List;
public static final fun exclude (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Ljava/util/List;
public static final fun ignoreQualifier (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Z
public static final fun includes (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Ljava/util/List;
public static final fun isDaggerScope (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Z
public static final fun isMapKey (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Z
public static final fun isQualifier (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Z
public static final fun modules (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Ljava/util/List;
public static final fun parentScope (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun priorityLegacy (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Ljava/lang/Integer;
public static final fun qualifierAnnotation (Lcom/google/devtools/ksp/symbol/KSAnnotated;)Lcom/google/devtools/ksp/symbol/KSAnnotation;
public static final fun rank (Lcom/google/devtools/ksp/symbol/KSAnnotation;)I
public static final fun replaces (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Ljava/util/List;
public static final fun resolveBoundType (Lcom/google/devtools/ksp/symbol/KSAnnotation;Lcom/google/devtools/ksp/processing/Resolver;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun scope (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Lcom/google/devtools/ksp/symbol/KSType;
public static final fun scopeClassName (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Lcom/squareup/kotlinpoet/ClassName;
public static final fun scopeOrNull (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Lcom/google/devtools/ksp/symbol/KSType;
public static final fun subcomponents (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Ljava/util/List;
}

public final class com/squareup/anvil/compiler/internal/ksp/KSClassDeclarationExtensionsKt {
public static final fun checkClassExtendsBoundType (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Lorg/jetbrains/kotlin/name/FqName;Lcom/google/devtools/ksp/processing/Resolver;)V
public static final fun checkClassIsPublic (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Lkotlin/jvm/functions/Function0;)V
public static final fun checkNotMoreThanOneMapKey (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)V
public static final fun checkNotMoreThanOneQualifier (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Lorg/jetbrains/kotlin/name/FqName;)V
public static final fun checkSingleSuperType (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Lorg/jetbrains/kotlin/name/FqName;Lcom/google/devtools/ksp/processing/Resolver;)V
public static final fun isInterface (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)Z
public static final fun superTypesExcludingAny (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Lcom/google/devtools/ksp/processing/Resolver;Z)Lkotlin/sequences/Sequence;
}

public final class com/squareup/anvil/compiler/internal/ksp/KspAnvilException : java/lang/Exception {
public fun <init> (Ljava/lang/String;Lcom/google/devtools/ksp/symbol/KSNode;Ljava/lang/Throwable;)V
public synthetic fun <init> (Ljava/lang/String;Lcom/google/devtools/ksp/symbol/KSNode;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun getCause ()Ljava/lang/Throwable;
public fun getMessage ()Ljava/lang/String;
public final fun getNode ()Lcom/google/devtools/ksp/symbol/KSNode;
}

public final class com/squareup/anvil/compiler/internal/ksp/KspErrorTypeException : java/lang/Exception {
public fun <init> (Ljava/util/List;)V
public fun <init> ([Lcom/google/devtools/ksp/symbol/KSAnnotated;)V
public final fun getTypesToDefer ()Ljava/util/List;
}

public final class com/squareup/anvil/compiler/internal/ksp/KspUtilKt {
public static final fun anySymbolsWithAnnotations (Lcom/google/devtools/ksp/processing/Resolver;Ljava/util/Collection;)Z
public static final fun atLeastOneAnnotation (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Ljava/lang/String;Lcom/google/devtools/ksp/symbol/KSType;)Ljava/util/List;
public static synthetic fun atLeastOneAnnotation$default (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Ljava/lang/String;Lcom/google/devtools/ksp/symbol/KSType;ILjava/lang/Object;)Ljava/util/List;
public static final fun contextualToClassName (Lcom/google/devtools/ksp/symbol/KSType;Lcom/google/devtools/ksp/symbol/KSNode;)Lcom/squareup/kotlinpoet/ClassName;
public static final fun contextualToClassName (Lcom/google/devtools/ksp/symbol/KSTypeReference;)Lcom/squareup/kotlinpoet/ClassName;
public static final fun contextualToTypeName (Lcom/google/devtools/ksp/symbol/KSType;Lcom/google/devtools/ksp/symbol/KSNode;Lcom/squareup/kotlinpoet/ksp/TypeParameterResolver;)Lcom/squareup/kotlinpoet/TypeName;
public static final fun contextualToTypeName (Lcom/google/devtools/ksp/symbol/KSTypeReference;Lcom/squareup/kotlinpoet/ksp/TypeParameterResolver;)Lcom/squareup/kotlinpoet/TypeName;
public static synthetic fun contextualToTypeName$default (Lcom/google/devtools/ksp/symbol/KSType;Lcom/google/devtools/ksp/symbol/KSNode;Lcom/squareup/kotlinpoet/ksp/TypeParameterResolver;ILjava/lang/Object;)Lcom/squareup/kotlinpoet/TypeName;
public static synthetic fun contextualToTypeName$default (Lcom/google/devtools/ksp/symbol/KSTypeReference;Lcom/squareup/kotlinpoet/ksp/TypeParameterResolver;ILjava/lang/Object;)Lcom/squareup/kotlinpoet/TypeName;
public static final fun find (Lcom/google/devtools/ksp/symbol/KSAnnotated;Ljava/lang/String;Lcom/google/devtools/ksp/symbol/KSType;)Ljava/util/List;
public static synthetic fun find$default (Lcom/google/devtools/ksp/symbol/KSAnnotated;Ljava/lang/String;Lcom/google/devtools/ksp/symbol/KSType;ILjava/lang/Object;)Ljava/util/List;
public static final fun findAll (Lcom/google/devtools/ksp/symbol/KSAnnotated;[Ljava/lang/String;)Ljava/util/List;
public static final fun getClassDeclarationByName (Lcom/google/devtools/ksp/processing/Resolver;Lcom/squareup/kotlinpoet/ClassName;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun getClassDeclarationByName (Lcom/google/devtools/ksp/processing/Resolver;Lorg/jetbrains/kotlin/name/FqName;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun getClassId (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)Lorg/jetbrains/kotlin/name/ClassId;
public static final fun getClassesWithAnnotations (Lcom/google/devtools/ksp/processing/Resolver;Ljava/util/Collection;)Lkotlin/sequences/Sequence;
public static final fun getClassesWithAnnotations (Lcom/google/devtools/ksp/processing/Resolver;[Lorg/jetbrains/kotlin/name/FqName;)Lkotlin/sequences/Sequence;
public static final fun getDeclaringClass (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun getFqName (Lcom/google/devtools/ksp/symbol/KSAnnotation;)Lorg/jetbrains/kotlin/name/FqName;
public static final fun getFqName (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)Lorg/jetbrains/kotlin/name/FqName;
public static final fun getFqName (Lcom/google/devtools/ksp/symbol/KSType;)Lorg/jetbrains/kotlin/name/FqName;
public static final fun getKSAnnotationsByQualifiedName (Lcom/google/devtools/ksp/symbol/KSAnnotated;Ljava/lang/String;)Lkotlin/sequences/Sequence;
public static final fun getKSAnnotationsByType (Lcom/google/devtools/ksp/symbol/KSAnnotated;Lkotlin/reflect/KClass;)Lkotlin/sequences/Sequence;
public static final fun getReportableReturnTypeNode (Lcom/google/devtools/ksp/symbol/KSFunctionDeclaration;)Lcom/google/devtools/ksp/symbol/KSNode;
public static final fun getResolvableAnnotations (Lcom/google/devtools/ksp/symbol/KSAnnotated;)Lkotlin/sequences/Sequence;
public static final fun injectConstructors (Lcom/google/devtools/ksp/processing/Resolver;)Ljava/util/List;
public static final fun isAnnotationClass (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)Z
public static final fun isAnnotationPresent (Lcom/google/devtools/ksp/symbol/KSAnnotated;Ljava/lang/String;)Z
public static final fun isAnnotationPresent (Lcom/google/devtools/ksp/symbol/KSAnnotated;Lkotlin/reflect/KClass;)Z
public static final fun isExtensionDeclaration (Lcom/google/devtools/ksp/symbol/KSFunctionDeclaration;)Z
public static final fun isLateInit (Lcom/google/devtools/ksp/symbol/KSModifierListOwner;)Z
public static final fun mergeAnnotations (Lcom/google/devtools/ksp/symbol/KSAnnotated;)Ljava/util/List;
public static final fun requireClassDeclaration (Lcom/google/devtools/ksp/processing/Resolver;Lcom/squareup/kotlinpoet/ClassName;Lkotlin/jvm/functions/Function0;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun requireClassDeclaration (Lcom/google/devtools/ksp/processing/Resolver;Lorg/jetbrains/kotlin/name/FqName;Lcom/google/devtools/ksp/symbol/KSNode;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun resolveKSClassDeclaration (Lcom/google/devtools/ksp/symbol/KSDeclaration;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun resolveKSClassDeclaration (Lcom/google/devtools/ksp/symbol/KSType;)Lcom/google/devtools/ksp/symbol/KSClassDeclaration;
public static final fun returnTypeOrNull (Lcom/google/devtools/ksp/symbol/KSFunction;)Lcom/google/devtools/ksp/symbol/KSType;
public static final fun returnTypeOrNull (Lcom/google/devtools/ksp/symbol/KSFunctionDeclaration;)Lcom/google/devtools/ksp/symbol/KSType;
public static final fun toFunSpec (Lcom/google/devtools/ksp/symbol/KSFunctionDeclaration;)Lcom/squareup/kotlinpoet/FunSpec;
public static final fun toParameterSpec (Lcom/google/devtools/ksp/symbol/KSValueParameter;)Lcom/squareup/kotlinpoet/ParameterSpec;
public static final fun toPropertySpec (Lcom/google/devtools/ksp/symbol/KSPropertyDeclaration;Lcom/squareup/kotlinpoet/TypeName;)Lcom/squareup/kotlinpoet/PropertySpec;
public static synthetic fun toPropertySpec$default (Lcom/google/devtools/ksp/symbol/KSPropertyDeclaration;Lcom/squareup/kotlinpoet/TypeName;ILjava/lang/Object;)Lcom/squareup/kotlinpoet/PropertySpec;
public static final fun unwrapTypealiases (Lcom/google/devtools/ksp/symbol/KSDeclaration;)Lcom/google/devtools/ksp/symbol/KSDeclaration;
public static final fun withCompanion (Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)Lkotlin/sequences/Sequence;
public static final fun withJvmSuppressWildcardsIfNeeded (Lcom/squareup/kotlinpoet/TypeName;Lcom/google/devtools/ksp/symbol/KSAnnotated;Lcom/google/devtools/ksp/symbol/KSType;)Lcom/squareup/kotlinpoet/TypeName;
}

public abstract interface class com/squareup/anvil/compiler/internal/reference/AnnotatedReference {
Expand Down
4 changes: 3 additions & 1 deletion compiler-utils/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ dependencies {
api(project(":annotations"))
api(project(":compiler-api"))
api(libs.kotlin.compiler)
api(libs.kotlinpoet)
api(libs.ksp.api)
api(libs.kotlinpoet.ksp)

implementation(platform(libs.kotlin.bom))
implementation(libs.dagger2)
Expand All @@ -49,6 +50,7 @@ dependencies {
compileOnly(libs.junit)
compileOnly(libs.kotlin.compileTesting)
compileOnly(libs.kotlin.compileTesting.ksp)
compileOnly(libs.ksp.api)
compileOnly(libs.truth)
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
package com.squareup.anvil.compiler.internal

import com.squareup.anvil.annotations.ExperimentalAnvilApi
import com.squareup.kotlinpoet.ClassName
import org.jetbrains.kotlin.name.FqName

@ExperimentalAnvilApi
public fun String.capitalize(): String = replaceFirstChar(Char::uppercaseChar)

@ExperimentalAnvilApi
public fun String.decapitalize(): String = replaceFirstChar(Char::lowercaseChar)

public val ClassName.fqName: FqName
get() {
return FqName(canonicalName)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
@file:Suppress("invisible_reference", "invisible_member")

package com.squareup.anvil.compiler.codegen.ksp
package com.squareup.anvil.compiler.internal.ksp

import com.google.devtools.ksp.isDefault
import com.google.devtools.ksp.processing.Resolver
Expand All @@ -12,11 +12,11 @@ import com.google.devtools.ksp.symbol.KSValueArgument
import com.squareup.anvil.annotations.ContributesBinding
import com.squareup.anvil.compiler.internal.daggerScopeFqName
import com.squareup.anvil.compiler.internal.mapKeyFqName
import com.squareup.anvil.compiler.qualifierFqName
import com.squareup.anvil.compiler.internal.qualifierFqName
import com.squareup.kotlinpoet.ClassName
import org.jetbrains.kotlin.name.FqName

internal fun <T : KSAnnotation> List<T>.checkNoDuplicateScope(
public fun <T : KSAnnotation> List<T>.checkNoDuplicateScope(
annotatedType: KSClassDeclaration,
isContributeAnnotation: Boolean,
) {
Expand Down Expand Up @@ -49,7 +49,7 @@ internal fun <T : KSAnnotation> List<T>.checkNoDuplicateScope(
}
}

internal fun <T : KSAnnotation> List<T>.checkNoDuplicateScopeAndBoundType(
public fun <T : KSAnnotation> List<T>.checkNoDuplicateScopeAndBoundType(
annotatedType: KSClassDeclaration,
) {
// Exit early to avoid allocating additional collections.
Expand Down Expand Up @@ -81,27 +81,27 @@ internal fun <T : KSAnnotation> List<T>.checkNoDuplicateScopeAndBoundType(
}
}

internal fun KSAnnotation.scopeClassName(): ClassName =
public fun KSAnnotation.scopeClassName(): ClassName =
classNameArgumentAt("scope")
?: throw KspAnvilException(
message = "Couldn't find scope for ${annotationType.resolve().declaration.qualifiedName?.asString()}.",
this,
)

internal fun KSAnnotation.scope(): KSType =
public fun KSAnnotation.scope(): KSType =
scopeOrNull()
?: throw KspAnvilException(
message = "Couldn't find scope for ${annotationType.resolve().declaration.qualifiedName?.asString()}.",
this,
)

internal fun KSAnnotation.scopeOrNull(): KSType? {
public fun KSAnnotation.scopeOrNull(): KSType? {
return argumentOfTypeAt<KSType>("scope")
}

internal fun KSAnnotation.boundTypeOrNull(): KSType? = argumentOfTypeAt<KSType>("boundType")
public fun KSAnnotation.boundTypeOrNull(): KSType? = argumentOfTypeAt<KSType>("boundType")

internal fun KSAnnotation.resolveBoundType(
public fun KSAnnotation.resolveBoundType(
resolver: Resolver,
declaringClass: KSClassDeclaration,
): KSClassDeclaration {
Expand All @@ -116,17 +116,17 @@ internal fun KSAnnotation.resolveBoundType(
)
}

internal fun KSAnnotation.replaces(): List<KSClassDeclaration> = classArrayArgument("replaces")
public fun KSAnnotation.replaces(): List<KSClassDeclaration> = classArrayArgument("replaces")

internal fun KSAnnotation.subcomponents(): List<KSClassDeclaration> = classArrayArgument(
public fun KSAnnotation.subcomponents(): List<KSClassDeclaration> = classArrayArgument(
"subcomponents",
)

internal fun KSAnnotation.exclude(): List<KSClassDeclaration> = classArrayArgument("exclude")
public fun KSAnnotation.exclude(): List<KSClassDeclaration> = classArrayArgument("exclude")

internal fun KSAnnotation.modules(): List<KSClassDeclaration> = classArrayArgument("modules")
public fun KSAnnotation.modules(): List<KSClassDeclaration> = classArrayArgument("modules")

internal fun KSAnnotation.includes(): List<KSClassDeclaration> = classArrayArgument("includes")
public fun KSAnnotation.includes(): List<KSClassDeclaration> = classArrayArgument("includes")

private fun KSAnnotation.classArrayArgument(name: String): List<KSClassDeclaration> =
argumentOfTypeWithMapperAt<List<KSType>, List<KSClassDeclaration>>(
Expand All @@ -138,7 +138,7 @@ private fun KSAnnotation.classArrayArgument(name: String): List<KSClassDeclarati
}
}.orEmpty()

internal fun KSAnnotation.parentScope(): KSClassDeclaration {
public fun KSAnnotation.parentScope(): KSClassDeclaration {
return argumentOfTypeAt<KSType>("parentScope")
?.resolveKSClassDeclaration()
?: throw KspAnvilException(
Expand All @@ -147,31 +147,31 @@ internal fun KSAnnotation.parentScope(): KSClassDeclaration {
)
}

internal fun KSAnnotation.classNameArrayArgumentAt(
public fun KSAnnotation.classNameArrayArgumentAt(
name: String,
): List<ClassName>? {
return argumentOfTypeWithMapperAt<List<KSType>, List<ClassName>>(name) { arg, value ->
value.map { it.contextualToClassName(arg) }
}
}

internal fun KSAnnotation.classNameArgumentAt(
public fun KSAnnotation.classNameArgumentAt(
name: String,
): ClassName? {
return argumentOfTypeWithMapperAt<KSType, ClassName>(name) { arg, value ->
value.contextualToClassName(arg)
}
}

internal inline fun <reified T> KSAnnotation.argumentOfTypeAt(
public inline fun <reified T> KSAnnotation.argumentOfTypeAt(
name: String,
): T? {
return argumentOfTypeWithMapperAt<T, T>(name) { _, value ->
value
}
}

private inline fun <reified T, R> KSAnnotation.argumentOfTypeWithMapperAt(
public inline fun <reified T, R> KSAnnotation.argumentOfTypeWithMapperAt(
name: String,
mapper: (arg: KSValueArgument, value: T) -> R,
): R? {
Expand All @@ -189,7 +189,7 @@ private inline fun <reified T, R> KSAnnotation.argumentOfTypeWithMapperAt(
}
}

internal fun KSAnnotation.argumentAt(
public fun KSAnnotation.argumentAt(
name: String,
): KSValueArgument? {
return arguments.find { it.name?.asString() == name }
Expand All @@ -202,24 +202,24 @@ private fun KSAnnotation.isTypeAnnotatedWith(
.declaration
.isAnnotationPresent(annotationFqName.asString())

internal fun KSAnnotation.isQualifier(): Boolean = isTypeAnnotatedWith(qualifierFqName)
internal fun KSAnnotation.isMapKey(): Boolean = isTypeAnnotatedWith(mapKeyFqName)
internal fun KSAnnotation.isDaggerScope(): Boolean = isTypeAnnotatedWith(daggerScopeFqName)
public fun KSAnnotation.isQualifier(): Boolean = isTypeAnnotatedWith(qualifierFqName)
public fun KSAnnotation.isMapKey(): Boolean = isTypeAnnotatedWith(mapKeyFqName)
public fun KSAnnotation.isDaggerScope(): Boolean = isTypeAnnotatedWith(daggerScopeFqName)

internal fun KSAnnotated.qualifierAnnotation(): KSAnnotation? =
public fun KSAnnotated.qualifierAnnotation(): KSAnnotation? =
resolvableAnnotations.singleOrNull { it.isQualifier() }

internal fun KSAnnotation.ignoreQualifier(): Boolean =
public fun KSAnnotation.ignoreQualifier(): Boolean =
argumentOfTypeAt<Boolean>("ignoreQualifier") == true

internal fun KSAnnotation.rank(): Int {
public fun KSAnnotation.rank(): Int {
return argumentOfTypeAt<Int>("rank")
?: priorityLegacy()
?: ContributesBinding.RANK_NORMAL
}

@Suppress("DEPRECATION")
internal fun KSAnnotation.priorityLegacy(): Int? {
public fun KSAnnotation.priorityLegacy(): Int? {
val priorityEntry = argumentOfTypeAt<KSType>("priority") ?: return null
val name = priorityEntry.resolveKSClassDeclaration()?.simpleName?.asString() ?: return null
val priority = ContributesBinding.Priority.valueOf(name)
Expand Down
Loading

0 comments on commit dbb1f8b

Please sign in to comment.