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 9a9fff10393..4391b64fa05 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 @@ -20,7 +20,6 @@ import com.intellij.openapi.externalSystem.service.project.manage.ContentRootDat import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.module.Module 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 @@ -31,6 +30,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.gradle.KotlinSourceSet +import org.jetbrains.kotlin.idea.addModuleDependencyIfNeeded import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.utils.addIfNotNull @@ -109,17 +109,6 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService, 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 74a8f41dd31..864b8eb4895 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 @@ -20,7 +20,6 @@ import com.intellij.openapi.externalSystem.service.project.manage.ContentRootDat import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.module.Module 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 @@ -31,6 +30,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.gradle.KotlinSourceSet +import org.jetbrains.kotlin.idea.addModuleDependencyIfNeeded import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.utils.addIfNotNull @@ -109,17 +109,6 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService, 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 9500de654c7..aeb44084155 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 @@ -22,7 +22,6 @@ import com.intellij.openapi.externalSystem.service.project.manage.ContentRootDat import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.module.Module 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 @@ -33,6 +32,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.gradle.KotlinSourceSet +import org.jetbrains.kotlin.idea.addModuleDependencyIfNeeded import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.utils.addIfNotNull @@ -120,17 +120,6 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService, 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 9a9fff10393..4391b64fa05 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 @@ -20,7 +20,6 @@ import com.intellij.openapi.externalSystem.service.project.manage.ContentRootDat import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.module.Module 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 @@ -31,6 +30,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.gradle.KotlinCompilation import org.jetbrains.kotlin.gradle.KotlinPlatform import org.jetbrains.kotlin.gradle.KotlinSourceSet +import org.jetbrains.kotlin.idea.addModuleDependencyIfNeeded import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.utils.addIfNotNull @@ -109,17 +109,6 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService, diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/KotlinJavaMPPSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/KotlinJavaMPPSourceSetDataService.kt new file mode 100644 index 00000000000..bbc7796cc0d --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/KotlinJavaMPPSourceSetDataService.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea + +import com.intellij.openapi.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.ProjectKeys +import com.intellij.openapi.externalSystem.model.project.ProjectData +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider +import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.LibraryOrderEntry +import com.intellij.openapi.roots.OrderRootType +import com.intellij.openapi.vfs.VfsUtil +import org.jetbrains.kotlin.idea.configuration.KotlinTargetData +import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet +import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData + +class KotlinJavaMPPSourceSetDataService : AbstractProjectDataService() { + override fun getTargetDataKey() = GradleSourceSetData.KEY + + override fun postProcess( + toImport: MutableCollection>, + projectData: ProjectData?, + project: Project, + modelsProvider: IdeModifiableModelsProvider + ) { + val projectNode = toImport.firstOrNull()?.let { ExternalSystemApiUtil.findParent(it, ProjectKeys.PROJECT) } ?: return + val targetsByUrl = ExternalSystemApiUtil + .findAllRecursively(projectNode, KotlinTargetData.KEY) + .groupBy { targetNode -> targetNode.data.archiveFile?.let { VfsUtil.getUrlForLibraryRoot(it) } } + for (nodeToImport in toImport) { + if (nodeToImport.kotlinSourceSet != null) continue + val isTestSourceSet = nodeToImport.data.id.endsWith(":test") + val moduleData = nodeToImport.data + val module = modelsProvider.findIdeModule(moduleData) ?: continue + val rootModel = modelsProvider.getModifiableRootModel(module) + val libraryEntries = rootModel.orderEntries.filterIsInstance() + libraryEntries.forEach { libraryEntry -> + val library = libraryEntry.library + val libraryModel = modelsProvider.getModifiableLibraryModel(library) + val classesUrl = libraryModel.getUrls(OrderRootType.CLASSES).singleOrNull() ?: return@forEach + val targetNode = targetsByUrl[classesUrl]?.singleOrNull() ?: return@forEach + val groupingModuleNode = ExternalSystemApiUtil.findParent(targetNode, ProjectKeys.MODULE) ?: return@forEach + val compilationNodes = ExternalSystemApiUtil + .getChildren(groupingModuleNode, GradleSourceSetData.KEY) + .filter { it.data.id in targetNode.data.moduleIds } + for (compilationNode in compilationNodes) { + val compilationModule = modelsProvider.findIdeModule(compilationNode.data) ?: continue + val compilationInfo = compilationNode.kotlinSourceSet ?: continue + if (!isTestSourceSet && compilationInfo.isTestModule) continue + val compilationRootModel = modelsProvider.getModifiableRootModel(compilationModule) + addModuleDependencyIfNeeded(rootModel, compilationModule, isTestSourceSet) + compilationRootModel.getModuleDependencies(isTestSourceSet).forEach { transitiveDependee -> + addModuleDependencyIfNeeded(rootModel, transitiveDependee, isTestSourceSet) + } + } + rootModel.removeOrderEntry(libraryEntry) + } + } + } +} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/utils.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/utils.kt new file mode 100644 index 00000000000..02d0f51b372 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/utils.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea + +import com.intellij.openapi.module.Module +import com.intellij.openapi.roots.DependencyScope +import com.intellij.openapi.roots.ModifiableRootModel + +fun addModuleDependencyIfNeeded( + rootModel: ModifiableRootModel, + dependeeModule: Module, + testScope: Boolean +) { + val dependencyScope = if (testScope) DependencyScope.TEST else DependencyScope.COMPILE + val existingEntry = rootModel.findModuleOrderEntry(dependeeModule) + if (existingEntry != null && existingEntry.scope == dependencyScope) return + rootModel.addModuleOrderEntry(dependeeModule).also { it.scope = dependencyScope } +} \ No newline at end of file diff --git a/idea/src/META-INF/gradle-java.xml b/idea/src/META-INF/gradle-java.xml index e32d376768d..13b8ede8531 100644 --- a/idea/src/META-INF/gradle-java.xml +++ b/idea/src/META-INF/gradle-java.xml @@ -20,6 +20,7 @@ + + + +