diff --git a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt index f36bc98da5f..9085bbd60b5 100644 --- a/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt +++ b/compiler/fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt @@ -15,6 +15,7 @@ import com.intellij.psi.tree.IElementType import com.intellij.util.PathUtil import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression @@ -129,7 +130,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase( override fun visitElement(element: FirElement) { // NB: types are reused sometimes (e.g. in accessors) if (!result.add(element)) { - if (element !is FirTypeRef && element !is FirNoReceiverExpression) { + if (element !is FirTypeRef && element !is FirNoReceiverExpression && element !is FirEmptyContractDescription) { val elementDump = StringBuilder().also { element.accept(FirRenderer(it)) }.toString() throw AssertionError("FirElement ${element.javaClass} is visited twice: $elementDump") } @@ -146,7 +147,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase( override fun transformElement(element: E, data: Unit): CompositeTransformResult { if (!result.add(element)) { - if (element !is FirTypeRef && element !is FirNoReceiverExpression) { + if (element !is FirTypeRef && element !is FirNoReceiverExpression && element !is FirEmptyContractDescription) { val elementDump = StringBuilder().also { element.accept(FirRenderer(it)) }.toString() throw AssertionError("FirElement ${element.javaClass} is visited twice: $elementDump") } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/FirContractDescription.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/FirContractDescription.kt new file mode 100644 index 00000000000..b9540e3886b --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/FirContractDescription.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2019 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 com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirPureAbstractElement +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 FirContractDescription : FirPureAbstractElement(), FirElement { + abstract override val psi: PsiElement? + abstract val effects: List + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitContractDescription(this, data) +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescription.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescription.kt new file mode 100644 index 00000000000..d405769c4d8 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescription.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2019 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.description + +interface ConeContractDescriptionElement { + fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R +} + +interface ConeEffectDeclaration : ConeContractDescriptionElement { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitEffectDeclaration(this, data) +} + +interface ConeBooleanExpression : ConeContractDescriptionElement { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitBooleanExpression(this, data) +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescriptionVisitor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescriptionVisitor.kt new file mode 100644 index 00000000000..2ea30f4c12d --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescriptionVisitor.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2019 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.description + + +abstract class ConeContractDescriptionVisitor { + open fun visitContractDescriptionElement(contractDescriptionElement: ConeContractDescriptionElement, data: D): R { + throw IllegalStateException("Top of hierarchy reached, no overloads were found for element: $contractDescriptionElement") + } + + // Effects + open fun visitEffectDeclaration(effectDeclaration: ConeEffectDeclaration, data: D): R = visitContractDescriptionElement(effectDeclaration, data) + + open fun visitConditionalEffectDeclaration(conditionalEffect: ConeConditionalEffectDeclaration, data: D): R = + visitEffectDeclaration(conditionalEffect, data) + + open fun visitReturnsEffectDeclaration(returnsEffect: ConeReturnsEffectDeclaration, data: D): R = + visitEffectDeclaration(returnsEffect, data) + + open fun visitCallsEffectDeclaration(callsEffect: ConeCallsEffectDeclaration, data: D): R = + visitEffectDeclaration(callsEffect, data) + + // Expressions + open fun visitBooleanExpression(booleanExpression: ConeBooleanExpression, data: D): R = + visitContractDescriptionElement(booleanExpression, data) + + open fun visitLogicalBinaryOperationContractExpression(binaryLogicExpression: ConeBinaryLogicExpression, data: D): R = + visitBooleanExpression(binaryLogicExpression, data) + + open fun visitLogicalNot(logicalNot: ConeLogicalNot, data: D): R = visitBooleanExpression(logicalNot, data) + + open fun visitIsInstancePredicate(isInstancePredicate: ConeIsInstancePredicate, data: D): R = + visitBooleanExpression(isInstancePredicate, data) + + open fun visitIsNullPredicate(isNullPredicate: ConeIsNullPredicate, data: D): R = visitBooleanExpression(isNullPredicate, data) + + // Values + open fun visitValue(value: ConeContractDescriptionValue, data: D): R = visitContractDescriptionElement(value, data) + + open fun visitConstantDescriptor(constantReference: ConeConstantReference, data: D): R = visitValue(constantReference, data) + + open fun visitBooleanConstantDescriptor(booleanConstantDescriptor: ConeBooleanConstantReference, data: D): R = + visitConstantDescriptor(booleanConstantDescriptor, data) + + open fun visitValueParameterReference(valueParameterReference: ConeValueParameterReference, data: D): R = + visitValue(valueParameterReference, data) + + open fun visitBooleanValueParameterReference(booleanValueParameterReference: ConeBooleanValueParameterReference, data: D): R = + visitValueParameterReference(booleanValueParameterReference, data) +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeEffects.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeEffects.kt new file mode 100644 index 00000000000..e81096b73af --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeEffects.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2019 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.description + +import org.jetbrains.kotlin.contracts.description.InvocationKind + +/** + * Effect with condition attached to it. + * + * [condition] is some expression, which result-type is Boolean, and clause should + * be interpreted as: "if [effect] took place then [condition]-expression is + * guaranteed to be true" + * + * NB. [effect] and [condition] connected with implication in math logic sense: + * [effect] => [condition]. In particular this means that: + * - there can be multiple ways how [effect] can be produced, but for any of them + * [condition] holds. + * - if [effect] wasn't observed, we *can't* reason that [condition] is false + * - if [condition] is true, we *can't* reason that [effect] will be observed. + */ +class ConeConditionalEffectDeclaration(val effect: ConeEffectDeclaration, val condition: ConeBooleanExpression) : ConeEffectDeclaration { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitConditionalEffectDeclaration(this, data) +} + + +/** + * Effect which specifies that subroutine returns some particular value + */ +class ConeReturnsEffectDeclaration(val value: ConeConstantReference) : ConeEffectDeclaration { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitReturnsEffectDeclaration(this, data) + +} + + +/** + * Effect which specifies, that during execution of subroutine, callable [valueParameterReference] will be invoked + * [kind] amount of times, and will never be invoked after subroutine call is finished. + */ +class ConeCallsEffectDeclaration(val valueParameterReference: ConeValueParameterReference, val kind: InvocationKind) : ConeEffectDeclaration { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitCallsEffectDeclaration(this, data) +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeLogicalCombinators.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeLogicalCombinators.kt new file mode 100644 index 00000000000..24b9defb411 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeLogicalCombinators.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2019 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.description + +import org.jetbrains.kotlin.fir.expressions.LogicOperationKind + +class ConeBinaryLogicExpression(val left: ConeBooleanExpression, val right: ConeBooleanExpression, val kind: LogicOperationKind) : ConeBooleanExpression { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R { + return contractDescriptionVisitor.visitLogicalBinaryOperationContractExpression(this, data) + } +} + +class ConeLogicalNot(val arg: ConeBooleanExpression) : ConeBooleanExpression { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitLogicalNot(this, data) +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConePredicates.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConePredicates.kt new file mode 100644 index 00000000000..f334afa3d49 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConePredicates.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2019 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.description + +import org.jetbrains.kotlin.fir.types.ConeKotlinType + +class ConeIsInstancePredicate(val arg: ConeValueParameterReference, val type: ConeKotlinType, val isNegated: Boolean) : ConeBooleanExpression { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitIsInstancePredicate(this, data) + + fun negated(): ConeIsInstancePredicate = + ConeIsInstancePredicate(arg, type, isNegated.not()) +} + +class ConeIsNullPredicate(val arg: ConeValueParameterReference, val isNegated: Boolean) : ConeBooleanExpression { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitIsNullPredicate(this, data) + + fun negated(): ConeIsNullPredicate = + ConeIsNullPredicate(arg, isNegated.not()) +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeValues.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeValues.kt new file mode 100644 index 00000000000..ffbf55be4c9 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeValues.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2019 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.description + +interface ConeContractDescriptionValue : ConeContractDescriptionElement { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitValue(this, data) +} + +open class ConeConstantReference protected constructor(val name: String) : ConeContractDescriptionValue { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitConstantDescriptor(this, data) + + companion object { + val NULL = ConeConstantReference("NULL") + val WILDCARD = ConeConstantReference("WILDCARD") + val NOT_NULL = ConeConstantReference("NOT_NULL") + } +} + +class ConeBooleanConstantReference private constructor(name: String) : ConeConstantReference(name), ConeBooleanExpression { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitBooleanConstantDescriptor(this, data) + + companion object { + val TRUE = ConeBooleanConstantReference("TRUE") + val FALSE = ConeBooleanConstantReference("FALSE") + } +} + +/* + * Index of value parameter of function + * -1 means that it is reference to extension receiver + */ +open class ConeValueParameterReference(val parameterIndex: Int) : ConeContractDescriptionValue { + init { + assert(parameterIndex >= -1) + } + + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitValueParameterReference(this, data) +} + +class ConeBooleanValueParameterReference(parameterIndex: Int) : ConeValueParameterReference(parameterIndex), ConeBooleanExpression { + override fun accept(contractDescriptionVisitor: ConeContractDescriptionVisitor, data: D): R = + contractDescriptionVisitor.visitBooleanValueParameterReference(this, data) +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/impl/FirContractDescriptionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/impl/FirContractDescriptionImpl.kt new file mode 100644 index 00000000000..0f677ba4717 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/impl/FirContractDescriptionImpl.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2019 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 com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.contracts.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +class FirContractDescriptionImpl( + override val psi: PsiElement? +) : FirContractDescription() { + override val effects: MutableList = mutableListOf() + + override fun acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirContractDescriptionImpl { + return this + } +} 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 new file mode 100644 index 00000000000..04723b12ca8 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/impl/FirEmptyContractDescription.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2019 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 com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.contracts.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.fir.visitors.FirVisitor + +object FirEmptyContractDescription : FirContractDescription() { + override val psi: PsiElement? get() = null + override val effects: List get() = emptyList() + + override fun acceptChildren(visitor: FirVisitor, data: D) {} + + override fun transformChildren(transformer: FirTransformer, data: D): FirContractDescription { + return this + } +} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirContractDescriptionOwner.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirContractDescriptionOwner.kt new file mode 100644 index 00000000000..96ac32d6f9e --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirContractDescriptionOwner.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2019 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.declarations + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.contracts.FirContractDescription +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +interface FirContractDescriptionOwner : FirElement { + override val psi: PsiElement? + val contractDescription: FirContractDescription + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitContractDescriptionOwner(this, data) + + fun transformContractDescription(transformer: FirTransformer, data: D): FirContractDescriptionOwner +} diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt index 579fb6012c6..4dc5edecc27 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirPropertyAccessor.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference @@ -20,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -abstract class FirPropertyAccessor : FirPureAbstractElement(), FirFunction { +abstract class FirPropertyAccessor : FirPureAbstractElement(), FirFunction, FirContractDescriptionOwner { abstract override val psi: PsiElement? abstract override val session: FirSession abstract override val resolvePhase: FirResolvePhase @@ -30,6 +31,7 @@ abstract class FirPropertyAccessor : FirPureAbstractElement(), FirFunction abstract override val valueParameters: List abstract override val body: FirBlock? + abstract override val contractDescription: FirContractDescription abstract override val symbol: FirPropertyAccessorSymbol abstract val isGetter: Boolean abstract val isSetter: Boolean @@ -43,4 +45,6 @@ abstract class FirPropertyAccessor : FirPureAbstractElement(), FirFunction transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirPropertyAccessor abstract override fun transformValueParameters(transformer: FirTransformer, data: D): FirPropertyAccessor + + abstract override fun transformContractDescription(transformer: FirTransformer, data: D): FirPropertyAccessor } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt index d3e1a69009d..646dfecc90d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirSimpleFunction.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.FirPureAbstractElement import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference @@ -22,7 +23,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -abstract class FirSimpleFunction : FirPureAbstractElement(), FirMemberFunction { +abstract class FirSimpleFunction : FirPureAbstractElement(), FirMemberFunction, FirContractDescriptionOwner { abstract override val psi: PsiElement? abstract override val session: FirSession abstract override val resolvePhase: FirResolvePhase @@ -37,6 +38,7 @@ abstract class FirSimpleFunction : FirPureAbstractElement(), FirMemberFunction abstract override val annotations: List + abstract override val contractDescription: FirContractDescription override fun accept(visitor: FirVisitor, data: D): R = visitor.visitSimpleFunction(this, data) @@ -45,4 +47,6 @@ abstract class FirSimpleFunction : FirPureAbstractElement(), FirMemberFunction transformControlFlowGraphReference(transformer: FirTransformer, data: D): FirSimpleFunction abstract override fun transformValueParameters(transformer: FirTransformer, data: D): FirSimpleFunction + + abstract override fun transformContractDescription(transformer: FirTransformer, data: D): FirSimpleFunction } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt index 184f6393559..565ee9a2b83 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirPropertyAccessorImpl.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirSession +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 @@ -41,6 +43,7 @@ open class FirPropertyAccessorImpl( override val typeParameters: MutableList = mutableListOf() override val valueParameters: MutableList = mutableListOf() override var body: FirBlock? = null + override var contractDescription: FirContractDescription = FirEmptyContractDescription override val isSetter: Boolean get() = !isGetter override val annotations: MutableList = mutableListOf() @@ -55,6 +58,7 @@ open class FirPropertyAccessorImpl( typeParameters.forEach { it.accept(visitor, data) } valueParameters.forEach { it.accept(visitor, data) } body?.accept(visitor, data) + contractDescription.accept(visitor, data) status.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } } @@ -66,6 +70,7 @@ open class FirPropertyAccessorImpl( typeParameters.transformInplace(transformer, data) transformValueParameters(transformer, data) body = body?.transformSingle(transformer, data) + transformContractDescription(transformer, data) status = status.transformSingle(transformer, data) annotations.transformInplace(transformer, data) return this @@ -86,6 +91,11 @@ open class FirPropertyAccessorImpl( return this } + override fun transformContractDescription(transformer: FirTransformer, data: D): FirPropertyAccessorImpl { + contractDescription = contractDescription.transformSingle(transformer, data) + return this + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt index 8e124520994..b39cb18c0b9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirSimpleFunctionImpl.kt @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.fir.declarations.impl import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.FirSession +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 @@ -44,6 +46,7 @@ open class FirSimpleFunctionImpl( override var body: FirBlock? = null override var containerSource: DeserializedContainerSource? = null override val annotations: MutableList = mutableListOf() + override var contractDescription: FirContractDescription = FirEmptyContractDescription init { symbol.bind(this) @@ -58,6 +61,7 @@ open class FirSimpleFunctionImpl( body?.accept(visitor, data) status.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } + contractDescription.accept(visitor, data) } override fun transformChildren(transformer: FirTransformer, data: D): FirSimpleFunctionImpl { @@ -69,6 +73,7 @@ open class FirSimpleFunctionImpl( body = body?.transformSingle(transformer, data) status = status.transformSingle(transformer, data) annotations.transformInplace(transformer, data) + transformContractDescription(transformer, data) return this } @@ -87,6 +92,11 @@ open class FirSimpleFunctionImpl( return this } + override fun transformContractDescription(transformer: FirTransformer, data: D): FirSimpleFunctionImpl { + contractDescription = contractDescription.transformSingle(transformer, data) + return this + } + override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) { resolvePhase = newResolvePhase } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index 1a38ff01feb..80b35266210 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirFunction +import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirMemberFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor @@ -113,6 +114,7 @@ import org.jetbrains.kotlin.fir.types.FirDynamicTypeRef 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.contracts.FirContractDescription import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult /* @@ -260,6 +262,10 @@ abstract class FirTransformer : FirVisitor { + return transformElement(contractDescriptionOwner, data) + } + open fun > transformMemberFunction(memberFunction: FirMemberFunction, data: D): CompositeTransformResult { return transformElement(memberFunction, data) } @@ -552,6 +558,10 @@ abstract class FirTransformer : FirVisitor { + return transformElement(contractDescription, data) + } + final override fun visitElement(element: FirElement, data: D): CompositeTransformResult { return transformElement(element, data) } @@ -692,6 +702,10 @@ abstract class FirTransformer : FirVisitor { + return transformContractDescriptionOwner(contractDescriptionOwner, data) + } + final override fun > visitMemberFunction(memberFunction: FirMemberFunction, data: D): CompositeTransformResult { return transformMemberFunction(memberFunction, data) } @@ -984,4 +998,8 @@ abstract class FirTransformer : FirVisitor { + return transformContractDescription(contractDescription, data) + } + } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index 169690a9a1a..fd8e9bc3144 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirFunction +import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirMemberFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor @@ -113,6 +114,7 @@ import org.jetbrains.kotlin.fir.types.FirDynamicTypeRef 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.contracts.FirContractDescription /* * This file was generated automatically @@ -190,6 +192,8 @@ abstract class FirVisitor { open fun > visitFunction(function: FirFunction, data: D): R = visitElement(function, data) + open fun visitContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner, data: D): R = visitElement(contractDescriptionOwner, data) + open fun > visitMemberFunction(memberFunction: FirMemberFunction, data: D): R = visitElement(memberFunction, data) open fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: D): R = visitElement(simpleFunction, data) @@ -336,4 +340,6 @@ abstract class FirVisitor { open fun visitImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: D): R = visitElement(implicitTypeRef, data) + open fun visitContractDescription(contractDescription: FirContractDescription, data: D): R = visitElement(contractDescription, data) + } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index b34951a092b..500926a89b0 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSealedClass import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirFunction +import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirMemberFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor @@ -113,6 +114,7 @@ import org.jetbrains.kotlin.fir.types.FirDynamicTypeRef 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.contracts.FirContractDescription /* * This file was generated automatically @@ -258,6 +260,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(function) } + open fun visitContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner) { + visitElement(contractDescriptionOwner) + } + open fun > visitMemberFunction(memberFunction: FirMemberFunction) { visitElement(memberFunction) } @@ -550,6 +556,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(implicitTypeRef) } + open fun visitContractDescription(contractDescription: FirContractDescription) { + visitElement(contractDescription) + } + final override fun visitElement(element: FirElement, data: Nothing?) { visitElement(element) } @@ -690,6 +700,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitFunction(function) } + final override fun visitContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner, data: Nothing?) { + visitContractDescriptionOwner(contractDescriptionOwner) + } + final override fun > visitMemberFunction(memberFunction: FirMemberFunction, data: Nothing?) { visitMemberFunction(memberFunction) } @@ -982,4 +996,8 @@ abstract class FirVisitorVoid : FirVisitor() { visitImplicitTypeRef(implicitTypeRef) } + final override fun visitContractDescription(contractDescription: FirContractDescription, data: Nothing?) { + visitContractDescription(contractDescription) + } + } 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 04524507b7e..32445142bbc 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 @@ -49,9 +49,10 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val function = element("Function", Declaration, callableDeclaration, controlFlowGraphOwner, targetElement, annotationContainer, typeParametersOwner, statement) + val contractDescriptionOwner = element("ContractDescriptionOwner", Declaration) val memberFunction = element("MemberFunction", Declaration, function, callableMemberDeclaration) - val simpleFunction = element("SimpleFunction", Declaration, memberFunction) - val propertyAccessor = element("PropertyAccessor", Declaration, function) + val simpleFunction = element("SimpleFunction", Declaration, memberFunction, contractDescriptionOwner) + val propertyAccessor = element("PropertyAccessor", Declaration, function, contractDescriptionOwner) val constructor = element("Constructor", Declaration, memberFunction) val file = element("File", Declaration, annotationContainer, declaration) @@ -132,4 +133,6 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val functionTypeRef = element("FunctionTypeRef", TypeRef, typeRefWithNullability) val resolvedFunctionTypeRef = element("ResolvedFunctionTypeRef", TypeRef, resolvedTypeRef, functionTypeRef) val implicitTypeRef = element("ImplicitTypeRef", TypeRef, typeRef) -} + + val contractDescription = element("ContractDescription", Contracts) +} \ No newline at end of file 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 718eee9e456..1571a068ab9 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 @@ -402,7 +402,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() withGetter = true } defaultNull("body") - useTypes(modalityType) + default("contractDescription", "FirEmptyContractDescription") + useTypes(modalityType, emptyContractDescriptionType) kind = OpenClass } @@ -556,6 +557,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() parents += modifiableFunction.withArg(simpleFunction) parents += modifiableTypeParametersOwner defaultNull("body") + 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 cee931a6180..23ceb4935dd 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 @@ -266,6 +266,10 @@ object NodeConfigurator : AbstractFieldConfigurator() { parentArg(memberFunction, "F", simpleFunction) } + contractDescriptionOwner.configure { + +field(contractDescription).withTransform() + } + property.configure { parentArg(variable, "F", property) parentArg(callableMemberDeclaration, "F", property) @@ -524,6 +528,10 @@ object NodeConfigurator : AbstractFieldConfigurator() { errorNamedReference.configure { +stringField("errorReason") } + + contractDescription.configure { + +fieldList("effects", effectDeclarationType) + } } } 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 37549657b7e..17555d6cf1d 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 @@ -61,4 +61,6 @@ val backingFieldSymbolType = type("fir.symbols.impl", "FirBackingFieldSymbol") val delegateFieldSymbolType = type("fir.symbols.impl", "FirDelegateFieldSymbol") val classSymbolType = type("fir.symbols.impl", "FirClassSymbol") -val pureAbstractElementType = generatedType("FirPureAbstractElement") \ No newline at end of file +val pureAbstractElementType = generatedType("FirPureAbstractElement") +val effectDeclarationType = type("fir.contracts.description", "ConeEffectDeclaration") +val emptyContractDescriptionType = generatedType("contracts.impl", "FirEmptyContractDescription") \ No newline at end of file diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt index 42e77e9a124..7645c085d88 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Element.kt @@ -124,6 +124,7 @@ class Element(val name: String, kind: Kind) : AbstractElement { Declaration("declarations"), Reference("references"), TypeRef("types"), + Contracts("contracts"), Other("") } }