From 3dd4e9f04fa088453dd3cd1d0a3e9c30fde8ce9c Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Tue, 23 Oct 2018 17:24:55 +0300 Subject: [PATCH] Minor: use try-finally for setting LazyContractProvider It conveys meaning of the code more celearly (because that's what we want to do here: set LazyContractProvider no matter how code finished), and also defends from several corner-cases (like, make sure that we properly set LazyContractProvider even if doCheckContract has throw an exception) --- .../parsing/ContractParsingServices.kt | 22 ++++++++----------- 1 file 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 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 =