diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirContractSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirContractSerializer.kt index 18e4b00d609..a5eeda6371a 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirContractSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirContractSerializer.kt @@ -33,7 +33,7 @@ class FirContractSerializer { private class ContractSerializerWorker(private val parentSerializer: FirElementSerializer) { fun contractProto(contractDescription: FirContractDescription): ProtoBuf.Contract.Builder { return ProtoBuf.Contract.newBuilder().apply { - contractDescription.effects?.forEach { addEffect(effectProto(it, contractDescription)) } + contractDescription.effects?.forEach { addEffect(effectProto(it.effect, contractDescription)) } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirContractDeserializer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirContractDeserializer.kt index fb49474cc0f..cd69f9a1bbf 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirContractDeserializer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/FirContractDeserializer.kt @@ -7,8 +7,11 @@ package org.jetbrains.kotlin.fir.deserialization import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange 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.description.* +import org.jetbrains.kotlin.fir.contracts.toFirEffectDeclaration import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction 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? { val effects = proto.effectList.map { loadPossiblyConditionalEffect(it, owner) ?: return null } return buildResolvedContractDescription { - this.effects += effects + this.effects += effects.map { it.toFirEffectDeclaration() } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 09cbcc91758..b20c3ddad5a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -779,7 +779,7 @@ abstract class FirDataFlowAnalyzer( } val contractDescription = owner?.contractDescription as? FirResolvedContractDescription ?: return - val conditionalEffects = contractDescription.effects.filterIsInstance() + val conditionalEffects = contractDescription.effects.map { it.effect }.filterIsInstance() if (conditionalEffects.isEmpty()) return val argumentsMapping = createArgumentsMapping(qualifiedAccess) ?: return contractDescriptionVisitingMode = true diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/InvocationKindTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/InvocationKindTransformer.kt index 069f9cbf50c..fbfc03a2818 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/InvocationKindTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/InvocationKindTransformer.kt @@ -63,7 +63,9 @@ object InvocationKindTransformer : FirTransformer() { val argumentMapping = calleeReference.candidate.argumentMapping ?: return functionCall.compose() val function = calleeReference.candidateSymbol.fir as? FirSimpleFunction ?: return functionCall.compose() - val callsEffects = function.contractDescription.effects?.filterIsInstance() ?: emptyList() + val callsEffects = function.contractDescription.effects + ?.map { it.effect } + ?.filterIsInstance() ?: emptyList() val isInline = function.isInline if (callsEffects.isEmpty() && !isInline) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt index 4bc3fbb61e9..3a6146d89d2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt @@ -7,9 +7,11 @@ package org.jetbrains.kotlin.fir.resolve.transformers.contracts import org.jetbrains.kotlin.fir.FirSession 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.description.ConeEffectDeclaration 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.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.errorTypeFromPrototype @@ -137,7 +139,7 @@ class FirContractResolveTransformer( if (effect == null) { unresolvedEffects += statement } else { - effects += effect + effects += effect.toFirEffectDeclaration(statement.source) } } this.source = owner.contractDescription.source diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirEffectDeclaration.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirEffectDeclaration.kt new file mode 100644 index 00000000000..e915dc2527b --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirEffectDeclaration.kt @@ -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 accept(visitor: FirVisitor, data: D): R = visitor.visitEffectDeclaration(this, data) +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirResolvedContractDescription.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirResolvedContractDescription.kt index abc6bb7bb80..f5bf67fb1be 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirResolvedContractDescription.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirResolvedContractDescription.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.fir.contracts 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.visitors.* @@ -17,7 +16,7 @@ import org.jetbrains.kotlin.fir.visitors.* abstract class FirResolvedContractDescription : FirContractDescription() { abstract override val source: FirSourceElement? - abstract val effects: List + abstract val effects: List abstract val unresolvedEffects: List override fun accept(visitor: FirVisitor, data: D): R = visitor.visitResolvedContractDescription(this, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirEffectDeclarationBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirEffectDeclarationBuilder.kt new file mode 100644 index 00000000000..5bb8e9ebc58 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirEffectDeclarationBuilder.kt @@ -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() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirResolvedContractDescriptionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirResolvedContractDescriptionBuilder.kt index 0413fbf1caf..bf9a4036fb1 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirResolvedContractDescriptionBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirResolvedContractDescriptionBuilder.kt @@ -8,8 +8,8 @@ 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.FirResolvedContractDescription -import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration import org.jetbrains.kotlin.fir.contracts.impl.FirResolvedContractDescriptionImpl import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.visitors.* @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.* @FirBuilderDsl class FirResolvedContractDescriptionBuilder { var source: FirSourceElement? = null - val effects: MutableList = mutableListOf() + val effects: MutableList = mutableListOf() val unresolvedEffects: MutableList = mutableListOf() fun build(): FirResolvedContractDescription { diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirEffectDeclarationImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirEffectDeclarationImpl.kt new file mode 100644 index 00000000000..9ab39cf2bf2 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirEffectDeclarationImpl.kt @@ -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 acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirEffectDeclarationImpl { + return this + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirResolvedContractDescriptionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirResolvedContractDescriptionImpl.kt index 1d889207420..36aa0504641 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirResolvedContractDescriptionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirResolvedContractDescriptionImpl.kt @@ -6,8 +6,8 @@ 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.FirResolvedContractDescription -import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.visitors.* @@ -18,14 +18,16 @@ import org.jetbrains.kotlin.fir.visitors.* internal class FirResolvedContractDescriptionImpl( override val source: FirSourceElement?, - override val effects: MutableList, + override val effects: MutableList, override val unresolvedEffects: MutableList, ) : FirResolvedContractDescription() { override fun acceptChildren(visitor: FirVisitor, data: D) { + effects.forEach { it.accept(visitor, data) } unresolvedEffects.forEach { it.accept(visitor, data) } } override fun transformChildren(transformer: FirTransformer, data: D): FirResolvedContractDescriptionImpl { + effects.transformInplace(transformer, data) unresolvedEffects.transformInplace(transformer, data) return this } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index dd71d3eee63..d8cfcc2d816 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -127,6 +127,7 @@ import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef 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.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription @@ -625,6 +626,10 @@ abstract class FirTransformer : FirVisitor { + return transformElement(effectDeclaration, data) + } + open fun transformContractDescription(contractDescription: FirContractDescription, data: D): CompositeTransformResult { return transformElement(contractDescription, data) } @@ -1125,6 +1130,10 @@ abstract class FirTransformer : FirVisitor { + return transformEffectDeclaration(effectDeclaration, data) + } + final override fun visitContractDescription(contractDescription: FirContractDescription, data: D): CompositeTransformResult { return transformContractDescription(contractDescription, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index cab6969231e..b0bfe7d96e3 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -127,6 +127,7 @@ import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef 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.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription @@ -381,6 +382,8 @@ abstract class FirVisitor { 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 visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): R = visitElement(rawContractDescription, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index be3db30cb10..43140886aed 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -127,6 +127,7 @@ import org.jetbrains.kotlin.fir.types.FirFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirResolvedFunctionTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef 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.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription @@ -623,6 +624,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(composedSuperTypeRef) } + open fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration) { + visitElement(effectDeclaration) + } + open fun visitContractDescription(contractDescription: FirContractDescription) { visitElement(contractDescription) } @@ -1123,6 +1128,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitComposedSuperTypeRef(composedSuperTypeRef) } + final override fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration, data: Nothing?) { + visitEffectDeclaration(effectDeclaration) + } + final override fun visitContractDescription(contractDescription: FirContractDescription, data: Nothing?) { visitContractDescription(contractDescription) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 1eacc60ab2d..0a413e7ed44 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -7,9 +7,7 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.builtins.functions.FunctionClassKind 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.* import org.jetbrains.kotlin.fir.contracts.description.ConeContractRenderer import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.* @@ -108,6 +106,16 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM } } + private fun List.renderSeparatedWithNewlines() { + for ((index, element) in this.withIndex()) { + if (index > 0) { + print(",") + newLine() + } + element.accept(this@FirRenderer) + } + } + private fun List.renderTypesSeparated() { for ((index, element) in this.withIndex()) { 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) { newLine() println("[R|Contract description]") renderInBraces("<", ">") { - for (effect in resolvedContractDescription.effects) { - println(buildString { effect.accept(ConeContractRenderer(this), null) }) - } + resolvedContractDescription.effects + .map { it.effect } + .forEach { + println(buildString { it.accept(ConeContractRenderer(this), null) }) + } } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt index 7603362399e..37960de9adc 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt @@ -5,7 +5,17 @@ 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 -val FirContractDescription.effects: List? - get() = (this as? FirResolvedContractDescription)?.effects \ No newline at end of file +val FirContractDescription.effects: List? + get() = (this as? FirResolvedContractDescription)?.effects + +fun ConeEffectDeclaration.toFirEffectDeclaration(source: FirSourceElement? = null): FirEffectDeclaration = + buildEffectDeclaration { + if (source != null) { + this.source = source + } + effect = this@toFirEffectDeclaration + } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index e278fe64a43..9c621d4e422 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -151,6 +151,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val implicitTypeRef = element("ImplicitTypeRef", TypeRef, typeRef) val composedSuperTypeRef = element("ComposedSuperTypeRef", TypeRef, typeRef) + val effectDeclaration = element("EffectDeclaration", Contracts) + val contractDescription = element("ContractDescription", Contracts) val rawContractDescription = element("RawContractDescription", Contracts, contractDescription) val resolvedContractDescription = element("ResolvedContractDescription", Contracts, contractDescription) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index d85e2f2a6cd..f9467eaa1ec 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -605,12 +605,16 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +field(varianceType) } + effectDeclaration.configure { + +field("effect", coneEffectDeclarationType) + } + rawContractDescription.configure { +field("contractCall", functionCall) } resolvedContractDescription.configure { - +fieldList("effects", effectDeclarationType) + +fieldList("effects", effectDeclaration) +fieldList("unresolvedEffects", statement) } } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt index 995b2d70d51..3f8adb28f10 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt @@ -74,7 +74,7 @@ val firScopeProviderType = type("fir.scopes", "FirScopeProvider") val anonymousInitializerSymbolType = type("fir.symbols.impl", "FirAnonymousInitializerSymbol") 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 coneDiagnosticType = generatedType("diagnostics", "ConeDiagnostic") val coneStubDiagnosticType = generatedType("diagnostics", "ConeStubDiagnostic")