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
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(file: File) {
        if (!hasErrors()) {
            return
        }
        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