From 84da8b6279d63b089c328496b204ac0110da980f Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 22 Feb 2019 13:48:33 +0300 Subject: [PATCH] Report `CONTRACT_NOT_ALLOWED` diagnostic on extension property getter/setter KT-27090 --- .../contracts/parsing/ContractParsingServices.kt | 7 ++----- .../contracts/dsl/errors/illegalCallSites.kt | 4 ++-- .../contracts/declarations/contractFunction/neg/4.kt | 11 +++++------ 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt b/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt index 3a442158f2f..77c2f564f44 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt @@ -22,10 +22,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.contracts.description.ContractDescription import org.jetbrains.kotlin.contracts.description.ContractProviderKey import org.jetbrains.kotlin.contracts.description.LazyContractProvider -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.isOverridable +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.psiUtil.isContractDescriptionCallPsiCheck import org.jetbrains.kotlin.resolve.BindingContext @@ -110,7 +107,7 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin if (!callContext.isFirstStatement) collector.contractNotAllowed("Contract should be the first statement") - if (functionDescriptor == null) + if (functionDescriptor == null || functionDescriptor is PropertyAccessorDescriptor) collector.contractNotAllowed("Contracts are allowed only for functions") diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.kt index e72ee56dbbe..1375083c833 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/dsl/errors/illegalCallSites.kt @@ -58,11 +58,11 @@ val topLevelAnonymousFunction = fun (x: Boolean) { var topLevelPropertyAccessors: Int? = 42 get() { - contract { returns() implies (field != null) } + contract { returns() implies (field != null) } return 42 } set(value) { - contract { returns() implies (field != null) } + contract { returns() implies (field != null) } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/neg/4.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/neg/4.kt index 67dcb230b51..c7a661071b0 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/neg/4.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/declarations/contractFunction/neg/4.kt @@ -7,7 +7,6 @@ * SECTIONS: contracts, declarations, contractFunction * NUMBER: 4 * DESCRIPTION: Check that fun with contract and CallsInPlace effect is an inline function. - * UNEXPECTED BEHAVIOUR * ISSUES: KT-27090 */ @@ -16,7 +15,7 @@ import kotlin.contracts.* // TESTCASE NUMBER: 1 val Boolean.case_1: () -> Unit get() { - contract { + contract { returns() implies (this@case_1) } return {} @@ -25,7 +24,7 @@ val Boolean.case_1: () -> Unit // TESTCASE NUMBER: 2 val (() -> Unit).case_2: () -> Unit get() { - contract { + contract { callsInPlace(this@case_2, InvocationKind.EXACTLY_ONCE) } return {} @@ -37,7 +36,7 @@ var Boolean.case_3: () -> Unit return {} } set(value) { - contract { + contract { callsInPlace(value, InvocationKind.EXACTLY_ONCE) } } @@ -48,7 +47,7 @@ var (() -> Unit).case_4: () -> Unit return {} } set(value) { - contract { + contract { callsInPlace(this@case_4, InvocationKind.EXACTLY_ONCE) } } @@ -56,7 +55,7 @@ var (() -> Unit).case_4: () -> Unit // TESTCASE NUMBER: 5 val Boolean.case_5: () -> Unit get() { - contract { + contract { returns() implies (this@case_5) }