diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index f4327995dbe..e7cd21d190c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -255,17 +255,17 @@ class FunctionDescriptorResolver( dataFlowInfo: DataFlowInfo, function: KtFunction ): LazyContractProvider? { - val provideByDeferredForceResolve = LazyContractProvider { - expressionTypingServices.getBodyExpressionType(trace, scope, dataFlowInfo, function, functionDescriptor) - } + if (function !is KtNamedFunction) return null val isContractsEnabled = languageVersionSettings.supportsFeature(LanguageFeature.AllowContractsForCustomFunctions) || // We need to enable contracts if we're compiling "kotlin"-package to be able to ship contracts in stdlib in 1.2 languageVersionSettings.getFlag(AnalysisFlags.allowKotlinPackage) - if (!isContractsEnabled || !function.isContractPresentPsiCheck()) return null + if (!isContractsEnabled || !function.mayHaveContract()) return null - return provideByDeferredForceResolve + return LazyContractProvider { + expressionTypingServices.getBodyExpressionType(trace, scope, dataFlowInfo, function, functionDescriptor) + } } private fun createValueParameterDescriptors( diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt index ff3f2810dd2..c4a6074ed37 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt @@ -293,11 +293,11 @@ inline fun flatMapDescendantsOfTypeVisitor( // ----------- Contracts ------------------------------------------------------------------------------------------------------------------- -fun KtElement.isContractPresentPsiCheck(): Boolean { - val contractAllowedHere = this is KtNamedFunction && - isTopLevel && - hasBlockBody() && - !hasModifier(KtTokens.OPERATOR_KEYWORD) +fun KtNamedFunction.isContractPresentPsiCheck(): Boolean { + val contractAllowedHere = + isTopLevel && + hasBlockBody() && + !hasModifier(KtTokens.OPERATOR_KEYWORD) if (!contractAllowedHere) return false val firstExpression = ((this as? KtFunction)?.bodyExpression as? KtBlockExpression)?.statements?.firstOrNull() ?: return false