MPP: Add MPP source roots to dependent non-MPP module

#KT-27365 Fixed
This commit is contained in:
Alexey Sedunov
2018-10-02 22:44:59 +03:00
parent 558345b057
commit 3a0e539eee
10 changed files with 94 additions and 48 deletions
@@ -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>,
@@ -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>,
@@ -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>,
@@ -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 }
}
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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