[KPM] Only provide access to KotlinExternalModelContainer through ExternalVariantApi

KT-51262
KT-51220
This commit is contained in:
sebastian.sellmair
2022-02-13 20:11:55 +01:00
committed by Space
parent f1655e5f4e
commit ee6957c9a0
11 changed files with 25 additions and 37 deletions
@@ -8,10 +8,6 @@ package org.jetbrains.kotlin.gradle.kpm
import org.jetbrains.kotlin.gradle.kpm.idea.InternalKotlinGradlePluginApi
import java.io.Serializable
interface KotlinHasExternalModel {
val external: KotlinExternalModelContainer
}
abstract class KotlinExternalModelContainer internal constructor() : Serializable {
abstract operator fun <T : Any> contains(key: KotlinExternalModelKey<T>): Boolean
abstract operator fun <T : Any> get(key: KotlinExternalModelKey<T>): T?
@@ -6,9 +6,9 @@ plugins {
dependencies {
implementation(gradleKotlinDsl())
compileOnly("com.android.tools.build:gradle:7.0.0")
compileOnly(project(":kotlin-gradle-plugin"))
compileOnly(project(":kotlin-gradle-plugin-idea"))
compileOnly("com.android.tools.build:gradle:7.0.0")
}
gradlePlugin {
@@ -8,12 +8,13 @@
package org.jetbrains.kotlin.gradle.android
import org.jetbrains.kotlin.gradle.kpm.KotlinExternalModelKey
import org.jetbrains.kotlin.gradle.kpm.KotlinExternalModelSerializer
import org.jetbrains.kotlin.gradle.kpm.idea.InternalKotlinGradlePluginApi
import java.io.File
import java.io.Serializable
internal val androidDslKey = KotlinExternalModelKey<AndroidDsl>()
internal val androidDslKey = KotlinExternalModelKey<AndroidDsl>(KotlinExternalModelSerializer.serializable())
class AndroidDsl : Serializable {
var compileSdk = 0
@@ -11,8 +11,8 @@ package org.jetbrains.kotlin.gradle.android
import com.android.build.gradle.AppExtension
import com.android.build.gradle.LibraryExtension
import org.gradle.kotlin.dsl.findByType
import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.plugin.mpp.external.project
import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.external.project
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
fun KotlinPm20ProjectExtension.android() {
@@ -15,8 +15,9 @@ import com.android.build.gradle.internal.publishing.AndroidArtifacts
import org.gradle.api.attributes.java.TargetJvmEnvironment
import org.gradle.api.attributes.java.TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE
import org.gradle.kotlin.dsl.named
import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.plugin.mpp.external.createExternalJvmVariant
import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.external.createExternalJvmVariant
import org.jetbrains.kotlin.gradle.kpm.external.external
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
fun KotlinGradleModule.createKotlinAndroidVariant(androidVariant: BaseVariant) {
@@ -29,7 +29,7 @@ pill {
kotlin.sourceSets.all {
languageSettings.optIn("kotlin.RequiresOptIn")
languageSettings.optIn("org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalVariantApi")
languageSettings.optIn("org.jetbrains.kotlin.gradle.plugin.mpp.external.AdvancedExternalVariantApi")
languageSettings.optIn("org.jetbrains.kotlin.gradle.plugin.mpp.pm20.AdvancedKotlinGradlePluginApi")
languageSettings.optIn("org.jetbrains.kotlin.gradle.kpm.idea.InternalKotlinGradlePluginApi")
}
@@ -37,6 +37,7 @@ dependencies {
compileOnly(gradleKotlinDsl())
api(project(":kotlin-gradle-plugin-api"))
api(project(":kotlin-gradle-plugin-model"))
implementation(project(":kotlin-gradle-plugin-idea"))
compileOnly(project(":compiler"))
compileOnly(project(":compiler:incremental-compilation-impl"))
compileOnly(project(":daemon-common"))
@@ -57,7 +58,6 @@ dependencies {
embedded(project(":kotlin-gradle-statistics"))
compileOnly(project(":kotlin-gradle-build-metrics"))
embedded(project(":kotlin-gradle-build-metrics"))
implementation(project(":kotlin-gradle-plugin-idea"))
implementation(commonDependency("com.google.code.gson:gson"))
implementation(commonDependency("com.google.guava:guava"))
@@ -3,19 +3,16 @@
* 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.external
package org.jetbrains.kotlin.gradle.kpm.external
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
import org.jetbrains.kotlin.gradle.kpm.KotlinMutableExternalModelContainer
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import kotlin.annotation.AnnotationTarget.*
@RequiresOptIn("API is intended to build external Kotlin Targets.")
annotation class ExternalVariantApi
@RequiresOptIn("API is intended to build external Kotlin Targets *and* is marked as advanced. Consultation with the Kotlin Team advised.")
annotation class AdvancedExternalVariantApi
@ExternalVariantApi
val KotlinTopLevelExtension.project: Project
get() = this.project
@@ -33,3 +30,7 @@ fun KotlinGradleModule.createExternalJvmVariant(
@ExternalVariantApi
val KotlinGradleVariantInternal.compilationData
get() = this.compilationData
@ExternalVariantApi
val KotlinGradleFragment.external: KotlinMutableExternalModelContainer
get() = (this as KotlinGradleFragmentInternal).external
@@ -6,8 +6,8 @@
package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.kpm.KotlinExternalModelContainer
import org.jetbrains.kotlin.gradle.kpm.KotlinHasExternalModel
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentInternal
internal fun KotlinGradleFragment.toIdeaKotlinFragment(
cache: MutableMap<KotlinGradleFragment, IdeaKotlinFragment> = mutableMapOf()
@@ -24,7 +24,7 @@ internal fun KotlinGradleFragment.toIdeaKotlinFragment(
IdeaKotlinSourceDirectoryImpl(file)
},
resourceDirectories = emptyList(),
external = (this as? KotlinHasExternalModel)?.external ?: KotlinExternalModelContainer.Empty
external = (this as? KotlinGradleFragmentInternal)?.external ?: KotlinExternalModelContainer.Empty
)
}
}
@@ -3,15 +3,7 @@
* 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.external
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import kotlin.reflect.KType
interface ExternalModelContainer {
}
interface MutableExternalModelContainer {
}
@RequiresOptIn("API is marked as advanced. Consultation with the Kotlin Team advised.")
annotation class AdvancedKotlinGradlePluginApi
@@ -13,7 +13,6 @@ import org.gradle.api.provider.Provider
import org.gradle.util.ConfigureUtil
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
import org.jetbrains.kotlin.gradle.kpm.KotlinExternalModelContainer
import org.jetbrains.kotlin.gradle.kpm.KotlinHasExternalModel
import org.jetbrains.kotlin.gradle.kpm.KotlinMutableExternalModelContainer
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder
@@ -35,8 +34,7 @@ open class KotlinGradleFragmentInternal @Inject constructor(
final override val fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations
) : KotlinGradleFragment,
KotlinFragmentDependencyConfigurations by dependencyConfigurations,
KotlinHasExternalModel {
KotlinFragmentDependencyConfigurations by dependencyConfigurations {
final override fun getName(): String = fragmentName
@@ -48,7 +46,7 @@ open class KotlinGradleFragmentInternal @Inject constructor(
// FIXME check for consistency
override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder()
override val external: KotlinMutableExternalModelContainer = KotlinExternalModelContainer.mutable()
internal val external: KotlinMutableExternalModelContainer = KotlinExternalModelContainer.mutable()
override fun refines(other: KotlinGradleFragment) {
checkCanRefine(other)
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.mpp.external.AdvancedExternalVariantApi
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation
/* Internal abbreviation */
@@ -18,7 +17,7 @@ data class KotlinGradleFragmentConfigurationDefinition<in T : KotlinGradleFragme
val attributes: KotlinGradleFragmentConfigurationAttributes<T> = KotlinGradleFragmentConfigurationAttributes.None,
val artifacts: KotlinGradleFragmentConfigurationArtifacts<T> = KotlinGradleFragmentConfigurationArtifacts.None,
val relations: KotlinGradleFragmentConfigurationRelation = KotlinGradleFragmentConfigurationRelation.None,
@property:AdvancedExternalVariantApi
@property:AdvancedKotlinGradlePluginApi
val capabilities: KotlinGradleFragmentConfigurationCapabilities<T> = KotlinGradleFragmentConfigurationCapabilities.None,
)
@@ -50,6 +49,6 @@ operator fun <T : KotlinGradleFragment> KotlinGradleFragmentConfigurationDefinit
operator fun <T : KotlinGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentConfigurationRelation):
KotlinGradleFragmentConfigurationDefinition<T> = copy(relations = relations + other)
@AdvancedExternalVariantApi
@AdvancedKotlinGradlePluginApi
operator fun <T : KotlinGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentCapabilities<T>):
KotlinGradleFragmentConfigurationDefinition<T> = copy(capabilities = capabilities + other)