[FIR] Add contracts to FIR renderer
This commit is contained in:
@@ -10,12 +10,14 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
|
||||||
|
import org.jetbrains.kotlin.fir.contracts.description.ConeContractRenderer
|
||||||
|
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.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
|
import org.jetbrains.kotlin.fir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression
|
|
||||||
import org.jetbrains.kotlin.fir.references.*
|
import org.jetbrains.kotlin.fir.references.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||||
@@ -157,6 +159,14 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
|
|||||||
}
|
}
|
||||||
print(": ")
|
print(": ")
|
||||||
callableDeclaration.returnTypeRef.accept(this)
|
callableDeclaration.returnTypeRef.accept(this)
|
||||||
|
callableDeclaration.renderContractDescription()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun FirDeclaration.renderContractDescription() {
|
||||||
|
val contractDescription = (this as? FirContractDescriptionOwner)?.contractDescription ?: return
|
||||||
|
pushIndent()
|
||||||
|
contractDescription.accept(this@FirRenderer)
|
||||||
|
popIndent()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Visibility.asString(effectiveVisibility: FirEffectiveVisibility? = null): String {
|
private fun Visibility.asString(effectiveVisibility: FirEffectiveVisibility? = null): String {
|
||||||
@@ -310,12 +320,12 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun renderInBraces(f: () -> Unit) {
|
fun renderInBraces(leftBrace: String = "{", rightBrace: String = "}", f: () -> Unit) {
|
||||||
println(" {")
|
println(" $leftBrace")
|
||||||
pushIndent()
|
pushIndent()
|
||||||
f()
|
f()
|
||||||
popIndent()
|
popIndent()
|
||||||
println("}")
|
println(rightBrace)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun renderSupertypes(regularClass: FirRegularClass) {
|
fun renderSupertypes(regularClass: FirRegularClass) {
|
||||||
@@ -423,6 +433,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
|
|||||||
propertyAccessor.valueParameters.renderParameters()
|
propertyAccessor.valueParameters.renderParameters()
|
||||||
print(": ")
|
print(": ")
|
||||||
propertyAccessor.returnTypeRef.accept(this)
|
propertyAccessor.returnTypeRef.accept(this)
|
||||||
|
propertyAccessor.renderContractDescription()
|
||||||
propertyAccessor.body?.renderBody()
|
propertyAccessor.body?.renderBody()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1116,4 +1127,27 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
|
|||||||
override fun visitErrorNamedReference(errorNamedReference: FirErrorNamedReference) {
|
override fun visitErrorNamedReference(errorNamedReference: FirErrorNamedReference) {
|
||||||
visitNamedReference(errorNamedReference)
|
visitNamedReference(errorNamedReference)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) {
|
||||||
|
newLine()
|
||||||
|
print("[Contract description]")
|
||||||
|
renderInBraces("<", ">") {
|
||||||
|
rawContractDescription.contractCall.accept(this)
|
||||||
|
newLine()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription) {
|
||||||
|
newLine()
|
||||||
|
println("[R|Contract description]")
|
||||||
|
renderInBraces("<", ">") {
|
||||||
|
for (effect in resolvedContractDescription.effects) {
|
||||||
|
println(buildString { effect.accept(ConeContractRenderer(this), null) })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitContractDescription(contractDescription: FirContractDescription) {
|
||||||
|
require(contractDescription is FirEmptyContractDescription)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user