diff options
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.kt | 82 |
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 |