diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt index 4972e47949f..ac51ce8f3ff 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt @@ -444,7 +444,7 @@ class HierarchicalMultiplatformProjectImportingTest : MultiplePluginVersionGradl targetPlatform(jvm, js) } module("my-app") { - diagnostics(OrphanSourceSetsImportingDiagnostic::class.java to 1) + assertDiagnosticsCount(1) } } } @@ -536,7 +536,7 @@ class HierarchicalMultiplatformProjectImportingTest : MultiplePluginVersionGradl checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { module("my-app") { - diagnostics(OrphanSourceSetsImportingDiagnostic::class.java to 3) + assertDiagnosticsCount(3) } // (jvm, js, native) is highly undesirable diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt index 61d5161a0b8..8da1235e9d7 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/projectStructureDSL.kt @@ -277,17 +277,14 @@ class ModuleInfo( } @Suppress("UnstableApiUsage") - fun diagnostics(vararg expectedByType: Pair, Int>) { + internal inline fun assertDiagnosticsCount(count: Int) { val moduleNode = GradleUtil.findGradleModuleData(module) val diagnostics = moduleNode!!.kotlinImportingDiagnosticsContainer!! - expectedByType.forEach { (expectedClazz, expectedCount) -> - val typedDiagnostics = diagnostics.filterIsInstance(expectedClazz) - if (typedDiagnostics.size != expectedCount) { - val actualCount = typedDiagnostics.size - projectInfo.messageCollector.report( - "Expected number of ${expectedClazz.simpleName} diagnostics $expectedCount doesn't match the actual one: $actualCount" - ) - } + val typedDiagnostics = diagnostics.filterIsInstance() + if (typedDiagnostics.size != count) { + projectInfo.messageCollector.report( + "Expected number of ${T::class.java.simpleName} diagnostics $count doesn't match the actual one: ${typedDiagnostics.size}" + ) } } diff --git a/idea/kotlin-gradle-tooling/src/KotlinImportingDiagnostic.kt b/idea/kotlin-gradle-tooling/src/KotlinImportingDiagnostic.kt index 85ff99baaf0..7eff2987dc6 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinImportingDiagnostic.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinImportingDiagnostic.kt @@ -8,12 +8,18 @@ package org.jetbrains.kotlin.gradle import java.io.Serializable -interface KotlinImportingDiagnostic : Serializable +interface KotlinImportingDiagnostic : Serializable { + fun deepCopy(cache: MutableMap): KotlinImportingDiagnostic +} + +typealias KotlinImportingDiagnosticsContainer = MutableSet interface KotlinSourceSetImportingDiagnostic : KotlinImportingDiagnostic { val kotlinSourceSet: KotlinSourceSet } -typealias KotlinImportingDiagnosticsContainer = MutableSet - -data class OrphanSourceSetsImportingDiagnostic(override val kotlinSourceSet: KotlinSourceSet) : KotlinSourceSetImportingDiagnostic \ No newline at end of file +data class OrphanSourceSetsImportingDiagnostic(override val kotlinSourceSet: KotlinSourceSet) : KotlinSourceSetImportingDiagnostic { + override fun deepCopy(cache: MutableMap): OrphanSourceSetsImportingDiagnostic = + (cache[kotlinSourceSet] as? KotlinSourceSet)?.let { OrphanSourceSetsImportingDiagnostic(it) } + ?: OrphanSourceSetsImportingDiagnostic(KotlinSourceSetImpl(kotlinSourceSet, cache).apply { cache[kotlinSourceSet] = this }) +} \ No newline at end of file diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt index 800341d5d25..1791edf052f 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt @@ -266,7 +266,7 @@ data class KotlinMPPGradleModelImpl( ), mppModel.kotlinNativeHome, mppModel.dependencyMap.map { it.key to it.value.deepCopy(cloningCache) }.toMap(), - mppModel.kotlinImportingDiagnostics.toMutableSet() + mppModel.kotlinImportingDiagnostics.mapTo(mutableSetOf()) { it.deepCopy(cloningCache) } ) } diff --git a/idea/kotlin-gradle-tooling/src/MultiplatformModelImportingChecker.kt b/idea/kotlin-gradle-tooling/src/MultiplatformModelImportingChecker.kt index 63417a2a4c2..528ae745103 100644 --- a/idea/kotlin-gradle-tooling/src/MultiplatformModelImportingChecker.kt +++ b/idea/kotlin-gradle-tooling/src/MultiplatformModelImportingChecker.kt @@ -14,7 +14,8 @@ internal object OrphanSourceSetImportingChecker : MultiplatformModelImportingChe model: KotlinMPPGradleModel, reportTo: KotlinImportingDiagnosticsContainer, context: MultiplatformModelImportingContext - ) = model.sourceSets.values.filter { context.isOrphanSourceSet(it) } - .map { OrphanSourceSetsImportingDiagnostic(it) } - .forEach { reportTo += it } + ) { + model.sourceSets.values.filter { context.isOrphanSourceSet(it) } + .mapTo(reportTo) { OrphanSourceSetsImportingDiagnostic(it) } + } } \ No newline at end of file