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 b57fd3470a8..05e3d6d9a1a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/contracts/parsing/ContractParsingServices.kt @@ -48,23 +48,19 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin // is a *necessary* (but not sufficient, actually) condition for presence of 'LazyContractProvider' if (!expression.isContractDescriptionCallPsiCheck()) return - val collector = TraceBasedCollector(trace, expression) val callContext = ContractCallContext(expression, isFirstStatement, scope, trace.bindingContext) val contractProviderIfAny = (scope.ownerDescriptor as? FunctionDescriptor)?.getUserData(ContractProviderKey) + var resultingContractDescription: ContractDescription? = null - if (!callContext.isContractDescriptionCallPreciseCheck()) { - contractProviderIfAny?.setContractDescription(null) - return + try { + if (!callContext.isContractDescriptionCallPreciseCheck()) return + + val collector = TraceBasedCollector(trace, expression) + resultingContractDescription = doCheckContract(collector, callContext) + collector.flushDiagnostics(parsingFailed = resultingContractDescription == null) + } finally { + contractProviderIfAny?.setContractDescription(resultingContractDescription) } - - val parsedContract = doCheckContract(collector, callContext) - - collector.flushDiagnostics(parsingFailed = parsedContract == null) - - if (collector.hasErrors()) - contractProviderIfAny?.setContractDescription(null) - else - contractProviderIfAny?.setContractDescription(parsedContract) } private fun ContractCallContext.isContractDescriptionCallPreciseCheck(): Boolean =