diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt index 8656d436bf6..3e10d50ee72 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt @@ -7,10 +7,12 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Named import org.gradle.api.attributes.Attribute +import org.gradle.api.attributes.AttributeCompatibilityRule +import org.gradle.api.attributes.CompatibilityCheckDetails import java.io.Serializable enum class KotlinPlatformType: Named, Serializable { - common, jvm, js, + common, jvm, js, androidJvm, native; // TODO: split native into separate entries here or transform the enum to interface and implement entries in K/N override fun toString(): String = name @@ -22,4 +24,13 @@ enum class KotlinPlatformType: Named, Serializable { KotlinPlatformType::class.java ) } + + class CompatibilityRule : AttributeCompatibilityRule { + override fun execute(details: CompatibilityCheckDetails) = with(details) { + when { + producerValue == jvm && consumerValue == androidJvm -> compatible() + producerValue == consumerValue -> compatible() + } + } + } } \ No newline at end of file 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 b888d0bddb0..f15aef2e813 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 @@ -20,6 +20,35 @@ class KotlinAndroid32GradleIT : KotlinAndroid3GradleIT(androidGradlePluginVersio override val defaultGradleVersion: GradleVersionRequired get() = GradleVersionRequired.AtLeast("4.6") + @Test + fun testAndroidWithNewMppApp() = with(Project("new-mpp-android")) { + build("assemble", "compileDebugUnitTestJavaWithJavac") { + assertSuccessful() + + assertTasksExecuted( + ":lib:compileDebugKotlinAndroidLib", + ":lib:compileReleaseKotlinAndroidLib", + ":lib:compileKotlinJvmLib", + ":lib:compileKotlinJsLib", + ":app:compileDebugKotlinAndroidApp", + ":app:compileReleaseKotlinAndroidApp", + ":app:compileKotlinJvmApp", + ":app:compileKotlinJsApp", + ":lib:compileDebugUnitTestJavaWithJavac", + ":app:compileDebugUnitTestJavaWithJavac" + ) + + listOf("debug", "release").forEach { variant -> + assertFileExists("lib/build/tmp/kotlin-classes/$variant/com/example/lib/ExpectedLibClass.class") + assertFileExists("lib/build/tmp/kotlin-classes/$variant/com/example/lib/CommonLibClass.class") + assertFileExists("lib/build/tmp/kotlin-classes/$variant/com/example/lib/AndroidLibClass.class") + + assertFileExists("app/build/tmp/kotlin-classes/$variant/com/example/app/AKt.class") + assertFileExists("app/build/tmp/kotlin-classes/$variant/com/example/app/KtUsageKt.class") + } + } + } + @Test fun testKaptUsingApOptionProvidersAsNestedInputOutput() = with(Project("AndroidProject")) { setupWorkingDir() diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/build.gradle new file mode 100644 index 00000000000..db2f059f755 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/build.gradle @@ -0,0 +1,58 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-multiplatform' + +android { + compileSdkVersion 27 + defaultConfig { + applicationId "app.example.com.app_sample" + minSdkVersion 21 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'com.android.support.constraint:constraint-layout:1.1.2' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + + implementation 'org.jetbrains.kotlin:kotlin-stdlib' +} + +kotlin { + sourceSets { + commonMain { + dependencies { + implementation project(':lib') + implementation 'org.jetbrains.kotlin:kotlin-stdlib-common' + } + } + jvmAppMain { + dependencies { + implementation 'org.jetbrains.kotlin:kotlin-stdlib' + } + } + jsAppMain { + dependencies { + implementation 'org.jetbrains.kotlin:kotlin-stdlib-js' + } + } + } + + targets { + fromPreset(presets.android, 'androidApp') + fromPreset(presets.jvm, 'jvmApp') + fromPreset(presets.js, 'jsApp') + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/androidTest/java/app/example/com/app_sample/ExampleInstrumentedTest.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/androidTest/java/app/example/com/app_sample/ExampleInstrumentedTest.java new file mode 100644 index 00000000000..d7e1797f56e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/androidTest/java/app/example/com/app_sample/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package app.example.com.app_sample; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("app.example.com.app_sample", appContext.getPackageName()); + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/commonMain/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/commonMain/kotlin/A.kt new file mode 100644 index 00000000000..828c8e4a068 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/commonMain/kotlin/A.kt @@ -0,0 +1,9 @@ +package com.example.app + +import com.example.lib.* + +expect fun f(): Unit + +fun g() { + ExpectedLibClass() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/commonTest/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/commonTest/kotlin/A.kt new file mode 100644 index 00000000000..bbfa711bc74 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/commonTest/kotlin/A.kt @@ -0,0 +1,3 @@ +val x: String get() = TODO() + +fun warnMe() = x!!.toString() \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/jsAppMain/kotlin/App.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/jsAppMain/kotlin/App.kt new file mode 100644 index 00000000000..24cf77bea9a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/jsAppMain/kotlin/App.kt @@ -0,0 +1,12 @@ +package com.example.app + +import com.example.lib.* + +actual fun f() { } + +fun main(args: Array) { + f() + g() + ExpectedLibClass() + JsLibClass() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/jvmAppMain/kotlin/App.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/jvmAppMain/kotlin/App.kt new file mode 100644 index 00000000000..1bbcc910a49 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/jvmAppMain/kotlin/App.kt @@ -0,0 +1,16 @@ +package com.example.app + +import com.example.lib.* + +actual fun f() { } + +object Main { + @JvmStatic + fun main(args: Array) { + f() + g() + + ExpectedLibClass() + JvmLibClass() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..9c7290910cd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/java/app/example/com/app_sample/KtUsage.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/java/app/example/com/app_sample/KtUsage.kt new file mode 100644 index 00000000000..1f72c5d419b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/java/app/example/com/app_sample/KtUsage.kt @@ -0,0 +1,12 @@ +package com.example.app + +import com.example.lib.* + +actual fun f() { } + +fun main(args: Array) { + f() + g() + ExpectedLibClass() + AndroidLibClass() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/java/app/example/com/app_sample/MainActivity.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/java/app/example/com/app_sample/MainActivity.java new file mode 100644 index 00000000000..76ec31f5c0c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/java/app/example/com/app_sample/MainActivity.java @@ -0,0 +1,17 @@ +package app.example.com.app_sample; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; + +import com.example.app.KtUsageKt; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + KtUsageKt.f(); + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000000..1f6bb290603 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/drawable/ic_launcher_background.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000000..0d025f9bf6b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/layout/activity_main.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000000..84f19512d95 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000000..eca70cfe52e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000000..eca70cfe52e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 00000000000..898f3ed59ac Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 00000000000..dffca3601eb Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 00000000000..64ba76f75e9 Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 00000000000..dae5e082342 Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 00000000000..e5ed46597ea Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 00000000000..14ed0af3502 Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 00000000000..b0907cac3bf Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 00000000000..d8ae0315497 Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000000..2c18de9e661 Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 00000000000..beed3cdd2c3 Binary files /dev/null and b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/colors.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/colors.xml new file mode 100644 index 00000000000..69b22338c65 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #008577 + #00574B + #D81B60 + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/strings.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000000..ccc0ef76376 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + app-sample + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/styles.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000000..5885930df6d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/test/java/app/example/com/app_sample/ExampleUnitTest.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/test/java/app/example/com/app_sample/ExampleUnitTest.java new file mode 100644 index 00000000000..1977dae327e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/src/test/java/app/example/com/app_sample/ExampleUnitTest.java @@ -0,0 +1,21 @@ +package app.example.com.app_sample; + +import org.junit.Test; + +import com.example.app.KtUsageKt; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + + KtUsageKt.f(); + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/build.gradle new file mode 100644 index 00000000000..26ea73d2eb9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/build.gradle @@ -0,0 +1,29 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + mavenLocal() + google() + jcenter() + maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } + } + dependencies { + classpath "com.android.tools.build:gradle:$android_tools_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + mavenLocal() + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/gradle.properties new file mode 100644 index 00000000000..743d692ce15 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/gradle.properties @@ -0,0 +1,13 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/build.gradle new file mode 100644 index 00000000000..8ee1a222fcb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/build.gradle @@ -0,0 +1,54 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-multiplatform' + +android { + compileSdkVersion 27 + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'com.android.support:appcompat-v7:27.1.1' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} + +kotlin { + sourceSets { + jvmLibMain { + dependencies { + implementation 'org.jetbrains.kotlin:kotlin-stdlib' + } + } + jsLibMain { + dependencies { + implementation 'org.jetbrains.kotlin:kotlin-stdlib-js' + } + } + } + + targets { + fromPreset(presets.android, 'androidLib') + fromPreset(presets.jvm, 'jvmLib') + fromPreset(presets.js, 'jsLib') + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/androidTest/java/app/example/com/lib/ExampleInstrumentedTest.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/androidTest/java/app/example/com/lib/ExampleInstrumentedTest.java new file mode 100644 index 00000000000..c608b2a9083 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/androidTest/java/app/example/com/lib/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package app.example.com.lib; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("app.example.com.lib.test", appContext.getPackageName()); + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/commonMain/kotlin/CommonLibClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/commonMain/kotlin/CommonLibClass.kt new file mode 100644 index 00000000000..b89e78a13cb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/commonMain/kotlin/CommonLibClass.kt @@ -0,0 +1,5 @@ +package com.example.lib + +class CommonLibClass + +expect class ExpectedLibClass \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/jsLibMain/kotlin/JsLibClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/jsLibMain/kotlin/JsLibClass.kt new file mode 100644 index 00000000000..0dfad3007ee --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/jsLibMain/kotlin/JsLibClass.kt @@ -0,0 +1,5 @@ +package com.example.lib + +class JsLibClass + +actual class ExpectedLibClass \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/jvmLibMain/kotlin/JvmLibClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/jvmLibMain/kotlin/JvmLibClass.kt new file mode 100644 index 00000000000..f07fd80642f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/jvmLibMain/kotlin/JvmLibClass.kt @@ -0,0 +1,5 @@ +package com.example.lib + +class JvmLibClass + +actual class ExpectedLibClass \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..708e8b26ccf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/java/AndroidLibClass.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/java/AndroidLibClass.kt new file mode 100644 index 00000000000..331ec80e7cd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/java/AndroidLibClass.kt @@ -0,0 +1,5 @@ +package com.example.lib + +class AndroidLibClass + +actual class ExpectedLibClass \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/res/values/strings.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/res/values/strings.xml new file mode 100644 index 00000000000..e3a7072efc2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + My Library + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/test/java/app/example/com/lib/ExampleUnitTest.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/test/java/app/example/com/lib/ExampleUnitTest.java new file mode 100644 index 00000000000..b98d1110083 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/src/test/java/app/example/com/lib/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package app.example.com.lib; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/settings.gradle new file mode 100644 index 00000000000..7f5080f8bf1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/settings.gradle @@ -0,0 +1,2 @@ +include ':app', ':lib' +enableFeaturePreview('GRADLE_METADATA') \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt index cc45ea0dcb1..725b8e2572c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt @@ -113,6 +113,14 @@ class Android25ProjectHandler(kotlinConfigurationTools: KotlinConfigurationTools usesPlatformOf(compilation.target) project.addExtendsFromRelation(name, compilation.runtimeDependencyConfigurationName) } + + // TODO this code depends on the convention that is present in the Android plugin as there's no public API + // We should request such API in the Android plugin + val apiElementsConfigurationName = "${variant.name}ApiElements" + val runtimeElementsConfigurationName = "${variant.name}RuntimeElements" + listOf(apiElementsConfigurationName, runtimeElementsConfigurationName).forEach { outputConfigurationName -> + project.configurations.findByName(outputConfigurationName)?.usesPlatformOf(compilation.target) + } } private inner class KaptVariant(variantData: BaseVariant) : KaptVariantData(variantData) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index e0ce9f0663b..a6a3fa86bad 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP +import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import java.io.FileNotFoundException import java.util.* import javax.inject.Inject @@ -68,9 +69,20 @@ abstract class KotlinBasePluginWrapper( } val plugin = getPlugin(project, kotlinGradleBuildServices) + + setupAttributeMatchingStrategy(project) + plugin.apply(project) } + private fun setupAttributeMatchingStrategy(project: Project) = with(project.dependencies.attributesSchema) { + attribute(KotlinPlatformType.attribute).run { + if (isGradleVersionAtLeast(4, 0)) { + compatibilityRules.add(KotlinPlatformType.CompatibilityRule::class.java) + } + } + } + internal abstract fun getPlugin( project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt index b2852503b79..c68a2fafff6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt @@ -65,7 +65,7 @@ open class KotlinAndroidTarget( internal set override val platformType: KotlinPlatformType - get() = KotlinPlatformType.jvm + get() = KotlinPlatformType.androidJvm private val compilationFactory = KotlinJvmAndroidCompilationFactory(project, this)