[FIR] Add a Fir node that wraps a ConeEffectDeclaration

This commit is contained in:
Arsen Nagdalian
2020-07-19 02:08:01 +03:00
parent 32a64b888e
commit 991b18fec4
19 changed files with 176 additions and 21 deletions
@@ -33,7 +33,7 @@ class FirContractSerializer {
private class ContractSerializerWorker(private val parentSerializer: FirElementSerializer) { private class ContractSerializerWorker(private val parentSerializer: FirElementSerializer) {
fun contractProto(contractDescription: FirContractDescription): ProtoBuf.Contract.Builder { fun contractProto(contractDescription: FirContractDescription): ProtoBuf.Contract.Builder {
return ProtoBuf.Contract.newBuilder().apply { return ProtoBuf.Contract.newBuilder().apply {
contractDescription.effects?.forEach { addEffect(effectProto(it, contractDescription)) } contractDescription.effects?.forEach { addEffect(effectProto(it.effect, contractDescription)) }
} }
} }
@@ -7,8 +7,11 @@ package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.builder.buildEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription
import org.jetbrains.kotlin.fir.contracts.description.* import org.jetbrains.kotlin.fir.contracts.description.*
import org.jetbrains.kotlin.fir.contracts.toFirEffectDeclaration
import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.expressions.LogicOperationKind import org.jetbrains.kotlin.fir.expressions.LogicOperationKind
@@ -24,7 +27,7 @@ class FirContractDeserializer(private val c: FirDeserializationContext) {
fun loadContract(proto: ProtoBuf.Contract, owner: FirContractDescriptionOwner): FirContractDescription? { fun loadContract(proto: ProtoBuf.Contract, owner: FirContractDescriptionOwner): FirContractDescription? {
val effects = proto.effectList.map { loadPossiblyConditionalEffect(it, owner) ?: return null } val effects = proto.effectList.map { loadPossiblyConditionalEffect(it, owner) ?: return null }
return buildResolvedContractDescription { return buildResolvedContractDescription {
this.effects += effects this.effects += effects.map { it.toFirEffectDeclaration() }
} }
} }
@@ -779,7 +779,7 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
} }
val contractDescription = owner?.contractDescription as? FirResolvedContractDescription ?: return val contractDescription = owner?.contractDescription as? FirResolvedContractDescription ?: return
val conditionalEffects = contractDescription.effects.filterIsInstance<ConeConditionalEffectDeclaration>() val conditionalEffects = contractDescription.effects.map { it.effect }.filterIsInstance<ConeConditionalEffectDeclaration>()
if (conditionalEffects.isEmpty()) return if (conditionalEffects.isEmpty()) return
val argumentsMapping = createArgumentsMapping(qualifiedAccess) ?: return val argumentsMapping = createArgumentsMapping(qualifiedAccess) ?: return
contractDescriptionVisitingMode = true contractDescriptionVisitingMode = true
@@ -63,7 +63,9 @@ object InvocationKindTransformer : FirTransformer<Nothing?>() {
val argumentMapping = calleeReference.candidate.argumentMapping ?: return functionCall.compose() val argumentMapping = calleeReference.candidate.argumentMapping ?: return functionCall.compose()
val function = calleeReference.candidateSymbol.fir as? FirSimpleFunction ?: return functionCall.compose() val function = calleeReference.candidateSymbol.fir as? FirSimpleFunction ?: return functionCall.compose()
val callsEffects = function.contractDescription.effects?.filterIsInstance<ConeCallsEffectDeclaration>() ?: emptyList() val callsEffects = function.contractDescription.effects
?.map { it.effect }
?.filterIsInstance<ConeCallsEffectDeclaration>() ?: emptyList()
val isInline = function.isInline val isInline = function.isInline
if (callsEffects.isEmpty() && !isInline) { if (callsEffects.isEmpty() && !isInline) {
@@ -7,9 +7,11 @@ package org.jetbrains.kotlin.fir.resolve.transformers.contracts
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.builder.buildEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
import org.jetbrains.kotlin.fir.contracts.toFirEffectDeclaration
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.errorTypeFromPrototype import org.jetbrains.kotlin.fir.errorTypeFromPrototype
@@ -137,7 +139,7 @@ class FirContractResolveTransformer(
if (effect == null) { if (effect == null) {
unresolvedEffects += statement unresolvedEffects += statement
} else { } else {
effects += effect effects += effect.toFirEffectDeclaration(statement.source)
} }
} }
this.source = owner.contractDescription.source this.source = owner.contractDescription.source
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.contracts
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirEffectDeclaration : FirPureAbstractElement(), FirElement {
abstract override val source: FirSourceElement?
abstract val effect: ConeEffectDeclaration
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitEffectDeclaration(this, data)
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.contracts package org.jetbrains.kotlin.fir.contracts
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -17,7 +16,7 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirResolvedContractDescription : FirContractDescription() { abstract class FirResolvedContractDescription : FirContractDescription() {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract val effects: List<ConeEffectDeclaration> abstract val effects: List<FirEffectDeclaration>
abstract val unresolvedEffects: List<FirStatement> abstract val unresolvedEffects: List<FirStatement>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedContractDescription(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedContractDescription(this, data)
@@ -0,0 +1,41 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.contracts.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.impl.FirEffectDeclarationImpl
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
class FirEffectDeclarationBuilder {
var source: FirSourceElement? = null
lateinit var effect: ConeEffectDeclaration
fun build(): FirEffectDeclaration {
return FirEffectDeclarationImpl(
source,
effect,
)
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildEffectDeclaration(init: FirEffectDeclarationBuilder.() -> Unit): FirEffectDeclaration {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
return FirEffectDeclarationBuilder().apply(init).build()
}
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.contracts.builder
import kotlin.contracts.* import kotlin.contracts.*
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.impl.FirResolvedContractDescriptionImpl import org.jetbrains.kotlin.fir.contracts.impl.FirResolvedContractDescriptionImpl
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.*
@FirBuilderDsl @FirBuilderDsl
class FirResolvedContractDescriptionBuilder { class FirResolvedContractDescriptionBuilder {
var source: FirSourceElement? = null var source: FirSourceElement? = null
val effects: MutableList<ConeEffectDeclaration> = mutableListOf() val effects: MutableList<FirEffectDeclaration> = mutableListOf()
val unresolvedEffects: MutableList<FirStatement> = mutableListOf() val unresolvedEffects: MutableList<FirStatement> = mutableListOf()
fun build(): FirResolvedContractDescription { fun build(): FirResolvedContractDescription {
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.contracts.impl
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
internal class FirEffectDeclarationImpl(
override val source: FirSourceElement?,
override val effect: ConeEffectDeclaration,
) : FirEffectDeclaration() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirEffectDeclarationImpl {
return this
}
}
@@ -6,8 +6,8 @@
package org.jetbrains.kotlin.fir.contracts.impl package org.jetbrains.kotlin.fir.contracts.impl
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.fir.visitors.*
@@ -18,14 +18,16 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirResolvedContractDescriptionImpl( internal class FirResolvedContractDescriptionImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override val effects: MutableList<ConeEffectDeclaration>, override val effects: MutableList<FirEffectDeclaration>,
override val unresolvedEffects: MutableList<FirStatement>, override val unresolvedEffects: MutableList<FirStatement>,
) : FirResolvedContractDescription() { ) : FirResolvedContractDescription() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
effects.forEach { it.accept(visitor, data) }
unresolvedEffects.forEach { it.accept(visitor, data) } unresolvedEffects.forEach { it.accept(visitor, data) }
} }
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirResolvedContractDescriptionImpl { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirResolvedContractDescriptionImpl {
effects.transformInplace(transformer, data)
unresolvedEffects.transformInplace(transformer, data) unresolvedEffects.transformInplace(transformer, data)
return this return this
} }
@@ -127,6 +127,7 @@ import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
@@ -625,6 +626,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(composedSuperTypeRef, data) return transformElement(composedSuperTypeRef, data)
} }
open fun transformEffectDeclaration(effectDeclaration: FirEffectDeclaration, data: D): CompositeTransformResult<FirEffectDeclaration> {
return transformElement(effectDeclaration, data)
}
open fun transformContractDescription(contractDescription: FirContractDescription, data: D): CompositeTransformResult<FirContractDescription> { open fun transformContractDescription(contractDescription: FirContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformElement(contractDescription, data) return transformElement(contractDescription, data)
} }
@@ -1125,6 +1130,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformComposedSuperTypeRef(composedSuperTypeRef, data) return transformComposedSuperTypeRef(composedSuperTypeRef, data)
} }
final override fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration, data: D): CompositeTransformResult<FirEffectDeclaration> {
return transformEffectDeclaration(effectDeclaration, data)
}
final override fun visitContractDescription(contractDescription: FirContractDescription, data: D): CompositeTransformResult<FirContractDescription> { final override fun visitContractDescription(contractDescription: FirContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformContractDescription(contractDescription, data) return transformContractDescription(contractDescription, data)
} }
@@ -127,6 +127,7 @@ import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
@@ -381,6 +382,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitComposedSuperTypeRef(composedSuperTypeRef: FirComposedSuperTypeRef, data: D): R = visitElement(composedSuperTypeRef, data) open fun visitComposedSuperTypeRef(composedSuperTypeRef: FirComposedSuperTypeRef, data: D): R = visitElement(composedSuperTypeRef, data)
open fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration, data: D): R = visitElement(effectDeclaration, data)
open fun visitContractDescription(contractDescription: FirContractDescription, data: D): R = visitElement(contractDescription, data) open fun visitContractDescription(contractDescription: FirContractDescription, data: D): R = visitElement(contractDescription, data)
open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): R = visitElement(rawContractDescription, data) open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): R = visitElement(rawContractDescription, data)
@@ -127,6 +127,7 @@ import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
@@ -623,6 +624,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(composedSuperTypeRef) visitElement(composedSuperTypeRef)
} }
open fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration) {
visitElement(effectDeclaration)
}
open fun visitContractDescription(contractDescription: FirContractDescription) { open fun visitContractDescription(contractDescription: FirContractDescription) {
visitElement(contractDescription) visitElement(contractDescription)
} }
@@ -1123,6 +1128,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitComposedSuperTypeRef(composedSuperTypeRef) visitComposedSuperTypeRef(composedSuperTypeRef)
} }
final override fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration, data: Nothing?) {
visitEffectDeclaration(effectDeclaration)
}
final override fun visitContractDescription(contractDescription: FirContractDescription, data: Nothing?) { final override fun visitContractDescription(contractDescription: FirContractDescription, data: Nothing?) {
visitContractDescription(contractDescription) visitContractDescription(contractDescription)
} }
@@ -7,9 +7,7 @@ package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
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.*
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.description.ConeContractRenderer
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
@@ -108,6 +106,16 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
} }
} }
private fun List<FirElement>.renderSeparatedWithNewlines() {
for ((index, element) in this.withIndex()) {
if (index > 0) {
print(",")
newLine()
}
element.accept(this@FirRenderer)
}
}
private fun List<ConeKotlinType>.renderTypesSeparated() { private fun List<ConeKotlinType>.renderTypesSeparated() {
for ((index, element) in this.withIndex()) { for ((index, element) in this.withIndex()) {
if (index > 0) { if (index > 0) {
@@ -1189,13 +1197,23 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
} }
} }
override fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration) {
newLine()
print("[Effect declaration]")
renderInBraces("<", ">") {
println(buildString { effectDeclaration.effect.accept(ConeContractRenderer(this), null) })
}
}
override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription) { override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription) {
newLine() newLine()
println("[R|Contract description]") println("[R|Contract description]")
renderInBraces("<", ">") { renderInBraces("<", ">") {
for (effect in resolvedContractDescription.effects) { resolvedContractDescription.effects
println(buildString { effect.accept(ConeContractRenderer(this), null) }) .map { it.effect }
} .forEach {
println(buildString { it.accept(ConeContractRenderer(this), null) })
}
} }
} }
@@ -5,7 +5,17 @@
package org.jetbrains.kotlin.fir.contracts package org.jetbrains.kotlin.fir.contracts
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.contracts.builder.buildEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
val FirContractDescription.effects: List<ConeEffectDeclaration>? val FirContractDescription.effects: List<FirEffectDeclaration>?
get() = (this as? FirResolvedContractDescription)?.effects get() = (this as? FirResolvedContractDescription)?.effects
fun ConeEffectDeclaration.toFirEffectDeclaration(source: FirSourceElement? = null): FirEffectDeclaration =
buildEffectDeclaration {
if (source != null) {
this.source = source
}
effect = this@toFirEffectDeclaration
}
@@ -151,6 +151,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val implicitTypeRef = element("ImplicitTypeRef", TypeRef, typeRef) val implicitTypeRef = element("ImplicitTypeRef", TypeRef, typeRef)
val composedSuperTypeRef = element("ComposedSuperTypeRef", TypeRef, typeRef) val composedSuperTypeRef = element("ComposedSuperTypeRef", TypeRef, typeRef)
val effectDeclaration = element("EffectDeclaration", Contracts)
val contractDescription = element("ContractDescription", Contracts) val contractDescription = element("ContractDescription", Contracts)
val rawContractDescription = element("RawContractDescription", Contracts, contractDescription) val rawContractDescription = element("RawContractDescription", Contracts, contractDescription)
val resolvedContractDescription = element("ResolvedContractDescription", Contracts, contractDescription) val resolvedContractDescription = element("ResolvedContractDescription", Contracts, contractDescription)
@@ -605,12 +605,16 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+field(varianceType) +field(varianceType)
} }
effectDeclaration.configure {
+field("effect", coneEffectDeclarationType)
}
rawContractDescription.configure { rawContractDescription.configure {
+field("contractCall", functionCall) +field("contractCall", functionCall)
} }
resolvedContractDescription.configure { resolvedContractDescription.configure {
+fieldList("effects", effectDeclarationType) +fieldList("effects", effectDeclaration)
+fieldList("unresolvedEffects", statement) +fieldList("unresolvedEffects", statement)
} }
} }
@@ -74,7 +74,7 @@ val firScopeProviderType = type("fir.scopes", "FirScopeProvider")
val anonymousInitializerSymbolType = type("fir.symbols.impl", "FirAnonymousInitializerSymbol") val anonymousInitializerSymbolType = type("fir.symbols.impl", "FirAnonymousInitializerSymbol")
val pureAbstractElementType = generatedType("FirPureAbstractElement") val pureAbstractElementType = generatedType("FirPureAbstractElement")
val effectDeclarationType = type("fir.contracts.description", "ConeEffectDeclaration") val coneEffectDeclarationType = type("fir.contracts.description", "ConeEffectDeclaration")
val emptyContractDescriptionType = generatedType("contracts.impl", "FirEmptyContractDescription") val emptyContractDescriptionType = generatedType("contracts.impl", "FirEmptyContractDescription")
val coneDiagnosticType = generatedType("diagnostics", "ConeDiagnostic") val coneDiagnosticType = generatedType("diagnostics", "ConeDiagnostic")
val coneStubDiagnosticType = generatedType("diagnostics", "ConeStubDiagnostic") val coneStubDiagnosticType = generatedType("diagnostics", "ConeStubDiagnostic")