[FIR] Add a class representing the old syntax contract description in order to use the previous class for the new syntax

This commit is contained in:
Arsen Nagdalian
2020-07-19 03:11:19 +03:00
parent b83aa88eff
commit 6c06008b4d
14 changed files with 145 additions and 16 deletions
@@ -9,7 +9,7 @@ import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.builder.buildRawContractDescription
import org.jetbrains.kotlin.fir.contracts.builder.buildLegacyRawContractDescription
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirVariable
@@ -434,7 +434,7 @@ fun FirBlock?.extractContractDescriptionIfPossible(): Pair<FirBlock?, FirContrac
if (this == null) return null to null
if (!isContractPresentFirCheck()) return this to null
val contractCall = replaceFirstStatement(FirStubStatement) as FirFunctionCall
return this to buildRawContractDescription {
return this to buildLegacyRawContractDescription {
source = contractCall.source
this.contractCall = contractCall
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers.contracts
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.contracts.FirLegacyRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.builder.buildEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription
@@ -116,7 +117,7 @@ class FirContractResolveTransformer(
): CompositeTransformResult<T> {
dataFlowAnalyzer.enterContractDescription()
val contractDescription = owner.contractDescription
require(contractDescription is FirRawContractDescription)
require(contractDescription is FirLegacyRawContractDescription)
val valueParameters = owner.valueParameters
val contractCall = withNewLocalScope {
for (valueParameter in valueParameters) {
@@ -150,7 +151,7 @@ class FirContractResolveTransformer(
}
private fun <T : FirContractDescriptionOwner> transformOwnerWithUnresolvedContract(owner: T): CompositeTransformResult<T> {
val contractDescription = owner.contractDescription as FirRawContractDescription
val contractDescription = owner.contractDescription as FirLegacyRawContractDescription
val functionCall = contractDescription.contractCall
owner.replaceContractDescription(FirEmptyContractDescription)
owner.body.replaceFirstStatement(functionCall)
@@ -0,0 +1,22 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.contracts
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirLegacyRawContractDescription : FirContractDescription() {
abstract override val source: FirSourceElement?
abstract val contractCall: FirFunctionCall
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitLegacyRawContractDescription(this, data)
}
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.contracts
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.visitors.*
/*
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirRawContractDescription : FirContractDescription() {
abstract override val source: FirSourceElement?
abstract val contractCall: FirFunctionCall
abstract val rawEffects: List<FirExpression>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitRawContractDescription(this, data)
}
@@ -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.FirLegacyRawContractDescription
import org.jetbrains.kotlin.fir.contracts.impl.FirLegacyRawContractDescriptionImpl
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
class FirLegacyRawContractDescriptionBuilder {
var source: FirSourceElement? = null
lateinit var contractCall: FirFunctionCall
fun build(): FirLegacyRawContractDescription {
return FirLegacyRawContractDescriptionImpl(
source,
contractCall,
)
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildLegacyRawContractDescription(init: FirLegacyRawContractDescriptionBuilder.() -> Unit): FirLegacyRawContractDescription {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
return FirLegacyRawContractDescriptionBuilder().apply(init).build()
}
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.impl.FirRawContractDescriptionImpl
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.visitors.*
/*
@@ -21,19 +21,19 @@ import org.jetbrains.kotlin.fir.visitors.*
@FirBuilderDsl
class FirRawContractDescriptionBuilder {
var source: FirSourceElement? = null
lateinit var contractCall: FirFunctionCall
val rawEffects: MutableList<FirExpression> = mutableListOf()
fun build(): FirRawContractDescription {
return FirRawContractDescriptionImpl(
source,
contractCall,
rawEffects,
)
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildRawContractDescription(init: FirRawContractDescriptionBuilder.() -> Unit): FirRawContractDescription {
inline fun buildRawContractDescription(init: FirRawContractDescriptionBuilder.() -> Unit = {}): FirRawContractDescription {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.contracts.impl
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.contracts.FirLegacyRawContractDescription
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
internal class FirLegacyRawContractDescriptionImpl(
override val source: FirSourceElement?,
override var contractCall: FirFunctionCall,
) : FirLegacyRawContractDescription() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
contractCall.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirLegacyRawContractDescriptionImpl {
contractCall = contractCall.transformSingle(transformer, data)
return this
}
}
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.contracts.impl
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.visitors.*
/*
@@ -17,14 +17,14 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirRawContractDescriptionImpl(
override val source: FirSourceElement?,
override var contractCall: FirFunctionCall,
override val rawEffects: MutableList<FirExpression>,
) : FirRawContractDescription() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
contractCall.accept(visitor, data)
rawEffects.forEach { it.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirRawContractDescriptionImpl {
contractCall = contractCall.transformSingle(transformer, data)
rawEffects.transformInplace(transformer, data)
return this
}
}
@@ -129,6 +129,7 @@ import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.FirLegacyRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
@@ -634,6 +635,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(contractDescription, data)
}
open fun transformLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformElement(legacyRawContractDescription, data)
}
open fun transformRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformElement(rawContractDescription, data)
}
@@ -1138,6 +1143,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformContractDescription(contractDescription, data)
}
final override fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformLegacyRawContractDescription(legacyRawContractDescription, data)
}
final override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformRawContractDescription(rawContractDescription, data)
}
@@ -129,6 +129,7 @@ import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.FirLegacyRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
@@ -386,6 +387,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitContractDescription(contractDescription: FirContractDescription, data: D): R = visitElement(contractDescription, data)
open fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription, data: D): R = visitElement(legacyRawContractDescription, data)
open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): R = visitElement(rawContractDescription, data)
open fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription, data: D): R = visitElement(resolvedContractDescription, data)
@@ -129,6 +129,7 @@ import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.FirLegacyRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
@@ -632,6 +633,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(contractDescription)
}
open fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription) {
visitElement(legacyRawContractDescription)
}
open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) {
visitElement(rawContractDescription)
}
@@ -1136,6 +1141,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitContractDescription(contractDescription)
}
final override fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription, data: Nothing?) {
visitLegacyRawContractDescription(legacyRawContractDescription)
}
final override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: Nothing?) {
visitRawContractDescription(rawContractDescription)
}
@@ -1188,11 +1188,20 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
visitNamedReference(errorNamedReference)
}
override fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription) {
newLine()
print("[Contract description]")
renderInBraces("<", ">") {
legacyRawContractDescription.contractCall.accept(this)
newLine()
}
}
override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) {
newLine()
print("[Contract description]")
renderInBraces("<", ">") {
rawContractDescription.contractCall.accept(this)
rawContractDescription.rawEffects.renderSeparatedWithNewlines()
newLine()
}
}
@@ -154,6 +154,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val effectDeclaration = element("EffectDeclaration", Contracts)
val contractDescription = element("ContractDescription", Contracts)
val legacyRawContractDescription = element("LegacyRawContractDescription", Contracts, contractDescription)
val rawContractDescription = element("RawContractDescription", Contracts, contractDescription)
val resolvedContractDescription = element("ResolvedContractDescription", Contracts, contractDescription)
}
@@ -610,13 +610,17 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
}
rawContractDescription.configure {
+field("contractCall", functionCall)
+fieldList("rawEffects", expression)
}
resolvedContractDescription.configure {
+fieldList("effects", effectDeclaration)
+fieldList("unresolvedEffects", statement)
}
legacyRawContractDescription.configure {
+field("contractCall", functionCall)
}
}
}