From 47f5dd8ce9105b9e192dab36c62d77e5013d5a1f Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Fri, 5 May 2023 18:43:30 -0400 Subject: [PATCH 1/5] Update kotlin and gradle infrastructure --- gradle/libs.versions.toml | 16 ++++++++-------- kotlin/codegen/build.gradle.kts | 3 +++ .../moshi/kotlin/codegen/api/AdapterGenerator.kt | 8 ++++++-- moshi/build.gradle.kts | 4 ++++ 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0ea7945bb..577513097 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,14 +16,14 @@ autoService = "1.0" gjf = "1.11.0" jvmTarget = "1.8" -kotlin = "1.7.0" -kotlinCompileTesting = "1.4.9" -kotlinpoet = "1.12.0" -ksp = "1.7.0-1.0.6" +kotlin = "1.8.21" +kotlinCompileTesting = "0.2.1" +kotlinpoet = "1.13.2" +ksp = "1.8.21-1.0.11" ktlint = "0.41.0" [plugins] -dokka = { id = "org.jetbrains.dokka", version = "1.7.0" } +dokka = { id = "org.jetbrains.dokka", version = "1.8.10" } japicmp = { id = "me.champeau.gradle.japicmp", version = "0.2.9" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } mavenPublish = { id = "com.vanniktech.maven.publish", version = "0.21.0" } @@ -42,7 +42,7 @@ kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = kotlinpoet = { module = "com.squareup:kotlinpoet", version.ref = "kotlinpoet" } kotlinpoet-metadata = { module = "com.squareup:kotlinpoet-metadata", version.ref = "kotlinpoet" } kotlinpoet-ksp = { module = "com.squareup:kotlinpoet-ksp", version.ref = "kotlinpoet" } -kotlinxMetadata = "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0" +kotlinxMetadata = "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.0" ksp = { module = "com.google.devtools.ksp:symbol-processing", version.ref = "ksp" } ksp-api = { module = "com.google.devtools.ksp:symbol-processing-api", version.ref = "ksp" } okio = "com.squareup.okio:okio:2.10.0" @@ -50,6 +50,6 @@ okio = "com.squareup.okio:okio:2.10.0" # Test libs assertj = "org.assertj:assertj-core:3.11.1" junit = "junit:junit:4.13.2" -kotlinCompileTesting = { module = "com.github.tschuchortdev:kotlin-compile-testing", version.ref = "kotlinCompileTesting" } -kotlinCompileTesting-ksp = { module = "com.github.tschuchortdev:kotlin-compile-testing-ksp", version.ref ="kotlinCompileTesting" } +kotlinCompileTesting = { module = "dev.zacsweers.kctfork:core", version.ref = "kotlinCompileTesting" } +kotlinCompileTesting-ksp = { module = "dev.zacsweers.kctfork:ksp", version.ref ="kotlinCompileTesting" } truth = "com.google.truth:truth:1.1.3" diff --git a/kotlin/codegen/build.gradle.kts b/kotlin/codegen/build.gradle.kts index fcace6116..4256a8197 100644 --- a/kotlin/codegen/build.gradle.kts +++ b/kotlin/codegen/build.gradle.kts @@ -32,6 +32,9 @@ tasks.withType().configureEach { "-opt-in=com.squareup.kotlinpoet.metadata.KotlinPoetMetadataPreview", "-opt-in=com.squareup.moshi.kotlin.codegen.api.InternalMoshiCodegenApi", ) + if (this@configureEach.name == "compileTestKotlin") { + freeCompilerArgs += "-opt-in=org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi" + } } } diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt index 1c0857e71..04857da34 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt @@ -258,8 +258,12 @@ public class AdapterGenerator( val typeRenderer: TypeRenderer = object : TypeRenderer() { override fun renderTypeVariable(typeVariable: TypeVariableName): CodeBlock { - val index = typeVariables.indexOfFirst { it == typeVariable } - check(index != -1) { "Unexpected type variable $typeVariable" } + // Match only by name because equality checks for more things than just the name. For example, a base class + // may declare "T" but the subclass declares "T : Number", which is legal but will fail an equals() test. + val index = typeVariables.indexOfFirst { it.name == typeVariable.name } + check(index != -1) { + "Unexpected type variable $typeVariable" + } return CodeBlock.of("%N[%L]", typesParam, index) } } diff --git a/moshi/build.gradle.kts b/moshi/build.gradle.kts index f31e64267..8cc93139f 100644 --- a/moshi/build.gradle.kts +++ b/moshi/build.gradle.kts @@ -28,6 +28,10 @@ val java16 by sourceSets.creating { } } +tasks.named("compileJava16Java") { + options.release.set(16) +} + tasks.named("compileJava16Java") { // We use JDK 17 for latest but target 16 for maximum compatibility javaCompiler.set( From 076ee610759c077b7e84d2ba3ac603017a5c26e4 Mon Sep 17 00:00:00 2001 From: Trevor Jones Date: Mon, 1 May 2023 22:30:18 -0600 Subject: [PATCH 2/5] test case and possible fix for messaging when type resolution fails due to invalid syntax of a generic property (#1527) --- .../ksp/JsonClassSymbolProcessorProvider.kt | 4 ++-- .../ksp/JsonClassSymbolProcessorTest.kt | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorProvider.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorProvider.kt index f324f6fee..e62584a34 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorProvider.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorProvider.kt @@ -87,9 +87,9 @@ private class JsonClassSymbolProcessor( if (!jsonClassAnnotation.generateAdapter) continue - val originatingFile = type.containingFile!! - val adapterGenerator = adapterGenerator(logger, resolver, type) ?: return emptyList() try { + val originatingFile = type.containingFile!! + val adapterGenerator = adapterGenerator(logger, resolver, type) ?: return emptyList() val preparedAdapter = adapterGenerator .prepare(generateProguardRules) { spec -> spec.toBuilder() diff --git a/kotlin/codegen/src/test/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorTest.kt b/kotlin/codegen/src/test/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorTest.kt index 17732d786..55df9e206 100644 --- a/kotlin/codegen/src/test/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorTest.kt +++ b/kotlin/codegen/src/test/java/com/squareup/moshi/kotlin/codegen/ksp/JsonClassSymbolProcessorTest.kt @@ -537,6 +537,24 @@ class JsonClassSymbolProcessorTest { assertThat(result.messages).contains("JsonQualifier @UpperCase must have RUNTIME retention") } + @Test + fun invalidGenericSyntaxErrorMessaging() { + val result = compile( + kotlin( + "source.kt", + """ + package test + import com.squareup.moshi.JsonClass + + @JsonClass(generateAdapter = true) + data class ElementEnvelope(val elements: List) + """, + ), + ) + assertThat(result.exitCode).isEqualTo(KotlinCompilation.ExitCode.COMPILATION_ERROR) + assertThat(result.messages).contains("Error preparing ElementEnvelope") + } + @Test fun `TypeAliases with the same backing type should share the same adapter`() { val result = compile( From 000ce304187a6f655f5359ad14df5b5981916607 Mon Sep 17 00:00:00 2001 From: Michael Bailey <1195562+yogurtearl@users.noreply.github.com> Date: Fri, 15 Jul 2022 08:19:51 -0700 Subject: [PATCH 3/5] Suppress warning in generated code (#1547) --- .../com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt index 04857da34..68709f007 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/api/AdapterGenerator.kt @@ -72,6 +72,7 @@ public class AdapterGenerator( "DEPRECATION", // Because we look it up reflectively "unused", + "UNUSED_PARAMETER", // Because we include underscores "ClassName", // Because we generate redundant `out` variance for some generics and there's no way From 3e23a40aaf4342c72dec307ab20b66d5b81932dd Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Fri, 5 May 2023 18:56:38 -0400 Subject: [PATCH 4/5] Align versions --- gradle/libs.versions.toml | 2 ++ kotlin/codegen/build.gradle.kts | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 577513097..b830f99fe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -37,6 +37,8 @@ autoService = { module = "com.google.auto.service:auto-service-annotations", ver autoService-ksp = "dev.zacsweers.autoservice:auto-service-ksp:1.0.0" guava = "com.google.guava:guava:30.1.1-jre" jsr305 = "com.google.code.findbugs:jsr305:3.0.2" +kotlin-annotationProcessingEmbeddable = { module = "org.jetbrains.kotlin:kotlin-annotation-processing-embeddable", version.ref = "kotlin" } +kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlin" } kotlin-compilerEmbeddable = { module = "org.jetbrains.kotlin:kotlin-compiler-embeddable", version.ref = "kotlin" } kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlinpoet = { module = "com.squareup:kotlinpoet", version.ref = "kotlinpoet" } diff --git a/kotlin/codegen/build.gradle.kts b/kotlin/codegen/build.gradle.kts index 4256a8197..0dd684bd4 100644 --- a/kotlin/codegen/build.gradle.kts +++ b/kotlin/codegen/build.gradle.kts @@ -71,6 +71,7 @@ dependencies { implementation(libs.kotlinpoet.ksp) implementation(libs.guava) implementation(libs.asm) + implementation(platform(libs.kotlin.bom)) implementation(libs.autoService) ksp(libs.autoService.ksp) @@ -78,12 +79,16 @@ dependencies { // KSP deps compileOnly(libs.ksp) compileOnly(libs.ksp.api) + compileOnly(libs.kotlin.annotationProcessingEmbeddable) compileOnly(libs.kotlin.compilerEmbeddable) + compileOnly(platform(libs.kotlin.bom)) // Always force the latest KSP version to match the one we're compiling against testImplementation(libs.ksp) testImplementation(libs.ksp.api) + testImplementation(libs.kotlin.annotationProcessingEmbeddable) testImplementation(libs.kotlin.compilerEmbeddable) testImplementation(libs.kotlinCompileTesting.ksp) + testImplementation(platform(libs.kotlin.bom)) // Copy these again as they're not automatically included since they're shaded testImplementation(project(":moshi")) From 56b7b09ee14724de5f223910733a45e49f1f6570 Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Fri, 5 May 2023 18:59:04 -0400 Subject: [PATCH 5/5] Deprecate kapt with a warning message --- .../moshi/kotlin/codegen/apt/JsonClassCodegenProcessor.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/apt/JsonClassCodegenProcessor.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/apt/JsonClassCodegenProcessor.kt index 68375d78b..5cef17fa7 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/apt/JsonClassCodegenProcessor.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/apt/JsonClassCodegenProcessor.kt @@ -70,6 +70,7 @@ public class JsonClassCodegenProcessor : AbstractProcessor() { override fun init(processingEnv: ProcessingEnvironment) { super.init(processingEnv) + processingEnv.messager.printMessage(Diagnostic.Kind.WARNING, "Kapt support in Moshi Kotlin Code Gen is deprecated and will be removed in 2.0. Please migrate to KSP. https://github.com/square/moshi#codegen") generatedType = processingEnv.options[OPTION_GENERATED]?.let { POSSIBLE_GENERATED_NAMES[it] ?: error( "Invalid option value for $OPTION_GENERATED. Found $it, " +