[kpm] kotlin-gradle-plugin: Introduce IdeaKpm* naming convention (1/2)

This commit is contained in:
sebastian.sellmair
2022-05-24 14:37:37 +02:00
committed by Space
parent 00edca4532
commit 904fc00dde
36 changed files with 223 additions and 223 deletions
@@ -28,5 +28,5 @@ fun KotlinPm20ProjectExtension.androidPrototype() {
instrumentedTest { createKotlinAndroidVariant(androidVariant.testVariant ?: return@instrumentedTest) }
}
setupIdeaKotlinFragmentDependencyResolver()
setupIdeaKpmFragmentDependencyResolver()
}
@@ -10,10 +10,10 @@ import org.gradle.api.attributes.Usage
import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.external.project
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmDependency.Companion.CLASSPATH_BINARY_TYPE
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder.FragmentConstraint
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectModelBuilder.FragmentConstraint
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmResolvedBinaryDependencyImpl
import org.jetbrains.kotlin.gradle.kpm.idea.InternalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.kpm.idea.configureIdeaKotlinSpecialPlatformDependencyResolution
import org.jetbrains.kotlin.gradle.kpm.idea.configureIdeaKpmSpecialPlatformDependencyResolution
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants
@@ -29,8 +29,8 @@ val isAndroidAndJvmSharedFragment = FragmentConstraint constraint@{ fragment ->
}
@OptIn(ExternalVariantApi::class, InternalKotlinGradlePluginApi::class)
internal fun KotlinPm20ProjectExtension.setupIdeaKotlinFragmentDependencyResolver() {
configureIdeaKotlinSpecialPlatformDependencyResolution {
internal fun KotlinPm20ProjectExtension.setupIdeaKpmFragmentDependencyResolver() {
configureIdeaKpmSpecialPlatformDependencyResolution {
/*
Handle android + jvm use cases:
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.gradle.kpm.external
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectModelBuilder
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
@RequiresOptIn("API is intended to build external Kotlin Targets.")
@@ -18,8 +18,8 @@ val KotlinTopLevelExtension.project: Project
get() = this.project
@ExternalVariantApi
val KotlinPm20ProjectExtension.ideaKotlinProjectModelBuilder: IdeaKotlinProjectModelBuilder
get() = this.ideaKotlinProjectModelBuilder
val KotlinPm20ProjectExtension.ideaKpmProjectModelBuilder: IdeaKpmProjectModelBuilder
get() = this.ideaKpmProjectModelBuilder
@ExternalVariantApi
fun GradleKpmModule.createExternalJvmVariant(
@@ -8,8 +8,8 @@
package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinPlatformDependencyResolver.ArtifactResolution
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder.*
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmPlatformDependencyResolver.ArtifactResolution
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectModelBuilder.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmConfigurationAttributesSetup
@@ -18,21 +18,21 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmConfigurationAttribu
annotation class ExternalVariantPlatformDependencyResolutionDsl
@ExternalVariantApi
fun KotlinPm20ProjectExtension.configureIdeaKotlinSpecialPlatformDependencyResolution(
configure: IdeaKotlinPlatformDependencyResolutionDslHandle.() -> Unit
fun KotlinPm20ProjectExtension.configureIdeaKpmSpecialPlatformDependencyResolution(
configure: IdeaKpmPlatformDependencyResolutionDslHandle.() -> Unit
) {
IdeaKotlinPlatformDependencyResolutionDslHandle(ideaKotlinProjectModelBuilder).also(configure).setup()
IdeaKpmPlatformDependencyResolutionDslHandle(ideaKpmProjectModelBuilder).also(configure).setup()
}
@ExternalVariantPlatformDependencyResolutionDsl
class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
private val toolingModelBuilder: IdeaKotlinProjectModelBuilder,
class IdeaKpmPlatformDependencyResolutionDslHandle internal constructor(
private val toolingModelBuilder: IdeaKpmProjectModelBuilder,
private val constraint: FragmentConstraint = FragmentConstraint.unconstrained,
private val parent: IdeaKotlinPlatformDependencyResolutionDslHandle? = null
private val parent: IdeaKpmPlatformDependencyResolutionDslHandle? = null
) {
private val artifactViewDslHandles = mutableListOf<ArtifactViewDslHandle>()
private val children = mutableListOf<IdeaKotlinPlatformDependencyResolutionDslHandle>()
private val additionalDependencies = mutableListOf<IdeaKotlinDependencyResolver>()
private val children = mutableListOf<IdeaKpmPlatformDependencyResolutionDslHandle>()
private val additionalDependencies = mutableListOf<IdeaKpmDependencyResolver>()
@ExternalVariantPlatformDependencyResolutionDsl
var platformResolutionAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment>? = null
@@ -54,9 +54,9 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
@ExternalVariantPlatformDependencyResolutionDsl
fun withConstraint(
constraint: FragmentConstraint,
configure: IdeaKotlinPlatformDependencyResolutionDslHandle.() -> Unit
configure: IdeaKpmPlatformDependencyResolutionDslHandle.() -> Unit
) {
children += IdeaKotlinPlatformDependencyResolutionDslHandle(
children += IdeaKpmPlatformDependencyResolutionDslHandle(
toolingModelBuilder, constraint, this,
).apply(configure)
}
@@ -77,7 +77,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
@ExternalVariantPlatformDependencyResolutionDsl
fun additionalDependencies(dependencyProvider: (GradleKpmFragment) -> List<IdeaKpmDependency>) {
this.additionalDependencies += IdeaKotlinDependencyResolver { fragment -> dependencyProvider(fragment).toSet() }
this.additionalDependencies += IdeaKpmDependencyResolver { fragment -> dependencyProvider(fragment).toSet() }
}
internal fun setup() {
@@ -89,7 +89,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
/* Setup artifact views */
artifactViewDslHandles.toList().forEach { artifactViewDslHandle ->
toolingModelBuilder.registerDependencyResolver(
IdeaKotlinPlatformDependencyResolver(
IdeaKpmPlatformDependencyResolver(
binaryType = artifactViewDslHandle.binaryType,
artifactResolution = ArtifactResolution.Variant(artifactViewDslHandle.attributes)
),
@@ -100,7 +100,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
if (platformResolutionAttributes != null) {
toolingModelBuilder.registerDependencyResolver(
IdeaKotlinPlatformDependencyResolver(
IdeaKpmPlatformDependencyResolver(
binaryType = artifactViewDslHandle.binaryType,
artifactResolution = ArtifactResolution.PlatformFragment(
artifactViewAttributes = artifactViewDslHandle.attributes,
@@ -7,47 +7,47 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
fun interface IdeaKotlinDependencyResolver {
fun interface IdeaKpmDependencyResolver {
fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency>
object Empty : IdeaKotlinDependencyResolver {
object Empty : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> = emptySet()
}
}
fun IdeaKotlinDependencyResolver(
resolvers: Iterable<IdeaKotlinDependencyResolver>
): IdeaKotlinDependencyResolver {
fun IdeaKpmDependencyResolver(
resolvers: Iterable<IdeaKpmDependencyResolver>
): IdeaKpmDependencyResolver {
val resolversList = resolvers.toList()
if (resolversList.isEmpty()) return IdeaKotlinDependencyResolver.Empty
return CompositeIdeaKotlinDependencyResolver(resolversList)
if (resolversList.isEmpty()) return IdeaKpmDependencyResolver.Empty
return IdeaKpmCompositeDependencyResolver(resolversList)
}
fun IdeaKotlinDependencyResolver(
vararg resolvers: IdeaKotlinDependencyResolver
): IdeaKotlinDependencyResolver = IdeaKotlinDependencyResolver(resolvers.toList())
fun IdeaKpmDependencyResolver(
vararg resolvers: IdeaKpmDependencyResolver
): IdeaKpmDependencyResolver = IdeaKpmDependencyResolver(resolvers.toList())
operator fun IdeaKotlinDependencyResolver.plus(
other: IdeaKotlinDependencyResolver
): IdeaKotlinDependencyResolver {
if (this is CompositeIdeaKotlinDependencyResolver && other is CompositeIdeaKotlinDependencyResolver) {
return CompositeIdeaKotlinDependencyResolver(this.children + other.children)
operator fun IdeaKpmDependencyResolver.plus(
other: IdeaKpmDependencyResolver
): IdeaKpmDependencyResolver {
if (this is IdeaKpmCompositeDependencyResolver && other is IdeaKpmCompositeDependencyResolver) {
return IdeaKpmCompositeDependencyResolver(this.children + other.children)
}
if (this is CompositeIdeaKotlinDependencyResolver) {
return CompositeIdeaKotlinDependencyResolver(this.children + other)
if (this is IdeaKpmCompositeDependencyResolver) {
return IdeaKpmCompositeDependencyResolver(this.children + other)
}
if (other is CompositeIdeaKotlinDependencyResolver) {
return CompositeIdeaKotlinDependencyResolver(listOf(this) + other.children)
if (other is IdeaKpmCompositeDependencyResolver) {
return IdeaKpmCompositeDependencyResolver(listOf(this) + other.children)
}
return CompositeIdeaKotlinDependencyResolver(listOf(this, other))
return IdeaKpmCompositeDependencyResolver(listOf(this, other))
}
private class CompositeIdeaKotlinDependencyResolver(
val children: List<IdeaKotlinDependencyResolver>
) : IdeaKotlinDependencyResolver {
private class IdeaKpmCompositeDependencyResolver(
val children: List<IdeaKpmDependencyResolver>
) : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> {
return children.flatMap { child -> child.resolve(fragment) }.toSet()
}
@@ -8,51 +8,51 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
/**
* An [IdeaKotlinDependencyTransformer] will be invoked after all [IdeaKotlinDependencyResolver] finished.
* An [IdeaKpmDependencyTransformer] will be invoked after all [IdeaKpmDependencyResolver] finished.
* The transformation step is allowed to entirely modify the resolution result. Typical applications would be dependency filtering,
* or grouping. Adding additional dependencies might be harmful, since other transformers might not be able to see this additional
* dependency, running before the addition.
*
* Transformations can be scheduled in different phases see: [IdeaKotlinProjectModelBuilder.DependencyTransformationPhase]
* Transformations can be scheduled in different phases see: [IdeaKpmProjectModelBuilder.DependencyTransformationPhase]
*/
fun interface IdeaKotlinDependencyTransformer {
fun interface IdeaKpmDependencyTransformer {
fun transform(
fragment: GradleKpmFragment, dependencies: Set<IdeaKpmDependency>
): Set<IdeaKpmDependency>
}
fun IdeaKotlinDependencyResolver.withTransformer(transformer: IdeaKotlinDependencyTransformer) = IdeaKotlinDependencyResolver { fragment ->
fun IdeaKpmDependencyResolver.withTransformer(transformer: IdeaKpmDependencyTransformer) = IdeaKpmDependencyResolver { fragment ->
transformer.transform(fragment, this@withTransformer.resolve(fragment))
}
fun IdeaKotlinDependencyTransformer(
transformers: List<IdeaKotlinDependencyTransformer>
): IdeaKotlinDependencyTransformer = CompositeIdeaKotlinDependencyTransformer(transformers)
fun IdeaKpmDependencyTransformer(
transformers: List<IdeaKpmDependencyTransformer>
): IdeaKpmDependencyTransformer = IdeaKpmCompositeDependencyTransformer(transformers)
fun IdeaKotlinDependencyTransformer(
vararg transformers: IdeaKotlinDependencyTransformer
): IdeaKotlinDependencyTransformer = IdeaKotlinDependencyTransformer(transformers.toList())
fun IdeaKpmDependencyTransformer(
vararg transformers: IdeaKpmDependencyTransformer
): IdeaKpmDependencyTransformer = IdeaKpmDependencyTransformer(transformers.toList())
operator fun IdeaKotlinDependencyTransformer.plus(other: IdeaKotlinDependencyTransformer):
IdeaKotlinDependencyTransformer {
if (this is CompositeIdeaKotlinDependencyTransformer && other is CompositeIdeaKotlinDependencyTransformer) {
return CompositeIdeaKotlinDependencyTransformer(this.transformers + other.transformers)
operator fun IdeaKpmDependencyTransformer.plus(other: IdeaKpmDependencyTransformer):
IdeaKpmDependencyTransformer {
if (this is IdeaKpmCompositeDependencyTransformer && other is IdeaKpmCompositeDependencyTransformer) {
return IdeaKpmCompositeDependencyTransformer(this.transformers + other.transformers)
}
if (this is CompositeIdeaKotlinDependencyTransformer) {
return CompositeIdeaKotlinDependencyTransformer(this.transformers + other)
if (this is IdeaKpmCompositeDependencyTransformer) {
return IdeaKpmCompositeDependencyTransformer(this.transformers + other)
}
if (other is CompositeIdeaKotlinDependencyTransformer) {
return CompositeIdeaKotlinDependencyTransformer(listOf(this) + other.transformers)
if (other is IdeaKpmCompositeDependencyTransformer) {
return IdeaKpmCompositeDependencyTransformer(listOf(this) + other.transformers)
}
return CompositeIdeaKotlinDependencyTransformer(listOf(this, other))
return IdeaKpmCompositeDependencyTransformer(listOf(this, other))
}
private class CompositeIdeaKotlinDependencyTransformer(
val transformers: List<IdeaKotlinDependencyTransformer>
) : IdeaKotlinDependencyTransformer {
private class IdeaKpmCompositeDependencyTransformer(
val transformers: List<IdeaKpmDependencyTransformer>
) : IdeaKpmDependencyTransformer {
override fun transform(
fragment: GradleKpmFragment, dependencies: Set<IdeaKpmDependency>
): Set<IdeaKpmDependency> {
@@ -13,86 +13,86 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.tooling.core.UnsafeApi
@OptIn(UnsafeApi::class)
internal fun IdeaKotlinProjectModelBuilder.Companion.default(
internal fun IdeaKpmProjectModelBuilder.Companion.default(
extension: KotlinPm20ProjectExtension
) = IdeaKotlinProjectModelBuilderImpl(extension).apply {
) = IdeaKpmProjectModelBuilderImpl(extension).apply {
val fragmentMetadataResolverFactory = GradleKpmFragmentGranularMetadataResolverFactory()
registerDependencyResolver(
resolver = IdeaKotlinRefinesDependencyResolver,
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained,
phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.SourceDependencyResolution,
level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default
resolver = IdeaKpmRefinesDependencyResolver,
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.unconstrained,
phase = IdeaKpmProjectModelBuilder.DependencyResolutionPhase.SourceDependencyResolution,
level = IdeaKpmProjectModelBuilder.DependencyResolutionLevel.Default
)
registerDependencyResolver(
resolver = IdeaKotlinGranularFragmentDependencyResolver(fragmentMetadataResolverFactory),
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained,
phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.SourceDependencyResolution,
level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default
resolver = IdeaKpmGranularFragmentDependencyResolver(fragmentMetadataResolverFactory),
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.unconstrained,
phase = IdeaKpmProjectModelBuilder.DependencyResolutionPhase.SourceDependencyResolution,
level = IdeaKpmProjectModelBuilder.DependencyResolutionLevel.Default
)
registerDependencyResolver(
resolver = IdeaKotlinMetadataBinaryDependencyResolver(fragmentMetadataResolverFactory),
constraint = !IdeaKotlinProjectModelBuilder.FragmentConstraint.isVariant,
phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default
resolver = IdeaKpmMetadataBinaryDependencyResolver(fragmentMetadataResolverFactory),
constraint = !IdeaKpmProjectModelBuilder.FragmentConstraint.isVariant,
phase = IdeaKpmProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKpmProjectModelBuilder.DependencyResolutionLevel.Default
)
registerDependencyResolver(
resolver = IdeaKotlinOriginalMetadataDependencyResolver(fragmentMetadataResolverFactory),
constraint = !IdeaKotlinProjectModelBuilder.FragmentConstraint.isVariant,
phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default
resolver = IdeaKpmOriginalMetadataDependencyResolver(fragmentMetadataResolverFactory),
constraint = !IdeaKpmProjectModelBuilder.FragmentConstraint.isVariant,
phase = IdeaKpmProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKpmProjectModelBuilder.DependencyResolutionLevel.Default
)
registerDependencyResolver(
resolver = IdeaKotlinPlatformDependencyResolver(),
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.isVariant,
phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default
resolver = IdeaKpmPlatformDependencyResolver(),
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.isVariant,
phase = IdeaKpmProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKpmProjectModelBuilder.DependencyResolutionLevel.Default
)
registerDependencyResolver(
resolver = IdeaKotlinNativeStdlibDependencyResolver,
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.isNative,
phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default
resolver = IdeaKpmNativeStdlibDependencyResolver,
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.isNative,
phase = IdeaKpmProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKpmProjectModelBuilder.DependencyResolutionLevel.Default
)
registerDependencyResolver(
resolver = IdeaKotlinNativePlatformDependencyResolver(),
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.isNative,
phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default
resolver = IdeaKpmNativePlatformDependencyResolver(),
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.isNative,
phase = IdeaKpmProjectModelBuilder.DependencyResolutionPhase.BinaryDependencyResolution,
level = IdeaKpmProjectModelBuilder.DependencyResolutionLevel.Default
)
registerDependencyResolver(
resolver = IdeaKotlinSourcesAndDocumentationResolver(),
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained,
phase = IdeaKotlinProjectModelBuilder.DependencyResolutionPhase.PostDependencyResolution,
level = IdeaKotlinProjectModelBuilder.DependencyResolutionLevel.Default
resolver = IdeaKpmSourcesAndDocumentationResolver(),
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.unconstrained,
phase = IdeaKpmProjectModelBuilder.DependencyResolutionPhase.PostDependencyResolution,
level = IdeaKpmProjectModelBuilder.DependencyResolutionLevel.Default
)
registerDependencyTransformer(
transformer = IdeaKotlinSinglePlatformStdlibCommonFilter,
phase = IdeaKotlinProjectModelBuilder.DependencyTransformationPhase.DependencyFilteringPhase,
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained
transformer = IdeaKpmSinglePlatformStdlibCommonFilter,
phase = IdeaKpmProjectModelBuilder.DependencyTransformationPhase.DependencyFilteringPhase,
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.unconstrained
)
registerDependencyTransformer(
transformer = IdeaKotlinUnusedSourcesAndDocumentationFilter,
phase = IdeaKotlinProjectModelBuilder.DependencyTransformationPhase.DependencyFilteringPhase,
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained
transformer = IdeaKpmUnusedSourcesAndDocumentationFilter,
phase = IdeaKpmProjectModelBuilder.DependencyTransformationPhase.DependencyFilteringPhase,
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.unconstrained
)
registerDependencyEffect(
effect = IdeaKotlinDependencyLogger,
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained
effect = IdeaKpmDependencyLogger,
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.unconstrained
)
registerDependencyEffect(
effect = IdeaKotlinMissingFileDependencyLogger,
constraint = IdeaKotlinProjectModelBuilder.FragmentConstraint.unconstrained
effect = IdeaKpmMissingFileDependencyLogger,
constraint = IdeaKpmProjectModelBuilder.FragmentConstraint.unconstrained
)
}
@@ -16,25 +16,25 @@ import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import java.io.ByteArrayOutputStream
import java.io.ObjectOutputStream
internal fun Project.locateOrRegisterBuildIdeaKotlinProjectModelTask(): TaskProvider<BuildIdeaKotlinProjectModelTask> {
return locateOrRegisterTask(BuildIdeaKotlinProjectModelTask.defaultTaskName)
internal fun Project.locateOrRegisterIdeaKpmBuildProjectModelTask(): TaskProvider<IdeaKpmBuildProjectModelTask> {
return locateOrRegisterTask(IdeaKpmBuildProjectModelTask.defaultTaskName)
}
internal open class BuildIdeaKotlinProjectModelTask : DefaultTask() {
internal open class IdeaKpmBuildProjectModelTask : DefaultTask() {
@OutputDirectory
val outputDirectory = project.buildDir.resolve("ideaKotlinProjectModel")
val outputDirectory = project.buildDir.resolve("ideaKpmProjectModel")
private val builder = project.pm20Extension.ideaKotlinProjectModelBuilder
private val builder = project.pm20Extension.ideaKpmProjectModelBuilder
init {
outputs.upToDateWhen { false }
}
@TaskAction
protected fun buildIdeaKotlinProjectModel() {
protected fun buildIdeaKpmProjectModel() {
outputDirectory.mkdirs()
val model = builder.buildIdeaKotlinProjectModel()
val model = builder.buildIdeaKpmProjectModel()
val textFile = outputDirectory.resolve("model.txt")
textFile.writeText(model.toString())
@@ -49,6 +49,6 @@ internal open class BuildIdeaKotlinProjectModelTask : DefaultTask() {
}
companion object {
const val defaultTaskName = "buildIdeaKotlinProjectModel"
const val defaultTaskName = "buildIdeaKpmProjectModel"
}
}
@@ -8,14 +8,14 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
/**
* An [IdeaKotlinDependencyEffect] is invoked last in the dependency resolution pipeline.
* An [IdeaKpmDependencyEffect] is invoked last in the dependency resolution pipeline.
* It is not intended/capable of changing the resolution result, but can trigger side-effects, being sure
* that the dependency resolution result is final.
*/
fun interface IdeaKotlinDependencyEffect {
fun interface IdeaKpmDependencyEffect {
operator fun invoke(fragment: GradleKpmFragment, dependencies: Set<IdeaKpmDependency>)
}
fun IdeaKotlinDependencyResolver.withEffect(effect: IdeaKotlinDependencyEffect) = IdeaKotlinDependencyResolver { fragment ->
fun IdeaKpmDependencyResolver.withEffect(effect: IdeaKpmDependencyEffect) = IdeaKpmDependencyResolver { fragment ->
this@withEffect.resolve(fragment).also { dependencies -> effect(fragment, dependencies) }
}
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.path
internal object IdeaKotlinDependencyLogger : IdeaKotlinDependencyEffect {
internal object IdeaKpmDependencyLogger : IdeaKpmDependencyEffect {
override fun invoke(
fragment: GradleKpmFragment, dependencies: Set<IdeaKpmDependency>
) {
@@ -13,9 +13,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule.Companion.mod
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleDependency
internal class IdeaKotlinGranularFragmentDependencyResolver(
internal class IdeaKpmGranularFragmentDependencyResolver(
private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver {
) : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> {
return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<ChooseVisibleSourceSets>()
@@ -15,9 +15,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule.Companion.mod
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleDependency
import org.jetbrains.kotlin.gradle.utils.withTemporaryDirectory
internal class IdeaKotlinMetadataBinaryDependencyResolver(
internal class IdeaKpmMetadataBinaryDependencyResolver(
private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver {
) : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> {
return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<ChooseVisibleSourceSets>()
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.path
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
internal object IdeaKotlinMissingFileDependencyLogger : IdeaKotlinDependencyEffect {
internal object IdeaKpmMissingFileDependencyLogger : IdeaKpmDependencyEffect {
override fun invoke(fragment: GradleKpmFragment, dependencies: Set<IdeaKpmDependency>) {
dependencies.filterIsInstance<IdeaKpmResolvedBinaryDependency>()
.filter { !it.binaryFile.exists() }
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.library.shortName
import org.jetbrains.kotlin.library.uniqueName
import java.io.File
internal class IdeaKotlinNativePlatformDependencyResolver : IdeaKotlinDependencyResolver {
internal class IdeaKpmNativePlatformDependencyResolver : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> {
val konanTargets = fragment.containingVariants
.map { it as? GradleKpmNativeVariantInternal ?: return emptySet() }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
internal object IdeaKotlinNativeStdlibDependencyResolver : IdeaKotlinDependencyResolver {
internal object IdeaKpmNativeStdlibDependencyResolver : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> {
return setOf(
IdeaKpmResolvedBinaryDependencyImpl(
@@ -11,9 +11,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMeta
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.resolvableMetadataConfigurationName
internal class IdeaKotlinOriginalMetadataDependencyResolver(
internal class IdeaKpmOriginalMetadataDependencyResolver(
private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver {
) : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> {
val dependencyIdentifiers = fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<KeepOriginalDependency>()
@@ -12,7 +12,7 @@ import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.gradle.api.artifacts.component.ModuleComponentSelector
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.internal.resolve.ModuleVersionResolveException
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinPlatformDependencyResolver.*
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmPlatformDependencyResolver.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmConfigurationAttributesSetup
@@ -21,12 +21,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmConfigurationAttribu
* 'platform' binaries refer to actually linkable/executable artifacts (like .class files bundled as jar, or linkable native klibs)
* This resolver is capable of resolving those artifacts even for non-variant "platform-like" fragments.
* It will then use the [GradleKpmFragment.transitiveApiConfiguration] and [GradleKpmFragment.transitiveImplementationConfiguratione]'s
* to resolve those binaries. See [IdeaKotlinPlatformDependencyResolver.ArtifactResolution.PlatformFragment]
* to resolve those binaries. See [IdeaKpmPlatformDependencyResolver.ArtifactResolution.PlatformFragment]
*/
class IdeaKotlinPlatformDependencyResolver(
class IdeaKpmPlatformDependencyResolver(
private val binaryType: String = IdeaKpmDependency.CLASSPATH_BINARY_TYPE,
private val artifactResolution: ArtifactResolution = ArtifactResolution.Variant()
) : IdeaKotlinDependencyResolver {
) : IdeaKpmDependencyResolver {
sealed class ArtifactResolution {
/**
@@ -4,7 +4,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder.FragmentConstraint
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectModelBuilder.FragmentConstraint
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.native
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
@@ -13,17 +13,17 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants
import org.jetbrains.kotlin.project.model.KpmVariant
import java.io.File
internal interface IdeaKotlinProjectModelBuildingContext {
val dependencyResolver: IdeaKotlinDependencyResolver
internal interface IdeaKpmProjectModelBuildingContext {
val dependencyResolver: IdeaKpmDependencyResolver
companion object Empty : IdeaKotlinProjectModelBuildingContext {
override val dependencyResolver: IdeaKotlinDependencyResolver = IdeaKotlinDependencyResolver.Empty
companion object Empty : IdeaKpmProjectModelBuildingContext {
override val dependencyResolver: IdeaKpmDependencyResolver = IdeaKpmDependencyResolver.Empty
}
}
interface IdeaKotlinProjectModelBuilder {
interface IdeaKpmProjectModelBuilder {
/**
* Any [IdeaKotlinDependencyResolver] has to be registered for a given dependency resolution phase in which it participates
* Any [IdeaKpmDependencyResolver] has to be registered for a given dependency resolution phase in which it participates
* The resolution phases will be executed in the order of their enum's ordinal.
*/
enum class DependencyResolutionPhase {
@@ -49,7 +49,7 @@ interface IdeaKotlinProjectModelBuilder {
}
/**
* Any [IdeaKotlinDependencyResolver] has to be registered specifying a certain resolution level.
* Any [IdeaKpmDependencyResolver] has to be registered specifying a certain resolution level.
* Generally, all resolvers registered in a given resolution level will work collaboratively, meaning the dependency resolution
* result is the aggregation of all resolvers running.
*
@@ -62,7 +62,7 @@ interface IdeaKotlinProjectModelBuilder {
}
/**
* Any [IdeaKotlinDependencyTransformer] has to be registered for a given transformation phase.
* Any [IdeaKpmDependencyTransformer] has to be registered for a given transformation phase.
* The phases will be executed in the order of this enums ordinal.
*/
enum class DependencyTransformationPhase {
@@ -73,7 +73,7 @@ interface IdeaKotlinProjectModelBuilder {
/**
* Dependency transformation phase that is free entirely free in its transformation type.
* Note: Adding dependencies to the resolution result might most likely better be modelled as [IdeaKotlinDependencyResolver]
* Note: Adding dependencies to the resolution result might most likely better be modelled as [IdeaKpmDependencyResolver]
*/
FreeDependencyTransformationPhase,
@@ -91,7 +91,7 @@ interface IdeaKotlinProjectModelBuilder {
}
/**
* Used for scoping [IdeaKotlinDependencyResolver], [IdeaKotlinDependencyTransformer] and [IdeaKotlinDependencyEffect]
* Used for scoping [IdeaKpmDependencyResolver], [IdeaKpmDependencyTransformer] and [IdeaKpmDependencyEffect]
*/
fun interface FragmentConstraint {
operator fun invoke(fragment: GradleKpmFragment): Boolean
@@ -105,7 +105,7 @@ interface IdeaKotlinProjectModelBuilder {
@ExternalVariantApi
fun registerDependencyResolver(
resolver: IdeaKotlinDependencyResolver,
resolver: IdeaKpmDependencyResolver,
constraint: FragmentConstraint,
phase: DependencyResolutionPhase,
level: DependencyResolutionLevel = DependencyResolutionLevel.Default,
@@ -113,29 +113,29 @@ interface IdeaKotlinProjectModelBuilder {
@ExternalVariantApi
fun registerDependencyTransformer(
transformer: IdeaKotlinDependencyTransformer,
transformer: IdeaKpmDependencyTransformer,
constraint: FragmentConstraint,
phase: DependencyTransformationPhase
)
@ExternalVariantApi
fun registerDependencyEffect(
effect: IdeaKotlinDependencyEffect,
effect: IdeaKpmDependencyEffect,
constraint: FragmentConstraint
)
fun buildIdeaKotlinProjectModel(): IdeaKpmProject
fun buildIdeaKpmProjectModel(): IdeaKpmProject
companion object
}
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinProjectModel(extension: KotlinPm20ProjectExtension): IdeaKpmProject {
internal fun IdeaKpmProjectModelBuildingContext.IdeaKpmProject(extension: KotlinPm20ProjectExtension): IdeaKpmProject {
return IdeaKpmProjectImpl(
gradlePluginVersion = extension.project.getKotlinPluginVersion(),
coreLibrariesVersion = extension.coreLibrariesVersion,
explicitApiModeCliOption = extension.explicitApi?.cliOption,
kotlinNativeHome = File(extension.project.konanHome).absoluteFile,
modules = extension.modules.map { module -> IdeaKotlinModule(module) }
modules = extension.modules.map { module -> IdeaKpmModule(module) }
)
}
@@ -10,29 +10,29 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.gradle.api.Project
import org.gradle.tooling.provider.model.ToolingModelBuilder
import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder.*
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectModelBuilder.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.tooling.core.UnsafeApi
internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods instead") constructor(
internal class IdeaKpmProjectModelBuilderImpl @UnsafeApi("Use factory methods instead") constructor(
private val extension: KotlinPm20ProjectExtension,
) : ToolingModelBuilder, IdeaKotlinProjectModelBuilder {
) : ToolingModelBuilder, IdeaKpmProjectModelBuilder {
private data class RegisteredDependencyResolver(
val resolver: IdeaKotlinDependencyResolver,
val resolver: IdeaKpmDependencyResolver,
val constraint: FragmentConstraint,
val phase: DependencyResolutionPhase,
val level: DependencyResolutionLevel,
)
private data class RegisteredDependencyTransformer(
val transformer: IdeaKotlinDependencyTransformer,
val transformer: IdeaKpmDependencyTransformer,
val constraint: FragmentConstraint,
val phase: DependencyTransformationPhase
)
private data class RegisteredDependencyEffect(
val effect: IdeaKotlinDependencyEffect,
val effect: IdeaKpmDependencyEffect,
val constraint: FragmentConstraint,
)
@@ -41,7 +41,7 @@ internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods
private val registeredDependencyEffects = mutableListOf<RegisteredDependencyEffect>()
override fun registerDependencyResolver(
resolver: IdeaKotlinDependencyResolver,
resolver: IdeaKpmDependencyResolver,
constraint: FragmentConstraint,
phase: DependencyResolutionPhase,
level: DependencyResolutionLevel
@@ -52,7 +52,7 @@ internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods
}
override fun registerDependencyTransformer(
transformer: IdeaKotlinDependencyTransformer,
transformer: IdeaKpmDependencyTransformer,
constraint: FragmentConstraint,
phase: DependencyTransformationPhase
) {
@@ -62,7 +62,7 @@ internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods
}
override fun registerDependencyEffect(
effect: IdeaKotlinDependencyEffect,
effect: IdeaKpmDependencyEffect,
constraint: FragmentConstraint
) {
registeredDependencyEffects.add(
@@ -70,8 +70,8 @@ internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods
)
}
override fun buildIdeaKotlinProjectModel(): IdeaKpmProject {
return Context().IdeaKotlinProjectModel(extension)
override fun buildIdeaKpmProjectModel(): IdeaKpmProject {
return Context().IdeaKpmProject(extension)
}
override fun canBuild(modelName: String): Boolean =
@@ -79,21 +79,21 @@ internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods
override fun buildAll(modelName: String, project: Project): IdeaKpmProject {
check(project === extension.project) { "Expected project ${extension.project.path}, found ${project.path}" }
return buildIdeaKotlinProjectModel()
return buildIdeaKpmProjectModel()
}
private inner class Context : IdeaKotlinProjectModelBuildingContext {
private inner class Context : IdeaKpmProjectModelBuildingContext {
override val dependencyResolver = createDependencyResolver()
}
private fun createDependencyResolver(): IdeaKotlinDependencyResolver {
return IdeaKotlinDependencyResolver(DependencyResolutionPhase.values().map { phase ->
private fun createDependencyResolver(): IdeaKpmDependencyResolver {
return IdeaKpmDependencyResolver(DependencyResolutionPhase.values().map { phase ->
createDependencyResolver(phase)
}).withTransformer(createDependencyTransformer())
.withEffect(createDependencyEffect())
}
private fun createDependencyResolver(phase: DependencyResolutionPhase) = IdeaKotlinDependencyResolver resolve@{ fragment ->
private fun createDependencyResolver(phase: DependencyResolutionPhase) = IdeaKpmDependencyResolver resolve@{ fragment ->
val applicableResolvers = registeredDependencyResolvers
.filter { it.phase == phase }
.filter { it.constraint(fragment) }
@@ -103,7 +103,7 @@ internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods
DependencyResolutionLevel.values().reversed().forEach { level ->
val resolvers = applicableResolvers[level].orEmpty().map { it.resolver }
if (resolvers.isNotEmpty()) {
return@resolve IdeaKotlinDependencyResolver(resolvers).resolve(fragment)
return@resolve IdeaKpmDependencyResolver(resolvers).resolve(fragment)
}
}
@@ -111,15 +111,15 @@ internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods
emptySet()
}
private fun createDependencyTransformer(): IdeaKotlinDependencyTransformer {
return IdeaKotlinDependencyTransformer(DependencyTransformationPhase.values().map { phase ->
private fun createDependencyTransformer(): IdeaKpmDependencyTransformer {
return IdeaKpmDependencyTransformer(DependencyTransformationPhase.values().map { phase ->
createDependencyTransformer(phase)
})
}
private fun createDependencyTransformer(phase: DependencyTransformationPhase): IdeaKotlinDependencyTransformer {
return IdeaKotlinDependencyTransformer { fragment, dependencies ->
IdeaKotlinDependencyTransformer(
private fun createDependencyTransformer(phase: DependencyTransformationPhase): IdeaKpmDependencyTransformer {
return IdeaKpmDependencyTransformer { fragment, dependencies ->
IdeaKpmDependencyTransformer(
registeredDependencyTransformers
.filter { it.phase == phase }
.filter { it.constraint(fragment) }
@@ -128,7 +128,7 @@ internal class IdeaKotlinProjectModelBuilderImpl @UnsafeApi("Use factory methods
}
}
private fun createDependencyEffect(): IdeaKotlinDependencyEffect = IdeaKotlinDependencyEffect { fragment, dependencies ->
private fun createDependencyEffect(): IdeaKpmDependencyEffect = IdeaKpmDependencyEffect { fragment, dependencies ->
registeredDependencyEffects
.filter { it.constraint(fragment) }
.forEach { it.effect(fragment, dependencies) }
@@ -7,14 +7,14 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
internal object IdeaKotlinRefinesDependencyResolver : IdeaKotlinDependencyResolver {
internal object IdeaKpmRefinesDependencyResolver : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> = fragment.refinesClosure
.map { refinesDependencyFragment -> createRefinesDependency(refinesDependencyFragment) }.toSet()
private fun createRefinesDependency(fragment: GradleKpmFragment): IdeaKpmDependency {
return IdeaKpmFragmentDependencyImpl(
type = IdeaKpmFragmentDependency.Type.Refines,
coordinates = IdeaKotlinFragmentCoordinates(fragment)
coordinates = IdeaKpmFragmentCoordinates(fragment)
)
}
}
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants
internal object IdeaKotlinSinglePlatformStdlibCommonFilter : IdeaKotlinDependencyTransformer {
internal object IdeaKpmSinglePlatformStdlibCommonFilter : IdeaKpmDependencyTransformer {
private const val stdlibCoordinatesGroup = "org.jetbrains.kotlin"
private val stdlibCoordinatesModules = setOf("kotlin-stdlib-common", "kotlin-test-common", "kotlin-test-annotations-common")
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmVariant
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.resolvableMetadataConfigurationName
internal class IdeaKotlinSourcesAndDocumentationResolver : IdeaKotlinDependencyResolver {
internal class IdeaKpmSourcesAndDocumentationResolver : IdeaKpmDependencyResolver {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKpmDependency> {
if (fragment is GradleKpmVariant) {
return resolve(fragment.project, fragment.compileDependenciesConfiguration)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
internal object IdeaKotlinUnusedSourcesAndDocumentationFilter : IdeaKotlinDependencyTransformer {
internal object IdeaKpmUnusedSourcesAndDocumentationFilter : IdeaKpmDependencyTransformer {
override fun transform(
fragment: GradleKpmFragment, dependencies: Set<IdeaKpmDependency>
): Set<IdeaKpmDependency> {
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput
internal fun IdeaKotlinCompilationOutput(compilation: KotlinCompilationOutput): IdeaKpmCompilationOutput {
internal fun IdeaKpmCompilationOutput(compilation: KotlinCompilationOutput): IdeaKpmCompilationOutput {
return IdeaKpmCompilationOutputImpl(
classesDirs = compilation.classesDirs.toSet(),
resourcesDir = compilation.resourcesDir
@@ -8,16 +8,16 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.tooling.core.emptyExtras
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinFragment(fragment: GradleKpmFragment): IdeaKpmFragment {
return if (fragment is GradleKpmVariant) buildIdeaKotlinVariant(fragment)
else buildIdeaKotlinFragment(fragment)
internal fun IdeaKpmProjectModelBuildingContext.IdeaKpmFragment(fragment: GradleKpmFragment): IdeaKpmFragment {
return if (fragment is GradleKpmVariant) buildIdeaKpmVariant(fragment)
else buildIdeaKpmFragment(fragment)
}
private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinFragment(fragment: GradleKpmFragment): IdeaKpmFragment {
private fun IdeaKpmProjectModelBuildingContext.buildIdeaKpmFragment(fragment: GradleKpmFragment): IdeaKpmFragment {
return IdeaKpmFragmentImpl(
coordinates = IdeaKotlinFragmentCoordinates(fragment),
platforms = fragment.containingVariants.map { variant -> IdeaKotlinPlatform(variant) }.toSet(),
languageSettings = IdeaKotlinLanguageSettings(fragment.languageSettings),
coordinates = IdeaKpmFragmentCoordinates(fragment),
platforms = fragment.containingVariants.map { variant -> IdeaKpmPlatform(variant) }.toSet(),
languageSettings = IdeaKpmLanguageSettings(fragment.languageSettings),
dependencies = dependencyResolver.resolve(fragment).toList(),
sourceDirectories = fragment.kotlinSourceRoots.sourceDirectories.files.toList().map { file -> IdeaKpmSourceDirectoryImpl(file) },
resourceDirectories = emptyList(), // TODO
@@ -25,11 +25,11 @@ private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinFragment(fragme
)
}
private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinVariant(variant: GradleKpmVariant): IdeaKpmVariant {
private fun IdeaKpmProjectModelBuildingContext.buildIdeaKpmVariant(variant: GradleKpmVariant): IdeaKpmVariant {
return IdeaKpmVariantImpl(
fragment = buildIdeaKotlinFragment(variant),
platform = IdeaKotlinPlatform(variant),
fragment = buildIdeaKpmFragment(variant),
platform = IdeaKpmPlatform(variant),
variantAttributes = variant.variantAttributes.mapKeys { (key, _) -> key.uniqueName },
compilationOutputs = IdeaKotlinCompilationOutput(variant.compilationOutputs)
compilationOutputs = IdeaKpmCompilationOutput(variant.compilationOutputs)
)
}
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
internal fun IdeaKotlinFragmentCoordinates(fragment: GradleKpmFragment): IdeaKpmFragmentCoordinates {
internal fun IdeaKpmFragmentCoordinates(fragment: GradleKpmFragment): IdeaKpmFragmentCoordinates {
return IdeaKpmFragmentCoordinatesImpl(
module = IdeaKotlinModuleCoordinates(fragment.containingModule),
module = IdeaKpmModuleCoordinates(fragment.containingModule),
fragmentName = fragment.name
)
}
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
import org.jetbrains.kotlin.project.model.LanguageSettings
internal fun IdeaKotlinLanguageSettings(languageSettings: LanguageSettings): IdeaKpmLanguageSettings {
internal fun IdeaKpmLanguageSettings(languageSettings: LanguageSettings): IdeaKpmLanguageSettings {
return IdeaKpmLanguageSettingsImpl(
languageVersion = languageSettings.languageVersion,
apiVersion = languageSettings.apiVersion,
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinModule(module: GradleKpmModule): IdeaKpmModule {
internal fun IdeaKpmProjectModelBuildingContext.IdeaKpmModule(module: GradleKpmModule): IdeaKpmModule {
return IdeaKpmModuleImpl(
coordinates = IdeaKotlinModuleCoordinates(module),
fragments = module.fragments.toList().map { fragment -> IdeaKotlinFragment(fragment) }
coordinates = IdeaKpmModuleCoordinates(module),
fragments = module.fragments.toList().map { fragment -> IdeaKpmFragment(fragment) }
)
}
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
internal fun IdeaKotlinModuleCoordinates(module: GradleKpmModule): IdeaKpmModuleCoordinates {
internal fun IdeaKpmModuleCoordinates(module: GradleKpmModule): IdeaKpmModuleCoordinates {
return IdeaKpmModuleCoordinatesImpl(
buildId = module.project.currentBuildId().name,
projectPath = module.project.path,
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.konan.target.HostManager
@Suppress("unused")
/* Receiver acts as scope, or key to that function */
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinPlatform(variant: GradleKpmVariant): IdeaKpmPlatform {
internal fun IdeaKpmProjectModelBuildingContext.IdeaKpmPlatform(variant: GradleKpmVariant): IdeaKpmPlatform {
when (variant) {
is GradleKpmJvmVariant -> return IdeaKpmPlatform.jvm(variant.compilationData.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name)
is GradleKpmNativeVariantInternal -> return IdeaKpmPlatform.native(variant.konanTarget.name)
@@ -29,7 +29,7 @@ internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinPlatform(variant: G
/* Fallback calculation based on 'platformType' alone */
/* This is a last line of defence, not expected to be actually executed */
assert(false) { "Unable to build 'IdeaKotlinPlatform' from variant ${variant.path}" }
assert(false) { "Unable to build 'IdeaKpmPlatform' from variant ${variant.path}" }
return when (variant.platformType) {
KotlinPlatformType.common -> throw IllegalArgumentException("Unexpected platformType 'common' for variant ${variant.name}")
KotlinPlatformType.jvm -> IdeaKpmPlatform.jvm(JvmTarget.DEFAULT.name)
@@ -18,9 +18,9 @@ import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
import org.jetbrains.kotlin.gradle.dsl.pm20Extension
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectModelBuilder
import org.jetbrains.kotlin.gradle.kpm.idea.default
import org.jetbrains.kotlin.gradle.kpm.idea.locateOrRegisterBuildIdeaKotlinProjectModelTask
import org.jetbrains.kotlin.gradle.kpm.idea.locateOrRegisterIdeaKpmBuildProjectModelTask
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
import javax.inject.Inject
@@ -82,8 +82,8 @@ abstract class KotlinPm20GradlePlugin @Inject constructor(
}
private fun setupToolingModelBuilder(project: Project) {
toolingModelBuilderRegistry.register(project.pm20Extension.ideaKotlinProjectModelBuilder)
project.locateOrRegisterBuildIdeaKotlinProjectModelTask()
toolingModelBuilderRegistry.register(project.pm20Extension.ideaKpmProjectModelBuilder)
project.locateOrRegisterIdeaKpmBuildProjectModelTask()
}
}
@@ -94,7 +94,7 @@ open class KotlinPm20ProjectExtension(project: Project) : KotlinTopLevelExtensio
internal val kpmModelContainer = GradleKpmDefaultProjectModelContainer.create(project)
internal val ideaKotlinProjectModelBuilder by lazy { IdeaKotlinProjectModelBuilder.default(this) }
internal val ideaKpmProjectModelBuilder by lazy { IdeaKpmProjectModelBuilder.default(this) }
val modules: NamedDomainObjectContainer<GradleKpmModule>
get() = project.kpmModules
@@ -27,6 +27,6 @@ fun Project.applyKpmPlugin(configure: KotlinPm20ProjectExtension.() -> Unit = {}
return (extensions.getByName("kotlin") as KotlinPm20ProjectExtension).also(configure)
}
fun KotlinPm20ProjectExtension.buildIdeaKotlinProjectModel(): IdeaKpmProject {
return ideaKotlinProjectModelBuilder.buildIdeaKotlinProjectModel()
fun KotlinPm20ProjectExtension.buildIdeaKpmProjectModel(): IdeaKpmProject {
return ideaKpmProjectModelBuilder.buildIdeaKpmProjectModel()
}
@@ -9,7 +9,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.gradle.kotlin.dsl.create
import org.jetbrains.kotlin.gradle.kpm.AbstractKpmExtensionTest
import org.jetbrains.kotlin.gradle.kpm.buildIdeaKotlinProjectModel
import org.jetbrains.kotlin.gradle.kpm.buildIdeaKpmProjectModel
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.deserialize
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.serialize
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmIosX64Variant
@@ -19,13 +19,13 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.jvm
import kotlin.test.Test
import kotlin.test.assertEquals
class IdeaKotlinProjectModelSerializableTest : AbstractKpmExtensionTest() {
class IdeaKpmProjectModelSerializableTest : AbstractKpmExtensionTest() {
@Test
fun `test - serialize and deserialize - empty project`() {
project.evaluate()
project.repositories.mavenLocal()
assertSerializeAndDeserializeEquals(kotlin.buildIdeaKotlinProjectModel())
assertSerializeAndDeserializeEquals(kotlin.buildIdeaKpmProjectModel())
}
@Test
@@ -48,7 +48,7 @@ class IdeaKotlinProjectModelSerializableTest : AbstractKpmExtensionTest() {
}
project.evaluate()
assertSerializeAndDeserializeEquals(kotlin.buildIdeaKotlinProjectModel())
assertSerializeAndDeserializeEquals(kotlin.buildIdeaKpmProjectModel())
}
private fun assertSerializeAndDeserializeEquals(model: IdeaKpmProject) {
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.commonizer.stdlib
import org.jetbrains.kotlin.gradle.android.androidPrototype
import org.jetbrains.kotlin.gradle.assumeAndroidSdkAvailable
import org.jetbrains.kotlin.gradle.kpm.applyKpmPlugin
import org.jetbrains.kotlin.gradle.kpm.buildIdeaKotlinProjectModel
import org.jetbrains.kotlin.gradle.kpm.buildIdeaKpmProjectModel
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmDependency.Companion.CLASSPATH_BINARY_TYPE
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.assertContainsFragment
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.assertContainsModule
@@ -51,7 +51,7 @@ class MviKotlinIdeaDependencyResolutionTest : AbstractLightweightIdeaDependencyR
}
}
kotlin.buildIdeaKotlinProjectModel().assertIsNotEmpty().modules.forEach { module ->
kotlin.buildIdeaKpmProjectModel().assertIsNotEmpty().modules.forEach { module ->
module.assertContainsFragment("common").assertResolvedBinaryDependencies(
CLASSPATH_BINARY_TYPE,
"com.arkivanov.mvikotlin:mvikotlin:3.0.0-beta01:main:commonMain",
@@ -197,7 +197,7 @@ class MviKotlinIdeaDependencyResolutionTest : AbstractLightweightIdeaDependencyR
/* Android requires project to evaluate */
project.evaluate()
kotlin.buildIdeaKotlinProjectModel().assertIsNotEmpty().assertContainsModule("main").let { module ->
kotlin.buildIdeaKpmProjectModel().assertIsNotEmpty().assertContainsModule("main").let { module ->
listOf("common", "jvm").forEach { fragmentName ->
module.assertContainsFragment(fragmentName).assertResolvedBinaryDependencies(
CLASSPATH_BINARY_TYPE,
@@ -8,7 +8,7 @@
package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.kpm.applyKpmPlugin
import org.jetbrains.kotlin.gradle.kpm.buildIdeaKotlinProjectModel
import org.jetbrains.kotlin.gradle.kpm.buildIdeaKpmProjectModel
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.assertContainsFragment
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.assertIsNotEmpty
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.assertFragmentDependencies
@@ -78,7 +78,7 @@ class SimpleProjectToProjectDependencyResolutionTest : AbstractLightweightIdeaDe
}
}
consumerKotlin.buildIdeaKotlinProjectModel().assertIsNotEmpty().modules.forEach { module ->
consumerKotlin.buildIdeaKpmProjectModel().assertIsNotEmpty().modules.forEach { module ->
fun ifTestModule(vararg any: Any?) =
listOf(*any).takeIf { module.name == GradleKpmModule.TEST_MODULE_NAME }
@@ -9,7 +9,7 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.enableDefaultStdlibDependency
import org.jetbrains.kotlin.gradle.kpm.applyKpmPlugin
import org.jetbrains.kotlin.gradle.kpm.buildIdeaKotlinProjectModel
import org.jetbrains.kotlin.gradle.kpm.buildIdeaKpmProjectModel
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmDependency.Companion.CLASSPATH_BINARY_TYPE
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.IdeaKpmBinaryDependencyMatcher
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.assertContainsFragment
@@ -44,7 +44,7 @@ class StdlibKotlinIdeaDependencyResolutionTest : AbstractLightweightIdeaDependen
}
}
kotlin.buildIdeaKotlinProjectModel().assertIsNotEmpty().modules.forEach { module ->
kotlin.buildIdeaKpmProjectModel().assertIsNotEmpty().modules.forEach { module ->
module.assertContainsFragment("common").assertResolvedBinaryDependencies(
CLASSPATH_BINARY_TYPE,
"org.jetbrains.kotlin:kotlin-stdlib-common:1.6.10"
@@ -88,7 +88,7 @@ class StdlibKotlinIdeaDependencyResolutionTest : AbstractLightweightIdeaDependen
}
}
kotlin.buildIdeaKotlinProjectModel().assertIsNotEmpty().modules.forEach { module ->
kotlin.buildIdeaKpmProjectModel().assertIsNotEmpty().modules.forEach { module ->
module.assertContainsFragment("common").assertResolvedBinaryDependencies(
CLASSPATH_BINARY_TYPE,
"org.jetbrains.kotlin:kotlin-stdlib-common:1.6.10",
@@ -140,7 +140,7 @@ class StdlibKotlinIdeaDependencyResolutionTest : AbstractLightweightIdeaDependen
}
}
kotlin.buildIdeaKotlinProjectModel().assertIsNotEmpty().modules.forEach { module ->
kotlin.buildIdeaKpmProjectModel().assertIsNotEmpty().modules.forEach { module ->
module.assertContainsFragment("common").assertResolvedBinaryDependencies(
CLASSPATH_BINARY_TYPE,
"org.jetbrains.kotlin:kotlin-stdlib-common:${project.getKotlinPluginVersion()}"