Add multiple renderer sources support to new diagnostics infrastructure

This commit is contained in:
Ilya Chernikov
2021-10-05 16:29:51 +02:00
parent 0de6f8b915
commit da2d3f29da
13 changed files with 1572 additions and 1466 deletions
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2021 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.diagnostics.rendering
import org.jetbrains.kotlin.diagnostics.KtDiagnostic
import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactoryToRendererMap
import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderer
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock
fun interface DiagnosticRendererFactory {
operator fun invoke(diagnostic: KtDiagnostic): KtDiagnosticRenderer?
}
abstract class BaseDiagnosticRendererFactory : DiagnosticRendererFactory {
override operator fun invoke(diagnostic: KtDiagnostic): KtDiagnosticRenderer? {
val factory = diagnostic.factory
@Suppress("UNCHECKED_CAST")
return MAP[factory]
}
abstract val MAP: KtDiagnosticFactoryToRendererMap
}
object RootDiagnosticRendererFactory: DiagnosticRendererFactory {
private val factories = linkedSetOf<DiagnosticRendererFactory>()
private val lock = ReentrantLock()
override operator fun invoke(diagnostic: KtDiagnostic): KtDiagnosticRenderer = lock.withLock {
for (factory in factories) {
val renderer = factory(diagnostic)
if (renderer != null) return renderer
}
diagnostic.factory.ktRenderer
}
fun registerFactory(factory: DiagnosticRendererFactory) {
lock.withLock {
factories.add(factory)
}
}
}