Rename InvocationKind to EventOccurrencesRange

This commit is contained in:
Dmitriy Novozhilov
2020-06-19 15:22:31 +03:00
parent 1dfccf1416
commit d01817ce14
28 changed files with 158 additions and 162 deletions
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.cfa
import kotlinx.collections.immutable.PersistentMap
import kotlinx.collections.immutable.persistentMapOf
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.contracts.description.isDefinitelyVisited
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
@@ -37,7 +37,7 @@ class FirPropertyInitializationAnalyzer {
val reference = node.fir.calleeReference as? FirResolvedNamedReference ?: return
val symbol = reference.resolvedSymbol as? FirPropertySymbol ?: return
if (symbol !in localProperties) return
val kind = data.getValue(node)[symbol] ?: InvocationKind.ZERO
val kind = data.getValue(node)[symbol] ?: EventOccurrencesRange.ZERO
if (!kind.isDefinitelyVisited()) {
node.fir.source?.let {
reporter.report(FirErrors.UNINITIALIZED_VARIABLE.on(it, symbol))
@@ -47,20 +47,20 @@ class FirPropertyInitializationAnalyzer {
}
private class PropertyInitializationInfo(
map: PersistentMap<FirPropertySymbol, InvocationKind> = persistentMapOf()
) : ControlFlowInfo<PropertyInitializationInfo, FirPropertySymbol, InvocationKind>(map) {
map: PersistentMap<FirPropertySymbol, EventOccurrencesRange> = persistentMapOf()
) : ControlFlowInfo<PropertyInitializationInfo, FirPropertySymbol, EventOccurrencesRange>(map) {
companion object {
val EMPTY = PropertyInitializationInfo()
}
override val constructor: (PersistentMap<FirPropertySymbol, InvocationKind>) -> PropertyInitializationInfo =
override val constructor: (PersistentMap<FirPropertySymbol, EventOccurrencesRange>) -> PropertyInitializationInfo =
::PropertyInitializationInfo
fun merge(other: PropertyInitializationInfo): PropertyInitializationInfo {
var result = this
for (symbol in keys.union(other.keys)) {
val kind1 = this[symbol] ?: InvocationKind.ZERO
val kind2 = other[symbol] ?: InvocationKind.ZERO
val kind1 = this[symbol] ?: EventOccurrencesRange.ZERO
val kind2 = other[symbol] ?: EventOccurrencesRange.ZERO
result = result.put(symbol, kind1 or kind2)
}
return result
@@ -121,8 +121,8 @@ class FirPropertyInitializationAnalyzer {
dataForNode: PropertyInitializationInfo,
symbol: FirPropertySymbol
): PropertyInitializationInfo {
val existingKind = dataForNode[symbol] ?: InvocationKind.ZERO
val kind = existingKind and InvocationKind.EXACTLY_ONCE
val existingKind = dataForNode[symbol] ?: EventOccurrencesRange.ZERO
val kind = existingKind + EventOccurrencesRange.EXACTLY_ONCE
return dataForNode.put(symbol, kind)
}
}
@@ -193,10 +193,10 @@ class FirContractSerializer {
}
}
private fun invocationKindProtobufEnum(kind: InvocationKind): ProtoBuf.Effect.InvocationKind? = when (kind) {
InvocationKind.AT_MOST_ONCE -> ProtoBuf.Effect.InvocationKind.AT_MOST_ONCE
InvocationKind.EXACTLY_ONCE -> ProtoBuf.Effect.InvocationKind.EXACTLY_ONCE
InvocationKind.AT_LEAST_ONCE -> ProtoBuf.Effect.InvocationKind.AT_LEAST_ONCE
private fun invocationKindProtobufEnum(kind: EventOccurrencesRange): ProtoBuf.Effect.InvocationKind? = when (kind) {
EventOccurrencesRange.AT_MOST_ONCE -> ProtoBuf.Effect.InvocationKind.AT_MOST_ONCE
EventOccurrencesRange.EXACTLY_ONCE -> ProtoBuf.Effect.InvocationKind.EXACTLY_ONCE
EventOccurrencesRange.AT_LEAST_ONCE -> ProtoBuf.Effect.InvocationKind.AT_LEAST_ONCE
else -> null
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
@@ -69,7 +69,7 @@ fun FirAnonymousFunction.copy(
typeRef: FirTypeRef = this.typeRef,
label: FirLabel? = this.label,
controlFlowGraphReference: FirControlFlowGraphReference = this.controlFlowGraphReference,
invocationKind: InvocationKind? = this.invocationKind
eventOccurrencesRange: EventOccurrencesRange? = this.eventOccurrencesRange
): FirAnonymousFunction {
return buildAnonymousFunction {
this.source = source
@@ -85,7 +85,7 @@ fun FirAnonymousFunction.copy(
this.typeRef = typeRef
this.label = label
this.controlFlowGraphReference = controlFlowGraphReference
this.invocationKind = invocationKind
this.eventOccurrencesRange = eventOccurrencesRange
}
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.deserialization
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.builder.buildResolvedContractDescription
import org.jetbrains.kotlin.fir.contracts.description.*
@@ -60,7 +60,7 @@ class FirContractDeserializer(private val c: FirDeserializationContext) {
val invocationKind = if (proto.hasKind())
proto.kind.toDescriptorInvocationKind() ?: return null
else
InvocationKind.UNKNOWN
EventOccurrencesRange.UNKNOWN
ConeCallsEffectDeclaration(callable, invocationKind)
}
}
@@ -141,10 +141,10 @@ class FirContractDeserializer(private val c: FirDeserializationContext) {
ConeBooleanValueParameterReference(valueParameterIndex, name)
}
private fun ProtoBuf.Effect.InvocationKind.toDescriptorInvocationKind(): InvocationKind? = when (this) {
ProtoBuf.Effect.InvocationKind.AT_MOST_ONCE -> InvocationKind.AT_MOST_ONCE
ProtoBuf.Effect.InvocationKind.EXACTLY_ONCE -> InvocationKind.EXACTLY_ONCE
ProtoBuf.Effect.InvocationKind.AT_LEAST_ONCE -> InvocationKind.AT_LEAST_ONCE
private fun ProtoBuf.Effect.InvocationKind.toDescriptorInvocationKind(): EventOccurrencesRange? = when (this) {
ProtoBuf.Effect.InvocationKind.AT_MOST_ONCE -> EventOccurrencesRange.AT_MOST_ONCE
ProtoBuf.Effect.InvocationKind.EXACTLY_ONCE -> EventOccurrencesRange.EXACTLY_ONCE
ProtoBuf.Effect.InvocationKind.AT_LEAST_ONCE -> EventOccurrencesRange.AT_LEAST_ONCE
}
private fun extractType(proto: ProtoBuf.Expression): ConeKotlinType? {
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.dfa.cfg
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSymbolOwner
import org.jetbrains.kotlin.fir.declarations.*
@@ -207,7 +207,7 @@ class ControlFlowGraphBuilder {
}
fun enterAnonymousFunction(anonymousFunction: FirAnonymousFunction): Pair<PostponedLambdaEnterNode?, FunctionEnterNode> {
val invocationKind = anonymousFunction.invocationKind
val invocationKind = anonymousFunction.eventOccurrencesRange
var previousNodeIsNew = false
val symbol = anonymousFunction.symbol
@@ -256,15 +256,15 @@ class ControlFlowGraphBuilder {
}
}
private val InvocationKind?.hasTowardEdge: Boolean
private val EventOccurrencesRange?.hasTowardEdge: Boolean
get() = when (this) {
InvocationKind.AT_MOST_ONCE, InvocationKind.UNKNOWN -> true
EventOccurrencesRange.AT_MOST_ONCE, EventOccurrencesRange.UNKNOWN -> true
else -> false
}
private val InvocationKind?.hasBackEdge: Boolean
private val EventOccurrencesRange?.hasBackEdge: Boolean
get() = when (this) {
InvocationKind.AT_LEAST_ONCE, InvocationKind.UNKNOWN -> true
EventOccurrencesRange.AT_LEAST_ONCE, EventOccurrencesRange.UNKNOWN -> true
else -> false
}
@@ -293,7 +293,7 @@ class ControlFlowGraphBuilder {
lastNodes.push(postponedExitNode)
}
val invocationKind = anonymousFunction.invocationKind
val invocationKind = anonymousFunction.eventOccurrencesRange
if (invocationKind != null) {
addEdge(exitNode, postponedExitNode, preferredKind = EdgeKind.CfgForward)
} else {
@@ -301,7 +301,7 @@ class ControlFlowGraphBuilder {
CFGNode.addJustKindEdge(postponedEnterNode, postponedExitNode, kind, propagateDeadness = true)
}
if (invocationKind == InvocationKind.EXACTLY_ONCE && shouldPassFlowFromInplaceLambda.top()) {
if (invocationKind == EventOccurrencesRange.EXACTLY_ONCE && shouldPassFlowFromInplaceLambda.top()) {
exitsFromCompletedPostponedAnonymousFunctions += postponedExitNode
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.contracts.description.ConeCallsEffectDeclaration
import org.jetbrains.kotlin.fir.contracts.effects
@@ -19,14 +19,14 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose
object InvocationKindTransformer : FirTransformer<Nothing?>() {
private object ArgumentsTransformer : FirTransformer<Pair<Map<FirExpression, InvocationKind>, InvocationKind?>>() {
override fun <E : FirElement> transformElement(element: E, data: Pair<Map<FirExpression, InvocationKind>, InvocationKind?>): CompositeTransformResult<E> {
private object ArgumentsTransformer : FirTransformer<Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>>() {
override fun <E : FirElement> transformElement(element: E, data: Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>): CompositeTransformResult<E> {
return element.compose()
}
override fun transformAnonymousFunction(
anonymousFunction: FirAnonymousFunction,
data: Pair<Map<FirExpression, InvocationKind>, InvocationKind?>
data: Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>
): CompositeTransformResult<FirStatement> {
val kind = data.second ?: data.first[anonymousFunction]
if (kind != null) {
@@ -37,7 +37,7 @@ object InvocationKindTransformer : FirTransformer<Nothing?>() {
override fun transformLambdaArgumentExpression(
lambdaArgumentExpression: FirLambdaArgumentExpression,
data: Pair<Map<FirExpression, InvocationKind>, InvocationKind?>
data: Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>
): CompositeTransformResult<FirStatement> {
return data.first[lambdaArgumentExpression]?.let {
(lambdaArgumentExpression.transformChildren(this, data.first to it) as FirStatement).compose()
@@ -46,7 +46,7 @@ object InvocationKindTransformer : FirTransformer<Nothing?>() {
override fun transformNamedArgumentExpression(
namedArgumentExpression: FirNamedArgumentExpression,
data: Pair<Map<FirExpression, InvocationKind>, InvocationKind?>
data: Pair<Map<FirExpression, EventOccurrencesRange>, EventOccurrencesRange?>
): CompositeTransformResult<FirStatement> {
return data.first[namedArgumentExpression]?.let {
(namedArgumentExpression.transformChildren(this, data.first to it) as FirStatement).compose()
@@ -74,7 +74,7 @@ object InvocationKindTransformer : FirTransformer<Nothing?>() {
parameter to argument
}.toMap()
val invocationKindMapping = mutableMapOf<FirExpression, InvocationKind>()
val invocationKindMapping = mutableMapOf<FirExpression, EventOccurrencesRange>()
for (effect in callsEffects) {
// TODO: Support callsInPlace contracts on receivers
val valueParameter = function.valueParameters.getOrNull(effect.valueParameterReference.parameterIndex) ?: continue
@@ -83,7 +83,7 @@ object InvocationKindTransformer : FirTransformer<Nothing?>() {
}
if (isInline) {
for (argument in functionCall.arguments) {
invocationKindMapping.putIfAbsent(argument, InvocationKind.UNKNOWN)
invocationKindMapping.putIfAbsent(argument, EventOccurrencesRange.UNKNOWN)
}
}
if (invocationKindMapping.isEmpty()) {
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers.contracts
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.contracts.description.*
@@ -65,7 +65,7 @@ class ConeEffectExtractor(
FirContractsDslNames.CALLS_IN_PLACE -> {
val reference = functionCall.arguments[0].accept(this, null) as? ConeValueParameterReference
?: return null
val kind = functionCall.arguments.getOrNull(1)?.parseInvocationKind() ?: InvocationKind.UNKNOWN
val kind = functionCall.arguments.getOrNull(1)?.parseInvocationKind() ?: EventOccurrencesRange.UNKNOWN
ConeCallsEffectDeclaration(reference, kind)
}
@@ -165,14 +165,14 @@ class ConeEffectExtractor(
return ConeIsInstancePredicate(arg, type, isNegated)
}
private fun FirExpression.parseInvocationKind(): InvocationKind? {
private fun FirExpression.parseInvocationKind(): EventOccurrencesRange? {
if (this !is FirQualifiedAccessExpression) return null
val resolvedId = toResolvedCallableSymbol()?.callableId ?: return null
return when (resolvedId) {
FirContractsDslNames.EXACTLY_ONCE_KIND -> InvocationKind.EXACTLY_ONCE
FirContractsDslNames.AT_LEAST_ONCE_KIND -> InvocationKind.AT_LEAST_ONCE
FirContractsDslNames.AT_MOST_ONCE_KIND -> InvocationKind.AT_MOST_ONCE
FirContractsDslNames.UNKNOWN_KIND -> InvocationKind.UNKNOWN
FirContractsDslNames.EXACTLY_ONCE_KIND -> EventOccurrencesRange.EXACTLY_ONCE
FirContractsDslNames.AT_LEAST_ONCE_KIND -> EventOccurrencesRange.AT_LEAST_ONCE
FirContractsDslNames.AT_MOST_ONCE_KIND -> EventOccurrencesRange.AT_MOST_ONCE
FirContractsDslNames.UNKNOWN_KIND -> EventOccurrencesRange.UNKNOWN
else -> null
}
}
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
@@ -37,7 +37,7 @@ abstract class FirAnonymousFunction : FirFunction<FirAnonymousFunction>, FirExpr
abstract override val typeRef: FirTypeRef
abstract override val symbol: FirAnonymousFunctionSymbol
abstract val label: FirLabel?
abstract val invocationKind: InvocationKind?
abstract val eventOccurrencesRange: EventOccurrencesRange?
abstract val isLambda: Boolean
abstract override val typeParameters: List<FirTypeParameter>
@@ -53,7 +53,7 @@ abstract class FirAnonymousFunction : FirFunction<FirAnonymousFunction>, FirExpr
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
abstract fun replaceInvocationKind(newInvocationKind: InvocationKind?)
abstract fun replaceInvocationKind(newEventOccurrencesRange: EventOccurrencesRange?)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnonymousFunction
@@ -6,19 +6,16 @@
package org.jetbrains.kotlin.fir.declarations.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.builder.FirFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousFunctionImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBlock
@@ -28,7 +25,6 @@ import org.jetbrains.kotlin.fir.references.impl.FirEmptyControlFlowGraphReferenc
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
@@ -49,7 +45,7 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
lateinit var symbol: FirAnonymousFunctionSymbol
var label: FirLabel? = null
var invocationKind: InvocationKind? = null
var eventOccurrencesRange: EventOccurrencesRange? = null
var isLambda: Boolean by kotlin.properties.Delegates.notNull<Boolean>()
val typeParameters: MutableList<FirTypeParameter> = mutableListOf()
@@ -67,7 +63,7 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
typeRef,
symbol,
label,
invocationKind,
eventOccurrencesRange,
isLambda,
typeParameters,
)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirLabel
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement
@@ -40,7 +40,7 @@ internal class FirAnonymousFunctionImpl(
override var typeRef: FirTypeRef,
override val symbol: FirAnonymousFunctionSymbol,
override var label: FirLabel?,
override var invocationKind: InvocationKind?,
override var eventOccurrencesRange: EventOccurrencesRange?,
override val isLambda: Boolean,
override val typeParameters: MutableList<FirTypeParameter>,
) : FirAnonymousFunction() {
@@ -122,7 +122,7 @@ internal class FirAnonymousFunctionImpl(
typeRef = newTypeRef
}
override fun replaceInvocationKind(newInvocationKind: InvocationKind?) {
invocationKind = newInvocationKind
override fun replaceInvocationKind(newInvocationKind: EventOccurrencesRange?) {
eventOccurrencesRange = newInvocationKind
}
}
@@ -449,8 +449,8 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
anonymousFunction.valueParameters.renderParameters()
print(": ")
anonymousFunction.returnTypeRef.accept(this)
if (anonymousFunction.invocationKind != null) {
print(" <kind=${anonymousFunction.invocationKind}> ")
if (anonymousFunction.eventOccurrencesRange != null) {
print(" <kind=${anonymousFunction.eventOccurrencesRange}> ")
}
if (mode.renderLambdaBodies) {
anonymousFunction.body?.renderBody()
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.contracts.description
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
/**
* Effect with condition attached to it.
@@ -41,7 +41,7 @@ class ConeReturnsEffectDeclaration(val value: ConeConstantReference) : ConeEffec
* Effect which specifies, that during execution of subroutine, callable [valueParameterReference] will be invoked
* [kind] amount of times, and will never be invoked after subroutine call is finished.
*/
class ConeCallsEffectDeclaration(val valueParameterReference: ConeValueParameterReference, val kind: InvocationKind) : ConeEffectDeclaration() {
class ConeCallsEffectDeclaration(val valueParameterReference: ConeValueParameterReference, val kind: EventOccurrencesRange) : ConeEffectDeclaration() {
override fun <R, D> accept(contractDescriptionVisitor: ConeContractDescriptionVisitor<R, D>, data: D): R =
contractDescriptionVisitor.visitCallsEffectDeclaration(this, data)
}
@@ -266,7 +266,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
parentArg(function, "F", anonymousFunction)
+symbol("FirAnonymousFunctionSymbol")
+field(label, nullable = true)
+field(invocationKindType, nullable = true, withReplace = true).apply {
+field(eventOccurrencesRangeType, nullable = true, withReplace = true).apply {
isMutable = true
}
+booleanField("isLambda")
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.tree.generator
import org.jetbrains.kotlin.contracts.description.InvocationKind
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
@@ -25,7 +25,7 @@ val jumpTargetType = type("fir", "FirTarget")
val constKindType = generatedType("expressions", "FirConstKind")
val operationType = type("fir.expressions", "FirOperation")
val classKindType = type(ClassKind::class)
val invocationKindType = type(InvocationKind::class)
val eventOccurrencesRangeType = type(EventOccurrencesRange::class)
val varianceType = type(Variance::class)
val nameType = type(Name::class)
val visibilityType = type(Visibility::class)