Allow multiple expectedBy dependencies in Gradle MPP support

Issue #KT-22864 Fixed
This commit is contained in:
Sergey Igushkin
2018-02-15 15:13:29 +03:00
parent f23b5103ec
commit 37b34cff25
17 changed files with 134 additions and 6 deletions
@@ -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.")
}
}
}
}
@@ -0,0 +1,17 @@
buildscript {
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
mavenLocal()
jcenter()
}
}
@@ -0,0 +1,7 @@
package foo
expect class PlatformClassA {
val valueA: String
}
class CommonClassA
@@ -0,0 +1,7 @@
package foo
expect class PlatformTestA {
val valueA: PlatformClassA
}
class CommonTestA(val commonClassA: CommonClassA)
@@ -0,0 +1,7 @@
package foo
expect class PlatformClassB {
val valueB: String
}
class CommonClassB
@@ -0,0 +1,7 @@
package foo
expect class PlatformTestB {
val valueB: PlatformClassB
}
class CommonTestB(val commonClassB: CommonClassB)
@@ -0,0 +1,6 @@
apply plugin: 'kotlin-platform-js'
dependencies {
expectedBy project(":libA")
expectedBy project(":libB")
}
@@ -0,0 +1,9 @@
package foo
actual class PlatformClassA {
actual val valueA: String = "JS"
}
actual class PlatformClassB {
actual val valueB: String = "JS"
}
@@ -0,0 +1,9 @@
package foo
actual class PlatformTestA {
actual val valueA: PlatformClassA = PlatformClassA()
}
actual class PlatformTestB {
actual val valueB: PlatformClassB = PlatformClassB()
}
@@ -0,0 +1,7 @@
apply plugin: 'kotlin-platform-jvm'
dependencies {
expectedBy project(":libA")
expectedBy project(":libB")
compile 'com.google.guava:guava:20.0'
}
@@ -0,0 +1,9 @@
package foo
actual class PlatformClassA {
actual val valueA: String = "JVM"
}
actual class PlatformClassB {
actual val valueB: String = "JVM"
}
@@ -0,0 +1,7 @@
package foo
import com.google.common.collect.ImmutableSet
fun main(args: Array<String>) {
val colors = ImmutableSet.of("red", "orange", "yellow")
}
@@ -0,0 +1,9 @@
package foo
actual class PlatformTestA {
actual val valueA: PlatformClassA = PlatformClassA()
}
actual class PlatformTestB {
actual val valueB: PlatformClassB = PlatformClassB()
}
@@ -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")) {