[FIR] KT-56877: Allow checking types of containing classes in contracts

This commit is contained in:
Nikolay Lunyak
2023-03-07 13:41:29 +02:00
committed by Space Team
parent c7a71fec17
commit c156dfe855
3 changed files with 8 additions and 7 deletions
@@ -9,11 +9,9 @@ import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.contracts.description.* import org.jetbrains.kotlin.fir.contracts.description.*
import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.resolve.getContainingClass
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
@@ -156,7 +154,10 @@ class ConeEffectExtractor(
data: Nothing? data: Nothing?
): ConeContractDescriptionElement? { ): ConeContractDescriptionElement? {
val declaration = thisReceiverExpression.calleeReference.boundSymbol?.fir ?: return null val declaration = thisReceiverExpression.calleeReference.boundSymbol?.fir ?: return null
return if (declaration == owner || owner.isAccessorOf(declaration)) { val callableOwner = owner as? FirCallableDeclaration
val ownerHasReceiver = callableOwner?.receiverParameter != null
val ownerIsMemberOfDeclaration = callableOwner?.getContainingClass(session) == declaration
return if (declaration == owner || owner.isAccessorOf(declaration) || ownerIsMemberOfDeclaration && !ownerHasReceiver) {
val type = thisReceiverExpression.typeRef.coneType val type = thisReceiverExpression.typeRef.coneType
toValueParameterReference(type, -1, "this") toValueParameterReference(type, -1, "this")
} else { } else {
+1 -1
View File
@@ -9,7 +9,7 @@ open class Result {
fun isSuccess1(): Boolean { fun isSuccess1(): Boolean {
contract { contract {
<!ERROR_IN_CONTRACT_DESCRIPTION!>returns(true) implies (this@Result is Success)<!> returns(true) implies (this@Result is Success)
} }
return this@Result is Success return this@Result is Success
} }
@@ -10,7 +10,7 @@ class Foo {
inner class Bar { inner class Bar {
fun good() { fun good() {
contract { contract {
<!ERROR_IN_CONTRACT_DESCRIPTION!>returns() implies (this@Bar != null)<!> returns() implies (this@Bar != null)
} }
} }