From 6c06008b4dc3ee3f5df582a96bd2cd2dd912584c Mon Sep 17 00:00:00 2001 From: Arsen Nagdalian Date: Sun, 19 Jul 2020 03:11:19 +0300 Subject: [PATCH] [FIR] Add a class representing the old syntax contract description in order to use the previous class for the new syntax --- .../kotlin/fir/builder/ConversionUtils.kt | 4 +- .../FirContractResolveTransformer.kt | 5 ++- .../FirLegacyRawContractDescription.kt | 22 ++++++++++ .../contracts/FirRawContractDescription.kt | 4 +- .../FirLegacyRawContractDescriptionBuilder.kt | 41 +++++++++++++++++++ .../FirRawContractDescriptionBuilder.kt | 8 ++-- .../FirLegacyRawContractDescriptionImpl.kt | 30 ++++++++++++++ .../impl/FirRawContractDescriptionImpl.kt | 8 ++-- .../kotlin/fir/visitors/FirTransformer.kt | 9 ++++ .../kotlin/fir/visitors/FirVisitor.kt | 3 ++ .../kotlin/fir/visitors/FirVisitorVoid.kt | 9 ++++ .../org/jetbrains/kotlin/fir/FirRenderer.kt | 11 ++++- .../fir/tree/generator/FirTreeBuilder.kt | 1 + .../fir/tree/generator/NodeConfigurator.kt | 6 ++- 14 files changed, 145 insertions(+), 16 deletions(-) create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirLegacyRawContractDescription.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirLegacyRawContractDescriptionBuilder.kt create mode 100644 compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirLegacyRawContractDescriptionImpl.kt diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index fb6eb5d7baf..2a1dd5f66af 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -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 { 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 transformOwnerWithUnresolvedContract(owner: T): CompositeTransformResult { - val contractDescription = owner.contractDescription as FirRawContractDescription + val contractDescription = owner.contractDescription as FirLegacyRawContractDescription val functionCall = contractDescription.contractCall owner.replaceContractDescription(FirEmptyContractDescription) owner.body.replaceFirstStatement(functionCall) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirLegacyRawContractDescription.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirLegacyRawContractDescription.kt new file mode 100644 index 00000000000..1f3a2817314 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirLegacyRawContractDescription.kt @@ -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 accept(visitor: FirVisitor, data: D): R = visitor.visitLegacyRawContractDescription(this, data) +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirRawContractDescription.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirRawContractDescription.kt index 01400c419df..c8c5db0345d 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirRawContractDescription.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/FirRawContractDescription.kt @@ -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 override fun accept(visitor: FirVisitor, data: D): R = visitor.visitRawContractDescription(this, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirLegacyRawContractDescriptionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirLegacyRawContractDescriptionBuilder.kt new file mode 100644 index 00000000000..0de52b7a3e5 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirLegacyRawContractDescriptionBuilder.kt @@ -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() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirRawContractDescriptionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirRawContractDescriptionBuilder.kt index 8463a24d0aa..54b330c5016 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirRawContractDescriptionBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/builder/FirRawContractDescriptionBuilder.kt @@ -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 = 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) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirLegacyRawContractDescriptionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirLegacyRawContractDescriptionImpl.kt new file mode 100644 index 00000000000..9d295a383a8 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirLegacyRawContractDescriptionImpl.kt @@ -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 acceptChildren(visitor: FirVisitor, data: D) { + contractCall.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirLegacyRawContractDescriptionImpl { + contractCall = contractCall.transformSingle(transformer, data) + return this + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirRawContractDescriptionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirRawContractDescriptionImpl.kt index 5080c6d45e2..7444de4bd50 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirRawContractDescriptionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/contracts/impl/FirRawContractDescriptionImpl.kt @@ -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, ) : FirRawContractDescription() { override fun acceptChildren(visitor: FirVisitor, data: D) { - contractCall.accept(visitor, data) + rawEffects.forEach { it.accept(visitor, data) } } override fun transformChildren(transformer: FirTransformer, data: D): FirRawContractDescriptionImpl { - contractCall = contractCall.transformSingle(transformer, data) + rawEffects.transformInplace(transformer, data) return this } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index d8cfcc2d816..587f03fe5f3 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -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 : FirVisitor { + return transformElement(legacyRawContractDescription, data) + } + open fun transformRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): CompositeTransformResult { return transformElement(rawContractDescription, data) } @@ -1138,6 +1143,10 @@ abstract class FirTransformer : FirVisitor { + return transformLegacyRawContractDescription(legacyRawContractDescription, data) + } + final override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: D): CompositeTransformResult { return transformRawContractDescription(rawContractDescription, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index b0bfe7d96e3..9fb205ac1cd 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -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 { 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) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index 43140886aed..45f77294c6f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -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() { visitElement(contractDescription) } + open fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription) { + visitElement(legacyRawContractDescription) + } + open fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) { visitElement(rawContractDescription) } @@ -1136,6 +1141,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitContractDescription(contractDescription) } + final override fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription, data: Nothing?) { + visitLegacyRawContractDescription(legacyRawContractDescription) + } + final override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription, data: Nothing?) { visitRawContractDescription(rawContractDescription) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 0a413e7ed44..52e3c9b6dca 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -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() } } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 9c621d4e422..e6db399925e 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -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) } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index f9467eaa1ec..e6dfc5f4126 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -610,13 +610,17 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild } rawContractDescription.configure { - +field("contractCall", functionCall) + +fieldList("rawEffects", expression) } resolvedContractDescription.configure { +fieldList("effects", effectDeclaration) +fieldList("unresolvedEffects", statement) } + + legacyRawContractDescription.configure { + +field("contractCall", functionCall) + } } }