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