Skip to content

Commit 58046ae

Browse files
asedunovausatiy
authored andcommittedNov 8, 2018
MPP: Support MPP-dependent Java modules in Android projects
#KT-27265 Fixed (cherry picked from commit fea397a)
1 parent 615d801 commit 58046ae

4 files changed

+220
-64
lines changed
 

‎idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt

+55-16
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package org.jetbrains.kotlin.android.configure
77

8-
import com.android.tools.idea.gradle.project.model.AndroidModuleModel
8+
import com.android.tools.idea.gradle.project.sync.idea.data.service.AndroidProjectKeys
99
import com.android.tools.idea.gradle.util.ContentEntries.findParentContentEntry
1010
import com.android.tools.idea.io.FilePaths
1111
import com.intellij.openapi.externalSystem.model.DataNode
@@ -17,6 +17,7 @@ import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjec
1717
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
1818
import com.intellij.openapi.module.Module
1919
import com.intellij.openapi.project.Project
20+
import com.intellij.openapi.roots.DependencyScope
2021
import com.intellij.openapi.roots.ModifiableRootModel
2122
import com.intellij.util.SmartList
2223
import com.intellij.util.containers.stream
@@ -59,7 +60,9 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
5960
}
6061
}
6162
}
62-
val androidModel = module.getAndroidModel(modelsProvider) ?: continue
63+
addExtraDependeeModules(nodeToImport, projectNode, modelsProvider, rootModel, false)
64+
addExtraDependeeModules(nodeToImport, projectNode, modelsProvider, rootModel, true)
65+
val androidModel = getAndroidModuleModel(nodeToImport) ?: continue
6366
val variantName = androidModel.selectedVariant.name
6467
val activeSourceSetInfos = nodeToImport.kotlinAndroidSourceSets?.filter { it.kotlinModule.name.startsWith(variantName) } ?: emptyList()
6568
for (activeSourceSetInfo in activeSourceSetInfos) {
@@ -75,8 +78,6 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
7578
}
7679
}
7780
}
78-
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, false)
79-
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, true)
8081

8182
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
8283
if (mainSourceSetInfo != null) {
@@ -90,32 +91,64 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
9091
}
9192
}
9293

94+
private fun getDependeeModuleNodes(
95+
moduleNode: DataNode<ModuleData>,
96+
projectNode: DataNode<ProjectData>,
97+
modelsProvider: IdeModifiableModelsProvider,
98+
testScope: Boolean
99+
): List<DataNode<out ModuleData>> {
100+
val androidModel = getAndroidModuleModel(moduleNode)
101+
if (androidModel != null) {
102+
val dependencies = if (testScope) {
103+
androidModel.selectedAndroidTestCompileDependencies
104+
} else {
105+
androidModel.selectedMainCompileLevel2Dependencies
106+
} ?: return emptyList()
107+
return dependencies
108+
.moduleDependencies
109+
.mapNotNull { projectNode.findChildModuleById(it.projectPath) }
110+
}
111+
112+
val javaModel = getJavaModuleModel(moduleNode)
113+
if (javaModel != null) {
114+
val scope = if (testScope) DependencyScope.TEST.name else DependencyScope.COMPILE.name
115+
val moduleNames = javaModel
116+
.javaModuleDependencies
117+
.filter { scope == it.scope ?: DependencyScope.COMPILE.name }
118+
.mapTo(HashSet()) { it.moduleName }
119+
return ExternalSystemApiUtil
120+
.getChildren(projectNode, ProjectKeys.MODULE)
121+
.filter { modelsProvider.findIdeModule(it.data)?.name in moduleNames }
122+
}
123+
124+
return emptyList()
125+
}
126+
127+
private fun List<DataNode<GradleSourceSetData>>.firstByPlatformOrNull(platform: KotlinPlatform) = firstOrNull {
128+
it.kotlinSourceSet?.platform == platform
129+
}
130+
93131
private fun addExtraDependeeModules(
94-
androidModel: AndroidModuleModel,
132+
moduleNode: DataNode<ModuleData>,
95133
projectNode: DataNode<ProjectData>,
96134
modelsProvider: IdeModifiableModelsProvider,
97135
rootModel: ModifiableRootModel,
98136
testScope: Boolean
99137
) {
100-
val dependencies = if (testScope) {
101-
androidModel.selectedAndroidTestCompileDependencies
102-
} else {
103-
androidModel.selectedMainCompileLevel2Dependencies
104-
} ?: return
105-
val commonSourceSetName = KotlinSourceSet.commonName(testScope)
106-
val relevantNodes = dependencies
107-
.moduleDependencies
108-
.mapNotNull { projectNode.findChildModuleById(it.projectPath) }
138+
val dependeeModuleNodes = getDependeeModuleNodes(moduleNode, projectNode, modelsProvider, testScope)
139+
val relevantNodes = dependeeModuleNodes
109140
.flatMap { ExternalSystemApiUtil.getChildren(it, GradleSourceSetData.KEY) }
110141
.filter {
111142
val ktModule = it.kotlinSourceSet?.kotlinModule
112143
ktModule != null && ktModule.isTestModule == testScope
113144
}
145+
val commonSourceSetName = KotlinSourceSet.commonName(testScope)
146+
val isAndroidModule = getAndroidModuleModel(moduleNode) != null
114147
SmartList<DataNode<GradleSourceSetData>>()
115148
.apply {
116149
addIfNotNull(
117-
relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.ANDROID }
118-
?: relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.JVM }
150+
(if (isAndroidModule) relevantNodes.firstByPlatformOrNull(KotlinPlatform.ANDROID) else null)
151+
?: relevantNodes.firstByPlatformOrNull(KotlinPlatform.JVM)
119152
)
120153
addIfNotNull(
121154
relevantNodes.firstOrNull {
@@ -133,6 +166,12 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
133166
}
134167
}
135168

169+
private fun getAndroidModuleModel(moduleNode: DataNode<ModuleData>) =
170+
ExternalSystemApiUtil.getChildren(moduleNode, AndroidProjectKeys.ANDROID_MODEL).firstOrNull()?.data
171+
172+
private fun getJavaModuleModel(moduleNode: DataNode<ModuleData>) =
173+
ExternalSystemApiUtil.getChildren(moduleNode, AndroidProjectKeys.JAVA_MODULE_MODEL).firstOrNull()?.data
174+
136175
private fun addSourceRoot(
137176
sourceRoot: File,
138177
type: JpsModuleSourceRootType<*>,

‎idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.181

+55-16
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package org.jetbrains.kotlin.android.configure
77

8-
import com.android.tools.idea.gradle.project.model.AndroidModuleModel
8+
import com.android.tools.idea.gradle.project.sync.idea.data.service.AndroidProjectKeys
99
import com.android.tools.idea.gradle.util.ContentEntries.findParentContentEntry
1010
import com.android.tools.idea.gradle.util.FilePaths
1111
import com.intellij.openapi.externalSystem.model.DataNode
@@ -17,6 +17,7 @@ import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjec
1717
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
1818
import com.intellij.openapi.module.Module
1919
import com.intellij.openapi.project.Project
20+
import com.intellij.openapi.roots.DependencyScope
2021
import com.intellij.openapi.roots.ModifiableRootModel
2122
import com.intellij.util.SmartList
2223
import com.intellij.util.containers.stream
@@ -59,7 +60,9 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
5960
}
6061
}
6162
}
62-
val androidModel = module.getAndroidModel(modelsProvider) ?: continue
63+
addExtraDependeeModules(nodeToImport, projectNode, modelsProvider, rootModel, false)
64+
addExtraDependeeModules(nodeToImport, projectNode, modelsProvider, rootModel, true)
65+
val androidModel = getAndroidModuleModel(nodeToImport) ?: continue
6366
val variantName = androidModel.selectedVariant.name
6467
val activeSourceSetInfos = nodeToImport.kotlinAndroidSourceSets?.filter { it.kotlinModule.name.startsWith(variantName) } ?: emptyList()
6568
for (activeSourceSetInfo in activeSourceSetInfos) {
@@ -75,8 +78,6 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
7578
}
7679
}
7780
}
78-
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, false)
79-
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, true)
8081

8182
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
8283
if (mainSourceSetInfo != null) {
@@ -90,32 +91,64 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
9091
}
9192
}
9293

94+
private fun getDependeeModuleNodes(
95+
moduleNode: DataNode<ModuleData>,
96+
projectNode: DataNode<ProjectData>,
97+
modelsProvider: IdeModifiableModelsProvider,
98+
testScope: Boolean
99+
): List<DataNode<out ModuleData>> {
100+
val androidModel = getAndroidModuleModel(moduleNode)
101+
if (androidModel != null) {
102+
val dependencies = if (testScope) {
103+
androidModel.selectedAndroidTestCompileDependencies
104+
} else {
105+
androidModel.selectedMainCompileLevel2Dependencies
106+
} ?: return emptyList()
107+
return dependencies
108+
.moduleDependencies
109+
.mapNotNull { projectNode.findChildModuleById(it.projectPath) }
110+
}
111+
112+
val javaModel = getJavaModuleModel(moduleNode)
113+
if (javaModel != null) {
114+
val scope = if (testScope) DependencyScope.TEST.name else DependencyScope.COMPILE.name
115+
val moduleNames = javaModel
116+
.javaModuleDependencies
117+
.filter { scope == it.scope ?: DependencyScope.COMPILE.name }
118+
.mapTo(HashSet()) { it.moduleName }
119+
return ExternalSystemApiUtil
120+
.getChildren(projectNode, ProjectKeys.MODULE)
121+
.filter { modelsProvider.findIdeModule(it.data)?.name in moduleNames }
122+
}
123+
124+
return emptyList()
125+
}
126+
127+
private fun List<DataNode<GradleSourceSetData>>.firstByPlatformOrNull(platform: KotlinPlatform) = firstOrNull {
128+
it.kotlinSourceSet?.platform == platform
129+
}
130+
93131
private fun addExtraDependeeModules(
94-
androidModel: AndroidModuleModel,
132+
moduleNode: DataNode<ModuleData>,
95133
projectNode: DataNode<ProjectData>,
96134
modelsProvider: IdeModifiableModelsProvider,
97135
rootModel: ModifiableRootModel,
98136
testScope: Boolean
99137
) {
100-
val dependencies = if (testScope) {
101-
androidModel.selectedAndroidTestCompileDependencies
102-
} else {
103-
androidModel.selectedMainCompileLevel2Dependencies
104-
} ?: return
105-
val commonSourceSetName = KotlinSourceSet.commonName(testScope)
106-
val relevantNodes = dependencies
107-
.moduleDependencies
108-
.mapNotNull { projectNode.findChildModuleById(it.projectPath) }
138+
val dependeeModuleNodes = getDependeeModuleNodes(moduleNode, projectNode, modelsProvider, testScope)
139+
val relevantNodes = dependeeModuleNodes
109140
.flatMap { ExternalSystemApiUtil.getChildren(it, GradleSourceSetData.KEY) }
110141
.filter {
111142
val ktModule = it.kotlinSourceSet?.kotlinModule
112143
ktModule != null && ktModule.isTestModule == testScope
113144
}
145+
val commonSourceSetName = KotlinSourceSet.commonName(testScope)
146+
val isAndroidModule = getAndroidModuleModel(moduleNode) != null
114147
SmartList<DataNode<GradleSourceSetData>>()
115148
.apply {
116149
addIfNotNull(
117-
relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.ANDROID }
118-
?: relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.JVM }
150+
(if (isAndroidModule) relevantNodes.firstByPlatformOrNull(KotlinPlatform.ANDROID) else null)
151+
?: relevantNodes.firstByPlatformOrNull(KotlinPlatform.JVM)
119152
)
120153
addIfNotNull(
121154
relevantNodes.firstOrNull {
@@ -133,6 +166,12 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
133166
}
134167
}
135168

169+
private fun getAndroidModuleModel(moduleNode: DataNode<ModuleData>) =
170+
ExternalSystemApiUtil.getChildren(moduleNode, AndroidProjectKeys.ANDROID_MODEL).firstOrNull()?.data
171+
172+
private fun getJavaModuleModel(moduleNode: DataNode<ModuleData>) =
173+
ExternalSystemApiUtil.getChildren(moduleNode, AndroidProjectKeys.JAVA_MODULE_MODEL).firstOrNull()?.data
174+
136175
private fun addSourceRoot(
137176
sourceRoot: File,
138177
type: JpsModuleSourceRootType<*>,

‎idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as31

+55-16
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package org.jetbrains.kotlin.android.configure
77

8-
import com.android.tools.idea.gradle.project.model.AndroidModuleModel
8+
import com.android.tools.idea.gradle.project.sync.idea.data.service.AndroidProjectKeys
99
import com.android.tools.idea.gradle.util.ContentEntries.findParentContentEntry
1010
import com.android.tools.idea.io.FilePaths
1111
import com.intellij.openapi.externalSystem.model.DataNode
@@ -18,6 +18,7 @@ import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjec
1818
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
1919
import com.intellij.openapi.module.Module
2020
import com.intellij.openapi.project.Project
21+
import com.intellij.openapi.roots.DependencyScope
2122
import com.intellij.openapi.roots.ModifiableRootModel
2223
import com.intellij.util.SmartList
2324
import com.intellij.util.containers.stream
@@ -69,7 +70,9 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
6970
}
7071
}
7172
}
72-
val androidModel = module.getAndroidModel(modelsProvider) ?: continue
73+
addExtraDependeeModules(nodeToImport, projectNode, modelsProvider, rootModel, false)
74+
addExtraDependeeModules(nodeToImport, projectNode, modelsProvider, rootModel, true)
75+
val androidModel = getAndroidModuleModel(nodeToImport) ?: continue
7376
val variantName = androidModel.selectedVariant.name
7477
val activeSourceSetInfos = nodeToImport.kotlinAndroidSourceSets?.filter { it.kotlinModule.name.startsWith(variantName) } ?: emptyList()
7578
for (activeSourceSetInfo in activeSourceSetInfos) {
@@ -85,8 +88,6 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
8588
}
8689
}
8790
}
88-
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, false)
89-
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, true)
9091

9192
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
9293
if (mainSourceSetInfo != null) {
@@ -100,32 +101,64 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
100101
}
101102
}
102103

104+
private fun getDependeeModuleNodes(
105+
moduleNode: DataNode<ModuleData>,
106+
projectNode: DataNode<ProjectData>,
107+
modelsProvider: IdeModifiableModelsProvider,
108+
testScope: Boolean
109+
): List<DataNode<out ModuleData>> {
110+
val androidModel = getAndroidModuleModel(moduleNode)
111+
if (androidModel != null) {
112+
val dependencies = if (testScope) {
113+
androidModel.selectedAndroidTestCompileDependencies
114+
} else {
115+
androidModel.selectedMainCompileLevel2Dependencies
116+
} ?: return emptyList()
117+
return dependencies
118+
.moduleDependencies
119+
.mapNotNull { projectNode.findChildModuleById(it.projectPath) }
120+
}
121+
122+
val javaModel = getJavaModuleModel(moduleNode)
123+
if (javaModel != null) {
124+
val scope = if (testScope) DependencyScope.TEST.name else DependencyScope.COMPILE.name
125+
val moduleNames = javaModel
126+
.javaModuleDependencies
127+
.filter { scope == it.scope ?: DependencyScope.COMPILE.name }
128+
.mapTo(HashSet()) { it.moduleName }
129+
return ExternalSystemApiUtil
130+
.getChildren(projectNode, ProjectKeys.MODULE)
131+
.filter { modelsProvider.findIdeModule(it.data)?.name in moduleNames }
132+
}
133+
134+
return emptyList()
135+
}
136+
137+
private fun List<DataNode<GradleSourceSetData>>.firstByPlatformOrNull(platform: KotlinPlatform) = firstOrNull {
138+
it.kotlinSourceSet?.platform == platform
139+
}
140+
103141
private fun addExtraDependeeModules(
104-
androidModel: AndroidModuleModel,
142+
moduleNode: DataNode<ModuleData>,
105143
projectNode: DataNode<ProjectData>,
106144
modelsProvider: IdeModifiableModelsProvider,
107145
rootModel: ModifiableRootModel,
108146
testScope: Boolean
109147
) {
110-
val dependencies = if (testScope) {
111-
androidModel.selectedAndroidTestCompileDependencies
112-
} else {
113-
androidModel.selectedMainCompileLevel2Dependencies
114-
} ?: return
115-
val commonSourceSetName = KotlinSourceSet.commonName(testScope)
116-
val relevantNodes = dependencies
117-
.moduleDependencies
118-
.mapNotNull { projectNode.findChildModuleById(it.projectPath) }
148+
val dependeeModuleNodes = getDependeeModuleNodes(moduleNode, projectNode, modelsProvider, testScope)
149+
val relevantNodes = dependeeModuleNodes
119150
.flatMap { ExternalSystemApiUtil.getChildren(it, GradleSourceSetData.KEY) }
120151
.filter {
121152
val ktModule = it.kotlinSourceSet?.kotlinModule
122153
ktModule != null && ktModule.isTestModule == testScope
123154
}
155+
val commonSourceSetName = KotlinSourceSet.commonName(testScope)
156+
val isAndroidModule = getAndroidModuleModel(moduleNode) != null
124157
SmartList<DataNode<GradleSourceSetData>>()
125158
.apply {
126159
addIfNotNull(
127-
relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.ANDROID }
128-
?: relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.JVM }
160+
(if (isAndroidModule) relevantNodes.firstByPlatformOrNull(KotlinPlatform.ANDROID) else null)
161+
?: relevantNodes.firstByPlatformOrNull(KotlinPlatform.JVM)
129162
)
130163
addIfNotNull(
131164
relevantNodes.firstOrNull {
@@ -143,6 +176,12 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
143176
}
144177
}
145178

179+
private fun getAndroidModuleModel(moduleNode: DataNode<ModuleData>) =
180+
ExternalSystemApiUtil.getChildren(moduleNode, AndroidProjectKeys.ANDROID_MODEL).firstOrNull()?.data
181+
182+
private fun getJavaModuleModel(moduleNode: DataNode<ModuleData>) =
183+
ExternalSystemApiUtil.getChildren(moduleNode, AndroidProjectKeys.JAVA_MODULE_MODEL).firstOrNull()?.data
184+
146185
private fun addSourceRoot(
147186
sourceRoot: File,
148187
type: JpsModuleSourceRootType<*>,

‎idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleMPPModuleDataService.kt.as32

+55-16
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package org.jetbrains.kotlin.android.configure
77

8-
import com.android.tools.idea.gradle.project.model.AndroidModuleModel
8+
import com.android.tools.idea.gradle.project.sync.idea.data.service.AndroidProjectKeys
99
import com.android.tools.idea.gradle.util.ContentEntries.findParentContentEntry
1010
import com.android.tools.idea.io.FilePaths
1111
import com.intellij.openapi.externalSystem.model.DataNode
@@ -17,6 +17,7 @@ import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjec
1717
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
1818
import com.intellij.openapi.module.Module
1919
import com.intellij.openapi.project.Project
20+
import com.intellij.openapi.roots.DependencyScope
2021
import com.intellij.openapi.roots.ModifiableRootModel
2122
import com.intellij.util.SmartList
2223
import com.intellij.util.containers.stream
@@ -59,7 +60,9 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
5960
}
6061
}
6162
}
62-
val androidModel = module.getAndroidModel(modelsProvider) ?: continue
63+
addExtraDependeeModules(nodeToImport, projectNode, modelsProvider, rootModel, false)
64+
addExtraDependeeModules(nodeToImport, projectNode, modelsProvider, rootModel, true)
65+
val androidModel = getAndroidModuleModel(nodeToImport) ?: continue
6366
val variantName = androidModel.selectedVariant.name
6467
val activeSourceSetInfos = nodeToImport.kotlinAndroidSourceSets?.filter { it.kotlinModule.name.startsWith(variantName) } ?: emptyList()
6568
for (activeSourceSetInfo in activeSourceSetInfos) {
@@ -75,8 +78,6 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
7578
}
7679
}
7780
}
78-
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, false)
79-
addExtraDependeeModules(androidModel, projectNode, modelsProvider, rootModel, true)
8081

8182
val mainSourceSetInfo = activeSourceSetInfos.firstOrNull { it.kotlinModule.name == variantName }
8283
if (mainSourceSetInfo != null) {
@@ -90,32 +91,64 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
9091
}
9192
}
9293

94+
private fun getDependeeModuleNodes(
95+
moduleNode: DataNode<ModuleData>,
96+
projectNode: DataNode<ProjectData>,
97+
modelsProvider: IdeModifiableModelsProvider,
98+
testScope: Boolean
99+
): List<DataNode<out ModuleData>> {
100+
val androidModel = getAndroidModuleModel(moduleNode)
101+
if (androidModel != null) {
102+
val dependencies = if (testScope) {
103+
androidModel.selectedAndroidTestCompileDependencies
104+
} else {
105+
androidModel.selectedMainCompileLevel2Dependencies
106+
} ?: return emptyList()
107+
return dependencies
108+
.moduleDependencies
109+
.mapNotNull { projectNode.findChildModuleById(it.projectPath) }
110+
}
111+
112+
val javaModel = getJavaModuleModel(moduleNode)
113+
if (javaModel != null) {
114+
val scope = if (testScope) DependencyScope.TEST.name else DependencyScope.COMPILE.name
115+
val moduleNames = javaModel
116+
.javaModuleDependencies
117+
.filter { scope == it.scope ?: DependencyScope.COMPILE.name }
118+
.mapTo(HashSet()) { it.moduleName }
119+
return ExternalSystemApiUtil
120+
.getChildren(projectNode, ProjectKeys.MODULE)
121+
.filter { modelsProvider.findIdeModule(it.data)?.name in moduleNames }
122+
}
123+
124+
return emptyList()
125+
}
126+
127+
private fun List<DataNode<GradleSourceSetData>>.firstByPlatformOrNull(platform: KotlinPlatform) = firstOrNull {
128+
it.kotlinSourceSet?.platform == platform
129+
}
130+
93131
private fun addExtraDependeeModules(
94-
androidModel: AndroidModuleModel,
132+
moduleNode: DataNode<ModuleData>,
95133
projectNode: DataNode<ProjectData>,
96134
modelsProvider: IdeModifiableModelsProvider,
97135
rootModel: ModifiableRootModel,
98136
testScope: Boolean
99137
) {
100-
val dependencies = if (testScope) {
101-
androidModel.selectedAndroidTestCompileDependencies
102-
} else {
103-
androidModel.selectedMainCompileLevel2Dependencies
104-
} ?: return
105-
val commonSourceSetName = KotlinSourceSet.commonName(testScope)
106-
val relevantNodes = dependencies
107-
.moduleDependencies
108-
.mapNotNull { projectNode.findChildModuleById(it.projectPath) }
138+
val dependeeModuleNodes = getDependeeModuleNodes(moduleNode, projectNode, modelsProvider, testScope)
139+
val relevantNodes = dependeeModuleNodes
109140
.flatMap { ExternalSystemApiUtil.getChildren(it, GradleSourceSetData.KEY) }
110141
.filter {
111142
val ktModule = it.kotlinSourceSet?.kotlinModule
112143
ktModule != null && ktModule.isTestModule == testScope
113144
}
145+
val commonSourceSetName = KotlinSourceSet.commonName(testScope)
146+
val isAndroidModule = getAndroidModuleModel(moduleNode) != null
114147
SmartList<DataNode<GradleSourceSetData>>()
115148
.apply {
116149
addIfNotNull(
117-
relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.ANDROID }
118-
?: relevantNodes.firstOrNull { it.kotlinSourceSet?.platform == KotlinPlatform.JVM }
150+
(if (isAndroidModule) relevantNodes.firstByPlatformOrNull(KotlinPlatform.ANDROID) else null)
151+
?: relevantNodes.firstByPlatformOrNull(KotlinPlatform.JVM)
119152
)
120153
addIfNotNull(
121154
relevantNodes.firstOrNull {
@@ -133,6 +166,12 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
133166
}
134167
}
135168

169+
private fun getAndroidModuleModel(moduleNode: DataNode<ModuleData>) =
170+
ExternalSystemApiUtil.getChildren(moduleNode, AndroidProjectKeys.ANDROID_MODEL).firstOrNull()?.data
171+
172+
private fun getJavaModuleModel(moduleNode: DataNode<ModuleData>) =
173+
ExternalSystemApiUtil.getChildren(moduleNode, AndroidProjectKeys.JAVA_MODULE_MODEL).firstOrNull()?.data
174+
136175
private fun addSourceRoot(
137176
sourceRoot: File,
138177
type: JpsModuleSourceRootType<*>,

0 commit comments

Comments
 (0)
Please sign in to comment.