in src/jvm/main/org/jetbrains/kotlinx/lincheck/trace/TraceFlattenPolicies.kt [124:161]
override fun beforeReturn(currentNode: TraceNode, descendants: List<TraceNode>): List<TraceNode> {
when (currentNode) {
is CallNode -> {
if (!currentNode.isRootCall) return descendants
val returnedValue = currentNode.tracePoint.returnedValue
// Dont show empty hung actor
if (descendants.size == 1 &&
descendants.contains(currentNode) &&
returnedValue is ReturnedValueResult.NoValue &&
currentNode.tracePoint.isActor
) {
return emptyList()
}
// Check if result node should be added
val nodesToReturn = if (descendants.size > 1 && returnedValue.showAtMethodCallEnd) {
descendants + ResultNode(currentNode.callDepth + 1, returnedValue, currentNode.returnEventNumber, currentNode.tracePoint)
// Or thread start root nodes
} else if (descendants.size == 1 && descendants.contains(currentNode) && currentNode.tracePoint.isThreadStart) {
descendants + currentNode.children
} else {
descendants
}
// Append potential last state
val lastState = currentNode.lastOrNull { it.tracePoint is StateRepresentationTracePoint }
// if no important state or state is already present in flattened graph: simply return
if (lastState == null || nodesToReturn.contains(lastState)) return nodesToReturn
val newLastState = EventNode(0, lastState.tracePoint, lastState.eventNumber)
return nodesToReturn + listOfNotNull(newLastState)
}
else -> return descendants
}
}