From c33b1729880b22ae2253abcf3d366b923b0638a0 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Wed, 16 Nov 2022 12:00:14 +0100 Subject: [PATCH] [Gradle] Introduce InternalKotlinTarget KT-54981 --- .../gradle/plugin/mpp/AbstractKotlinTarget.kt | 2 +- .../gradle/plugin/mpp/InternalKotlinTarget.kt | 15 +++++++++++++++ .../external/DecoratedExternalKotlinTarget.kt | 4 ++-- .../mpp/external/ExternalKotlinTargetImpl.kt | 4 ++-- .../kotlin/gradle/InternalKotlinTargetTest.kt | 19 +++++++++++++++++++ .../kotlin/gradle/reflectionUtils.kt | 12 ++++++------ 6 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/InternalKotlinTarget.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/InternalKotlinTargetTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinTarget.kt index bc148b93a2d..4f478290a8b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinTarget.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/InternalKotlinTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/InternalKotlinTarget.kt new file mode 100644 index 00000000000..ebdc24f89dc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/InternalKotlinTarget.kt @@ -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}" + ) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinTarget.kt index 70589e2482f..5e9e91453ac 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKotlinTarget.kt @@ -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) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetImpl.kt index d40916f94a5..1e28f25cae3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetImpl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetImpl.kt @@ -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, private val artifactsTaskLocator: ArtifactsTaskLocator, -) : KotlinTarget { +) : InternalKotlinTarget { fun interface ArtifactsTaskLocator { fun locate(target: ExternalKotlinTargetImpl): TaskProvider diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/InternalKotlinTargetTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/InternalKotlinTargetTest.kt new file mode 100644 index 00000000000..0125cbec221 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/InternalKotlinTargetTest.kt @@ -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) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/reflectionUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/reflectionUtils.kt index f516ab906f4..5677fa5b3f0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/reflectionUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/reflectionUtils.kt @@ -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") + } }