Skip to content

Commit

Permalink
cache, invalidate, and restore generated files from CodeGenerationExt…
Browse files Browse the repository at this point in the history
…ension
  • Loading branch information
RBusarow committed Jan 30, 2024
1 parent bd7a576 commit f0a7e6d
Show file tree
Hide file tree
Showing 26 changed files with 2,149 additions and 86 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.squareup.anvil.conventions

import com.rickbusarow.kgx.buildDir
import com.rickbusarow.kgx.extras
import com.rickbusarow.kgx.fromInt
import com.rickbusarow.kgx.javaExtension
Expand Down Expand Up @@ -124,6 +125,7 @@ abstract class BasePlugin : Plugin<Project> {
* so that there is no shared mutable state.
*/
private fun configureBuildDirs(target: Project) {

when {
!target.isInAnvilBuild() -> return

Expand All @@ -135,6 +137,12 @@ abstract class BasePlugin : Plugin<Project> {
target.layout.buildDirectory.set(target.file("build/included-build"))
}
}

// Set the kase working directory ('<build directory>/kase') as a System property,
// so that it's in the right place for projects with relocated directories.
target.tasks.withType(Test::class.java).configureEach { task ->
task.systemProperty("kase.baseWorkingDir", target.buildDir().resolve("kase"))
}
}

/**
Expand Down
9 changes: 8 additions & 1 deletion compiler-api/api/compiler-api.api
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public abstract interface class com/squareup/anvil/compiler/api/AnvilContext {
public abstract fun getGenerateFactories ()Z
public abstract fun getGenerateFactoriesOnly ()Z
public abstract fun getModule ()Lorg/jetbrains/kotlin/descriptors/ModuleDescriptor;
public abstract fun getTrackSourceFiles ()Z
}

public abstract interface class com/squareup/anvil/compiler/api/CodeGenerator : com/squareup/anvil/compiler/api/AnvilApplicabilityChecker {
Expand All @@ -56,20 +57,24 @@ public final class com/squareup/anvil/compiler/api/CodeGeneratorKt {
public static final fun createGeneratedFile (Lcom/squareup/anvil/compiler/api/CodeGenerator;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)Lcom/squareup/anvil/compiler/api/GeneratedFileWithSources;
}

public abstract interface class com/squareup/anvil/compiler/api/FileWithContent {
public abstract interface class com/squareup/anvil/compiler/api/FileWithContent : java/lang/Comparable {
public abstract fun compareTo (Lcom/squareup/anvil/compiler/api/FileWithContent;)I
public abstract fun component1 ()Ljava/io/File;
public abstract fun component2 ()Ljava/lang/String;
public abstract fun getContent ()Ljava/lang/String;
public abstract fun getFile ()Ljava/io/File;
}

public final class com/squareup/anvil/compiler/api/FileWithContent$DefaultImpls {
public static fun compareTo (Lcom/squareup/anvil/compiler/api/FileWithContent;Lcom/squareup/anvil/compiler/api/FileWithContent;)I
public static fun component1 (Lcom/squareup/anvil/compiler/api/FileWithContent;)Ljava/io/File;
public static fun component2 (Lcom/squareup/anvil/compiler/api/FileWithContent;)Ljava/lang/String;
}

public final class com/squareup/anvil/compiler/api/GeneratedFile : com/squareup/anvil/compiler/api/FileWithContent {
public fun <init> (Ljava/io/File;Ljava/lang/String;)V
public fun compareTo (Lcom/squareup/anvil/compiler/api/FileWithContent;)I
public synthetic fun compareTo (Ljava/lang/Object;)I
public final fun component1 ()Ljava/io/File;
public final fun component2 ()Ljava/lang/String;
public final fun copy (Ljava/io/File;Ljava/lang/String;)Lcom/squareup/anvil/compiler/api/GeneratedFile;
Expand All @@ -83,6 +88,8 @@ public final class com/squareup/anvil/compiler/api/GeneratedFile : com/squareup/

public final class com/squareup/anvil/compiler/api/GeneratedFileWithSources : com/squareup/anvil/compiler/api/FileWithContent {
public fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/util/Set;)V
public fun compareTo (Lcom/squareup/anvil/compiler/api/FileWithContent;)I
public synthetic fun compareTo (Ljava/lang/Object;)I
public fun component1 ()Ljava/io/File;
public fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/util/Set;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,21 @@ public class AnvilCompilation internal constructor(
anvilComponentRegistrar.addCodeGenerators(mode.codeGenerators)
pluginOptions +=
listOf(
PluginOption(
pluginId = anvilCommandLineProcessor.pluginId,
optionName = "gradle-project-dir",
optionValue = workingDir.absolutePath,
),
PluginOption(
pluginId = anvilCommandLineProcessor.pluginId,
optionName = "src-gen-dir",
optionValue = File(workingDir, "build/anvil").absolutePath,
),
PluginOption(
pluginId = anvilCommandLineProcessor.pluginId,
optionName = "anvil-cache-dir",
optionValue = File(workingDir, "build/anvil-cache").absolutePath,
),
PluginOption(
pluginId = anvilCommandLineProcessor.pluginId,
optionName = "generate-dagger-factories",
Expand Down
3 changes: 2 additions & 1 deletion compiler/api/compiler.api
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@ public final class com/squareup/anvil/compiler/AnvilComponentRegistrar : org/jet

public final class com/squareup/anvil/compiler/CommandLineOptions {
public static final field Companion Lcom/squareup/anvil/compiler/CommandLineOptions$Companion;
public synthetic fun <init> (ZZZLcom/squareup/anvil/compiler/api/AnvilBackend;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (ZZZZLcom/squareup/anvil/compiler/api/AnvilBackend;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getBackend ()Lcom/squareup/anvil/compiler/api/AnvilBackend;
public final fun getDisableComponentMerging ()Z
public final fun getGenerateFactories ()Z
public final fun getGenerateFactoriesOnly ()Z
public final fun getTrackSourceFiles ()Z
}

public final class com/squareup/anvil/compiler/CommandLineOptions$Companion {
Expand Down
4 changes: 3 additions & 1 deletion compiler/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,13 @@ dependencies {

testImplementation(testFixtures(project(":compiler-utils")))
testImplementation(libs.dagger2.compiler)
testImplementation(libs.kase)
testImplementation(libs.kotest.assertions.core.jvm)
testImplementation(libs.kotlin.annotationProcessingEmbeddable)
testImplementation(libs.kotlin.compileTesting)
testImplementation(libs.kotlin.compileTesting.ksp)
testImplementation(libs.ksp.compilerPlugin)
testImplementation(libs.kotlin.compiler)
testImplementation(libs.kotlin.test)
testImplementation(libs.ksp.compilerPlugin)
testImplementation(libs.truth)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,18 @@ import org.jetbrains.kotlin.compiler.plugin.CliOption
import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
import java.io.File

internal const val srcGenDirName = "src-gen-dir"
internal val srcGenDirKey = CompilerConfigurationKey.create<String>("anvil $srcGenDirName")
internal val srcGenDirKey = CompilerConfigurationKey.create<File>("anvil $srcGenDirName")

internal const val anvilCacheDirName = "anvil-cache-dir"
internal val anvilCacheDirKey =
CompilerConfigurationKey.create<File>("anvil $anvilCacheDirName")

internal const val gradleProjectDirName = "gradle-project-dir"
internal val gradleProjectDirKey =
CompilerConfigurationKey.create<File>("anvil $gradleProjectDirName")

internal const val generateDaggerFactoriesName = "generate-dagger-factories"
internal val generateDaggerFactoriesKey =
Expand Down Expand Up @@ -39,13 +48,27 @@ public class AnvilCommandLineProcessor : CommandLineProcessor {
override val pluginId: String = "com.squareup.anvil.compiler"

override val pluginOptions: Collection<AbstractCliOption> = listOf(
CliOption(
optionName = gradleProjectDirName,
valueDescription = "<file-path>",
description = "The root directory of the consuming project",
required = false,
allowMultipleOccurrences = false,
),
CliOption(
optionName = srcGenDirName,
valueDescription = "<file-path>",
description = "Path to directory in which Anvil specific code should be generated",
required = false,
allowMultipleOccurrences = false,
),
CliOption(
optionName = anvilCacheDirName,
valueDescription = "<file-path>",
description = "Path to directory where Anvil stores its incremental compilation state",
required = false,
allowMultipleOccurrences = false,
),
CliOption(
optionName = generateDaggerFactoriesName,
valueDescription = "<true|false>",
Expand Down Expand Up @@ -94,7 +117,10 @@ public class AnvilCommandLineProcessor : CommandLineProcessor {
configuration: CompilerConfiguration,
) {
when (option.optionName) {
srcGenDirName -> configuration.put(srcGenDirKey, value)

gradleProjectDirName -> configuration.put(gradleProjectDirKey, File(value))
srcGenDirName -> configuration.put(srcGenDirKey, File(value))
anvilCacheDirName -> configuration.put(anvilCacheDirKey, File(value))
generateDaggerFactoriesName ->
configuration.put(generateDaggerFactoriesKey, value.toBoolean())

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.squareup.anvil.compiler.api.CodeGenerator
import com.squareup.anvil.compiler.codegen.BindingModuleGenerator
import com.squareup.anvil.compiler.codegen.CodeGenerationExtension
import com.squareup.anvil.compiler.codegen.ContributesSubcomponentHandlerGenerator
import com.squareup.anvil.compiler.codegen.incremental.ProjectDir
import com.squareup.anvil.compiler.codegen.reference.RealAnvilModuleDescriptor
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.com.intellij.mock.MockProject
Expand All @@ -19,7 +20,6 @@ import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import java.io.File
import java.util.ServiceLoader
import kotlin.LazyThreadSafetyMode.NONE

Expand Down Expand Up @@ -62,7 +62,9 @@ public class AnvilComponentRegistrar : ComponentRegistrar {
return
}

val sourceGenFolder = File(configuration.getNotNull(srcGenDirKey))
val sourceGenFolder = configuration.getNotNull(srcGenDirKey)
val cacheDir = configuration.getNotNull(anvilCacheDirKey)
val projectDir = ProjectDir(configuration.getNotNull(gradleProjectDirKey))
val trackSourceFiles = configuration.getNotNull(trackSourceFilesKey)

val codeGenerators = loadCodeGenerators() +
Expand All @@ -82,10 +84,12 @@ public class AnvilComponentRegistrar : ComponentRegistrar {
AnalysisHandlerExtension.registerExtensionFirst(
project,
CodeGenerationExtension(
codeGenDir = sourceGenFolder,
codeGenerators = codeGenerators,
commandLineOptions = commandLineOptions,
moduleDescriptorFactory = moduleDescriptorFactory,
projectDir = projectDir,
srcGenDir = sourceGenFolder,
cacheDir = cacheDir,
trackSourceFiles = trackSourceFiles,
),
)
Expand Down
Loading

0 comments on commit f0a7e6d

Please sign in to comment.