FirRenderer: code cleanup & move parts to contract renderer
This commit is contained in:
+1
-1
@@ -48,6 +48,6 @@ abstract class ConeContractDescriptionVisitor<out R, in D> {
|
||||
open fun visitValueParameterReference(valueParameterReference: ConeValueParameterReference, data: D): R =
|
||||
visitValue(valueParameterReference, data)
|
||||
|
||||
open fun visitBooleanValueParameterReference(booleanValueParameterReference: ConeBooleanValueParameterReference, data: D): R =
|
||||
open fun visitBooleanValueParameterReference(booleanValueParameterReference: ConeBooleanValueParameterReference, data: D): R =
|
||||
visitValueParameterReference(booleanValueParameterReference, data)
|
||||
}
|
||||
+61
@@ -5,6 +5,10 @@
|
||||
|
||||
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.types.renderForDebugging
|
||||
|
||||
@@ -12,6 +16,63 @@ class ConeContractRenderer : ConeContractDescriptionVisitor<Unit, Nothing?>() {
|
||||
|
||||
internal lateinit var components: FirRendererComponents
|
||||
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?) {
|
||||
conditionalEffect.effect.accept(this, data)
|
||||
|
||||
@@ -114,47 +114,35 @@ class FirRenderer(
|
||||
visitor.visitMemberDeclaration(firClass)
|
||||
}
|
||||
|
||||
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
|
||||
fun renderAnnotations(annotationContainer: FirAnnotationContainer) {
|
||||
annotationRenderer?.render(annotationContainer)
|
||||
}
|
||||
|
||||
private fun List<ConeKotlinType>.renderTypesSeparated() {
|
||||
for ((index, element) in this.withIndex()) {
|
||||
if (index > 0) {
|
||||
print(", ")
|
||||
}
|
||||
print(element.renderForDebugging())
|
||||
fun renderSupertypes(regularClass: FirRegularClass) {
|
||||
if (regularClass.superTypeRefs.isNotEmpty()) {
|
||||
print(" : ")
|
||||
renderSeparated(regularClass.superTypeRefs, visitor)
|
||||
}
|
||||
}
|
||||
|
||||
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() {
|
||||
label.let {
|
||||
@@ -173,13 +161,6 @@ class FirRenderer(
|
||||
newLine()
|
||||
}
|
||||
|
||||
private fun FirDeclaration.renderContractDescription() {
|
||||
val contractDescription = (this as? FirContractDescriptionOwner)?.contractDescription ?: return
|
||||
pushIndent()
|
||||
contractDescription.accept(visitor)
|
||||
popIndent()
|
||||
}
|
||||
|
||||
private fun List<FirTypeParameterRef>.renderTypeParameters() {
|
||||
if (isNotEmpty()) {
|
||||
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() {
|
||||
|
||||
override fun visitElement(element: FirElement) {
|
||||
@@ -266,7 +226,7 @@ class FirRenderer(
|
||||
}
|
||||
print(": ")
|
||||
callableDeclaration.returnTypeRef.accept(this)
|
||||
callableDeclaration.renderContractDescription()
|
||||
contractRenderer?.render(callableDeclaration)
|
||||
}
|
||||
|
||||
override fun visitContextReceiver(contextReceiver: FirContextReceiver) {
|
||||
@@ -327,7 +287,7 @@ class FirRenderer(
|
||||
annotationRenderer?.render(regularClass)
|
||||
visitMemberDeclaration(regularClass)
|
||||
renderSupertypes(regularClass)
|
||||
renderClassDeclarations(regularClass)
|
||||
classMemberRenderer.render(regularClass)
|
||||
}
|
||||
|
||||
override fun visitEnumEntry(enumEntry: FirEnumEntry) {
|
||||
@@ -421,7 +381,7 @@ class FirRenderer(
|
||||
valueParameterRenderer.renderParameters(propertyAccessor.valueParameters)
|
||||
print(": ")
|
||||
propertyAccessor.returnTypeRef.accept(this)
|
||||
propertyAccessor.renderContractDescription()
|
||||
contractRenderer?.render(propertyAccessor)
|
||||
bodyRenderer?.render(propertyAccessor)
|
||||
}
|
||||
|
||||
@@ -879,9 +839,12 @@ class FirRenderer(
|
||||
if (resolvedNamedReference is FirResolvedCallableReference) {
|
||||
if (resolvedNamedReference.inferredTypeArguments.isNotEmpty()) {
|
||||
print("<")
|
||||
|
||||
resolvedNamedReference.inferredTypeArguments.renderTypesSeparated()
|
||||
|
||||
for ((index, element) in resolvedNamedReference.inferredTypeArguments.withIndex()) {
|
||||
if (index > 0) {
|
||||
print(", ")
|
||||
}
|
||||
typeRenderer.render(element)
|
||||
}
|
||||
print(">")
|
||||
}
|
||||
}
|
||||
@@ -1007,7 +970,9 @@ class FirRenderer(
|
||||
visitQualifiedAccess(variableAssignment)
|
||||
variableAssignment.lValue.accept(this)
|
||||
print(" ")
|
||||
visitAssignment(FirOperation.ASSIGN, variableAssignment.rValue)
|
||||
print(FirOperation.ASSIGN.operator)
|
||||
print(" ")
|
||||
variableAssignment.rValue.accept(visitor)
|
||||
}
|
||||
|
||||
override fun visitAugmentedArraySetCall(augmentedArraySetCall: FirAugmentedArraySetCall) {
|
||||
@@ -1118,45 +1083,8 @@ class FirRenderer(
|
||||
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) {
|
||||
newLine()
|
||||
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(">")
|
||||
contractRenderer?.render(effectDeclaration)
|
||||
}
|
||||
|
||||
override fun visitContractDescription(contractDescription: FirContractDescription) {
|
||||
|
||||
Reference in New Issue
Block a user