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)
This commit is contained in:
Dmitry Savvinov
2018-10-23 17:24:55 +03:00
parent bae3ff5211
commit 3dd4e9f04f
@@ -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 =