summaryrefslogtreecommitdiff
path: root/plugins/kotlin/gradle/gradle-tooling/src/org/jetbrains/kotlin/idea/gradleTooling/reflect/KotlinNativeCompileReflection.kt
blob: ba86c0c1650693f65de75c50199eacb3a7926f2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 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.file.DirectoryProperty
import org.gradle.api.provider.Provider
import org.jetbrains.kotlin.idea.gradleTooling.getMethodOrNull
import java.io.File

fun KotlinNativeCompileReflection(compileKotlinTask: Any): KotlinNativeCompileReflection =
    KotlinNativeCompileReflectionImpl(compileKotlinTask)

interface KotlinNativeCompileReflection {
    val destinationDir: File?
}

private class KotlinNativeCompileReflectionImpl(private val instance: Any) : KotlinNativeCompileReflection {
    override val destinationDir: File? by lazy {
        val instanceClazz = instance::class.java
        if (instanceClazz.getMethodOrNull("getDestinationDirectory") != null)
            instance.callReflectiveGetter<DirectoryProperty>("getDestinationDirectory", logger)?.asFile?.get()
        else instance.callReflectiveGetter("getDestinationDir", logger)
            ?: when (val outputFile = instance.callReflectiveAnyGetter("getOutputFile", logger)) {
                is Provider<*> -> outputFile.orNull as? File
                is File -> outputFile
                else -> null
            }?.parentFile
    }

    companion object {
        private val logger: ReflectionLogger = ReflectionLogger(KotlinNativeCompileReflection::class.java)
    }
}