[FIR] Add contracts to FIR renderer

This commit is contained in:
Dmitriy Novozhilov
2020-04-08 15:21:37 +03:00
parent 50627f2c83
commit 25cee12421
@@ -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)
}
} }