提交 74118930 编写于 作者: D Dmitriy Novozhilov 提交者: TeamCityServer

[FE] Don't fail with exception if ESVisitor tries to visit ESLambda

#KT-45243 Fixed
上级 f3135bab
...@@ -32152,6 +32152,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti ...@@ -32152,6 +32152,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/fromStdlib/isNullOrEmpty.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/fromStdlib/isNullOrEmpty.kt");
} }
@Test
@TestMetadata("kt45243.kt")
public void testKt45243() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/fromStdlib/kt45243.kt");
}
@Test @Test
@TestMetadata("require.kt") @TestMetadata("require.kt")
public void testRequire() throws Exception { public void testRequire() throws Exception {
...@@ -78,6 +78,6 @@ class ESReceiverWithDataFlowValue( ...@@ -78,6 +78,6 @@ class ESReceiverWithDataFlowValue(
*/ */
class ESLambda(val lambda: KtLambdaExpression) : AbstractESValue(null) { class ESLambda(val lambda: KtLambdaExpression) : AbstractESValue(null) {
override fun <T> accept(visitor: ESExpressionVisitor<T>): T { override fun <T> accept(visitor: ESExpressionVisitor<T>): T {
throw IllegalStateException("Lambdas shouldn't be visited by ESExpressionVisitor") return visitor.visitLambda(this)
} }
} }
\ No newline at end of file
...@@ -30,4 +30,7 @@ interface ESExpressionVisitor<out T> { ...@@ -30,4 +30,7 @@ interface ESExpressionVisitor<out T> {
fun visitConstant(esConstant: ESConstant): T fun visitConstant(esConstant: ESConstant): T
fun visitReceiver(esReceiver: ESReceiver): T fun visitReceiver(esReceiver: ESReceiver): T
}
\ No newline at end of file // ESLambda is invisible in this module
fun visitLambda(lambda: ESValue): T
}
...@@ -17,10 +17,7 @@ ...@@ -17,10 +17,7 @@
package org.jetbrains.kotlin.contracts.model.visitors package org.jetbrains.kotlin.contracts.model.visitors
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.contracts.model.ConditionalEffect import org.jetbrains.kotlin.contracts.model.*
import org.jetbrains.kotlin.contracts.model.ESEffect
import org.jetbrains.kotlin.contracts.model.ESExpressionVisitor
import org.jetbrains.kotlin.contracts.model.MutableContextInfo
import org.jetbrains.kotlin.contracts.model.structure.* import org.jetbrains.kotlin.contracts.model.structure.*
class InfoCollector(private val observedEffect: ESEffect, private val builtIns: KotlinBuiltIns) : ESExpressionVisitor<MutableContextInfo> { class InfoCollector(private val observedEffect: ESEffect, private val builtIns: KotlinBuiltIns) : ESExpressionVisitor<MutableContextInfo> {
...@@ -83,6 +80,8 @@ class InfoCollector(private val observedEffect: ESEffect, private val builtIns: ...@@ -83,6 +80,8 @@ class InfoCollector(private val observedEffect: ESEffect, private val builtIns:
override fun visitReceiver(esReceiver: ESReceiver): MutableContextInfo = MutableContextInfo.EMPTY override fun visitReceiver(esReceiver: ESReceiver): MutableContextInfo = MutableContextInfo.EMPTY
override fun visitLambda(lambda: ESValue): MutableContextInfo = MutableContextInfo.EMPTY
private fun <R> inverted(block: () -> R): R { private fun <R> inverted(block: () -> R): R {
isInverted = isInverted.not() isInverted = isInverted.not()
val result = block() val result = block()
......
...@@ -66,8 +66,8 @@ class Reducer(private val builtIns: KotlinBuiltIns) : ESExpressionVisitor<ESExpr ...@@ -66,8 +66,8 @@ class Reducer(private val builtIns: KotlinBuiltIns) : ESExpressionVisitor<ESExpr
return ESConstants.booleanValue(result.xor(isOperator.functor.isNegated)) return ESConstants.booleanValue(result.xor(isOperator.functor.isNegated))
} }
override fun visitEqual(equal: ESEqual): ESExpression { override fun visitEqual(equal: ESEqual): ESExpression? {
val reducedLeft = equal.left.accept(this) as ESValue val reducedLeft = equal.left.accept(this) as ESValue? ?: return null
val reducedRight = equal.right val reducedRight = equal.right
if (reducedLeft is ESConstant) return ESConstants.booleanValue((reducedLeft == reducedRight).xor(equal.functor.isNegated)) if (reducedLeft is ESConstant) return ESConstants.booleanValue((reducedLeft == reducedRight).xor(equal.functor.isNegated))
...@@ -114,4 +114,8 @@ class Reducer(private val builtIns: KotlinBuiltIns) : ESExpressionVisitor<ESExpr ...@@ -114,4 +114,8 @@ class Reducer(private val builtIns: KotlinBuiltIns) : ESExpressionVisitor<ESExpr
override fun visitConstant(esConstant: ESConstant): ESConstant = esConstant override fun visitConstant(esConstant: ESConstant): ESConstant = esConstant
override fun visitReceiver(esReceiver: ESReceiver): ESReceiver = esReceiver override fun visitReceiver(esReceiver: ESReceiver): ESReceiver = esReceiver
override fun visitLambda(lambda: ESValue): ESExpression? {
return null
}
} }
...@@ -16,10 +16,7 @@ ...@@ -16,10 +16,7 @@
package org.jetbrains.kotlin.contracts.model.visitors package org.jetbrains.kotlin.contracts.model.visitors
import org.jetbrains.kotlin.contracts.model.Computation import org.jetbrains.kotlin.contracts.model.*
import org.jetbrains.kotlin.contracts.model.ESExpression
import org.jetbrains.kotlin.contracts.model.ESExpressionVisitor
import org.jetbrains.kotlin.contracts.model.ESTypeSubstitution
import org.jetbrains.kotlin.contracts.model.structure.* import org.jetbrains.kotlin.contracts.model.structure.*
/** /**
...@@ -60,9 +57,11 @@ class Substitutor( ...@@ -60,9 +57,11 @@ class Substitutor(
return CallComputation(ESBooleanType, or.functor.invokeWithArguments(left, right)) return CallComputation(ESBooleanType, or.functor.invokeWithArguments(left, right))
} }
override fun visitVariable(esVariable: ESVariable): Computation? = substitutions[esVariable] ?: esVariable override fun visitVariable(esVariable: ESVariable): Computation = substitutions[esVariable] ?: esVariable
override fun visitConstant(esConstant: ESConstant): Computation? = esConstant override fun visitConstant(esConstant: ESConstant): Computation = esConstant
override fun visitReceiver(esReceiver: ESReceiver): ESReceiver = esReceiver override fun visitReceiver(esReceiver: ESReceiver): ESReceiver = esReceiver
override fun visitLambda(lambda: ESValue): Computation = lambda
} }
// ISSUE: KT-45243
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
@ExperimentalContracts
fun <T> assertNotNull(actual: T) {
<!WRONG_IMPLIES_CONDITION!>contract { returns() implies (actual != null) }<!>
}
@ExperimentalContracts
fun test_1() {
assertNotNull { }
}
@ExperimentalContracts
fun test_2() {
assertNotNull({ })
}
// ISSUE: KT-45243
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
@ExperimentalContracts
fun <T> assertNotNull(actual: T) {
contract { returns() implies (actual != null) }
}
@ExperimentalContracts
fun test_1() {
assertNotNull { }
}
@ExperimentalContracts
fun test_2() {
assertNotNull({ })
}
package
@kotlin.contracts.ExperimentalContracts public fun </*0*/ T> assertNotNull(/*0*/ actual: T): kotlin.Unit
Returns(WILDCARD) -> actual != null
@kotlin.contracts.ExperimentalContracts public fun test_1(): kotlin.Unit
@kotlin.contracts.ExperimentalContracts public fun test_2(): kotlin.Unit
...@@ -32248,6 +32248,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { ...@@ -32248,6 +32248,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/fromStdlib/isNullOrEmpty.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/fromStdlib/isNullOrEmpty.kt");
} }
@Test
@TestMetadata("kt45243.kt")
public void testKt45243() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/fromStdlib/kt45243.kt");
}
@Test @Test
@TestMetadata("require.kt") @TestMetadata("require.kt")
public void testRequire() throws Exception { public void testRequire() throws Exception {
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册