FirRenderer: code cleanup & move parts to contract renderer

This commit is contained in:
Mikhail Glukhikh
2022-07-08 16:49:49 +02:00
committed by Space
parent 801426d0e6
commit ac34fe3306
3 changed files with 99 additions and 110 deletions
@@ -48,6 +48,6 @@ abstract class ConeContractDescriptionVisitor<out R, in D> {
open fun visitValueParameterReference(valueParameterReference: ConeValueParameterReference, data: D): R = open fun visitValueParameterReference(valueParameterReference: ConeValueParameterReference, data: D): R =
visitValue(valueParameterReference, data) visitValue(valueParameterReference, data)
open fun visitBooleanValueParameterReference(booleanValueParameterReference: ConeBooleanValueParameterReference, data: D): R = open fun visitBooleanValueParameterReference(booleanValueParameterReference: ConeBooleanValueParameterReference, data: D): R =
visitValueParameterReference(booleanValueParameterReference, data) visitValueParameterReference(booleanValueParameterReference, data)
} }
@@ -5,6 +5,10 @@
package org.jetbrains.kotlin.fir.contracts.description package org.jetbrains.kotlin.fir.contracts.description
import org.jetbrains.kotlin.fir.contracts.*
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.renderer.FirRendererComponents import org.jetbrains.kotlin.fir.renderer.FirRendererComponents
import org.jetbrains.kotlin.fir.types.renderForDebugging import org.jetbrains.kotlin.fir.types.renderForDebugging
@@ -12,6 +16,63 @@ class ConeContractRenderer : ConeContractDescriptionVisitor<Unit, Nothing?>() {
internal lateinit var components: FirRendererComponents internal lateinit var components: FirRendererComponents
private val printer get() = components.printer private val printer get() = components.printer
private val visitor get() = components.visitor
fun render(declaration: FirDeclaration) {
val contractDescription = (declaration as? FirContractDescriptionOwner)?.contractDescription ?: return
render(contractDescription)
}
fun render(contractDescription: FirContractDescription) {
printer.pushIndent()
if (contractDescription !is FirEmptyContractDescription) {
printer.newLine()
val prefix = if (contractDescription is FirResolvedContractDescription) "R|" else ""
printer.print("[${prefix}Contract description]")
}
when (contractDescription) {
is FirLegacyRawContractDescription -> render(contractDescription)
is FirRawContractDescription -> render(contractDescription)
is FirResolvedContractDescription -> {
printer.println()
render(contractDescription)
}
}
printer.popIndent()
}
fun render(effectDeclaration: FirEffectDeclaration) {
printer.newLine()
printer.println("[Effect declaration] <")
effectDeclaration.effect.accept(this, null)
printer.println()
printer.println(">")
}
internal fun render(legacyRawContractDescription: FirLegacyRawContractDescription) {
printer.renderInBraces("<", ">") {
legacyRawContractDescription.contractCall.accept(visitor)
printer.newLine()
}
}
internal fun render(rawContractDescription: FirRawContractDescription) {
printer.renderInBraces("<", ">") {
printer.renderSeparatedWithNewlines(rawContractDescription.rawEffects, visitor)
printer.newLine()
}
}
internal fun render(resolvedContractDescription: FirResolvedContractDescription) {
printer.println(" <")
printer.pushIndent()
resolvedContractDescription.effects.forEach { declaration ->
declaration.effect.accept(this, null)
printer.println()
}
printer.popIndent()
printer.println(">")
}
override fun visitConditionalEffectDeclaration(conditionalEffect: ConeConditionalEffectDeclaration, data: Nothing?) { override fun visitConditionalEffectDeclaration(conditionalEffect: ConeConditionalEffectDeclaration, data: Nothing?) {
conditionalEffect.effect.accept(this, data) conditionalEffect.effect.accept(this, data)
@@ -114,47 +114,35 @@ class FirRenderer(
visitor.visitMemberDeclaration(firClass) visitor.visitMemberDeclaration(firClass)
} }
private class FirComponentsImpl : FirRendererComponents { fun renderAnnotations(annotationContainer: FirAnnotationContainer) {
override var annotationRenderer: FirAnnotationRenderer? = null annotationRenderer?.render(annotationContainer)
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 List<ConeKotlinType>.renderTypesSeparated() { fun renderSupertypes(regularClass: FirRegularClass) {
for ((index, element) in this.withIndex()) { if (regularClass.superTypeRefs.isNotEmpty()) {
if (index > 0) { print(" : ")
print(", ") renderSeparated(regularClass.superTypeRefs, visitor)
}
print(element.renderForDebugging())
} }
} }
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 {
@@ -173,13 +161,6 @@ class FirRenderer(
newLine() newLine()
} }
private fun FirDeclaration.renderContractDescription() {
val contractDescription = (this as? FirContractDescriptionOwner)?.contractDescription ?: return
pushIndent()
contractDescription.accept(visitor)
popIndent()
}
private fun List<FirTypeParameterRef>.renderTypeParameters() { private fun List<FirTypeParameterRef>.renderTypeParameters() {
if (isNotEmpty()) { if (isNotEmpty()) {
print("<") print("<")
@@ -196,27 +177,6 @@ class FirRenderer(
} }
} }
fun renderSupertypes(regularClass: FirRegularClass) {
if (regularClass.superTypeRefs.isNotEmpty()) {
print(" : ")
renderSeparated(regularClass.superTypeRefs, visitor)
}
}
fun renderAnnotations(annotationContainer: FirAnnotationContainer) {
annotationRenderer?.render(annotationContainer)
}
fun renderClassDeclarations(regularClass: FirRegularClass) {
classMemberRenderer.render(regularClass)
}
private fun visitAssignment(operation: FirOperation, rValue: FirExpression) {
print(operation.operator)
print(" ")
rValue.accept(visitor)
}
inner class Visitor internal constructor() : FirVisitorVoid() { inner class Visitor internal constructor() : FirVisitorVoid() {
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement) {
@@ -266,7 +226,7 @@ class FirRenderer(
} }
print(": ") print(": ")
callableDeclaration.returnTypeRef.accept(this) callableDeclaration.returnTypeRef.accept(this)
callableDeclaration.renderContractDescription() contractRenderer?.render(callableDeclaration)
} }
override fun visitContextReceiver(contextReceiver: FirContextReceiver) { override fun visitContextReceiver(contextReceiver: FirContextReceiver) {
@@ -327,7 +287,7 @@ class FirRenderer(
annotationRenderer?.render(regularClass) annotationRenderer?.render(regularClass)
visitMemberDeclaration(regularClass) visitMemberDeclaration(regularClass)
renderSupertypes(regularClass) renderSupertypes(regularClass)
renderClassDeclarations(regularClass) classMemberRenderer.render(regularClass)
} }
override fun visitEnumEntry(enumEntry: FirEnumEntry) { override fun visitEnumEntry(enumEntry: FirEnumEntry) {
@@ -421,7 +381,7 @@ class FirRenderer(
valueParameterRenderer.renderParameters(propertyAccessor.valueParameters) valueParameterRenderer.renderParameters(propertyAccessor.valueParameters)
print(": ") print(": ")
propertyAccessor.returnTypeRef.accept(this) propertyAccessor.returnTypeRef.accept(this)
propertyAccessor.renderContractDescription() contractRenderer?.render(propertyAccessor)
bodyRenderer?.render(propertyAccessor) bodyRenderer?.render(propertyAccessor)
} }
@@ -879,9 +839,12 @@ class FirRenderer(
if (resolvedNamedReference is FirResolvedCallableReference) { if (resolvedNamedReference is FirResolvedCallableReference) {
if (resolvedNamedReference.inferredTypeArguments.isNotEmpty()) { if (resolvedNamedReference.inferredTypeArguments.isNotEmpty()) {
print("<") print("<")
for ((index, element) in resolvedNamedReference.inferredTypeArguments.withIndex()) {
resolvedNamedReference.inferredTypeArguments.renderTypesSeparated() if (index > 0) {
print(", ")
}
typeRenderer.render(element)
}
print(">") print(">")
} }
} }
@@ -1007,7 +970,9 @@ class FirRenderer(
visitQualifiedAccess(variableAssignment) visitQualifiedAccess(variableAssignment)
variableAssignment.lValue.accept(this) variableAssignment.lValue.accept(this)
print(" ") print(" ")
visitAssignment(FirOperation.ASSIGN, variableAssignment.rValue) print(FirOperation.ASSIGN.operator)
print(" ")
variableAssignment.rValue.accept(visitor)
} }
override fun visitAugmentedArraySetCall(augmentedArraySetCall: FirAugmentedArraySetCall) { override fun visitAugmentedArraySetCall(augmentedArraySetCall: FirAugmentedArraySetCall) {
@@ -1118,45 +1083,8 @@ class FirRenderer(
visitNamedReference(errorNamedReference) visitNamedReference(errorNamedReference)
} }
override fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription) {
newLine()
print("[Contract description]")
renderInBraces("<", ">") {
legacyRawContractDescription.contractCall.accept(this)
newLine()
}
}
override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) {
newLine()
print("[Contract description]")
renderInBraces("<", ">") {
renderSeparatedWithNewlines(rawContractDescription.rawEffects, visitor)
newLine()
}
}
override fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration) { override fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration) {
newLine() contractRenderer?.render(effectDeclaration)
println("[Effect declaration] <")
contractRenderer?.let { effectDeclaration.effect.accept(it, null) }
println()
println(">")
}
override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription) {
newLine()
println("[R|Contract description]")
println(" <")
pushIndent()
resolvedContractDescription.effects.forEach { declaration ->
contractRenderer?.let {
declaration.effect.accept(it, null)
println()
}
}
popIndent()
println(">")
} }
override fun visitContractDescription(contractDescription: FirContractDescription) { override fun visitContractDescription(contractDescription: FirContractDescription) {