summaryrefslogtreecommitdiff
path: root/plugins/kotlin/gradle/gradle-tooling/src/org/jetbrains/kotlin/idea/gradleTooling/reflect/KotlinTargetReflection.kt
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/kotlin/gradle/gradle-tooling/src/org/jetbrains/kotlin/idea/gradleTooling/reflect/KotlinTargetReflection.kt')
-rw-r--r--plugins/kotlin/gradle/gradle-tooling/src/org/jetbrains/kotlin/idea/gradleTooling/reflect/KotlinTargetReflection.kt82
1 files changed, 82 insertions, 0 deletions
diff --git a/plugins/kotlin/gradle/gradle-tooling/src/org/jetbrains/kotlin/idea/gradleTooling/reflect/KotlinTargetReflection.kt b/plugins/kotlin/gradle/gradle-tooling/src/org/jetbrains/kotlin/idea/gradleTooling/reflect/KotlinTargetReflection.kt
new file mode 100644
index 000000000000..b3ffab4c6b56
--- /dev/null
+++ b/plugins/kotlin/gradle/gradle-tooling/src/org/jetbrains/kotlin/idea/gradleTooling/reflect/KotlinTargetReflection.kt
@@ -0,0 +1,82 @@
+// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package org.jetbrains.kotlin.idea.gradleTooling.reflect
+
+import org.gradle.api.Named
+import org.jetbrains.kotlin.idea.gradleTooling.getMethodOrNull
+import org.jetbrains.kotlin.idea.gradleTooling.loadClassOrNull
+
+fun KotlinTargetReflection(kotlinTarget: Any): KotlinTargetReflection = KotlinTargetReflectionImpl(kotlinTarget)
+
+interface KotlinTargetReflection {
+ val isMetadataTargetClass: Boolean
+ val targetName: String
+ val presetName: String?
+ val disambiguationClassifier: String?
+ val platformType: String?
+ val gradleTarget: Named
+ val compilations: Collection<KotlinCompilationReflection>?
+
+ val nativeMainRunTasks: Collection<KotlinNativeMainRunTaskReflection>?
+ val artifactsTaskName: String?
+ val konanArtifacts: Collection<Any>?
+}
+
+private class KotlinTargetReflectionImpl(private val instance: Any) : KotlinTargetReflection {
+ override val gradleTarget: Named
+ get() = instance as Named
+ override val isMetadataTargetClass: Boolean by lazy {
+ val metadataTargetClass =
+ instance.javaClass.classLoader.loadClassOrNull("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget")
+ metadataTargetClass?.isInstance(instance) == true
+ }
+ override val targetName: String by lazy {
+ gradleTarget.name
+ }
+ override val presetName: String? by lazy {
+ instance.callReflectiveAnyGetter("getPreset", logger)
+ ?.callReflectiveGetter("getName", logger)
+ }
+
+ override val disambiguationClassifier: String? by lazy {
+ val getterConditionMethod = "getUseDisambiguationClassifierAsSourceSetNamePrefix"
+ val useDisambiguationClassifier = if (instance.javaClass.getMethodOrNull(getterConditionMethod) != null)
+ instance.callReflectiveGetter(getterConditionMethod, logger)!!
+ else true
+ instance.callReflectiveGetter(
+ (if (useDisambiguationClassifier) "getDisambiguationClassifier"
+ else "getOverrideDisambiguationClassifierOnIdeImport"), logger
+ )
+ }
+ override val platformType: String? by lazy {
+ instance.callReflectiveAnyGetter("getPlatformType", logger)?.callReflectiveGetter("getName", logger)
+ }
+ override val compilations: Collection<KotlinCompilationReflection>? by lazy {
+ instance.callReflective("getCompilations", parameters(), returnType<Iterable<Any>>(), logger)?.map { compilation ->
+ KotlinCompilationReflection(compilation)
+ }
+ }
+
+ override val nativeMainRunTasks: Collection<KotlinNativeMainRunTaskReflection>? by lazy {
+ val executableClass = instance.javaClass.classLoader.loadClassOrNull(EXECUTABLE_CLASS) ?: return@lazy null
+ instance.callReflective("getBinaries", parameters(), returnType<Iterable<Any>>(), logger)
+ ?.filterIsInstance(executableClass)
+ ?.map { KotlinNativeMainRunTaskReflection(it) }
+ }
+
+ override val artifactsTaskName: String? by lazy {
+ instance.callReflectiveGetter("getArtifactsTaskName", logger)
+ }
+
+ override val konanArtifacts: Collection<Any>? by lazy {
+ if (!instance.javaClass.classLoader.loadClass(KOTLIN_NATIVE_TARGET_CLASS).isInstance(instance))
+ null
+ else
+ instance.callReflective("getBinaries", parameters(), returnType<Iterable<Any?>>(), logger)?.filterNotNull()
+ }
+
+ companion object {
+ private val logger = ReflectionLogger(KotlinTargetReflection::class.java)
+ private const val EXECUTABLE_CLASS = "org.jetbrains.kotlin.gradle.plugin.mpp.Executable"
+ private const val KOTLIN_NATIVE_TARGET_CLASS = "org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget"
+ }
+} \ No newline at end of file