From 04b39ba2e11ae9fda34202078203d295b17bbfe8 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Tue, 9 May 2023 16:24:16 +0200 Subject: [PATCH] Don't add explicitApi mode for test sources ^KT-58571 Fixed --- .../jetbrains/kotlin/gradle/ExplicitApiIT.kt | 48 +++++++++++++++++++ .../gradle/testbase/outputAssertions.kt | 16 +++++++ .../native/KotlinNativeTargetConfigurator.kt | 13 ++++- .../gradle/tasks/AbstractKotlinCompile.kt | 2 +- .../AbstractKotlinCompileConfig.kt | 25 ++++++++++ 5 files changed, 102 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt index 71f9cf15b98..d33bd27357d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ExplicitApiIT.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle import org.gradle.api.logging.LogLevel import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.gradle.util.AGPVersion import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.junit.jupiter.api.DisplayName @@ -37,6 +38,12 @@ class ExplicitApiIT : KGPBaseTest() { assertCompilerArgument(":compileKotlin", "-Xexplicit-api=warning") } + + build(":compileTestKotlin") { + assertTasksExecuted(":compileTestKotlin") + + assertNoCompilerArgument(":compileTestKotlin", "-Xexplicit-api=warning") + } } } @@ -142,4 +149,45 @@ class ExplicitApiIT : KGPBaseTest() { } } } + + @DisplayName("Explicit api mode is enabled only for non-test variants in Android project") + @AndroidGradlePluginTests + @GradleAndroidTest + fun explicitApiAndroid( + gradleVersion: GradleVersion, + agpVersion: String, + jdkVersion: JdkVersions.ProvidedJdk + ) { + project( + "AndroidSimpleApp", + gradleVersion, + buildOptions = defaultBuildOptions.copy( + androidVersion = agpVersion, + logLevel = LogLevel.DEBUG + ), + buildJdk = jdkVersion.location + ) { + + buildGradle.appendText( + //language=groovy + """ + | + |kotlin.explicitApiWarning() + | + """.trimMargin() + ) + + build(":compileDebugKotlin") { + assertTasksExecuted(":compileDebugKotlin") + + assertCompilerArgument(":compileDebugKotlin", "-Xexplicit-api=warning") + } + + build(":compileDebugUnitTestKotlin") { + assertTasksExecuted(":compileDebugUnitTestKotlin") + + assertNoCompilerArgument(":compileDebugUnitTestKotlin", "-Xexplicit-api=warning") + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/outputAssertions.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/outputAssertions.kt index d9109518d11..c7f585c574d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/outputAssertions.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/outputAssertions.kt @@ -254,6 +254,22 @@ fun BuildResult.assertCompilerArgument( } } +fun BuildResult.assertNoCompilerArgument( + taskPath: String, + notExpectedArgument: String, +) { + val taskOutput = getOutputForTask(taskPath) + val compilerArguments = taskOutput.lines().first { + it.contains("Kotlin compiler args:") + }.substringAfter("Kotlin compiler args:") + + assert(!compilerArguments.contains(notExpectedArgument)) { + printBuildOutput() + + "$taskPath task compiler arguments contains $notExpectedArgument. Actual content: $compilerArguments" + } +} + /** * Asserts command line arguments of the given K/N compiler for given tasks' paths * diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index cf9bbab9f14..7ad421872bb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -20,6 +20,7 @@ import org.gradle.api.provider.Provider import org.gradle.api.tasks.Exec import org.gradle.api.tasks.TaskProvider import org.gradle.language.base.plugins.LifecycleBasePlugin +import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions import org.jetbrains.kotlin.gradle.dsl.topLevelExtension import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME @@ -404,7 +405,17 @@ open class KotlinNativeTargetConfigurator : AbstractKotl it.runViaBuildToolsApi.value(false).disallowChanges() // K/N is not yet supported it.explicitApiMode - .value(project.providers.provider { ext.explicitApi }) + .value( + project.providers.provider { + // Plugin explicitly does not configures 'explicitApi' mode for test sources + // compilation, as test sources are not published + if (compilationInfo.isMain) { + ext.explicitApi + } else { + ExplicitApiMode.Disabled + } + } + ) .finalizeValueOnRead() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompile.kt index b98474923f0..f52b84fe4f5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/AbstractKotlinCompile.kt @@ -112,7 +112,7 @@ abstract class AbstractKotlinCompile @Inject constr @get:Input @get:Optional - internal abstract val explicitApiMode: Property + abstract val explicitApiMode: Property @get:Internal internal abstract val suppressKotlinOptionsFreeArgsModificationWarning: Property diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/AbstractKotlinCompileConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/AbstractKotlinCompileConfig.kt index 0b4090f13b7..fc93b13bf9d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/AbstractKotlinCompileConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/AbstractKotlinCompileConfig.kt @@ -14,6 +14,7 @@ import org.gradle.api.provider.ProviderFactory import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.compilerRunner.CompilerSystemPropertiesService import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner +import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension import org.jetbrains.kotlin.gradle.dsl.topLevelExtension import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoBuildService @@ -21,6 +22,8 @@ import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService import org.jetbrains.kotlin.gradle.internal.KaptGenerateStubsTask import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithClosure import org.jetbrains.kotlin.gradle.plugin.mpp.internal import org.jetbrains.kotlin.gradle.plugin.sources.applyLanguageSettingsToCompilerOptions @@ -162,6 +165,28 @@ internal abstract class AbstractKotlinCompileConfig