diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt index 5f7186d7b30..bf095012b00 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt @@ -84,15 +84,7 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { ): Map { if (importingContext.getProperty(IMPORT_ORPHAN_SOURCE_SETS)) return importingContext.sourceSetsByNames - // TODO: similar to importingContext.sourceSetsByCompilations.keys, will be deduplicated in further commits - val compiledSourceSets: Collection = - importingContext.targets - .flatMap { it.compilations } - .flatMap { it.sourceSets } - .flatMap { it.dependsOnSourceSets.union(listOf(it.name)) } - .distinct() - - val (orphanSourceSets, nonOrphanSourceSets) = importingContext.sourceSets.partition { !compiledSourceSets.contains(it.name) } + val (orphanSourceSets, nonOrphanSourceSets) = importingContext.sourceSets.partition { importingContext.isOrphanSourceSet(it) } orphanSourceSets.forEach { logger.warn("[sync warning] Source set \"${it.name}\" is not compiled with any compilation. This source set is not imported in the IDE.") diff --git a/idea/kotlin-gradle-tooling/src/MultiplatformModelImportingContext.kt b/idea/kotlin-gradle-tooling/src/MultiplatformModelImportingContext.kt index 704a0d40a55..a8b6bc9d204 100644 --- a/idea/kotlin-gradle-tooling/src/MultiplatformModelImportingContext.kt +++ b/idea/kotlin-gradle-tooling/src/MultiplatformModelImportingContext.kt @@ -17,12 +17,25 @@ internal interface MultiplatformModelImportingContext { val targets: Collection val compilations: Collection - + + /** + * All source sets in a project, including those that are created but not included into any compilations + * (so-called "orphan" source sets). Use [isOrphanSourceSet] to get only compiled source sets + */ val sourceSets: Collection val sourceSetsByNames: Map fun sourceSetByName(name: String): KotlinSourceSet? fun compilationsBySourceSet(sourceSet: KotlinSourceSet): Collection? + + /** + * "Orphan" is a source set which is not actually compiled by the compiler, i.e. the one + * which doesn't belong to any [KotlinCompilation]. + * + * Orphan source sets might appear if one creates a source-set manually and doesn't link + * it anywhere (essentially this is a misconfiguration) + */ + fun isOrphanSourceSet(sourceSet: KotlinSourceSet): Boolean = compilationsBySourceSet(sourceSet) == null } internal fun MultiplatformModelImportingContext.getProperty(property: GradleImportProperties): Boolean = project.getProperty(property) @@ -99,6 +112,9 @@ internal class MultiplatformModelImportingContextImpl(override val project: Proj this.targets = targets } + // overload for small optimization + override fun isOrphanSourceSet(sourceSet: KotlinSourceSet): Boolean = sourceSet in sourceSetToParticipatedCompilations.keys + override fun compilationsBySourceSet(sourceSet: KotlinSourceSet): Collection? = sourceSetToParticipatedCompilations[sourceSet]