Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(WIP) Support Dagger KSP #713

Closed
wants to merge 65 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
b6c2859
Add dependencies
ZacSweers Feb 8, 2023
faa02d4
Update dagger to latest for KSP support
ZacSweers Feb 8, 2023
a124fe5
Extract modulemerger code to make it more reusable
ZacSweers May 29, 2023
93dbb57
Add new KSP option to Anvil plugin
ZacSweers May 29, 2023
1949ec2
Add necessary deps
ZacSweers May 29, 2023
c51fca5
Implement most of module merging
ZacSweers May 29, 2023
3daeaa5
Refactor InterfaceMerger for reuse
ZacSweers May 29, 2023
6060c79
Implement interface merging in KSP
ZacSweers Jun 8, 2023
762623b
Merge branch 'main' into z/kspSupport
ZacSweers Jun 8, 2023
e79b69b
Merge conflicts
ZacSweers Jun 8, 2023
ff1e452
Update KSP to match kotlin
ZacSweers Jun 8, 2023
e0b053a
Clean up module merger
ZacSweers Jun 8, 2023
6b922a9
Make ktlint happy
ZacSweers Jun 8, 2023
72e746d
Merge branch 'main' into z/kspSupport
ZacSweers Jun 8, 2023
bec3077
Introduce DaggerAnnotationProcessingMode to better control dagger pro…
ZacSweers Jun 8, 2023
f443f6f
Add KSP impls to testImplementation
ZacSweers Jun 8, 2023
2a05a90
WIP try making KCT compile KSP-generated code
ZacSweers Jun 20, 2023
9dd02f3
Merge branch 'main' into z/kspSupport
ZacSweers Jul 30, 2023
4e0e7de
Finish implementing module merging
ZacSweers Jul 30, 2023
0009120
Merge branch 'main' into z/kspSupport
ZacSweers Aug 2, 2023
ed92f73
Merge cleanups
ZacSweers Aug 2, 2023
45ffc64
Remove commented code
ZacSweers Aug 2, 2023
a4c2a61
More merge cleanup
ZacSweers Aug 2, 2023
3a90532
Simplify test stuff again
ZacSweers Aug 2, 2023
bfdc4b4
Additive
ZacSweers Aug 2, 2023
3b95dad
Another merge conflict
ZacSweers Aug 2, 2023
c6b475d
Update deps
ZacSweers Aug 2, 2023
790b65a
Restore
ZacSweers Aug 2, 2023
6a9068f
Exclude the dagger processor from service loading
ZacSweers Aug 2, 2023
46d2f73
Get tests running across all three modes
ZacSweers Aug 3, 2023
4e7ef73
Link issue
ZacSweers Aug 3, 2023
d9ee416
Tidy up some naming and visibility
ZacSweers Aug 3, 2023
00fd7f0
Fix invisible access
ZacSweers Aug 3, 2023
e50ab45
Align name of resolver
ZacSweers Aug 3, 2023
e2af1e7
Fix test with illegal parameter name
ZacSweers Aug 3, 2023
e67fbd1
Formatting
ZacSweers Aug 3, 2023
99658b3
Update gradle extension setup
ZacSweers Aug 3, 2023
7faeb72
Small fixes
ZacSweers Aug 3, 2023
32857de
Merge branch 'main' into z/kspSupport
ZacSweers Sep 9, 2023
489b5a8
Update Dagger
ZacSweers Sep 9, 2023
7b262f5
Extract MergeAnnotationMapper abstraction
ZacSweers Sep 9, 2023
cea1873
Merge branch 'main' into z/kspSupport
ZacSweers Oct 15, 2023
e00cf6e
Implement v2 of KSP impl
ZacSweers Oct 18, 2023
e31a161
Delete old impl
ZacSweers Oct 18, 2023
c5a4ec6
Delete old module merger
ZacSweers Oct 18, 2023
1a10c0c
Fix ref to new one
ZacSweers Oct 18, 2023
2b31908
Fix hint package handling
ZacSweers Oct 18, 2023
6546ac7
Creators are optional, also exclude ANY supertypes
ZacSweers Oct 18, 2023
4eb8f4a
Split behavior of merge modules and components
ZacSweers Oct 18, 2023
bc3b6c4
Handle different includes names
ZacSweers Oct 18, 2023
9122169
Better error message for missing fq names
ZacSweers Oct 18, 2023
0cc2c93
Merge branch 'main' into z/kspSupport
ZacSweers Dec 25, 2023
8b48aab
Update gradle files
ZacSweers Dec 25, 2023
0fcd0a7
Merge fixes
ZacSweers Dec 25, 2023
d0cfb46
Formatting
ZacSweers Dec 25, 2023
af31f8b
Misc fixes
ZacSweers Dec 25, 2023
64411d3
Add dagger processor to compilation when processing with dagger
ZacSweers Dec 25, 2023
e0fd618
Allow dagger ksp and anvil ksp
ZacSweers Dec 25, 2023
931da56
More fixes
ZacSweers Dec 25, 2023
181084d
Add compilation helper
ZacSweers Dec 25, 2023
543b0b4
Update to latest dagger with improved KSP support
ZacSweers Dec 25, 2023
8a36de4
More fixes
ZacSweers Dec 25, 2023
daf2e9e
Formatting
ZacSweers Dec 25, 2023
dab8e67
Force later guava version in tests
ZacSweers Dec 25, 2023
9dd25fe
Lower dagger version for now
ZacSweers Dec 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Finish implementing module merging
ZacSweers committed Jul 30, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit 4e0e7de5bfcc5fb63bcae2f64b55256d615c65e7
Original file line number Diff line number Diff line change
@@ -229,20 +229,20 @@ public fun compileAnvil(
block: Result.() -> Unit = { },
): Result {
return compileAnvilWithCompilation(
sources = sources,
daggerAnnotationProcessingMode = daggerAnnotationProcessingMode,
generateDaggerFactories = generateDaggerFactories,
generateDaggerFactoriesOnly = generateDaggerFactoriesOnly,
disableComponentMerging = disableComponentMerging,
allWarningsAsErrors = allWarningsAsErrors,
messageOutputStream = messageOutputStream,
workingDir = workingDir,
enableExperimentalAnvilApis = enableExperimentalAnvilApis,
previousCompilationResult = previousCompilationResult,
codeGenerators = codeGenerators,
moduleName = moduleName,
jvmTarget = jvmTarget,
block = { block() }
sources = sources,
daggerAnnotationProcessingMode = daggerAnnotationProcessingMode,
generateDaggerFactories = generateDaggerFactories,
generateDaggerFactoriesOnly = generateDaggerFactoriesOnly,
disableComponentMerging = disableComponentMerging,
allWarningsAsErrors = allWarningsAsErrors,
messageOutputStream = messageOutputStream,
workingDir = workingDir,
enableExperimentalAnvilApis = enableExperimentalAnvilApis,
previousCompilationResult = previousCompilationResult,
codeGenerators = codeGenerators,
moduleName = moduleName,
jvmTarget = jvmTarget,
block = { block() }
)
}

Original file line number Diff line number Diff line change
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.codegen.ImplementationBodyCodegen
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.org.objectweb.asm.Type

/**
@@ -32,17 +31,12 @@ import org.jetbrains.org.objectweb.asm.Type
*/
internal object ModuleMerger {

internal data class MergeResult(
val predefinedModules: List<ClassReference>,
val contributedModuleTypes: Set<ClassReference>
)

fun mergeModules(
classScanner: ClassScanner,
module: RealAnvilModuleDescriptor,
clazz: ClassReference,
annotations: List<AnnotationReference>
): MergeResult {
): Set<ClassReference> {
val scopes = annotations.map { it.scope() }

val predefinedModules = annotations.flatMap {
@@ -203,10 +197,12 @@ internal object ModuleMerger {
.minus(replacedModulesByContributedBindings.toSet())
.minus(replacedModulesByContributedMultibindings.toSet())
.minus(excludedModules.toSet())
.plus(predefinedModules)
.plus(contributedSubcomponentModules)
.distinct()
.toSet()

return MergeResult(predefinedModules, contributedModuleTypes)
return contributedModuleTypes
}

@Suppress("UNCHECKED_CAST")
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package com.squareup.anvil.compiler.ksp

import com.google.auto.service.AutoService
import com.google.devtools.ksp.getClassDeclarationByName
import com.google.devtools.ksp.isLocal
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.processing.SymbolProcessor
import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
import com.google.devtools.ksp.processing.SymbolProcessorProvider
import com.google.devtools.ksp.processing.impl.KSNameImpl
import com.google.devtools.ksp.processing.impl.ResolverImpl
import com.google.devtools.ksp.symbol.KSAnnotated
import com.google.devtools.ksp.symbol.KSAnnotation
import com.google.devtools.ksp.symbol.KSClassDeclaration
import com.google.devtools.ksp.symbol.KSDeclaration
import com.google.devtools.ksp.symbol.KSName
import com.google.devtools.ksp.symbol.KSNode
import com.google.devtools.ksp.symbol.KSReferenceElement
import com.google.devtools.ksp.symbol.KSType
@@ -26,10 +27,10 @@ import com.google.devtools.ksp.symbol.impl.binary.KSAnnotationDescriptorImpl
import com.google.devtools.ksp.symbol.impl.java.KSAnnotationJavaImpl
import com.google.devtools.ksp.symbol.impl.kotlin.KSAnnotationImpl
import com.google.devtools.ksp.symbol.impl.kotlin.KSTypeImpl
import com.google.devtools.ksp.symbol.impl.kotlin.KSValueArgumentLiteImpl
import com.squareup.anvil.compiler.ClassScanner
import com.squareup.anvil.compiler.InterfaceMerger
import com.squareup.anvil.compiler.ModuleMerger
import com.squareup.anvil.compiler.ModuleMerger.MergeResult
import com.squareup.anvil.compiler.codegen.findAll
import com.squareup.anvil.compiler.codegen.reference.RealAnvilModuleDescriptor
import com.squareup.anvil.compiler.internal.reference.AnnotationReference
@@ -193,14 +194,14 @@ class DecoratedResolver(private val delegate: Resolver) : Resolver by delegate {
return this
}

val moduleMergeResult = ModuleMerger.mergeModules(
val mergedModules = ModuleMerger.mergeModules(
classScanner,
module,
clazz,
mergeAnnotationReferences,
)
val newAnnotations = annotations + moduleMergeResult
.toModuleAnnotation(annotationClassReference, filteredMergeAnnotations[0])
val newAnnotations = annotations +
ModuleKSAnnotation(filteredMergeAnnotations[0], mergedModules, delegate)

return replaceAnnotations(newAnnotations.toList())
}
@@ -261,19 +262,24 @@ private fun KSDeclaration.shouldIgnore(): Boolean {
return qualifiedName == null || isLocal()
}

// TODO implement this
private fun MergeResult.toModuleAnnotation(
classReference: ClassReference,
delegate: KSAnnotation,
): KSAnnotation {
return object : KSAnnotation by delegate {
override val annotationType: KSTypeReference
get() = TODO("Not yet implemented")
override val arguments: List<KSValueArgument>
get() = TODO("Not yet implemented")
override val defaultArguments: List<KSValueArgument>
get() = TODO("Not yet implemented")
override val shortName: KSName
get() = TODO("Not yet implemented")
}
class ModuleKSAnnotation(
private val delegate: KSAnnotation,
private val mergedModules: Set<ClassReference>,
private val resolver: Resolver,
) : KSAnnotation by delegate {
override val arguments: List<KSValueArgument>
get() = listOf(
KSValueArgumentLiteImpl.getCached(
name = KSNameImpl.getCached("modules"),
value = listOf(
mergedModules.map { type ->
resolver.getClassDeclarationByName(type.fqName.asString())!!.asType(emptyList())
}
),
parent = this,
origin = origin
)
)
override val defaultArguments: List<KSValueArgument>
get() = emptyList()
}
Original file line number Diff line number Diff line change
@@ -4,17 +4,14 @@ import com.google.common.truth.Truth.assertThat
import com.squareup.anvil.compiler.injectClass
import com.squareup.anvil.compiler.internal.testing.AnvilCompilation
import com.squareup.anvil.compiler.internal.testing.DaggerAnnotationProcessingMode
import com.squareup.anvil.compiler.internal.testing.compileAnvil
import com.squareup.anvil.compiler.internal.testing.compileAnvilWithCompilation
import com.squareup.anvil.compiler.internal.testing.createInstance
import com.squareup.anvil.compiler.internal.testing.factoryClass
import com.squareup.anvil.compiler.internal.testing.getPropertyValue
import com.squareup.anvil.compiler.internal.testing.isStatic
import com.squareup.anvil.compiler.isError
import com.squareup.anvil.compiler.isFullTestRun
import com.tschuchort.compiletesting.KotlinCompilation.ExitCode.OK
import com.tschuchort.compiletesting.KotlinCompilation.Result
import com.tschuchort.compiletesting.kspWithCompilation
import dagger.Lazy
import dagger.internal.Factory
import org.intellij.lang.annotations.Language
@@ -24,7 +21,6 @@ import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.junit.runners.Parameterized.Parameters
import java.io.File
import java.net.URLClassLoader
import javax.inject.Provider

@RunWith(Parameterized::class)
@@ -2725,15 +2721,15 @@ public final class InjectClass_Factory implements Factory<InjectClass> {
)
}

//private fun mergedClassLoader(
// private fun mergedClassLoader(
// result: Result,
// compilation: AnvilCompilation,
//): ClassLoader {
// ): ClassLoader {
// val resultClassLoader = result.classLoader
// val kspClassesClassLoader = compilation.kotlinCompilation.kspWithCompilation
// return URLClassLoader(
// this.ks
// classpath.map { it.toUri().toURL() }.toTypedArray(),
// null
// )
//}
// }