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 =
|
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)
|
||||||
}
|
}
|
||||||
+61
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user