diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
index cf913c7bebf..c4470b0b553 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.gradle
+import org.gradle.util.VersionNumber
import org.jetbrains.kotlin.gradle.util.getFileByName
import org.jetbrains.kotlin.gradle.util.getFilesByNames
import org.jetbrains.kotlin.gradle.util.isLegacyAndroidGradleVersion
@@ -258,6 +259,37 @@ fun getSomething() = 10
assertNotContains("Changed dependencies of configuration .+ after it has been included in dependency resolution".toRegex())
}
}
+
+ @Test
+ fun testMultiplatformAndroidCompile() {
+ val project = Project("multiplatformAndroidProject", gradleVersion)
+
+ project.build("build") {
+ assertSuccessful()
+ assertContains(
+ ":lib:compileKotlinCommon",
+ ":lib:compileTestKotlinCommon",
+ ":libJvm:compileKotlin",
+ ":libJvm:compileTestKotlin",
+ ":libAndroid:compileDebugKotlin",
+ ":libAndroid:compileReleaseKotlin",
+ ":libAndroid:compileDebugUnitTestKotlin",
+ ":libAndroid:compileReleaseUnitTestKotlin"
+ )
+
+ val kotlinFolder = if (VersionNumber.parse(gradleVersion).major > 3) "kotlin" else ""
+
+ assertFileExists("lib/build/classes/$kotlinFolder/main/foo/PlatformClass.kotlin_metadata")
+ assertFileExists("lib/build/classes/$kotlinFolder/test/foo/PlatformTest.kotlin_metadata")
+ assertFileExists("libJvm/build/classes/$kotlinFolder/main/foo/PlatformClass.class")
+ assertFileExists("libJvm/build/classes/$kotlinFolder/test/foo/PlatformTest.class")
+
+ assertFileExists("libAndroid/build/tmp/kotlin-classes/debug/foo/PlatformClass.class")
+ assertFileExists("libAndroid/build/tmp/kotlin-classes/release/foo/PlatformClass.class")
+ assertFileExists("libAndroid/build/tmp/kotlin-classes/debugUnitTest/foo/PlatformTest.class")
+ assertFileExists("libAndroid/build/tmp/kotlin-classes/debugUnitTest/foo/PlatformTest.class")
+ }
+ }
}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/build.gradle
new file mode 100644
index 00000000000..bf51aea3afc
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/build.gradle
@@ -0,0 +1,20 @@
+buildscript {
+ repositories {
+ mavenLocal()
+ jcenter()
+ maven { url 'https://maven.google.com' }
+ }
+
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath "com.android.tools.build:gradle:$android_tools_version"
+ }
+}
+
+allprojects {
+ repositories {
+ mavenLocal()
+ jcenter()
+ maven { url 'https://maven.google.com' }
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/build.gradle
new file mode 100644
index 00000000000..48e89733657
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/build.gradle
@@ -0,0 +1 @@
+apply plugin: 'kotlin-platform-common'
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/src/main/kotlin/PlatformClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/src/main/kotlin/PlatformClass.kt
new file mode 100644
index 00000000000..526586c399e
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/src/main/kotlin/PlatformClass.kt
@@ -0,0 +1,7 @@
+package foo
+
+expect class PlatformClass {
+ val value: String
+}
+
+class CommonClass
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/src/test/kotlin/PlatformTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/src/test/kotlin/PlatformTest.kt
new file mode 100644
index 00000000000..2688286a168
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/lib/src/test/kotlin/PlatformTest.kt
@@ -0,0 +1,7 @@
+package foo
+
+expect class PlatformTest {
+ val value: PlatformClass
+}
+
+class CommonTest(val commonClass: CommonClass)
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/build.gradle
new file mode 100644
index 00000000000..caa3004f6ed
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/build.gradle
@@ -0,0 +1,18 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-platform-android'
+
+dependencies {
+ expectedBy project(":lib")
+}
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "25.0.2"
+
+ defaultConfig {
+ minSdkVersion 19
+ targetSdkVersion 23
+ versionCode 1
+ versionName "1.0"
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..40cb6601a4d
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/AndroidManifest.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/kotlin/PlatformClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/kotlin/PlatformClass.kt
new file mode 100644
index 00000000000..30645e27340
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/kotlin/PlatformClass.kt
@@ -0,0 +1,5 @@
+package foo
+
+actual class PlatformClass {
+ actual val value: String = "Android"
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/kotlin/androidSdkUse.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/kotlin/androidSdkUse.kt
new file mode 100644
index 00000000000..2e9f83e462b
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/main/kotlin/androidSdkUse.kt
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
+ * that can be found in the license/LICENSE.txt file.
+ */
+
+package platform.kotlin.android.test
+
+class MyActivity: android.app.Activity()
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/test/kotlin/PlatformTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/test/kotlin/PlatformTest.kt
new file mode 100644
index 00000000000..38a6198f0bd
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libAndroid/src/test/kotlin/PlatformTest.kt
@@ -0,0 +1,5 @@
+package foo
+
+actual class PlatformTest {
+ actual val value: PlatformClass = PlatformClass()
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libJvm/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libJvm/build.gradle
new file mode 100644
index 00000000000..c5f014ee3fc
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libJvm/build.gradle
@@ -0,0 +1,6 @@
+apply plugin: 'kotlin-platform-jvm'
+
+dependencies {
+ expectedBy project(":lib")
+ 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/multiplatformAndroidProject/libJvm/src/main/kotlin/PlatformClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libJvm/src/main/kotlin/PlatformClass.kt
new file mode 100644
index 00000000000..21783c3a136
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libJvm/src/main/kotlin/PlatformClass.kt
@@ -0,0 +1,5 @@
+package foo
+
+actual class PlatformClass {
+ actual val value: String = "JVM"
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libJvm/src/main/kotlin/javaLibUse.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/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/multiplatformAndroidProject/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/multiplatformAndroidProject/libJvm/src/test/kotlin/PlatformTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libJvm/src/test/kotlin/PlatformTest.kt
new file mode 100644
index 00000000000..38a6198f0bd
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/libJvm/src/test/kotlin/PlatformTest.kt
@@ -0,0 +1,5 @@
+package foo
+
+actual class PlatformTest {
+ actual val value: PlatformClass = PlatformClass()
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/settings.gradle
new file mode 100644
index 00000000000..f2ad2a2219e
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformAndroidProject/settings.gradle
@@ -0,0 +1 @@
+include ':lib', ':libJvm', ':libAndroid'
\ 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 a9678a134a0..0482aef301c 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
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.gradle.plugin
+import com.android.build.gradle.BaseExtension
import org.gradle.api.GradleException
import org.gradle.api.Plugin
import org.gradle.api.Project
@@ -114,12 +115,12 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin
commonProject.sourceSets.all { commonSourceSet ->
// todo: warn if not found
- addCommonSourceSetToPlatformSourceSet(commonSourceSet)
+ addCommonSourceSetToPlatformSourceSet(commonSourceSet, platformProject)
}
}
}
- protected open fun addCommonSourceSetToPlatformSourceSet(commonSourceSet: SourceSet) {
+ protected open fun addCommonSourceSetToPlatformSourceSet(commonSourceSet: SourceSet, platformProject: Project) {
val platformTask = platformKotlinTasksBySourceSetName[commonSourceSet.name]
commonSourceSet.kotlin!!.srcDirs.forEach { platformTask?.source(it) }
}
@@ -147,6 +148,20 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin
}
}
+open class KotlinPlatformAndroidPlugin : KotlinPlatformImplementationPluginBase("android") {
+ override fun apply(project: Project) {
+ project.applyPlugin()
+ super.apply(project)
+ }
+
+ override fun addCommonSourceSetToPlatformSourceSet(commonSourceSet: SourceSet, platformProject: Project) {
+ val androidExtension = platformProject.extensions.getByName("android") as BaseExtension
+ val androidSourceSet = androidExtension.sourceSets.findByName(commonSourceSet.name) ?: return
+ val kotlinSourceSet = androidSourceSet.getConvention(KOTLIN_DSL_NAME) as? KotlinSourceSet ?: return
+ kotlinSourceSet.kotlin.source(commonSourceSet.kotlin!!)
+ }
+}
+
open class KotlinPlatformJvmPlugin : KotlinPlatformImplementationPluginBase("jvm") {
override fun apply(project: Project) {
project.applyPlugin()
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-platform-android.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-platform-android.properties
new file mode 100644
index 00000000000..48b0616717e
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-platform-android.properties
@@ -0,0 +1 @@
+implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinPlatformAndroidPlugin
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.platform.android.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.platform.android.properties
new file mode 100644
index 00000000000..48b0616717e
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.platform.android.properties
@@ -0,0 +1 @@
+implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinPlatformAndroidPlugin
\ No newline at end of file