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

name.remal.building.gradle_plugins.generate_sources.BaseSourceGenerator.kt Maven / Gradle / Ivy

There is a newer version: 1.9.2
Show newest version
package name.remal.building.gradle_plugins.generate_sources

import name.remal.building.gradle_plugins.dsl.escapeJava
import org.gradle.api.Project
import java.io.StringWriter
import java.io.Writer

abstract class BaseSourceGenerator() {

    abstract fun accept(project: Project, writer: Writer)

    lateinit var packageName: String
    lateinit var fileName: String

    constructor(packageName: String, fileName: String) : this() {
        this.packageName = packageName
        this.fileName = fileName
    }

    protected open fun Writer.writePackage() {
        if (packageName.isNotEmpty()) {
            append("package ").append(packageName).append(";\n")
        }
    }

    protected open fun Writer.writeImport(canonicalClassName: String) {
        append("import ").append(canonicalClassName).append(";\n")
    }

    open fun Writer.writeImport(clazz: Class<*>) = writeImport(clazz.canonicalName)

    protected open fun Writer.writeStaticImport(canonicalClassName: String, member: String) {
        append("import static ").append(canonicalClassName).append('.').append(member).append(";\n")
    }

    open fun Writer.writeStaticImport(clazz: Class<*>, member: String) = writeStaticImport(clazz.canonicalName, member)

    protected open fun Writer.writeSuppressWarnings(vararg warnings: String = arrayOf("all")) {
        append("@SuppressWarnings({")
        warnings.forEachIndexed { index, warning ->
            if (1 < index) append(", ")
            append('"').append(warning.escapeJava()).append('"')
        }
        append("})\n")
    }

    protected open val indentSize = 4

    protected fun Writer.writeBlock(expression: String = "", blockWriterHandler: Writer.() -> Unit) {
        if (expression.isNotEmpty()) {
            append(expression)
            append(' ')
        }

        append('{')

        StringWriter().use { blockWriter ->
            blockWriterHandler(blockWriter)
            val content = blockWriter.toString().replace("\r", "").let {
                if (it.endsWith('\n')) {
                    it.substringBeforeLast('\n')
                } else {
                    it
                }
            }
            if (content.isNotEmpty()) {
                append('\n')
                val indent = " ".repeat(indentSize)
                content.split('\n').forEach { append(indent).append(it).append('\n') }
            }
        }

        append('}')
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy