From 21b8e1a0c8d6d7f1ec8588dca9a54e31e24ce7b3 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Wed, 27 Jul 2022 13:59:43 +0200 Subject: [PATCH] Fix Kapt generate stubs doesn't know about java sources from main task Restore configuration to set to KaptGenerateStubsTask java sources set to related KotlinCompile task. ^KT-52761 Fixed --- .../org/jetbrains/kotlin/gradle/Kapt3IT.kt | 9 +++- .../kapt2/generatedSources/build.gradle | 23 +++++++++ .../generatedSources/src/main/kotlin/Main.kt | 1 + .../src/main/kotlin/UserInfo2.kt | 4 ++ .../src/main/kotlin/UserMapper.kt | 7 +++ .../src/proto/generated/User.java | 31 ++++++++++++ .../internal/kapt/KaptGenerateStubsTask.kt | 14 ------ .../configuration/KaptGenerateStubsConfig.kt | 50 +++++++++++++++++-- 8 files changed, 121 insertions(+), 18 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/Main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/UserInfo2.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/UserMapper.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/proto/generated/User.java diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt index 0c6b37ac717..07438cf739c 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt @@ -936,7 +936,6 @@ open class Kapt3IT : Kapt3BaseIT() { } @DisplayName("KT-46651: kapt is tracking source files properly with configuration cache enabled") - @GradleTestVersions(minVersion = TestVersions.Gradle.G_6_7) @GradleTest fun kaptGenerateStubsShouldNotCaptureSourcesStateInConfigurationCache(gradleVersion: GradleVersion) { project( @@ -1007,4 +1006,12 @@ open class Kapt3IT : Kapt3BaseIT() { } } } + + @DisplayName("KT-52761: generated sources attached to compile task are also used by generate stubs task") + @GradleTest + fun testGeneratedSourcesUsedInGenerateStubsTask(gradleVersion: GradleVersion) { + project("generatedSources".withPrefix, gradleVersion) { + build("assemble") + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/build.gradle new file mode 100644 index 00000000000..46c87cb98b9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/build.gradle @@ -0,0 +1,23 @@ +plugins { + id "org.jetbrains.kotlin.jvm" + id "org.jetbrains.kotlin.kapt" +} + +repositories { + mavenLocal() + mavenCentral() +} + +tasks.named("compileKotlin", org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile.class) { + source("src/proto/generated") +} + +tasks.withType(JavaCompile.class).configureEach { + source("src/proto/generated") +} + +dependencies { + // Mapstruct + implementation("org.mapstruct:mapstruct:1.5.1.Final") + kapt("org.mapstruct:mapstruct-processor:1.5.1.Final") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/Main.kt new file mode 100644 index 00000000000..d44a1616c01 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/Main.kt @@ -0,0 +1 @@ +fun main() {} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/UserInfo2.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/UserInfo2.kt new file mode 100644 index 00000000000..69a213e0f99 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/UserInfo2.kt @@ -0,0 +1,4 @@ +data class UserInfo2( + val name: String, + val email: String +) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/UserMapper.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/UserMapper.kt new file mode 100644 index 00000000000..229cc43654b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/main/kotlin/UserMapper.kt @@ -0,0 +1,7 @@ +import User.UserInfo +import org.mapstruct.Mapper + +@Mapper +interface UserMapper { + fun mapUserInfo(source: UserInfo): UserInfo2 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/proto/generated/User.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/proto/generated/User.java new file mode 100644 index 00000000000..22b081819bf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/generatedSources/src/proto/generated/User.java @@ -0,0 +1,31 @@ +public final class User { + private User() {} + + public static final class UserInfo { + + private UserInfo() { + name_ = ""; + email_ = ""; + } + + private volatile String name_; + + public String getName() { + return name_; + } + + public void setName(String name) { + name_ = name; + } + + private volatile String email_; + + public String getEmail() { + return email_; + } + + public void setEmail(String email) { + email_ = email; + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt index 2f3741becc9..da98ce2db24 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt @@ -67,10 +67,6 @@ abstract class KaptGenerateStubsTask @Inject constructor( @get:Incremental abstract val additionalSources: ConfigurableFileCollection - private fun File.isSourceRootAllowed(): Boolean = - !destinationDirectory.get().asFile.isParentOf(this) && - !stubsDir.asFile.get().isParentOf(this) - override fun skipCondition(): Boolean = sources.isEmpty && javaSources.isEmpty // Task need to run even if there is no Kotlin sources, but only Java @@ -79,10 +75,6 @@ abstract class KaptGenerateStubsTask @Inject constructor( @get:IgnoreEmptyDirectories @get:PathSensitive(PathSensitivity.RELATIVE) override val sources: FileCollection = super.sources - .asFileTree - .matching { patternFilterable -> - patternFilterable.include { it.isDirectory || it.file.isSourceRootAllowed() } - } @get:Internal override val scriptSources: FileCollection = objectFactory.fileCollection() @@ -99,12 +91,6 @@ abstract class KaptGenerateStubsTask @Inject constructor( classpathSnapshotProperties.classpathSnapshot ) - override val javaSources: FileCollection = super.javaSources - .asFileTree - .matching { patternFilterable -> - patternFilterable.include { it.isDirectory || it.file.isSourceRootAllowed() } - } - @get:Internal internal abstract val compileKotlinArgumentsContributor: Property> diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptGenerateStubsConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptGenerateStubsConfig.kt index ea77d57950c..8a8d0c31908 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptGenerateStubsConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptGenerateStubsConfig.kt @@ -6,13 +6,14 @@ package org.jetbrains.kotlin.gradle.tasks.configuration import org.gradle.api.Project +import org.gradle.api.file.DirectoryProperty import org.gradle.api.provider.Provider +import org.gradle.api.specs.Spec import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension +import org.jetbrains.kotlin.gradle.internal.* import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.KAPT_SUBPLUGIN_ID import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isIncludeCompileClasspath -import org.jetbrains.kotlin.gradle.internal.KaptGenerateStubsTask -import org.jetbrains.kotlin.gradle.internal.KaptTask import org.jetbrains.kotlin.gradle.internal.KotlinJvmCompilerArgumentsContributor import org.jetbrains.kotlin.gradle.internal.buildKaptSubpluginOptions import org.jetbrains.kotlin.gradle.plugin.KaptExtension @@ -20,7 +21,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.CompilerPluginOptions import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompilerArgumentsProvider -import java.util.concurrent.Callable +import org.jetbrains.kotlin.gradle.utils.isParentOf +import java.io.File +import java.nio.file.Files internal class KaptGenerateStubsConfig : BaseKotlinCompileConfig { @@ -33,6 +36,26 @@ internal class KaptGenerateStubsConfig : BaseKotlinCompileConfig { + override fun isSatisfiedBy(element: File): Boolean { + return !element.isEmptyDirectory && + element.isSourceRootAllowed() + } + + private val File.isEmptyDirectory: Boolean + get() = with(toPath()) { Files.isDirectory(this) && !Files.list(this).use { it.findFirst().isPresent } } + + private fun File.isSourceRootAllowed(): Boolean = + !destinationDirectory.get().asFile.isParentOf(this) && + !stubsDir.asFile.get().isParentOf(this) && + !additionalParentToCheck.isParentOf(this) + } } \ No newline at end of file