diff --git a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api index 0d51607098d..36ef3792ee1 100644 --- a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api +++ b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api @@ -278,8 +278,10 @@ public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatf public abstract fun languageSettings (Lorg/gradle/api/NamedDomainObjectProvider;Lkotlin/jvm/functions/Function1;)V } -public class org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension : org/jetbrains/kotlin/gradle/dsl/KotlinTopLevelExtension, org/jetbrains/kotlin/gradle/plugin/KotlinSourceSetContainer { +public class org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension : org/jetbrains/kotlin/gradle/dsl/KotlinTopLevelExtension, org/jetbrains/kotlin/gradle/plugin/KotlinSourceSetContainer, org/jetbrains/kotlin/tooling/core/HasMutableExtras { public fun (Lorg/gradle/api/Project;)V + public synthetic fun getExtras ()Lorg/jetbrains/kotlin/tooling/core/Extras; + public final fun getExtras ()Lorg/jetbrains/kotlin/tooling/core/MutableExtras; public fun getSourceSets ()Lorg/gradle/api/NamedDomainObjectContainer; } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt index b822494e871..6dd7adeb84e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt @@ -26,6 +26,9 @@ import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.utils.castIsolatedKotlinPluginClassLoaderAware import org.jetbrains.kotlin.gradle.utils.configureExperimentalTryK2 import org.jetbrains.kotlin.konan.target.CompilerOutputKind +import org.jetbrains.kotlin.tooling.core.HasMutableExtras +import org.jetbrains.kotlin.tooling.core.MutableExtras +import org.jetbrains.kotlin.tooling.core.mutableExtrasOf import javax.inject.Inject import kotlin.reflect.KClass @@ -159,7 +162,9 @@ internal fun KotlinTopLevelExtension.explicitApiModeAsCompilerArg(): String? { } @KotlinGradlePluginDsl -open class KotlinProjectExtension @Inject constructor(project: Project) : KotlinTopLevelExtension(project), KotlinSourceSetContainer { +open class KotlinProjectExtension @Inject constructor(project: Project) : KotlinTopLevelExtension(project), KotlinSourceSetContainer, HasMutableExtras { + final override val extras: MutableExtras = mutableExtrasOf() + override var sourceSets: NamedDomainObjectContainer @Suppress("UNCHECKED_CAST") get() = DslObject(this).extensions.getByName("sourceSets") as NamedDomainObjectContainer diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginLifecycle.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginLifecycle.kt index d961ee66918..c5ce68bfd86 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginLifecycle.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginLifecycle.kt @@ -9,7 +9,7 @@ import org.gradle.api.Project import org.gradle.api.provider.Property import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.* import org.jetbrains.kotlin.gradle.utils.Future -import org.jetbrains.kotlin.gradle.utils.getOrPut +import org.jetbrains.kotlin.gradle.utils.projectStoredProperty import kotlin.coroutines.* /* @@ -106,10 +106,9 @@ internal fun Project.launchInRequiredStage(stage: Stage, block: suspend KotlinPl * Universal way of retrieving the current lifecycle * Also: See [currentKotlinPluginLifecycle] */ -internal val Project.kotlinPluginLifecycle: KotlinPluginLifecycle - get() = extraProperties.getOrPut(KotlinPluginLifecycle::class.java.name) { - KotlinPluginLifecycleImpl(project) - } +internal val Project.kotlinPluginLifecycle: KotlinPluginLifecycle by projectStoredProperty { + KotlinPluginLifecycleImpl(project) +} /** * Future that will be completed once the project is considered 'Configured' diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index b9782598009..546c62a1cfe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -413,11 +413,9 @@ fun getKotlinPluginVersion(logger: Logger): String { return kotlinPluginVersionFromResources.value } -val Project.kotlinToolingVersion: KotlinToolingVersion - get() = extensions.extraProperties.getOrPut("kotlinToolingVersion") { - KotlinToolingVersion(getKotlinPluginVersion()) - } - +val Project.kotlinToolingVersion: KotlinToolingVersion by projectStoredProperty { + KotlinToolingVersion(getKotlinPluginVersion()) +} private fun loadKotlinPluginVersionFromResourcesOf(any: Any) = any.loadPropertyFromResources("project.properties", "project.version") diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index 15c7c90615d..a6c050b5a01 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -57,7 +57,6 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader import org.jetbrains.kotlin.gradle.utils.loadProperty import org.jetbrains.kotlin.gradle.utils.localProperties -import org.jetbrains.kotlin.gradle.utils.storedProjectProperty import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.presetName import org.jetbrains.kotlin.statistics.metrics.StringMetrics diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeCompilerArgumentsResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeCompilerArgumentsResolver.kt index d170da37748..54b45dd5ac1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeCompilerArgumentsResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeCompilerArgumentsResolver.kt @@ -8,9 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.ide import org.gradle.api.Project import org.gradle.api.logging.Logger import org.gradle.api.logging.Logging -import org.jetbrains.kotlin.gradle.dsl.kotlinExtension -import org.jetbrains.kotlin.gradle.plugin.extraProperties -import org.jetbrains.kotlin.gradle.utils.getOrPut +import org.jetbrains.kotlin.gradle.utils.projectStoredProperty interface IdeCompilerArgumentsResolver { fun resolveCompilerArguments(any: Any): List? @@ -20,12 +18,11 @@ interface IdeCompilerArgumentsResolver { @JvmStatic fun instance(project: Project): IdeCompilerArgumentsResolver { - return project.extraProperties.getOrPut(IdeCompilerArgumentsResolver::class.java.name) { - IdeCompilerArgumentsResolverImpl() - } + return project.kotlinIdeCompilerArgumentsResolver } } } -internal val Project.kotlinIdeCompilerArgumentsResolver: IdeCompilerArgumentsResolver get() = IdeCompilerArgumentsResolver.instance(project) - +internal val Project.kotlinIdeCompilerArgumentsResolver: IdeCompilerArgumentsResolver by projectStoredProperty { + IdeCompilerArgumentsResolverImpl() +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt index 7a5292e051f..6609668ef62 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt @@ -19,14 +19,13 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.* import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget -import org.jetbrains.kotlin.gradle.plugin.extraProperties import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImport.SourceSetConstraint import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.targets.metadata.isNativeSourceSet import org.jetbrains.kotlin.gradle.targets.metadata.isSingleKotlinTargetSourceSet import org.jetbrains.kotlin.gradle.targets.metadata.isSinglePlatformTypeSourceSet -import org.jetbrains.kotlin.gradle.utils.getOrPut +import org.jetbrains.kotlin.gradle.utils.projectStoredProperty import org.jetbrains.kotlin.tooling.core.Extras import org.jetbrains.kotlin.tooling.core.HasMutableExtras @@ -317,14 +316,14 @@ interface IdeMultiplatformImport { @JvmStatic fun instance(project: Project): IdeMultiplatformImport { - return project.extraProperties.getOrPut(IdeMultiplatformImport::class.java.name) { - IdeMultiplatformImport(project.kotlinExtension) - } + return project.kotlinIdeMultiplatformImport } } } -internal val Project.kotlinIdeMultiplatformImport: IdeMultiplatformImport get() = IdeMultiplatformImport.instance(project) +internal val Project.kotlinIdeMultiplatformImport: IdeMultiplatformImport by projectStoredProperty { + IdeMultiplatformImport(project.kotlinExtension) +} /** * Convenience shortcut method for diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportStatistics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportStatistics.kt index 9551f637260..00878b150a9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportStatistics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportStatistics.kt @@ -6,13 +6,12 @@ package org.jetbrains.kotlin.gradle.plugin.ide import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.utils.getOrPut +import org.jetbrains.kotlin.gradle.utils.projectStoredProperty -internal val Project.kotlinIdeMultiplatformImportStatistics: IdeMultiplatformImportStatistics - get() = extensions.extraProperties.getOrPut(IdeMultiplatformImportStatistics::class.java.name) { - IdeMultiplatformImportStatistics() - } +internal val Project.kotlinIdeMultiplatformImportStatistics: IdeMultiplatformImportStatistics by projectStoredProperty { + IdeMultiplatformImportStatistics() +} /** * Simple implementation to track dependency resolution bottlenecks. diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt index 7ad0507a897..d6de3d57018 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt @@ -75,6 +75,7 @@ internal sealed class MetadataDependencyResolution( abstract class ProjectMetadataProvider : MetadataProvider() { enum class MetadataConsumer { Ide, Cli } + abstract fun getSourceSetCompiledMetadata(sourceSetName: String): FileCollection? } } @@ -317,12 +318,9 @@ internal class GranularMetadataTransformation( } -private val Project.allProjectsData: Map - get() = rootProject - .extraProperties - .getOrPut("all${GranularMetadataTransformation.ProjectData::class.java.simpleName}") { - collectAllProjectsData() - } +private val Project.allProjectsData: Map by projectStoredProperty { + collectAllProjectsData() +} private fun Project.collectAllProjectsData(): Map { return rootProject.allprojects.associateBy { it.path }.mapValues { (path, currentProject) -> 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 index 30567eb40fd..6669083da1b 100644 --- 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 @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinTargetComponent import org.jetbrains.kotlin.gradle.plugin.await import org.jetbrains.kotlin.gradle.plugin.mpp.external.DecoratedExternalKotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalKotlinTargetImpl -import org.jetbrains.kotlin.gradle.utils.futureExtension +import org.jetbrains.kotlin.gradle.utils.extrasStoredFuture import org.jetbrains.kotlin.tooling.core.HasMutableExtras internal interface InternalKotlinTarget : KotlinTarget, HasMutableExtras { @@ -39,7 +39,7 @@ internal val InternalKotlinTarget.compilerOptions: KotlinCommonCompilerOptions else -> throw IllegalStateException("Unexpected 'KotlinTarget' type: ${this.javaClass}") } -internal val InternalKotlinTarget.isSourcesPublishableFuture by futureExtension("isSourcesPublishableFuture") { +internal val InternalKotlinTarget.isSourcesPublishableFuture by extrasStoredFuture { KotlinPluginLifecycle.Stage.AfterFinaliseDsl.await() isSourcesPublishable } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt index 94076d99604..0a573b7b8e7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt @@ -15,17 +15,17 @@ import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.utils.currentBuildId import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope import org.jetbrains.kotlin.gradle.targets.metadata.dependsOnClosureWithInterCompilationDependencies import org.jetbrains.kotlin.gradle.targets.metadata.getPublishedPlatformCompilations import org.jetbrains.kotlin.gradle.targets.metadata.isNativeSourceSet import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerCompositeMetadataJarBundling.cinteropMetadataDirectoryPath +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.buildPathCompat import org.jetbrains.kotlin.gradle.utils.compositeBuildRootProject +import org.jetbrains.kotlin.gradle.utils.currentBuildId import org.jetbrains.kotlin.gradle.utils.future -import org.jetbrains.kotlin.gradle.utils.getOrPut import org.w3c.dom.Document import org.w3c.dom.Element import org.w3c.dom.Node @@ -153,11 +153,9 @@ data class KotlinProjectStructureMetadata( } } - -internal val KotlinMultiplatformExtension.kotlinProjectStructureMetadata: KotlinProjectStructureMetadata - get() = project.extensions.extraProperties.getOrPut("org.jetbrains.kotlin.gradle.plugin.mpp.kotlinProjectStructureMetadata") { - buildKotlinProjectStructureMetadata(this) - } +internal val KotlinMultiplatformExtension.kotlinProjectStructureMetadata: KotlinProjectStructureMetadata by extrasStoredProperty { + buildKotlinProjectStructureMetadata(this) +} /** * Return the name of the variant, taking into account that external targets might pass `.*-published` whereas diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt index 6f79fb05e80..38d1664a1f1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt @@ -10,11 +10,10 @@ import org.gradle.api.artifacts.result.ResolvedDependencyResult import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.extraProperties import org.jetbrains.kotlin.gradle.plugin.mpp.SourceSetVisibilityProvider.PlatformCompilationData import org.jetbrains.kotlin.gradle.utils.LazyResolvedConfiguration import org.jetbrains.kotlin.gradle.utils.dependencyArtifactsOrNull -import org.jetbrains.kotlin.gradle.utils.getOrPut +import org.jetbrains.kotlin.gradle.utils.projectStoredProperty import java.io.File private typealias KotlinSourceSetName = String @@ -29,12 +28,12 @@ internal data class SourceSetVisibilityResult( * For some of the [visibleSourceSetNames], additional artifacts may be present that * the consumer should read the compiled source set metadata from. */ - val hostSpecificMetadataArtifactBySourceSet: Map + val hostSpecificMetadataArtifactBySourceSet: Map, ) -private val Project.allPlatformCompilationData: List - get() = extraProperties - .getOrPut("all${PlatformCompilationData::class.java.simpleName}") { collectAllPlatformCompilationData() } +private val Project.allPlatformCompilationData: List by projectStoredProperty { + collectAllPlatformCompilationData() +} private fun Project.collectAllPlatformCompilationData(): List { val multiplatformExtension = multiplatformExtensionOrNull ?: return emptyList() @@ -63,7 +62,7 @@ internal class SourceSetVisibilityProvider( class PlatformCompilationData( val allSourceSets: Set, val resolvedDependenciesConfiguration: LazyResolvedConfiguration, - val hostSpecificMetadataConfiguration: LazyResolvedConfiguration? + val hostSpecificMetadataConfiguration: LazyResolvedConfiguration?, ) /** @@ -82,7 +81,7 @@ internal class SourceSetVisibilityProvider( visibleFromSourceSet: KotlinSourceSetName, resolvedRootMppDependency: ResolvedDependencyResult, dependencyProjectStructureMetadata: KotlinProjectStructureMetadata, - resolvedToOtherProject: Boolean + resolvedToOtherProject: Boolean, ): SourceSetVisibilityResult { val resolvedRootMppDependencyId = resolvedRootMppDependency.selected.id diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationAssociator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationAssociator.kt index 65fab8a5927..42a30462dcb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationAssociator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationAssociator.kt @@ -7,16 +7,14 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl import org.gradle.api.Project import org.gradle.api.artifacts.Dependency -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.SourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.jvm import org.jetbrains.kotlin.gradle.plugin.KotlinTarget -import org.jetbrains.kotlin.gradle.plugin.launch -import org.jetbrains.kotlin.gradle.plugin.mpp.* +import org.jetbrains.kotlin.gradle.plugin.mpp.InternalKotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.isMain +import org.jetbrains.kotlin.gradle.plugin.mpp.isTest import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget -import org.jetbrains.kotlin.gradle.utils.Future import org.jetbrains.kotlin.gradle.utils.filesProvider -import org.jetbrains.kotlin.gradle.utils.future import org.jetbrains.kotlin.gradle.utils.listProperty diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationSourceSetInclusion.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationSourceSetInclusion.kt index 203d1e8983f..a8a9f3d63bf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationSourceSetInclusion.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationSourceSetInclusion.kt @@ -19,12 +19,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.addSourcesToKotlinCompileTask import org.jetbrains.kotlin.gradle.plugin.sources.defaultSourceSetLanguageSettingsChecker import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation +import org.jetbrains.kotlin.gradle.utils.extrasStoredProperty import org.jetbrains.kotlin.gradle.utils.whenKaptEnabled -import org.jetbrains.kotlin.tooling.core.extrasFactoryProperty import java.util.concurrent.Callable internal class KotlinCompilationSourceSetInclusion( - private val addSourcesToCompileTask: AddSourcesToCompileTask = DefaultAddSourcesToCompileTask + private val addSourcesToCompileTask: AddSourcesToCompileTask = DefaultAddSourcesToCompileTask, ) { fun include(compilation: InternalKotlinCompilation<*>, sourceSet: KotlinSourceSet) { @@ -81,7 +81,7 @@ internal class KotlinCompilationSourceSetInclusion( * to avoid re-processing of unnecessary source sets! */ val InternalKotlinCompilation<*>.includedSourceSets: MutableSet - by extrasFactoryProperty(KotlinCompilationSourceSetInclusion::class.java.name, { hashSetOf() }) + by extrasStoredProperty { hashSetOf() } } @@ -91,7 +91,7 @@ internal class KotlinCompilationSourceSetInclusion( object DefaultAddSourcesToCompileTask : AddSourcesToCompileTask { override fun addSources( - compilation: KotlinCompilation<*>, sourceSet: KotlinSourceSet, addAsCommonSources: Lazy + compilation: KotlinCompilation<*>, sourceSet: KotlinSourceSet, addAsCommonSources: Lazy, ) { addSourcesToKotlinCompileTask( project = compilation.project, @@ -137,7 +137,7 @@ internal class KotlinCompilationSourceSetInclusion( * and compiles them together. */ class AddSourcesWithoutDependsOnClosure( - private val delegate: AddSourcesToCompileTask = DefaultAddSourcesToCompileTask + private val delegate: AddSourcesToCompileTask = DefaultAddSourcesToCompileTask, ) : AddSourcesToCompileTask { override fun addSources(compilation: KotlinCompilation<*>, sourceSet: KotlinSourceSet, addAsCommonSources: Lazy) { if (sourceSet !in compilation.kotlinSourceSets) return diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetMetadataTransformation.kt index 97cb768ebdd..a188c3fa30f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetMetadataTransformation.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.targets.metadata.dependsOnClosureWithInterCompilationDependencies import org.jetbrains.kotlin.gradle.utils.contains import org.jetbrains.kotlin.gradle.utils.currentBuild -import org.jetbrains.kotlin.tooling.core.extrasNullableLazyProperty +import org.jetbrains.kotlin.gradle.utils.extrasStoredProperty /** * Returns [GranularMetadataTransformation] for all requested compile dependencies @@ -21,9 +21,9 @@ import org.jetbrains.kotlin.tooling.core.extrasNullableLazyProperty * Used only for IDE import (w/o KGP based dependency resolution). * Scheduled for removal after 1.9.20 */ -internal val InternalKotlinSourceSet.metadataTransformation: GranularMetadataTransformation? by extrasNullableLazyProperty lazy@{ +internal val InternalKotlinSourceSet.metadataTransformation: GranularMetadataTransformation? by extrasStoredProperty property@{ // Create only for source sets in multiplatform plugin - project.multiplatformExtensionOrNull ?: return@lazy null + project.multiplatformExtensionOrNull ?: return@property null val parentSourceSetVisibilityProvider = ParentSourceSetVisibilityProvider { componentIdentifier -> dependsOnClosureWithInterCompilationDependencies(this).filterIsInstance() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 4a3a516a4f9..1230da86f84 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -399,7 +399,7 @@ internal fun Project.createGenerateProjectStructureMetadataTask(): TaskProvider< task.description = "Generates serialized project structure metadata of the current project (for tooling)" } -internal val KotlinSourceSet.isNativeSourceSet: Future by futureExtension("isNativeSourceSet") { +internal val KotlinSourceSet.isNativeSourceSet: Future by extrasStoredFuture { val compilations = internal.awaitPlatformCompilations() compilations.isNotEmpty() && compilations.all { it.platformType == KotlinPlatformType.native } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerGroup.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerGroup.kt index 950611993f6..c94c509587e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerGroup.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerGroup.kt @@ -12,8 +12,8 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation import org.jetbrains.kotlin.gradle.utils.Future import org.jetbrains.kotlin.gradle.utils.appendLine -import org.jetbrains.kotlin.gradle.utils.getOrPut import org.jetbrains.kotlin.gradle.utils.lazyFuture +import org.jetbrains.kotlin.gradle.utils.projectStoredProperty /** * Represents a group of cinterops and targets that can be passed to a single invocation to the commonizer. @@ -46,10 +46,9 @@ internal data class CInteropCommonizerGroup( /** * Represents all collected [CInteropCommonizerGroup] gruops for the given project */ -internal val Project.kotlinCInteropGroups: Future> - get() = extensions.extraProperties.getOrPut("org.jetbrains.kotlin.gradle.targets.native.internal.kotlinCInteropGroups") { - lazyFuture { collectCInteropGroups() } - } +internal val Project.kotlinCInteropGroups: Future> by projectStoredProperty { + lazyFuture { collectCInteropGroups() } +} private suspend fun Project.collectCInteropGroups(): Set { val dependents = allCinteropCommonizerDependents() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/commonizerTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/commonizerTarget.kt index 681f59fa4a8..dc1cf1f85cb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/commonizerTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/commonizerTarget.kt @@ -20,17 +20,17 @@ import org.jetbrains.kotlin.gradle.plugin.sources.awaitPlatformCompilations import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.utils.Future import org.jetbrains.kotlin.gradle.utils.future -import org.jetbrains.kotlin.gradle.utils.futureExtension +import org.jetbrains.kotlin.gradle.utils.extrasStoredFuture import org.jetbrains.kotlin.tooling.core.UnsafeApi -internal val KotlinSourceSet.commonizerTarget: Future by futureExtension { +internal val KotlinSourceSet.commonizerTarget: Future by extrasStoredFuture { inferCommonizerTarget(internal.awaitPlatformCompilations()) } internal val KotlinSourceSet.sharedCommonizerTarget: Future get() = project.future { commonizerTarget.await() as? SharedCommonizerTarget } -internal val KotlinCompilation<*>.commonizerTarget: Future by futureExtension { +internal val KotlinCompilation<*>.commonizerTarget: Future by extrasStoredFuture { KotlinPluginLifecycle.Stage.AfterFinaliseRefinesEdges.await() @OptIn(UnsafeApi::class) inferCommonizerTarget(this) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/CurrentBuildIdentifier.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/CurrentBuildIdentifier.kt index 63f0381924c..54fcd9bd859 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/CurrentBuildIdentifier.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/CurrentBuildIdentifier.kt @@ -11,13 +11,13 @@ import org.gradle.api.artifacts.component.ComponentIdentifier import org.gradle.api.artifacts.result.ResolvedComponentResult import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.build.BuildState -import org.jetbrains.kotlin.gradle.plugin.extraProperties internal fun Project.currentBuildId(): BuildIdentifier = (project as ProjectInternal).services.get(BuildState::class.java).buildIdentifier -internal val Project.currentBuild: CurrentBuildIdentifier - get() = extraProperties.getOrPut("org.jetbrains.kotlin.gradle.utils.currentBuild") { CurrentBuildIdentifierImpl(this.currentBuildId()) } +internal val Project.currentBuild: CurrentBuildIdentifier by projectStoredProperty { + CurrentBuildIdentifierImpl(this.currentBuildId()) +} /** * Utility that can be used to test if a certain project or [ComponentIdentifier] belongs diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/Future.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/Future.kt index d02e3220e57..771279340e5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/Future.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/Future.kt @@ -11,13 +11,12 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.CoroutineStart.Undispatched import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.IllegalLifecycleException import org.jetbrains.kotlin.gradle.plugin.kotlinPluginLifecycle -import org.jetbrains.kotlin.tooling.core.ExtrasLazyProperty import org.jetbrains.kotlin.tooling.core.HasMutableExtras -import org.jetbrains.kotlin.tooling.core.extrasLazyProperty import java.io.Serializable import kotlin.coroutines.Continuation import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine +import kotlin.properties.ReadOnlyProperty /** * See [KotlinPluginLifecycle]: @@ -67,12 +66,12 @@ internal fun CompletableFuture.complete() = complete(Unit) * Extend a given [Receiver] with data produced by [block]: * This uses the [HasMutableExtras] infrastructure to store/share the produced future entity to the given [Receiver] * Note: The [block] will be lazily launched on first access to this extension! - * @param name: The name of the extras key being used to store the future (see [extrasLazyProperty]) + * @see extrasStoredProperty */ -internal inline fun futureExtension( - name: String? = null, noinline block: suspend Receiver.() -> T, -): ExtrasLazyProperty> where Receiver : HasMutableExtras, Receiver : HasProject { - return extrasLazyProperty>(name) { +internal inline fun extrasStoredFuture( + noinline block: suspend Receiver.() -> T, +): ReadOnlyProperty> where Receiver : HasMutableExtras, Receiver : HasProject { + return extrasStoredProperty { project.future { block() } } } @@ -91,6 +90,7 @@ internal val Future.lenient: LenientFuture get() = LenientFutureImpl(t * ``` * * basically creating a future, which is launched lazily + * (on first call to on any of the returned Future's method) */ internal fun Project.lazyFuture(block: suspend Project.() -> T): Future = LazyFutureImpl(lazy { future { block() } })