[Gradle] Introduce InternalKotlinTarget

KT-54981
This commit is contained in:
Sebastian Sellmair
2022-11-16 12:00:14 +01:00
committed by Space Team
parent e5398e6be7
commit c33b172988
6 changed files with 45 additions and 11 deletions
@@ -30,7 +30,7 @@ internal const val PRIMARY_SINGLE_COMPONENT_NAME = "kotlin"
abstract class AbstractKotlinTarget(
final override val project: Project
) : KotlinTarget {
) : InternalKotlinTarget {
private val attributeContainer = HierarchyAttributeContainer(parent = null)
override fun getAttributes(): AttributeContainer = attributeContainer
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2022 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.mpp
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
internal interface InternalKotlinTarget : KotlinTarget
internal val KotlinTarget.internal: InternalKotlinTarget
get() = (this as? InternalKotlinTarget) ?: throw IllegalArgumentException(
"KotlinTarget($name) ${this::class} does not implement ${InternalKotlinTarget::class}"
)
@@ -9,12 +9,12 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.gradle.ExternalKotlinTargetApi
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.InternalKotlinTarget
@ExternalKotlinTargetApi
abstract class DecoratedExternalKotlinTarget internal constructor(
internal val delegate: ExternalKotlinTargetImpl
) : KotlinTarget by delegate {
) : InternalKotlinTarget by delegate {
constructor(delegate: Delegate) : this(delegate.impl)
class Delegate internal constructor(internal val impl: ExternalKotlinTargetImpl)
@@ -16,8 +16,8 @@ import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetComponent
import org.jetbrains.kotlin.gradle.plugin.mpp.InternalKotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.buildAdhocComponentsFromKotlinVariants
internal class ExternalKotlinTargetImpl internal constructor(
@@ -30,7 +30,7 @@ internal class ExternalKotlinTargetImpl internal constructor(
override val publishable: Boolean,
internal val kotlinComponents: Set<KotlinTargetComponent>,
private val artifactsTaskLocator: ArtifactsTaskLocator,
) : KotlinTarget {
) : InternalKotlinTarget {
fun interface ArtifactsTaskLocator {
fun locate(target: ExternalKotlinTargetImpl): TaskProvider<out Task>
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2022 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.
*/
@file:Suppress("FunctionName")
package org.jetbrains.kotlin.gradle
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.InternalKotlinTarget
import kotlin.test.Test
class InternalKotlinTargetTest {
@Test
fun `test - all implementations of KotlinTarget - implement InternalKotlinTarget`() {
assertAllImplementationsAlsoImplement(KotlinTarget::class, InternalKotlinTarget::class)
}
}
@@ -16,11 +16,11 @@ fun assertAllImplementationsAlsoImplement(
baseInterface: KClass<*>,
requiredInterface: KClass<*>
) {
reflections.getSubTypesOf(baseInterface.java)
val badImplementations = reflections.getSubTypesOf(baseInterface.java)
.filter { subtype -> !subtype.isInterface }
.forEach { implementation ->
if (!implementation.kotlin.isSubclassOf(requiredInterface)) {
fail("${implementation.kotlin} does not implement $requiredInterface")
}
}
.filter { implementation -> !implementation.kotlin.isSubclassOf(requiredInterface) }
if (badImplementations.isNotEmpty()) {
fail("${badImplementations.map { it.kotlin }} does not implement $requiredInterface")
}
}