[FIR][renderer] add phase renderer for file and file annotations container

^KT-56543
This commit is contained in:
Dmitrii Gridin
2023-03-22 15:31:04 +01:00
committed by Space Team
parent 706ff6b61f
commit 8c599a84af
51 changed files with 918 additions and 442 deletions
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2023 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.renderer
import org.jetbrains.kotlin.fir.FirFileAnnotationsContainer
class FirFileAnnotationsContainerRenderer {
internal lateinit var components: FirRendererComponents
private val printer get() = components.printer
fun render(fileAnnotationsContainer: FirFileAnnotationsContainer) {
components.annotationRenderer?.render(fileAnnotationsContainer)
components.resolvePhaseRenderer?.render(fileAnnotationsContainer)
printer.println("annotations container")
}
}
@@ -46,6 +46,7 @@ class FirRenderer(
override val typeRenderer: ConeTypeRenderer = ConeTypeRendererForDebugging(),
override val valueParameterRenderer: FirValueParameterRenderer? = FirValueParameterRenderer(),
override val errorExpressionRenderer: FirErrorExpressionRenderer? = FirErrorExpressionOnlyErrorRenderer(),
override val fileAnnotationsContainerRenderer: FirFileAnnotationsContainerRenderer? = null,
) : FirRendererComponents {
override val visitor = Visitor()
@@ -59,7 +60,10 @@ class FirRenderer(
)
fun withResolvePhase(): FirRenderer =
FirRenderer(resolvePhaseRenderer = FirResolvePhaseRenderer())
FirRenderer(
resolvePhaseRenderer = FirResolvePhaseRenderer(),
fileAnnotationsContainerRenderer = FirFileAnnotationsContainerRenderer(),
)
fun withDeclarationAttributes(): FirRenderer =
FirRenderer(declarationRenderer = FirDeclarationRendererWithAttributes())
@@ -81,6 +85,7 @@ class FirRenderer(
typeRenderer.idRenderer = idRenderer
valueParameterRenderer?.components = this
errorExpressionRenderer?.components = this
fileAnnotationsContainerRenderer?.components = this
}
fun renderElementAsString(element: FirElement): String {
@@ -162,15 +167,26 @@ class FirRenderer(
}
override fun visitFile(file: FirFile) {
printer.println("FILE: ${file.name}")
printer.print("FILE: ")
resolvePhaseRenderer?.render(file)
printer.println(file.name)
printer.pushIndent()
annotationRenderer?.render(file)
visitFileAnnotationsContainer(file.annotationsContainer)
visitPackageDirective(file.packageDirective)
file.imports.forEach { it.accept(this) }
file.declarations.forEach { it.accept(this) }
printer.popIndent()
}
override fun visitFileAnnotationsContainer(fileAnnotationsContainer: FirFileAnnotationsContainer) {
if (fileAnnotationsContainerRenderer != null) {
fileAnnotationsContainerRenderer.render(fileAnnotationsContainer)
} else {
annotationRenderer?.render(fileAnnotationsContainer)
}
}
override fun visitAnnotation(annotation: FirAnnotation) {
annotationRenderer?.renderAnnotation(annotation)
}
@@ -24,4 +24,5 @@ internal interface FirRendererComponents {
val typeRenderer: ConeTypeRenderer
val valueParameterRenderer: FirValueParameterRenderer?
val errorExpressionRenderer: FirErrorExpressionRenderer?
val fileAnnotationsContainerRenderer: FirFileAnnotationsContainerRenderer?
}
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.FirElementWithResolvePhase
class FirResolvePhaseRenderer {
internal lateinit var components: FirRendererComponents
private val printer get() = components.printer
fun render(declaration: FirDeclaration) {
printer.print("[${declaration.resolvePhase}] ")
fun render(element: FirElementWithResolvePhase) {
printer.print("[${element.resolvePhase}] ")
}
}