[FIR] Introduce FirDiagnosticRenderers
This commit is contained in:
+4
@@ -127,6 +127,10 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
fun getRendererForDiagnostic(diagnostic: FirDiagnostic<*>): FirDiagnosticRenderer<*>? {
|
||||||
|
return MAP[diagnostic.factory]
|
||||||
|
}
|
||||||
|
|
||||||
// * - The old FE reports these diagnostics with additional parameters
|
// * - The old FE reports these diagnostics with additional parameters
|
||||||
// & - New diagnostic that has no analogues in the old FE
|
// & - New diagnostic that has no analogues in the old FE
|
||||||
// + - Better message required
|
// + - Better message required
|
||||||
|
|||||||
+14
-16
@@ -10,15 +10,15 @@ import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticParameterRenderer
|
|||||||
import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticRenderer
|
import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticRenderer
|
||||||
|
|
||||||
class FirDiagnosticFactoryToRendererMap(val name: String) {
|
class FirDiagnosticFactoryToRendererMap(val name: String) {
|
||||||
private val diagnosticsMap: MutableMap<AbstractFirDiagnosticFactory<*, *>, DiagnosticRenderer<*>> = mutableMapOf()
|
private val classicRenderersMap: MutableMap<AbstractFirDiagnosticFactory<*, *>, DiagnosticRenderer<*>> = mutableMapOf()
|
||||||
val psiDiagnosticMap: DiagnosticFactoryToRendererMap =
|
private val renderersMap: MutableMap<AbstractFirDiagnosticFactory<*, *>, FirDiagnosticRenderer<*>> = mutableMapOf()
|
||||||
DiagnosticFactoryToRendererMap()
|
val psiDiagnosticMap: DiagnosticFactoryToRendererMap = DiagnosticFactoryToRendererMap()
|
||||||
|
|
||||||
operator fun get(factory: AbstractFirDiagnosticFactory<*, *>): DiagnosticRenderer<*>? = diagnosticsMap[factory]
|
operator fun get(factory: AbstractFirDiagnosticFactory<*, *>): FirDiagnosticRenderer<*>? = renderersMap[factory]
|
||||||
|
fun getClassicRenderer(factory: AbstractFirDiagnosticFactory<*, *>): DiagnosticRenderer<*>? = classicRenderersMap[factory]
|
||||||
|
|
||||||
fun put(factory: FirDiagnosticFactory0<*, *>, message: String) {
|
fun put(factory: FirDiagnosticFactory0<*, *>, message: String) {
|
||||||
psiDiagnosticMap.put(factory.psiDiagnosticFactory, message)
|
put(factory, SimpleFirDiagnosticRenderer(message))
|
||||||
putToFirMap(factory)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <A : Any> put(
|
fun <A : Any> put(
|
||||||
@@ -26,8 +26,7 @@ class FirDiagnosticFactoryToRendererMap(val name: String) {
|
|||||||
message: String,
|
message: String,
|
||||||
rendererA: DiagnosticParameterRenderer<A>?
|
rendererA: DiagnosticParameterRenderer<A>?
|
||||||
) {
|
) {
|
||||||
psiDiagnosticMap.put(factory.psiDiagnosticFactory, message, rendererA)
|
put(factory, FirDiagnosticWithParameters1Renderer(message, rendererA))
|
||||||
putToFirMap(factory)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <A : Any, B : Any> put(
|
fun <A : Any, B : Any> put(
|
||||||
@@ -36,8 +35,7 @@ class FirDiagnosticFactoryToRendererMap(val name: String) {
|
|||||||
rendererA: DiagnosticParameterRenderer<A>?,
|
rendererA: DiagnosticParameterRenderer<A>?,
|
||||||
rendererB: DiagnosticParameterRenderer<B>?
|
rendererB: DiagnosticParameterRenderer<B>?
|
||||||
) {
|
) {
|
||||||
psiDiagnosticMap.put(factory.psiDiagnosticFactory, message, rendererA, rendererB)
|
put(factory, FirDiagnosticWithParameters2Renderer(message, rendererA, rendererB))
|
||||||
putToFirMap(factory)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <A : Any, B : Any, C : Any> put(
|
fun <A : Any, B : Any, C : Any> put(
|
||||||
@@ -47,13 +45,13 @@ class FirDiagnosticFactoryToRendererMap(val name: String) {
|
|||||||
rendererB: DiagnosticParameterRenderer<B>?,
|
rendererB: DiagnosticParameterRenderer<B>?,
|
||||||
rendererC: DiagnosticParameterRenderer<C>?
|
rendererC: DiagnosticParameterRenderer<C>?
|
||||||
) {
|
) {
|
||||||
psiDiagnosticMap.put(factory.psiDiagnosticFactory, message, rendererA, rendererB, rendererC)
|
put(factory, FirDiagnosticWithParameters3Renderer(message, rendererA, rendererB, rendererC))
|
||||||
putToFirMap(factory)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun putToFirMap(factory: AbstractFirDiagnosticFactory<*, *>) {
|
private fun put(factory: AbstractFirDiagnosticFactory<*, *>, renderer: FirDiagnosticRenderer<*>) {
|
||||||
psiDiagnosticMap[factory.psiDiagnosticFactory]?.let {
|
val classicRenderer = renderer.toClassicDiagnosticRenderer()
|
||||||
diagnosticsMap[factory] = it
|
renderersMap[factory] = renderer
|
||||||
}
|
classicRenderersMap[factory] = classicRenderer
|
||||||
|
psiDiagnosticMap.put(factory.psiDiagnosticFactory, classicRenderer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+89
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 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.fir.analysis.diagnostics
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.diagnostics.rendering.*
|
||||||
|
import java.text.MessageFormat
|
||||||
|
|
||||||
|
sealed class FirDiagnosticRenderer<D : FirDiagnostic<*>> {
|
||||||
|
abstract fun render(diagnostic: D): String
|
||||||
|
|
||||||
|
abstract fun toClassicDiagnosticRenderer(): DiagnosticRenderer<*>
|
||||||
|
}
|
||||||
|
|
||||||
|
class SimpleFirDiagnosticRenderer(private val message: String) : FirDiagnosticRenderer<FirSimpleDiagnostic<*>>() {
|
||||||
|
override fun render(diagnostic: FirSimpleDiagnostic<*>): String {
|
||||||
|
return message
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toClassicDiagnosticRenderer(): DiagnosticRenderer<*> {
|
||||||
|
return SimpleDiagnosticRenderer(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class AbstractFirDiagnosticWithParametersRenderer<D : FirDiagnostic<*>>(
|
||||||
|
protected val message: String
|
||||||
|
) : FirDiagnosticRenderer<D>() {
|
||||||
|
private val messageFormat = MessageFormat(message)
|
||||||
|
|
||||||
|
override fun render(diagnostic: D): String {
|
||||||
|
return messageFormat.format(renderParameters(diagnostic))
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract fun renderParameters(diagnostic: D): Array<out Any>
|
||||||
|
}
|
||||||
|
|
||||||
|
class FirDiagnosticWithParameters1Renderer<A : Any>(
|
||||||
|
message: String,
|
||||||
|
private val rendererForA: DiagnosticParameterRenderer<A>?,
|
||||||
|
) : AbstractFirDiagnosticWithParametersRenderer<FirDiagnosticWithParameters1<*, A>>(message) {
|
||||||
|
override fun renderParameters(diagnostic: FirDiagnosticWithParameters1<*, A>): Array<out Any> {
|
||||||
|
val context = RenderingContext.of(diagnostic.a)
|
||||||
|
return arrayOf(renderParameter(diagnostic.a, rendererForA, context),)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toClassicDiagnosticRenderer(): DiagnosticRenderer<*> {
|
||||||
|
return DiagnosticWithParameters1Renderer(message, rendererForA)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FirDiagnosticWithParameters2Renderer<A : Any, B : Any>(
|
||||||
|
message: String,
|
||||||
|
private val rendererForA: DiagnosticParameterRenderer<A>?,
|
||||||
|
private val rendererForB: DiagnosticParameterRenderer<B>?,
|
||||||
|
) : AbstractFirDiagnosticWithParametersRenderer<FirDiagnosticWithParameters2<*, A, B>>(message) {
|
||||||
|
override fun renderParameters(diagnostic: FirDiagnosticWithParameters2<*, A, B>): Array<out Any> {
|
||||||
|
val context = RenderingContext.of(diagnostic.a, diagnostic.b)
|
||||||
|
return arrayOf(
|
||||||
|
renderParameter(diagnostic.a, rendererForA, context),
|
||||||
|
renderParameter(diagnostic.b, rendererForB, context),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toClassicDiagnosticRenderer(): DiagnosticRenderer<*> {
|
||||||
|
return DiagnosticWithParameters2Renderer(message, rendererForA, rendererForB)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FirDiagnosticWithParameters3Renderer<A : Any, B : Any, C : Any>(
|
||||||
|
message: String,
|
||||||
|
private val rendererForA: DiagnosticParameterRenderer<A>?,
|
||||||
|
private val rendererForB: DiagnosticParameterRenderer<B>?,
|
||||||
|
private val rendererForC: DiagnosticParameterRenderer<C>?,
|
||||||
|
) : AbstractFirDiagnosticWithParametersRenderer<FirDiagnosticWithParameters3<*, A, B, C>>(message) {
|
||||||
|
override fun renderParameters(diagnostic: FirDiagnosticWithParameters3<*, A, B, C>): Array<out Any> {
|
||||||
|
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),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toClassicDiagnosticRenderer(): DiagnosticRenderer<*> {
|
||||||
|
return DiagnosticWithParameters3Renderer(message, rendererForA, rendererForB, rendererForC)
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -79,6 +79,11 @@ public final class DiagnosticFactoryToRendererMap {
|
|||||||
map.put(factory, new DiagnosticWithParameters3Renderer<A, B, C>(message, rendererA, rendererB, rendererC));
|
map.put(factory, new DiagnosticWithParameters3Renderer<A, B, C>(message, rendererA, rendererB, rendererC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void put(@NotNull DiagnosticFactory<?> factory, @NotNull DiagnosticRenderer<?> renderer) {
|
||||||
|
checkMutability();
|
||||||
|
map.put(factory, renderer);
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public DiagnosticRenderer<?> get(@NotNull DiagnosticFactory<?> factory) {
|
public DiagnosticRenderer<?> get(@NotNull DiagnosticFactory<?> factory) {
|
||||||
return map.get(factory);
|
return map.get(factory);
|
||||||
|
|||||||
Reference in New Issue
Block a user