From a5020ddb3c2f3bcc493fa26b667f3fb0c6bcb894 Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Wed, 17 Apr 2019 18:12:11 -0700 Subject: [PATCH] Support gradle incremental processing in code gen (#824) * Support gradle incremental processing in code gen This adds support for incremental compilation in gradle via incap helper and marking the code gen as `ISOLATING`. Depends on a newer version of KotlinPoet that has https://github.com/square/kotlinpoet/pull/647 Resolves #589 * Opportunistically update to auto-service 1.0-rc5 Supports incremental compilation and moves annotations to a separate artifact * 1.2.0 final! * Mark compiler embeddales as test only --- kotlin/codegen/pom.xml | 23 +++++++++++++++---- .../moshi/kotlin/codegen/AdapterGenerator.kt | 2 ++ .../codegen/JsonClassCodegenProcessor.kt | 22 ++++-------------- kotlin/tests/pom.xml | 2 +- pom.xml | 2 ++ 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/kotlin/codegen/pom.xml b/kotlin/codegen/pom.xml index 736f8ce..21da5a3 100644 --- a/kotlin/codegen/pom.xml +++ b/kotlin/codegen/pom.xml @@ -25,7 +25,14 @@ com.squareup kotlinpoet - 1.1.0 + 1.2.0 + + + net.ltgt.gradle.incap + incap + ${incap.version} + provided + true com.google.auto @@ -34,9 +41,10 @@ com.google.auto.service - auto-service - 1.0-rc4 + auto-service-annotations + ${autoservice.version} provided + true junit @@ -56,10 +64,12 @@ org.jetbrains.kotlin kotlin-compiler-embeddable + test org.jetbrains.kotlin kotlin-annotation-processing-embeddable + test me.eugeniomarletti.kotlin.metadata @@ -101,7 +111,12 @@ com.google.auto.service auto-service - 1.0-rc4 + ${autoservice.version} + + + net.ltgt.gradle.incap + incap-processor + ${incap.version} diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/AdapterGenerator.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/AdapterGenerator.kt index a75740d..0deba31 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/AdapterGenerator.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/AdapterGenerator.kt @@ -52,6 +52,7 @@ internal class AdapterGenerator( private val nameAllocator = NameAllocator() private val adapterName = "${className.simpleNames.joinToString(separator = "_")}JsonAdapter" + private val originalElement = target.element private val originalTypeName = target.element.asType().asTypeName() private val moshiParam = ParameterSpec.builder( @@ -97,6 +98,7 @@ internal class AdapterGenerator( private fun generateType(generatedOption: TypeElement?): TypeSpec { val result = TypeSpec.classBuilder(adapterName) + .addOriginatingElement(originalElement) generatedOption?.let { result.addAnnotation(AnnotationSpec.builder(it.asClassName()) diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessor.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessor.kt index 4821772..ce3834e 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessor.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/JsonClassCodegenProcessor.kt @@ -16,12 +16,12 @@ package com.squareup.moshi.kotlin.codegen import com.google.auto.service.AutoService -import com.squareup.kotlinpoet.TypeSpec import com.squareup.moshi.JsonClass import me.eugeniomarletti.kotlin.metadata.KotlinMetadataUtils import me.eugeniomarletti.kotlin.metadata.declaresDefaultValue import me.eugeniomarletti.kotlin.processing.KotlinAbstractProcessor -import java.io.File +import net.ltgt.gradle.incap.IncrementalAnnotationProcessor +import net.ltgt.gradle.incap.IncrementalAnnotationProcessorType.ISOLATING import javax.annotation.processing.ProcessingEnvironment import javax.annotation.processing.Processor import javax.annotation.processing.RoundEnvironment @@ -42,6 +42,7 @@ import javax.tools.Diagnostic.Kind.ERROR * If you don't want this though, you can use the runtime [JsonClass] factory implementation. */ @AutoService(Processor::class) +@IncrementalAnnotationProcessor(ISOLATING) class JsonClassCodegenProcessor : KotlinAbstractProcessor(), KotlinMetadataUtils { companion object { @@ -86,7 +87,8 @@ class JsonClassCodegenProcessor : KotlinAbstractProcessor(), KotlinMetadataUtils val jsonClass = type.getAnnotation(annotation) if (jsonClass.generateAdapter) { val generator = adapterGenerator(type) ?: continue - generator.generateAndWrite(generatedType) + generator.generateFile(generatedType) + .writeTo(filer) } } @@ -123,18 +125,4 @@ class JsonClassCodegenProcessor : KotlinAbstractProcessor(), KotlinMetadataUtils return AdapterGenerator(type, sortedProperties) } - - private fun AdapterGenerator.generateAndWrite(generatedOption: TypeElement?) { - val fileSpec = generateFile(generatedOption) - val adapterName = fileSpec.members.filterIsInstance().first().name!! - val outputDir = generatedDir ?: mavenGeneratedDir(adapterName) - fileSpec.writeTo(outputDir) - } - - private fun mavenGeneratedDir(adapterName: String): File { - // Hack since the maven plugin doesn't supply `kapt.kotlin.generated` option - // Bug filed at https://youtrack.jetbrains.com/issue/KT-22783 - val file = filer.createSourceFile(adapterName).toUri().let(::File) - return file.parentFile.also { file.delete() } - } } diff --git a/kotlin/tests/pom.xml b/kotlin/tests/pom.xml index 2b91baf..fb1523e 100644 --- a/kotlin/tests/pom.xml +++ b/kotlin/tests/pom.xml @@ -108,7 +108,7 @@ src/test/kotlin src/test/java - target/generated-sources/kaptKotlin/test + target/generated-sources/kapt/test diff --git a/pom.xml b/pom.xml index 10e3daf..3ef492f 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,8 @@ 1.4.0 0.9.17 3.1.0 + 0.2 + 1.0-rc5 1.16.0