All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bennyhuo.kotlin.ir.printer.gradle.IrPrinterGradlePlugin.kt Maven / Gradle / Ivy

package com.bennyhuo.kotlin.ir.printer.gradle

import com.bennyhuo.kotlin.ir.printer.BuildConfig
import java.io.File
import org.gradle.api.Project
import org.gradle.api.provider.Provider
import org.gradle.configurationcache.extensions.capitalized
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin
import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

class IrPrinterGradlePlugin : KotlinCompilerPluginSupportPlugin {
    override fun apply(target: Project) {
        target.extensions.create("irPrinter", PrinterExtension::class.java)
    }

    override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean {
        return kotlinCompilation.project.extensions.getByType(PrinterExtension::class.java).isEnabled
    }

    override fun getCompilerPluginId(): String = BuildConfig.KOTLIN_PLUGIN_ID

    override fun getPluginArtifact(): SubpluginArtifact = SubpluginArtifact(
        groupId = BuildConfig.KOTLIN_PLUGIN_GROUP,
        artifactId = BuildConfig.KOTLIN_PLUGIN_NAME,
        version = BuildConfig.KOTLIN_PLUGIN_VERSION
    )

    override fun applyToCompilation(
        kotlinCompilation: KotlinCompilation<*>
    ): Provider> {
        val project = kotlinCompilation.target.project
        val target = kotlinCompilation.target
        val extension = project.extensions.getByType(PrinterExtension::class.java)

        if (
            extension.isLlvmIrEnabled &&
            kotlinCompilation.name == KotlinCompilation.MAIN_COMPILATION_NAME &&
            target is KotlinNativeTarget
        ) {
            val konanTempDir = kotlinCompilation.getOrConfigKonanTempDir()
            val konanConfig = KonanConfig(project)
            // lazily resolve this path after Kotlin Native compiler setup.
            val llvmDisPathLazy = lazy {
                File(konanConfig.llvmHome, "bin/llvm-dis").absolutePath
            }

            target.binaries.forEach { binary ->
                val taskName = "disassemble${binary.name.capitalized()}${target.targetName.capitalized()}Bitcode"
                project.tasks.register(taskName, LlvmDisTask::class.java) {
                    it.dependsOn(binary.linkTaskName)
                    it.llvmDisPath.set(llvmDisPathLazy)
                    it.konanTempDir.set(konanTempDir)
                    it.outputPath.set(project.output(target, "llvm-ir"))
                }
            }
        }

        val options = ArrayList()
        options += SubpluginOption("indent", extension.indent)
        options += SubpluginOption("outputType", extension.outputType.ordinal.toString())
        options += SubpluginOption(
            "outputDir",
            extension.outputDir?.takeIf { it.isNotBlank() } ?: project.output(target, "ir")
        )
        return project.provider { options }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy