[Gradle] Migrate K2-usage warning

This commit is contained in:
Dmitry Savvinov
2023-05-03 09:53:31 +01:00
parent b6a90cfe7e
commit 8a5433734b
7 changed files with 40 additions and 29 deletions
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.gradle.experimental
import org.gradle.api.logging.LogLevel import org.gradle.api.logging.LogLevel
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.cli.common.arguments.K2NativeCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2NativeCompilerArguments
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.testbase.*
import org.jetbrains.kotlin.gradle.util.parseCompilerArgumentsFromBuildOutput import org.jetbrains.kotlin.gradle.util.parseCompilerArgumentsFromBuildOutput
import org.jetbrains.kotlin.gradle.utils.EXPERIMENTAL_TRY_K2_WARNING_MESSAGE
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import kotlin.io.path.appendText import kotlin.io.path.appendText
@@ -29,7 +29,7 @@ class TryK2IT : KGPBaseTest() {
enableTryK2() enableTryK2()
build("--dry-run") { build("--dry-run") {
assertOutputContainsExactTimes(EXPERIMENTAL_TRY_K2_WARNING_MESSAGE, 1) output.assertHasDiagnostic(KotlinToolingDiagnostics.ExperimentalK2Warning)
assertOutputContains("No Kotlin compilation tasks have been run") assertOutputContains("No Kotlin compilation tasks have been run")
} }
} }
@@ -96,8 +96,6 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
} }
BuildMetricsService.registerIfAbsent(project) BuildMetricsService.registerIfAbsent(project)
project.warnExperimentalTryK2IsEnabled()
} }
private fun addKotlinCompilerConfiguration(project: Project) { private fun addKotlinCompilerConfiguration(project: Project) {
@@ -105,7 +105,8 @@ internal interface KotlinGradleProjectChecker {
DisabledCinteropCommonizationInHmppProjectChecker, DisabledCinteropCommonizationInHmppProjectChecker,
DisabledNativeTargetsChecker, DisabledNativeTargetsChecker,
JsEnvironmentChecker, JsEnvironmentChecker,
PreHmppDependenciesUsageChecker PreHmppDependenciesUsageChecker,
ExperimentalK2UsageChecker
) )
} }
} }
@@ -321,4 +321,13 @@ object KotlinToolingDiagnostics {
""".trimIndent() """.trimIndent()
) )
} }
object ExperimentalK2Warning : ToolingDiagnosticFactory(WARNING) {
operator fun invoke() = build(
"""
ATTENTION: 'kotlin.experimental.tryK2' is an experimental option enabled in the project for trying out the new Kotlin K2 compiler only.
Please refrain from using it in production code and provide feedback to the Kotlin team for any issues encountered via https://kotl.in/issue
""".trimIndent()
)
}
} }
@@ -11,8 +11,6 @@ import org.gradle.api.provider.Provider
import org.gradle.api.services.BuildService import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters import org.gradle.api.services.BuildServiceParameters
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.ERROR
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.WARNING
import org.jetbrains.kotlin.gradle.utils.registerClassLoaderScopedBuildService import org.jetbrains.kotlin.gradle.utils.registerClassLoaderScopedBuildService
import java.util.* import java.util.*
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
@@ -33,14 +31,8 @@ internal abstract class KotlinToolingDiagnosticsCollector : BuildService<BuildSe
fun getDiagnosticsForProject(project: Project): Collection<ToolingDiagnostic> { fun getDiagnosticsForProject(project: Project): Collection<ToolingDiagnostic> {
val rawDiagnostics = rawDiagnosticsFromProject[project.path] ?: return emptyList() val rawDiagnostics = rawDiagnosticsFromProject[project.path] ?: return emptyList()
val options = ToolingDiagnosticRenderingOptions.forProject(project)
val suppressedWarnings = project.kotlinPropertiesProvider.suppressedGradlePluginWarnings.toSet() return rawDiagnostics.withoutSuppressed(options)
val suppressedErrors = project.kotlinPropertiesProvider.suppressedGradlePluginErrors.toSet()
fun ToolingDiagnostic.isSuppressed(): Boolean =
severity == WARNING && id in suppressedWarnings || severity == ERROR && id in suppressedErrors
return rawDiagnostics.filter { !it.isSuppressed() }
} }
fun report(project: Project, diagnostic: ToolingDiagnostic) { fun report(project: Project, diagnostic: ToolingDiagnostic) {
@@ -48,7 +40,10 @@ internal abstract class KotlinToolingDiagnosticsCollector : BuildService<BuildSe
} }
fun report(task: UsesKotlinToolingDiagnostics, diagnostic: ToolingDiagnostic) { fun report(task: UsesKotlinToolingDiagnostics, diagnostic: ToolingDiagnostic) {
renderReportedDiagnostic(diagnostic, task.logger, isVerbose = false) // TODO: wire suppression/verbosity val options = task.diagnosticRenderingOptions.get()
if (!diagnostic.isSuppressed(options)) {
renderReportedDiagnostic(diagnostic, task.logger, options.isVerbose)
}
} }
fun reportOncePerGradleProject(fromProject: Project, diagnostic: ToolingDiagnostic, key: ToolingDiagnosticId = diagnostic.id) { fun reportOncePerGradleProject(fromProject: Project, diagnostic: ToolingDiagnostic, key: ToolingDiagnosticId = diagnostic.id) {
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectCheckerContext
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector
internal object ExperimentalK2UsageChecker : KotlinGradleProjectChecker {
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
if (project.kotlinPropertiesProvider.kotlinExperimentalTryK2.get()) {
collector.reportOncePerGradleBuild(project, KotlinToolingDiagnostics.ExperimentalK2Warning())
}
}
}
@@ -26,15 +26,3 @@ internal fun <T : KotlinCommonCompilerOptions> T.configureExperimentalTryK2(
} }
) )
} }
internal fun Project.warnExperimentalTryK2IsEnabled() {
if (project.kotlinPropertiesProvider.kotlinExperimentalTryK2.get()) {
SingleWarningPerBuild.show(this, EXPERIMENTAL_TRY_K2_WARNING_MESSAGE)
}
}
val EXPERIMENTAL_TRY_K2_WARNING_MESSAGE =
"""
ATTENTION: 'kotlin.experimental.tryK2' is an experimental option enabled in the project for trying out the new Kotlin K2 compiler only.
Please refrain from using it in production code and provide feedback to the Kotlin team for any issues encountered via https://kotl.in/issue
""".trimIndent()