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

org.jetbrains.kotlin.gradle.logging.GradleErrorMessageCollector.kt Maven / Gradle / Ivy

There is a newer version: 2.0.0-RC2
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.logging

import org.gradle.api.logging.Logger
import org.jetbrains.kotlin.buildtools.api.KotlinLogger
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import java.io.File
import java.io.FileWriter

class GradleErrorMessageCollector(
    private val logger: KotlinLogger,
    private val delegate: MessageCollector? = null,
    private val acceptableMessageSeverity: List = listOf(CompilerMessageSeverity.EXCEPTION),
    private val kotlinPluginVersion: String? = null
) : MessageCollector {

    constructor(
        logger: Logger,
        delegate: MessageCollector? = null,
        acceptableMessageSeverity: List = listOf(CompilerMessageSeverity.EXCEPTION),
        kotlinPluginVersion: String? = null,
    ) : this(GradleKotlinLogger(logger), delegate, acceptableMessageSeverity, kotlinPluginVersion)

    private val errors = ArrayList()

    override fun clear() {
        delegate?.clear()
        errors.clear()
    }

    fun report(error: Throwable, location: CompilerMessageSourceLocation?) {
        report(CompilerMessageSeverity.EXCEPTION, "${error.message}\n${error.stackTraceToString()}", location)
    }

    override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation?) {
        delegate?.report(severity, message, location)

        if (severity in acceptableMessageSeverity) {
            synchronized(errors) {
                errors.add(message)
            }
        }
    }

    override fun hasErrors(): Boolean {
        return errors.isNotEmpty()
    }

    fun flush(files: Set) {
        if (!hasErrors()) {
            return
        }
        for (file in files) {
            file.parentFile.mkdirs()
            file.createNewFile()
            FileWriter(file).use {
                kotlinPluginVersion?.also { version -> it.append("kotlin version: $version\n") }
                for (error in errors) {
                    it.append("error message: $error\n\n")
                }
                it.flush()
            }
            logger.debug("${errors.count()} errors were stored into file ${file.absolutePath}")
        }
        clear()
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy