[FIR] Add contract description classes to fir

This commit is contained in:
Dmitriy Novozhilov
2019-10-24 17:38:20 +03:00
parent 3661dedacf
commit 18c3d1c140
23 changed files with 410 additions and 9 deletions
@@ -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 <E : FirElement> transformElement(element: E, data: Unit): CompositeTransformResult<E> {
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")
}
@@ -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<ConeEffectDeclaration>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitContractDescription(this, data)
}
@@ -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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R
}
interface ConeEffectDeclaration : ConeContractDescriptionElement {
override fun <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitEffectDeclaration(this, data)
}
interface ConeBooleanExpression : ConeContractDescriptionElement {
override fun <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitBooleanExpression(this, data)
}
@@ -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<out R, in D> {
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)
}
@@ -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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitConditionalEffectDeclaration(this, data)
}
/**
* Effect which specifies that subroutine returns some particular value
*/
class ConeReturnsEffectDeclaration(val value: ConeConstantReference) : ConeEffectDeclaration {
override fun <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, 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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitCallsEffectDeclaration(this, data)
}
@@ -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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R {
return contractDescriptionVisitor.visitLogicalBinaryOperationContractExpression(this, data)
}
}
class ConeLogicalNot(val arg: ConeBooleanExpression) : ConeBooleanExpression {
override fun <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitLogicalNot(this, data)
}
@@ -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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, 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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitIsNullPredicate(this, data)
fun negated(): ConeIsNullPredicate =
ConeIsNullPredicate(arg, isNegated.not())
}
@@ -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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitValue(this, data)
}
open class ConeConstantReference protected constructor(val name: String) : ConeContractDescriptionValue {
override fun <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, 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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, 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 <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitValueParameterReference(this, data)
}
class ConeBooleanValueParameterReference(parameterIndex: Int) : ConeValueParameterReference(parameterIndex), ConeBooleanExpression {
override fun <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitBooleanValueParameterReference(this, data)
}
@@ -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<ConeEffectDeclaration> = mutableListOf()
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirContractDescriptionImpl {
return this
}
}
@@ -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<ConeEffectDeclaration> get() = emptyList()
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirContractDescription {
return this
}
}
@@ -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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitContractDescriptionOwner(this, data)
fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirContractDescriptionOwner
}
@@ -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<FirPropertyAccessor> {
abstract class FirPropertyAccessor : FirPureAbstractElement(), FirFunction<FirPropertyAccessor>, 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<FirPr
abstract override val typeParameters: List<FirTypeParameter>
abstract override val valueParameters: List<FirValueParameter>
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<FirPr
abstract override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirPropertyAccessor
abstract override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirPropertyAccessor
abstract override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirPropertyAccessor
}
@@ -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<FirSimpleFunction> {
abstract class FirSimpleFunction : FirPureAbstractElement(), FirMemberFunction<FirSimpleFunction>, 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<F
abstract override val containerSource: DeserializedContainerSource?
abstract override val symbol: FirFunctionSymbol<FirSimpleFunction>
abstract override val annotations: List<FirAnnotationCall>
abstract override val contractDescription: FirContractDescription
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitSimpleFunction(this, data)
@@ -45,4 +47,6 @@ abstract class FirSimpleFunction : FirPureAbstractElement(), FirMemberFunction<F
abstract override fun <D> transformControlFlowGraphReference(transformer: FirTransformer<D>, data: D): FirSimpleFunction
abstract override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirSimpleFunction
abstract override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirSimpleFunction
}
@@ -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<FirTypeParameter> = mutableListOf()
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
override var body: FirBlock? = null
override var contractDescription: FirContractDescription = FirEmptyContractDescription
override val isSetter: Boolean get() = !isGetter
override val annotations: MutableList<FirAnnotationCall> = 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 <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirPropertyAccessorImpl {
contractDescription = contractDescription.transformSingle(transformer, data)
return this
}
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
resolvePhase = newResolvePhase
}
@@ -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<FirAnnotationCall> = 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirSimpleFunctionImpl {
contractDescription = contractDescription.transformSingle(transformer, data)
return this
}
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
resolvePhase = newResolvePhase
}
@@ -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<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(function, data)
}
open fun transformContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner, data: D): CompositeTransformResult<FirContractDescriptionOwner> {
return transformElement(contractDescriptionOwner, data)
}
open fun <F : FirMemberFunction<F>> transformMemberFunction(memberFunction: FirMemberFunction<F>, data: D): CompositeTransformResult<FirDeclaration> {
return transformElement(memberFunction, data)
}
@@ -552,6 +558,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(implicitTypeRef, data)
}
open fun transformContractDescription(contractDescription: FirContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformElement(contractDescription, data)
}
final override fun visitElement(element: FirElement, data: D): CompositeTransformResult<FirElement> {
return transformElement(element, data)
}
@@ -692,6 +702,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformFunction(function, data)
}
final override fun visitContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner, data: D): CompositeTransformResult<FirContractDescriptionOwner> {
return transformContractDescriptionOwner(contractDescriptionOwner, data)
}
final override fun <F : FirMemberFunction<F>> visitMemberFunction(memberFunction: FirMemberFunction<F>, data: D): CompositeTransformResult<FirDeclaration> {
return transformMemberFunction(memberFunction, data)
}
@@ -984,4 +998,8 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformImplicitTypeRef(implicitTypeRef, data)
}
final override fun visitContractDescription(contractDescription: FirContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformContractDescription(contractDescription, data)
}
}
@@ -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<out R, in D> {
open fun <F : FirFunction<F>> visitFunction(function: FirFunction<F>, data: D): R = visitElement(function, data)
open fun visitContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner, data: D): R = visitElement(contractDescriptionOwner, data)
open fun <F : FirMemberFunction<F>> visitMemberFunction(memberFunction: FirMemberFunction<F>, data: D): R = visitElement(memberFunction, data)
open fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: D): R = visitElement(simpleFunction, data)
@@ -336,4 +340,6 @@ abstract class FirVisitor<out R, in D> {
open fun visitImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: D): R = visitElement(implicitTypeRef, data)
open fun visitContractDescription(contractDescription: FirContractDescription, data: D): R = visitElement(contractDescription, data)
}
@@ -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<Unit, Nothing?>() {
visitElement(function)
}
open fun visitContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner) {
visitElement(contractDescriptionOwner)
}
open fun <F : FirMemberFunction<F>> visitMemberFunction(memberFunction: FirMemberFunction<F>) {
visitElement(memberFunction)
}
@@ -550,6 +556,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
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<Unit, Nothing?>() {
visitFunction(function)
}
final override fun visitContractDescriptionOwner(contractDescriptionOwner: FirContractDescriptionOwner, data: Nothing?) {
visitContractDescriptionOwner(contractDescriptionOwner)
}
final override fun <F : FirMemberFunction<F>> visitMemberFunction(memberFunction: FirMemberFunction<F>, data: Nothing?) {
visitMemberFunction(memberFunction)
}
@@ -982,4 +996,8 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitImplicitTypeRef(implicitTypeRef)
}
final override fun visitContractDescription(contractDescription: FirContractDescription, data: Nothing?) {
visitContractDescription(contractDescription)
}
}
@@ -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)
}
@@ -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) {
@@ -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)
}
}
}
@@ -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")
val pureAbstractElementType = generatedType("FirPureAbstractElement")
val effectDeclarationType = type("fir.contracts.description", "ConeEffectDeclaration")
val emptyContractDescriptionType = generatedType("contracts.impl", "FirEmptyContractDescription")
@@ -124,6 +124,7 @@ class Element(val name: String, kind: Kind) : AbstractElement {
Declaration("declarations"),
Reference("references"),
TypeRef("types"),
Contracts("contracts"),
Other("")
}
}