From efe93176ab0fe045374340ffc582fd555ebb8384 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 29 Jan 2019 06:11:17 +0300 Subject: [PATCH] Fix inter-project IC for kaptGenerateStubs task with AGP In Android projects we need to detect modules by inspecting jar files in order to find build history files. However `useModuleDetection` property was not set up correctly for KaptGenerateStubsTask. #KT-29761 Fixed --- .../jetbrains/kotlin/gradle/Kapt3AndroidIT.kt | 28 +++++++++++++++++++ .../android-inter-project-ic/app/build.gradle | 28 +++++++++++++++++++ .../app/src/main/AndroidManifest.xml | 8 ++++++ .../org.example.inter.project.ic/App.kt | 13 +++++++++ .../org.example.inter.project.ic/appDummy.kt | 8 ++++++ .../useLibAndroidUtil.kt | 10 +++++++ .../useLibJvmUtil.kt | 10 +++++++ .../android-inter-project-ic/build.gradle | 19 +++++++++++++ .../gradle.properties | 1 + .../lib-android/build.gradle | 18 ++++++++++++ .../lib-android/src/main/AndroidManifest.xml | 3 ++ .../src/main/kotlin/libAndroidDummy.kt | 8 ++++++ .../src/main/kotlin/libAndroidUtil.kt | 8 ++++++ .../lib-jvm/build.gradle | 5 ++++ .../lib-jvm/src/main/kotlin/libJvmDummy.kt | 8 ++++++ .../lib-jvm/src/main/kotlin/libJvmUtil.kt | 8 ++++++ .../android-inter-project-ic/settings.gradle | 1 + .../internal/kapt/KaptGenerateStubsTask.kt | 7 +++++ .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 2 +- 19 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/App.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/appDummy.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/useLibAndroidUtil.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/useLibJvmUtil.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/AndroidManifest.xml create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/kotlin/libAndroidDummy.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/kotlin/libAndroidUtil.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/src/main/kotlin/libJvmDummy.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/src/main/kotlin/libJvmUtil.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndroidIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndroidIT.kt index 041a0afe2e5..96e854799a0 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndroidIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3AndroidIT.kt @@ -1,6 +1,7 @@ package org.jetbrains.kotlin.gradle import org.jetbrains.kotlin.gradle.util.AGPVersion +import org.jetbrains.kotlin.gradle.util.checkedReplace import org.jetbrains.kotlin.gradle.util.getFileByName import org.jetbrains.kotlin.gradle.util.modify import org.jetbrains.kotlin.test.KotlinTestUtils @@ -127,6 +128,33 @@ open class Kapt3AndroidIT : Kapt3BaseIT() { } } + @Test + fun testInterProjectIC() = with(Project("android-inter-project-ic", directoryPrefix = "kapt2")) { + build("assembleDebug") { + assertSuccessful() + assertKaptSuccessful() + } + + fun modifyAndCheck(utilFileName: String, useUtilFileName: String) { + val utilKt = projectDir.getFileByName(utilFileName) + utilKt.modify { + it.checkedReplace("Int", "Number") + } + + build("assembleDebug") { + assertSuccessful() + val affectedFile = projectDir.getFileByName(useUtilFileName) + assertCompiledKotlinSources( + relativize(affectedFile), + tasks = listOf("app:kaptGenerateStubsDebugKotlin", "app:compileDebugKotlin") + ) + } + } + + modifyAndCheck("libAndroidUtil.kt", "useLibAndroidUtil.kt") + modifyAndCheck("libJvmUtil.kt", "useLibJvmUtil.kt") + } + @Test fun testICWithAnonymousClasses() { val project = Project("icAnonymousTypes", directoryPrefix = "kapt2") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/build.gradle new file mode 100644 index 00000000000..9c107be68b2 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/build.gradle @@ -0,0 +1,28 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-kapt' + +android { + compileSdkVersion 23 + buildToolsVersion "25.0.2" + + defaultConfig { + applicationId "org.example.inter.project.ic" + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + + compile 'com.android.support:appcompat-v7:23.3.0' + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile project(':lib-android') + compile project(':lib-jvm') + compile "org.jetbrains.kotlin:annotation-processor-example:$kotlin_version" + kapt "org.jetbrains.kotlin:annotation-processor-example:$kotlin_version" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..9fa3becd54a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/App.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/App.kt new file mode 100644 index 00000000000..41e35dd903f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/App.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2019 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 org.example.inter.project.ic + +import android.app.Application + +@example.ExampleAnnotation +class App : Application() { + private fun generated() = AppGenerated() +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/appDummy.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/appDummy.kt new file mode 100644 index 00000000000..bc90d0916d6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/appDummy.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2019 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 org.example.inter.project.ic + +fun appDummy() {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/useLibAndroidUtil.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/useLibAndroidUtil.kt new file mode 100644 index 00000000000..a6b5a40d179 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/useLibAndroidUtil.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2010-2019 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 org.example.inter.project.ic + +import org.example.inter.project.ic.androidLib.* + +fun useLibAndroidUtil() = libAndroidUtil() \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/useLibJvmUtil.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/useLibJvmUtil.kt new file mode 100644 index 00000000000..6c3f618768a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/app/src/main/kotlin/org.example.inter.project.ic/useLibJvmUtil.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2010-2019 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 org.example.inter.project.ic + +import org.example.inter.project.ic.jvmLib.* + +fun useLibJvmUtil() = libJvmUtil() \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/build.gradle new file mode 100644 index 00000000000..ac038ee658d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/build.gradle @@ -0,0 +1,19 @@ +buildscript { + repositories { + mavenLocal() + maven { url 'https://maven.google.com' } + jcenter() + } + dependencies { + classpath "com.android.tools.build:gradle:$android_tools_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +subprojects { + repositories { + mavenLocal() + maven { url 'https://maven.google.com' } + jcenter() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/gradle.properties new file mode 100644 index 00000000000..dc3793168f1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/gradle.properties @@ -0,0 +1 @@ +kapt.verbose=true \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/build.gradle new file mode 100644 index 00000000000..144a8f25025 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion 23 + buildToolsVersion "25.0.2" + + defaultConfig { + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } +} + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..fc9e7c87af6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/kotlin/libAndroidDummy.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/kotlin/libAndroidDummy.kt new file mode 100644 index 00000000000..7335059a753 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/kotlin/libAndroidDummy.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2019 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 org.example.inter.project.ic.androidLib + +fun libAndroidDummy() {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/kotlin/libAndroidUtil.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/kotlin/libAndroidUtil.kt new file mode 100644 index 00000000000..eb9b5e3b5dc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-android/src/main/kotlin/libAndroidUtil.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2019 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 org.example.inter.project.ic.androidLib + +fun libAndroidUtil(): Int = 0 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/build.gradle new file mode 100644 index 00000000000..94c8ab22d92 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'kotlin' + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/src/main/kotlin/libJvmDummy.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/src/main/kotlin/libJvmDummy.kt new file mode 100644 index 00000000000..8d72dc92f4e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/src/main/kotlin/libJvmDummy.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2019 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 org.example.inter.project.ic.jvmLib + +fun libJvmDummy() {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/src/main/kotlin/libJvmUtil.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/src/main/kotlin/libJvmUtil.kt new file mode 100644 index 00000000000..4c98460bf0e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/lib-jvm/src/main/kotlin/libJvmUtil.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2019 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 org.example.inter.project.ic.jvmLib + +fun libJvmUtil(): Int = 0 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/settings.gradle new file mode 100644 index 00000000000..d69b439db3e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/android-inter-project-ic/settings.gradle @@ -0,0 +1 @@ +include ':app', ':lib-android', ':lib-jvm' diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt index 63f557e40a5..61beb0bc253 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt @@ -59,6 +59,13 @@ open class KaptGenerateStubsTask : KotlinCompile() { internal val kotlinTaskPluginClasspath get() = kotlinCompileTask.pluginClasspath + @get:Input + override var useModuleDetection: Boolean + get() = kotlinCompileTask.useModuleDetection + set(_) { + error("KaptGenerateStubsTask.useModuleDetection setter should not be called!") + } + override fun source(vararg sources: Any?): SourceTask? { return super.source(sourceRootsContainer.add(sources)) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index e20b3b3ebd4..5776e242743 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -141,7 +141,7 @@ abstract class AbstractKotlinCompile() : AbstractKo get() = File(taskBuildDirectory, "build-history.bin") @get:Input - internal var useModuleDetection: Boolean = false + internal open var useModuleDetection: Boolean = false @get:Internal protected val multiModuleICSettings: MultiModuleICSettings