All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmMetadataBinaryDependencyResolver.kt Maven / Gradle / Ivy

There is a newer version: 2.0.0-RC3
Show newest version
/*
 * 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.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.jetbrains.kotlin.gradle.idea.kpm.IdeaKpmBinaryCoordinatesImpl
import org.jetbrains.kotlin.gradle.idea.kpm.IdeaKpmDependency
import org.jetbrains.kotlin.gradle.idea.kpm.IdeaKpmResolvedBinaryDependencyImpl
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ProjectMetadataProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.kotlinTransformedMetadataLibraryDirectoryForIde
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule.Companion.moduleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleDependency
import org.jetbrains.kotlin.gradle.plugin.mpp.read

internal class IdeaKpmMetadataBinaryDependencyResolver(
    private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKpmDependencyResolver {
    override fun resolve(fragment: GradleKpmFragment): Set {
        return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
            .filterIsInstance()
            .flatMap { resolution -> resolve(fragment, resolution) }
            .toSet()
    }

    private fun resolve(fragment: GradleKpmFragment, resolution: ChooseVisibleSourceSets): Iterable {
        val gradleModuleIdentifier = resolution.dependency.id as? ModuleComponentIdentifier ?: return emptySet()
        val kotlinModuleIdentifier = resolution.dependency.toKpmModuleDependency().moduleIdentifier

        /* Project to project metadata dependencies shall be resolved as source dependencies, somewhere else */
        val metadataProvider = when (resolution.metadataProvider) {
            is ProjectMetadataProvider -> return emptySet()
            is ArtifactMetadataProvider -> resolution.metadataProvider
        }

        return metadataProvider.read { artifactContent ->
            resolution.allVisibleSourceSetNames.mapNotNull { visibleFragmentName ->
                val sourceSetContent = artifactContent.findSourceSet(visibleFragmentName) ?: return@mapNotNull null
                val metadataBinary = sourceSetContent.metadataBinary ?: return@mapNotNull null

                val libraryFile = fragment.project.kotlinTransformedMetadataLibraryDirectoryForIde
                    .resolve(metadataBinary.relativeFile)
                    .apply { if (!isFile) metadataBinary.copyTo(this) }

                IdeaKpmResolvedBinaryDependencyImpl(
                    binaryType = IdeaKpmDependency.CLASSPATH_BINARY_TYPE,
                    binaryFile = libraryFile,
                    coordinates = IdeaKpmBinaryCoordinatesImpl(
                        group = gradleModuleIdentifier.group,
                        module = gradleModuleIdentifier.module,
                        version = gradleModuleIdentifier.version,
                        kotlinModuleName = kotlinModuleIdentifier.moduleName,
                        kotlinFragmentName = visibleFragmentName
                    )
                )
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy