Commit 5e2e8cd1 authored by Anton Lakotka's avatar Anton Lakotka Committed by intellij-monorepo-bot
Browse files

[Kotlin, Gradle] Support project dependencies to custom compilations

It is required for kotlin-test support in kotlin.git
In related KGP changes, Kotlin Compilation now can be associated with
archive task that produced from its outputs. And this archive task can
be exposed via consumable configuration therefore IDE should correctly
resolve this dependency as source dependency.

^KTIJ-27536 Verification Pending

GitOrigin-RevId: 12e4ca8824146419250da7bdbaf4277aec92c387
parent fe9dc71c
Showing with 41 additions and 3 deletions
+41 -3
......@@ -2,6 +2,7 @@
package org.jetbrains.kotlin.idea.projectModel
import org.jetbrains.kotlin.tooling.core.HasMutableExtras
import java.io.File
interface KotlinCompilation : KotlinComponent, HasMutableExtras {
/**
......@@ -27,6 +28,11 @@ interface KotlinCompilation : KotlinComponent, HasMutableExtras {
val kotlinTaskProperties: KotlinTaskProperties
val nativeExtensions: KotlinNativeCompilationExtensions?
/**
* Compilation outputs packed in an archive (JAR, KLIB) file
*/
val archiveFile: File?
companion object {
const val MAIN_COMPILATION_NAME = "main"
const val TEST_COMPILATION_NAME = "test"
......
......@@ -202,6 +202,19 @@ private fun KotlinMppGradleProjectResolver.Context.initializeModuleData() {
)
}
}
// Collect compilation output archives
mppModel.targets.flatMap { it.compilations }.forEach { compilation ->
val archiveFile = compilation.archiveFile ?: return@forEach
val path = ExternalSystemApiUtil.toCanonicalPath(archiveFile.absolutePath)
compilation.allSourceSets.forEach { sourceSet ->
resolverCtx.artifactsMap.storeModuleId(
artifactPath = path,
moduleId = KotlinModuleUtils.getKotlinModuleId(gradleModule, sourceSet, resolverCtx),
ownerId = "kotlin"
)
}
}
}
/* Create KotlinGradleProjectData node and attach it to moduleDataNode */
......
......@@ -125,6 +125,7 @@ data class KotlinCompilationImpl(
override val associateCompilations: Set<KotlinCompilationCoordinates>,
override val extras: IdeaKotlinExtras = IdeaKotlinExtras.empty(),
override val isTestComponent: Boolean,
override val archiveFile: File?,
) : KotlinCompilation {
// create deep copy
......@@ -140,6 +141,7 @@ data class KotlinCompilationImpl(
associateCompilations = cloneCompilationCoordinatesWithCaching(kotlinCompilation.associateCompilations, cloningCache),
extras = IdeaKotlinExtras.copy(kotlinCompilation.extras),
isTestComponent = kotlinCompilation.isTestComponent,
archiveFile = kotlinCompilation.archiveFile,
) {
disambiguationClassifier = kotlinCompilation.disambiguationClassifier
platform = kotlinCompilation.platform
......
......@@ -4,13 +4,12 @@ package org.jetbrains.kotlin.idea.gradleTooling.builders
import org.gradle.api.Task
import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.idea.gradleTooling.*
import org.jetbrains.kotlin.idea.gradleTooling.reflect.KotlinCompilationOutputReflection
import org.jetbrains.kotlin.idea.gradleTooling.reflect.KotlinCompilationReflection
import org.jetbrains.kotlin.idea.gradleTooling.reflect.KotlinNativeCompileReflection
import org.jetbrains.kotlin.idea.gradleTooling.reflect.*
import org.jetbrains.kotlin.idea.projectModel.KotlinCompilation
import org.jetbrains.kotlin.idea.projectModel.KotlinCompilationOutput
import org.jetbrains.kotlin.idea.projectModel.KotlinPlatform
import org.jetbrains.plugins.gradle.model.ExternalProjectDependency
import java.io.File
class KotlinCompilationBuilder(val platform: KotlinPlatform, val classifier: String?) :
KotlinModelComponentBuilder<KotlinCompilationReflection, MultiplatformModelImportingContext, KotlinCompilation> {
......@@ -71,6 +70,7 @@ class KotlinCompilationBuilder(val platform: KotlinPlatform, val classifier: Str
associateCompilations = associateCompilations.toSet(),
extras = IdeaKotlinExtras.from(serializedExtras),
isTestComponent = isTestCompilation,
archiveFile = getArchiveFile(origin, importingContext)
)
}
......@@ -153,5 +153,15 @@ class KotlinCompilationBuilder(val platform: KotlinPlatform, val classifier: Str
val destinationDir = KotlinNativeCompileReflection(compileKotlinTask).destinationDir
return KotlinCompilationOutputImpl(compilationOutputBase.classesDirs, destinationDir, compilationOutputBase.resourcesDir)
}
private fun getArchiveFile(
kotlinCompilation: KotlinCompilationReflection,
importingContext: MultiplatformModelImportingContext
): File? {
val archiveTaskName = kotlinCompilation.archiveTaskName ?: return null
val artifactTask = importingContext.project.tasks.findByName(archiveTaskName) ?: return null
val jarTaskReflection = KotlinTargetJarReflection(artifactTask)
return jarTaskReflection.archiveFile
}
}
}
......@@ -17,6 +17,7 @@ interface KotlinCompilationReflection {
val konanTargetName: String?
val compileKotlinTaskName: String?
val associateCompilations: Iterable<KotlinCompilationReflection>
val archiveTaskName: String?
}
private class KotlinCompilationReflectionImpl(private val instance: Any) : KotlinCompilationReflection {
......@@ -59,6 +60,11 @@ private class KotlinCompilationReflectionImpl(private val instance: Any) : Kotli
.map { compilation -> KotlinCompilationReflection(compilation) }
}
override val archiveTaskName: String? by lazy {
if (instance.javaClass.getMethodOrNull("getArchiveTaskName") == null) null
else instance.callReflectiveGetter("getArchiveTaskName", logger)
}
companion object {
private val logger: ReflectionLogger = ReflectionLogger(KotlinCompilationReflection::class.java)
}
......
......@@ -93,6 +93,7 @@ internal fun createKotlinCompilation(
associateCompilations = associateCompilations,
extras = IdeaKotlinExtras.wrap(extras),
isTestComponent = associateCompilations.isNotEmpty(),
archiveFile = null,
)
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment