diff --git a/compiler/frontend/src/org/jetbrains/kotlin/contracts/EffectsExtractingVisitor.kt b/compiler/frontend/src/org/jetbrains/kotlin/contracts/EffectsExtractingVisitor.kt index 14fcbf1c16b..1510d7e02ef 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/contracts/EffectsExtractingVisitor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/contracts/EffectsExtractingVisitor.kt @@ -125,7 +125,7 @@ class EffectsExtractingVisitor( // null bypassing function's contract, so we have to filter them out fun ESEffect.containsReturnsNull(): Boolean = - this == ESReturns(ESConstant.NULL) || this is ConditionalEffect && this.simpleEffect.containsReturnsNull() + isReturns { value == ESConstant.NULL } || this is ConditionalEffect && this.simpleEffect.containsReturnsNull() val effectsWithoutReturnsNull = computation.effects.filter { !it.containsReturnsNull() } return CallComputation(computation.type, effectsWithoutReturnsNull) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/functors/AbstractBinaryFunctor.kt b/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/functors/AbstractBinaryFunctor.kt index a21b2200c27..7ca856f2fbb 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/functors/AbstractBinaryFunctor.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/functors/AbstractBinaryFunctor.kt @@ -16,15 +16,15 @@ package org.jetbrains.kotlin.contracts.model.functors -import org.jetbrains.kotlin.contracts.model.structure.ESReturns -import org.jetbrains.kotlin.contracts.model.structure.ESConstant +import org.jetbrains.kotlin.contracts.model.Computation import org.jetbrains.kotlin.contracts.model.ConditionalEffect import org.jetbrains.kotlin.contracts.model.ESEffect -import org.jetbrains.kotlin.contracts.model.Computation +import org.jetbrains.kotlin.contracts.model.structure.ESConstant +import org.jetbrains.kotlin.contracts.model.structure.isReturns abstract class AbstractBinaryFunctor : AbstractReducingFunctor() { override fun doInvocation(arguments: List): List { - assert(arguments.size == 2, { "Wrong size of arguments list for Binary functor: expected 2, got ${arguments.size}" }) + assert(arguments.size == 2) { "Wrong size of arguments list for Binary functor: expected 2, got ${arguments.size}" } return invokeWithArguments(arguments[0], arguments[1]) } @@ -32,23 +32,13 @@ abstract class AbstractBinaryFunctor : AbstractReducingFunctor() { if (left is ESConstant) return invokeWithConstant(right, left) if (right is ESConstant) return invokeWithConstant(left, right) - val nonInterestingEffects = mutableListOf() - val leftValueReturning = mutableListOf() - val rightValueReturning = mutableListOf() + val leftValueReturning = + left.effects.filterIsInstance().filter { it.simpleEffect.isReturns { value != ESConstant.WILDCARD } } + val rightValueReturning = + right.effects.filterIsInstance().filter { it.simpleEffect.isReturns { value != ESConstant.WILDCARD } } - left.effects.forEach { - if (it !is ConditionalEffect || it.simpleEffect !is ESReturns || it.simpleEffect.value == ESConstant.WILDCARD) - nonInterestingEffects += it - else - leftValueReturning += it - } - - right.effects.forEach { - if (it !is ConditionalEffect || it.simpleEffect !is ESReturns || it.simpleEffect.value == ESConstant.WILDCARD) - nonInterestingEffects += it - else - rightValueReturning += it - } + val nonInterestingEffects = + left.effects - leftValueReturning + right.effects - rightValueReturning val evaluatedByFunctor = invokeWithReturningEffects(leftValueReturning, rightValueReturning) @@ -60,4 +50,4 @@ abstract class AbstractBinaryFunctor : AbstractReducingFunctor() { left: List, right: List ): List -} \ No newline at end of file +} diff --git a/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/functors/AbstractUnaryFunctor.kt b/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/functors/AbstractUnaryFunctor.kt index 1e76fa91a7f..9a39f88c606 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/functors/AbstractUnaryFunctor.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/functors/AbstractUnaryFunctor.kt @@ -16,12 +16,11 @@ package org.jetbrains.kotlin.contracts.model.functors -import org.jetbrains.kotlin.contracts.model.structure.ESReturns -import org.jetbrains.kotlin.contracts.model.structure.ESConstant +import org.jetbrains.kotlin.contracts.model.Computation import org.jetbrains.kotlin.contracts.model.ConditionalEffect import org.jetbrains.kotlin.contracts.model.ESEffect -import org.jetbrains.kotlin.contracts.model.Computation - +import org.jetbrains.kotlin.contracts.model.structure.ESConstant +import org.jetbrains.kotlin.contracts.model.structure.isReturns /** * Unary functor that has sequential semantics, i.e. it won't apply to @@ -32,15 +31,14 @@ import org.jetbrains.kotlin.contracts.model.Computation */ abstract class AbstractUnaryFunctor : AbstractReducingFunctor() { override fun doInvocation(arguments: List): List { - assert(arguments.size == 1, { "Wrong size of arguments list for Unary operator: expected 1, got ${arguments.size}" }) + assert(arguments.size == 1) { "Wrong size of arguments list for Unary operator: expected 1, got ${arguments.size}" } return invokeWithArguments(arguments[0]) } fun invokeWithArguments(arg: Computation): List { - val returning = mutableListOf() - val rest = mutableListOf() - - arg.effects.forEach { if (it !is ConditionalEffect || it.simpleEffect !is ESReturns || it.simpleEffect.value == ESConstant.WILDCARD) rest += it else returning += it } + val returning = + arg.effects.filterIsInstance().filter { it.simpleEffect.isReturns { value != ESConstant.WILDCARD } } + val rest = arg.effects - returning val evaluatedByFunctor = invokeWithReturningEffects(returning) @@ -49,5 +47,3 @@ abstract class AbstractUnaryFunctor : AbstractReducingFunctor() { protected abstract fun invokeWithReturningEffects(list: List): List } - - diff --git a/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/structure/Effects.kt b/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/structure/Effects.kt index 648b1548b48..9df25a7a909 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/structure/Effects.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/contracts/model/structure/Effects.kt @@ -44,4 +44,7 @@ data class ESReturns(val value: ESValue) : SimpleEffect() { return value == other.value } -} \ No newline at end of file +} + +inline fun ESEffect.isReturns(block: ESReturns.() -> Boolean): Boolean = + this is ESReturns && block()