diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt index af6596f9402..aac7bb51496 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt @@ -9,6 +9,7 @@ import org.gradle.api.Project import org.jetbrains.kotlin.gradle.DeprecatedTargetPresetApi import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.targets.android.internal.InternalKotlinTargetPreset +import org.jetbrains.kotlin.gradle.targets.runKotlinTargetSideEffects @DeprecatedTargetPresetApi abstract class KotlinOnlyTargetPreset, T : KotlinCompilation<*>>( @@ -42,7 +43,7 @@ abstract class KotlinOnlyTargetPreset, T : KotlinCompila } createKotlinTargetConfigurator().configureTarget(result) - + result.runKotlinTargetSideEffects() return result } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/KotlinTargetSideEffect.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/KotlinTargetSideEffect.kt new file mode 100644 index 00000000000..f2b233dbbb6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/KotlinTargetSideEffect.kt @@ -0,0 +1,44 @@ +/* + * 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.targets + +import org.jetbrains.kotlin.gradle.plugin.KotlinGradlePluginExtensionPoint +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget + +/** + * Will be invoked once a new [KotlinTarget] was created. + * See [registerKotlinPluginExtensions] to register an effect. + * + * ### Example + * ```kotlin + * internal val KotlinNativeTargetLoggingSideEffect = KotlinTargetSideEffect { + * project.logger.debug(konanTarget.name) + * } + * ``` + * + * Will print the name of a konanTarget once a new KotlinNativeTarget was created + */ +internal fun interface KotlinTargetSideEffect { + operator fun invoke(target: KotlinTarget) + + companion object { + val extensionPoint = KotlinGradlePluginExtensionPoint() + } +} + +/** + * see [KotlinTargetSideEffect] + */ +internal inline fun KotlinTargetSideEffect(crossinline effect: (T) -> Unit) = KotlinTargetSideEffect { target -> + if (target is T) effect(target) +} + + +internal fun KotlinTarget.runKotlinTargetSideEffects() { + KotlinTargetSideEffect.extensionPoint[project].forEach { effect -> + effect(this) + } +}