From 1504a9d372dfac0fed6f674a2207a72f28861821 Mon Sep 17 00:00:00 2001 From: mkmuir0 Date: Wed, 22 Oct 2025 10:35:55 -0700 Subject: [PATCH 01/20] Change branch to 2.3.1 (cherry picked from commit d5659cd971ae3f9ed62909cdcdf7604313a98c69) --- .github/workflows/auto-merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml index d4afa1cce1..321dfe2b18 100644 --- a/.github/workflows/auto-merge.yml +++ b/.github/workflows/auto-merge.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: 0 - ref: 2.3.0-release + ref: 2.3.1-release - name: merge commits from main to release branch run: | From 2d5a390fec20801ccb76f94dfe97dc8fb8841144 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Wed, 22 Oct 2025 22:03:25 +0000 Subject: [PATCH 02/20] Fix AIDL circular dependency Filtering the exludedSources from the AGP source query Fixes #2582 (cherry picked from commit 1c9670d55b50ee7508b055eb8e4af6bb9011293c) --- .../ksp/gradle/AndroidPluginIntegration.kt | 6 +- .../GeneratedSourcesViaAndroidComponentsIT.kt | 74 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt index ca0fbb59f9..3fac3d6b02 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt @@ -87,6 +87,7 @@ object AndroidPluginIntegration { "and apply kotlin(\"android\") plugin" ) } + val kspExtension = project.extensions.getByType(KspExtension::class.java) val sources = androidVariant.getSourceFolders(SourceKind.JAVA) kspTaskProvider.configure { task -> @@ -94,7 +95,10 @@ object AndroidPluginIntegration { val filteredSources = Callable { val destinationProperty = (kaptProvider?.get() as? KaptTask)?.destinationDir val dir = destinationProperty?.get()?.asFile - sources.filter { dir?.isParentOf(it.dir) != true } + sources.filter { source -> + dir?.isParentOf(source.dir) != true && + source.dir !in kspExtension.excludedSources + } } task.kspConfig.javaSourceRoots.from(filteredSources) diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt new file mode 100644 index 0000000000..c2fc44f311 --- /dev/null +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt @@ -0,0 +1,74 @@ +package com.google.devtools.ksp.test + +import org.gradle.testkit.runner.GradleRunner +import org.junit.Assert +import org.junit.Rule +import org.junit.Test +import java.io.File + +class GeneratedSourcesViaAndroidComponentsIT { + @Rule + @JvmField + val project: TemporaryTestProject = TemporaryTestProject("playground-android-multi", "playground") + + @Test + fun `test no circular dependency for other source generating tasks depending on ksp`() { + val gradleRunner = GradleRunner.create().withProjectDir(project.root).withGradleVersion("8.12.1") + + File(project.root, "gradle.properties").appendText("\nagpVersion=8.9.0") + File(project.root, "workload/build.gradle.kts").appendText( + """ + android { + buildFeatures { + aidl = true + } + + androidComponents.onVariants { variant -> + val name = variant.name + + val task = project.tasks.register("generate${'$'}{name.replaceFirstChar(Char::uppercase)}Source", SourceGenerationTask::class) { + dependsOn(project.tasks.named("ksp${'$'}{name.replaceFirstChar(Char::uppercase)}Kotlin")) // ksp must run before generator task + getOutputDirectory().set(project.layout.buildDirectory.dir("generated/${'$'}{name}")) + } + + ksp.excludedSources.from(task) // This breaks the circular dependency + variant.sources.java?.addGeneratedSourceDirectory(task, SourceGenerationTask::getOutputDirectory) + + sourceSets { + getByName(name) + .aidl + .srcDirs( + layout.buildDirectory + .dir("generated/ksp/${'$'}name/resources/aidl_generated") + .get() + .asFile + ) + } + + afterEvaluate { + tasks.named("compile${'$'}{name.replaceFirstChar(Char::uppercase)}Aidl") { + dependsOn("ksp${'$'}{name.replaceFirstChar(Char::uppercase)}Kotlin") + } + + ksp.excludedSources.from(tasks.named("compile${'$'}{name.replaceFirstChar(Char::uppercase)}Aidl")) // This breaks the circular dependency + } + } + } + + abstract class SourceGenerationTask : DefaultTask() { + @OutputDirectory + abstract fun getOutputDirectory(): DirectoryProperty + @TaskAction + fun generateCode() { } + } + + """.trimIndent() + ) + + gradleRunner.withArguments(":workload:assembleDebug", "--dry-run", "--stacktrace").build().let { result -> + Assert.assertTrue(result.output.contains(":workload:kspDebugKotlin")) + Assert.assertTrue(result.output.contains(":workload:compileDebugAidl")) + Assert.assertTrue(result.output.contains(":workload:generateDebugSource")) + } + } +} From 2dbccc670933c88e9b2be649ecbe68ea61e52922 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Thu, 23 Oct 2025 09:47:41 +0000 Subject: [PATCH 03/20] Clean up Gradle build files (cherry picked from commit e596558b8a3069d4ca840d249cd52b649e4bbbbd) --- api/build.gradle.kts | 1 - common-deps/build.gradle.kts | 2 -- integration-tests/build.gradle.kts | 1 - .../kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt | 3 --- symbol-processing-aa-embeddable/build.gradle.kts | 1 - symbol-processing/build.gradle.kts | 1 - 6 files changed, 9 deletions(-) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index fd4bc9da32..3bc580397e 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -5,7 +5,6 @@ description = "Kotlin Symbol Processing API" val signingKey: String? by project val signingPassword: String? by project -val kotlinBaseVersion: String by project tasks.withType { compilerOptions.freeCompilerArgs.add("-Xjvm-default=all-compatibility") diff --git a/common-deps/build.gradle.kts b/common-deps/build.gradle.kts index a3077228a2..6cfd70a947 100644 --- a/common-deps/build.gradle.kts +++ b/common-deps/build.gradle.kts @@ -1,8 +1,6 @@ description = "Kotlin Symbol Processor" -val kotlinBaseVersion: String by project val junitVersion: String by project -val googleTruthVersion: String by project val signingKey: String? by project val signingPassword: String? by project diff --git a/integration-tests/build.gradle.kts b/integration-tests/build.gradle.kts index f4f3f05496..ad358f0eeb 100644 --- a/integration-tests/build.gradle.kts +++ b/integration-tests/build.gradle.kts @@ -14,7 +14,6 @@ plugins { dependencies { testImplementation("junit:junit:$junitVersion") testImplementation(gradleTestKit()) - testImplementation("org.jetbrains.kotlin:kotlin-compiler:$kotlinBaseVersion") testImplementation(project(":api")) testImplementation(project(":gradle-plugin")) testImplementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt index 7a777bb538..66714af3dd 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt @@ -1,7 +1,6 @@ package com.google.devtools.ksp.test import org.gradle.testkit.runner.GradleRunner -import org.jetbrains.kotlin.cli.common.ExitCode import org.junit.Assert import org.junit.Assume import org.junit.Rule @@ -11,8 +10,6 @@ import java.lang.reflect.InvocationTargetException import java.lang.reflect.Method import java.net.URLClassLoader -data class CompileResult(val exitCode: ExitCode, val output: String) - class KSPCmdLineOptionsIT() { @Rule @JvmField diff --git a/symbol-processing-aa-embeddable/build.gradle.kts b/symbol-processing-aa-embeddable/build.gradle.kts index 691a3dcae3..6c25406848 100644 --- a/symbol-processing-aa-embeddable/build.gradle.kts +++ b/symbol-processing-aa-embeddable/build.gradle.kts @@ -15,7 +15,6 @@ val signingPassword: String? by project val kotlinBaseVersion: String by project val aaKotlinBaseVersion: String by project -val aaIntellijVersion: String by project val aaCoroutinesVersion: String by project plugins { diff --git a/symbol-processing/build.gradle.kts b/symbol-processing/build.gradle.kts index 6e44cff8ea..dc3840c5fc 100644 --- a/symbol-processing/build.gradle.kts +++ b/symbol-processing/build.gradle.kts @@ -2,7 +2,6 @@ description = "Dummy Artifact for KotlinCompilerPluginSupportPlugin" val signingKey: String? by project val signingPassword: String? by project -val kotlinBaseVersion: String by project plugins { kotlin("jvm") From 335f9512827a6e8c55d4e6030296ba62ac86b453 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Thu, 23 Oct 2025 13:03:09 +0000 Subject: [PATCH 04/20] Update KSP gradle version to 9.1.0 Requires update to the shadow jar plugin as well (cherry picked from commit 16add919704ba16812a1c44cdf606bf812fe25e8) --- build.gradle.kts | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- symbol-processing-aa-embeddable/build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index fdc1b44ad5..661afdd3a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,7 +26,7 @@ plugins { kotlin("jvm") id("io.github.gradle-nexus.publish-plugin") version "2.0.0" // Adding plugins used in multiple places to the classpath for centralized version control - id("com.gradleup.shadow") version "8.3.6" apply false + id("com.gradleup.shadow") version "8.3.9" apply false id("org.jetbrains.dokka") version "1.9.20" apply false id("com.android.lint") version "8.10.0" apply false } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a777235435..26dec6cde0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip -distributionSha256Sum=61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip +distributionSha256Sum=a17ddd85a26b6a7f5ddb71ff8b05fc5104c0202c6e64782429790c933686c806 networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/symbol-processing-aa-embeddable/build.gradle.kts b/symbol-processing-aa-embeddable/build.gradle.kts index 6c25406848..1c120eb013 100644 --- a/symbol-processing-aa-embeddable/build.gradle.kts +++ b/symbol-processing-aa-embeddable/build.gradle.kts @@ -84,7 +84,7 @@ class AAServiceTransformer : Transformer { } override fun hasTransformedResource(): Boolean { - return entries.size > 0 + return entries.isNotEmpty() } override fun modifyOutputStream(os: ZipOutputStream, preserveFileTimestamps: Boolean) { From 79c1003f83cd2d5fc8025c6d21fbfb091ede0f23 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Thu, 23 Oct 2025 17:44:33 +0000 Subject: [PATCH 05/20] Update test tasks to not fail on undiscovered tests This is Gradle 9.0 default change (cherry picked from commit 215d228b927c7f0f3af2759da9501f083b0b4533) --- .../ksp/gradle/testing/KspIntegrationTestRule.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/KspIntegrationTestRule.kt b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/KspIntegrationTestRule.kt index 80b535c3dd..096ace5fc3 100644 --- a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/KspIntegrationTestRule.kt +++ b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/KspIntegrationTestRule.kt @@ -88,6 +88,13 @@ class KspIntegrationTestRule( PluginDeclaration.id("com.google.devtools.ksp", testConfig.kspVersion) ) ) + testProject.appModule.buildFileAdditions.add( + """ + tasks.withType().configureEach { + failOnNoDiscoveredTests = false + } + """.trimIndent() + ) } /** @@ -150,6 +157,10 @@ class KspIntegrationTestRule( } } + tasks.withType().configureEach { + failOnNoDiscoveredTests = false + } + dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib:${testConfig.kotlinBaseVersion}") } From 6e5828e9d3ec29f3f51b814db3b0a8104bcccf65 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Thu, 23 Oct 2025 18:21:55 +0000 Subject: [PATCH 06/20] Remove build cache retention (cherry picked from commit a12512d6e051c084a17d2cdd5f5933f45fe6cd1b) --- examples/multiplatform/workload/build.gradle.kts | 1 - .../resources/buildcache-incremental/settings.gradle.kts | 1 - .../src/test/resources/buildcache/settings.gradle.kts | 1 - .../src/test/resources/hmpp/workload/build.gradle.kts | 1 - .../test/resources/init-plus-provider/settings.gradle.kts | 1 - .../src/test/resources/kapt3/workload/build.gradle.kts | 4 ++++ .../resources/kmp/workload-androidNative/build.gradle.kts | 1 - .../src/test/resources/kmp/workload-jvm/build.gradle.kts | 1 - .../test/resources/kmp/workload-linuxX64/build.gradle.kts | 5 ++++- .../src/test/resources/kmp/workload/build.gradle.kts | 5 ++++- .../src/test/resources/kotlin-inject/settings.gradle.kts | 1 - .../test/resources/kotlin-inject/workload/build.gradle.kts | 1 - .../resources/only-resources-file/workload/build.gradle.kts | 1 - .../test/resources/playground-mpp/workload/build.gradle.kts | 1 - 14 files changed, 12 insertions(+), 13 deletions(-) diff --git a/examples/multiplatform/workload/build.gradle.kts b/examples/multiplatform/workload/build.gradle.kts index a343caa440..101b032e08 100644 --- a/examples/multiplatform/workload/build.gradle.kts +++ b/examples/multiplatform/workload/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } js(IR) { browser() diff --git a/integration-tests/src/test/resources/buildcache-incremental/settings.gradle.kts b/integration-tests/src/test/resources/buildcache-incremental/settings.gradle.kts index 6208a9d448..4bdafb7d40 100644 --- a/integration-tests/src/test/resources/buildcache-incremental/settings.gradle.kts +++ b/integration-tests/src/test/resources/buildcache-incremental/settings.gradle.kts @@ -17,7 +17,6 @@ buildCache { val buildCacheDir: String by settings local { directory = File(buildCacheDir) - removeUnusedEntriesAfterDays = 30 } } diff --git a/integration-tests/src/test/resources/buildcache/settings.gradle.kts b/integration-tests/src/test/resources/buildcache/settings.gradle.kts index 6208a9d448..4bdafb7d40 100644 --- a/integration-tests/src/test/resources/buildcache/settings.gradle.kts +++ b/integration-tests/src/test/resources/buildcache/settings.gradle.kts @@ -17,7 +17,6 @@ buildCache { val buildCacheDir: String by settings local { directory = File(buildCacheDir) - removeUnusedEntriesAfterDays = 30 } } diff --git a/integration-tests/src/test/resources/hmpp/workload/build.gradle.kts b/integration-tests/src/test/resources/hmpp/workload/build.gradle.kts index a6574fc30a..402a2e4ba9 100644 --- a/integration-tests/src/test/resources/hmpp/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/hmpp/workload/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } js(IR) { diff --git a/integration-tests/src/test/resources/init-plus-provider/settings.gradle.kts b/integration-tests/src/test/resources/init-plus-provider/settings.gradle.kts index 7f654c13a3..f2ecc8ea81 100644 --- a/integration-tests/src/test/resources/init-plus-provider/settings.gradle.kts +++ b/integration-tests/src/test/resources/init-plus-provider/settings.gradle.kts @@ -18,5 +18,4 @@ pluginManagement { rootProject.name = "init-plus-provider" include(":workload") -include(":init-processor") include(":provider-processor") diff --git a/integration-tests/src/test/resources/kapt3/workload/build.gradle.kts b/integration-tests/src/test/resources/kapt3/workload/build.gradle.kts index c079de77dd..fba9259c8a 100644 --- a/integration-tests/src/test/resources/kapt3/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/kapt3/workload/build.gradle.kts @@ -25,3 +25,7 @@ ksp { arg("option1", "value1") arg("option2", "value2") } + +tasks.withType().configureEach { + failOnNoDiscoveredTests = false +} diff --git a/integration-tests/src/test/resources/kmp/workload-androidNative/build.gradle.kts b/integration-tests/src/test/resources/kmp/workload-androidNative/build.gradle.kts index 8fcf96963d..35114ee264 100644 --- a/integration-tests/src/test/resources/kmp/workload-androidNative/build.gradle.kts +++ b/integration-tests/src/test/resources/kmp/workload-androidNative/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } androidNativeX64() { binaries { diff --git a/integration-tests/src/test/resources/kmp/workload-jvm/build.gradle.kts b/integration-tests/src/test/resources/kmp/workload-jvm/build.gradle.kts index b68d154c11..526ec3f3ff 100644 --- a/integration-tests/src/test/resources/kmp/workload-jvm/build.gradle.kts +++ b/integration-tests/src/test/resources/kmp/workload-jvm/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } sourceSets { val jvmMain by getting { diff --git a/integration-tests/src/test/resources/kmp/workload-linuxX64/build.gradle.kts b/integration-tests/src/test/resources/kmp/workload-linuxX64/build.gradle.kts index c9ff2f5d78..e02f5c1905 100644 --- a/integration-tests/src/test/resources/kmp/workload-linuxX64/build.gradle.kts +++ b/integration-tests/src/test/resources/kmp/workload-linuxX64/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } linuxX64() { binaries { @@ -38,3 +37,7 @@ dependencies { add("kspMingwX64", project(":test-processor")) add("kspMingwX64Test", project(":test-processor")) } + +tasks.withType().configureEach { + failOnNoDiscoveredTests = false +} diff --git a/integration-tests/src/test/resources/kmp/workload/build.gradle.kts b/integration-tests/src/test/resources/kmp/workload/build.gradle.kts index 3b5b2d1fb4..1bc508d255 100644 --- a/integration-tests/src/test/resources/kmp/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/kmp/workload/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } js(IR) { browser() @@ -49,6 +48,10 @@ kotlin { } } +tasks.withType().configureEach { + failOnNoDiscoveredTests = false +} + dependencies { add("kspCommonMainMetadata", project(":test-processor")) add("kspJvm", project(":test-processor")) diff --git a/integration-tests/src/test/resources/kotlin-inject/settings.gradle.kts b/integration-tests/src/test/resources/kotlin-inject/settings.gradle.kts index c241eb4805..d0392f8784 100644 --- a/integration-tests/src/test/resources/kotlin-inject/settings.gradle.kts +++ b/integration-tests/src/test/resources/kotlin-inject/settings.gradle.kts @@ -17,4 +17,3 @@ pluginManagement { rootProject.name = "hmpp" include(":workload") -include(":test-processor") diff --git a/integration-tests/src/test/resources/kotlin-inject/workload/build.gradle.kts b/integration-tests/src/test/resources/kotlin-inject/workload/build.gradle.kts index f1defe1567..705bd41cfa 100644 --- a/integration-tests/src/test/resources/kotlin-inject/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/kotlin-inject/workload/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } sourceSets { diff --git a/integration-tests/src/test/resources/only-resources-file/workload/build.gradle.kts b/integration-tests/src/test/resources/only-resources-file/workload/build.gradle.kts index ed0d40c699..2c38549f8d 100644 --- a/integration-tests/src/test/resources/only-resources-file/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/only-resources-file/workload/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } } diff --git a/integration-tests/src/test/resources/playground-mpp/workload/build.gradle.kts b/integration-tests/src/test/resources/playground-mpp/workload/build.gradle.kts index 2a6ad5e663..6b3e67c310 100644 --- a/integration-tests/src/test/resources/playground-mpp/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-mpp/workload/build.gradle.kts @@ -7,7 +7,6 @@ version = "1.0-SNAPSHOT" kotlin { jvm { - withJava() } linuxX64() mingwX64() From 8ad01fdfcdc80e5278d09f816538f50281ebe220 Mon Sep 17 00:00:00 2001 From: Jon Amireh Date: Wed, 22 Oct 2025 16:21:58 -0700 Subject: [PATCH 07/20] Fix #2663 (cherry picked from commit f6f4f8b20837fc011a07ba2f973d1f5bd00f367c) --- .../com/google/devtools/ksp/impl/symbol/kotlin/util.kt | 10 +++++++++- kotlin-analysis-api/testData/visibilities.kt | 9 +++++++++ .../devtools/ksp/processor/VisibilityProcessor.kt | 4 ++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt index 1eab9f0b24..519ed68552 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt @@ -98,7 +98,15 @@ internal fun mapAAOrigin(ktSymbol: KaSymbol): Origin { return if (symbolOrigin == Origin.JAVA && ktSymbol.psi?.containingFile?.fileType?.isBinary == true) { Origin.JAVA_LIB } else { - symbolOrigin + if (ktSymbol.psi == null) { + if (analyze { ktSymbol.containingModule is KaLibraryModule }) { + Origin.KOTLIN_LIB + } else { + Origin.SYNTHETIC + } + } else { + symbolOrigin + } } } diff --git a/kotlin-analysis-api/testData/visibilities.kt b/kotlin-analysis-api/testData/visibilities.kt index 89c71d2a81..124025c69c 100644 --- a/kotlin-analysis-api/testData/visibilities.kt +++ b/kotlin-analysis-api/testData/visibilities.kt @@ -42,6 +42,7 @@ // KtEnumWithVal: values: PUBLIC // KtEnumWithVal: valueOf: PUBLIC // JavaAnnotation: value: PUBLIC +// IntersectionC: property: PUBLIC // END // MODULE: lib @@ -68,6 +69,14 @@ open class KotlinClass { enum class LibEnum(val value: Int) { A(0), B(1), C(2); } +// FILE: Intersection.kt +interface IntersectionA { + val property: String +} +interface IntersectionB { + val property: String +} +interface IntersectionC: IntersectionA, IntersectionB // MODULE: main(lib) // FILE: a.kt diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/VisibilityProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/VisibilityProcessor.kt index 3138d9744a..63a93958f4 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/VisibilityProcessor.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/VisibilityProcessor.kt @@ -52,6 +52,7 @@ class VisibilityProcessor : AbstractTestProcessor() { val kotlinEnum = resolver.getClassDeclarationByName("KtEnum")!! val kotlinEnumWithVal = resolver.getClassDeclarationByName("KtEnumWithVal")!! val javaAnnotation = resolver.getClassDeclarationByName("JavaAnnotation")!! + val intersectionClass = resolver.getClassDeclarationByName("IntersectionC")!! javaClass.declarations.filterIsInstance().map { "${it.simpleName.asString()}: ${it.getVisibility()},visible in A, B, D: " + "${it.isVisibleFrom(symbolA)}, ${it.isVisibleFrom(symbolB)}, ${it.isVisibleFrom(symbolD)}" @@ -82,6 +83,9 @@ class VisibilityProcessor : AbstractTestProcessor() { javaAnnotation.declarations.filterIsInstance().map { "${javaAnnotation.simpleName.asString()}: ${it.simpleName.asString()}: ${it.getVisibility() }" }.forEach { results.add(it) } + intersectionClass.getAllProperties().map { + "${intersectionClass.simpleName.asString()}: ${it.simpleName.asString()}: ${it.getVisibility() }" + }.forEach { results.add(it) } return emptyList() } } From eece631b6c5b6afee56d87e6b9d2ba8a7503a38a Mon Sep 17 00:00:00 2001 From: Jon Amireh Date: Thu, 23 Oct 2025 09:57:03 -0700 Subject: [PATCH 08/20] Map INTERSECTION_OVERRIDE to Synthetic (cherry picked from commit 50a31617ec2609e1ba22ea8d9cd8e95fa39fef55) --- .../google/devtools/ksp/impl/symbol/kotlin/util.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt index 519ed68552..99e17811ce 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt @@ -86,7 +86,7 @@ internal val ktSymbolOriginToOrigin = mapOf( KaSymbolOrigin.DELEGATED to Origin.SYNTHETIC, KaSymbolOrigin.PROPERTY_BACKING_FIELD to Origin.KOTLIN, KaSymbolOrigin.JAVA_SYNTHETIC_PROPERTY to Origin.SYNTHETIC, - KaSymbolOrigin.INTERSECTION_OVERRIDE to Origin.KOTLIN, + KaSymbolOrigin.INTERSECTION_OVERRIDE to Origin.SYNTHETIC, // TODO: distinguish between kotlin library and java library. KaSymbolOrigin.LIBRARY to Origin.KOTLIN_LIB, KaSymbolOrigin.SUBSTITUTION_OVERRIDE to Origin.JAVA_LIB @@ -98,15 +98,7 @@ internal fun mapAAOrigin(ktSymbol: KaSymbol): Origin { return if (symbolOrigin == Origin.JAVA && ktSymbol.psi?.containingFile?.fileType?.isBinary == true) { Origin.JAVA_LIB } else { - if (ktSymbol.psi == null) { - if (analyze { ktSymbol.containingModule is KaLibraryModule }) { - Origin.KOTLIN_LIB - } else { - Origin.SYNTHETIC - } - } else { - symbolOrigin - } + symbolOrigin } } From 344db5fdf0bf7d240776bca4f04b69a2d7e5f5bc Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Mon, 27 Oct 2025 12:27:44 -0700 Subject: [PATCH 09/20] Test case for KT-81928 where annotation value by constant function are sometimes missing. (cherry picked from commit 70de2f98458ddce4a949460a1ebaa313970ddde8) --- .../ksp/processor/AnnotationArrayValueProcessor.kt | 10 ++++++++++ test-utils/testData/api/annotationWithArrayValue.kt | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AnnotationArrayValueProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AnnotationArrayValueProcessor.kt index e82a3252e5..defb0afe85 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AnnotationArrayValueProcessor.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AnnotationArrayValueProcessor.kt @@ -34,6 +34,16 @@ class AnnotationArrayValueProcessor : AbstractTestProcessor() { logAnnotations(ktClass) val javaClass = resolver.getClassDeclarationByName("JavaAnnotated")!! logAnnotations(javaClass) + + val declaration = resolver.getClassDeclarationByName(resolver.getKSNameFromString("Main"))!! + declaration.getAllProperties().forEach { prop -> + val annotation = prop.annotations.singleOrNull() ?: return@forEach + val annotationName = annotation.shortName.asString() + val annotationArgument = annotation.arguments.single() + result.add( + "$prop: $annotationName(${annotationArgument.name?.asString()}: ${annotationArgument.value})" + ) + } return emptyList() } diff --git a/test-utils/testData/api/annotationWithArrayValue.kt b/test-utils/testData/api/annotationWithArrayValue.kt index 3637429f95..06865d11b1 100644 --- a/test-utils/testData/api/annotationWithArrayValue.kt +++ b/test-utils/testData/api/annotationWithArrayValue.kt @@ -30,11 +30,14 @@ // JavaAnnotation -> // stringArray = [j-x, j-y, null, j-z] // classArray = [Integer, Character] +// p0: MyAnnotation(tag: [1, 2, 3]) // END // FILE: a.kt annotation class KotlinAnnotation(val stringArray: Array, val classArray: Array?>) +annotation class MyAnnotation(val tag: ByteArray) + @KotlinAnnotation( stringArray = ["a", "b", null, "c"], classArray = [Any::class, List::class] @@ -45,6 +48,13 @@ annotation class KotlinAnnotation(val stringArray: Array, val classArra ) class KotlinAnnotated +class Main( + @MyAnnotation( + tag = [1.toByte(), 2.toByte(), 3.toByte()] + ) + val p0: String = "" +) + // FILE: JavaAnnotation.java public @interface JavaAnnotation { String[] stringArray(); From 59f698fbf50d70546e5ac08c1eb2ef0476e9c2c5 Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Wed, 29 Oct 2025 10:26:53 -0700 Subject: [PATCH 10/20] Downgrade AA to 2.3.0-dev-4967 as a temporary workaround for KT-81928. (cherry picked from commit ba65c7052eb6e4d5899096581493d6c1eaded7db) --- gradle.properties | 3 +- kotlin-analysis-api/build.gradle.kts | 5 ++- .../shadow-validation-baseline.txt | 40 ------------------- 3 files changed, 5 insertions(+), 43 deletions(-) diff --git a/gradle.properties b/gradle.properties index fa7a6ad44c..5aefc52ec7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,8 @@ junit5Version=5.8.2 junitPlatformVersion=1.8.2 googleTruthVersion=1.1 -aaKotlinBaseVersion=2.3.0-dev-7225 +aaKotlinBaseVersion=2.3.0-dev-4967 +aaTestFrameworkVersion=2.3.0-dev-7225 aaIntellijVersion=241.19416.19 aaGuavaVersion=33.2.0-jre aaAsmVersion=9.0 diff --git a/kotlin-analysis-api/build.gradle.kts b/kotlin-analysis-api/build.gradle.kts index a9ac1607ae..a43782ed90 100644 --- a/kotlin-analysis-api/build.gradle.kts +++ b/kotlin-analysis-api/build.gradle.kts @@ -17,6 +17,7 @@ val libsForTesting: Configuration by configurations.creating val libsForTestingCommon: Configuration by configurations.creating val aaKotlinBaseVersion: String by project +val aaTestFrameworkVersion: String by project val aaIntellijVersion: String by project val aaGuavaVersion: String by project val aaAsmVersion: String by project @@ -118,10 +119,10 @@ dependencies { testRuntimeOnly("org.junit.jupiter:junit-jupiter-params:$junit5Version") testRuntimeOnly("org.junit.platform:junit-platform-suite:$junitPlatformVersion") testImplementation("org.jetbrains.kotlin:kotlin-compiler:$aaKotlinBaseVersion") - testImplementation("org.jetbrains.kotlin:kotlin-compiler-internal-test-framework:$aaKotlinBaseVersion") + testImplementation("org.jetbrains.kotlin:kotlin-compiler-internal-test-framework:$aaTestFrameworkVersion") testImplementation(project(":common-deps")) testImplementation(project(":test-utils")) - testImplementation("org.jetbrains.kotlin:analysis-api-test-framework:$aaKotlinBaseVersion") + testImplementation("org.jetbrains.kotlin:analysis-api-test-framework:$aaTestFrameworkVersion") libsForTesting(kotlin("stdlib", aaKotlinBaseVersion)) libsForTesting(kotlin("test", aaKotlinBaseVersion)) diff --git a/kotlin-analysis-api/shadow-validation-baseline.txt b/kotlin-analysis-api/shadow-validation-baseline.txt index 1042e8017b..b605e7e97d 100644 --- a/kotlin-analysis-api/shadow-validation-baseline.txt +++ b/kotlin-analysis-api/shadow-validation-baseline.txt @@ -494,10 +494,6 @@ kotlin-analysis-api-255.255.255-SNAPSHOT.jar -> not found org.jetbrains.kotlin.analysis.utils.relfection.ToStringDataClassLikeKt -> kotlin.reflect.jvm.KCallablesJvm not found org.jetbrains.kotlin.backend.common.serialization.IrBodyDeserializer -> kotlin.reflect.full.KClasses not found org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer -> kotlin.reflect.full.KClasses not found - org.jetbrains.kotlin.backend.wasm.LoweredIrWithExtraArtifacts -> org.jetbrains.kotlin.ir.backend.js.tsexport.TypeScriptFragment not found - org.jetbrains.kotlin.backend.wasm.WasmCompilerKt -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportModelToTsDeclarations not found - org.jetbrains.kotlin.backend.wasm.WasmCompilerKt -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedModule not found - org.jetbrains.kotlin.backend.wasm.WasmCompilerKt -> org.jetbrains.kotlin.ir.backend.js.tsexport.TypeScriptFragment not found org.jetbrains.kotlin.backend.wasm.WasmCompilerKt -> org.jetbrains.kotlin.wasm.ir.WasmExport not found org.jetbrains.kotlin.backend.wasm.WasmCompilerKt -> org.jetbrains.kotlin.wasm.ir.WasmModule not found org.jetbrains.kotlin.backend.wasm.WasmCompilerKt -> org.jetbrains.kotlin.wasm.ir.WasmSymbol not found @@ -532,32 +528,6 @@ kotlin-analysis-api-255.255.255-SNAPSHOT.jar -> not found org.jetbrains.kotlin.backend.wasm.dwarf.lines.LineInstruction$SetFile -> org.jetbrains.kotlin.wasm.ir.convertors.ByteWriter not found org.jetbrains.kotlin.backend.wasm.dwarf.utils.StringTable -> org.jetbrains.kotlin.wasm.ir.convertors.ByteWriter not found org.jetbrains.kotlin.backend.wasm.dwarf.utils.StringTable -> org.jetbrains.kotlin.wasm.ir.convertors.ByteWriter$OutputStream not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedClass not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedConstructor not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedDeclaration not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedFunction not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedModule not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedNamespace not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedObject not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedParameter not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedProperty not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedRegularClass not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$ClassType not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$ErrorType not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Function not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$IntersectionType not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Primitive not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Primitive$BigInt not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Primitive$Boolean not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Primitive$Nothing not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Primitive$Number not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Primitive$String not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Primitive$Unit not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$Primitive$Unknown not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$TypeOf not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedType$TypeParameter not found - org.jetbrains.kotlin.backend.wasm.export.ExportModelGenerator -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedVisibility not found org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator -> org.jetbrains.kotlin.wasm.ir.TypesKt not found org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator -> org.jetbrains.kotlin.wasm.ir.WasmAnyRef not found org.jetbrains.kotlin.backend.wasm.ir2wasm.BodyGenerator -> org.jetbrains.kotlin.wasm.ir.WasmExnRefType not found @@ -1182,16 +1152,6 @@ kotlin-analysis-api-255.255.255-SNAPSHOT.jar -> not found org.jetbrains.kotlin.compilerRunner.ArgumentsToStrings -> kotlin.reflect.jvm.ReflectJvmMapping not found org.jetbrains.kotlin.fir.pipeline.FirUtilsKt -> org.jetbrains.kotlin.fir.lightTree.LightTree2Fir not found org.jetbrains.kotlin.idea.ExplicitDefaultSubstitutor -> kotlin.reflect.jvm.ReflectJvmMapping not found - org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputs -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportModelToTsDeclarationsKt not found - org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputs -> org.jetbrains.kotlin.ir.backend.js.tsexport.TypeScriptFragment not found - org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputsCached -> org.jetbrains.kotlin.ir.backend.js.tsexport.TypeScriptFragment not found - org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportModelToTsDeclarationsKt not found - org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer -> org.jetbrains.kotlin.ir.backend.js.tsexport.TypeScriptFragment not found - org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer$generateExportWithExternals$1$tsDeclarations$1 -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportedDeclaration not found - org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerKt -> org.jetbrains.kotlin.ir.backend.js.tsexport.ExportModelToTsDeclarationsKt not found - org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformerKt -> org.jetbrains.kotlin.ir.backend.js.tsexport.TypeScriptFragment not found - org.jetbrains.kotlin.ir.backend.js.utils.serialization.JsIrAstDeserializer -> org.jetbrains.kotlin.ir.backend.js.tsexport.TypeScriptFragment not found - org.jetbrains.kotlin.ir.backend.js.utils.serialization.JsIrAstSerializer -> org.jetbrains.kotlin.ir.backend.js.tsexport.TypeScriptFragment not found org.jetbrains.kotlin.ir.inline.konan.NativeFirstPhaseLoweringPhasesKt -> org.jetbrains.kotlin.backend.konan.serialization.KonanManglerIr not found org.jetbrains.kotlin.load.java.structure.impl.classFiles.ClassifierResolutionContext -> io.vavr.collection.HashMap not found org.jetbrains.kotlin.load.java.structure.impl.classFiles.ClassifierResolutionContext -> io.vavr.collection.Map not found From 61f5101cf92664e054231adcb7e3c2bea9a5bab5 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Tue, 28 Oct 2025 20:07:51 +0000 Subject: [PATCH 11/20] Add support for AGP 9.0 and Built in kotlin (cherry picked from commit a8f6174713ceee8337b5992f3aea4c9fe4e5feed) --- .../ksp/gradle/AndroidPluginIntegration.kt | 78 ++++++++++++------- gradle.properties | 2 +- .../ksp/test/AndroidBuiltInKotlinIT.kt | 30 ++++++- 3 files changed, 77 insertions(+), 33 deletions(-) diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt index 3fac3d6b02..fb307b28e9 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt @@ -21,6 +21,9 @@ import com.android.build.api.artifact.ScopedArtifact import com.android.build.api.dsl.CommonExtension import com.android.build.api.variant.Component import com.android.build.api.variant.ScopedArtifacts +import com.android.build.api.variant.impl.DirectoryEntry +import com.android.build.api.variant.impl.FlatSourceDirectoriesForJavaImpl +import com.android.build.api.variant.impl.FlatSourceDirectoriesImpl import com.android.build.gradle.BaseExtension import com.android.build.gradle.api.SourceKind import com.google.devtools.ksp.gradle.utils.getAgpVersion @@ -54,7 +57,7 @@ object AndroidPluginIntegration { private fun decorateAndroidExtension(project: Project, onSourceSet: (String) -> Unit) { val sourceSets = when (val androidExt = project.extensions.getByName("android")) { is BaseExtension -> androidExt.sourceSets - is CommonExtension<*, *, *, *, *, *> -> androidExt.sourceSets + is CommonExtension -> androidExt.sourceSets else -> throw RuntimeException("Unsupported Android Gradle plugin version.") } sourceSets.configureEach { @@ -76,32 +79,42 @@ object AndroidPluginIntegration { kspTaskProvider: TaskProvider, androidComponent: Component? ) { - val kaptProvider: TaskProvider? = - project.locateTask(kotlinCompilation.compileTaskProvider.kaptTaskName) - - val androidVariant = kotlinCompilation.androidVariant - if (androidVariant == null) { - throw RuntimeException( - "KSP is not compatible with Android Gradle Plugin's built-in Kotlin. " + - "Please disable by adding android.builtInKotlin=false to gradle.properties " + - "and apply kotlin(\"android\") plugin" - ) - } - val kspExtension = project.extensions.getByType(KspExtension::class.java) - val sources = androidVariant.getSourceFolders(SourceKind.JAVA) - - kspTaskProvider.configure { task -> - // this is workaround for KAPT generator that prevents circular dependency - val filteredSources = Callable { - val destinationProperty = (kaptProvider?.get() as? KaptTask)?.destinationDir - val dir = destinationProperty?.get()?.asFile - sources.filter { source -> - dir?.isParentOf(source.dir) != true && - source.dir !in kspExtension.excludedSources + if (project.isAgpBuiltInKotlinUsed()) { + if (androidComponent != null && project.canUseInternalKspApis()) { + val sources = + (androidComponent.sources.java!! as FlatSourceDirectoriesForJavaImpl).allButKspAndKaptGenerators() + + kspTaskProvider.configure { task -> + task.kspConfig.javaSourceRoots.from(sources) } + } else { + throw RuntimeException( + "KSP is not compatible with Android Gradle Plugin's built-in Kotlin. Please disable " + + "by adding android.builtInKotlin=false and android.newDsl=false to gradle.properties " + + "and apply kotlin(\"android\") plugin" + ) } + } else { + val kaptProvider: TaskProvider? = + project.locateTask(kotlinCompilation.compileTaskProvider.kaptTaskName) + + val androidVariant = kotlinCompilation.androidVariant + val kspExtension = project.extensions.getByType(KspExtension::class.java) + val sources = androidVariant?.getSourceFolders(SourceKind.JAVA) + + kspTaskProvider.configure { task -> + // this is workaround for KAPT generator that prevents circular dependency + val filteredSources = Callable { + val destinationProperty = (kaptProvider?.get() as? KaptTask)?.destinationDir + val dir = destinationProperty?.get()?.asFile + sources?.filter { source -> + dir?.isParentOf(source.dir) != true && + source.dir !in kspExtension.excludedSources + } + } - task.kspConfig.javaSourceRoots.from(filteredSources) + task.kspConfig.javaSourceRoots.from(filteredSources) + } } } @@ -126,15 +139,17 @@ object AndroidPluginIntegration { resourcesOutputDir: Provider, androidComponent: Component?, ) { - if (androidComponent != null && project.canUseAddGeneratedSourceDirectoriesApi()) { - androidComponent.sources.java?.addGeneratedSourceDirectory( + if (androidComponent != null && project.canUseInternalKspApis()) { + (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( taskProvider = kspTaskProvider, - wiredWith = { task -> task.kspConfig.javaOutputDir } + wiredWith = { task -> (task as KspAATask).kspConfig.javaOutputDir }, + DirectoryEntry.Kind.KSP ) - androidComponent.sources.java?.addGeneratedSourceDirectory( + (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( taskProvider = kspTaskProvider, - wiredWith = { task -> task.kspConfig.kotlinOutputDir } + wiredWith = { task -> (task as KspAATask).kspConfig.kotlinOutputDir }, + DirectoryEntry.Kind.KSP ) androidComponent.sources.resources?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, @@ -232,4 +247,9 @@ object AndroidPluginIntegration { val agpVersion = project.getAgpVersion() ?: return false return agpVersion >= AndroidPluginVersion(8, 12, 0).alpha(6) } + + fun Project.canUseInternalKspApis(): Boolean { + val agpVersion = project.getAgpVersion() ?: return false + return agpVersion >= AndroidPluginVersion(9, 0, 0).alpha(12) + } } diff --git a/gradle.properties b/gradle.properties index 5aefc52ec7..8353208940 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Duser.country=US -Dkotlin.daemon.jvm.options=-Xmx4096m -Dfile.encoding=UTF-8 kotlinBaseVersion=2.3.0-Beta1 -agpBaseVersion=8.13.0-rc01 +agpBaseVersion=9.0.0-alpha12 intellijVersion=241.19416.19 junitVersion=4.13.1 junit5Version=5.8.2 diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt index d85b3c58a8..e23746358a 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt @@ -35,7 +35,7 @@ class AndroidBuiltInKotlinIT { } @Test - fun testPlaygroundAndroidWithBuiltInKotlinAGP90() { + fun testPlaygroundAndroidWithBuiltInKotlinAGP90BelowAlpha12() { val gradleRunner = GradleRunner.create().withProjectDir(project.root).withGradleVersion("9.0.0") File(project.root, "gradle.properties").appendText("\nagpVersion=9.0.0-alpha05") @@ -45,11 +45,35 @@ class AndroidBuiltInKotlinIT { ).buildAndFail().let { result -> Assert.assertTrue( result.output.contains( - "KSP is not compatible with Android Gradle Plugin's built-in Kotlin. " + - "Please disable by adding android.builtInKotlin=false to gradle.properties " + + "KSP is not compatible with Android Gradle Plugin's built-in Kotlin. Please disable " + + "by adding android.builtInKotlin=false and android.newDsl=false to gradle.properties " + "and apply kotlin(\"android\") plugin" ) ) } } + + @Test + fun testPlaygroundAndroidWithBuiltInKotlinAGP90AboveAlpha12() { + val gradleRunner = GradleRunner.create().withProjectDir(project.root).withGradleVersion("9.0.0") + + File(project.root, "gradle.properties").appendText("\nagpVersion=9.0.0-alpha12") + + gradleRunner.withArguments( + "clean", "build", "minifyReleaseWithR8", "--configuration-cache", "--info", "--stacktrace" + ).build().let { result -> + Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:build")?.outcome) + val mergedConfiguration = File(project.root, "workload/build/outputs/mapping/release/configuration.txt") + assert(mergedConfiguration.exists()) { + "Merged configuration file not found!\n${printDirectoryTree(project.root)}" + } + val configurationText = mergedConfiguration.readText() + assert("-keep class com.example.AClassBuilder { *; }" in configurationText) { + "Merged configuration did not contain generated proguard rules!\n$configurationText" + } + val outputs = result.output.lines() + assert("w: [ksp] [workload_debug] Mangled name for internalFun: internalFun\$workload_debug" in outputs) + assert("w: [ksp] [workload_release] Mangled name for internalFun: internalFun\$workload_release" in outputs) + } + } } From 030574ca9060536e71a4c03716d38274641208e3 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Tue, 28 Oct 2025 23:30:39 +0000 Subject: [PATCH 12/20] Update required tests (cherry picked from commit 3e38e032046cb0c3bb6bf230340f3333644ca8f9) --- .../ksp/gradle/AndroidPluginIntegration.kt | 37 +++++++++++++------ .../ksp/gradle/SourceSetConfigurationsTest.kt | 6 --- .../gradle/testing/KspIntegrationTestRule.kt | 12 ++++++ .../ksp/gradle/testing/TestProject.kt | 2 +- .../ksp/test/AndroidBuiltInKotlinIT.kt | 19 ++-------- .../com/google/devtools/ksp/test/AndroidIT.kt | 10 +---- .../GeneratedSourcesViaAndroidComponentsIT.kt | 3 +- .../devtools/ksp/test/utils/AssertionUtils.kt | 16 ++++++++ .../android-data-binding/gradle.properties | 2 + .../android-view-binding/gradle.properties | 2 + .../settings.gradle.kts | 1 - .../workload/build.gradle.kts | 1 - .../gradle.properties | 2 + .../playground-android/gradle.properties | 2 + .../srcs-gen/workload/build.gradle.kts | 1 - 15 files changed, 69 insertions(+), 47 deletions(-) create mode 100644 integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt create mode 100644 integration-tests/src/test/resources/android-data-binding/gradle.properties create mode 100644 integration-tests/src/test/resources/android-view-binding/gradle.properties create mode 100644 integration-tests/src/test/resources/playground-android-multi/gradle.properties create mode 100644 integration-tests/src/test/resources/playground-android/gradle.properties diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt index fb307b28e9..eb6ac978b4 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt @@ -139,18 +139,33 @@ object AndroidPluginIntegration { resourcesOutputDir: Provider, androidComponent: Component?, ) { - if (androidComponent != null && project.canUseInternalKspApis()) { - (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( - taskProvider = kspTaskProvider, - wiredWith = { task -> (task as KspAATask).kspConfig.javaOutputDir }, - DirectoryEntry.Kind.KSP - ) + if (androidComponent != null && + project.canUseAddGeneratedSourceDirectoriesApi() && + project.isAgpBuiltInKotlinUsed() + ) { + if (project.canUseInternalKspApis()) { + (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( + taskProvider = kspTaskProvider, + wiredWith = { task -> task.kspConfig.javaOutputDir }, + DirectoryEntry.Kind.KSP + ) - (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( - taskProvider = kspTaskProvider, - wiredWith = { task -> (task as KspAATask).kspConfig.kotlinOutputDir }, - DirectoryEntry.Kind.KSP - ) + (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( + taskProvider = kspTaskProvider, + wiredWith = { task -> task.kspConfig.kotlinOutputDir }, + DirectoryEntry.Kind.KSP + ) + } else { + (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( + taskProvider = kspTaskProvider, + wiredWith = { task -> task.kspConfig.javaOutputDir } + ) + + (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( + taskProvider = kspTaskProvider, + wiredWith = { task -> task.kspConfig.kotlinOutputDir } + ) + } androidComponent.sources.resources?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, wiredWith = { task -> task.kspConfig.resourceOutputDir } diff --git a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/SourceSetConfigurationsTest.kt b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/SourceSetConfigurationsTest.kt index e54b38034f..f50e8bb471 100644 --- a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/SourceSetConfigurationsTest.kt +++ b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/SourceSetConfigurationsTest.kt @@ -261,9 +261,6 @@ class SourceSetConfigurationsTest() { SourceFolder( "debugUnitTest", "SRC:generated/ksp/debugUnitTest/kotlin" ), - SourceFolder( - "releaseUnitTest", "SRC:generated/ksp/releaseUnitTest/kotlin" - ), SourceFolder( "debug", "SRC:generated/ksp/debug/java" ), @@ -276,9 +273,6 @@ class SourceSetConfigurationsTest() { SourceFolder( "debugUnitTest", "SRC:generated/ksp/debugUnitTest/java" ), - SourceFolder( - "releaseUnitTest", "SRC:generated/ksp/releaseUnitTest/java" - ), // TODO byte sources seems to be overridden by tmp/kotlin-classes/debug // assert them as well once fixed ) diff --git a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/KspIntegrationTestRule.kt b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/KspIntegrationTestRule.kt index 096ace5fc3..73043ad56f 100644 --- a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/KspIntegrationTestRule.kt +++ b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/KspIntegrationTestRule.kt @@ -125,6 +125,12 @@ class KspIntegrationTestRule( .plugins .add(PluginDeclaration.id("com.android.experimental.built-in-kotlin", testConfig.androidBaseVersion)) } else { + val contents = """ + android.builtInKotlin=false + android.newDsl=false + + """.trimIndent() + testProject.rootDir.resolve("gradle.properties").appendText(contents) testProject.appModule.plugins.add(PluginDeclaration.kotlin("android", testConfig.kotlinBaseVersion)) } addAndroidBoilerplate() @@ -134,6 +140,12 @@ class KspIntegrationTestRule( * Sets up the app module as a multiplatform app with the specified [targets], wrapped in a kotlin { } block. */ fun setupAppAsMultiplatformApp(targets: String) { + val contents = """ + android.builtInKotlin=false + android.newDsl=false + + """.trimIndent() + testProject.rootDir.resolve("gradle.properties").appendText(contents) testProject.appModule.plugins.addAll( listOf( PluginDeclaration.id("com.android.application", testConfig.androidBaseVersion), diff --git a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/TestProject.kt b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/TestProject.kt index f0c39f3646..ee885020c7 100644 --- a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/TestProject.kt +++ b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/testing/TestProject.kt @@ -84,7 +84,7 @@ class TestProject( android.useAndroidX=true org.gradle.jvmargs=-Xmx2048M -XX:MaxMetaspaceSize=512m """.trimIndent() - rootDir.resolve("gradle.properties").writeText(contents) + rootDir.resolve("gradle.properties").appendText(contents) } private fun writeBuildFile() { diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt index e23746358a..1a9ffb7a8a 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.utils.assertMergedConfigurationOutput import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert @@ -20,14 +21,7 @@ class AndroidBuiltInKotlinIT { "clean", "build", "minifyReleaseWithR8", "--configuration-cache", "--info", "--stacktrace" ).build().let { result -> Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:build")?.outcome) - val mergedConfiguration = File(project.root, "workload/build/outputs/mapping/release/configuration.txt") - assert(mergedConfiguration.exists()) { - "Merged configuration file not found!\n${printDirectoryTree(project.root)}" - } - val configurationText = mergedConfiguration.readText() - assert("-keep class com.example.AClassBuilder { *; }" in configurationText) { - "Merged configuration did not contain generated proguard rules!\n$configurationText" - } + assertMergedConfigurationOutput(project, "-keep class com.example.AClassBuilder { *; }") val outputs = result.output.lines() assert("w: [ksp] [workload_debug] Mangled name for internalFun: internalFun\$workload_debug" in outputs) assert("w: [ksp] [workload_release] Mangled name for internalFun: internalFun\$workload_release" in outputs) @@ -63,14 +57,7 @@ class AndroidBuiltInKotlinIT { "clean", "build", "minifyReleaseWithR8", "--configuration-cache", "--info", "--stacktrace" ).build().let { result -> Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:build")?.outcome) - val mergedConfiguration = File(project.root, "workload/build/outputs/mapping/release/configuration.txt") - assert(mergedConfiguration.exists()) { - "Merged configuration file not found!\n${printDirectoryTree(project.root)}" - } - val configurationText = mergedConfiguration.readText() - assert("-keep class com.example.AClassBuilder { *; }" in configurationText) { - "Merged configuration did not contain generated proguard rules!\n$configurationText" - } + assertMergedConfigurationOutput(project, "-keep class com.example.AClassBuilder { *; }") val outputs = result.output.lines() assert("w: [ksp] [workload_debug] Mangled name for internalFun: internalFun\$workload_debug" in outputs) assert("w: [ksp] [workload_release] Mangled name for internalFun: internalFun\$workload_release" in outputs) diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt index 39b5bbd383..bab81f6a6f 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.utils.assertMergedConfigurationOutput import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert @@ -20,14 +21,7 @@ class AndroidIT() { "clean", "build", "minifyReleaseWithR8", "--configuration-cache", "--info", "--stacktrace" ).build().let { result -> Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:build")?.outcome) - val mergedConfiguration = File(project.root, "workload/build/outputs/mapping/release/configuration.txt") - assert(mergedConfiguration.exists()) { - "Merged configuration file not found!\n${printDirectoryTree(project.root)}" - } - val configurationText = mergedConfiguration.readText() - assert("-keep class com.example.AClassBuilder { *; }" in configurationText) { - "Merged configuration did not contain generated proguard rules!\n$configurationText" - } + assertMergedConfigurationOutput(project, "-keep class com.example.AClassBuilder { *; }") val outputs = result.output.lines() assert("w: [ksp] [workload_debug] Mangled name for internalFun: internalFun\$workload_debug" in outputs) assert("w: [ksp] [workload_release] Mangled name for internalFun: internalFun\$workload_release" in outputs) diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt index c2fc44f311..e88ba13ba5 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt @@ -13,9 +13,8 @@ class GeneratedSourcesViaAndroidComponentsIT { @Test fun `test no circular dependency for other source generating tasks depending on ksp`() { - val gradleRunner = GradleRunner.create().withProjectDir(project.root).withGradleVersion("8.12.1") + val gradleRunner = GradleRunner.create().withProjectDir(project.root) - File(project.root, "gradle.properties").appendText("\nagpVersion=8.9.0") File(project.root, "workload/build.gradle.kts").appendText( """ android { diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt new file mode 100644 index 0000000000..7c5125042a --- /dev/null +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt @@ -0,0 +1,16 @@ +package com.google.devtools.ksp.test.utils + +import com.google.devtools.ksp.test.TemporaryTestProject +import com.google.devtools.ksp.test.printDirectoryTree +import java.io.File + +fun assertMergedConfigurationOutput(project: TemporaryTestProject, expectedOutput: String) { + val mergedConfiguration = File(project.root, "workload/build/outputs/mapping/release/configuration.txt") + assert(mergedConfiguration.exists()) { + "Merged configuration file not found!\n${printDirectoryTree(project.root)}" + } + val configurationText = mergedConfiguration.readText() + assert(expectedOutput in configurationText) { + "Merged configuration did not contain expected output!\n" + } +} diff --git a/integration-tests/src/test/resources/android-data-binding/gradle.properties b/integration-tests/src/test/resources/android-data-binding/gradle.properties new file mode 100644 index 0000000000..fb720b82d7 --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/gradle.properties @@ -0,0 +1,2 @@ +android.builtInKotlin=false +android.newDsl=false \ No newline at end of file diff --git a/integration-tests/src/test/resources/android-view-binding/gradle.properties b/integration-tests/src/test/resources/android-view-binding/gradle.properties new file mode 100644 index 0000000000..fb720b82d7 --- /dev/null +++ b/integration-tests/src/test/resources/android-view-binding/gradle.properties @@ -0,0 +1,2 @@ +android.builtInKotlin=false +android.newDsl=false \ No newline at end of file diff --git a/integration-tests/src/test/resources/playground-android-builtinkotlin/settings.gradle.kts b/integration-tests/src/test/resources/playground-android-builtinkotlin/settings.gradle.kts index 9902a6f43e..0a588f311c 100644 --- a/integration-tests/src/test/resources/playground-android-builtinkotlin/settings.gradle.kts +++ b/integration-tests/src/test/resources/playground-android-builtinkotlin/settings.gradle.kts @@ -7,7 +7,6 @@ pluginManagement { id("com.google.devtools.ksp") version kspVersion apply false kotlin("jvm") version kotlinVersion apply false id("com.android.application") version agpVersion apply false - id("com.android.experimental.built-in-kotlin") version agpVersion apply false } repositories { maven(testRepo) diff --git a/integration-tests/src/test/resources/playground-android-builtinkotlin/workload/build.gradle.kts b/integration-tests/src/test/resources/playground-android-builtinkotlin/workload/build.gradle.kts index 748419c111..d6c01a2fdc 100644 --- a/integration-tests/src/test/resources/playground-android-builtinkotlin/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android-builtinkotlin/workload/build.gradle.kts @@ -4,7 +4,6 @@ plugins { // DO NOT CHANGE THE ORDER. id("com.google.devtools.ksp") id("com.android.application") - id("com.android.experimental.built-in-kotlin") } version = "1.0-SNAPSHOT" diff --git a/integration-tests/src/test/resources/playground-android-multi/gradle.properties b/integration-tests/src/test/resources/playground-android-multi/gradle.properties new file mode 100644 index 0000000000..fb720b82d7 --- /dev/null +++ b/integration-tests/src/test/resources/playground-android-multi/gradle.properties @@ -0,0 +1,2 @@ +android.builtInKotlin=false +android.newDsl=false \ No newline at end of file diff --git a/integration-tests/src/test/resources/playground-android/gradle.properties b/integration-tests/src/test/resources/playground-android/gradle.properties new file mode 100644 index 0000000000..fb720b82d7 --- /dev/null +++ b/integration-tests/src/test/resources/playground-android/gradle.properties @@ -0,0 +1,2 @@ +android.builtInKotlin=false +android.newDsl=false \ No newline at end of file diff --git a/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts b/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts index 09b9056158..6b17d32ad4 100644 --- a/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts @@ -4,7 +4,6 @@ plugins { // DO NOT CHANGE THE ORDER. id("com.google.devtools.ksp") id("com.android.library") - kotlin("android") } version = "1.0-SNAPSHOT" From d4373d5023b065346f7df86aaab28e6cd7d1b486 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Wed, 29 Oct 2025 12:41:01 +0000 Subject: [PATCH 13/20] Register ksp generated kotlin sources under sources.kotlin API Also update wording for the error message (cherry picked from commit 068f99b2d018e2e12b626a93604e16868e68647f) --- .../ksp/gradle/AndroidPluginIntegration.kt | 22 ++++++++++--------- .../ksp/gradle/SourceSetConfigurationsTest.kt | 5 +++-- .../ksp/test/AndroidBuiltInKotlinIT.kt | 7 +++--- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt index eb6ac978b4..6ba629a68e 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt @@ -79,19 +79,20 @@ object AndroidPluginIntegration { kspTaskProvider: TaskProvider, androidComponent: Component? ) { - if (project.isAgpBuiltInKotlinUsed()) { - if (androidComponent != null && project.canUseInternalKspApis()) { + if (androidComponent != null && project.isAgpBuiltInKotlinUsed()) { + if (project.canUseInternalKspApis()) { val sources = - (androidComponent.sources.java!! as FlatSourceDirectoriesForJavaImpl).allButKspAndKaptGenerators() + (androidComponent.sources.java as? FlatSourceDirectoriesForJavaImpl)?.allButKspAndKaptGenerators() kspTaskProvider.configure { task -> task.kspConfig.javaSourceRoots.from(sources) } } else { throw RuntimeException( - "KSP is not compatible with Android Gradle Plugin's built-in Kotlin. Please disable " + - "by adding android.builtInKotlin=false and android.newDsl=false to gradle.properties " + - "and apply kotlin(\"android\") plugin" + "KSP is not compatible with Android Gradle Plugin's built-in Kotlin prior to AGP " + + "version 9.0.0-alpha12. Please upgrade to AGP 9.0.0-alpha12 or alternatively disable " + + "built-in kotlin by adding android.builtInKotlin=false and android.newDsl=false to " + + "gradle.properties and apply kotlin(\"android\") plugin" ) } } else { @@ -144,28 +145,29 @@ object AndroidPluginIntegration { project.isAgpBuiltInKotlinUsed() ) { if (project.canUseInternalKspApis()) { - (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( + (androidComponent.sources.java as? FlatSourceDirectoriesImpl)?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, wiredWith = { task -> task.kspConfig.javaOutputDir }, DirectoryEntry.Kind.KSP ) - (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( + (androidComponent.sources.kotlin as? FlatSourceDirectoriesImpl)?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, wiredWith = { task -> task.kspConfig.kotlinOutputDir }, DirectoryEntry.Kind.KSP ) } else { - (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( + androidComponent.sources.java?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, wiredWith = { task -> task.kspConfig.javaOutputDir } ) - (androidComponent.sources.java!! as FlatSourceDirectoriesImpl).addGeneratedSourceDirectory( + androidComponent.sources.java?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, wiredWith = { task -> task.kspConfig.kotlinOutputDir } ) } + androidComponent.sources.resources?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, wiredWith = { task -> task.kspConfig.resourceOutputDir } diff --git a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/SourceSetConfigurationsTest.kt b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/SourceSetConfigurationsTest.kt index f50e8bb471..795041e0d3 100644 --- a/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/SourceSetConfigurationsTest.kt +++ b/gradle-plugin/src/test/kotlin/com/google/devtools/ksp/gradle/SourceSetConfigurationsTest.kt @@ -156,8 +156,8 @@ class SourceSetConfigurationsTest() { } @Test - fun registerGeneratedSourcesToAndroid() { - testRule.setupAppAsAndroidApp() + fun registerGeneratedSourcesToAndroid_BuiltInKotlinEnabled() { + testRule.setupAppAsAndroidApp(enableAgpBuiltInKotlinSupport = true) testRule.appModule.dependencies.addAll( listOf( module("ksp", testRule.processorModule), @@ -196,6 +196,7 @@ class SourceSetConfigurationsTest() { val taskProvider = project.tasks.register("${'$'}{component.name}DisplayAllSources") { sourceFolders.addAll(sources.java!!.all) + sourceFolders.addAll(sources.kotlin!!.all) componentName.set(component.name) } globalTaskProvider.configure { diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt index 1a9ffb7a8a..3372725cb4 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt @@ -39,9 +39,10 @@ class AndroidBuiltInKotlinIT { ).buildAndFail().let { result -> Assert.assertTrue( result.output.contains( - "KSP is not compatible with Android Gradle Plugin's built-in Kotlin. Please disable " + - "by adding android.builtInKotlin=false and android.newDsl=false to gradle.properties " + - "and apply kotlin(\"android\") plugin" + "KSP is not compatible with Android Gradle Plugin's built-in Kotlin prior to AGP " + + "version 9.0.0-alpha12. Please upgrade to AGP 9.0.0-alpha12 or alternatively disable " + + "built-in kotlin by adding android.builtInKotlin=false and android.newDsl=false to " + + "gradle.properties and apply kotlin(\"android\") plugin" ) ) } From 72c75e247284e7b88407255580fa028da1f84fe1 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Fri, 17 Oct 2025 13:32:15 +0000 Subject: [PATCH 14/20] Make check for new KMP-Android plugin in decorateKotlinTarget This is in preparation to make the external android kmp target of type androidJvm (cherry picked from commit 35093651ee5cf59ec96e8c054e3188857420aff2) --- .../com/google/devtools/ksp/gradle/KspConfigurations.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspConfigurations.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspConfigurations.kt index 7b2ab3731f..92adf0efd4 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspConfigurations.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspConfigurations.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.gradle +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import com.google.devtools.ksp.gradle.AndroidPluginIntegration.useLegacyVariantApi import org.gradle.api.InvalidUserCodeException import org.gradle.api.Project @@ -147,7 +148,9 @@ class KspConfigurations(private val project: Project) { * and things get worse when you add product flavors. So, we use AGP sets as the source of truth. */ private fun decorateKotlinTarget(target: KotlinTarget, isKotlinMultiplatform: Boolean) { - if (target.platformType == KotlinPlatformType.androidJvm) { + if (target.platformType == KotlinPlatformType.androidJvm && + target !is KotlinMultiplatformAndroidLibraryTarget + ) { if (project.useLegacyVariantApi() || isKotlinMultiplatform) { createAndroidSourceSetConfigurations(target.project, target) } @@ -181,7 +184,9 @@ class KspConfigurations(private val project: Project) { compilation.kotlinSourceSets.mapTo(results) { getKotlinConfigurationName(compilation, it) } - if (compilation.platformType == KotlinPlatformType.androidJvm) { + if (compilation.platformType == KotlinPlatformType.androidJvm && + compilation.target !is KotlinMultiplatformAndroidLibraryTarget + ) { compilation as KotlinJvmAndroidCompilation AndroidPluginIntegration.getCompilationSourceSets(compilation).mapTo(results) { getAndroidConfigurationName(compilation.target, it) From 7ab4b97f2a7f3d38f4c3943f0884f0f81d208099 Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Thu, 30 Oct 2025 10:48:31 -0700 Subject: [PATCH 15/20] getJvmCheckedException: handle '$' in nested classes (cherry picked from commit 1947b9ff3373734ae34fcee464bde3cdbac5c36e) --- .../devtools/ksp/impl/symbol/util/BinaryUtils.kt | 4 +++- .../devtools/ksp/processor/ThrowListProcessor.kt | 3 +++ test-utils/testData/api/throwList.kt | 12 ++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/util/BinaryUtils.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/util/BinaryUtils.kt index 8659a8541c..76297d35fd 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/util/BinaryUtils.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/util/BinaryUtils.kt @@ -137,7 +137,9 @@ fun Resolver.extractThrowsFromClassFile( ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES ) return exceptionNames.mapNotNull { - this.getClassDeclarationByName(it.replace("/", "."))?.asStarProjectedType() + this.getClassDeclarationByName( + it.replace("/", ".").replace("$", ".") + )?.asStarProjectedType() }.asSequence() } diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/ThrowListProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/ThrowListProcessor.kt index e31f355c33..15d96ccb53 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/ThrowListProcessor.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/ThrowListProcessor.kt @@ -83,6 +83,9 @@ class ThrowListProcessor : AbstractTestProcessor() { jlib.getConstructors().map { resolver.getJvmCheckedException(it).toResult() }.sorted().forEach { result.add(it) } + jlib.declarations.filter { it.simpleName.asString() == "throwsNested" }.map { + resolver.getJvmCheckedException(it as KSFunctionDeclaration).toResult() + }.sorted().forEach { result.add(it) } return emptyList() } diff --git a/test-utils/testData/api/throwList.kt b/test-utils/testData/api/throwList.kt index 62e1c26abd..aa14edb69f 100644 --- a/test-utils/testData/api/throwList.kt +++ b/test-utils/testData/api/throwList.kt @@ -38,11 +38,19 @@ // java.io.IOException,java.lang.IndexOutOfBoundsException // java.lang.IndexOutOfBoundsException // java.io.IOException +// OuterException,OuterException.NestedException // END // MODULE: lib // FILE: JavaLib.java import java.io.IOException; import java.lang.IndexOutOfBoundsException; + +class OuterException extends IOException { + static class NestedException extends IOException { + + } +} + public class JavaLib { public JavaLib() throws IOException { @@ -57,6 +65,10 @@ public class JavaLib { public void foo(String[] s) throws IOException, IndexOutOfBoundsException { throw new IOException(); } + + public void throwsNested() throws OuterException, OuterException.NestedException { + throw new OuterException(); + } } // FILE: KtLib.kt import java.io.IOException From ae95921826e7c3ab2b9e26438bd5cfab3a86e833 Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Thu, 30 Oct 2025 12:12:19 -0700 Subject: [PATCH 16/20] Do not cache KSValueArgumentLiteImpl which is simple enough. Also, the previous implementation wrongly merged entries that have differrent parents, origins, and locations. (cherry picked from commit 7f53a9d6d93aa27eea73661fcdcf049d6eae74d6) --- .../ksp/impl/symbol/java/KSAnnotationJavaImpl.kt | 4 ++-- .../impl/symbol/java/KSValueArgumentLiteImpl.kt | 15 +-------------- .../ksp/impl/symbol/kotlin/KSAnnotationImpl.kt | 2 +- .../kotlin/resolved/KSAnnotationResolvedImpl.kt | 2 +- 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt index b9c04819e7..52d4ad6ee5 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt @@ -87,7 +87,7 @@ class KSAnnotationJavaImpl private constructor(private val psi: PsiAnnotation, o } else { calcValue(it.value) } - KSValueArgumentLiteImpl.getCached( + KSValueArgumentLiteImpl( name?.let { KSNameImpl.getCached(it) }, calculatedValue, this@KSAnnotationJavaImpl, @@ -125,7 +125,7 @@ class KSAnnotationJavaImpl private constructor(private val psi: PsiAnnotation, o } else { calcValue(value) } - KSValueArgumentLiteImpl.getCached( + KSValueArgumentLiteImpl( KSNameImpl.getCached(annoMethod.name), calculatedValue, this@KSAnnotationJavaImpl, diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSValueArgumentLiteImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSValueArgumentLiteImpl.kt index e34805ff47..b712411b39 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSValueArgumentLiteImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSValueArgumentLiteImpl.kt @@ -1,28 +1,15 @@ package com.google.devtools.ksp.impl.symbol.java -import com.google.devtools.ksp.common.IdKeyPair -import com.google.devtools.ksp.common.KSObjectCache import com.google.devtools.ksp.impl.symbol.kotlin.AbstractKSValueArgumentImpl import com.google.devtools.ksp.symbol.* -class KSValueArgumentLiteImpl private constructor( +class KSValueArgumentLiteImpl( override val name: KSName?, override val value: Any?, override val parent: KSNode, override val origin: Origin, override val location: Location ) : AbstractKSValueArgumentImpl() { - companion object : KSObjectCache, KSValueArgumentLiteImpl>() { - fun getCached( - name: KSName?, - value: Any?, - parent: KSNode, - origin: Origin, - location: Location = NonExistLocation - ) = KSValueArgumentLiteImpl.cache.getOrPut(IdKeyPair(name, value)) { - KSValueArgumentLiteImpl(name, value, parent, origin, location) - } - } override val isSpread: Boolean = false override val annotations: Sequence = emptySequence() diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt index 748c1425e7..2502883b55 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt @@ -95,7 +95,7 @@ class KSAnnotationImpl private constructor( } else { calcValue(value) } - KSValueArgumentLiteImpl.getCached( + KSValueArgumentLiteImpl( KSNameImpl.getCached(annoMethod.name), calculatedValue, this@KSAnnotationImpl, diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt index f7c475d399..79ca28cefc 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt @@ -92,7 +92,7 @@ class KSAnnotationResolvedImpl private constructor( } else { calcValue(value) } - KSValueArgumentLiteImpl.getCached( + KSValueArgumentLiteImpl( KSNameImpl.getCached(annoMethod.name), calculatedValue, this@KSAnnotationResolvedImpl, From ccbe27713f46c054b93f145e796997cd8b2a9dc1 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Sat, 1 Nov 2025 22:48:58 +0000 Subject: [PATCH 17/20] Update KSP tests (cherry picked from commit d33901aa185da5264ffcf490eae4d5b3b8fc5a57) --- .../com/google/devtools/ksp/test/AGP810IT.kt | 1 + .../com/google/devtools/ksp/test/AGP812IT.kt | 1 + .../com/google/devtools/ksp/test/AGP890IT.kt | 1 + .../com/google/devtools/ksp/test/AGP900IT.kt | 1 + .../ksp/test/AndroidBuiltInKotlinIT.kt | 1 + .../devtools/ksp/test/AndroidDataBindingIT.kt | 1 + .../com/google/devtools/ksp/test/AndroidIT.kt | 52 +------------- .../devtools/ksp/test/AndroidIncrementalIT.kt | 1 + .../devtools/ksp/test/AndroidViewBindingIT.kt | 1 + .../google/devtools/ksp/test/BuildCacheIT.kt | 1 + .../ksp/test/BuildCacheIncrementalIT.kt | 1 + .../ksp/test/BuiltInKotlinAGP900IT.kt | 1 + .../devtools/ksp/test/GeneratedRefsIncIT.kt | 1 + .../GeneratedSourcesViaAndroidComponentsIT.kt | 1 + .../devtools/ksp/test/GeneratedSrcsIncIT.kt | 1 + .../ksp/test/GetSealedSubclassesIncIT.kt | 1 + .../com/google/devtools/ksp/test/HmppIT.kt | 1 + .../devtools/ksp/test/IncrementalCPIT.kt | 1 + .../devtools/ksp/test/IncrementalEmptyCPIT.kt | 1 + .../google/devtools/ksp/test/IncrementalIT.kt | 3 +- .../ksp/test/IncrementalMultiChainIT.kt | 1 + .../ksp/test/IncrementalRemoval2IT.kt | 1 + .../devtools/ksp/test/IncrementalRemovalIT.kt | 1 + .../devtools/ksp/test/InitPlusProviderIT.kt | 1 + .../devtools/ksp/test/JavaNestedClassIT.kt | 1 + .../google/devtools/ksp/test/JavaOnlyIT.kt | 1 + .../com/google/devtools/ksp/test/KAPT3IT.kt | 1 + .../devtools/ksp/test/KMPImplementedIT.kt | 1 + .../devtools/ksp/test/KSPCmdLineOptionsIT.kt | 1 + .../google/devtools/ksp/test/KaptKspTest.kt | 1 + .../devtools/ksp/test/KotlinConstsInJavaIT.kt | 1 + .../devtools/ksp/test/KotlinInjectIT.kt | 1 + .../devtools/ksp/test/MultiplatformIT.kt | 1 + .../com/google/devtools/ksp/test/OnErrorIT.kt | 1 + .../devtools/ksp/test/OnlyResourcesFileIT.kt | 1 + .../google/devtools/ksp/test/OutputDepsIt.kt | 3 +- .../devtools/ksp/test/PartialCleanIT.kt | 1 + .../google/devtools/ksp/test/PlaygroundIT.kt | 51 ++++++++++++-- .../google/devtools/ksp/test/PsiCacheIT.kt | 1 + .../com/google/devtools/ksp/test/VerboseIT.kt | 67 ------------------- .../devtools/ksp/test/VersionCheckIT.kt | 40 ----------- .../ksp/test/{ => fixtures}/Artifact.kt | 2 + .../{ => fixtures}/TemporaryTestProject.kt | 2 +- .../devtools/ksp/test/utils/AssertionUtils.kt | 3 +- .../devtools/ksp/test/utils/TestUtils.kt | 50 ++++++++++++++ .../src/main/kotlin/BuilderProcessor.kt | 11 ++- 46 files changed, 149 insertions(+), 170 deletions(-) delete mode 100644 integration-tests/src/test/kotlin/com/google/devtools/ksp/test/VerboseIT.kt delete mode 100644 integration-tests/src/test/kotlin/com/google/devtools/ksp/test/VersionCheckIT.kt rename integration-tests/src/test/kotlin/com/google/devtools/ksp/test/{ => fixtures}/Artifact.kt (92%) rename integration-tests/src/test/kotlin/com/google/devtools/ksp/test/{ => fixtures}/TemporaryTestProject.kt (97%) create mode 100644 integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/TestUtils.kt diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP810IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP810IT.kt index f84c2b1751..96457a0d8c 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP810IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP810IT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP812IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP812IT.kt index 851c275754..598559b199 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP812IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP812IT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP890IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP890IT.kt index 6135261f28..2afc0842a0 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP890IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP890IT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt index 394e3cbb0b..62ca58fd21 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt index 3372725cb4..41f06ac4c5 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import com.google.devtools.ksp.test.utils.assertMergedConfigurationOutput import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidDataBindingIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidDataBindingIT.kt index 55c98c4f1b..56b2c44f36 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidDataBindingIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidDataBindingIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt index bab81f6a6f..27c0d9d316 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt @@ -1,12 +1,12 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import com.google.devtools.ksp.test.utils.assertMergedConfigurationOutput import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert import org.junit.Rule import org.junit.Test -import java.io.File class AndroidIT() { @Rule @@ -28,53 +28,3 @@ class AndroidIT() { } } } - -/** - * Pretty print the directory tree and its file names. - * - * @param folder - * must be a folder. - * @return - */ -fun printDirectoryTree(folder: File): String? { - require(folder.isDirectory) { "folder is not a Directory" } - val indent = 0 - val sb = StringBuilder() - printDirectoryTree(folder, indent, sb) - return sb.toString() -} - -private fun printDirectoryTree( - folder: File, - indent: Int, - sb: StringBuilder -) { - require(folder.isDirectory) { "folder is not a Directory" } - sb.append(getIndentString(indent)) - sb.append("+--") - sb.append(folder.name) - sb.append("/") - sb.append("\n") - for (file in folder.listFiles()) { - if (file.isDirectory) { - printDirectoryTree(file, indent + 1, sb) - } else { - printFile(file, indent + 1, sb) - } - } -} - -private fun printFile(file: File, indent: Int, sb: StringBuilder) { - sb.append(getIndentString(indent)) - sb.append("+--") - sb.append(file.name) - sb.append("\n") -} - -private fun getIndentString(indent: Int): String? { - val sb = StringBuilder() - for (i in 0 until indent) { - sb.append("| ") - } - return sb.toString() -} diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIncrementalIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIncrementalIT.kt index 443836ab71..89858d3f32 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIncrementalIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIncrementalIT.kt @@ -18,6 +18,7 @@ package com.google.devtools.ksp.test import com.google.devtools.ksp.test.fixtures.BuildResultFixture +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidViewBindingIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidViewBindingIT.kt index a91f675a4b..0a862046e8 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidViewBindingIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidViewBindingIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuildCacheIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuildCacheIT.kt index 19747438cf..23321bda52 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuildCacheIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuildCacheIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuildCacheIncrementalIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuildCacheIncrementalIT.kt index d564dc7eb6..fab29573b4 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuildCacheIncrementalIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuildCacheIncrementalIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Rule import org.junit.Test diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuiltInKotlinAGP900IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuiltInKotlinAGP900IT.kt index 2b681d45e2..0931a35b39 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuiltInKotlinAGP900IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/BuiltInKotlinAGP900IT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedRefsIncIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedRefsIncIT.kt index eb8910db2b..804ef9fc31 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedRefsIncIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedRefsIncIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt index e88ba13ba5..8e0bcba68b 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSourcesViaAndroidComponentsIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSrcsIncIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSrcsIncIT.kt index 5464cf4559..f9a184d471 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSrcsIncIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSrcsIncIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GetSealedSubclassesIncIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GetSealedSubclassesIncIT.kt index 17256cff3e..0d4277a3ce 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GetSealedSubclassesIncIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GetSealedSubclassesIncIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/HmppIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/HmppIT.kt index c0ed2da2df..76930bd62a 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/HmppIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/HmppIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalCPIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalCPIT.kt index ccbe3ffb7f..dd1e4f2169 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalCPIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalCPIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalEmptyCPIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalEmptyCPIT.kt index 2f45ee3a78..1a71838722 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalEmptyCPIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalEmptyCPIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalIT.kt index 2e96f3e5f6..ad373648c4 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalIT.kt @@ -1,6 +1,7 @@ package com.google.devtools.ksp.test -import Artifact +import com.google.devtools.ksp.test.fixtures.Artifact +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalMultiChainIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalMultiChainIT.kt index b65eb69fa1..6bcb107463 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalMultiChainIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalMultiChainIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalRemoval2IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalRemoval2IT.kt index 4846cef438..0ee663a45c 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalRemoval2IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalRemoval2IT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalRemovalIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalRemovalIT.kt index ead4ff25ba..53c4400794 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalRemovalIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/IncrementalRemovalIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/InitPlusProviderIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/InitPlusProviderIT.kt index a5bfacd4bc..d8950a85e1 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/InitPlusProviderIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/InitPlusProviderIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/JavaNestedClassIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/JavaNestedClassIT.kt index 4e744960d4..151fa283ca 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/JavaNestedClassIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/JavaNestedClassIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/JavaOnlyIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/JavaOnlyIT.kt index 08480ac9e2..7af20ecd8e 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/JavaOnlyIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/JavaOnlyIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KAPT3IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KAPT3IT.kt index 8afbd0fd77..94c5bed3b2 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KAPT3IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KAPT3IT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KMPImplementedIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KMPImplementedIT.kt index 4a58beb870..7afc001f1e 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KMPImplementedIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KMPImplementedIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt index 66714af3dd..67f5358d0b 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KSPCmdLineOptionsIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Assume diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KaptKspTest.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KaptKspTest.kt index 04c290272e..b2f1d66187 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KaptKspTest.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KaptKspTest.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KotlinConstsInJavaIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KotlinConstsInJavaIT.kt index 82c8159413..8927a373db 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KotlinConstsInJavaIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KotlinConstsInJavaIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KotlinInjectIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KotlinInjectIT.kt index 067b8d3982..df5efc8470 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KotlinInjectIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/KotlinInjectIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Rule import org.junit.Test diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/MultiplatformIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/MultiplatformIT.kt index 2005d43c8b..46f73d395c 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/MultiplatformIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/MultiplatformIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OnErrorIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OnErrorIT.kt index 7bceab0698..dda6b2ae7a 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OnErrorIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OnErrorIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Assert import org.junit.Rule diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OnlyResourcesFileIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OnlyResourcesFileIT.kt index bff105372a..7447fe920a 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OnlyResourcesFileIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OnlyResourcesFileIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Rule import org.junit.Test diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OutputDepsIt.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OutputDepsIt.kt index c16613b4ee..261c7b6f53 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OutputDepsIt.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/OutputDepsIt.kt @@ -1,6 +1,7 @@ package com.google.devtools.ksp.test -import Artifact +import com.google.devtools.ksp.test.fixtures.Artifact +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PartialCleanIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PartialCleanIT.kt index 483835de0b..dde11b46b0 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PartialCleanIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PartialCleanIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt index c7a61a07c0..b538a6caf5 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome @@ -31,15 +32,26 @@ class PlaygroundIT() { Assert.assertTrue(artifact.exists()) JarFile(artifact).use { jarFile -> - Assert.assertTrue(jarFile.getEntry("TestProcessor.log").size > 0) - Assert.assertTrue(jarFile.getEntry("hello/HELLO.class").size > 0) - Assert.assertTrue(jarFile.getEntry("g/G.class").size > 0) - Assert.assertTrue(jarFile.getEntry("com/example/AClassBuilder.class").size > 0) + jarFile.assertContainsNonNullEntry("TestProcessor.log") + jarFile.assertContainsNonNullEntry("Generated.class") + jarFile.assertContainsNonNullEntry("META-INF/proguard/builder-AClassBuilder.pro") + jarFile.assertContainsNonNullEntry("hello/HELLO.class") + jarFile.assertContainsNonNullEntry("g/G.class") + jarFile.assertContainsNonNullEntry("com/example/AClassBuilder.class") + jarFile.assertContainsNonNullEntry("com/example/BClassBuilder.class") + jarFile.assertContainsNonNullEntry("com/example/AClass.class") + jarFile.assertContainsNonNullEntry("com/example/BClass.class") } extraCheck(result) } + private fun JarFile.assertContainsNonNullEntry(path: String) { + val entry = getEntry(path) + Assert.assertNotNull("Entry '$path' should exist in the JAR file.", entry) + Assert.assertTrue("Entry '$path' should not be empty.", entry.size > 0) + } + @Test fun testPlayground() { // FIXME: `clean` fails to delete files on windows. @@ -52,6 +64,8 @@ class PlaygroundIT() { @Test fun testPlaygroundJDK8() { // FIXME: `clean` fails to delete files on windows. + Assume.assumeFalse(System.getProperty("os.name").startsWith("Windows", ignoreCase = true)) + File(project.root, "test-processor/build.gradle.kts").appendText( """ kotlin { @@ -70,7 +84,6 @@ class PlaygroundIT() { } """.trimIndent() ) - Assume.assumeFalse(System.getProperty("os.name").startsWith("Windows", ignoreCase = true)) val gradleRunner = GradleRunner.create().withProjectDir(project.root) gradleRunner.buildAndCheck("clean", "build") gradleRunner.buildAndCheck("clean", "build") @@ -83,7 +96,7 @@ class PlaygroundIT() { val gradleRunner = GradleRunner.create().withProjectDir(project.root).withGradleVersion("8.0") gradleRunner.withArguments(":workload:dependencies", "--info").build().let { Assert.assertTrue( - it.output.lines().filter { it.startsWith("The configuration :workload:ksp") }.isEmpty() + it.output.lines().none { it.startsWith("The configuration :workload:ksp") } ) } } @@ -405,4 +418,30 @@ class PlaygroundIT() { } } } + + @Test + fun testNoProvider() { + val gradleRunner = GradleRunner.create().withProjectDir(project.root) + File( + project.root, + "test-processor/src/main/resources/META-INF/services/" + + "com.google.devtools.ksp.processing.SymbolProcessorProvider" + ).delete() + gradleRunner.withArguments("build").buildAndFail().let { result -> + Assert.assertTrue(result.output.contains("No providers found in processor classpath.")) + } + } + + @Test + fun testProviderAndRoundLogging() { + val gradleRunner = GradleRunner.create().withProjectDir(project.root) + gradleRunner.buildAndCheck("--debug", "clean", "build") { result -> + Assert.assertTrue( + result.output.contains( + "i: [ksp] loaded provider(s): [TestProcessorProvider, TestProcessorProvider2]" + ) + ) + Assert.assertTrue(result.output.contains("v: [ksp] round 3 of processing")) + } + } } diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PsiCacheIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PsiCacheIT.kt index f6f7d77b59..494e75a6fb 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PsiCacheIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PsiCacheIT.kt @@ -1,5 +1,6 @@ package com.google.devtools.ksp.test +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import org.gradle.testkit.runner.GradleRunner import org.junit.Rule import org.junit.Test diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/VerboseIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/VerboseIT.kt deleted file mode 100644 index 962249b7da..0000000000 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/VerboseIT.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.google.devtools.ksp.test - -import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner -import org.gradle.testkit.runner.TaskOutcome -import org.junit.Assert -import org.junit.Rule -import org.junit.Test -import java.io.File -import java.util.jar.JarFile - -class VerboseIT() { - @Rule - @JvmField - val project: TemporaryTestProject = TemporaryTestProject("playground") - - private fun GradleRunner.buildAndCheck(vararg args: String, extraCheck: (BuildResult) -> Unit = {}) = - buildAndCheckOutcome(*args, outcome = TaskOutcome.SUCCESS, extraCheck = extraCheck) - - private fun GradleRunner.buildAndCheckOutcome( - vararg args: String, - outcome: TaskOutcome, - extraCheck: (BuildResult) -> Unit = {} - ) { - val result = this.withArguments(*args).build() - - Assert.assertEquals(outcome, result.task(":workload:build")?.outcome) - - val artifact = File(project.root, "workload/build/libs/workload-1.0-SNAPSHOT.jar") - Assert.assertTrue(artifact.exists()) - - JarFile(artifact).use { jarFile -> - Assert.assertTrue(jarFile.getEntry("TestProcessor.log").size > 0) - Assert.assertTrue(jarFile.getEntry("hello/HELLO.class").size > 0) - Assert.assertTrue(jarFile.getEntry("g/G.class").size > 0) - Assert.assertTrue(jarFile.getEntry("com/example/AClassBuilder.class").size > 0) - } - - extraCheck(result) - } - - @Test - fun testNoProvider() { - val gradleRunner = GradleRunner.create().withProjectDir(project.root) - File( - project.root, - "test-processor/src/main/resources/META-INF/services/" + - "com.google.devtools.ksp.processing.SymbolProcessorProvider" - ).delete() - gradleRunner.withArguments("build").buildAndFail().let { result -> - Assert.assertTrue(result.output.contains("No providers found in processor classpath.")) - } - } - - @Test - fun testProviderAndRoundLogging() { - val gradleRunner = GradleRunner.create().withProjectDir(project.root) - gradleRunner.buildAndCheck("--debug", "clean", "build") { result -> - Assert.assertTrue( - result.output.contains( - "i: [ksp] loaded provider(s): [TestProcessorProvider, TestProcessorProvider2]" - ) - ) - Assert.assertTrue(result.output.contains("v: [ksp] round 3 of processing")) - } - } -} diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/VersionCheckIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/VersionCheckIT.kt deleted file mode 100644 index 790e01cd13..0000000000 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/VersionCheckIT.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.google.devtools.ksp.test - -import org.gradle.testkit.runner.GradleRunner -import org.junit.Assert -import org.junit.Rule -import org.junit.Test - -class VersionCheckIT() { - @Rule - @JvmField - val project: TemporaryTestProject = TemporaryTestProject("playground") - - @Test - fun testVersion() { - val gradleRunner = GradleRunner.create().withProjectDir(project.root) - val result = gradleRunner.withArguments( - "-PkotlinVersion=2.0.0", "clean", "build" - ).run() - Assert.assertFalse(result.output.contains("is too new for kotlin")) - } - - @Test - fun testVersionOK() { - val gradleRunner = GradleRunner.create().withProjectDir(project.root) - val result = gradleRunner.withArguments( - "clean", "build" - ).run() - Assert.assertFalse(result.output.contains("is too new for kotlin")) - Assert.assertFalse(result.output.contains("is too old for kotlin")) - } - - @Test - fun testMuteVersionCheck() { - val gradleRunner = GradleRunner.create().withProjectDir(project.root) - val result = gradleRunner.withArguments( - "-PkotlinVersion=2.0.0", "-Pksp.version.check=false", "clean", "build" - ).run() - Assert.assertFalse(result.output.contains("is too new for kotlin")) - } -} diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/Artifact.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/fixtures/Artifact.kt similarity index 92% rename from integration-tests/src/test/kotlin/com/google/devtools/ksp/test/Artifact.kt rename to integration-tests/src/test/kotlin/com/google/devtools/ksp/test/fixtures/Artifact.kt index dea1eccc5f..b8fee3a0aa 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/Artifact.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/fixtures/Artifact.kt @@ -1,3 +1,5 @@ +package com.google.devtools.ksp.test.fixtures + import org.junit.Assert import java.io.File import java.util.zip.ZipFile diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/TemporaryTestProject.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/fixtures/TemporaryTestProject.kt similarity index 97% rename from integration-tests/src/test/kotlin/com/google/devtools/ksp/test/TemporaryTestProject.kt rename to integration-tests/src/test/kotlin/com/google/devtools/ksp/test/fixtures/TemporaryTestProject.kt index ee8c9e2643..75bd41a125 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/TemporaryTestProject.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/fixtures/TemporaryTestProject.kt @@ -1,4 +1,4 @@ -package com.google.devtools.ksp.test +package com.google.devtools.ksp.test.fixtures import org.junit.rules.TemporaryFolder import java.io.File diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt index 7c5125042a..93ea0dc77c 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt @@ -1,7 +1,6 @@ package com.google.devtools.ksp.test.utils -import com.google.devtools.ksp.test.TemporaryTestProject -import com.google.devtools.ksp.test.printDirectoryTree +import com.google.devtools.ksp.test.fixtures.TemporaryTestProject import java.io.File fun assertMergedConfigurationOutput(project: TemporaryTestProject, expectedOutput: String) { diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/TestUtils.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/TestUtils.kt new file mode 100644 index 0000000000..aa5c7aad9f --- /dev/null +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/TestUtils.kt @@ -0,0 +1,50 @@ +package com.google.devtools.ksp.test.utils + +import java.io.File + +/** + * Pretty print the directory tree and its file names. + * + */ +fun printDirectoryTree(folder: File): String { + require(folder.isDirectory) { "folder is not a Directory" } + val indent = 0 + val sb = StringBuilder() + printDirectoryTree(folder, indent, sb) + return sb.toString() +} + +private fun printDirectoryTree( + folder: File, + indent: Int, + sb: StringBuilder +) { + require(folder.isDirectory) { "folder is not a Directory" } + sb.append(getIndentString(indent)) + sb.append("+--") + sb.append(folder.name) + sb.append("/") + sb.append("\n") + for (file in folder.listFiles()) { + if (file.isDirectory) { + printDirectoryTree(file, indent + 1, sb) + } else { + printFile(file, indent + 1, sb) + } + } +} + +private fun printFile(file: File, indent: Int, sb: StringBuilder) { + sb.append(getIndentString(indent)) + sb.append("+--") + sb.append(file.name) + sb.append("\n") +} + +private fun getIndentString(indent: Int): String? { + val sb = StringBuilder() + for (i in 0 until indent) { + sb.append("| ") + } + return sb.toString() +} diff --git a/integration-tests/src/test/resources/playground/test-processor/src/main/kotlin/BuilderProcessor.kt b/integration-tests/src/test/resources/playground/test-processor/src/main/kotlin/BuilderProcessor.kt index efa5ddcfc6..e7d45254e2 100644 --- a/integration-tests/src/test/resources/playground/test-processor/src/main/kotlin/BuilderProcessor.kt +++ b/integration-tests/src/test/resources/playground/test-processor/src/main/kotlin/BuilderProcessor.kt @@ -1,3 +1,4 @@ +import com.google.devtools.ksp.getConstructors import com.google.devtools.ksp.containingFile import com.google.devtools.ksp.processing.* import com.google.devtools.ksp.symbol.* @@ -33,7 +34,15 @@ class BuilderProcessor : SymbolProcessor { inner class BuilderVisitor : KSVisitorVoid() { override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) { - classDeclaration.primaryConstructor?.accept(this, data) + val constructor = classDeclaration.primaryConstructor + ?: classDeclaration.getConstructors().maxByOrNull { it.parameters.size } + + if (constructor == null) { + logger.error("No suitable constructor found for ${classDeclaration.qualifiedName?.asString()}", classDeclaration) + return + } + + constructor.accept(this, data) } override fun visitFunctionDeclaration(function: KSFunctionDeclaration, data: Unit) { From 088e45beeb677afdc8871e2810d50361635cf956 Mon Sep 17 00:00:00 2001 From: Goooler Date: Fri, 31 Oct 2025 14:29:44 +0800 Subject: [PATCH 18/20] Apply Gradle's strict plugin types validation (cherry picked from commit b0cfdfc7fb2343b00730fc385606c0861d58b4d2) --- gradle-plugin/build.gradle.kts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/gradle-plugin/build.gradle.kts b/gradle-plugin/build.gradle.kts index 4d5aff60fd..b0304a3acd 100644 --- a/gradle-plugin/build.gradle.kts +++ b/gradle-plugin/build.gradle.kts @@ -46,13 +46,9 @@ kotlin { } } -tasks.named("validatePlugins").configure { - onlyIf { - // while traversing classpath, this hits a class not found issue. - // Disabled until gradle kotlin version and our kotlin version matches - // java.lang.ClassNotFoundException: org/jetbrains/kotlin/compilerRunner/KotlinLogger - false - } +tasks.validatePlugins { + // TODO: https://github.com/gradle/gradle/issues/22600 + enableStricterValidation = true } gradlePlugin { From fbdd2ae7d22571a8771f01cfc26c5f9752bdbcaa Mon Sep 17 00:00:00 2001 From: Goooler Date: Fri, 31 Oct 2025 14:24:53 +0800 Subject: [PATCH 19/20] Bump Lint plugin and clean up usage of android.lint.useK2Uast Updates lint baseline file by `./gradlew updateLintBaseline`. Refs https://github.com/androidx/androidx/commit/74499a002d1cec66a0fb9075c478cd7da787efc2. (cherry picked from commit 2f8019f8af82f854fa9d98b00dafc4a6fc174913) --- build.gradle.kts | 2 +- gradle-plugin/lint-baseline.xml | 116 +++++++------------------------- gradle.properties | 2 - 3 files changed, 26 insertions(+), 94 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 661afdd3a3..4d14fcaf7d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -28,7 +28,7 @@ plugins { // Adding plugins used in multiple places to the classpath for centralized version control id("com.gradleup.shadow") version "8.3.9" apply false id("org.jetbrains.dokka") version "1.9.20" apply false - id("com.android.lint") version "8.10.0" apply false + id("com.android.lint") version "8.13.0" apply false } nexusPublishing { diff --git a/gradle-plugin/lint-baseline.xml b/gradle-plugin/lint-baseline.xml index 5417d71047..0faf99db69 100644 --- a/gradle-plugin/lint-baseline.xml +++ b/gradle-plugin/lint-baseline.xml @@ -1,5 +1,5 @@ - + - - - - @@ -30,7 +19,7 @@ errorLine2=" ~~~"> @@ -41,7 +30,7 @@ errorLine2=" ~~~"> @@ -52,7 +41,7 @@ errorLine2=" ~~~~~~"> @@ -63,7 +52,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -74,7 +63,7 @@ errorLine2=" ~~~~~~~~~~~~~~~"> @@ -85,7 +74,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -96,7 +85,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -107,43 +96,10 @@ errorLine2=" ~~~~~~~~~~~"> - - - - - - - - - - - - @@ -162,7 +118,7 @@ errorLine2=" ~~~~~~~~~~~~~~"> @@ -173,7 +129,7 @@ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -184,7 +140,7 @@ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -195,7 +151,7 @@ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -206,7 +162,7 @@ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -217,7 +173,7 @@ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -228,7 +184,7 @@ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -239,7 +195,7 @@ errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -250,7 +206,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -261,7 +217,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -272,7 +228,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -283,32 +239,10 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - - - - - - - @@ -327,7 +261,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> diff --git a/gradle.properties b/gradle.properties index 8353208940..dbf5729f70 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,5 +27,3 @@ kotlin.jvm.target.validation.mode=warning # Build or runtime dependencies of this project buildKotlinVersion=2.2.10 buildKspVersion=2.2.10-2.0.2 - -android.lint.useK2Uast=true From dd0c918b49237c42af43e618aa510923ce896ed4 Mon Sep 17 00:00:00 2001 From: Hakan Mehmed Date: Mon, 3 Nov 2025 16:54:14 +0000 Subject: [PATCH 20/20] Extend tests with more assertions (cherry picked from commit b235f49f7bcbd3ed5d50d4f36f5040ab9a72246e) --- .../com/google/devtools/ksp/test/AGP900IT.kt | 2 +- .../ksp/test/AndroidBuiltInKotlinIT.kt | 42 +++++++++++++++++++ .../com/google/devtools/ksp/test/AndroidIT.kt | 26 ++++++++++++ .../google/devtools/ksp/test/PlaygroundIT.kt | 7 +--- .../devtools/ksp/test/utils/AssertionUtils.kt | 8 ++++ .../application/build.gradle.kts | 1 + .../playground-android-multi/build.gradle.kts | 10 ----- .../test-processor/build.gradle.kts | 1 + .../workload/build.gradle.kts | 1 + .../playground-android/build.gradle.kts | 10 ----- .../test-processor/build.gradle.kts | 1 + .../workload/build.gradle.kts | 1 + .../test/resources/srcs-gen/build.gradle.kts | 10 ----- .../srcs-gen/workload/build.gradle.kts | 1 + .../test-processor/build.gradle.kts | 1 + .../test-processor/workload/build.gradle.kts | 1 + 16 files changed, 86 insertions(+), 37 deletions(-) diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt index 62ca58fd21..d5f0971ba8 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt @@ -17,7 +17,7 @@ class AGP900IT() { fun testRunsKSP() { val gradleRunner = GradleRunner.create().withProjectDir(project.root).withGradleVersion("9.0.0") - File(project.root, "gradle.properties").appendText("\nagpVersion=9.0.0-alpha05") + File(project.root, "gradle.properties").appendText("\nagpVersion=9.0.0-alpha12") File(project.root, "gradle.properties").appendText("\nandroid.builtInKotlin=false") File(project.root, "gradle.properties").appendText("\nandroid.newDsl=false") diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt index 41f06ac4c5..83e9e9b3c5 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt @@ -1,6 +1,7 @@ package com.google.devtools.ksp.test import com.google.devtools.ksp.test.fixtures.TemporaryTestProject +import com.google.devtools.ksp.test.utils.assertContainsNonNullEntry import com.google.devtools.ksp.test.utils.assertMergedConfigurationOutput import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome @@ -8,6 +9,7 @@ import org.junit.Assert import org.junit.Rule import org.junit.Test import java.io.File +import java.util.jar.JarFile class AndroidBuiltInKotlinIT { @Rule @@ -22,7 +24,27 @@ class AndroidBuiltInKotlinIT { "clean", "build", "minifyReleaseWithR8", "--configuration-cache", "--info", "--stacktrace" ).build().let { result -> Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:build")?.outcome) + + val classesJar = File( + project.root, + "workload/build/intermediates/compile_app_classes_jar/debug/bundleDebugClassesToCompileJar/classes.jar" + ) + JarFile(classesJar).use { jarFile -> + jarFile.assertContainsNonNullEntry("Generated.class") + jarFile.assertContainsNonNullEntry("hello/HELLO.class") + jarFile.assertContainsNonNullEntry("com/example/AClassBuilder.class") + jarFile.assertContainsNonNullEntry("com/example/BClassBuilder.class") + jarFile.assertContainsNonNullEntry("com/example/AClass.class") + jarFile.assertContainsNonNullEntry("com/example/BClass.class") + } + + val javaResDir = File(project.root, "workload/build/intermediates/java_res/debug/processDebugJavaRes/out") + Assert.assertTrue(File(javaResDir, "TestProcessor.log").exists()) + Assert.assertTrue(File(javaResDir, "META-INF/proguard/builder-AClassBuilder.pro").exists()) + Assert.assertTrue(File(javaResDir, "META-INF/proguard/builder-BClassBuilder.pro").exists()) assertMergedConfigurationOutput(project, "-keep class com.example.AClassBuilder { *; }") + assertMergedConfigurationOutput(project, "-keep class com.example.BClassBuilder { *; }") + val outputs = result.output.lines() assert("w: [ksp] [workload_debug] Mangled name for internalFun: internalFun\$workload_debug" in outputs) assert("w: [ksp] [workload_release] Mangled name for internalFun: internalFun\$workload_release" in outputs) @@ -59,7 +81,27 @@ class AndroidBuiltInKotlinIT { "clean", "build", "minifyReleaseWithR8", "--configuration-cache", "--info", "--stacktrace" ).build().let { result -> Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:build")?.outcome) + + val classesJar = File( + project.root, + "workload/build/intermediates/compile_app_classes_jar/debug/bundleDebugClassesToCompileJar/classes.jar" + ) + JarFile(classesJar).use { jarFile -> + jarFile.assertContainsNonNullEntry("Generated.class") + jarFile.assertContainsNonNullEntry("hello/HELLO.class") + jarFile.assertContainsNonNullEntry("com/example/AClassBuilder.class") + jarFile.assertContainsNonNullEntry("com/example/BClassBuilder.class") + jarFile.assertContainsNonNullEntry("com/example/AClass.class") + jarFile.assertContainsNonNullEntry("com/example/BClass.class") + } + + val javaResDir = File(project.root, "workload/build/intermediates/java_res/debug/processDebugJavaRes/out") + Assert.assertTrue(File(javaResDir, "TestProcessor.log").exists()) + Assert.assertTrue(File(javaResDir, "META-INF/proguard/builder-AClassBuilder.pro").exists()) + Assert.assertTrue(File(javaResDir, "META-INF/proguard/builder-BClassBuilder.pro").exists()) assertMergedConfigurationOutput(project, "-keep class com.example.AClassBuilder { *; }") + assertMergedConfigurationOutput(project, "-keep class com.example.BClassBuilder { *; }") + val outputs = result.output.lines() assert("w: [ksp] [workload_debug] Mangled name for internalFun: internalFun\$workload_debug" in outputs) assert("w: [ksp] [workload_release] Mangled name for internalFun: internalFun\$workload_release" in outputs) diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt index 27c0d9d316..e845379fb5 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidIT.kt @@ -1,12 +1,15 @@ package com.google.devtools.ksp.test import com.google.devtools.ksp.test.fixtures.TemporaryTestProject +import com.google.devtools.ksp.test.utils.assertContainsNonNullEntry import com.google.devtools.ksp.test.utils.assertMergedConfigurationOutput import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome import org.junit.Assert import org.junit.Rule import org.junit.Test +import java.io.File +import java.util.jar.JarFile class AndroidIT() { @Rule @@ -21,7 +24,30 @@ class AndroidIT() { "clean", "build", "minifyReleaseWithR8", "--configuration-cache", "--info", "--stacktrace" ).build().let { result -> Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:build")?.outcome) + + val classesJar = File( + project.root, + "workload/build/intermediates/compile_app_classes_jar/debug/bundleDebugClassesToCompileJar/classes.jar" + ) + JarFile(classesJar).use { jarFile -> + jarFile.assertContainsNonNullEntry("Generated.class") + jarFile.assertContainsNonNullEntry("hello/HELLO.class") + jarFile.assertContainsNonNullEntry("com/example/AClassBuilder.class") + jarFile.assertContainsNonNullEntry("com/example/BClassBuilder.class") + jarFile.assertContainsNonNullEntry("com/example/AClass.class") + jarFile.assertContainsNonNullEntry("com/example/BClass.class") + jarFile.assertContainsNonNullEntry("TestProcessor.log") + jarFile.assertContainsNonNullEntry("META-INF/proguard/builder-AClassBuilder.pro") + jarFile.assertContainsNonNullEntry("META-INF/proguard/builder-BClassBuilder.pro") + } + + val javaResDir = File(project.root, "workload/build/intermediates/java_res/debug/processDebugJavaRes/out") + Assert.assertTrue(File(javaResDir, "TestProcessor.log").exists()) + Assert.assertTrue(File(javaResDir, "META-INF/proguard/builder-AClassBuilder.pro").exists()) + Assert.assertTrue(File(javaResDir, "META-INF/proguard/builder-BClassBuilder.pro").exists()) assertMergedConfigurationOutput(project, "-keep class com.example.AClassBuilder { *; }") + assertMergedConfigurationOutput(project, "-keep class com.example.BClassBuilder { *; }") + val outputs = result.output.lines() assert("w: [ksp] [workload_debug] Mangled name for internalFun: internalFun\$workload_debug" in outputs) assert("w: [ksp] [workload_release] Mangled name for internalFun: internalFun\$workload_release" in outputs) diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt index b538a6caf5..44885b057f 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/PlaygroundIT.kt @@ -1,6 +1,7 @@ package com.google.devtools.ksp.test import com.google.devtools.ksp.test.fixtures.TemporaryTestProject +import com.google.devtools.ksp.test.utils.assertContainsNonNullEntry import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.TaskOutcome @@ -46,12 +47,6 @@ class PlaygroundIT() { extraCheck(result) } - private fun JarFile.assertContainsNonNullEntry(path: String) { - val entry = getEntry(path) - Assert.assertNotNull("Entry '$path' should exist in the JAR file.", entry) - Assert.assertTrue("Entry '$path' should not be empty.", entry.size > 0) - } - @Test fun testPlayground() { // FIXME: `clean` fails to delete files on windows. diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt index 93ea0dc77c..ed586817c1 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/utils/AssertionUtils.kt @@ -1,7 +1,9 @@ package com.google.devtools.ksp.test.utils import com.google.devtools.ksp.test.fixtures.TemporaryTestProject +import org.junit.Assert import java.io.File +import java.util.jar.JarFile fun assertMergedConfigurationOutput(project: TemporaryTestProject, expectedOutput: String) { val mergedConfiguration = File(project.root, "workload/build/outputs/mapping/release/configuration.txt") @@ -13,3 +15,9 @@ fun assertMergedConfigurationOutput(project: TemporaryTestProject, expectedOutpu "Merged configuration did not contain expected output!\n" } } + +fun JarFile.assertContainsNonNullEntry(path: String) { + val entry = getEntry(path) + Assert.assertNotNull("Entry '$path' should exist in the JAR file.", entry) + Assert.assertTrue("Entry '$path' should not be empty.", entry.size > 0) +} diff --git a/integration-tests/src/test/resources/playground-android-multi/application/build.gradle.kts b/integration-tests/src/test/resources/playground-android-multi/application/build.gradle.kts index ff33a105b2..a90cbd5a17 100644 --- a/integration-tests/src/test/resources/playground-android-multi/application/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android-multi/application/build.gradle.kts @@ -11,6 +11,7 @@ repositories { maven(testRepo) mavenCentral() maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() } dependencies { diff --git a/integration-tests/src/test/resources/playground-android-multi/build.gradle.kts b/integration-tests/src/test/resources/playground-android-multi/build.gradle.kts index b25a124da5..20ab90aee0 100644 --- a/integration-tests/src/test/resources/playground-android-multi/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android-multi/build.gradle.kts @@ -15,13 +15,3 @@ plugins { id("com.google.devtools.ksp") apply false id("com.android.library") apply false } - -allprojects { - val testRepo: String by project - repositories { - maven(testRepo) - mavenCentral() - maven("https://redirector.kotlinlang.org/maven/bootstrap/") - google() - } -} diff --git a/integration-tests/src/test/resources/playground-android-multi/test-processor/build.gradle.kts b/integration-tests/src/test/resources/playground-android-multi/test-processor/build.gradle.kts index d3390ab956..725954660e 100644 --- a/integration-tests/src/test/resources/playground-android-multi/test-processor/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android-multi/test-processor/build.gradle.kts @@ -12,6 +12,7 @@ repositories { maven(testRepo) mavenCentral() maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() } dependencies { diff --git a/integration-tests/src/test/resources/playground-android-multi/workload/build.gradle.kts b/integration-tests/src/test/resources/playground-android-multi/workload/build.gradle.kts index 11b6b9c80c..29ef27853c 100644 --- a/integration-tests/src/test/resources/playground-android-multi/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android-multi/workload/build.gradle.kts @@ -13,6 +13,7 @@ repositories { maven(testRepo) mavenCentral() maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() } dependencies { diff --git a/integration-tests/src/test/resources/playground-android/build.gradle.kts b/integration-tests/src/test/resources/playground-android/build.gradle.kts index 4d3201df21..fab421a477 100644 --- a/integration-tests/src/test/resources/playground-android/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android/build.gradle.kts @@ -8,13 +8,3 @@ buildscript { google() } } - -allprojects { - val testRepo: String by project - repositories { - maven(testRepo) - mavenCentral() - maven("https://redirector.kotlinlang.org/maven/bootstrap/") - google() - } -} diff --git a/integration-tests/src/test/resources/playground-android/test-processor/build.gradle.kts b/integration-tests/src/test/resources/playground-android/test-processor/build.gradle.kts index d3390ab956..725954660e 100644 --- a/integration-tests/src/test/resources/playground-android/test-processor/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android/test-processor/build.gradle.kts @@ -12,6 +12,7 @@ repositories { maven(testRepo) mavenCentral() maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() } dependencies { diff --git a/integration-tests/src/test/resources/playground-android/workload/build.gradle.kts b/integration-tests/src/test/resources/playground-android/workload/build.gradle.kts index d6aaf3b09d..885b6a2a17 100644 --- a/integration-tests/src/test/resources/playground-android/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android/workload/build.gradle.kts @@ -14,6 +14,7 @@ repositories { maven(testRepo) mavenCentral() maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() } dependencies { diff --git a/integration-tests/src/test/resources/srcs-gen/build.gradle.kts b/integration-tests/src/test/resources/srcs-gen/build.gradle.kts index 333c8553ab..5c95df379a 100644 --- a/integration-tests/src/test/resources/srcs-gen/build.gradle.kts +++ b/integration-tests/src/test/resources/srcs-gen/build.gradle.kts @@ -14,13 +14,3 @@ plugins { id("com.google.devtools.ksp") apply false id("com.android.library") apply false } - -allprojects { - val testRepo: String by project - repositories { - maven(testRepo) - mavenCentral() - maven("https://redirector.kotlinlang.org/maven/bootstrap/") - google() - } -} diff --git a/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts b/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts index 6b17d32ad4..d81e2940a8 100644 --- a/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts @@ -12,6 +12,7 @@ repositories { maven(testRepo) mavenCentral() maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() } dependencies { diff --git a/integration-tests/src/test/resources/test-processor/test-processor/build.gradle.kts b/integration-tests/src/test/resources/test-processor/test-processor/build.gradle.kts index 2991683d1e..aef54f7136 100644 --- a/integration-tests/src/test/resources/test-processor/test-processor/build.gradle.kts +++ b/integration-tests/src/test/resources/test-processor/test-processor/build.gradle.kts @@ -12,6 +12,7 @@ repositories { maven(testRepo) mavenCentral() maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() } dependencies { diff --git a/integration-tests/src/test/resources/test-processor/workload/build.gradle.kts b/integration-tests/src/test/resources/test-processor/workload/build.gradle.kts index 75d6f02007..365f728ab7 100644 --- a/integration-tests/src/test/resources/test-processor/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/test-processor/workload/build.gradle.kts @@ -11,6 +11,7 @@ repositories { maven(testRepo) mavenCentral() maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() } dependencies {