MPP: Add MPP source roots to dependent non-MPP module
#KT-27365 Fixed
This commit is contained in:
+1
-12
@@ -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<Modul
|
||||
}
|
||||
}
|
||||
|
||||
private 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 }
|
||||
}
|
||||
|
||||
private fun addExtraDependeeModules(
|
||||
androidModel: AndroidModuleModel,
|
||||
projectNode: DataNode<ProjectData>,
|
||||
|
||||
+1
-12
@@ -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<Modul
|
||||
}
|
||||
}
|
||||
|
||||
private 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 }
|
||||
}
|
||||
|
||||
private fun addExtraDependeeModules(
|
||||
androidModel: AndroidModuleModel,
|
||||
projectNode: DataNode<ProjectData>,
|
||||
|
||||
+1
-12
@@ -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<Modul
|
||||
}
|
||||
}
|
||||
|
||||
private 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 }
|
||||
}
|
||||
|
||||
private fun addExtraDependeeModules(
|
||||
androidModel: AndroidModuleModel,
|
||||
projectNode: DataNode<ProjectData>,
|
||||
|
||||
+1
-12
@@ -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<Modul
|
||||
}
|
||||
}
|
||||
|
||||
private 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 }
|
||||
}
|
||||
|
||||
private fun addExtraDependeeModules(
|
||||
androidModel: AndroidModuleModel,
|
||||
projectNode: DataNode<ProjectData>,
|
||||
|
||||
@@ -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<GradleSourceSetData, Void>() {
|
||||
override fun getTargetDataKey() = GradleSourceSetData.KEY
|
||||
|
||||
override fun postProcess(
|
||||
toImport: MutableCollection<DataNode<GradleSourceSetData>>,
|
||||
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<LibraryOrderEntry>()
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 }
|
||||
}
|
||||
@@ -20,6 +20,7 @@
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinTargetDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.KotlinJavaMPPSourceSetDataService"/>
|
||||
<externalSystemTaskNotificationListener implementation="org.jetbrains.kotlin.idea.core.script.ReloadGradleTemplatesOnSync"/>
|
||||
|
||||
<localInspection
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleLibraryDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinTargetDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.KotlinJavaMPPSourceSetDataService"/>
|
||||
<externalSystemTaskNotificationListener implementation="org.jetbrains.kotlin.idea.core.script.ReloadGradleTemplatesOnSync"/>
|
||||
|
||||
<localInspection
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinTargetDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.KotlinJavaMPPSourceSetDataService"/>
|
||||
<externalSystemTaskNotificationListener implementation="org.jetbrains.kotlin.idea.core.script.ReloadGradleTemplatesOnSync"/>
|
||||
|
||||
<localInspection
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinTargetDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.KotlinJavaMPPSourceSetDataService"/>
|
||||
<externalSystemTaskNotificationListener implementation="org.jetbrains.kotlin.idea.core.script.ReloadGradleTemplatesOnSync"/>
|
||||
|
||||
<localInspection
|
||||
|
||||
Reference in New Issue
Block a user