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:
+9
-13
@@ -48,23 +48,19 @@ class ContractParsingServices(val languageVersionSettings: LanguageVersionSettin
|
|||||||
// is a *necessary* (but not sufficient, actually) condition for presence of 'LazyContractProvider'
|
// is a *necessary* (but not sufficient, actually) condition for presence of 'LazyContractProvider'
|
||||||
if (!expression.isContractDescriptionCallPsiCheck()) return
|
if (!expression.isContractDescriptionCallPsiCheck()) return
|
||||||
|
|
||||||
val collector = TraceBasedCollector(trace, expression)
|
|
||||||
val callContext = ContractCallContext(expression, isFirstStatement, scope, trace.bindingContext)
|
val callContext = ContractCallContext(expression, isFirstStatement, scope, trace.bindingContext)
|
||||||
val contractProviderIfAny = (scope.ownerDescriptor as? FunctionDescriptor)?.getUserData(ContractProviderKey)
|
val contractProviderIfAny = (scope.ownerDescriptor as? FunctionDescriptor)?.getUserData(ContractProviderKey)
|
||||||
|
var resultingContractDescription: ContractDescription? = null
|
||||||
|
|
||||||
if (!callContext.isContractDescriptionCallPreciseCheck()) {
|
try {
|
||||||
contractProviderIfAny?.setContractDescription(null)
|
if (!callContext.isContractDescriptionCallPreciseCheck()) return
|
||||||
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 =
|
private fun ContractCallContext.isContractDescriptionCallPreciseCheck(): Boolean =
|
||||||
|
|||||||
Reference in New Issue
Block a user