MPP: Add MPP sources roots to dependent Android module
#KT-27331 Fixed
This commit is contained in:
+63
-7
@@ -23,16 +23,18 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.roots.DependencyScope
|
import com.intellij.openapi.roots.DependencyScope
|
||||||
import com.intellij.openapi.roots.ModifiableRootModel
|
import com.intellij.openapi.roots.ModifiableRootModel
|
||||||
import com.intellij.openapi.vfs.VfsUtil
|
import com.intellij.openapi.vfs.VfsUtil
|
||||||
|
import com.intellij.util.SmartList
|
||||||
import com.intellij.util.containers.stream
|
import com.intellij.util.containers.stream
|
||||||
import org.jetbrains.jps.model.java.JavaResourceRootType
|
import org.jetbrains.jps.model.java.JavaResourceRootType
|
||||||
import org.jetbrains.jps.model.java.JavaSourceRootType
|
import org.jetbrains.jps.model.java.JavaSourceRootType
|
||||||
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
||||||
import org.jetbrains.kotlin.gradle.KotlinCompilation
|
import org.jetbrains.kotlin.gradle.KotlinCompilation
|
||||||
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
||||||
import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler
|
import org.jetbrains.kotlin.gradle.KotlinSourceSet
|
||||||
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService
|
import org.jetbrains.kotlin.idea.configuration.*
|
||||||
import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets
|
|
||||||
import org.jetbrains.kotlin.idea.facet.KotlinFacet
|
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.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
@@ -88,13 +90,13 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
|
|||||||
(it.data as? ModuleData)?.id == sourceSetId
|
(it.data as? ModuleData)?.id == sourceSetId
|
||||||
}?.data as? ModuleData ?: continue
|
}?.data as? ModuleData ?: continue
|
||||||
val sourceSetModule = modelsProvider.findIdeModule(sourceSetData) ?: continue
|
val sourceSetModule = modelsProvider.findIdeModule(sourceSetData) ?: continue
|
||||||
val existingEntry = rootModel.findModuleOrderEntry(sourceSetModule)
|
addModuleDependencyIfNeeded(rootModel, sourceSetModule, activeSourceSetInfo.isTestModule)
|
||||||
val dependencyScope = if (activeSourceSetInfo.isTestModule) DependencyScope.TEST else DependencyScope.COMPILE
|
|
||||||
if (existingEntry != null && existingEntry.scope == dependencyScope) continue
|
|
||||||
rootModel.addModuleOrderEntry(sourceSetModule).also { it.scope = dependencyScope }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, false)
|
||||||
|
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, true)
|
||||||
|
|
||||||
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
|
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
|
||||||
if (mainSourceSetInfo != null) {
|
if (mainSourceSetInfo != null) {
|
||||||
KotlinSourceSetDataService.configureFacet(moduleData, mainSourceSetInfo, nodeToImport, module, modelsProvider)
|
KotlinSourceSetDataService.configureFacet(moduleData, mainSourceSetInfo, nodeToImport, module, modelsProvider)
|
||||||
@@ -107,6 +109,60 @@ 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>,
|
||||||
|
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<DataNode<GradleSourceSetData>>()
|
||||||
|
.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(
|
private fun addSourceRoot(
|
||||||
sourceRoot: File,
|
sourceRoot: File,
|
||||||
type: JpsModuleSourceRootType<*>,
|
type: JpsModuleSourceRootType<*>,
|
||||||
|
|||||||
+63
-7
@@ -23,16 +23,18 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.roots.DependencyScope
|
import com.intellij.openapi.roots.DependencyScope
|
||||||
import com.intellij.openapi.roots.ModifiableRootModel
|
import com.intellij.openapi.roots.ModifiableRootModel
|
||||||
import com.intellij.openapi.vfs.VfsUtil
|
import com.intellij.openapi.vfs.VfsUtil
|
||||||
|
import com.intellij.util.SmartList
|
||||||
import com.intellij.util.containers.stream
|
import com.intellij.util.containers.stream
|
||||||
import org.jetbrains.jps.model.java.JavaResourceRootType
|
import org.jetbrains.jps.model.java.JavaResourceRootType
|
||||||
import org.jetbrains.jps.model.java.JavaSourceRootType
|
import org.jetbrains.jps.model.java.JavaSourceRootType
|
||||||
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
||||||
import org.jetbrains.kotlin.gradle.KotlinCompilation
|
import org.jetbrains.kotlin.gradle.KotlinCompilation
|
||||||
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
||||||
import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler
|
import org.jetbrains.kotlin.gradle.KotlinSourceSet
|
||||||
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService
|
import org.jetbrains.kotlin.idea.configuration.*
|
||||||
import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets
|
|
||||||
import org.jetbrains.kotlin.idea.facet.KotlinFacet
|
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.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
@@ -88,13 +90,13 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
|
|||||||
(it.data as? ModuleData)?.id == sourceSetId
|
(it.data as? ModuleData)?.id == sourceSetId
|
||||||
}?.data as? ModuleData ?: continue
|
}?.data as? ModuleData ?: continue
|
||||||
val sourceSetModule = modelsProvider.findIdeModule(sourceSetData) ?: continue
|
val sourceSetModule = modelsProvider.findIdeModule(sourceSetData) ?: continue
|
||||||
val existingEntry = rootModel.findModuleOrderEntry(sourceSetModule)
|
addModuleDependencyIfNeeded(rootModel, sourceSetModule, activeSourceSetInfo.isTestModule)
|
||||||
val dependencyScope = if (activeSourceSetInfo.isTestModule) DependencyScope.TEST else DependencyScope.COMPILE
|
|
||||||
if (existingEntry != null && existingEntry.scope == dependencyScope) continue
|
|
||||||
rootModel.addModuleOrderEntry(sourceSetModule).also { it.scope = dependencyScope }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, false)
|
||||||
|
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, true)
|
||||||
|
|
||||||
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
|
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
|
||||||
if (mainSourceSetInfo != null) {
|
if (mainSourceSetInfo != null) {
|
||||||
KotlinSourceSetDataService.configureFacet(moduleData, mainSourceSetInfo, nodeToImport, module, modelsProvider)
|
KotlinSourceSetDataService.configureFacet(moduleData, mainSourceSetInfo, nodeToImport, module, modelsProvider)
|
||||||
@@ -107,6 +109,60 @@ 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>,
|
||||||
|
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<DataNode<GradleSourceSetData>>()
|
||||||
|
.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(
|
private fun addSourceRoot(
|
||||||
sourceRoot: File,
|
sourceRoot: File,
|
||||||
type: JpsModuleSourceRootType<*>,
|
type: JpsModuleSourceRootType<*>,
|
||||||
|
|||||||
+62
-10
@@ -25,18 +25,18 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.roots.DependencyScope
|
import com.intellij.openapi.roots.DependencyScope
|
||||||
import com.intellij.openapi.roots.ModifiableRootModel
|
import com.intellij.openapi.roots.ModifiableRootModel
|
||||||
import com.intellij.openapi.vfs.VfsUtil
|
import com.intellij.openapi.vfs.VfsUtil
|
||||||
|
import com.intellij.util.SmartList
|
||||||
import com.intellij.util.containers.stream
|
import com.intellij.util.containers.stream
|
||||||
import org.jetbrains.jps.model.java.JavaResourceRootType
|
import org.jetbrains.jps.model.java.JavaResourceRootType
|
||||||
import org.jetbrains.jps.model.java.JavaSourceRootType
|
import org.jetbrains.jps.model.java.JavaSourceRootType
|
||||||
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
||||||
import org.jetbrains.kotlin.gradle.KotlinCompilation
|
import org.jetbrains.kotlin.gradle.KotlinCompilation
|
||||||
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
||||||
import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet
|
import org.jetbrains.kotlin.gradle.KotlinSourceSet
|
||||||
import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler
|
import org.jetbrains.kotlin.idea.configuration.*
|
||||||
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.idea.facet.KotlinFacet
|
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.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
@@ -101,13 +101,13 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
|
|||||||
(it.data as? ModuleData)?.id == sourceSetId
|
(it.data as? ModuleData)?.id == sourceSetId
|
||||||
}?.data as? ModuleData ?: continue
|
}?.data as? ModuleData ?: continue
|
||||||
val sourceSetModule = modelsProvider.findIdeModule(sourceSetData) ?: continue
|
val sourceSetModule = modelsProvider.findIdeModule(sourceSetData) ?: continue
|
||||||
val existingEntry = rootModel.findModuleOrderEntry(sourceSetModule)
|
addModuleDependencyIfNeeded(rootModel, sourceSetModule, activeSourceSetInfo.isTestModule)
|
||||||
val dependencyScope = if (activeSourceSetInfo.isTestModule) DependencyScope.TEST else DependencyScope.COMPILE
|
|
||||||
if (existingEntry != null && existingEntry.scope == dependencyScope) continue
|
|
||||||
rootModel.addModuleOrderEntry(sourceSetModule).also { it.scope = dependencyScope }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, false)
|
||||||
|
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, true)
|
||||||
|
|
||||||
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
|
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
|
||||||
if (mainSourceSetInfo != null) {
|
if (mainSourceSetInfo != null) {
|
||||||
KotlinSourceSetDataService.configureFacet(moduleData, mainSourceSetInfo, nodeToImport, module, modelsProvider)
|
KotlinSourceSetDataService.configureFacet(moduleData, mainSourceSetInfo, nodeToImport, module, modelsProvider)
|
||||||
@@ -118,8 +118,60 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
|
|||||||
GradleProjectImportHandler.getInstances(project).forEach { it.importByModule(kotlinFacet, nodeToImport) }
|
GradleProjectImportHandler.getInstances(project).forEach { it.importByModule(kotlinFacet, nodeToImport) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ContentRootDataService().importData(contentRootsToImport, projectData, project, modelsProvider)
|
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>,
|
||||||
|
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<DataNode<GradleSourceSetData>>()
|
||||||
|
.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(
|
private fun addSourceRoot(
|
||||||
|
|||||||
+63
-7
@@ -23,16 +23,18 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.roots.DependencyScope
|
import com.intellij.openapi.roots.DependencyScope
|
||||||
import com.intellij.openapi.roots.ModifiableRootModel
|
import com.intellij.openapi.roots.ModifiableRootModel
|
||||||
import com.intellij.openapi.vfs.VfsUtil
|
import com.intellij.openapi.vfs.VfsUtil
|
||||||
|
import com.intellij.util.SmartList
|
||||||
import com.intellij.util.containers.stream
|
import com.intellij.util.containers.stream
|
||||||
import org.jetbrains.jps.model.java.JavaResourceRootType
|
import org.jetbrains.jps.model.java.JavaResourceRootType
|
||||||
import org.jetbrains.jps.model.java.JavaSourceRootType
|
import org.jetbrains.jps.model.java.JavaSourceRootType
|
||||||
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
||||||
import org.jetbrains.kotlin.gradle.KotlinCompilation
|
import org.jetbrains.kotlin.gradle.KotlinCompilation
|
||||||
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
import org.jetbrains.kotlin.gradle.KotlinPlatform
|
||||||
import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler
|
import org.jetbrains.kotlin.gradle.KotlinSourceSet
|
||||||
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService
|
import org.jetbrains.kotlin.idea.configuration.*
|
||||||
import org.jetbrains.kotlin.idea.configuration.kotlinAndroidSourceSets
|
|
||||||
import org.jetbrains.kotlin.idea.facet.KotlinFacet
|
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.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
@@ -88,13 +90,13 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
|
|||||||
(it.data as? ModuleData)?.id == sourceSetId
|
(it.data as? ModuleData)?.id == sourceSetId
|
||||||
}?.data as? ModuleData ?: continue
|
}?.data as? ModuleData ?: continue
|
||||||
val sourceSetModule = modelsProvider.findIdeModule(sourceSetData) ?: continue
|
val sourceSetModule = modelsProvider.findIdeModule(sourceSetData) ?: continue
|
||||||
val existingEntry = rootModel.findModuleOrderEntry(sourceSetModule)
|
addModuleDependencyIfNeeded(rootModel, sourceSetModule, activeSourceSetInfo.isTestModule)
|
||||||
val dependencyScope = if (activeSourceSetInfo.isTestModule) DependencyScope.TEST else DependencyScope.COMPILE
|
|
||||||
if (existingEntry != null && existingEntry.scope == dependencyScope) continue
|
|
||||||
rootModel.addModuleOrderEntry(sourceSetModule).also { it.scope = dependencyScope }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, false)
|
||||||
|
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, true)
|
||||||
|
|
||||||
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
|
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
|
||||||
if (mainSourceSetInfo != null) {
|
if (mainSourceSetInfo != null) {
|
||||||
KotlinSourceSetDataService.configureFacet(moduleData, mainSourceSetInfo, nodeToImport, module, modelsProvider)
|
KotlinSourceSetDataService.configureFacet(moduleData, mainSourceSetInfo, nodeToImport, module, modelsProvider)
|
||||||
@@ -107,6 +109,60 @@ 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>,
|
||||||
|
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<DataNode<GradleSourceSetData>>()
|
||||||
|
.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(
|
private fun addSourceRoot(
|
||||||
sourceRoot: File,
|
sourceRoot: File,
|
||||||
type: JpsModuleSourceRootType<*>,
|
type: JpsModuleSourceRootType<*>,
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ interface KotlinSourceSet : KotlinModule {
|
|||||||
companion object {
|
companion object {
|
||||||
const val COMMON_MAIN_SOURCE_SET_NAME = "commonMain"
|
const val COMMON_MAIN_SOURCE_SET_NAME = "commonMain"
|
||||||
const val COMMON_TEST_SOURCE_SET_NAME = "commonTest"
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user