diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidExternalIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidExternalIT.kt index e652d117494..b7af6a6df9c 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidExternalIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/Kapt3AndroidExternalIT.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.android import org.gradle.api.JavaVersion +import org.gradle.api.logging.LogLevel import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.Kapt3BaseIT import org.jetbrains.kotlin.gradle.testbase.* @@ -210,4 +211,33 @@ open class Kapt3AndroidExternalIT : Kapt3BaseIT() { } } } + + @DisplayName("KT-61622: common sources are attached in MPP + Android project") + @GradleAndroidTest + fun testMppAndroidKapt( + gradleVersion: GradleVersion, + agpVersion: String, + jdkVersion: JdkVersions.ProvidedJdk + ) { + project( + "mpp-android-kapt".withPrefix, + gradleVersion, + buildOptions = defaultBuildOptions.copy(androidVersion = agpVersion, logLevel = LogLevel.DEBUG), + buildJdk = jdkVersion.location + ) { + build(":shared:compileDebugKotlinAndroid") { + assertTasksExecuted( + ":shared:kaptGenerateStubsDebugKotlinAndroid", + ":shared:kaptDebugKotlinAndroid", + ":shared:compileDebugKotlinAndroid", + ) + + assertCompilerArguments( + ":shared:kaptGenerateStubsDebugKotlinAndroid", + "src/commonMain/kotlin/hilt/error/sampleapp/Annotations.kt", + "src/commonMain/kotlin/hilt/error/sampleapp/CommonMainViewModel.kt", + ) + } + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/build.gradle.kts new file mode 100644 index 00000000000..8d678d3577f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("com.android.application").apply(false) + id("com.android.library").apply(false) + kotlin("android").apply(false) + kotlin("multiplatform").apply(false) + id("com.google.dagger.hilt.android") version "2.47" apply false +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/gradle.properties new file mode 100644 index 00000000000..8239e11a542 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/gradle.properties @@ -0,0 +1,7 @@ +#Android +android.useAndroidX=true +android.nonTransitiveRClass=true + +#MPP +kotlin.mpp.enableCInteropCommonization=true +kotlin.mpp.androidSourceSetLayoutVersion=2 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/settings.gradle.kts new file mode 100644 index 00000000000..84ed06d4c65 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/settings.gradle.kts @@ -0,0 +1 @@ +include(":shared") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/build.gradle.kts new file mode 100644 index 00000000000..8a339da7f67 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/build.gradle.kts @@ -0,0 +1,42 @@ +plugins { + kotlin("multiplatform") + id("com.android.library") + kotlin("kapt") +} + +repositories { + mavenLocal() + google() + mavenCentral() +} + +kotlin { + jvmToolchain(17) + + android {} + + sourceSets { + val androidMain by getting { + dependencies { + implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1") + implementation("androidx.hilt:hilt-navigation-compose:1.1.0-alpha01") + implementation("com.google.dagger:hilt-android:2.4.7") + configurations.getByName("kapt").dependencies.add( + org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency( + "com.google.dagger", + "hilt-compiler", + "2.47" + ) + ) + } + } + } +} + +android { + namespace = "hilt.error.sampleapp" + compileSdk = 34 + defaultConfig { + minSdk = 24 + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000000..b2d3ea12352 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/kotlin/hilt/error/sampleapp/AndroidMainViewModel.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/kotlin/hilt/error/sampleapp/AndroidMainViewModel.kt new file mode 100644 index 00000000000..d5d0579bbd9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/kotlin/hilt/error/sampleapp/AndroidMainViewModel.kt @@ -0,0 +1,20 @@ +package hilt.error.sampleapp + +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +/*** + * This is just a standard HiltViewModel. This works as intended + */ +@HiltViewModel +class AndroidMainViewModel @Inject constructor( + dependency: AndroidDependency +) : ViewModel() { + + val text: String = dependency.text +} + +class AndroidDependency @Inject constructor() { + val text = "Hello AndroidMain" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/kotlin/hilt/error/sampleapp/Annotations.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/kotlin/hilt/error/sampleapp/Annotations.kt new file mode 100644 index 00000000000..30d191598b6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/androidMain/kotlin/hilt/error/sampleapp/Annotations.kt @@ -0,0 +1,16 @@ +@file:OptIn(ExperimentalMultiplatform::class) + +package hilt.error.sampleapp + +/** + * Issue: prior to 1.9 this would be fine. Now, Hilt cannot find viewmodels marked with this typealias + */ +actual typealias HiltViewModel = dagger.hilt.android.lifecycle.HiltViewModel + +@AllowDifferentMembersInActual +actual typealias ViewModel = androidx.lifecycle.ViewModel + +actual typealias Inject = javax.inject.Inject + +actual typealias AutoCloseable = java.lang.AutoCloseable +actual typealias Closeable = java.io.Closeable \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/commonMain/kotlin/hilt/error/sampleapp/Annotations.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/commonMain/kotlin/hilt/error/sampleapp/Annotations.kt new file mode 100644 index 00000000000..7e2aa6e6950 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/commonMain/kotlin/hilt/error/sampleapp/Annotations.kt @@ -0,0 +1,13 @@ +package hilt.error.sampleapp + +expect annotation class HiltViewModel() + +expect interface AutoCloseable { + fun close() +} + +expect interface Closeable : AutoCloseable + +expect abstract class ViewModel() + +expect annotation class Inject() diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/commonMain/kotlin/hilt/error/sampleapp/CommonMainViewModel.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/commonMain/kotlin/hilt/error/sampleapp/CommonMainViewModel.kt new file mode 100644 index 00000000000..3a92bfc914d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/mpp-android-kapt/shared/src/commonMain/kotlin/hilt/error/sampleapp/CommonMainViewModel.kt @@ -0,0 +1,17 @@ +package hilt.error.sampleapp + +/** + * This is a shared view model. It is marked with a typealias to a HiltViewModel + * But does not get added to Hilts view model map (from kotlin 1.90 onwards) + */ +@HiltViewModel +class CommonMainViewModel @Inject constructor( + dependency: CommonMainDependency +) : ViewModel() { + + val text = dependency.text +} + +class CommonMainDependency @Inject constructor() { + val text = "Hello CommonMain" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationSourceSetInclusion.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationSourceSetInclusion.kt index 72ce544f2c3..203d1e8983f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationSourceSetInclusion.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationSourceSetInclusion.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.internal.KAPT_GENERATE_STUBS_PREFIX +import org.jetbrains.kotlin.gradle.internal.getKaptTaskName import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet @@ -17,6 +19,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.addSourcesToKotlinCompileTask import org.jetbrains.kotlin.gradle.plugin.sources.defaultSourceSetLanguageSettingsChecker import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation +import org.jetbrains.kotlin.gradle.utils.whenKaptEnabled import org.jetbrains.kotlin.tooling.core.extrasFactoryProperty import java.util.concurrent.Callable @@ -89,13 +92,26 @@ internal class KotlinCompilationSourceSetInclusion( object DefaultAddSourcesToCompileTask : AddSourcesToCompileTask { override fun addSources( compilation: KotlinCompilation<*>, sourceSet: KotlinSourceSet, addAsCommonSources: Lazy - ) = addSourcesToKotlinCompileTask( - project = compilation.project, - taskName = compilation.compileKotlinTaskName, - sourceFileExtensions = sourceSet.customSourceFilesExtensions, - addAsCommonSources = addAsCommonSources, - sources = { sourceSet.kotlin } - ) + ) { + addSourcesToKotlinCompileTask( + project = compilation.project, + taskName = compilation.compileKotlinTaskName, + sourceFileExtensions = sourceSet.customSourceFilesExtensions, + addAsCommonSources = addAsCommonSources, + sources = { sourceSet.kotlin } + ) + + compilation.project.whenKaptEnabled { + val kaptGenerateStubsTaskName = getKaptTaskName(compilation.compileKotlinTaskName, KAPT_GENERATE_STUBS_PREFIX) + addSourcesToKotlinCompileTask( + project = compilation.project, + taskName = kaptGenerateStubsTaskName, + sourceFileExtensions = sourceSet.customSourceFilesExtensions, + addAsCommonSources = addAsCommonSources, + sources = { sourceSet.kotlin } + ) + } + } } object NativeAddSourcesToCompileTask : AddSourcesToCompileTask {