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