From 90e37c6599a93cc5fc40c22fc41e027977a6d6a2 Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Mon, 20 Aug 2018 14:30:17 +0300 Subject: [PATCH] Improve diagnostics for illegal contract targets --- .../contracts/parsing/ContractParsingServices.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 fc48da263e6..1e4909f19a1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt @@ -23,6 +23,8 @@ import org.jetbrains.kotlin.contracts.description.ContractDescription import org.jetbrains.kotlin.contracts.description.ContractProviderKey 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.psi.* import org.jetbrains.kotlin.psi.psiUtil.isContractDescriptionCallPsiCheck import org.jetbrains.kotlin.resolve.BindingContext @@ -83,8 +85,18 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin if (functionDescriptor == null) collector.contractNotAllowed("Contracts are allowed only for functions") - if (scope.kind != LexicalScopeKind.CODE_BLOCK || (scope.parent as? LexicalScope)?.kind != LexicalScopeKind.FUNCTION_INNER_SCOPE) + + if (callContext.ownerDescriptor.containingDeclaration !is PackageFragmentDescriptor + || scope.kind != LexicalScopeKind.CODE_BLOCK + || (scope.parent as? LexicalScope)?.kind != LexicalScopeKind.FUNCTION_INNER_SCOPE + ) collector.contractNotAllowed("Contracts are allowed only for top-level functions") + + if (functionDescriptor?.isOperator == true) collector.contractNotAllowed("Contracts are not allowed for operator functions") + + if (functionDescriptor?.isSuspend == true) collector.contractNotAllowed("Contracts are not allowed for suspend functions") + + if (functionDescriptor?.isOverridable == true) collector.contractNotAllowed("Contracts are not allowed for open functions") } private fun KtExpression.isContractDescriptionCallPreciseCheck(context: BindingContext): Boolean =