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

org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmBuildProjectModelTask.kt Maven / Gradle / Ivy

There is a newer version: 2.0.0-RC3
Show newest version
/*
 * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
 * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
 */

package org.jetbrains.kotlin.gradle.kpm.idea

import com.google.gson.GsonBuilder
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.dsl.pm20Extension
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.utils.doNotTrackStateCompat
import org.jetbrains.kotlin.gradle.idea.proto.kpm.writeTo
import java.io.ByteArrayOutputStream
import java.io.ObjectOutputStream

internal fun Project.locateOrRegisterIdeaKpmBuildProjectModelTask(): TaskProvider {
    return locateOrRegisterTask(IdeaKpmBuildProjectModelTask.defaultTaskName)
}

/**
 * Internal Task used for troubleshooting/debugging/diagnosing IdeaKpm model building.
 */
@DisableCachingByDefault
internal open class IdeaKpmBuildProjectModelTask : DefaultTask() {

    @OutputDirectory
    val outputDirectory = project.buildDir.resolve("IdeaKpmProject")

    private val builder = project.pm20Extension.ideaKpmProjectModelBuilder

    init {
        doNotTrackStateCompat("Should always re-run to produce updated models")
    }

    @TaskAction
    protected fun buildIdeaKpmProjectModel() {
        outputDirectory.mkdirs()

        val model = builder.buildIdeaKpmProject()
        val serializationContext = builder.buildSerializationContext()
        val textFile = outputDirectory.resolve("model.txt")
        textFile.writeText(model.toString())

        val javaIoSerializableBinaryFile = outputDirectory.resolve("model.java.bin")
        javaIoSerializableBinaryFile.writeBytes(ByteArrayOutputStream().use { byteArrayOutputStream ->
            ObjectOutputStream(byteArrayOutputStream).use { objectOutputStream -> objectOutputStream.writeObject(model) }
            byteArrayOutputStream.toByteArray()
        })

        val protoBinaryFile = outputDirectory.resolve("model.proto.bin")
        if (protoBinaryFile.exists()) protoBinaryFile.delete()
        protoBinaryFile.outputStream().use { stream ->
            model.writeTo(stream, serializationContext)
        }

        val jsonFile = outputDirectory.resolve("model.json")
        jsonFile.writeText(GsonBuilder().setLenient().setPrettyPrinting().create().toJson(model))
    }

    companion object {
        const val defaultTaskName = "buildIdeaKpmProjectModel"
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy