From 62c351874f49196ef3de80bdd4992ad501964f8f Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 25 Jan 2022 00:37:09 +0400 Subject: [PATCH] KT-49089 Fix using @OptionalExpectation annotations from dependencies Fix the behavior of the common (metadata KLIB) compiler with hierarchical project structures support as it analyses usages of annotations from dependencies that are marked with `@OptionalExpectations`. The fix on the Kotlin Gradle plugin side is to add the -Xcommon-sources=... compiler argument to those the invocations of the compiler, just as it is done with the other compilers. Issue #KT-49089 Verification Pending --- .../jetbrains/kotlin/gradle/NewMultiplatformIT.kt | 12 ++++++++++++ .../compilerRunner/GradleKotlinCompilerRunner.kt | 2 ++ .../kotlin/gradle/tasks/KotlinCompileCommon.kt | 7 ++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 993a7fb96e8..ddcd0aa2d51 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -34,6 +34,7 @@ import java.util.jar.JarFile import java.util.zip.ZipFile import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertNotNull import kotlin.test.assertTrue class NewMultiplatformIT : BaseGradleIT() { @@ -1161,6 +1162,17 @@ class NewMultiplatformIT : BaseGradleIT() { """.trimIndent() ) + build("compileCommonMainKotlinMetadata") { + assertSuccessful() + val compilerArgsLine = output.lines().singleOrNull { ":compileCommonMainKotlinMetadata Kotlin compiler args" in it } + assertNotNull(compilerArgsLine, "The debug log should contain the compiler args for the task :compileCommonMainKotlinMetadata") + val args = compilerArgsLine.split(" ") + val xCommonSourcesArg = args.singleOrNull { it.startsWith("-Xcommon-sources=") } + assertNotNull(xCommonSourcesArg, "The compiler args for K2Metadata should contain the -Xcommon-sources argument") + val xCommonSourcesFiles = xCommonSourcesArg.substringAfter("-Xcommon-sources=").split(",") + assertTrue { xCommonSourcesFiles.any { it.endsWith("Optional.kt") } } + } + build("compileKotlinJvmWithoutJava", "compileKotlinLinux64") { assertSuccessful() assertFileExists(targetClassesDir("jvmWithoutJava") + "OptionalCommonUsage.class") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index 0f98c065aaf..fe7ee4c75a1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -116,10 +116,12 @@ internal open class GradleCompilerRunner( */ fun runMetadataCompilerAsync( kotlinSources: List, + kotlinCommonSources: List, args: K2MetadataCompilerArguments, environment: GradleCompilerEnvironment ): WorkQueue? { args.freeArgs += kotlinSources.map { it.absolutePath } + args.commonSources = kotlinCommonSources.map { it.absolutePath }.toTypedArray() return runCompilerAsync(KotlinCompilerClass.METADATA, args, environment) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt index f387501845d..03c483bdbc3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt @@ -150,6 +150,11 @@ abstract class KotlinCompileCommon @Inject constructor( reportingSettings = reportingSettings(), outputFiles = allOutputFiles() ) - compilerRunner.runMetadataCompilerAsync(sourceRoots.kotlinSourceFiles.files.toList(), args, environment) + compilerRunner.runMetadataCompilerAsync( + sourceRoots.kotlinSourceFiles.files.toList(), + commonSourceSet.files.toList(), + args, + environment + ) } }