[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.descriptors.Modality
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.contracts.FirContractDescription 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.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirVariable 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 (this == null) return null to null
if (!isContractPresentFirCheck()) return this to null if (!isContractPresentFirCheck()) return this to null
val contractCall = replaceFirstStatement(FirStubStatement) as FirFunctionCall val contractCall = replaceFirstStatement(FirStubStatement) as FirFunctionCall
return this to buildRawContractDescription { return this to buildLegacyRawContractDescription {
source = contractCall.source source = contractCall.source
this.contractCall = contractCall this.contractCall = contractCall
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers.contracts 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.FirLegacyRawContractDescription
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.buildEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription
@@ -116,7 +117,7 @@ class FirContractResolveTransformer(
): CompositeTransformResult<T> { ): CompositeTransformResult<T> {
dataFlowAnalyzer.enterContractDescription() dataFlowAnalyzer.enterContractDescription()
val contractDescription = owner.contractDescription val contractDescription = owner.contractDescription
require(contractDescription is FirRawContractDescription) require(contractDescription is FirLegacyRawContractDescription)
val valueParameters = owner.valueParameters val valueParameters = owner.valueParameters
val contractCall = withNewLocalScope { val contractCall = withNewLocalScope {
for (valueParameter in valueParameters) { for (valueParameter in valueParameters) {
@@ -150,7 +151,7 @@ class FirContractResolveTransformer(
} }
private fun <T : FirContractDescriptionOwner> transformOwnerWithUnresolvedContract(owner: T): CompositeTransformResult<T> { 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 val functionCall = contractDescription.contractCall
owner.replaceContractDescription(FirEmptyContractDescription) owner.replaceContractDescription(FirEmptyContractDescription)
owner.body.replaceFirstStatement(functionCall) 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 package org.jetbrains.kotlin.fir.contracts
import org.jetbrains.kotlin.fir.FirSourceElement 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.* import org.jetbrains.kotlin.fir.visitors.*
/* /*
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirRawContractDescription : FirContractDescription() { abstract class FirRawContractDescription : FirContractDescription() {
abstract override val source: FirSourceElement? 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) 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.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription
import org.jetbrains.kotlin.fir.contracts.impl.FirRawContractDescriptionImpl 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.* import org.jetbrains.kotlin.fir.visitors.*
/* /*
@@ -21,19 +21,19 @@ import org.jetbrains.kotlin.fir.visitors.*
@FirBuilderDsl @FirBuilderDsl
class FirRawContractDescriptionBuilder { class FirRawContractDescriptionBuilder {
var source: FirSourceElement? = null var source: FirSourceElement? = null
lateinit var contractCall: FirFunctionCall val rawEffects: MutableList<FirExpression> = mutableListOf()
fun build(): FirRawContractDescription { fun build(): FirRawContractDescription {
return FirRawContractDescriptionImpl( return FirRawContractDescriptionImpl(
source, source,
contractCall, rawEffects,
) )
} }
} }
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
inline fun buildRawContractDescription(init: FirRawContractDescriptionBuilder.() -> Unit): FirRawContractDescription { inline fun buildRawContractDescription(init: FirRawContractDescriptionBuilder.() -> Unit = {}): FirRawContractDescription {
contract { contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) 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.FirSourceElement
import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription 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.* import org.jetbrains.kotlin.fir.visitors.*
/* /*
@@ -17,14 +17,14 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirRawContractDescriptionImpl( internal class FirRawContractDescriptionImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override var contractCall: FirFunctionCall, override val rawEffects: MutableList<FirExpression>,
) : FirRawContractDescription() { ) : FirRawContractDescription() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { 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 { override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirRawContractDescriptionImpl {
contractCall = contractCall.transformSingle(transformer, data) rawEffects.transformInplace(transformer, data)
return this 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.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration 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.FirLegacyRawContractDescription
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
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
@@ -634,6 +635,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(contractDescription, data) 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> { open fun transformRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformElement(rawContractDescription, data) return transformElement(rawContractDescription, data)
} }
@@ -1138,6 +1143,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformContractDescription(contractDescription, data) 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> { final override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): CompositeTransformResult<FirContractDescription> {
return transformRawContractDescription(rawContractDescription, data) 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.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration 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.FirLegacyRawContractDescription
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
@@ -386,6 +387,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitContractDescription(contractDescription: FirContractDescription, data: D): R = visitElement(contractDescription, data) 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 visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): R = visitElement(rawContractDescription, data)
open fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription, data: D): R = visitElement(resolvedContractDescription, 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.types.FirComposedSuperTypeRef
import org.jetbrains.kotlin.fir.contracts.FirEffectDeclaration 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.FirLegacyRawContractDescription
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
@@ -632,6 +633,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(contractDescription) visitElement(contractDescription)
} }
open fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription) {
visitElement(legacyRawContractDescription)
}
open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) { open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) {
visitElement(rawContractDescription) visitElement(rawContractDescription)
} }
@@ -1136,6 +1141,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitContractDescription(contractDescription) visitContractDescription(contractDescription)
} }
final override fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription, data: Nothing?) {
visitLegacyRawContractDescription(legacyRawContractDescription)
}
final override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: Nothing?) { final override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: Nothing?) {
visitRawContractDescription(rawContractDescription) visitRawContractDescription(rawContractDescription)
} }
@@ -1188,11 +1188,20 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
visitNamedReference(errorNamedReference) visitNamedReference(errorNamedReference)
} }
override fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription) {
newLine()
print("[Contract description]")
renderInBraces("<", ">") {
legacyRawContractDescription.contractCall.accept(this)
newLine()
}
}
override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) { override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) {
newLine() newLine()
print("[Contract description]") print("[Contract description]")
renderInBraces("<", ">") { renderInBraces("<", ">") {
rawContractDescription.contractCall.accept(this) rawContractDescription.rawEffects.renderSeparatedWithNewlines()
newLine() newLine()
} }
} }
@@ -154,6 +154,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val effectDeclaration = element("EffectDeclaration", Contracts) val effectDeclaration = element("EffectDeclaration", Contracts)
val contractDescription = element("ContractDescription", Contracts) val contractDescription = element("ContractDescription", Contracts)
val legacyRawContractDescription = element("LegacyRawContractDescription", Contracts, contractDescription)
val rawContractDescription = element("RawContractDescription", Contracts, contractDescription) val rawContractDescription = element("RawContractDescription", Contracts, contractDescription)
val resolvedContractDescription = element("ResolvedContractDescription", Contracts, contractDescription) val resolvedContractDescription = element("ResolvedContractDescription", Contracts, contractDescription)
} }
@@ -610,13 +610,17 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
} }
rawContractDescription.configure { rawContractDescription.configure {
+field("contractCall", functionCall) +fieldList("rawEffects", expression)
} }
resolvedContractDescription.configure { resolvedContractDescription.configure {
+fieldList("effects", effectDeclaration) +fieldList("effects", effectDeclaration)
+fieldList("unresolvedEffects", statement) +fieldList("unresolvedEffects", statement)
} }
legacyRawContractDescription.configure {
+field("contractCall", functionCall)
}
} }
} }