From 37b34cff25b379c52557d37fe0002634a1675cdc Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Thu, 15 Feb 2018 15:13:29 +0300 Subject: [PATCH] Allow multiple expectedBy dependencies in Gradle MPP support Issue #KT-22864 Fixed --- .../kotlin/gradle/MultiplatformGradleIT.kt | 30 +++++++++++++++++++ .../build.gradle | 17 +++++++++++ .../libA/build.gradle | 1 + .../libA/src/main/kotlin/PlatformClassA.kt | 7 +++++ .../libA/src/test/kotlin/PlatformTestA.kt | 7 +++++ .../libB/build.gradle | 1 + .../libB/src/main/kotlin/PlatformClassB.kt | 7 +++++ .../libB/src/test/kotlin/PlatformTestB.kt | 7 +++++ .../libJs/build.gradle | 6 ++++ .../libJs/src/main/kotlin/PlatformClass.kt | 9 ++++++ .../libJs/src/test/kotlin/PlatformTest.kt | 9 ++++++ .../libJvm/build.gradle | 7 +++++ .../libJvm/src/main/kotlin/PlatformClass.kt | 9 ++++++ .../libJvm/src/main/kotlin/javaLibUse.kt | 7 +++++ .../libJvm/src/test/kotlin/PlatformTest.kt | 9 ++++++ .../settings.gradle | 1 + .../plugin/KotlinMultiplatformPlugin.kt | 6 ---- 17 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/src/main/kotlin/PlatformClassA.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/src/test/kotlin/PlatformTestA.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/src/main/kotlin/PlatformClassB.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/src/test/kotlin/PlatformTestB.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/src/main/kotlin/PlatformClass.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/src/test/kotlin/PlatformTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/main/kotlin/PlatformClass.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/main/kotlin/javaLibUse.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/test/kotlin/PlatformTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt index e72d22c969a..1a1df413468 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/MultiplatformGradleIT.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.util.getFileByName import org.jetbrains.kotlin.gradle.util.modify import org.junit.Test import java.io.File +import kotlin.test.assertTrue class MultiplatformGradleIT : BaseGradleIT() { @@ -155,4 +156,33 @@ class MultiplatformGradleIT : BaseGradleIT() { assertTasksUpToDate(listOf(compileCommonTask, compileJvmTask)) } } + + @Test + fun testMultipleCommonModules(): Unit = with(Project("multiplatformMultipleCommonModules")) { + build("build") { + assertSuccessful() + + val sourceSets = listOf("", "Test") + val commonTasks = listOf("libA", "libB").flatMap { module -> + sourceSets.map { sourceSet -> ":$module:compile${sourceSet}KotlinCommon" } + } + val platformTasks = listOf("libJvm" to "", "libJs" to "2Js").flatMap { (module, platformSuffix) -> + sourceSets.map { sourceSet -> ":$module:compile${sourceSet}Kotlin$platformSuffix" } + } + assertTasksExecuted(commonTasks + platformTasks) + + val expectedJvmMainClasses = + listOf("PlatformClassB", "PlatformClassA", "JavaLibUseKt", "CommonClassB", "CommonClassA").map { "foo/$it" } + val jvmMainClassesDir = File(projectDir, kotlinClassesDir(subproject = "libJvm")) + expectedJvmMainClasses.forEach { className -> + assertTrue(File(jvmMainClassesDir, className + ".class").isFile, "Class $className should be compiled for JVM.") + } + + val expectedJvmTestClasses = listOf("PlatformTestB", "PlatformTestA", "CommonTestB", "CommonTestA").map { "foo/$it" } + val jvmTestClassesDir = File(projectDir, kotlinClassesDir(subproject = "libJvm", sourceSet = "test")) + expectedJvmTestClasses.forEach { className -> + assertTrue(File(jvmTestClassesDir, className + ".class").isFile, "Class $className should be compiled for JVM.") + } + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/build.gradle new file mode 100644 index 00000000000..91103fd3cc9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/build.gradle @@ -0,0 +1,17 @@ +buildscript { + repositories { + mavenLocal() + jcenter() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + mavenLocal() + jcenter() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/build.gradle new file mode 100644 index 00000000000..48e89733657 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/build.gradle @@ -0,0 +1 @@ +apply plugin: 'kotlin-platform-common' diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/src/main/kotlin/PlatformClassA.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/src/main/kotlin/PlatformClassA.kt new file mode 100644 index 00000000000..42dd3008c2d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/src/main/kotlin/PlatformClassA.kt @@ -0,0 +1,7 @@ +package foo + +expect class PlatformClassA { + val valueA: String +} + +class CommonClassA \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/src/test/kotlin/PlatformTestA.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/src/test/kotlin/PlatformTestA.kt new file mode 100644 index 00000000000..1b9fe7acf49 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libA/src/test/kotlin/PlatformTestA.kt @@ -0,0 +1,7 @@ +package foo + +expect class PlatformTestA { + val valueA: PlatformClassA +} + +class CommonTestA(val commonClassA: CommonClassA) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/build.gradle new file mode 100644 index 00000000000..48e89733657 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/build.gradle @@ -0,0 +1 @@ +apply plugin: 'kotlin-platform-common' diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/src/main/kotlin/PlatformClassB.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/src/main/kotlin/PlatformClassB.kt new file mode 100644 index 00000000000..31dbe19acad --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/src/main/kotlin/PlatformClassB.kt @@ -0,0 +1,7 @@ +package foo + +expect class PlatformClassB { + val valueB: String +} + +class CommonClassB \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/src/test/kotlin/PlatformTestB.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/src/test/kotlin/PlatformTestB.kt new file mode 100644 index 00000000000..b2e869787dd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libB/src/test/kotlin/PlatformTestB.kt @@ -0,0 +1,7 @@ +package foo + +expect class PlatformTestB { + val valueB: PlatformClassB +} + +class CommonTestB(val commonClassB: CommonClassB) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/build.gradle new file mode 100644 index 00000000000..c916c7499be --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/build.gradle @@ -0,0 +1,6 @@ +apply plugin: 'kotlin-platform-js' + +dependencies { + expectedBy project(":libA") + expectedBy project(":libB") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/src/main/kotlin/PlatformClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/src/main/kotlin/PlatformClass.kt new file mode 100644 index 00000000000..888be51e9bb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/src/main/kotlin/PlatformClass.kt @@ -0,0 +1,9 @@ +package foo + +actual class PlatformClassA { + actual val valueA: String = "JS" +} + +actual class PlatformClassB { + actual val valueB: String = "JS" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/src/test/kotlin/PlatformTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/src/test/kotlin/PlatformTest.kt new file mode 100644 index 00000000000..9c8b3f09c61 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJs/src/test/kotlin/PlatformTest.kt @@ -0,0 +1,9 @@ +package foo + +actual class PlatformTestA { + actual val valueA: PlatformClassA = PlatformClassA() +} + +actual class PlatformTestB { + actual val valueB: PlatformClassB = PlatformClassB() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/build.gradle new file mode 100644 index 00000000000..3e6e7448a83 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/build.gradle @@ -0,0 +1,7 @@ +apply plugin: 'kotlin-platform-jvm' + +dependencies { + expectedBy project(":libA") + expectedBy project(":libB") + compile 'com.google.guava:guava:20.0' +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/main/kotlin/PlatformClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/main/kotlin/PlatformClass.kt new file mode 100644 index 00000000000..5576db46dd7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/main/kotlin/PlatformClass.kt @@ -0,0 +1,9 @@ +package foo + +actual class PlatformClassA { + actual val valueA: String = "JVM" +} + +actual class PlatformClassB { + actual val valueB: String = "JVM" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/main/kotlin/javaLibUse.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/main/kotlin/javaLibUse.kt new file mode 100644 index 00000000000..c48348ed34e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/main/kotlin/javaLibUse.kt @@ -0,0 +1,7 @@ +package foo + +import com.google.common.collect.ImmutableSet + +fun main(args: Array) { + val colors = ImmutableSet.of("red", "orange", "yellow") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/test/kotlin/PlatformTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/test/kotlin/PlatformTest.kt new file mode 100644 index 00000000000..9c8b3f09c61 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/libJvm/src/test/kotlin/PlatformTest.kt @@ -0,0 +1,9 @@ +package foo + +actual class PlatformTestA { + actual val valueA: PlatformClassA = PlatformClassA() +} + +actual class PlatformTestB { + actual val valueB: PlatformClassB = PlatformClassB() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/settings.gradle new file mode 100644 index 00000000000..a62b2180eef --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformMultipleCommonModules/settings.gradle @@ -0,0 +1 @@ +include ':libA', ':libB', ':libJvm', ':libJs' \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt index 0482aef301c..472b4824694 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt @@ -98,12 +98,6 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin private fun addCommonProject(commonProject: Project, platformProject: Project) { commonProjects.add(commonProject) - if (commonProjects.size > 1) { - throw GradleException( - "Platform project $platformProject has more than one " + - "'$EXPECTED_BY_CONFIG_NAME'${if (implementConfigurationIsUsed) "/'$IMPLEMENT_CONFIG_NAME'" else ""} " + - "dependency: ${commonProjects.joinToString()}") - } commonProject.whenEvaluated { if (!commonProject.pluginManager.hasPlugin("kotlin-platform-common")) {