[FIR] Fix false positive NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY

This commit is contained in:
Nikolay Lunyak
2022-01-25 18:39:58 +03:00
committed by teamcity
parent a474acd927
commit ee58b52a3d
4 changed files with 128 additions and 3 deletions
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.fir.resolve.dfa.*
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.isNothing
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.util.ListMultimap
import org.jetbrains.kotlin.fir.util.listMultimapOf
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
@@ -1317,13 +1317,22 @@ class ControlFlowGraphBuilder {
exitElvisExpressionNodes.push(it)
}
val typedFir = lastNodes.topOrNull()?.fir as? FirExpression
val type = typedFir?.typeRef?.coneTypeSafe<ConeKotlinType>()
val lhsExitNode = createElvisLhsExitNode(elvisExpression).also {
popAndAddEdge(it)
}
val lhsIsNotNullNode = createElvisLhsIsNotNullNode(elvisExpression).also {
addEdge(lhsExitNode, it)
addEdge(it, exitNode)
val preferredKind = if (type?.isNullableNothing == true) {
EdgeKind.DeadForward
} else {
EdgeKind.Forward
}
addEdge(lhsExitNode, it, preferredKind = preferredKind)
addEdge(it, exitNode, propagateDeadness = false)
}
val rhsEnterNode = elvisRhsEnterNodes.pop().also {