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

org.jetbrains.kotlin.diagnostics.rendering.diagnosticsWithParameterRenderers.kt Maven / Gradle / Ivy

There is a newer version: 2.1.0-Beta1
Show newest version
/*
 * Copyright 2010-2016 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jetbrains.kotlin.diagnostics.rendering

import org.jetbrains.kotlin.diagnostics.*
import java.text.MessageFormat


abstract class AbstractDiagnosticWithParametersRenderer protected constructor(message: String) : DiagnosticRenderer {
    private val messageFormat = MessageFormat(message)

    override fun render(obj: D): String {
        return messageFormat.format(renderParameters(obj))
    }

    abstract fun renderParameters(diagnostic: D): Array

}


class DiagnosticWithParameters1Renderer(
        message: String,
        private val rendererForA: DiagnosticParameterRenderer?
) : AbstractDiagnosticWithParametersRenderer>(message) {

    override fun renderParameters(diagnostic: DiagnosticWithParameters1<*, A>): Array {
        val context = RenderingContext.of(diagnostic.a)
        return arrayOf(renderParameter(diagnostic.a, rendererForA, context))
    }
}

class DiagnosticWithParameters2Renderer(
        message: String,
        private val rendererForA: DiagnosticParameterRenderer?,
        private val rendererForB: DiagnosticParameterRenderer?
) : AbstractDiagnosticWithParametersRenderer>(message) {

    override fun renderParameters(diagnostic: DiagnosticWithParameters2<*, A, B>): Array {
        val context = RenderingContext.of(diagnostic.a, diagnostic.b)
        return arrayOf(
                renderParameter(diagnostic.a, rendererForA, context),
                renderParameter(diagnostic.b, rendererForB, context)
        )
    }
}

class DiagnosticWithParameters3Renderer(
        message: String,
        private val rendererForA: DiagnosticParameterRenderer?,
        private val rendererForB: DiagnosticParameterRenderer?,
        private val rendererForC: DiagnosticParameterRenderer?
) : AbstractDiagnosticWithParametersRenderer>(message) {

    override fun renderParameters(diagnostic: DiagnosticWithParameters3<*, A, B, C>): Array {
        val context = RenderingContext.of(diagnostic.a, diagnostic.b, diagnostic.c)
        return arrayOf(
                renderParameter(diagnostic.a, rendererForA, context),
                renderParameter(diagnostic.b, rendererForB, context),
                renderParameter(diagnostic.c, rendererForC, context)
        )
    }
}

class DiagnosticWithParametersMultiRenderer(
        message: String,
        private val renderer: MultiRenderer
) : AbstractDiagnosticWithParametersRenderer>(message) {

    override fun renderParameters(diagnostic: DiagnosticWithParameters1<*, A>): Array {
        return renderer.render(diagnostic.a)
    }
}

interface MultiRenderer {
    fun render(a: A): Array
}