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