[Gradle] Implement KotlinTargetSideEffect.extensionPoint

KT-61634
This commit is contained in:
Sebastian Sellmair
2023-10-18 15:22:52 +02:00
committed by Space Team
parent 1827df82c4
commit f89a46710a
2 changed files with 46 additions and 1 deletions
@@ -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<R : KotlinOnlyTarget<T>, T : KotlinCompilation<*>>(
@@ -42,7 +43,7 @@ abstract class KotlinOnlyTargetPreset<R : KotlinOnlyTarget<T>, T : KotlinCompila
}
createKotlinTargetConfigurator().configureTarget(result)
result.runKotlinTargetSideEffects()
return result
}
@@ -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<KotlinNativeTarget> {
* 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<KotlinTargetSideEffect>()
}
}
/**
* see [KotlinTargetSideEffect]
*/
internal inline fun <reified T : KotlinTarget> KotlinTargetSideEffect(crossinline effect: (T) -> Unit) = KotlinTargetSideEffect { target ->
if (target is T) effect(target)
}
internal fun KotlinTarget.runKotlinTargetSideEffects() {
KotlinTargetSideEffect.extensionPoint[project].forEach { effect ->
effect(this)
}
}