Correctly propagate dependencies in multiplatform projects with Android

This commit is contained in:
Dmitry Jemerov
2017-10-22 15:50:18 +02:00
parent cc85ac44b3
commit 81615fa551
5 changed files with 154 additions and 16 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ dependencies {
compile(ideaSdkDeps("openapi", "idea"))
compile(ideaPluginDeps("gradle-tooling-api", plugin = "gradle"))
compile(ideaPluginDeps("android", "android-common", "sdklib", "sdk-common", "layoutlib-api", plugin = "android"))
compile(ideaPluginDeps("android", "android-common", "sdklib", "sdk-common", "sdk-tools", "layoutlib-api", plugin = "android"))
compile(preloadedDeps("dx", subdir = "android-5.0/lib"))
testCompile(projectDist(":kotlin-test:kotlin-test-jvm"))
@@ -34,8 +34,12 @@ package org.jetbrains.kotlin.android.configure
import com.android.tools.idea.gradle.project.sync.idea.data.service.AndroidProjectKeys
import com.intellij.openapi.externalSystem.model.DataNode
import com.intellij.openapi.externalSystem.model.project.ModuleData
import com.intellij.openapi.externalSystem.model.project.ProjectData
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import org.gradle.tooling.model.idea.IdeaProject
import org.jetbrains.kotlin.idea.inspections.gradle.KotlinGradleModelFacade
import org.jetbrains.kotlin.idea.inspections.gradle.findModulesByNames
class AndroidGradleModelFacade : KotlinGradleModelFacade {
override fun getResolvedKotlinStdlibVersionByModuleData(moduleData: DataNode<*>, libraryIds: List<String>): String? {
@@ -51,4 +55,24 @@ class AndroidGradleModelFacade : KotlinGradleModelFacade {
}
return null
}
}
override fun getDependencyModules(ideModule: DataNode<ModuleData>, gradleIdeaProject: IdeaProject): Collection<DataNode<ModuleData>> {
val ideProject = ideModule.parent as DataNode<ProjectData>
ExternalSystemApiUtil.find(ideModule, AndroidProjectKeys.JAVA_MODULE_MODEL)?.let { javaModuleModel ->
val moduleNames = javaModuleModel.data.javaModuleDependencies.map { it.moduleName }
return findModulesByNames(moduleNames, gradleIdeaProject, ideProject)
}
ExternalSystemApiUtil.find(ideModule, AndroidProjectKeys.ANDROID_MODEL)?.let { androidModel ->
val libraries = androidModel.data.mainArtifact.dependencies.javaLibraries
val projects = androidModel.data.mainArtifact.dependencies.projects
val projectIds = libraries.mapNotNull { it.project } + projects
return projectIds.mapNotNullTo(LinkedHashSet()) { projectId ->
ExternalSystemApiUtil.findFirstRecursively(ideProject) {
(it.data as? ModuleData)?.id == projectId
} as DataNode<ModuleData>?
}
}
return emptyList()
}
}