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