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 {