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 4752ed64a86..7146e01f827 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 @@ -101,7 +101,6 @@ public final class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinDependencyKt { public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragment : java/io/Serializable { public abstract fun getDependencies ()Ljava/util/List; - public abstract fun getDirectRefinesDependencies ()Ljava/util/List; public abstract fun getExternal ()Lorg/jetbrains/kotlin/gradle/kpm/KotlinExternalModelContainer; public abstract fun getLanguageSettings ()Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinLanguageSettings; public abstract fun getModuleIdentifier ()Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModuleIdentifier; @@ -216,6 +215,16 @@ public final class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceCoordina public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency : org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinDependency { public abstract fun getCoordinates ()Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceCoordinates; + public abstract fun getType ()Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency$Type; +} + +public final class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency$Type : java/lang/Enum, java/io/Serializable { + public static final field Companion Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency$Type$Companion; + public static final field Friend Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency$Type; + public static final field Refines Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency$Type; + public static final field Regular Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency$Type; + public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency$Type; + public static fun values ()[Lorg/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependency$Type; } public abstract interface class org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDirectory : java/io/Serializable { diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinDependency.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinDependency.kt index e4b73e0457c..35b3ab4146a 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinDependency.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinDependency.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinDependency.Companion.DOCUM import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinDependency.Companion.SOURCES_BINARY_TYPE import java.io.File import java.io.Serializable +import java.util.* sealed interface IdeaKotlinDependency : Serializable { val coordinates: IdeaKotlinDependencyCoordinates? @@ -37,6 +38,16 @@ sealed interface IdeaKotlinSourceCoordinates : IdeaKotlinDependencyCoordinates { } sealed interface IdeaKotlinSourceDependency : IdeaKotlinDependency { + enum class Type : Serializable { + Regular, Friend, Refines; + + @InternalKotlinGradlePluginApi + companion object { + private const val serialVersionUID = 0L + } + } + + val type: Type override val coordinates: IdeaKotlinSourceCoordinates } @@ -67,12 +78,14 @@ val IdeaKotlinResolvedBinaryDependency.isClasspathType get() = binaryType == CLA @InternalKotlinGradlePluginApi data class IdeaKotlinSourceDependencyImpl( + override val type: IdeaKotlinSourceDependency.Type, override val coordinates: IdeaKotlinSourceCoordinates, - override val external: KotlinExternalModelContainer = KotlinExternalModelContainer.Empty + override val external: KotlinExternalModelContainer = KotlinExternalModelContainer.Empty, ) : IdeaKotlinSourceDependency { override fun toString(): String { - return "source: $coordinates" + @Suppress("DEPRECATION") + return "${type.name.toLowerCase(Locale.ROOT)}:$coordinates" } @InternalKotlinGradlePluginApi diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragment.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragment.kt index 9b2850c57b9..abf783285b5 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragment.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinFragment.kt @@ -14,7 +14,6 @@ interface IdeaKotlinFragment : Serializable { val platforms: Set val languageSettings: IdeaKotlinLanguageSettings? val dependencies: List - val directRefinesDependencies: List val sourceDirectories: List val resourceDirectories: List val external: KotlinExternalModelContainer @@ -27,7 +26,6 @@ data class IdeaKotlinFragmentImpl( override val platforms: Set, override val languageSettings: IdeaKotlinLanguageSettings?, override val dependencies: List, - override val directRefinesDependencies: List, override val sourceDirectories: List, override val resourceDirectories: List, override val external: KotlinExternalModelContainer diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/IdeaKotlinSourceDependencyMatcher.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/IdeaKotlinSourceDependencyMatcher.kt index 0a83858eb47..3b829d50400 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/IdeaKotlinSourceDependencyMatcher.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/IdeaKotlinSourceDependencyMatcher.kt @@ -1,7 +1,6 @@ package org.jetbrains.kotlin.gradle.kpm.idea.testFixtures import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinSourceDependency -import org.jetbrains.kotlin.gradle.kpm.idea.path fun buildIdeaKotlinSourceDependencyMatchers(notation: Any?): List { return when (notation) { @@ -14,19 +13,19 @@ fun buildIdeaKotlinSourceDependencyMatchers(notation: Any?): List { - class FragmentPath(private val path: String) : IdeaKotlinSourceDependencyMatcher { - override val description: String = path + class FragmentPath(private val dependency: String) : IdeaKotlinSourceDependencyMatcher { + override val description: String = dependency override fun matches(dependency: IdeaKotlinSourceDependency): Boolean { - return path == dependency.coordinates.path + return this.dependency == dependency.toString() } } - class FragmentPathRegex(private val pathRegex: Regex) : IdeaKotlinSourceDependencyMatcher { - override val description: String = pathRegex.pattern + class FragmentPathRegex(private val dependencyRegex: Regex) : IdeaKotlinSourceDependencyMatcher { + override val description: String = dependencyRegex.pattern override fun matches(dependency: IdeaKotlinSourceDependency): Boolean { - return pathRegex.matches(dependency.coordinates.path) + return dependencyRegex.matches(dependency.toString()) } } } diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/assertions.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/assertions.kt index b196cec45a4..74e0ef899e8 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/assertions.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/assertions.kt @@ -105,33 +105,30 @@ fun IdeaKotlinFragment.assertSourceDependencies(matchers: Set - appendLine(unexpectedDependency) - } - appendLine() - appendLine("${name}: Unexpected source dependency paths:") + appendLine("${fragmentIdentifier}: Unexpected source dependency found:") unexpectedDependencies.forEach { unexpectedDependency -> - appendLine("\"${unexpectedDependency.coordinates.path}\",") + appendLine("\"${unexpectedDependency}\",") } } if (missingDependencies.isNotEmpty()) { appendLine() - appendLine("${name}: Missing fragment dependencies:") + appendLine("${fragmentIdentifier}: Missing fragment dependencies:") missingDependencies.forEach { missingDependency -> appendLine(missingDependency.description) } } appendLine() - appendLine("${name}: Resolved source dependency paths:") + appendLine("${fragmentIdentifier}: Resolved source dependency paths:") sourceDependencies.forEach { dependency -> - appendLine("\"${dependency.coordinates.path}\",") + appendLine("\"${dependency}\",") } } ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/SimpleProjectToProjectDependencyResolutionTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/SimpleProjectToProjectDependencyResolutionTest.kt index 3c18398ef09..3c7d353a97e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/SimpleProjectToProjectDependencyResolutionTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/SimpleProjectToProjectDependencyResolutionTest.kt @@ -82,75 +82,114 @@ class SimpleProjectToProjectDependencyResolutionTest : AbstractLightweightIdeaDe fun ifTestModule(vararg any: Any?) = listOf(*any).takeIf { module.name == KotlinGradleModule.TEST_MODULE_NAME } + fun ifMainModule(vararg any: Any?) = + listOf(*any).takeIf { module.name == KotlinGradleModule.MAIN_MODULE_NAME } + module.assertContainsFragment("common").assertSourceDependencies( - ":producer/main/common", - ifTestModule(":consumer/main/common") + "regular::producer/main/common", + ifTestModule("friend::consumer/main/common") ) module.assertContainsFragment("jvm").assertSourceDependencies( - ":producer/main/jvm", - ":producer/main/common", + "regular::producer/main/jvm", + "regular::producer/main/common", + ifMainModule( + "refines::consumer/main/common", + ), ifTestModule( - ":consumer/main/common", - ":consumer/main/jvm" + "friend::consumer/main/common", + "friend::consumer/main/jvm", + "refines::consumer/test/common", ) ) module.assertContainsFragment("nativeCommon").assertSourceDependencies( - ":producer/main/common", - ":producer/main/nativeCommon", + "regular::producer/main/common", + "regular::producer/main/nativeCommon", + ifMainModule( + "refines::consumer/main/common" + ), ifTestModule( - ":consumer/main/common", - ":consumer/main/nativeCommon" + "friend::consumer/main/common", + "friend::consumer/main/nativeCommon", + "refines::consumer/test/common", ) ) module.assertContainsFragment("appleCommon").assertSourceDependencies( - ":producer/main/common", - ":producer/main/appleCommon", - ":producer/main/nativeCommon", + "regular::producer/main/common", + "regular::producer/main/appleCommon", + "regular::producer/main/nativeCommon", + ifMainModule( + "refines::consumer/main/common", + "refines::consumer/main/nativeCommon" + ), ifTestModule( - ":consumer/main/common", - ":consumer/main/nativeCommon", - ":consumer/main/appleCommon" + "friend::consumer/main/common", + "friend::consumer/main/nativeCommon", + "friend::consumer/main/appleCommon", + "refines::consumer/test/common", + "refines::consumer/test/nativeCommon" ) ) module.assertContainsFragment("linuxX64").assertSourceDependencies( - ":producer/main/common", - ":producer/main/nativeCommon", - ":producer/main/linuxX64", + "regular::producer/main/common", + "regular::producer/main/nativeCommon", + "regular::producer/main/linuxX64", + ifMainModule( + "refines::consumer/main/common", + "refines::consumer/main/nativeCommon", + ), ifTestModule( - ":consumer/main/common", - ":consumer/main/nativeCommon", - ":consumer/main/linuxX64" + "friend::consumer/main/common", + "friend::consumer/main/nativeCommon", + "friend::consumer/main/linuxX64", + "refines::consumer/test/common", + "refines::consumer/test/nativeCommon" ) ) module.assertContainsFragment("macosX64").assertSourceDependencies( - ":producer/main/macosX64", - ":producer/main/common", - ":producer/main/appleCommon", - ":producer/main/nativeCommon", + "regular::producer/main/macosX64", + "regular::producer/main/common", + "regular::producer/main/appleCommon", + "regular::producer/main/nativeCommon", + ifMainModule( + "refines::consumer/main/common", + "refines::consumer/main/nativeCommon", + "refines::consumer/main/appleCommon" + ), ifTestModule( - ":consumer/main/common", - ":consumer/main/nativeCommon", - ":consumer/main/appleCommon", - ":consumer/main/macosX64" + "friend::consumer/main/common", + "friend::consumer/main/nativeCommon", + "friend::consumer/main/appleCommon", + "friend::consumer/main/macosX64", + "refines::consumer/test/common", + "refines::consumer/test/nativeCommon", + "refines::consumer/test/appleCommon" ) ) module.assertContainsFragment("iosX64").assertSourceDependencies( - ":producer/main/iosX64", - ":producer/main/common", - ":producer/main/iosMain", - ":producer/main/appleCommon", - ":producer/main/nativeCommon", + "regular::producer/main/iosX64", + "regular::producer/main/common", + "regular::producer/main/iosMain", + "regular::producer/main/appleCommon", + "regular::producer/main/nativeCommon", + ifMainModule( + "refines::consumer/main/common", + "refines::consumer/main/nativeCommon", + "refines::consumer/main/appleCommon" + ), ifTestModule( - ":consumer/main/common", - ":consumer/main/nativeCommon", - ":consumer/main/appleCommon", - ":consumer/main/iosX64" + "friend::consumer/main/common", + "friend::consumer/main/nativeCommon", + "friend::consumer/main/appleCommon", + "friend::consumer/main/iosX64", + "refines::consumer/test/common", + "refines::consumer/test/nativeCommon", + "refines::consumer/test/appleCommon" ) ) } 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 d9ae257835f..c934b8738e2 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,35 +8,25 @@ package org.jetbrains.kotlin.gradle.kpm.idea import org.jetbrains.kotlin.gradle.kpm.KotlinExternalModelContainer import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* -internal class IdeaKotlinFragmentBuildingContext( - private val parent: IdeaKotlinProjectModelBuildingContext -) : IdeaKotlinProjectModelBuildingContext by parent { - private val fragmentCache = mutableMapOf() - fun getOrPut(source: KotlinGradleFragment, builder: () -> IdeaKotlinFragment) = fragmentCache.getOrPut(source, builder) +internal fun IdeaKotlinProjectModelBuildingContext.toIdeaKotlinFragment(fragment: KotlinGradleFragment): IdeaKotlinFragment { + return if (fragment is KotlinGradleVariant) buildIdeaKotlinVariant(fragment) + else buildIdeaKotlinFragment(fragment) } -internal fun IdeaKotlinFragmentBuildingContext.toIdeaKotlinFragment(fragment: KotlinGradleFragment): IdeaKotlinFragment { - return getOrPut(fragment) { - if (fragment is KotlinGradleVariant) buildIdeaKotlinVariant(fragment) - else buildIdeaKotlinFragment(fragment) - } -} - -private fun IdeaKotlinFragmentBuildingContext.buildIdeaKotlinFragment(fragment: KotlinGradleFragment): IdeaKotlinFragment { +private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinFragment(fragment: KotlinGradleFragment): IdeaKotlinFragment { return IdeaKotlinFragmentImpl( name = fragment.name, moduleIdentifier = fragment.containingModule.moduleIdentifier.toIdeaKotlinModuleIdentifier(), platforms = fragment.containingVariants.map { variant -> buildIdeaKotlinPlatform(variant) }.toSet(), languageSettings = fragment.languageSettings.toIdeaKotlinLanguageSettings(), dependencies = dependencyResolver.resolve(fragment).toList(), - directRefinesDependencies = fragment.directRefinesDependencies.map { refinesFragment -> toIdeaKotlinFragment(refinesFragment) }, sourceDirectories = fragment.kotlinSourceRoots.sourceDirectories.files.toList().map { file -> IdeaKotlinSourceDirectoryImpl(file) }, resourceDirectories = emptyList(), external = (fragment as? KotlinGradleFragmentInternal)?.external ?: KotlinExternalModelContainer.Empty ) } -private fun IdeaKotlinFragmentBuildingContext.buildIdeaKotlinVariant(variant: KotlinGradleVariant): IdeaKotlinVariant { +private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinVariant(variant: KotlinGradleVariant): IdeaKotlinVariant { return IdeaKotlinVariantImpl( fragment = buildIdeaKotlinFragment(variant), platform = buildIdeaKotlinPlatform(variant), diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModuleBuilder.kt index d4632ede5c5..23849e9039c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinModuleBuilder.kt @@ -8,10 +8,9 @@ package org.jetbrains.kotlin.gradle.kpm.idea import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule internal fun IdeaKotlinProjectModelBuildingContext.toIdeaKotlinModule(module: KotlinGradleModule): IdeaKotlinModule { - val fragmentBuildingContext = IdeaKotlinFragmentBuildingContext(this) return IdeaKotlinModuleImpl( name = module.name, moduleIdentifier = module.moduleIdentifier.toIdeaKotlinModuleIdentifier(), - fragments = module.fragments.toList().map { fragment -> fragmentBuildingContext.toIdeaKotlinFragment(fragment) } + fragments = module.fragments.toList().map { fragment -> toIdeaKotlinFragment(fragment) } ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinPlatformBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinPlatformBuilder.kt index bc7c7589a3a..c55e74fed08 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinPlatformBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinPlatformBuilder.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.konan.target.HostManager @Suppress("unused") /* Receiver acts as scope, or key to that function */ -internal fun IdeaKotlinFragmentBuildingContext.buildIdeaKotlinPlatform(variant: KotlinGradleVariant): IdeaKotlinPlatform { +internal fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinPlatform(variant: KotlinGradleVariant): IdeaKotlinPlatform { when (variant) { is KotlinJvmVariant -> return IdeaKotlinPlatform.jvm(variant.compilationData.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name) is KotlinNativeVariantInternal -> return IdeaKotlinPlatform.native(variant.konanTarget.name) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinProjectModelBuilderFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinProjectModelBuilderFactory.kt index 0ac33ea4855..181a339845e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinProjectModelBuilderFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinProjectModelBuilderFactory.kt @@ -18,6 +18,13 @@ internal fun IdeaKotlinProjectModelBuilder.Companion.default( ) = IdeaKotlinProjectModelBuilderImpl(extension).apply { val fragmentMetadataResolverFactory = FragmentGranularMetadataResolverFactory() + registerDependencyResolver( + resolver = IdeaKotlinRefinesDependencyResolver, + constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained, + phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.SourceDependencyResolution, + level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default + ) + registerDependencyResolver( resolver = IdeaKotlinSourceDependencyResolver(fragmentMetadataResolverFactory), constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinRefinesDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinRefinesDependencyResolver.kt new file mode 100644 index 00000000000..f5872274b5d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinRefinesDependencyResolver.kt @@ -0,0 +1,29 @@ +/* + * 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.mpp.pm20.KotlinGradleFragment +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.currentBuildId +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.refinesClosure + +internal object IdeaKotlinRefinesDependencyResolver : IdeaKotlinDependencyResolver { + override fun resolve(fragment: KotlinGradleFragment): Set = fragment.refinesClosure + .map { refinesDependencyFragment -> createRefinesDependency(refinesDependencyFragment) }.toSet() + + private fun createRefinesDependency(fragment: KotlinGradleFragment): IdeaKotlinDependency { + return IdeaKotlinSourceDependencyImpl( + type = IdeaKotlinSourceDependency.Type.Refines, + coordinates = IdeaKotlinSourceCoordinatesImpl( + buildId = fragment.project.currentBuildId().name, + projectPath = fragment.project.path, + projectName = fragment.project.name, + kotlinModuleName = fragment.containingModule.name, + kotlinModuleClassifier = fragment.containingModule.moduleClassifier, + kotlinFragmentName = fragment.name + ) + ) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependencyResolver.kt index 89b7d98b456..651bfcaf803 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKotlinSourceDependencyResolver.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.Choos import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.FragmentGranularMetadataResolverFactory import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule.Companion.moduleName +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.currentBuildId import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toModuleDependency internal class IdeaKotlinSourceDependencyResolver( @@ -18,16 +19,21 @@ internal class IdeaKotlinSourceDependencyResolver( override fun resolve(fragment: KotlinGradleFragment): Set { return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions .filterIsInstance() - .flatMap { resolution -> resolve(resolution) } + .flatMap { resolution -> resolve(fragment, resolution) } .toSet() } - private fun resolve(resolution: ChooseVisibleSourceSets): Iterable { + private fun resolve(fragment: KotlinGradleFragment, resolution: ChooseVisibleSourceSets): Iterable { val gradleProjectIdentifier = resolution.dependency.id as? ProjectComponentIdentifier ?: return emptyList() val kotlinModuleIdentifier = resolution.dependency.toModuleDependency().moduleIdentifier return resolution.allVisibleSourceSetNames.map { visibleFragmentName -> IdeaKotlinSourceDependencyImpl( - IdeaKotlinSourceCoordinatesImpl( + type = if ( + gradleProjectIdentifier.build == fragment.project.currentBuildId() && + gradleProjectIdentifier.projectPath == fragment.project.path + ) IdeaKotlinSourceDependency.Type.Friend + else IdeaKotlinSourceDependency.Type.Regular, + coordinates = IdeaKotlinSourceCoordinatesImpl( buildId = gradleProjectIdentifier.build.name, projectPath = gradleProjectIdentifier.projectPath, projectName = gradleProjectIdentifier.projectName,