diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt index d2d8e2b450b..9a9fff10393 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt @@ -23,16 +23,18 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.vfs.VfsUtil +import com.intellij.util.SmartList import com.intellij.util.containers.stream import org.jetbrains.jps.model.java.JavaResourceRootType import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform -import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler -import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService -import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets +import org.jetbrains.kotlin.gradle.KotlinSourceSet +import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.idea.facet.KotlinFacet +import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import java.io.File import java.io.IOException @@ -88,13 +90,13 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService, + modelsProvider: IdeModifiableModelsProvider, + rootModel: ModifiableRootModel, + testScope: Boolean + ) { + val dependencies = if (testScope) { + androidModel.selectedAndroidTestCompileDependencies + } else { + androidModel.selectedMainCompileLevel2Dependencies + } ?: return + val commonSourceSetName = KotlinSourceSet.commonName(testScope) + val relevantNodes = dependencies + .moduleDependencies + .mapNotNull { projectNode.findChildModuleById(it.projectPath) } + .flatMap { ExternalSystemApiUtil.getChildren(it, GradleSourceSetData.KEY) } + .filter { + val ktModule = it.kotlinSourceSet?.kotlinModule + ktModule != null && ktModule.isTestModule == testScope + } + SmartList>() + .apply { + addIfNotNull( + relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.ANDROID } + ?: relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.JVM } + ) + addIfNotNull( + relevantNodes.firstOrNull { + it.kotlinSourceSet?.platform == KotlinPlatform.COMMON && it.kotlinSourceSet?.kotlinModule?.name == commonSourceSetName + } + ) + } + .mapNotNull { modelsProvider.findIdeModule(it.data) } + .forEach { + addModuleDependencyIfNeeded(rootModel, it, testScope) + val dependeeRootModel = modelsProvider.getModifiableRootModel(it) + dependeeRootModel.getModuleDependencies(testScope).forEach { transitiveDependee -> + addModuleDependencyIfNeeded(rootModel, transitiveDependee, testScope) + } + } + } + private fun addSourceRoot( sourceRoot: File, type: JpsModuleSourceRootType<*>, diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181 index 50a56c27b60..74a8f41dd31 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181 @@ -23,16 +23,18 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.vfs.VfsUtil +import com.intellij.util.SmartList import com.intellij.util.containers.stream import org.jetbrains.jps.model.java.JavaResourceRootType import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform -import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler -import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService -import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets +import org.jetbrains.kotlin.gradle.KotlinSourceSet +import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.idea.facet.KotlinFacet +import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import java.io.File import java.io.IOException @@ -88,13 +90,13 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService, + modelsProvider: IdeModifiableModelsProvider, + rootModel: ModifiableRootModel, + testScope: Boolean + ) { + val dependencies = if (testScope) { + androidModel.selectedAndroidTestCompileDependencies + } else { + androidModel.selectedMainCompileLevel2Dependencies + } ?: return + val commonSourceSetName = KotlinSourceSet.commonName(testScope) + val relevantNodes = dependencies + .moduleDependencies + .mapNotNull { projectNode.findChildModuleById(it.projectPath) } + .flatMap { ExternalSystemApiUtil.getChildren(it, GradleSourceSetData.KEY) } + .filter { + val ktModule = it.kotlinSourceSet?.kotlinModule + ktModule != null && ktModule.isTestModule == testScope + } + SmartList>() + .apply { + addIfNotNull( + relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.ANDROID } + ?: relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.JVM } + ) + addIfNotNull( + relevantNodes.firstOrNull { + it.kotlinSourceSet?.platform == KotlinPlatform.COMMON && it.kotlinSourceSet?.kotlinModule?.name == commonSourceSetName + } + ) + } + .mapNotNull { modelsProvider.findIdeModule(it.data) } + .forEach { + addModuleDependencyIfNeeded(rootModel, it, testScope) + val dependeeRootModel = modelsProvider.getModifiableRootModel(it) + dependeeRootModel.getModuleDependencies(testScope).forEach { transitiveDependee -> + addModuleDependencyIfNeeded(rootModel, transitiveDependee, testScope) + } + } + } + private fun addSourceRoot( sourceRoot: File, type: JpsModuleSourceRootType<*>, diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31 index 5ca15c74876..9500de654c7 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31 @@ -25,18 +25,18 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.vfs.VfsUtil +import com.intellij.util.SmartList import com.intellij.util.containers.stream import org.jetbrains.jps.model.java.JavaResourceRootType import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform -import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet -import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler -import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService -import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets -import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData +import org.jetbrains.kotlin.gradle.KotlinSourceSet +import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.idea.facet.KotlinFacet +import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import java.io.File import java.io.IOException @@ -101,13 +101,13 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService, + modelsProvider: IdeModifiableModelsProvider, + rootModel: ModifiableRootModel, + testScope: Boolean + ) { + val dependencies = if (testScope) { + androidModel.selectedAndroidTestCompileDependencies + } else { + androidModel.selectedMainCompileLevel2Dependencies + } ?: return + val commonSourceSetName = KotlinSourceSet.commonName(testScope) + val relevantNodes = dependencies + .moduleDependencies + .mapNotNull { projectNode.findChildModuleById(it.projectPath) } + .flatMap { ExternalSystemApiUtil.getChildren(it, GradleSourceSetData.KEY) } + .filter { + val ktModule = it.kotlinSourceSet?.kotlinModule + ktModule != null && ktModule.isTestModule == testScope + } + SmartList>() + .apply { + addIfNotNull( + relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.ANDROID } + ?: relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.JVM } + ) + addIfNotNull( + relevantNodes.firstOrNull { + it.kotlinSourceSet?.platform == KotlinPlatform.COMMON && it.kotlinSourceSet?.kotlinModule?.name == commonSourceSetName + } + ) + } + .mapNotNull { modelsProvider.findIdeModule(it.data) } + .forEach { + addModuleDependencyIfNeeded(rootModel, it, testScope) + val dependeeRootModel = modelsProvider.getModifiableRootModel(it) + dependeeRootModel.getModuleDependencies(testScope).forEach { transitiveDependee -> + addModuleDependencyIfNeeded(rootModel, transitiveDependee, testScope) + } + } } private fun addSourceRoot( diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32 b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32 index d2d8e2b450b..9a9fff10393 100644 --- a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32 +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32 @@ -23,16 +23,18 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.vfs.VfsUtil +import com.intellij.util.SmartList import com.intellij.util.containers.stream import org.jetbrains.jps.model.java.JavaResourceRootType import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform -import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler -import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService -import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets +import org.jetbrains.kotlin.gradle.KotlinSourceSet +import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.idea.facet.KotlinFacet +import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import java.io.File import java.io.IOException @@ -88,13 +90,13 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService, + modelsProvider: IdeModifiableModelsProvider, + rootModel: ModifiableRootModel, + testScope: Boolean + ) { + val dependencies = if (testScope) { + androidModel.selectedAndroidTestCompileDependencies + } else { + androidModel.selectedMainCompileLevel2Dependencies + } ?: return + val commonSourceSetName = KotlinSourceSet.commonName(testScope) + val relevantNodes = dependencies + .moduleDependencies + .mapNotNull { projectNode.findChildModuleById(it.projectPath) } + .flatMap { ExternalSystemApiUtil.getChildren(it, GradleSourceSetData.KEY) } + .filter { + val ktModule = it.kotlinSourceSet?.kotlinModule + ktModule != null && ktModule.isTestModule == testScope + } + SmartList>() + .apply { + addIfNotNull( + relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.ANDROID } + ?: relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.JVM } + ) + addIfNotNull( + relevantNodes.firstOrNull { + it.kotlinSourceSet?.platform == KotlinPlatform.COMMON && it.kotlinSourceSet?.kotlinModule?.name == commonSourceSetName + } + ) + } + .mapNotNull { modelsProvider.findIdeModule(it.data) } + .forEach { + addModuleDependencyIfNeeded(rootModel, it, testScope) + val dependeeRootModel = modelsProvider.getModifiableRootModel(it) + dependeeRootModel.getModuleDependencies(testScope).forEach { transitiveDependee -> + addModuleDependencyIfNeeded(rootModel, transitiveDependee, testScope) + } + } + } + private fun addSourceRoot( sourceRoot: File, type: JpsModuleSourceRootType<*>, diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt index 6352e3dc633..6839629fdbb 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt @@ -27,6 +27,8 @@ interface KotlinSourceSet : KotlinModule { companion object { const val COMMON_MAIN_SOURCE_SET_NAME = "commonMain" const val COMMON_TEST_SOURCE_SET_NAME = "commonTest" + + fun commonName(forTests: Boolean) = if (forTests) COMMON_TEST_SOURCE_SET_NAME else COMMON_MAIN_SOURCE_SET_NAME } }