From 11d408f71e22406849a1c8c80384823753a2d9c0 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 16 Feb 2022 08:41:46 +0100 Subject: [PATCH] [KPM] Implement IdeaKotlinVariant KT-51262 KT-51220 --- .../kotlin-gradle-plugin-idea.txt | 12 ++++- .../kpm/idea/IdeaKotlinCompilationOutput.kt | 20 ++++++++ .../gradle/kpm/idea/IdeaKotlinModule.kt | 6 +-- .../gradle/kpm/idea/IdeaKotlinVariant.kt | 20 ++++++++ .../IdeaKotlinCompilationOutputBuilder.kt | 15 ++++++ .../kpm/idea/IdeaKotlinFragmentBuilder.kt | 48 +++++++++++++------ 6 files changed, 103 insertions(+), 18 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutput.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinVariant.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutputBuilder.kt diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea.txt index 76a0d6193e1..b6acfe7d6b6 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea.txt @@ -50,6 +50,11 @@ public abstract class org/jetbrains/kotlin/gradle/kpm/KotlinMutableExternalModel public abstract fun set (Lorg/jetbrains/kotlin/gradle/kpm/KotlinExternalModelKey;Ljava/lang/Object;)V } +public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutput : java/io/Serializable { + public abstract fun getClassesDirs ()Ljava/util/Set; + public abstract fun getResourcesDir ()Ljava/io/File; +} + public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragment : java/io/Serializable { public abstract fun getDependencies ()Ljava/util/Collection; public abstract fun getDirectRefinesDependencies ()Ljava/util/Collection; @@ -85,7 +90,7 @@ public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinM } public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModule : java/io/Serializable { - public abstract fun getFragments ()Ljava/util/Collection; + public abstract fun getFragments ()Ljava/util/List; public abstract fun getModuleIdentifier ()Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModuleIdentifier; } @@ -109,6 +114,11 @@ public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinS public abstract fun getFile ()Ljava/io/File; } +public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinVariant : java/io/Serializable, org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragment { + public abstract fun getCompilationOutputs ()Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutput; + public abstract fun getVariantAttributes ()Ljava/util/Map; +} + public abstract interface annotation class org/jetbrains/kotlin/gradle/kpm/idea/InternalKotlinGradlePluginApi : java/lang/annotation/Annotation { } diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutput.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutput.kt new file mode 100644 index 00000000000..51ba1c5b8b2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutput.kt @@ -0,0 +1,20 @@ +/* + * 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.kpm.idea + +import java.io.File +import java.io.Serializable + +interface IdeaKotlinCompilationOutput : Serializable { + val classesDirs: Set + val resourcesDir: File? +} + +@InternalKotlinGradlePluginApi +data class IdeaKotlinCompilationOutputImpl( + override val classesDirs: Set, + override val resourcesDir: File? +) : IdeaKotlinCompilationOutput diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModule.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModule.kt index e7556ebaf08..64b8fcb7cca 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModule.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModule.kt @@ -9,13 +9,13 @@ import java.io.Serializable interface IdeaKotlinModule : Serializable { val moduleIdentifier: IdeaKotlinModuleIdentifier - val fragments: Collection -} + val fragments: List +} @InternalKotlinGradlePluginApi data class IdeaKotlinModuleImpl( override val moduleIdentifier: IdeaKotlinModuleIdentifier, - override val fragments: Collection + override val fragments: List ) : IdeaKotlinModule { @InternalKotlinGradlePluginApi diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinVariant.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinVariant.kt new file mode 100644 index 00000000000..1de70b49cc1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinVariant.kt @@ -0,0 +1,20 @@ +/* + * 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.kpm.idea + +import java.io.Serializable + +interface IdeaKotlinVariant : IdeaKotlinFragment, Serializable { + val variantAttributes: Map + val compilationOutputs: IdeaKotlinCompilationOutput +} + +@InternalKotlinGradlePluginApi +data class IdeaKotlinVariantImpl( + internal val fragment: IdeaKotlinFragment, + override val variantAttributes: Map, + override val compilationOutputs: IdeaKotlinCompilationOutput, +) : IdeaKotlinVariant, IdeaKotlinFragment by fragment diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutputBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutputBuilder.kt new file mode 100644 index 00000000000..4968b17e239 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinCompilationOutputBuilder.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.kpm.idea + +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput + +internal fun KotlinCompilationOutput.toIdeaKotlinCompilationOutputs(): IdeaKotlinCompilationOutput { + return IdeaKotlinCompilationOutputImpl( + classesDirs = this.classesDirs.toSet(), + resourcesDir = this.resourcesDir + ) +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragmentBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragmentBuilder.kt index 65109b679d2..ca4fb37eb0b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragmentBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragmentBuilder.kt @@ -8,23 +8,43 @@ package org.jetbrains.kotlin.gradle.kpm.idea import org.jetbrains.kotlin.gradle.kpm.KotlinExternalModelContainer import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentInternal +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleVariant + +private typealias FragmentInterner = MutableMap internal fun KotlinGradleFragment.toIdeaKotlinFragment( - cache: MutableMap = mutableMapOf() + cache: FragmentInterner = mutableMapOf() ): IdeaKotlinFragment { return cache.getOrPut(this) { - IdeaKotlinFragmentImpl( - name = name, - languageSettings = languageSettings.toIdeaKotlinLanguageSettings(), - dependencies = emptyList(), - directRefinesDependencies = directRefinesDependencies.map { refinesFragment -> - refinesFragment.toIdeaKotlinFragment(cache) - }, - sourceDirectories = kotlinSourceRoots.sourceDirectories.files.toList().map { file -> - IdeaKotlinSourceDirectoryImpl(file) - }, - resourceDirectories = emptyList(), - external = (this as? KotlinGradleFragmentInternal)?.external ?: KotlinExternalModelContainer.Empty - ) + if (this is KotlinGradleVariant) buildIdeaKotlinVariant(cache) + else buildIdeaKotlinFragment(cache) } } + +internal fun KotlinGradleVariant.toIdeaKotlinVariant( + cache: FragmentInterner = mutableMapOf() +): IdeaKotlinVariant = toIdeaKotlinVariant(cache) as IdeaKotlinVariant + +private fun KotlinGradleFragment.buildIdeaKotlinFragment(cache: FragmentInterner): IdeaKotlinFragment { + return IdeaKotlinFragmentImpl( + name = name, + languageSettings = languageSettings.toIdeaKotlinLanguageSettings(), + dependencies = emptyList(), + directRefinesDependencies = directRefinesDependencies.map { refinesFragment -> + refinesFragment.toIdeaKotlinFragment(cache) + }, + sourceDirectories = kotlinSourceRoots.sourceDirectories.files.toList().map { file -> + IdeaKotlinSourceDirectoryImpl(file) + }, + resourceDirectories = emptyList(), + external = (this as? KotlinGradleFragmentInternal)?.external ?: KotlinExternalModelContainer.Empty + ) +} + +private fun KotlinGradleVariant.buildIdeaKotlinVariant(cache: FragmentInterner): IdeaKotlinVariant { + return IdeaKotlinVariantImpl( + fragment = buildIdeaKotlinFragment(cache), + variantAttributes = variantAttributes.mapKeys { (key, _) -> key.uniqueName }, + compilationOutputs = compilationOutputs.toIdeaKotlinCompilationOutputs() + ) +}