From a89e0123c7f7a79ae65bd77db81c5831da44d39e Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 8 Apr 2020 14:19:25 +0300 Subject: [PATCH] [FIR] Add fir node for raw contract description --- .../fir/java/declarations/FirJavaMethod.kt | 2 + .../FirContractDeserializer.kt | 4 +- .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 6 ++- .../transformers/InvocationKindTransformer.kt | 3 +- .../scopes/impl/FirIntegerLiteralTypeScope.kt | 2 + .../fir/contracts/FirContractDescription.kt | 2 - .../contracts/FirRawContractDescription.kt | 22 ++++++++++ .../FirResolvedContractDescription.kt | 22 ++++++++++ .../FirRawContractDescriptionBuilder.kt | 41 +++++++++++++++++++ ... FirResolvedContractDescriptionBuilder.kt} | 14 +++---- .../impl/FirRawContractDescriptionImpl.kt | 30 ++++++++++++++ ... => FirResolvedContractDescriptionImpl.kt} | 8 ++-- .../builder/FirPropertyAccessorBuilder.kt | 2 + .../builder/FirSimpleFunctionBuilder.kt | 2 + .../impl/FirPropertyAccessorImpl.kt | 3 +- .../impl/FirSimpleFunctionImpl.kt | 3 +- .../kotlin/fir/visitors/FirTransformer.kt | 18 ++++++++ .../kotlin/fir/visitors/FirVisitor.kt | 6 +++ .../kotlin/fir/visitors/FirVisitorVoid.kt | 18 ++++++++ .../kotlin/fir/contracts/ContractUtils.kt | 11 +++++ .../impl/FirEmptyContractDescription.kt | 1 - .../impl/FirDefaultPropertyAccessor.kt | 2 + .../fir/tree/generator/BuilderConfigurator.kt | 4 ++ .../fir/tree/generator/FirTreeBuilder.kt | 2 + .../generator/ImplementationConfigurator.kt | 5 +-- .../fir/tree/generator/NodeConfigurator.kt | 6 ++- 26 files changed, 212 insertions(+), 27 deletions(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirRawContractDescription.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirResolvedContractDescription.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirRawContractDescriptionBuilder.kt rename compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/{FirContractDescriptionBuilder.kt => FirResolvedContractDescriptionBuilder.kt} (63%) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirRawContractDescriptionImpl.kt rename compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/{FirContractDescriptionImpl.kt => FirResolvedContractDescriptionImpl.kt} (78%) create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt index 829f54d5826..65ae9f5e356 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl @@ -63,6 +64,7 @@ class FirJavaMethod @FirImplementationDetail constructor( body, status, containerSource, + contractDescription = FirEmptyContractDescription, name, symbol, annotations, 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 b6e00fbe5a1..271cb6e98a3 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,7 +7,7 @@ package org.jetbrains.kotlin.fir.deserialization import org.jetbrains.kotlin.contracts.description.InvocationKind import org.jetbrains.kotlin.fir.contracts.FirContractDescription -import org.jetbrains.kotlin.fir.contracts.builder.buildContractDescription +import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.description.* import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull 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 buildContractDescription { + return buildResolvedContractDescription { this.effects += effects } } 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 47864ee03bb..6ee262e9eba 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.dfa import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.description.ConeBooleanConstantReference import org.jetbrains.kotlin.fir.contracts.description.ConeConditionalEffectDeclaration import org.jetbrains.kotlin.fir.contracts.description.ConeConstantReference @@ -671,7 +672,10 @@ abstract class FirDataFlowAnalyzer( } private fun processConditionalContract(functionCall: FirFunctionCall) { - val contractDescription = (functionCall.symbol as? FirNamedFunctionSymbol)?.fir?.contractDescription ?: return + val contractDescription = (functionCall.symbol as? FirNamedFunctionSymbol) + ?.fir + ?.contractDescription as? FirResolvedContractDescription + ?: return val conditionalEffects = contractDescription.effects.filterIsInstance() if (conditionalEffects.isEmpty()) return val argumentsMapping = createArgumentsMapping(functionCall) ?: return 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 b69eba8f664..29c7f2831c7 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.contracts.description.InvocationKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.contracts.description.ConeCallsEffectDeclaration +import org.jetbrains.kotlin.fir.contracts.effects import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.isInline @@ -62,7 +63,7 @@ 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() + val callsEffects = function.contractDescription.effects?.filterIsInstance() ?: emptyList() val isInline = function.isInline if (callsEffects.isEmpty() && !isInline) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt index 74d4d135bce..f34916723ad 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirIntegerLiteralTypeScope.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirResolvePhase @@ -113,6 +114,7 @@ class FirIntegerOperator @FirImplementationDetail constructor( body = null, status, containerSource = null, + contractDescription = FirEmptyContractDescription, kind.operatorName, symbol, annotations = mutableListOf(), diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirContractDescription.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirContractDescription.kt index eb6a0f840dc..3c200fdbed3 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirContractDescription.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirContractDescription.kt @@ -8,7 +8,6 @@ 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.* /* @@ -18,7 +17,6 @@ import org.jetbrains.kotlin.fir.visitors.* abstract class FirContractDescription : FirPureAbstractElement(), FirElement { abstract override val source: FirSourceElement? - abstract val effects: List override fun accept(visitor: FirVisitor, data: D): R = visitor.visitContractDescription(this, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirRawContractDescription.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirRawContractDescription.kt new file mode 100644 index 00000000000..01400c419df --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirRawContractDescription.kt @@ -0,0 +1,22 @@ +/* + * 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.FirSourceElement +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirRawContractDescription : FirContractDescription() { + abstract override val source: FirSourceElement? + abstract val contractCall: FirFunctionCall + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitRawContractDescription(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 new file mode 100644 index 00000000000..fd6905289ef --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirResolvedContractDescription.kt @@ -0,0 +1,22 @@ +/* + * 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.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 FirResolvedContractDescription : FirContractDescription() { + abstract override val source: FirSourceElement? + abstract val effects: 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/FirRawContractDescriptionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirRawContractDescriptionBuilder.kt new file mode 100644 index 00000000000..8463a24d0aa --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirRawContractDescriptionBuilder.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.FirRawContractDescription +import org.jetbrains.kotlin.fir.contracts.impl.FirRawContractDescriptionImpl +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +class FirRawContractDescriptionBuilder { + var source: FirSourceElement? = null + lateinit var contractCall: FirFunctionCall + + fun build(): FirRawContractDescription { + return FirRawContractDescriptionImpl( + source, + contractCall, + ) + } + +} + +@OptIn(ExperimentalContracts::class) +inline fun buildRawContractDescription(init: FirRawContractDescriptionBuilder.() -> Unit): FirRawContractDescription { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirRawContractDescriptionBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirContractDescriptionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirResolvedContractDescriptionBuilder.kt similarity index 63% rename from compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirContractDescriptionBuilder.kt rename to compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirResolvedContractDescriptionBuilder.kt index f5fad6d7f57..31f1bcfed09 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirContractDescriptionBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirResolvedContractDescriptionBuilder.kt @@ -8,9 +8,9 @@ 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.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration -import org.jetbrains.kotlin.fir.contracts.impl.FirContractDescriptionImpl +import org.jetbrains.kotlin.fir.contracts.impl.FirResolvedContractDescriptionImpl import org.jetbrains.kotlin.fir.visitors.* /* @@ -19,12 +19,12 @@ import org.jetbrains.kotlin.fir.visitors.* */ @FirBuilderDsl -class FirContractDescriptionBuilder { +class FirResolvedContractDescriptionBuilder { var source: FirSourceElement? = null val effects: MutableList = mutableListOf() - fun build(): FirContractDescription { - return FirContractDescriptionImpl( + fun build(): FirResolvedContractDescription { + return FirResolvedContractDescriptionImpl( source, effects, ) @@ -33,9 +33,9 @@ class FirContractDescriptionBuilder { } @OptIn(ExperimentalContracts::class) -inline fun buildContractDescription(init: FirContractDescriptionBuilder.() -> Unit = {}): FirContractDescription { +inline fun buildResolvedContractDescription(init: FirResolvedContractDescriptionBuilder.() -> Unit = {}): FirResolvedContractDescription { contract { callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) } - return FirContractDescriptionBuilder().apply(init).build() + return FirResolvedContractDescriptionBuilder().apply(init).build() } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirRawContractDescriptionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirRawContractDescriptionImpl.kt new file mode 100644 index 00000000000..5080c6d45e2 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirRawContractDescriptionImpl.kt @@ -0,0 +1,30 @@ +/* + * 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.FirRawContractDescription +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +internal class FirRawContractDescriptionImpl( + override val source: FirSourceElement?, + override var contractCall: FirFunctionCall, +) : FirRawContractDescription() { + override fun acceptChildren(visitor: FirVisitor, data: D) { + contractCall.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirRawContractDescriptionImpl { + contractCall = contractCall.transformSingle(transformer, data) + return this + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirContractDescriptionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirResolvedContractDescriptionImpl.kt similarity index 78% rename from compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirContractDescriptionImpl.kt rename to compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirResolvedContractDescriptionImpl.kt index 4b5149f636a..f9ddb13463e 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirContractDescriptionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirResolvedContractDescriptionImpl.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.fir.contracts.impl import org.jetbrains.kotlin.fir.FirSourceElement -import org.jetbrains.kotlin.fir.contracts.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration import org.jetbrains.kotlin.fir.visitors.* @@ -15,13 +15,13 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -internal class FirContractDescriptionImpl( +internal class FirResolvedContractDescriptionImpl( override val source: FirSourceElement?, override val effects: MutableList, -) : FirContractDescription() { +) : FirResolvedContractDescription() { override fun acceptChildren(visitor: FirVisitor, data: D) {} - override fun transformChildren(transformer: FirTransformer, data: D): FirContractDescriptionImpl { + override fun transformChildren(transformer: FirTransformer, data: D): FirResolvedContractDescriptionImpl { return this } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyAccessorBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyAccessorBuilder.kt index 4a9dfc4bb99..d19648dea0c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyAccessorBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPropertyAccessorBuilder.kt @@ -42,6 +42,7 @@ class FirPropertyAccessorBuilder : FirFunctionBuilder, FirAnnotationContainerBui override lateinit var returnTypeRef: FirTypeRef override val valueParameters: MutableList = mutableListOf() override var body: FirBlock? = null + var contractDescription: FirContractDescription = FirEmptyContractDescription lateinit var symbol: FirPropertyAccessorSymbol var isGetter: Boolean by kotlin.properties.Delegates.notNull() lateinit var status: FirDeclarationStatus @@ -57,6 +58,7 @@ class FirPropertyAccessorBuilder : FirFunctionBuilder, FirAnnotationContainerBui returnTypeRef, valueParameters, body, + contractDescription, symbol, isGetter, status, diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirSimpleFunctionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirSimpleFunctionBuilder.kt index d36ac0c2bc6..e16a8185447 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirSimpleFunctionBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirSimpleFunctionBuilder.kt @@ -47,6 +47,7 @@ open class FirSimpleFunctionBuilder : FirFunctionBuilder, FirTypeParametersOwner override var body: FirBlock? = null open lateinit var status: FirDeclarationStatus open var containerSource: DeserializedContainerSource? = null + open var contractDescription: FirContractDescription = FirEmptyContractDescription open lateinit var name: Name open lateinit var symbol: FirFunctionSymbol override val annotations: MutableList = mutableListOf() @@ -64,6 +65,7 @@ open class FirSimpleFunctionBuilder : FirFunctionBuilder, FirTypeParametersOwner body, status, containerSource, + contractDescription, name, symbol, annotations, diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt index 5d1b3d48dae..e405a0db136 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.contracts.FirContractDescription -import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.FirResolvePhase @@ -36,6 +35,7 @@ open class FirPropertyAccessorImpl @FirImplementationDetail constructor( override var returnTypeRef: FirTypeRef, override val valueParameters: MutableList, override var body: FirBlock?, + override var contractDescription: FirContractDescription, override val symbol: FirPropertyAccessorSymbol, override val isGetter: Boolean, override var status: FirDeclarationStatus, @@ -44,7 +44,6 @@ open class FirPropertyAccessorImpl @FirImplementationDetail constructor( ) : FirPropertyAccessor() { override val receiverTypeRef: FirTypeRef? get() = null override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference - override var contractDescription: FirContractDescription = FirEmptyContractDescription override val isSetter: Boolean get() = !isGetter init { diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt index 2d81732514c..c0a355ce09a 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.contracts.FirContractDescription -import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction @@ -40,13 +39,13 @@ open class FirSimpleFunctionImpl @FirImplementationDetail constructor( override var body: FirBlock?, override var status: FirDeclarationStatus, override val containerSource: DeserializedContainerSource?, + override var contractDescription: FirContractDescription, override val name: Name, override val symbol: FirFunctionSymbol, override val annotations: MutableList, override val typeParameters: MutableList, ) : FirSimpleFunction() { override var controlFlowGraphReference: FirControlFlowGraphReference = FirEmptyControlFlowGraphReference - override var contractDescription: FirContractDescription = FirEmptyContractDescription init { symbol.bind(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 5400bd06114..f6dfc8e0883 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 @@ -122,6 +122,8 @@ 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.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription +import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult /* @@ -597,6 +599,14 @@ abstract class FirTransformer : FirVisitor { + return transformElement(rawContractDescription, data) + } + + open fun transformResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription, data: D): CompositeTransformResult { + return transformElement(resolvedContractDescription, data) + } + final override fun visitElement(element: FirElement, data: D): CompositeTransformResult { return transformElement(element, data) } @@ -1065,4 +1075,12 @@ abstract class FirTransformer : FirVisitor { + return transformRawContractDescription(rawContractDescription, data) + } + + final override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription, data: D): CompositeTransformResult { + return transformResolvedContractDescription(resolvedContractDescription, 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 9d41eb1c1f3..705161129cf 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 @@ -122,6 +122,8 @@ 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.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription +import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription /* * This file was generated automatically @@ -363,4 +365,8 @@ abstract class FirVisitor { open fun visitContractDescription(contractDescription: FirContractDescription, data: D): R = visitElement(contractDescription, data) + open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): R = visitElement(rawContractDescription, data) + + open fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription, data: D): R = visitElement(resolvedContractDescription, 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 18993271cb7..06ee60e9bf7 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 @@ -122,6 +122,8 @@ 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.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription +import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription /* * This file was generated automatically @@ -595,6 +597,14 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(contractDescription) } + open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) { + visitElement(rawContractDescription) + } + + open fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription) { + visitElement(resolvedContractDescription) + } + final override fun visitElement(element: FirElement, data: Nothing?) { visitElement(element) } @@ -1063,4 +1073,12 @@ abstract class FirVisitorVoid : FirVisitor() { visitContractDescription(contractDescription) } + final override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: Nothing?) { + visitRawContractDescription(rawContractDescription) + } + + final override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription, data: Nothing?) { + visitResolvedContractDescription(resolvedContractDescription) + } + } 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 new file mode 100644 index 00000000000..7603362399e --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt @@ -0,0 +1,11 @@ +/* + * 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.contracts.description.ConeEffectDeclaration + +val FirContractDescription.effects: List? + get() = (this as? FirResolvedContractDescription)?.effects \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/impl/FirEmptyContractDescription.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/impl/FirEmptyContractDescription.kt index 0494e784728..94f381db4e7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/impl/FirEmptyContractDescription.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/impl/FirEmptyContractDescription.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor object FirEmptyContractDescription : FirContractDescription() { override val source: FirSourceElement? get() = null - override val effects: List get() = emptyList() override fun acceptChildren(visitor: FirVisitor, data: D) {} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt index b76fa93355d..95933f2b14e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDefaultPropertyAccessor.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.builder.buildDefaultSetterValueParameter @@ -38,6 +39,7 @@ abstract class FirDefaultPropertyAccessor( propertyTypeRef, valueParameters, body = null, + contractDescription = FirEmptyContractDescription, symbol, isGetter, FirDeclarationStatusImpl(visibility, Modality.FINAL), diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index 302a1d66533..2d9e887f7d9 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -221,6 +221,8 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree builder(propertyAccessor) { parents += functionBuilder defaultNull("body") + default("contractDescription", "FirEmptyContractDescription") + useTypes(emptyContractDescriptionType) } builder(whenExpression) { @@ -255,6 +257,8 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree parents += functionBuilder parents += typeParametersOwnerBuilder defaultNull("body") + default("contractDescription", "FirEmptyContractDescription") + useTypes(emptyContractDescriptionType) openBuilder() } 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 f335c2601c6..d45e4606034 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 @@ -144,4 +144,6 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val composedSuperTypeRef = element("ComposedSuperTypeRef", TypeRef, typeRef) 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/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 1a663b8b9b8..747b3d9b8ec 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -294,8 +294,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() value = "!isGetter" withGetter = true } - default("contractDescription", "FirEmptyContractDescription") - useTypes(modalityType, emptyContractDescriptionType) + useTypes(modalityType) kind = OpenClass } @@ -447,8 +446,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() impl(simpleFunction) { kind = OpenClass - default("contractDescription", "FirEmptyContractDescription") - useTypes(emptyContractDescriptionType) } impl(delegatedTypeRef) { 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 23587823420..5d693cbac0e 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 @@ -576,7 +576,11 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +field(varianceType) } - contractDescription.configure { + rawContractDescription.configure { + +field("contractCall", functionCall) + } + + resolvedContractDescription.configure { +fieldList("effects", effectDeclarationType) } }