From b1419e2a8cadfdea68cad3e165941a0de9793bd5 Mon Sep 17 00:00:00 2001 From: Nikita Skvortsov Date: Mon, 12 Feb 2018 18:22:59 +0300 Subject: [PATCH] fix import of `expectedBy` scope dependencies inside composite builds --- .../KotlinGradleProjectResolverExtension.kt | 17 +++-- .../MultiplatformProjectImportingTest.kt | 62 +++++++++++++++++++ 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt index 174586cffb7..fc080736e35 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt @@ -134,9 +134,18 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() gradleIdeaProject.modules.firstOrNull { it.gradleProject.path == moduleNodeForGradleModel?.data?.id } } else gradleModule + val implementsModuleId = resolverCtx.getExtraProject(ideaModule, KotlinGradleModel::class.java)?.implements - val implementsInfo = resolverCtx.getExtraProject(ideaModule, KotlinGradleModel::class.java)?.implements - val targetModule = implementsInfo?.let { findModule(ideProject, it) } + val targetModule = implementsModuleId?.let { + val compositePrefix = if (resolverCtx.models.ideaProject != gradleModule.project + && it.startsWith(":")) { + gradleModule.project.name + } else { + "" + } + + findModuleById(ideProject, compositePrefix + it) + } if (targetModule != null) { if (useModulePerSourceSet()) { val targetSourceSetsByName = ExternalSystemApiUtil @@ -184,7 +193,7 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() ideProject: DataNode, gradleModel: KotlinGradleModel ) { - val implementedModule = gradleModel.implements?.let { findModule(ideProject, it) } ?: return + val implementedModule = gradleModel.implements?.let { findModuleById(ideProject, it) } ?: return if (resolverCtx.isResolveModulePerSourceSet) { val dependentSourceSets = dependentModule.getSourceSetsMap() val implementedSourceSets = implementedModule.getSourceSetsMap() @@ -211,7 +220,7 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() ideModule.createChild(ProjectKeys.MODULE_DEPENDENCY, moduleDependencyData) } - private fun findModule(ideProject: DataNode, moduleId: String): DataNode? { + private fun findModuleById(ideProject: DataNode, moduleId: String): DataNode? { return ideProject.children.find { (it.data as? ModuleData)?.id == moduleId } as DataNode? } } diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/MultiplatformProjectImportingTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/MultiplatformProjectImportingTest.kt index 18f7aa3b180..fc598a2f44a 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/MultiplatformProjectImportingTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/MultiplatformProjectImportingTest.kt @@ -118,6 +118,68 @@ class MultiplatformProjectImportingTest : GradleImportingTestCase() { assertModuleModuleDepScope("js_test", "common_test", DependencyScope.COMPILE) } + @Test + fun testPlatformToCommonExpectedByDependencyInComposite() { + createProjectSubFile("toInclude/settings.gradle", "include ':common', ':jvm', ':js'") + + val kotlinVersion = "1.2.0-beta-74" + + createProjectSubFile("toInclude/build.gradle", """ + buildscript { + repositories { + mavenCentral() + maven { url 'http://dl.bintray.com/kotlin/kotlin-dev' } + } + + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + } + } + + project('common') { + apply plugin: 'kotlin-platform-common' + } + + project('jvm') { + apply plugin: 'kotlin-platform-jvm' + + dependencies { + expectedBy project(':common') + } + } + + project('js') { + apply plugin: 'kotlin-platform-js' + + dependencies { + expectedBy project(':common') + } + } + """) + + createProjectSubFile("settings.gradle", "includeBuild('toInclude')") + createProjectSubFile("build.gradle", """ + buildscript { + repositories { + mavenCentral() + maven { url 'http://dl.bintray.com/kotlin/kotlin-dev' } + } + + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + } + } + + apply plugin: 'kotlin' + """.trimIndent()) + + importProject() + assertModuleModuleDepScope("jvm_main", "common_main", DependencyScope.COMPILE) + assertModuleModuleDepScope("jvm_test", "common_test", DependencyScope.COMPILE) + assertModuleModuleDepScope("js_main", "common_main", DependencyScope.COMPILE) + assertModuleModuleDepScope("js_test", "common_test", DependencyScope.COMPILE) + } + @Test fun testPlatformToCommonDependencyRoot() { createProjectSubFile("settings.gradle", "rootProject.name = 'foo'\ninclude ':jvm', ':js'")