[FIR] Implement checks for contract not allowed

^KT-55423 Fixed
This commit is contained in:
Kirill Rakhman
2023-02-08 12:03:36 +01:00
committed by Space Team
parent b2fbf8bed5
commit f946ddeb40
50 changed files with 377 additions and 178 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
@@ -24,7 +25,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirAnonymousFunction : FirFunction(), FirTypeParametersOwner {
abstract class FirAnonymousFunction : FirFunction(), FirTypeParametersOwner, FirContractDescriptionOwner {
abstract override val source: KtSourceElement?
abstract override val resolvePhase: FirResolvePhase
abstract override val annotations: List<FirAnnotation>
@@ -41,6 +42,7 @@ abstract class FirAnonymousFunction : FirFunction(), FirTypeParametersOwner {
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val valueParameters: List<FirValueParameter>
abstract override val body: FirBlock?
abstract override val contractDescription: FirContractDescription
abstract override val symbol: FirAnonymousFunctionSymbol
abstract val label: FirLabel?
abstract val invocationKind: EventOccurrencesRange?
@@ -76,6 +78,8 @@ abstract class FirAnonymousFunction : FirFunction(), FirTypeParametersOwner {
abstract override fun replaceBody(newBody: FirBlock?)
abstract override fun replaceContractDescription(newContractDescription: FirContractDescription)
abstract fun replaceInvocationKind(newInvocationKind: EventOccurrencesRange?)
abstract fun replaceInlineStatus(newInlineStatus: InlineStatus)
@@ -94,5 +98,7 @@ abstract class FirAnonymousFunction : FirFunction(), FirTypeParametersOwner {
abstract override fun <D> transformBody(transformer: FirTransformer<D>, data: D): FirAnonymousFunction
abstract override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirAnonymousFunction
abstract override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirAnonymousFunction
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
@@ -23,7 +24,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirConstructor : FirFunction(), FirTypeParameterRefsOwner {
abstract class FirConstructor : FirFunction(), FirTypeParameterRefsOwner, FirContractDescriptionOwner {
abstract override val source: KtSourceElement?
abstract override val resolvePhase: FirResolvePhase
abstract override val moduleData: FirModuleData
@@ -39,6 +40,7 @@ abstract class FirConstructor : FirFunction(), FirTypeParameterRefsOwner {
abstract override val contextReceivers: List<FirContextReceiver>
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val valueParameters: List<FirValueParameter>
abstract override val contractDescription: FirContractDescription
abstract override val annotations: List<FirAnnotation>
abstract override val symbol: FirConstructorSymbol
abstract val delegatedConstructor: FirDelegatedConstructorCall?
@@ -67,6 +69,8 @@ abstract class FirConstructor : FirFunction(), FirTypeParameterRefsOwner {
abstract override fun replaceValueParameters(newValueParameters: List<FirValueParameter>)
abstract override fun replaceContractDescription(newContractDescription: FirContractDescription)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract fun replaceDelegatedConstructor(newDelegatedConstructor: FirDelegatedConstructorCall?)
@@ -83,6 +87,8 @@ abstract class FirConstructor : FirFunction(), FirTypeParameterRefsOwner {
abstract override fun <D> transformValueParameters(transformer: FirTransformer<D>, data: D): FirConstructor
abstract override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirConstructor
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirConstructor
abstract fun <D> transformDelegatedConstructor(transformer: FirTransformer<D>, data: D): FirConstructor
@@ -10,6 +10,7 @@ package org.jetbrains.kotlin.fir.declarations.builder
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
@@ -55,6 +56,7 @@ interface FirAbstractConstructorBuilder : FirFunctionBuilder {
abstract val typeParameters: MutableList<FirTypeParameterRef>
abstract var receiverParameter: FirReceiverParameter?
abstract var controlFlowGraphReference: FirControlFlowGraphReference?
abstract var contractDescription: FirContractDescription
abstract var symbol: FirConstructorSymbol
abstract var delegatedConstructor: FirDelegatedConstructorCall?
override fun build(): FirConstructor
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
@@ -61,6 +63,7 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
var controlFlowGraphReference: FirControlFlowGraphReference? = null
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
override var body: FirBlock? = null
var contractDescription: FirContractDescription = FirEmptyContractDescription
lateinit var symbol: FirAnonymousFunctionSymbol
var label: FirLabel? = null
var invocationKind: EventOccurrencesRange? = null
@@ -86,6 +89,7 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
controlFlowGraphReference,
valueParameters,
body,
contractDescription,
symbol,
label,
invocationKind,
@@ -141,6 +145,7 @@ inline fun buildAnonymousFunctionCopy(original: FirAnonymousFunction, init: FirA
copyBuilder.controlFlowGraphReference = original.controlFlowGraphReference
copyBuilder.valueParameters.addAll(original.valueParameters)
copyBuilder.body = original.body
copyBuilder.contractDescription = original.contractDescription
copyBuilder.symbol = original.symbol
copyBuilder.label = original.label
copyBuilder.invocationKind = original.invocationKind
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
@@ -57,6 +59,7 @@ open class FirConstructorBuilder : FirAbstractConstructorBuilder, FirAnnotationC
override var dispatchReceiverType: ConeSimpleKotlinType? = null
override val contextReceivers: MutableList<FirContextReceiver> = mutableListOf()
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
override var contractDescription: FirContractDescription = FirEmptyContractDescription
override val annotations: MutableList<FirAnnotation> = mutableListOf()
override lateinit var symbol: FirConstructorSymbol
override var delegatedConstructor: FirDelegatedConstructorCall? = null
@@ -78,6 +81,7 @@ open class FirConstructorBuilder : FirAbstractConstructorBuilder, FirAnnotationC
dispatchReceiverType,
contextReceivers.toMutableOrEmpty(),
valueParameters,
contractDescription,
annotations.toMutableOrEmpty(),
symbol,
delegatedConstructor,
@@ -122,6 +126,7 @@ inline fun buildConstructorCopy(original: FirConstructor, init: FirConstructorBu
copyBuilder.dispatchReceiverType = original.dispatchReceiverType
copyBuilder.contextReceivers.addAll(original.contextReceivers)
copyBuilder.valueParameters.addAll(original.valueParameters)
copyBuilder.contractDescription = original.contractDescription
copyBuilder.annotations.addAll(original.annotations)
copyBuilder.symbol = original.symbol
copyBuilder.delegatedConstructor = original.delegatedConstructor
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
@@ -58,6 +60,7 @@ class FirPrimaryConstructorBuilder : FirAbstractConstructorBuilder, FirAnnotatio
override var dispatchReceiverType: ConeSimpleKotlinType? = null
override val contextReceivers: MutableList<FirContextReceiver> = mutableListOf()
override val valueParameters: MutableList<FirValueParameter> = mutableListOf()
override var contractDescription: FirContractDescription = FirEmptyContractDescription
override val annotations: MutableList<FirAnnotation> = mutableListOf()
override lateinit var symbol: FirConstructorSymbol
override var delegatedConstructor: FirDelegatedConstructorCall? = null
@@ -80,6 +83,7 @@ class FirPrimaryConstructorBuilder : FirAbstractConstructorBuilder, FirAnnotatio
dispatchReceiverType,
contextReceivers.toMutableOrEmpty(),
valueParameters,
contractDescription,
annotations.toMutableOrEmpty(),
symbol,
delegatedConstructor,
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
@@ -54,6 +55,7 @@ internal class FirAnonymousFunctionImpl(
override var controlFlowGraphReference: FirControlFlowGraphReference?,
override val valueParameters: MutableList<FirValueParameter>,
override var body: FirBlock?,
override var contractDescription: FirContractDescription,
override val symbol: FirAnonymousFunctionSymbol,
override var label: FirLabel?,
override var invocationKind: EventOccurrencesRange?,
@@ -80,6 +82,7 @@ internal class FirAnonymousFunctionImpl(
controlFlowGraphReference?.accept(visitor, data)
valueParameters.forEach { it.accept(visitor, data) }
body?.accept(visitor, data)
contractDescription.accept(visitor, data)
label?.accept(visitor, data)
typeParameters.forEach { it.accept(visitor, data) }
typeRef.accept(visitor, data)
@@ -94,6 +97,7 @@ internal class FirAnonymousFunctionImpl(
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
transformValueParameters(transformer, data)
transformBody(transformer, data)
transformContractDescription(transformer, data)
label = label?.transform(transformer, data)
transformTypeParameters(transformer, data)
typeRef = typeRef.transform(transformer, data)
@@ -130,6 +134,11 @@ internal class FirAnonymousFunctionImpl(
return this
}
override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirAnonymousFunctionImpl {
contractDescription = contractDescription.transform(transformer, data)
return this
}
override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirAnonymousFunctionImpl {
typeParameters.transformInplace(transformer, data)
return this
@@ -176,6 +185,10 @@ internal class FirAnonymousFunctionImpl(
body = newBody
}
override fun replaceContractDescription(newContractDescription: FirContractDescription) {
contractDescription = newContractDescription
}
override fun replaceInvocationKind(newInvocationKind: EventOccurrencesRange?) {
invocationKind = newInvocationKind
}
@@ -9,6 +9,7 @@ package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
@@ -52,6 +53,7 @@ internal class FirConstructorImpl(
override val dispatchReceiverType: ConeSimpleKotlinType?,
override var contextReceivers: MutableOrEmptyList<FirContextReceiver>,
override val valueParameters: MutableList<FirValueParameter>,
override var contractDescription: FirContractDescription,
override var annotations: MutableOrEmptyList<FirAnnotation>,
override val symbol: FirConstructorSymbol,
override var delegatedConstructor: FirDelegatedConstructorCall?,
@@ -72,6 +74,7 @@ internal class FirConstructorImpl(
contextReceivers.forEach { it.accept(visitor, data) }
controlFlowGraphReference?.accept(visitor, data)
valueParameters.forEach { it.accept(visitor, data) }
contractDescription.accept(visitor, data)
annotations.forEach { it.accept(visitor, data) }
delegatedConstructor?.accept(visitor, data)
body?.accept(visitor, data)
@@ -85,6 +88,7 @@ internal class FirConstructorImpl(
contextReceivers.transformInplace(transformer, data)
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
transformValueParameters(transformer, data)
transformContractDescription(transformer, data)
transformAnnotations(transformer, data)
transformDelegatedConstructor(transformer, data)
transformBody(transformer, data)
@@ -116,6 +120,11 @@ internal class FirConstructorImpl(
return this
}
override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirConstructorImpl {
contractDescription = contractDescription.transform(transformer, data)
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirConstructorImpl {
annotations.transformInplace(transformer, data)
return this
@@ -164,6 +173,10 @@ internal class FirConstructorImpl(
valueParameters.addAll(newValueParameters)
}
override fun replaceContractDescription(newContractDescription: FirContractDescription) {
contractDescription = newContractDescription
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
@@ -10,6 +10,7 @@ package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.declarations.DeprecationsProvider
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
@@ -53,6 +54,7 @@ class FirPrimaryConstructor @FirImplementationDetail constructor(
override val dispatchReceiverType: ConeSimpleKotlinType?,
override var contextReceivers: MutableOrEmptyList<FirContextReceiver>,
override val valueParameters: MutableList<FirValueParameter>,
override var contractDescription: FirContractDescription,
override var annotations: MutableOrEmptyList<FirAnnotation>,
override val symbol: FirConstructorSymbol,
override var delegatedConstructor: FirDelegatedConstructorCall?,
@@ -73,6 +75,7 @@ class FirPrimaryConstructor @FirImplementationDetail constructor(
contextReceivers.forEach { it.accept(visitor, data) }
controlFlowGraphReference?.accept(visitor, data)
valueParameters.forEach { it.accept(visitor, data) }
contractDescription.accept(visitor, data)
annotations.forEach { it.accept(visitor, data) }
delegatedConstructor?.accept(visitor, data)
body?.accept(visitor, data)
@@ -86,6 +89,7 @@ class FirPrimaryConstructor @FirImplementationDetail constructor(
contextReceivers.transformInplace(transformer, data)
controlFlowGraphReference = controlFlowGraphReference?.transform(transformer, data)
transformValueParameters(transformer, data)
transformContractDescription(transformer, data)
transformAnnotations(transformer, data)
transformDelegatedConstructor(transformer, data)
transformBody(transformer, data)
@@ -117,6 +121,11 @@ class FirPrimaryConstructor @FirImplementationDetail constructor(
return this
}
override fun <D> transformContractDescription(transformer: FirTransformer<D>, data: D): FirPrimaryConstructor {
contractDescription = contractDescription.transform(transformer, data)
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirPrimaryConstructor {
annotations.transformInplace(transformer, data)
return this
@@ -165,6 +174,10 @@ class FirPrimaryConstructor @FirImplementationDetail constructor(
valueParameters.addAll(newValueParameters)
}
override fun replaceContractDescription(newContractDescription: FirContractDescription) {
contractDescription = newContractDescription
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
@@ -89,6 +89,8 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
parents += abstractConstructorBuilder
defaultNull("delegatedConstructor")
defaultNull("body")
default("contractDescription", "FirEmptyContractDescription")
useTypes(emptyContractDescriptionType)
}
}
@@ -266,7 +268,9 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
parents += functionBuilder
defaultNull("invocationKind", "label", "body", "controlFlowGraphReference")
default("inlineStatus", "InlineStatus.Unknown")
default("contractDescription", "FirEmptyContractDescription")
withCopy()
useTypes(emptyContractDescriptionType)
}
builder(propertyAccessor) {
@@ -60,12 +60,12 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val simpleFunction by element(Declaration, function, contractDescriptionOwner, typeParametersOwner)
val propertyAccessor by element(Declaration, function, contractDescriptionOwner, typeParametersOwner)
val backingField by element(Declaration, variable, typeParametersOwner, statement)
val constructor by element(Declaration, function, typeParameterRefsOwner)
val constructor by element(Declaration, function, typeParameterRefsOwner, contractDescriptionOwner)
val file by element(Declaration, declaration)
val script by element(Declaration, declaration)
val packageDirective by element(Other)
val anonymousFunction by element(Declaration, function, typeParametersOwner)
val anonymousFunction by element(Declaration, function, typeParametersOwner, contractDescriptionOwner)
val anonymousFunctionExpression by element(Expression, expression)
val anonymousObject by element(Declaration, klass, controlFlowGraphOwner)