Make FirRenderer inherit FirRendererComponents instead of FirPrinter

#KT-53024 Fixed
This commit is contained in:
Mikhail Glukhikh
2022-07-13 19:47:31 +02:00
committed by Space
parent 7ce5100946
commit 13713323cf
2 changed files with 51 additions and 78 deletions
@@ -28,14 +28,14 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
renderer.renderAnnotations(javaClass) renderer.renderAnnotations(javaClass)
renderer.renderMemberDeclarationClass(javaClass) renderer.renderMemberDeclarationClass(javaClass)
renderer.renderSupertypes(javaClass) renderer.renderSupertypes(javaClass)
renderer.renderInBraces { renderer.printer.renderInBraces {
val renderedDeclarations = mutableListOf<FirDeclaration>() val renderedDeclarations = mutableListOf<FirDeclaration>()
fun renderAndCache(symbol: FirCallableSymbol<*>) { fun renderAndCache(symbol: FirCallableSymbol<*>) {
val enhanced = symbol.fir val enhanced = symbol.fir
if (enhanced !in renderedDeclarations) { if (enhanced !in renderedDeclarations) {
renderer.renderElementAsString(enhanced) renderer.renderElementAsString(enhanced)
renderer.newLine() renderer.printer.newLine()
renderedDeclarations += enhanced renderedDeclarations += enhanced
} }
} }
@@ -56,7 +56,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
is FirEnumEntry -> scopeToUse!!.processPropertiesByName(declaration.name, ::renderAndCache) is FirEnumEntry -> scopeToUse!!.processPropertiesByName(declaration.name, ::renderAndCache)
else -> { else -> {
renderer.renderElementAsString(declaration) renderer.renderElementAsString(declaration)
renderer.newLine() renderer.printer.newLine()
renderedDeclarations += declaration renderedDeclarations += declaration
} }
} }
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.contracts.*
import org.jetbrains.kotlin.fir.contracts.description.ConeContractRenderer import org.jetbrains.kotlin.fir.contracts.description.ConeContractRenderer
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.*
@@ -29,22 +28,23 @@ import java.util.*
class FirRenderer( class FirRenderer(
builder: StringBuilder = StringBuilder(), builder: StringBuilder = StringBuilder(),
private val annotationRenderer: FirAnnotationRenderer? = FirAnnotationRenderer(), override val annotationRenderer: FirAnnotationRenderer? = FirAnnotationRenderer(),
private val bodyRenderer: FirBodyRenderer? = FirBodyRenderer(), override val bodyRenderer: FirBodyRenderer? = FirBodyRenderer(),
private val callArgumentsRenderer: FirCallArgumentsRenderer = FirCallArgumentsRenderer(), override val callArgumentsRenderer: FirCallArgumentsRenderer = FirCallArgumentsRenderer(),
private val classMemberRenderer: FirClassMemberRenderer = FirClassMemberRenderer(), override val classMemberRenderer: FirClassMemberRenderer = FirClassMemberRenderer(),
private val contractRenderer: ConeContractRenderer? = ConeContractRenderer(), override val contractRenderer: ConeContractRenderer? = ConeContractRenderer(),
private val declarationRenderer: FirDeclarationRenderer = FirDeclarationRenderer(), override val declarationRenderer: FirDeclarationRenderer = FirDeclarationRenderer(),
private val idRenderer: ConeIdRenderer = ConeIdRendererForDebugging(), override val idRenderer: ConeIdRenderer = ConeIdRendererForDebugging(),
private val modifierRenderer: FirModifierRenderer = FirAllModifierRenderer(), override val modifierRenderer: FirModifierRenderer = FirAllModifierRenderer(),
private val packageDirectiveRenderer: FirPackageDirectiveRenderer? = null, override val packageDirectiveRenderer: FirPackageDirectiveRenderer? = null,
private val propertyAccessorRenderer: FirPropertyAccessorRenderer? = FirPropertyAccessorRenderer(), override val propertyAccessorRenderer: FirPropertyAccessorRenderer? = FirPropertyAccessorRenderer(),
resolvePhaseRenderer: FirResolvePhaseRenderer? = null, override val resolvePhaseRenderer: FirResolvePhaseRenderer? = null,
private val typeRenderer: ConeTypeRenderer = ConeTypeRendererForDebugging(), override val typeRenderer: ConeTypeRenderer = ConeTypeRendererForDebugging(),
private val valueParameterRenderer: FirValueParameterRenderer = FirValueParameterRenderer(), override val valueParameterRenderer: FirValueParameterRenderer = FirValueParameterRenderer(),
) : FirPrinter(builder) { ) : FirRendererComponents {
private val visitor = Visitor() override val visitor = Visitor()
override val printer = FirPrinter(builder)
companion object { companion object {
fun noAnnotationBodiesAccessorAndArguments(): FirRenderer = fun noAnnotationBodiesAccessorAndArguments(): FirRenderer =
@@ -61,41 +61,25 @@ class FirRenderer(
} }
init { init {
val components = FirComponentsImpl() annotationRenderer?.components = this
components.visitor = visitor bodyRenderer?.components = this
components.annotationRenderer = annotationRenderer callArgumentsRenderer.components = this
components.bodyRenderer = bodyRenderer classMemberRenderer.components = this
components.callArgumentsRenderer = callArgumentsRenderer contractRenderer?.components = this
components.classMemberRenderer = classMemberRenderer declarationRenderer.components = this
components.declarationRenderer = declarationRenderer
components.idRenderer = idRenderer
components.modifierRenderer = modifierRenderer
components.packageDirectiveRenderer = packageDirectiveRenderer
components.propertyAccessorRenderer = propertyAccessorRenderer
components.resolvePhaseRenderer = resolvePhaseRenderer
components.typeRenderer = typeRenderer
components.valueParameterRenderer = valueParameterRenderer
@Suppress("LeakingThis")
components.printer = this
annotationRenderer?.components = components
bodyRenderer?.components = components
callArgumentsRenderer.components = components
classMemberRenderer.components = components
contractRenderer?.components = components
declarationRenderer.components = components
idRenderer.builder = builder idRenderer.builder = builder
modifierRenderer.components = components modifierRenderer.components = this
packageDirectiveRenderer?.components = components packageDirectiveRenderer?.components = this
propertyAccessorRenderer?.components = components propertyAccessorRenderer?.components = this
resolvePhaseRenderer?.components = components resolvePhaseRenderer?.components = this
typeRenderer.builder = builder typeRenderer.builder = builder
typeRenderer.idRenderer = idRenderer typeRenderer.idRenderer = idRenderer
valueParameterRenderer.components = components valueParameterRenderer.components = this
} }
fun renderElementAsString(element: FirElement): String { fun renderElementAsString(element: FirElement): String {
element.accept(visitor) element.accept(visitor)
return toString() return printer.toString()
} }
fun renderElementWithTypeAsString(element: FirElement): String { fun renderElementWithTypeAsString(element: FirElement): String {
@@ -106,7 +90,7 @@ class FirRenderer(
fun renderAsCallableDeclarationString(callableDeclaration: FirCallableDeclaration): String { fun renderAsCallableDeclarationString(callableDeclaration: FirCallableDeclaration): String {
visitor.visitCallableDeclaration(callableDeclaration) visitor.visitCallableDeclaration(callableDeclaration)
return toString() return printer.toString()
} }
fun renderMemberDeclarationClass(firClass: FirClass) { fun renderMemberDeclarationClass(firClass: FirClass) {
@@ -124,25 +108,6 @@ class FirRenderer(
} }
} }
private class FirComponentsImpl : FirRendererComponents {
override var annotationRenderer: FirAnnotationRenderer? = null
override var bodyRenderer: FirBodyRenderer? = null
override var contractRenderer: ConeContractRenderer? = null
override var packageDirectiveRenderer: FirPackageDirectiveRenderer? = null
override var propertyAccessorRenderer: FirPropertyAccessorRenderer? = null
override var resolvePhaseRenderer: FirResolvePhaseRenderer? = null
override lateinit var callArgumentsRenderer: FirCallArgumentsRenderer
override lateinit var classMemberRenderer: FirClassMemberRenderer
override lateinit var declarationRenderer: FirDeclarationRenderer
override lateinit var idRenderer: ConeIdRenderer
override lateinit var modifierRenderer: FirModifierRenderer
override lateinit var typeRenderer: ConeTypeRenderer
override lateinit var valueParameterRenderer: FirValueParameterRenderer
override lateinit var visitor: Visitor
override lateinit var printer: FirPrinter
}
private fun Variance.renderVariance() { private fun Variance.renderVariance() {
label.let { label.let {
print(it) print(it)
@@ -157,7 +122,7 @@ class FirRenderer(
print("context(") print("context(")
renderSeparated(contextReceivers, visitor) renderSeparated(contextReceivers, visitor)
print(")") print(")")
newLine() printer.newLine()
} }
private fun List<FirTypeParameterRef>.renderTypeParameters() { private fun List<FirTypeParameterRef>.renderTypeParameters() {
@@ -176,6 +141,14 @@ class FirRenderer(
} }
} }
private fun print(s: Any) {
printer.print(s)
}
private fun renderSeparated(elements: List<FirElement>, visitor: Visitor) {
printer.renderSeparated(elements, visitor)
}
inner class Visitor internal constructor() : FirVisitorVoid() { inner class Visitor internal constructor() : FirVisitorVoid() {
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement) {
@@ -183,13 +156,13 @@ class FirRenderer(
} }
override fun visitFile(file: FirFile) { override fun visitFile(file: FirFile) {
println("FILE: ${file.name}") printer.println("FILE: ${file.name}")
pushIndent() printer.pushIndent()
annotationRenderer?.render(file) annotationRenderer?.render(file)
visitPackageDirective(file.packageDirective) visitPackageDirective(file.packageDirective)
file.imports.forEach { it.accept(this) } file.imports.forEach { it.accept(this) }
file.declarations.forEach { it.accept(this) } file.declarations.forEach { it.accept(this) }
popIndent() printer.popIndent()
} }
override fun visitAnnotation(annotation: FirAnnotation) { override fun visitAnnotation(annotation: FirAnnotation) {
@@ -304,7 +277,7 @@ class FirRenderer(
override fun visitField(field: FirField) { override fun visitField(field: FirField) {
visitVariable(field) visitVariable(field)
println() printer.newLine()
} }
override fun visitProperty(property: FirProperty) { override fun visitProperty(property: FirProperty) {
@@ -328,7 +301,7 @@ class FirRenderer(
visitCallableDeclaration(simpleFunction) visitCallableDeclaration(simpleFunction)
bodyRenderer?.render(simpleFunction) bodyRenderer?.render(simpleFunction)
if (simpleFunction.body == null) { if (simpleFunction.body == null) {
println() printer.newLine()
} }
} }
@@ -411,7 +384,7 @@ class FirRenderer(
visitMemberDeclaration(typeAlias) visitMemberDeclaration(typeAlias)
print(" = ") print(" = ")
typeAlias.expandedTypeRef.accept(this) typeAlias.expandedTypeRef.accept(this)
println() printer.newLine()
} }
override fun visitTypeParameter(typeParameter: FirTypeParameter) { override fun visitTypeParameter(typeParameter: FirTypeParameter) {
@@ -497,13 +470,13 @@ class FirRenderer(
} else { } else {
whenExpression.subject?.accept(this) whenExpression.subject?.accept(this)
} }
println(") {") printer.println(") {")
pushIndent() printer.pushIndent()
for (branch in whenExpression.branches) { for (branch in whenExpression.branches) {
branch.accept(this) branch.accept(this)
} }
popIndent() printer.popIndent()
println("}") printer.println("}")
} }
override fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression) { override fun visitWhenSubjectExpression(whenSubjectExpression: FirWhenSubjectExpression) {