diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 7c3acdd6da6..b18d5c3f97f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -1112,6 +1112,12 @@ abstract class FirDataFlowAnalyzer( graphBuilder.exitElvis().mergeIncomingFlow() } + // Callable reference + + fun exitCallableReference(callableReferenceAccess: FirCallableReferenceAccess) { + graphBuilder.exitCallableReference(callableReferenceAccess).mergeIncomingFlow() + } + // ------------------------------------------------------ Utils ------------------------------------------------------ private var CFGNode<*>.flow: FLOW diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt index a48fe395aa7..2a81173d62d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt @@ -564,6 +564,16 @@ class FunctionCallNode( } } +class CallableReferenceNode( + owner: ControlFlowGraph, + override val fir: FirCallableReferenceAccess, + level: Int, id: Int +) : CFGNode(owner, level, id) { + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { + return visitor.visitCallableReferenceNode(this, data) + } +} + class DelegatedConstructorCallNode( owner: ControlFlowGraph, override val fir: FirDelegatedConstructorCall, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt index ceccaf39958..7caba7c1e9d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt @@ -116,6 +116,8 @@ fun CFGNode<*>.render(): String = is ElvisRhsEnterNode -> "Enter rhs of ?:" is ElvisExitNode -> "Exit ?:" + is CallableReferenceNode -> "Callable reference: ${fir.render(CfgRenderMode)}" + is AbstractBinaryExitNode -> throw IllegalStateException() }, ) @@ -141,4 +143,4 @@ private fun FirLoop.type(): String = when (this) { is FirWhileLoop -> "while" is FirDoWhileLoop -> "do-while" else -> throw IllegalArgumentException() -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt index 5446b6ffedb..864bd9c0f44 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphBuilder.kt @@ -1039,6 +1039,12 @@ class ControlFlowGraphBuilder { return node } + // ----------------------------------- Callable references ----------------------------------- + + fun exitCallableReference(callableReferenceAccess: FirCallableReferenceAccess): CallableReferenceNode { + return createCallableReferenceNode(callableReferenceAccess).also { addNewSimpleNode(it) } + } + // ----------------------------------- Block ----------------------------------- fun enterInitBlock(initBlock: FirAnonymousInitializer): Pair?> { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt index 64cd282844f..2d8a69826d3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphNodeBuilder.kt @@ -119,6 +119,9 @@ fun ControlFlowGraphBuilder.createLoopBlockExitNode(fir: FirLoop): LoopBlockExit fun ControlFlowGraphBuilder.createFunctionCallNode(fir: FirFunctionCall): FunctionCallNode = FunctionCallNode(currentGraph, fir, levelCounter, createId()) +fun ControlFlowGraphBuilder.createCallableReferenceNode(fir: FirCallableReferenceAccess): CallableReferenceNode = + CallableReferenceNode(currentGraph, fir, levelCounter, createId()) + fun ControlFlowGraphBuilder.createDelegatedConstructorCallNode(fir: FirDelegatedConstructorCall): DelegatedConstructorCallNode = DelegatedConstructorCallNode(currentGraph, fir, levelCounter, createId()) @@ -231,4 +234,4 @@ fun ControlFlowGraphBuilder.createExitDefaultArgumentsNode(fir: FirValueParamete ExitDefaultArgumentsNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createComparisonExpressionNode(fir: FirComparisonExpression): ComparisonExpressionNode = - ComparisonExpressionNode(currentGraph, fir, levelCounter, createId()) \ No newline at end of file + ComparisonExpressionNode(currentGraph, fir, levelCounter, createId()) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt index e8d8bd1752c..cb5fc522cc6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt @@ -277,6 +277,10 @@ abstract class ControlFlowGraphVisitor { return visitNode(node, data) } + open fun visitCallableReferenceNode(node: CallableReferenceNode, data: D): R { + return visitNode(node, data) + } + open fun visitDelegatedConstructorCallNode(node: DelegatedConstructorCallNode, data: D): R { return visitNode(node, data) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 2c35bf21862..88f497176af 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -660,9 +660,11 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform callableReferenceAccess, data.expectedType, resolutionContext, ) ?: callableReferenceAccess + dataFlowAnalyzer.exitCallableReference(resolvedReference) return resolvedReference.compose() } + dataFlowAnalyzer.exitCallableReference(callableReferenceAccessWithTransformedLHS) return callableReferenceAccessWithTransformedLHS.compose() }