From e90d86e1b4763a3b1ab0c766d79ed577f98c2ac0 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 11 Mar 2020 17:11:49 +0300 Subject: [PATCH] [FIR] Add cfg for delegating constructor calls --- .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 11 +- .../fir/resolve/dfa/cfg/ControlFlowGraph.kt | 7 + .../dfa/cfg/ControlFlowGraphBuilder.kt | 10 +- .../dfa/cfg/ControlFlowGraphNodeBuilder.kt | 3 + .../dfa/cfg/ControlFlowGraphRenderer.kt | 1 + .../FirExpressionsResolveTransformer.kt | 70 +- .../testData/resolve/cfg/initBlock.dot | 12 +- .../resolve/cfg/initBlockAndInPlaceLambda.dot | 4 +- .../cfg/postponedLambdaInConstructor.dot | 84 ++ .../cfg/postponedLambdaInConstructor.kt | 9 + .../cfg/postponedLambdaInConstructor.txt | 26 + .../resolve/cfg/propertiesAndInitBlocks.dot | 174 +-- .../resolve/cfg/returnValuesFromLambda.dot | 190 +-- .../resolve/exhaustiveWhenAndDNNType.dot | 276 ++-- .../boundSmartcasts/boundSmartcasts.dot | 190 +-- .../boundSmartcastsInBranches.dot | 720 ++++----- .../boundSmartcasts/functionCallBound.dot | 134 +- .../resolve/smartcasts/nullability.dot | 1300 +++++++++-------- .../receivers/implicitReceivers.dot | 546 +++---- .../smartcasts/safeCalls/assignSafeCall.dot | 428 +++--- .../resolve/smartcasts/smartCastInInit.dot | 16 +- .../resolve/smartcasts/smartcastToNothing.dot | 180 +-- .../smartcasts/stability/overridenOpenVal.dot | 116 +- .../variables/delayedAssignment.dot | 72 +- .../delegates/delegateWithAnonymousObject.dot | 200 +-- .../fir/FirDiagnosticsTestGenerated.java | 5 + ...DiagnosticsWithLightTreeTestGenerated.java | 5 + 27 files changed, 2506 insertions(+), 2283 deletions(-) create mode 100644 compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.dot create mode 100644 compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.kt create mode 100644 compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.txt 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 07a41aa9bad..642c01e066c 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 @@ -576,8 +576,8 @@ abstract class FirDataFlowAnalyzer( exitSafeCall(qualifiedAccessExpression) } - fun enterFunctionCall(functionCall: FirFunctionCall) { - graphBuilder.enterFunctionCall(functionCall) + fun enterCall(functionCall: FirCall) { + graphBuilder.enterCall(functionCall) } fun exitFunctionCall(functionCall: FirFunctionCall, callCompleted: Boolean) { @@ -593,6 +593,13 @@ abstract class FirDataFlowAnalyzer( } } + fun exitDelegatedConstructorCall(call: FirDelegatedConstructorCall, callCompleted: Boolean) { + val (callNode, unionNode) = graphBuilder.exitDelegatedConstructorCall(call, callCompleted) + unionNode?.let { unionFlowFromArguments(it) } + callNode.mergeIncomingFlow() + } + + private fun unionFlowFromArguments(node: UnionFunctionCallArgumentsNode) { node.flow = logicSystem.unionFlow(node.previousNodes.map { it.flow }).also { logicSystem.updateAllReceivers(it) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt index efa3e3dcc9a..5ecfc1ebebf 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraph.kt @@ -208,6 +208,13 @@ class FunctionCallNode( level: Int, id: Int ) : CFGNode(owner, level, id) +class DelegatedConstructorCallNode( + owner: ControlFlowGraph, + override val fir: FirDelegatedConstructorCall, + level: Int, + id: Int +) : CFGNode(owner, level, id) + class ThrowExceptionNode( owner: ControlFlowGraph, override val fir: FirThrowExpression, 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 02eac1daea4..9f17dca3920 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 @@ -610,7 +610,7 @@ class ControlFlowGraphBuilder { return node } - fun enterFunctionCall(functionCall: FirFunctionCall) { + fun enterCall(call: FirCall) { levelCounter++ } @@ -627,6 +627,14 @@ class ControlFlowGraphBuilder { return node to unionNode } + fun exitDelegatedConstructorCall(call: FirDelegatedConstructorCall, callCompleted: Boolean): Pair { + levelCounter-- + val node = createDelegatedConstructorCallNode(call) + val (kind, unionNode) = processUnionOfArguments(node, callCompleted) + addNewSimpleNode(node, preferredKind = kind) + return node to unionNode + } + private fun processUnionOfArguments( node: CFGNode<*>, callCompleted: Boolean 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 3bb52d7db3a..882c93218f8 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 @@ -111,6 +111,9 @@ fun ControlFlowGraphBuilder.createLoopBlockExitNode(fir: FirLoop): LoopBlockExit fun ControlFlowGraphBuilder.createFunctionCallNode(fir: FirFunctionCall): FunctionCallNode = FunctionCallNode(graph, fir, levelCounter, createId()) +fun ControlFlowGraphBuilder.createDelegatedConstructorCallNode(fir: FirDelegatedConstructorCall): DelegatedConstructorCallNode = + DelegatedConstructorCallNode(graph, fir, levelCounter, createId()) + fun ControlFlowGraphBuilder.createVariableAssignmentNode(fir: FirVariableAssignment): VariableAssignmentNode = VariableAssignmentNode(graph, fir, levelCounter, createId()) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphRenderer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphRenderer.kt index ea27b1cc43e..78c5e4be762 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphRenderer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphRenderer.kt @@ -184,6 +184,7 @@ private fun CFGNode<*>.render(): String = is VariableAssignmentNode -> "Assignmenet: ${fir.lValue.render(CfgRenderMode)}" is FunctionCallNode -> "Function call: ${fir.render(CfgRenderMode)}" + is DelegatedConstructorCallNode -> "Delegated constructor call: ${fir.render(CfgRenderMode)}" is ThrowExceptionNode -> "Throw: ${fir.render(CfgRenderMode)}" is TryExpressionEnterNode -> "Try expression enter" 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 bd13d40c84d..7d338090c3c 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 @@ -153,7 +153,7 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : storeTypeFromCallee(functionCall) } if (functionCall.calleeReference !is FirSimpleNamedReference) return functionCall.compose() - dataFlowAnalyzer.enterFunctionCall(functionCall) + dataFlowAnalyzer.enterCall(functionCall) functionCall.annotations.forEach { it.accept(this, data) } functionCall.transform(InvocationKindTransformer, null) functionCall.transformTypeArguments(transformer, ResolutionMode.ContextIndependent) @@ -574,37 +574,49 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : data: ResolutionMode, ): CompositeTransformResult { if (transformer.implicitTypeOnly) return delegatedConstructorCall.compose() - delegatedConstructorCall.transformChildren(transformer, ResolutionMode.ContextDependent) - val typeArguments: List - val symbol: FirClassSymbol<*> = when (val reference = delegatedConstructorCall.calleeReference) { - is FirThisReference -> { - typeArguments = emptyList() - if (reference.boundSymbol == null) { - implicitReceiverStack.lastDispatchReceiver()?.boundSymbol?.also { - reference.replaceBoundSymbol(it) - } ?: return delegatedConstructorCall.compose() - } else { - reference.boundSymbol!! as FirClassSymbol<*> + dataFlowAnalyzer.enterCall(delegatedConstructorCall) + var callCompleted = true + var result = delegatedConstructorCall + try { + delegatedConstructorCall.transformChildren(transformer, ResolutionMode.ContextDependent) + val typeArguments: List + val symbol: FirClassSymbol<*> = when (val reference = delegatedConstructorCall.calleeReference) { + is FirThisReference -> { + typeArguments = emptyList() + if (reference.boundSymbol == null) { + implicitReceiverStack.lastDispatchReceiver()?.boundSymbol?.also { + reference.replaceBoundSymbol(it) + } ?: return delegatedConstructorCall.compose() + } else { + reference.boundSymbol!! as FirClassSymbol<*> + } } + is FirSuperReference -> { + // TODO: unresolved supertype + val supertype = reference.superTypeRef.coneTypeSafe() ?: return delegatedConstructorCall.compose() + typeArguments = supertype.typeArguments.takeIf { it.isNotEmpty() }?.map { it.toFirTypeProjection() } ?: emptyList() + val expandedSupertype = supertype.fullyExpandedType(session) + val lookupTag = expandedSupertype.lookupTag + if (lookupTag is ConeClassLookupTagWithFixedSymbol) { + lookupTag.symbol + } else { + // TODO: support locals + symbolProvider.getSymbolByLookupTag(lookupTag) ?: return delegatedConstructorCall.compose() + } as FirClassSymbol<*> + } + else -> return delegatedConstructorCall.compose() } - is FirSuperReference -> { - // TODO: unresolved supertype - val supertype = reference.superTypeRef.coneTypeSafe() ?: return delegatedConstructorCall.compose() - typeArguments = supertype.typeArguments.takeIf { it.isNotEmpty() }?.map { it.toFirTypeProjection() } ?: emptyList() - val expandedSupertype = supertype.fullyExpandedType(session) - val lookupTag = expandedSupertype.lookupTag - if (lookupTag is ConeClassLookupTagWithFixedSymbol) { - lookupTag.symbol - } else { - // TODO: support locals - symbolProvider.getSymbolByLookupTag(lookupTag) ?: return delegatedConstructorCall.compose() - } as FirClassSymbol<*> - } - else -> return delegatedConstructorCall.compose() + val resolvedCall = callResolver.resolveDelegatingConstructorCall(delegatedConstructorCall, symbol, typeArguments) + ?: return delegatedConstructorCall.compose() + + + val completionResult = callCompleter.completeCall(resolvedCall, noExpectedType) + result = completionResult.result + callCompleted = completionResult.callCompleted + return result.compose() + } finally { + dataFlowAnalyzer.exitDelegatedConstructorCall(result, callCompleted) } - val result = callResolver.resolveDelegatingConstructorCall(delegatedConstructorCall, symbol, typeArguments) - ?: return delegatedConstructorCall.compose() - return callCompleter.completeCall(result, noExpectedType).result.compose() } // ------------------------------------------------------------------------------------------------ diff --git a/compiler/fir/resolve/testData/resolve/cfg/initBlock.dot b/compiler/fir/resolve/testData/resolve/cfg/initBlock.dot index 540658dc9e3..872c3c953f8 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/initBlock.dot +++ b/compiler/fir/resolve/testData/resolve/cfg/initBlock.dot @@ -6,17 +6,21 @@ digraph initBlock_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function " style="filled" fillcolor=red]; - 3 [label="Exit function " style="filled" fillcolor=red]; + 3 [label="Enter function " style="filled" fillcolor=red]; + 4 [label="Delegated constructor call: super()"]; + 5 [label="Exit function " style="filled" fillcolor=red]; } - 2 -> {3}; + 3 -> {4}; + 4 -> {5}; } diff --git a/compiler/fir/resolve/testData/resolve/cfg/initBlockAndInPlaceLambda.dot b/compiler/fir/resolve/testData/resolve/cfg/initBlockAndInPlaceLambda.dot index 5dab1faa8ff..d8fc3aa7c81 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/initBlockAndInPlaceLambda.dot +++ b/compiler/fir/resolve/testData/resolve/cfg/initBlockAndInPlaceLambda.dot @@ -22,9 +22,11 @@ digraph initBlockAndInPlaceLambda_kt { subgraph cluster_2 { color=red 4 [label="Enter function " style="filled" fillcolor=red]; - 5 [label="Exit function " style="filled" fillcolor=red]; + 5 [label="Delegated constructor call: super()"]; + 6 [label="Exit function " style="filled" fillcolor=red]; } 4 -> {5}; + 5 -> {6}; } diff --git a/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.dot b/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.dot new file mode 100644 index 00000000000..429615626db --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.dot @@ -0,0 +1,84 @@ +digraph postponedLambdaInConstructor_kt { + graph [nodesep=3] + node [shape=box penwidth=2] + edge [penwidth=2] + + subgraph cluster_0 { + color=red + 0 [label="Enter function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; + } + + 0 -> {1}; + 1 -> {2}; + + subgraph cluster_1 { + color=red + 3 [label="Enter function " style="filled" fillcolor=red]; + 4 [label="Access variable R|/s|"]; + 5 [label="Postponed enter to lambda"]; + subgraph cluster_2 { + color=blue + 6 [label="Enter function anonymousFunction"]; + 7 [label="Postponed enter to lambda"]; + 8 [label="Postponed exit from lambda"]; + 9 [label="Exit function anonymousFunction"]; + } + 10 [label="Postponed exit from lambda"]; + 11 [label="Function call: R|/s|.R|kotlin/let| kotlin/String|>(...)"]; + 12 [label="Delegated constructor call: super(...)"]; + 13 [label="Exit function " style="filled" fillcolor=red]; + } + + 3 -> {4}; + 4 -> {5}; + 5 -> {6}; + 5 -> {10} [color=red]; + 6 -> {7}; + 7 -> {8 8} [color=green]; + 8 -> {9}; + 9 -> {10} [color=green]; + 10 -> {11}; + 11 -> {12}; + 12 -> {13}; + + subgraph cluster_3 { + color=red + 14 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + 15 [label="Access variable R|/it|"]; + 16 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + + 14 -> {15}; + 15 -> {16}; + + subgraph cluster_4 { + color=red + 17 [label="Enter function getter" style="filled" fillcolor=red]; + 18 [label="Exit function getter" style="filled" fillcolor=red]; + } + + 17 -> {18}; + + subgraph cluster_5 { + color=red + 19 [label="Enter property" style="filled" fillcolor=red]; + 20 [label="Access variable R|/s|"]; + 21 [label="Exit property" style="filled" fillcolor=red]; + } + + 19 -> {20}; + 20 -> {21}; + + subgraph cluster_6 { + color=red + 22 [label="Enter function foo" style="filled" fillcolor=red]; + 23 [label="Function call: this@R|/B|.R|/B.foo|()"]; + 24 [label="Exit function foo" style="filled" fillcolor=red]; + } + + 22 -> {23}; + 23 -> {24}; + +} diff --git a/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.kt b/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.kt new file mode 100644 index 00000000000..8aaf470465e --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.kt @@ -0,0 +1,9 @@ +// !DUMP_CFG + +abstract class A(func: () -> String) + +class B(val s: String) : A(s.let { { it } }) { + fun foo() { + foo() + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.txt b/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.txt new file mode 100644 index 00000000000..7b87f4be35c --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.txt @@ -0,0 +1,26 @@ +FILE: postponedLambdaInConstructor.kt + public abstract class A : R|kotlin/Any| { + public constructor(func: R|() -> kotlin/String|): R|A| { + super() + } + + } + public final class B : R|A| { + public constructor(s: R|kotlin/String|): R|B| { + super(R|/s|.R|kotlin/let| kotlin/String|>( = let@fun (it: R|kotlin/String|): R|() -> kotlin/String| { + ^ let@fun (): R|kotlin/String| { + ^ R|/it| + } + + } + )) + } + + public final val s: R|kotlin/String| = R|/s| + public get(): R|kotlin/String| + + public final fun foo(): R|kotlin/Unit| { + this@R|/B|.R|/B.foo|() + } + + } diff --git a/compiler/fir/resolve/testData/resolve/cfg/propertiesAndInitBlocks.dot b/compiler/fir/resolve/testData/resolve/cfg/propertiesAndInitBlocks.dot index aa36a576218..7b855e142dc 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/propertiesAndInitBlocks.dot +++ b/compiler/fir/resolve/testData/resolve/cfg/propertiesAndInitBlocks.dot @@ -94,126 +94,130 @@ digraph propertiesAndInitBlocks_kt { subgraph cluster_7 { color=red 29 [label="Enter function " style="filled" fillcolor=red]; - 30 [label="Exit function " style="filled" fillcolor=red]; + 30 [label="Delegated constructor call: super()"]; + 31 [label="Exit function " style="filled" fillcolor=red]; } 29 -> {30}; + 30 -> {31}; subgraph cluster_8 { color=red - 31 [label="Enter function getter" style="filled" fillcolor=red]; - 32 [label="Exit function getter" style="filled" fillcolor=red]; + 32 [label="Enter function getter" style="filled" fillcolor=red]; + 33 [label="Exit function getter" style="filled" fillcolor=red]; } - 31 -> {32}; + 32 -> {33}; subgraph cluster_9 { color=red - 33 [label="Enter function " style="filled" fillcolor=red]; - 34 [label="Exit function " style="filled" fillcolor=red]; + 34 [label="Enter function " style="filled" fillcolor=red]; + 35 [label="Delegated constructor call: super()"]; + 36 [label="Exit function " style="filled" fillcolor=red]; } - 33 -> {34}; + 34 -> {35}; + 35 -> {36}; subgraph cluster_10 { color=red - 35 [label="Enter property" style="filled" fillcolor=red]; - 36 [label="Postponed enter to lambda"]; + 37 [label="Enter property" style="filled" fillcolor=red]; + 38 [label="Postponed enter to lambda"]; subgraph cluster_11 { color=blue - 37 [label="Enter function anonymousFunction"]; - 38 [label="Function call: R|java/lang/Exception.Exception|()"]; - 39 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 40 [label="Stub" style="filled" fillcolor=gray]; - 41 [label="Exit function anonymousFunction"]; + 39 [label="Enter function anonymousFunction"]; + 40 [label="Function call: R|java/lang/Exception.Exception|()"]; + 41 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 42 [label="Stub" style="filled" fillcolor=gray]; + 43 [label="Exit function anonymousFunction"]; } - 42 [label="Postponed exit from lambda"]; - 43 [label="Function call: R|/run|(...)"]; - 44 [label="Exit property" style="filled" fillcolor=red]; + 44 [label="Postponed exit from lambda"]; + 45 [label="Function call: R|/run|(...)"]; + 46 [label="Exit property" style="filled" fillcolor=red]; } - 35 -> {36}; - 36 -> {37}; - 36 -> {42} [color=red]; - 37 -> {41 38}; + 37 -> {38}; 38 -> {39}; - 39 -> {44}; - 39 -> {40} [style=dotted]; - 40 -> {41} [style=dotted]; - 41 -> {37}; - 41 -> {42} [color=green]; - 42 -> {43}; - 43 -> {44}; + 38 -> {44} [color=red]; + 39 -> {43 40}; + 40 -> {41}; + 41 -> {46}; + 41 -> {42} [style=dotted]; + 42 -> {43} [style=dotted]; + 43 -> {39}; + 43 -> {44} [color=green]; + 44 -> {45}; + 45 -> {46}; subgraph cluster_12 { color=red - 45 [label="Enter function getter" style="filled" fillcolor=red]; - 46 [label="Exit function getter" style="filled" fillcolor=red]; - } - - 45 -> {46}; - - subgraph cluster_13 { - color=red - 47 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_14 { - color=blue - 48 [label="Try expression enter"]; - subgraph cluster_15 { - color=blue - 49 [label="Try main block enter"]; - subgraph cluster_16 { - color=blue - 50 [label="Enter block"]; - 51 [label="Const: Int(1)"]; - 52 [label="Exit block"]; - } - 53 [label="Try main block exit"]; - } - subgraph cluster_17 { - color=blue - 54 [label="Enter finally"]; - subgraph cluster_18 { - color=blue - 55 [label="Enter block"]; - 56 [label="Const: IntegerLiteral(0)"]; - 57 [label="Exit block"]; - } - 58 [label="Exit finally"]; - } - subgraph cluster_19 { - color=blue - 59 [label="Catch enter"]; - subgraph cluster_20 { - color=blue - 60 [label="Enter block"]; - 61 [label="Const: Int(2)"]; - 62 [label="Exit block"]; - } - 63 [label="Catch exit"]; - } - 64 [label="Try expression exit"]; - } - 65 [label="Exit property" style="filled" fillcolor=red]; + 47 [label="Enter function getter" style="filled" fillcolor=red]; + 48 [label="Exit function getter" style="filled" fillcolor=red]; } 47 -> {48}; - 48 -> {49}; - 49 -> {65 59 54 50}; + + subgraph cluster_13 { + color=red + 49 [label="Enter property" style="filled" fillcolor=red]; + subgraph cluster_14 { + color=blue + 50 [label="Try expression enter"]; + subgraph cluster_15 { + color=blue + 51 [label="Try main block enter"]; + subgraph cluster_16 { + color=blue + 52 [label="Enter block"]; + 53 [label="Const: Int(1)"]; + 54 [label="Exit block"]; + } + 55 [label="Try main block exit"]; + } + subgraph cluster_17 { + color=blue + 56 [label="Enter finally"]; + subgraph cluster_18 { + color=blue + 57 [label="Enter block"]; + 58 [label="Const: IntegerLiteral(0)"]; + 59 [label="Exit block"]; + } + 60 [label="Exit finally"]; + } + subgraph cluster_19 { + color=blue + 61 [label="Catch enter"]; + subgraph cluster_20 { + color=blue + 62 [label="Enter block"]; + 63 [label="Const: Int(2)"]; + 64 [label="Exit block"]; + } + 65 [label="Catch exit"]; + } + 66 [label="Try expression exit"]; + } + 67 [label="Exit property" style="filled" fillcolor=red]; + } + + 49 -> {50}; 50 -> {51}; - 51 -> {52}; + 51 -> {67 61 56 52}; 52 -> {53}; - 53 -> {64}; + 53 -> {54}; 54 -> {55}; - 55 -> {56}; + 55 -> {66}; 56 -> {57}; 57 -> {58}; - 58 -> {64}; - 59 -> {65 60}; - 60 -> {61}; - 61 -> {62}; + 58 -> {59}; + 59 -> {60}; + 60 -> {66}; + 61 -> {67 62}; 62 -> {63}; 63 -> {64}; 64 -> {65}; + 65 -> {66}; + 66 -> {67}; } diff --git a/compiler/fir/resolve/testData/resolve/cfg/returnValuesFromLambda.dot b/compiler/fir/resolve/testData/resolve/cfg/returnValuesFromLambda.dot index 07c459685a8..35df5a3872d 100644 --- a/compiler/fir/resolve/testData/resolve/cfg/returnValuesFromLambda.dot +++ b/compiler/fir/resolve/testData/resolve/cfg/returnValuesFromLambda.dot @@ -6,150 +6,154 @@ digraph returnValuesFromLambda_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function " style="filled" fillcolor=red]; - 3 [label="Exit function " style="filled" fillcolor=red]; + 3 [label="Enter function " style="filled" fillcolor=red]; + 4 [label="Delegated constructor call: super()"]; + 5 [label="Exit function " style="filled" fillcolor=red]; } - 2 -> {3}; + 3 -> {4}; + 4 -> {5}; subgraph cluster_2 { color=red - 4 [label="Enter function test_1" style="filled" fillcolor=red]; - 5 [label="Postponed enter to lambda"]; + 6 [label="Enter function test_1" style="filled" fillcolor=red]; + 7 [label="Postponed enter to lambda"]; subgraph cluster_3 { color=blue - 6 [label="Enter function anonymousFunction"]; + 8 [label="Enter function anonymousFunction"]; subgraph cluster_4 { color=blue - 7 [label="Enter when"]; + 9 [label="Enter when"]; subgraph cluster_5 { color=blue - 8 [label="Enter when branch condition "]; - 9 [label="Access variable R|/b|"]; - 10 [label="Exit when branch condition"]; + 10 [label="Enter when branch condition "]; + 11 [label="Access variable R|/b|"]; + 12 [label="Exit when branch condition"]; } - 11 [label="Synthetic else branch"]; - 12 [label="Enter when branch result"]; + 13 [label="Synthetic else branch"]; + 14 [label="Enter when branch result"]; subgraph cluster_6 { color=blue - 13 [label="Enter block"]; - 14 [label="Function call: R|/B.B|()"]; - 15 [label="Jump: ^@run R|/B.B|()"]; - 16 [label="Stub" style="filled" fillcolor=gray]; - 17 [label="Exit block" style="filled" fillcolor=gray]; + 15 [label="Enter block"]; + 16 [label="Function call: R|/B.B|()"]; + 17 [label="Jump: ^@run R|/B.B|()"]; + 18 [label="Stub" style="filled" fillcolor=gray]; + 19 [label="Exit block" style="filled" fillcolor=gray]; } - 18 [label="Exit when branch result" style="filled" fillcolor=gray]; - 19 [label="Exit when"]; + 20 [label="Exit when branch result" style="filled" fillcolor=gray]; + 21 [label="Exit when"]; } - 20 [label="Function call: R|/C.C|()"]; - 21 [label="Exit function anonymousFunction"]; + 22 [label="Function call: R|/C.C|()"]; + 23 [label="Exit function anonymousFunction"]; } - 22 [label="Call arguments union" style="filled" fillcolor=yellow]; - 23 [label="Postponed exit from lambda"]; - 24 [label="Function call: R|kotlin/run|(...)"]; - 25 [label="Variable declaration: lval x: R|A|"]; - 26 [label="Exit function test_1" style="filled" fillcolor=red]; + 24 [label="Call arguments union" style="filled" fillcolor=yellow]; + 25 [label="Postponed exit from lambda"]; + 26 [label="Function call: R|kotlin/run|(...)"]; + 27 [label="Variable declaration: lval x: R|A|"]; + 28 [label="Exit function test_1" style="filled" fillcolor=red]; } - 4 -> {5}; - 5 -> {6}; - 5 -> {23} [color=red]; 6 -> {7}; 7 -> {8}; + 7 -> {25} [color=red]; 8 -> {9}; 9 -> {10}; - 10 -> {12 11}; - 11 -> {19}; - 12 -> {13}; - 13 -> {14}; + 10 -> {11}; + 11 -> {12}; + 12 -> {14 13}; + 13 -> {21}; 14 -> {15}; - 15 -> {21}; - 15 -> {16} [style=dotted]; - 16 -> {17} [style=dotted]; + 15 -> {16}; + 16 -> {17}; + 17 -> {23}; 17 -> {18} [style=dotted]; 18 -> {19} [style=dotted]; - 19 -> {20}; - 20 -> {21}; - 21 -> {23} [color=green]; - 21 -> {22} [color=red]; - 22 -> {24} [color=red]; - 23 -> {24} [color=green]; - 24 -> {25}; - 25 -> {26}; + 19 -> {20} [style=dotted]; + 20 -> {21} [style=dotted]; + 21 -> {22}; + 22 -> {23}; + 23 -> {25} [color=green]; + 23 -> {24} [color=red]; + 24 -> {26} [color=red]; + 25 -> {26} [color=green]; + 26 -> {27}; + 27 -> {28}; subgraph cluster_7 { color=red - 27 [label="Enter function test_2" style="filled" fillcolor=red]; - 28 [label="Postponed enter to lambda"]; + 29 [label="Enter function test_2" style="filled" fillcolor=red]; + 30 [label="Postponed enter to lambda"]; subgraph cluster_8 { color=blue - 29 [label="Enter function anonymousFunction"]; - 30 [label="Function call: R|/C.C|()"]; - 31 [label="Jump: ^@run R|/C.C|()"]; - 32 [label="Stub" style="filled" fillcolor=gray]; - 33 [label="Exit function anonymousFunction"]; + 31 [label="Enter function anonymousFunction"]; + 32 [label="Function call: R|/C.C|()"]; + 33 [label="Jump: ^@run R|/C.C|()"]; + 34 [label="Stub" style="filled" fillcolor=gray]; + 35 [label="Exit function anonymousFunction"]; } - 34 [label="Call arguments union" style="filled" fillcolor=yellow]; - 35 [label="Postponed exit from lambda"]; - 36 [label="Function call: R|kotlin/run|(...)"]; - 37 [label="Variable declaration: lval x: R|C|"]; - 38 [label="Exit function test_2" style="filled" fillcolor=red]; + 36 [label="Call arguments union" style="filled" fillcolor=yellow]; + 37 [label="Postponed exit from lambda"]; + 38 [label="Function call: R|kotlin/run|(...)"]; + 39 [label="Variable declaration: lval x: R|C|"]; + 40 [label="Exit function test_2" style="filled" fillcolor=red]; } - 27 -> {28}; - 28 -> {29}; - 28 -> {35} [color=red]; 29 -> {30}; 30 -> {31}; - 31 -> {33}; - 31 -> {32} [style=dotted]; - 32 -> {33} [style=dotted]; - 33 -> {35} [color=green]; - 33 -> {34} [color=red]; - 34 -> {36} [color=red]; - 35 -> {36} [color=green]; - 36 -> {37}; - 37 -> {38}; + 30 -> {37} [color=red]; + 31 -> {32}; + 32 -> {33}; + 33 -> {35}; + 33 -> {34} [style=dotted]; + 34 -> {35} [style=dotted]; + 35 -> {37} [color=green]; + 35 -> {36} [color=red]; + 36 -> {38} [color=red]; + 37 -> {38} [color=green]; + 38 -> {39}; + 39 -> {40}; subgraph cluster_9 { color=red - 39 [label="Enter function test_3" style="filled" fillcolor=red]; - 40 [label="Postponed enter to lambda"]; + 41 [label="Enter function test_3" style="filled" fillcolor=red]; + 42 [label="Postponed enter to lambda"]; subgraph cluster_10 { color=blue - 41 [label="Enter function anonymousFunction"]; - 42 [label="Jump: ^test_3 Unit"]; - 43 [label="Stub" style="filled" fillcolor=gray]; - 44 [label="Exit function anonymousFunction" style="filled" fillcolor=gray]; + 43 [label="Enter function anonymousFunction"]; + 44 [label="Jump: ^test_3 Unit"]; + 45 [label="Stub" style="filled" fillcolor=gray]; + 46 [label="Exit function anonymousFunction" style="filled" fillcolor=gray]; } - 45 [label="Call arguments union" style="filled" fillcolor=gray]; - 46 [label="Postponed exit from lambda"]; - 47 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=gray]; - 48 [label="Stub" style="filled" fillcolor=gray]; - 49 [label="Variable declaration: lval x: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 50 [label="Exit function test_3" style="filled" fillcolor=red]; + 47 [label="Call arguments union" style="filled" fillcolor=gray]; + 48 [label="Postponed exit from lambda"]; + 49 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=gray]; + 50 [label="Stub" style="filled" fillcolor=gray]; + 51 [label="Variable declaration: lval x: R|kotlin/Nothing|" style="filled" fillcolor=gray]; + 52 [label="Exit function test_3" style="filled" fillcolor=red]; } - 39 -> {40}; - 40 -> {41}; - 40 -> {46} [color=red]; 41 -> {42}; - 42 -> {50}; - 42 -> {43} [style=dotted]; - 43 -> {44} [style=dotted]; + 42 -> {43}; + 42 -> {48} [color=red]; + 43 -> {44}; + 44 -> {52}; 44 -> {45} [style=dotted]; - 44 -> {46} [color=green]; - 45 -> {47} [style=dotted]; - 46 -> {47} [color=green]; - 47 -> {50 48} [style=dotted]; - 48 -> {49} [style=dotted]; - 49 -> {50} [style=dotted]; + 45 -> {46} [style=dotted]; + 46 -> {47} [style=dotted]; + 46 -> {48} [color=green]; + 47 -> {49} [style=dotted]; + 48 -> {49} [color=green]; + 49 -> {52 50} [style=dotted]; + 50 -> {51} [style=dotted]; + 51 -> {52} [style=dotted]; } diff --git a/compiler/fir/resolve/testData/resolve/exhaustiveWhenAndDNNType.dot b/compiler/fir/resolve/testData/resolve/exhaustiveWhenAndDNNType.dot index 8d92a61f9f0..5a5b02b3403 100644 --- a/compiler/fir/resolve/testData/resolve/exhaustiveWhenAndDNNType.dot +++ b/compiler/fir/resolve/testData/resolve/exhaustiveWhenAndDNNType.dot @@ -6,93 +6,95 @@ digraph exhaustiveWhenAndDNNType_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super|>()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function values" style="filled" fillcolor=red]; - 3 [label="Exit function values" style="filled" fillcolor=red]; + 3 [label="Enter function values" style="filled" fillcolor=red]; + 4 [label="Exit function values" style="filled" fillcolor=red]; } - 2 -> {3}; + 3 -> {4}; subgraph cluster_2 { color=red - 4 [label="Enter function valueOf" style="filled" fillcolor=red]; - 5 [label="Exit function valueOf" style="filled" fillcolor=red]; + 5 [label="Enter function valueOf" style="filled" fillcolor=red]; + 6 [label="Exit function valueOf" style="filled" fillcolor=red]; } - 4 -> {5}; + 5 -> {6}; subgraph cluster_3 { color=red - 6 [label="Enter function " style="filled" fillcolor=red]; - 7 [label="Exit function " style="filled" fillcolor=red]; + 7 [label="Enter function " style="filled" fillcolor=red]; + 8 [label="Delegated constructor call: super()"]; + 9 [label="Exit function " style="filled" fillcolor=red]; } - 6 -> {7}; + 7 -> {8}; + 8 -> {9}; subgraph cluster_4 { color=red - 8 [label="Enter function takeB" style="filled" fillcolor=red]; - 9 [label="Exit function takeB" style="filled" fillcolor=red]; - } - - 8 -> {9}; - - subgraph cluster_5 { - color=red - 10 [label="Enter function test_1" style="filled" fillcolor=red]; - 11 [label="Access variable R|/SomeEnum.A1|"]; - 12 [label="Variable declaration: lval flag: R|SomeEnum|"]; - subgraph cluster_6 { - color=blue - 13 [label="Enter when"]; - 14 [label="Access variable R|/flag|"]; - 15 [label="Check not null: R|/flag|!!"]; - subgraph cluster_7 { - color=blue - 16 [label="Enter when branch condition "]; - 17 [label="Access variable R|/SomeEnum.A1|"]; - 18 [label="Operator =="]; - 19 [label="Exit when branch condition"]; - } - subgraph cluster_8 { - color=blue - 20 [label="Enter when branch condition "]; - 21 [label="Access variable R|/SomeEnum.A2|"]; - 22 [label="Operator =="]; - 23 [label="Exit when branch condition"]; - } - 24 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 25 [label="Enter block"]; - 26 [label="Function call: R|/B.B|()"]; - 27 [label="Exit block"]; - } - 28 [label="Exit when branch result"]; - 29 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 30 [label="Enter block"]; - 31 [label="Function call: R|/B.B|()"]; - 32 [label="Exit block"]; - } - 33 [label="Exit when branch result"]; - 34 [label="Exit when"]; - } - 35 [label="Variable declaration: lval b: R|B|"]; - 36 [label="Access variable R|/b|"]; - 37 [label="Function call: R|/takeB|(...)"]; - 38 [label="Exit function test_1" style="filled" fillcolor=red]; + 10 [label="Enter function takeB" style="filled" fillcolor=red]; + 11 [label="Exit function takeB" style="filled" fillcolor=red]; } 10 -> {11}; - 11 -> {12}; + + subgraph cluster_5 { + color=red + 12 [label="Enter function test_1" style="filled" fillcolor=red]; + 13 [label="Access variable R|/SomeEnum.A1|"]; + 14 [label="Variable declaration: lval flag: R|SomeEnum|"]; + subgraph cluster_6 { + color=blue + 15 [label="Enter when"]; + 16 [label="Access variable R|/flag|"]; + 17 [label="Check not null: R|/flag|!!"]; + subgraph cluster_7 { + color=blue + 18 [label="Enter when branch condition "]; + 19 [label="Access variable R|/SomeEnum.A1|"]; + 20 [label="Operator =="]; + 21 [label="Exit when branch condition"]; + } + subgraph cluster_8 { + color=blue + 22 [label="Enter when branch condition "]; + 23 [label="Access variable R|/SomeEnum.A2|"]; + 24 [label="Operator =="]; + 25 [label="Exit when branch condition"]; + } + 26 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 27 [label="Enter block"]; + 28 [label="Function call: R|/B.B|()"]; + 29 [label="Exit block"]; + } + 30 [label="Exit when branch result"]; + 31 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 32 [label="Enter block"]; + 33 [label="Function call: R|/B.B|()"]; + 34 [label="Exit block"]; + } + 35 [label="Exit when branch result"]; + 36 [label="Exit when"]; + } + 37 [label="Variable declaration: lval b: R|B|"]; + 38 [label="Access variable R|/b|"]; + 39 [label="Function call: R|/takeB|(...)"]; + 40 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 12 -> {13}; 13 -> {14}; 14 -> {15}; @@ -100,18 +102,18 @@ digraph exhaustiveWhenAndDNNType_kt { 16 -> {17}; 17 -> {18}; 18 -> {19}; - 19 -> {29 20}; + 19 -> {20}; 20 -> {21}; - 21 -> {22}; + 21 -> {31 22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {34}; + 28 -> {29}; 29 -> {30}; - 30 -> {31}; + 30 -> {36}; 31 -> {32}; 32 -> {33}; 33 -> {34}; @@ -119,57 +121,57 @@ digraph exhaustiveWhenAndDNNType_kt { 35 -> {36}; 36 -> {37}; 37 -> {38}; + 38 -> {39}; + 39 -> {40}; subgraph cluster_11 { color=red - 39 [label="Enter function test_2" style="filled" fillcolor=red]; - 40 [label="Access variable R|/SomeEnum.A1|"]; - 41 [label="Variable declaration: lval flag: R|SomeEnum|"]; + 41 [label="Enter function test_2" style="filled" fillcolor=red]; + 42 [label="Access variable R|/SomeEnum.A1|"]; + 43 [label="Variable declaration: lval flag: R|SomeEnum|"]; subgraph cluster_12 { color=blue - 42 [label="Enter when"]; - 43 [label="Access variable R|/flag|"]; - 44 [label="Check not null: R|/flag|!!"]; + 44 [label="Enter when"]; + 45 [label="Access variable R|/flag|"]; + 46 [label="Check not null: R|/flag|!!"]; subgraph cluster_13 { color=blue - 45 [label="Enter when branch condition "]; - 46 [label="Access variable R|/SomeEnum.A1|"]; - 47 [label="Operator =="]; - 48 [label="Exit when branch condition"]; + 47 [label="Enter when branch condition "]; + 48 [label="Access variable R|/SomeEnum.A1|"]; + 49 [label="Operator =="]; + 50 [label="Exit when branch condition"]; } subgraph cluster_14 { color=blue - 49 [label="Enter when branch condition "]; - 50 [label="Access variable R|/SomeEnum.A2|"]; - 51 [label="Operator =="]; - 52 [label="Exit when branch condition"]; + 51 [label="Enter when branch condition "]; + 52 [label="Access variable R|/SomeEnum.A2|"]; + 53 [label="Operator =="]; + 54 [label="Exit when branch condition"]; } - 53 [label="Enter when branch result"]; + 55 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 54 [label="Enter block"]; - 55 [label="Function call: R|/B.B|()"]; - 56 [label="Exit block"]; + 56 [label="Enter block"]; + 57 [label="Function call: R|/B.B|()"]; + 58 [label="Exit block"]; } - 57 [label="Exit when branch result"]; - 58 [label="Enter when branch result"]; + 59 [label="Exit when branch result"]; + 60 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 59 [label="Enter block"]; - 60 [label="Function call: R|/B.B|()"]; - 61 [label="Exit block"]; + 61 [label="Enter block"]; + 62 [label="Function call: R|/B.B|()"]; + 63 [label="Exit block"]; } - 62 [label="Exit when branch result"]; - 63 [label="Exit when"]; + 64 [label="Exit when branch result"]; + 65 [label="Exit when"]; } - 64 [label="Variable declaration: lval b: R|B|"]; - 65 [label="Access variable R|/b|"]; - 66 [label="Function call: R|/takeB|(...)"]; - 67 [label="Exit function test_2" style="filled" fillcolor=red]; + 66 [label="Variable declaration: lval b: R|B|"]; + 67 [label="Access variable R|/b|"]; + 68 [label="Function call: R|/takeB|(...)"]; + 69 [label="Exit function test_2" style="filled" fillcolor=red]; } - 39 -> {40}; - 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; @@ -177,18 +179,18 @@ digraph exhaustiveWhenAndDNNType_kt { 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {58 49}; + 48 -> {49}; 49 -> {50}; - 50 -> {51}; + 50 -> {60 51}; 51 -> {52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {63}; + 57 -> {58}; 58 -> {59}; - 59 -> {60}; + 59 -> {65}; 60 -> {61}; 61 -> {62}; 62 -> {63}; @@ -196,74 +198,74 @@ digraph exhaustiveWhenAndDNNType_kt { 64 -> {65}; 65 -> {66}; 66 -> {67}; + 67 -> {68}; + 68 -> {69}; subgraph cluster_17 { color=red - 68 [label="Enter function test_3" style="filled" fillcolor=red]; - 69 [label="Access variable R|/SomeEnum.A1|"]; - 70 [label="Variable declaration: lval flag: R|SomeEnum|"]; + 70 [label="Enter function test_3" style="filled" fillcolor=red]; + 71 [label="Access variable R|/SomeEnum.A1|"]; + 72 [label="Variable declaration: lval flag: R|SomeEnum|"]; subgraph cluster_18 { color=blue - 71 [label="Enter when"]; - 72 [label="Access variable R|/flag|"]; + 73 [label="Enter when"]; + 74 [label="Access variable R|/flag|"]; subgraph cluster_19 { color=blue - 73 [label="Enter when branch condition "]; - 74 [label="Access variable R|/SomeEnum.A1|"]; - 75 [label="Operator =="]; - 76 [label="Exit when branch condition"]; + 75 [label="Enter when branch condition "]; + 76 [label="Access variable R|/SomeEnum.A1|"]; + 77 [label="Operator =="]; + 78 [label="Exit when branch condition"]; } subgraph cluster_20 { color=blue - 77 [label="Enter when branch condition "]; - 78 [label="Access variable R|/SomeEnum.A2|"]; - 79 [label="Operator =="]; - 80 [label="Exit when branch condition"]; + 79 [label="Enter when branch condition "]; + 80 [label="Access variable R|/SomeEnum.A2|"]; + 81 [label="Operator =="]; + 82 [label="Exit when branch condition"]; } - 81 [label="Enter when branch result"]; + 83 [label="Enter when branch result"]; subgraph cluster_21 { color=blue - 82 [label="Enter block"]; - 83 [label="Function call: R|/B.B|()"]; - 84 [label="Exit block"]; + 84 [label="Enter block"]; + 85 [label="Function call: R|/B.B|()"]; + 86 [label="Exit block"]; } - 85 [label="Exit when branch result"]; - 86 [label="Enter when branch result"]; + 87 [label="Exit when branch result"]; + 88 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 87 [label="Enter block"]; - 88 [label="Function call: R|/B.B|()"]; - 89 [label="Exit block"]; + 89 [label="Enter block"]; + 90 [label="Function call: R|/B.B|()"]; + 91 [label="Exit block"]; } - 90 [label="Exit when branch result"]; - 91 [label="Exit when"]; + 92 [label="Exit when branch result"]; + 93 [label="Exit when"]; } - 92 [label="Variable declaration: lval b: R|B|"]; - 93 [label="Access variable R|/b|"]; - 94 [label="Function call: R|/takeB|(...)"]; - 95 [label="Exit function test_3" style="filled" fillcolor=red]; + 94 [label="Variable declaration: lval b: R|B|"]; + 95 [label="Access variable R|/b|"]; + 96 [label="Function call: R|/takeB|(...)"]; + 97 [label="Exit function test_3" style="filled" fillcolor=red]; } - 68 -> {69}; - 69 -> {70}; 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; 75 -> {76}; - 76 -> {86 77}; + 76 -> {77}; 77 -> {78}; - 78 -> {79}; + 78 -> {88 79}; 79 -> {80}; 80 -> {81}; 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {91}; + 85 -> {86}; 86 -> {87}; - 87 -> {88}; + 87 -> {93}; 88 -> {89}; 89 -> {90}; 90 -> {91}; @@ -271,5 +273,7 @@ digraph exhaustiveWhenAndDNNType_kt { 92 -> {93}; 93 -> {94}; 94 -> {95}; + 95 -> {96}; + 96 -> {97}; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot b/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot index b4e7d870fce..cffedd8dcb7 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot @@ -281,91 +281,92 @@ digraph boundSmartcasts_kt { subgraph cluster_21 { color=red 103 [label="Enter function " style="filled" fillcolor=red]; - 104 [label="Exit function " style="filled" fillcolor=red]; + 104 [label="Delegated constructor call: super()"]; + 105 [label="Exit function " style="filled" fillcolor=red]; } 103 -> {104}; + 104 -> {105}; subgraph cluster_22 { color=red - 105 [label="Enter function getter" style="filled" fillcolor=red]; - 106 [label="Exit function getter" style="filled" fillcolor=red]; + 106 [label="Enter function getter" style="filled" fillcolor=red]; + 107 [label="Exit function getter" style="filled" fillcolor=red]; } - 105 -> {106}; + 106 -> {107}; subgraph cluster_23 { color=red - 107 [label="Enter property" style="filled" fillcolor=red]; - 108 [label="Access variable R|/any|"]; - 109 [label="Exit property" style="filled" fillcolor=red]; + 108 [label="Enter property" style="filled" fillcolor=red]; + 109 [label="Access variable R|/any|"]; + 110 [label="Exit property" style="filled" fillcolor=red]; } - 107 -> {108}; 108 -> {109}; + 109 -> {110}; subgraph cluster_24 { color=red - 110 [label="Enter function baz" style="filled" fillcolor=red]; - 111 [label="Exit function baz" style="filled" fillcolor=red]; + 111 [label="Enter function baz" style="filled" fillcolor=red]; + 112 [label="Exit function baz" style="filled" fillcolor=red]; } - 110 -> {111}; + 111 -> {112}; subgraph cluster_25 { color=red - 112 [label="Enter function test_5" style="filled" fillcolor=red]; + 113 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_26 { color=blue - 113 [label="Enter when"]; - 114 [label="Access variable R|/d|"]; - 115 [label="Access variable R|/D.any|"]; - 116 [label="Variable declaration: lval : R|kotlin/Any?|"]; + 114 [label="Enter when"]; + 115 [label="Access variable R|/d|"]; + 116 [label="Access variable R|/D.any|"]; + 117 [label="Variable declaration: lval : R|kotlin/Any?|"]; subgraph cluster_27 { color=blue - 117 [label="Enter when branch condition "]; - 118 [label="Const: Null(null)"]; - 119 [label="Operator =="]; - 120 [label="Exit when branch condition"]; + 118 [label="Enter when branch condition "]; + 119 [label="Const: Null(null)"]; + 120 [label="Operator =="]; + 121 [label="Exit when branch condition"]; } subgraph cluster_28 { color=blue - 121 [label="Enter when branch condition else"]; - 122 [label="Exit when branch condition"]; + 122 [label="Enter when branch condition else"]; + 123 [label="Exit when branch condition"]; } - 123 [label="Enter when branch result"]; + 124 [label="Enter when branch result"]; subgraph cluster_29 { color=blue - 124 [label="Enter block"]; - 125 [label="Access variable R|/|"]; - 126 [label="Exit block"]; + 125 [label="Enter block"]; + 126 [label="Access variable R|/|"]; + 127 [label="Exit block"]; } - 127 [label="Exit when branch result"]; - 128 [label="Enter when branch result"]; + 128 [label="Exit when branch result"]; + 129 [label="Enter when branch result"]; subgraph cluster_30 { color=blue - 129 [label="Enter block"]; - 130 [label="Jump: ^test_5 Unit"]; - 131 [label="Stub" style="filled" fillcolor=gray]; - 132 [label="Exit block" style="filled" fillcolor=gray]; + 130 [label="Enter block"]; + 131 [label="Jump: ^test_5 Unit"]; + 132 [label="Stub" style="filled" fillcolor=gray]; + 133 [label="Exit block" style="filled" fillcolor=gray]; } - 133 [label="Exit when branch result" style="filled" fillcolor=gray]; - 134 [label="Exit when"]; + 134 [label="Exit when branch result" style="filled" fillcolor=gray]; + 135 [label="Exit when"]; } - 135 [label="Variable declaration: lval a: R|kotlin/Any|"]; - 136 [label="Access variable R|/a|"]; - 137 [label="Function call: R|/a|.R|/baz|()"]; - 138 [label="Access variable R|/d|"]; - 139 [label="Access variable R|/D.any|"]; - 140 [label="Function call: R|/d|.R|/D.any|.R|/baz|()"]; - 141 [label="Access variable R|/a|"]; - 142 [label="Type operator: (R|/a| as R|A|)"]; - 143 [label="Access variable R|/a|"]; - 144 [label="Function call: R|/a|.R|/A.foo|()"]; - 145 [label="Exit function test_5" style="filled" fillcolor=red]; + 136 [label="Variable declaration: lval a: R|kotlin/Any|"]; + 137 [label="Access variable R|/a|"]; + 138 [label="Function call: R|/a|.R|/baz|()"]; + 139 [label="Access variable R|/d|"]; + 140 [label="Access variable R|/D.any|"]; + 141 [label="Function call: R|/d|.R|/D.any|.R|/baz|()"]; + 142 [label="Access variable R|/a|"]; + 143 [label="Type operator: (R|/a| as R|A|)"]; + 144 [label="Access variable R|/a|"]; + 145 [label="Function call: R|/a|.R|/A.foo|()"]; + 146 [label="Exit function test_5" style="filled" fillcolor=red]; } - 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; @@ -373,22 +374,22 @@ digraph boundSmartcasts_kt { 117 -> {118}; 118 -> {119}; 119 -> {120}; - 120 -> {128 121}; - 121 -> {122}; + 120 -> {121}; + 121 -> {129 122}; 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; 126 -> {127}; - 127 -> {134}; - 128 -> {129}; + 127 -> {128}; + 128 -> {135}; 129 -> {130}; - 130 -> {145}; - 130 -> {131} [style=dotted]; + 130 -> {131}; + 131 -> {146}; 131 -> {132} [style=dotted]; 132 -> {133} [style=dotted]; 133 -> {134} [style=dotted]; - 134 -> {135}; + 134 -> {135} [style=dotted]; 135 -> {136}; 136 -> {137}; 137 -> {138}; @@ -399,27 +400,27 @@ digraph boundSmartcasts_kt { 142 -> {143}; 143 -> {144}; 144 -> {145}; + 145 -> {146}; subgraph cluster_31 { color=red - 146 [label="Enter function test_6" style="filled" fillcolor=red]; - 147 [label="Access variable R|/d1|"]; - 148 [label="Access variable R|/D.any|"]; - 149 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 150 [label="Access variable R|/a|"]; - 151 [label="Type operator: (R|/a| as R|A|)"]; - 152 [label="Access variable R|/a|"]; - 153 [label="Function call: R|/a|.R|/A.foo|()"]; - 154 [label="Access variable R|/d1|"]; - 155 [label="Access variable R|/D.any|"]; - 156 [label="Function call: R|/d1|.R|/D.any|.R|/A.foo|()"]; - 157 [label="Access variable R|/d1|"]; - 158 [label="Access variable R|/D.any|"]; - 159 [label="Function call: R|/d1|.R|/D.any|.R|/baz|()"]; - 160 [label="Exit function test_6" style="filled" fillcolor=red]; + 147 [label="Enter function test_6" style="filled" fillcolor=red]; + 148 [label="Access variable R|/d1|"]; + 149 [label="Access variable R|/D.any|"]; + 150 [label="Variable declaration: lval a: R|kotlin/Any?|"]; + 151 [label="Access variable R|/a|"]; + 152 [label="Type operator: (R|/a| as R|A|)"]; + 153 [label="Access variable R|/a|"]; + 154 [label="Function call: R|/a|.R|/A.foo|()"]; + 155 [label="Access variable R|/d1|"]; + 156 [label="Access variable R|/D.any|"]; + 157 [label="Function call: R|/d1|.R|/D.any|.R|/A.foo|()"]; + 158 [label="Access variable R|/d1|"]; + 159 [label="Access variable R|/D.any|"]; + 160 [label="Function call: R|/d1|.R|/D.any|.R|/baz|()"]; + 161 [label="Exit function test_6" style="filled" fillcolor=red]; } - 146 -> {147}; 147 -> {148}; 148 -> {149}; 149 -> {150}; @@ -433,39 +434,39 @@ digraph boundSmartcasts_kt { 157 -> {158}; 158 -> {159}; 159 -> {160}; + 160 -> {161}; subgraph cluster_32 { color=red - 161 [label="Enter function test_7" style="filled" fillcolor=red]; - 162 [label="Access variable R|/d1|"]; - 163 [label="Enter safe call"]; - 164 [label="Access variable R|/D.any|"]; - 165 [label="Exit safe call"]; - 166 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 167 [label="Access variable R|/d2|"]; - 168 [label="Enter safe call"]; - 169 [label="Access variable R|/D.any|"]; - 170 [label="Exit safe call"]; - 171 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - 172 [label="Access variable R|/a|"]; - 173 [label="Type operator: (R|/a| as R|A|)"]; - 174 [label="Access variable R|/a|"]; - 175 [label="Function call: R|/a|.R|/A.foo|()"]; - 176 [label="Access variable R|/b|"]; - 177 [label="Type operator: (R|/b| as R|B|)"]; - 178 [label="Access variable R|/b|"]; - 179 [label="Function call: R|/b|.R|/B.bar|()"]; - 180 [label="Exit function test_7" style="filled" fillcolor=red]; + 162 [label="Enter function test_7" style="filled" fillcolor=red]; + 163 [label="Access variable R|/d1|"]; + 164 [label="Enter safe call"]; + 165 [label="Access variable R|/D.any|"]; + 166 [label="Exit safe call"]; + 167 [label="Variable declaration: lval a: R|kotlin/Any?|"]; + 168 [label="Access variable R|/d2|"]; + 169 [label="Enter safe call"]; + 170 [label="Access variable R|/D.any|"]; + 171 [label="Exit safe call"]; + 172 [label="Variable declaration: lval b: R|kotlin/Any?|"]; + 173 [label="Access variable R|/a|"]; + 174 [label="Type operator: (R|/a| as R|A|)"]; + 175 [label="Access variable R|/a|"]; + 176 [label="Function call: R|/a|.R|/A.foo|()"]; + 177 [label="Access variable R|/b|"]; + 178 [label="Type operator: (R|/b| as R|B|)"]; + 179 [label="Access variable R|/b|"]; + 180 [label="Function call: R|/b|.R|/B.bar|()"]; + 181 [label="Exit function test_7" style="filled" fillcolor=red]; } - 161 -> {162}; - 162 -> {163 165}; - 163 -> {164}; + 162 -> {163}; + 163 -> {164 166}; 164 -> {165}; 165 -> {166}; 166 -> {167}; - 167 -> {168 170}; - 168 -> {169}; + 167 -> {168}; + 168 -> {169 171}; 169 -> {170}; 170 -> {171}; 171 -> {172}; @@ -477,5 +478,6 @@ digraph boundSmartcasts_kt { 177 -> {178}; 178 -> {179}; 179 -> {180}; + 180 -> {181}; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot b/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot index 20238a56d83..d04951f25aa 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot @@ -6,93 +6,94 @@ digraph boundSmartcastsInBranches_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function getter" style="filled" fillcolor=red]; - 3 [label="Exit function getter" style="filled" fillcolor=red]; + 3 [label="Enter function getter" style="filled" fillcolor=red]; + 4 [label="Exit function getter" style="filled" fillcolor=red]; } - 2 -> {3}; + 3 -> {4}; subgraph cluster_2 { color=red - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Const: String()"]; - 6 [label="Exit property" style="filled" fillcolor=red]; + 5 [label="Enter property" style="filled" fillcolor=red]; + 6 [label="Const: String()"]; + 7 [label="Exit property" style="filled" fillcolor=red]; } - 4 -> {5}; 5 -> {6}; + 6 -> {7}; subgraph cluster_3 { color=red - 7 [label="Enter function test_0" style="filled" fillcolor=red]; - 8 [label="Const: Null(null)"]; - 9 [label="Variable declaration: lvar goodA: R|A?|"]; - 10 [label="Access variable R|/list|"]; - 11 [label="Function call: R|/list|.R|FakeOverride|>|()"]; - 12 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + 8 [label="Enter function test_0" style="filled" fillcolor=red]; + 9 [label="Const: Null(null)"]; + 10 [label="Variable declaration: lvar goodA: R|A?|"]; + 11 [label="Access variable R|/list|"]; + 12 [label="Function call: R|/list|.R|FakeOverride|>|()"]; + 13 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; subgraph cluster_4 { color=blue - 13 [label="Enter while loop"]; + 14 [label="Enter while loop"]; subgraph cluster_5 { color=blue - 14 [label="Enter loop condition"]; - 15 [label="Access variable R|/|"]; - 16 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 17 [label="Exit loop condition"]; + 15 [label="Enter loop condition"]; + 16 [label="Access variable R|/|"]; + 17 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; + 18 [label="Exit loop condition"]; } subgraph cluster_6 { color=blue - 18 [label="Enter loop block"]; + 19 [label="Enter loop block"]; subgraph cluster_7 { color=blue - 19 [label="Enter block"]; - 20 [label="Access variable R|/|"]; - 21 [label="Function call: R|/|.R|FakeOverride|()"]; - 22 [label="Variable declaration: lval a: R|A|"]; + 20 [label="Enter block"]; + 21 [label="Access variable R|/|"]; + 22 [label="Function call: R|/|.R|FakeOverride|()"]; + 23 [label="Variable declaration: lval a: R|A|"]; subgraph cluster_8 { color=blue - 23 [label="Enter when"]; + 24 [label="Enter when"]; subgraph cluster_9 { color=blue - 24 [label="Enter when branch condition "]; - 25 [label="Access variable R|/goodA|"]; - 26 [label="Const: Null(null)"]; - 27 [label="Operator =="]; - 28 [label="Exit when branch condition"]; + 25 [label="Enter when branch condition "]; + 26 [label="Access variable R|/goodA|"]; + 27 [label="Const: Null(null)"]; + 28 [label="Operator =="]; + 29 [label="Exit when branch condition"]; } - 29 [label="Synthetic else branch"]; - 30 [label="Enter when branch result"]; + 30 [label="Synthetic else branch"]; + 31 [label="Enter when branch result"]; subgraph cluster_10 { color=blue - 31 [label="Enter block"]; - 32 [label="Access variable R|/a|"]; - 33 [label="Assignmenet: R|/goodA|"]; - 34 [label="Jump: continue@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] "]; - 35 [label="Stub" style="filled" fillcolor=gray]; - 36 [label="Exit block" style="filled" fillcolor=gray]; + 32 [label="Enter block"]; + 33 [label="Access variable R|/a|"]; + 34 [label="Assignmenet: R|/goodA|"]; + 35 [label="Jump: continue@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] "]; + 36 [label="Stub" style="filled" fillcolor=gray]; + 37 [label="Exit block" style="filled" fillcolor=gray]; } - 37 [label="Exit when branch result" style="filled" fillcolor=gray]; - 38 [label="Exit when"]; + 38 [label="Exit when branch result" style="filled" fillcolor=gray]; + 39 [label="Exit when"]; } - 39 [label="Access variable R|/goodA|"]; - 40 [label="Access variable R|/A.s|"]; - 41 [label="Exit block"]; + 40 [label="Access variable R|/goodA|"]; + 41 [label="Access variable R|/A.s|"]; + 42 [label="Exit block"]; } - 42 [label="Exit loop block"]; + 43 [label="Exit loop block"]; } - 43 [label="Exit whileloop"]; + 44 [label="Exit whileloop"]; } - 44 [label="Exit function test_0" style="filled" fillcolor=red]; + 45 [label="Exit function test_0" style="filled" fillcolor=red]; } - 7 -> {8}; 8 -> {9}; 9 -> {10}; 10 -> {11}; @@ -102,8 +103,8 @@ digraph boundSmartcastsInBranches_kt { 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {43 18}; - 18 -> {19}; + 17 -> {18}; + 18 -> {44 19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; @@ -113,82 +114,82 @@ digraph boundSmartcastsInBranches_kt { 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {30 29}; - 29 -> {38}; - 30 -> {31}; + 28 -> {29}; + 29 -> {31 30}; + 30 -> {39}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {13}; - 34 -> {35} [style=dotted]; + 34 -> {35}; + 35 -> {14}; 35 -> {36} [style=dotted]; 36 -> {37} [style=dotted]; 37 -> {38} [style=dotted]; - 38 -> {39}; + 38 -> {39} [style=dotted]; 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {14}; - 43 -> {44}; + 42 -> {43}; + 43 -> {15}; + 44 -> {45}; subgraph cluster_11 { color=red - 45 [label="Enter function test_1" style="filled" fillcolor=red]; - 46 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 46 [label="Enter function test_1" style="filled" fillcolor=red]; + 47 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_12 { color=blue - 47 [label="Enter when"]; + 48 [label="Enter when"]; subgraph cluster_13 { color=blue - 48 [label="Enter when branch condition "]; - 49 [label="Access variable R|/b|"]; - 50 [label="Exit when branch condition"]; + 49 [label="Enter when branch condition "]; + 50 [label="Access variable R|/b|"]; + 51 [label="Exit when branch condition"]; } subgraph cluster_14 { color=blue - 51 [label="Enter when branch condition else"]; - 52 [label="Exit when branch condition"]; + 52 [label="Enter when branch condition else"]; + 53 [label="Exit when branch condition"]; } - 53 [label="Enter when branch result"]; + 54 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 54 [label="Enter block"]; - 55 [label="Access variable R|/a|"]; - 56 [label="Assignmenet: R|/x|"]; - 57 [label="Exit block"]; + 55 [label="Enter block"]; + 56 [label="Access variable R|/a|"]; + 57 [label="Assignmenet: R|/x|"]; + 58 [label="Exit block"]; } - 58 [label="Exit when branch result"]; - 59 [label="Enter when branch result"]; + 59 [label="Exit when branch result"]; + 60 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 60 [label="Enter block"]; - 61 [label="Function call: R|/A.A|()"]; - 62 [label="Assignmenet: R|/x|"]; - 63 [label="Exit block"]; + 61 [label="Enter block"]; + 62 [label="Function call: R|/A.A|()"]; + 63 [label="Assignmenet: R|/x|"]; + 64 [label="Exit block"]; } - 64 [label="Exit when branch result"]; - 65 [label="Exit when"]; + 65 [label="Exit when branch result"]; + 66 [label="Exit when"]; } - 66 [label="Access variable R|/x|"]; - 67 [label="Access variable R|/A.s|"]; - 68 [label="Exit function test_1" style="filled" fillcolor=red]; + 67 [label="Access variable R|/x|"]; + 68 [label="Access variable R|/A.s|"]; + 69 [label="Exit function test_1" style="filled" fillcolor=red]; } - 45 -> {46}; 46 -> {47}; 47 -> {48}; 48 -> {49}; 49 -> {50}; - 50 -> {59 51}; - 51 -> {52}; + 50 -> {51}; + 51 -> {60 52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; 57 -> {58}; - 58 -> {65}; - 59 -> {60}; + 58 -> {59}; + 59 -> {66}; 60 -> {61}; 61 -> {62}; 62 -> {63}; @@ -197,59 +198,59 @@ digraph boundSmartcastsInBranches_kt { 65 -> {66}; 66 -> {67}; 67 -> {68}; + 68 -> {69}; subgraph cluster_17 { color=red - 69 [label="Enter function test_2" style="filled" fillcolor=red]; - 70 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 70 [label="Enter function test_2" style="filled" fillcolor=red]; + 71 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_18 { color=blue - 71 [label="Enter when"]; + 72 [label="Enter when"]; subgraph cluster_19 { color=blue - 72 [label="Enter when branch condition "]; - 73 [label="Access variable R|/b|"]; - 74 [label="Exit when branch condition"]; + 73 [label="Enter when branch condition "]; + 74 [label="Access variable R|/b|"]; + 75 [label="Exit when branch condition"]; } subgraph cluster_20 { color=blue - 75 [label="Enter when branch condition else"]; - 76 [label="Exit when branch condition"]; + 76 [label="Enter when branch condition else"]; + 77 [label="Exit when branch condition"]; } - 77 [label="Enter when branch result"]; + 78 [label="Enter when branch result"]; subgraph cluster_21 { color=blue - 78 [label="Enter block"]; - 79 [label="Access variable R|/a|"]; - 80 [label="Assignmenet: R|/x|"]; - 81 [label="Access variable R|/a|"]; - 82 [label="Type operator: (R|/a| as R|A|)"]; - 83 [label="Exit block"]; + 79 [label="Enter block"]; + 80 [label="Access variable R|/a|"]; + 81 [label="Assignmenet: R|/x|"]; + 82 [label="Access variable R|/a|"]; + 83 [label="Type operator: (R|/a| as R|A|)"]; + 84 [label="Exit block"]; } - 84 [label="Exit when branch result"]; - 85 [label="Enter when branch result"]; + 85 [label="Exit when branch result"]; + 86 [label="Enter when branch result"]; subgraph cluster_22 { color=blue - 86 [label="Enter block"]; - 87 [label="Function call: R|/A.A|()"]; - 88 [label="Assignmenet: R|/x|"]; - 89 [label="Exit block"]; + 87 [label="Enter block"]; + 88 [label="Function call: R|/A.A|()"]; + 89 [label="Assignmenet: R|/x|"]; + 90 [label="Exit block"]; } - 90 [label="Exit when branch result"]; - 91 [label="Exit when"]; + 91 [label="Exit when branch result"]; + 92 [label="Exit when"]; } - 92 [label="Access variable R|/x|"]; - 93 [label="Access variable R|/A.s|"]; - 94 [label="Exit function test_2" style="filled" fillcolor=red]; + 93 [label="Access variable R|/x|"]; + 94 [label="Access variable R|/A.s|"]; + 95 [label="Exit function test_2" style="filled" fillcolor=red]; } - 69 -> {70}; 70 -> {71}; 71 -> {72}; 72 -> {73}; 73 -> {74}; - 74 -> {85 75}; - 75 -> {76}; + 74 -> {75}; + 75 -> {86 76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; @@ -258,8 +259,8 @@ digraph boundSmartcastsInBranches_kt { 81 -> {82}; 82 -> {83}; 83 -> {84}; - 84 -> {91}; - 85 -> {86}; + 84 -> {85}; + 85 -> {92}; 86 -> {87}; 87 -> {88}; 88 -> {89}; @@ -268,59 +269,59 @@ digraph boundSmartcastsInBranches_kt { 91 -> {92}; 92 -> {93}; 93 -> {94}; + 94 -> {95}; subgraph cluster_23 { color=red - 95 [label="Enter function test_3" style="filled" fillcolor=red]; - 96 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 96 [label="Enter function test_3" style="filled" fillcolor=red]; + 97 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_24 { color=blue - 97 [label="Enter when"]; + 98 [label="Enter when"]; subgraph cluster_25 { color=blue - 98 [label="Enter when branch condition "]; - 99 [label="Access variable R|/b|"]; - 100 [label="Exit when branch condition"]; + 99 [label="Enter when branch condition "]; + 100 [label="Access variable R|/b|"]; + 101 [label="Exit when branch condition"]; } subgraph cluster_26 { color=blue - 101 [label="Enter when branch condition else"]; - 102 [label="Exit when branch condition"]; + 102 [label="Enter when branch condition else"]; + 103 [label="Exit when branch condition"]; } - 103 [label="Enter when branch result"]; + 104 [label="Enter when branch result"]; subgraph cluster_27 { color=blue - 104 [label="Enter block"]; - 105 [label="Access variable R|/a|"]; - 106 [label="Type operator: (R|/a| as R|A|)"]; - 107 [label="Access variable R|/a|"]; - 108 [label="Assignmenet: R|/x|"]; - 109 [label="Exit block"]; + 105 [label="Enter block"]; + 106 [label="Access variable R|/a|"]; + 107 [label="Type operator: (R|/a| as R|A|)"]; + 108 [label="Access variable R|/a|"]; + 109 [label="Assignmenet: R|/x|"]; + 110 [label="Exit block"]; } - 110 [label="Exit when branch result"]; - 111 [label="Enter when branch result"]; + 111 [label="Exit when branch result"]; + 112 [label="Enter when branch result"]; subgraph cluster_28 { color=blue - 112 [label="Enter block"]; - 113 [label="Function call: R|/A.A|()"]; - 114 [label="Assignmenet: R|/x|"]; - 115 [label="Exit block"]; + 113 [label="Enter block"]; + 114 [label="Function call: R|/A.A|()"]; + 115 [label="Assignmenet: R|/x|"]; + 116 [label="Exit block"]; } - 116 [label="Exit when branch result"]; - 117 [label="Exit when"]; + 117 [label="Exit when branch result"]; + 118 [label="Exit when"]; } - 118 [label="Access variable R|/x|"]; - 119 [label="Access variable R|/A.s|"]; - 120 [label="Exit function test_3" style="filled" fillcolor=red]; + 119 [label="Access variable R|/x|"]; + 120 [label="Access variable R|/A.s|"]; + 121 [label="Exit function test_3" style="filled" fillcolor=red]; } - 95 -> {96}; 96 -> {97}; 97 -> {98}; 98 -> {99}; 99 -> {100}; - 100 -> {111 101}; - 101 -> {102}; + 100 -> {101}; + 101 -> {112 102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; @@ -329,8 +330,8 @@ digraph boundSmartcastsInBranches_kt { 107 -> {108}; 108 -> {109}; 109 -> {110}; - 110 -> {117}; - 111 -> {112}; + 110 -> {111}; + 111 -> {118}; 112 -> {113}; 113 -> {114}; 114 -> {115}; @@ -339,69 +340,69 @@ digraph boundSmartcastsInBranches_kt { 117 -> {118}; 118 -> {119}; 119 -> {120}; + 120 -> {121}; subgraph cluster_29 { color=red - 121 [label="Enter function test_4" style="filled" fillcolor=red]; - 122 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 122 [label="Enter function test_4" style="filled" fillcolor=red]; + 123 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_30 { color=blue - 123 [label="Enter when"]; + 124 [label="Enter when"]; subgraph cluster_31 { color=blue - 124 [label="Enter when branch condition "]; - 125 [label="Access variable R|/b|"]; - 126 [label="Exit when branch condition"]; + 125 [label="Enter when branch condition "]; + 126 [label="Access variable R|/b|"]; + 127 [label="Exit when branch condition"]; } subgraph cluster_32 { color=blue - 127 [label="Enter when branch condition else"]; - 128 [label="Exit when branch condition"]; + 128 [label="Enter when branch condition else"]; + 129 [label="Exit when branch condition"]; } - 129 [label="Enter when branch result"]; + 130 [label="Enter when branch result"]; subgraph cluster_33 { color=blue - 130 [label="Enter block"]; - 131 [label="Access variable R|/a|"]; - 132 [label="Assignmenet: R|/x|"]; - 133 [label="Exit block"]; + 131 [label="Enter block"]; + 132 [label="Access variable R|/a|"]; + 133 [label="Assignmenet: R|/x|"]; + 134 [label="Exit block"]; } - 134 [label="Exit when branch result"]; - 135 [label="Enter when branch result"]; + 135 [label="Exit when branch result"]; + 136 [label="Enter when branch result"]; subgraph cluster_34 { color=blue - 136 [label="Enter block"]; - 137 [label="Access variable R|/a|"]; - 138 [label="Assignmenet: R|/x|"]; - 139 [label="Exit block"]; + 137 [label="Enter block"]; + 138 [label="Access variable R|/a|"]; + 139 [label="Assignmenet: R|/x|"]; + 140 [label="Exit block"]; } - 140 [label="Exit when branch result"]; - 141 [label="Exit when"]; + 141 [label="Exit when branch result"]; + 142 [label="Exit when"]; } - 142 [label="Access variable R|/x|"]; - 143 [label="Type operator: (R|/x| as R|A|)"]; - 144 [label="Access variable R|/x|"]; - 145 [label="Access variable R|/A.s|"]; - 146 [label="Access variable R|/a|"]; - 147 [label="Access variable R|/A.s|"]; - 148 [label="Exit function test_4" style="filled" fillcolor=red]; + 143 [label="Access variable R|/x|"]; + 144 [label="Type operator: (R|/x| as R|A|)"]; + 145 [label="Access variable R|/x|"]; + 146 [label="Access variable R|/A.s|"]; + 147 [label="Access variable R|/a|"]; + 148 [label="Access variable R|/A.s|"]; + 149 [label="Exit function test_4" style="filled" fillcolor=red]; } - 121 -> {122}; 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {135 127}; - 127 -> {128}; + 126 -> {127}; + 127 -> {136 128}; 128 -> {129}; 129 -> {130}; 130 -> {131}; 131 -> {132}; 132 -> {133}; 133 -> {134}; - 134 -> {141}; - 135 -> {136}; + 134 -> {135}; + 135 -> {142}; 136 -> {137}; 137 -> {138}; 138 -> {139}; @@ -414,69 +415,69 @@ digraph boundSmartcastsInBranches_kt { 145 -> {146}; 146 -> {147}; 147 -> {148}; + 148 -> {149}; subgraph cluster_35 { color=red - 149 [label="Enter function test_5" style="filled" fillcolor=red]; - 150 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 150 [label="Enter function test_5" style="filled" fillcolor=red]; + 151 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_36 { color=blue - 151 [label="Enter when"]; + 152 [label="Enter when"]; subgraph cluster_37 { color=blue - 152 [label="Enter when branch condition "]; - 153 [label="Access variable R|/b|"]; - 154 [label="Exit when branch condition"]; + 153 [label="Enter when branch condition "]; + 154 [label="Access variable R|/b|"]; + 155 [label="Exit when branch condition"]; } subgraph cluster_38 { color=blue - 155 [label="Enter when branch condition else"]; - 156 [label="Exit when branch condition"]; + 156 [label="Enter when branch condition else"]; + 157 [label="Exit when branch condition"]; } - 157 [label="Enter when branch result"]; + 158 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 158 [label="Enter block"]; - 159 [label="Access variable R|/a|"]; - 160 [label="Assignmenet: R|/x|"]; - 161 [label="Exit block"]; + 159 [label="Enter block"]; + 160 [label="Access variable R|/a|"]; + 161 [label="Assignmenet: R|/x|"]; + 162 [label="Exit block"]; } - 162 [label="Exit when branch result"]; - 163 [label="Enter when branch result"]; + 163 [label="Exit when branch result"]; + 164 [label="Enter when branch result"]; subgraph cluster_40 { color=blue - 164 [label="Enter block"]; - 165 [label="Access variable R|/a|"]; - 166 [label="Assignmenet: R|/x|"]; - 167 [label="Exit block"]; + 165 [label="Enter block"]; + 166 [label="Access variable R|/a|"]; + 167 [label="Assignmenet: R|/x|"]; + 168 [label="Exit block"]; } - 168 [label="Exit when branch result"]; - 169 [label="Exit when"]; + 169 [label="Exit when branch result"]; + 170 [label="Exit when"]; } - 170 [label="Access variable R|/a|"]; - 171 [label="Type operator: (R|/a| as R|A|)"]; - 172 [label="Access variable R|/x|"]; - 173 [label="Access variable R|/A.s|"]; - 174 [label="Access variable R|/a|"]; - 175 [label="Access variable R|/A.s|"]; - 176 [label="Exit function test_5" style="filled" fillcolor=red]; + 171 [label="Access variable R|/a|"]; + 172 [label="Type operator: (R|/a| as R|A|)"]; + 173 [label="Access variable R|/x|"]; + 174 [label="Access variable R|/A.s|"]; + 175 [label="Access variable R|/a|"]; + 176 [label="Access variable R|/A.s|"]; + 177 [label="Exit function test_5" style="filled" fillcolor=red]; } - 149 -> {150}; 150 -> {151}; 151 -> {152}; 152 -> {153}; 153 -> {154}; - 154 -> {163 155}; - 155 -> {156}; + 154 -> {155}; + 155 -> {164 156}; 156 -> {157}; 157 -> {158}; 158 -> {159}; 159 -> {160}; 160 -> {161}; 161 -> {162}; - 162 -> {169}; - 163 -> {164}; + 162 -> {163}; + 163 -> {170}; 164 -> {165}; 165 -> {166}; 166 -> {167}; @@ -489,202 +490,202 @@ digraph boundSmartcastsInBranches_kt { 173 -> {174}; 174 -> {175}; 175 -> {176}; + 176 -> {177}; subgraph cluster_41 { color=red - 177 [label="Enter function test_6" style="filled" fillcolor=red]; - 178 [label="Variable declaration: lval x: R|kotlin/Any|"]; - 179 [label="Access variable R|/a|"]; - 180 [label="Assignmenet: R|/x|"]; - 181 [label="Access variable R|/x|"]; - 182 [label="Access variable R|/A.s|"]; - 183 [label="Exit function test_6" style="filled" fillcolor=red]; + 178 [label="Enter function test_6" style="filled" fillcolor=red]; + 179 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 180 [label="Access variable R|/a|"]; + 181 [label="Assignmenet: R|/x|"]; + 182 [label="Access variable R|/x|"]; + 183 [label="Access variable R|/A.s|"]; + 184 [label="Exit function test_6" style="filled" fillcolor=red]; } - 177 -> {178}; 178 -> {179}; 179 -> {180}; 180 -> {181}; 181 -> {182}; 182 -> {183}; + 183 -> {184}; subgraph cluster_42 { color=red - 184 [label="Enter function test_7" style="filled" fillcolor=red]; - 185 [label="Const: Null(null)"]; - 186 [label="Variable declaration: lval z: R|kotlin/String?|"]; - 187 [label="Access variable R|/z|"]; - 188 [label="Variable declaration: lvar y: R|kotlin/String?|"]; - 189 [label="Access variable R|/y|"]; - 190 [label="Variable declaration: lval x: R|kotlin/String?|"]; + 185 [label="Enter function test_7" style="filled" fillcolor=red]; + 186 [label="Const: Null(null)"]; + 187 [label="Variable declaration: lval z: R|kotlin/String?|"]; + 188 [label="Access variable R|/z|"]; + 189 [label="Variable declaration: lvar y: R|kotlin/String?|"]; + 190 [label="Access variable R|/y|"]; + 191 [label="Variable declaration: lval x: R|kotlin/String?|"]; subgraph cluster_43 { color=blue - 191 [label="Enter when"]; + 192 [label="Enter when"]; subgraph cluster_44 { color=blue - 192 [label="Enter when branch condition "]; - 193 [label="Access variable R|/x|"]; - 194 [label="Const: Null(null)"]; - 195 [label="Operator !="]; - 196 [label="Exit when branch condition"]; + 193 [label="Enter when branch condition "]; + 194 [label="Access variable R|/x|"]; + 195 [label="Const: Null(null)"]; + 196 [label="Operator !="]; + 197 [label="Exit when branch condition"]; } - 197 [label="Synthetic else branch"]; - 198 [label="Enter when branch result"]; + 198 [label="Synthetic else branch"]; + 199 [label="Enter when branch result"]; subgraph cluster_45 { color=blue - 199 [label="Enter block"]; - 200 [label="Access variable R|/x|"]; - 201 [label="Access variable R|kotlin/String.length|"]; - 202 [label="Access variable R|/y|"]; - 203 [label="Access variable R|kotlin/String.length|"]; - 204 [label="Access variable R|/z|"]; - 205 [label="Access variable R|kotlin/String.length|"]; - 206 [label="Exit block"]; + 200 [label="Enter block"]; + 201 [label="Access variable R|/x|"]; + 202 [label="Access variable R|kotlin/String.length|"]; + 203 [label="Access variable R|/y|"]; + 204 [label="Access variable R|kotlin/String.length|"]; + 205 [label="Access variable R|/z|"]; + 206 [label="Access variable R|kotlin/String.length|"]; + 207 [label="Exit block"]; } - 207 [label="Exit when branch result"]; - 208 [label="Exit when"]; + 208 [label="Exit when branch result"]; + 209 [label="Exit when"]; } subgraph cluster_46 { color=blue - 209 [label="Enter when"]; + 210 [label="Enter when"]; subgraph cluster_47 { color=blue - 210 [label="Enter when branch condition "]; - 211 [label="Access variable R|/y|"]; - 212 [label="Const: Null(null)"]; - 213 [label="Operator !="]; - 214 [label="Exit when branch condition"]; + 211 [label="Enter when branch condition "]; + 212 [label="Access variable R|/y|"]; + 213 [label="Const: Null(null)"]; + 214 [label="Operator !="]; + 215 [label="Exit when branch condition"]; } - 215 [label="Synthetic else branch"]; - 216 [label="Enter when branch result"]; + 216 [label="Synthetic else branch"]; + 217 [label="Enter when branch result"]; subgraph cluster_48 { color=blue - 217 [label="Enter block"]; - 218 [label="Access variable R|/x|"]; - 219 [label="Access variable R|kotlin/String.length|"]; - 220 [label="Access variable R|/y|"]; - 221 [label="Access variable R|kotlin/String.length|"]; - 222 [label="Access variable R|/z|"]; - 223 [label="Access variable R|kotlin/String.length|"]; - 224 [label="Exit block"]; + 218 [label="Enter block"]; + 219 [label="Access variable R|/x|"]; + 220 [label="Access variable R|kotlin/String.length|"]; + 221 [label="Access variable R|/y|"]; + 222 [label="Access variable R|kotlin/String.length|"]; + 223 [label="Access variable R|/z|"]; + 224 [label="Access variable R|kotlin/String.length|"]; + 225 [label="Exit block"]; } - 225 [label="Exit when branch result"]; - 226 [label="Exit when"]; + 226 [label="Exit when branch result"]; + 227 [label="Exit when"]; } subgraph cluster_49 { color=blue - 227 [label="Enter when"]; + 228 [label="Enter when"]; subgraph cluster_50 { color=blue - 228 [label="Enter when branch condition "]; - 229 [label="Access variable R|/z|"]; - 230 [label="Const: Null(null)"]; - 231 [label="Operator !="]; - 232 [label="Exit when branch condition"]; + 229 [label="Enter when branch condition "]; + 230 [label="Access variable R|/z|"]; + 231 [label="Const: Null(null)"]; + 232 [label="Operator !="]; + 233 [label="Exit when branch condition"]; } - 233 [label="Synthetic else branch"]; - 234 [label="Enter when branch result"]; + 234 [label="Synthetic else branch"]; + 235 [label="Enter when branch result"]; subgraph cluster_51 { color=blue - 235 [label="Enter block"]; - 236 [label="Access variable R|/x|"]; - 237 [label="Access variable R|kotlin/String.length|"]; - 238 [label="Access variable R|/y|"]; - 239 [label="Access variable R|kotlin/String.length|"]; - 240 [label="Access variable R|/z|"]; - 241 [label="Access variable R|kotlin/String.length|"]; - 242 [label="Exit block"]; + 236 [label="Enter block"]; + 237 [label="Access variable R|/x|"]; + 238 [label="Access variable R|kotlin/String.length|"]; + 239 [label="Access variable R|/y|"]; + 240 [label="Access variable R|kotlin/String.length|"]; + 241 [label="Access variable R|/z|"]; + 242 [label="Access variable R|kotlin/String.length|"]; + 243 [label="Exit block"]; } - 243 [label="Exit when branch result"]; - 244 [label="Exit when"]; + 244 [label="Exit when branch result"]; + 245 [label="Exit when"]; } - 245 [label="Const: Null(null)"]; - 246 [label="Assignmenet: R|/y|"]; + 246 [label="Const: Null(null)"]; + 247 [label="Assignmenet: R|/y|"]; subgraph cluster_52 { color=blue - 247 [label="Enter when"]; + 248 [label="Enter when"]; subgraph cluster_53 { color=blue - 248 [label="Enter when branch condition "]; - 249 [label="Access variable R|/x|"]; - 250 [label="Const: Null(null)"]; - 251 [label="Operator !="]; - 252 [label="Exit when branch condition"]; + 249 [label="Enter when branch condition "]; + 250 [label="Access variable R|/x|"]; + 251 [label="Const: Null(null)"]; + 252 [label="Operator !="]; + 253 [label="Exit when branch condition"]; } - 253 [label="Synthetic else branch"]; - 254 [label="Enter when branch result"]; + 254 [label="Synthetic else branch"]; + 255 [label="Enter when branch result"]; subgraph cluster_54 { color=blue - 255 [label="Enter block"]; - 256 [label="Access variable R|/x|"]; - 257 [label="Access variable R|kotlin/String.length|"]; - 258 [label="Access variable R|/y|"]; - 259 [label="Access variable #"]; - 260 [label="Access variable R|/z|"]; - 261 [label="Access variable R|kotlin/String.length|"]; - 262 [label="Exit block"]; + 256 [label="Enter block"]; + 257 [label="Access variable R|/x|"]; + 258 [label="Access variable R|kotlin/String.length|"]; + 259 [label="Access variable R|/y|"]; + 260 [label="Access variable #"]; + 261 [label="Access variable R|/z|"]; + 262 [label="Access variable R|kotlin/String.length|"]; + 263 [label="Exit block"]; } - 263 [label="Exit when branch result"]; - 264 [label="Exit when"]; + 264 [label="Exit when branch result"]; + 265 [label="Exit when"]; } subgraph cluster_55 { color=blue - 265 [label="Enter when"]; + 266 [label="Enter when"]; subgraph cluster_56 { color=blue - 266 [label="Enter when branch condition "]; - 267 [label="Access variable R|/y|"]; - 268 [label="Const: Null(null)"]; - 269 [label="Operator !="]; - 270 [label="Exit when branch condition"]; + 267 [label="Enter when branch condition "]; + 268 [label="Access variable R|/y|"]; + 269 [label="Const: Null(null)"]; + 270 [label="Operator !="]; + 271 [label="Exit when branch condition"]; } - 271 [label="Synthetic else branch"]; - 272 [label="Enter when branch result"]; + 272 [label="Synthetic else branch"]; + 273 [label="Enter when branch result"]; subgraph cluster_57 { color=blue - 273 [label="Enter block"]; - 274 [label="Access variable R|/x|"]; - 275 [label="Access variable #"]; - 276 [label="Access variable R|/y|"]; - 277 [label="Access variable R|kotlin/String.length|"]; - 278 [label="Access variable R|/z|"]; - 279 [label="Access variable #"]; - 280 [label="Exit block"]; + 274 [label="Enter block"]; + 275 [label="Access variable R|/x|"]; + 276 [label="Access variable #"]; + 277 [label="Access variable R|/y|"]; + 278 [label="Access variable R|kotlin/String.length|"]; + 279 [label="Access variable R|/z|"]; + 280 [label="Access variable #"]; + 281 [label="Exit block"]; } - 281 [label="Exit when branch result"]; - 282 [label="Exit when"]; + 282 [label="Exit when branch result"]; + 283 [label="Exit when"]; } subgraph cluster_58 { color=blue - 283 [label="Enter when"]; + 284 [label="Enter when"]; subgraph cluster_59 { color=blue - 284 [label="Enter when branch condition "]; - 285 [label="Access variable R|/z|"]; - 286 [label="Const: Null(null)"]; - 287 [label="Operator !="]; - 288 [label="Exit when branch condition"]; + 285 [label="Enter when branch condition "]; + 286 [label="Access variable R|/z|"]; + 287 [label="Const: Null(null)"]; + 288 [label="Operator !="]; + 289 [label="Exit when branch condition"]; } - 289 [label="Synthetic else branch"]; - 290 [label="Enter when branch result"]; + 290 [label="Synthetic else branch"]; + 291 [label="Enter when branch result"]; subgraph cluster_60 { color=blue - 291 [label="Enter block"]; - 292 [label="Access variable R|/x|"]; - 293 [label="Access variable R|kotlin/String.length|"]; - 294 [label="Access variable R|/y|"]; - 295 [label="Access variable #"]; - 296 [label="Access variable R|/z|"]; - 297 [label="Access variable R|kotlin/String.length|"]; - 298 [label="Exit block"]; + 292 [label="Enter block"]; + 293 [label="Access variable R|/x|"]; + 294 [label="Access variable R|kotlin/String.length|"]; + 295 [label="Access variable R|/y|"]; + 296 [label="Access variable #"]; + 297 [label="Access variable R|/z|"]; + 298 [label="Access variable R|kotlin/String.length|"]; + 299 [label="Exit block"]; } - 299 [label="Exit when branch result"]; - 300 [label="Exit when"]; + 300 [label="Exit when branch result"]; + 301 [label="Exit when"]; } - 301 [label="Exit function test_7" style="filled" fillcolor=red]; + 302 [label="Exit function test_7" style="filled" fillcolor=red]; } - 184 -> {185}; 185 -> {186}; 186 -> {187}; 187 -> {188}; @@ -696,9 +697,9 @@ digraph boundSmartcastsInBranches_kt { 193 -> {194}; 194 -> {195}; 195 -> {196}; - 196 -> {198 197}; - 197 -> {208}; - 198 -> {199}; + 196 -> {197}; + 197 -> {199 198}; + 198 -> {209}; 199 -> {200}; 200 -> {201}; 201 -> {202}; @@ -714,9 +715,9 @@ digraph boundSmartcastsInBranches_kt { 211 -> {212}; 212 -> {213}; 213 -> {214}; - 214 -> {216 215}; - 215 -> {226}; - 216 -> {217}; + 214 -> {215}; + 215 -> {217 216}; + 216 -> {227}; 217 -> {218}; 218 -> {219}; 219 -> {220}; @@ -732,9 +733,9 @@ digraph boundSmartcastsInBranches_kt { 229 -> {230}; 230 -> {231}; 231 -> {232}; - 232 -> {234 233}; - 233 -> {244}; - 234 -> {235}; + 232 -> {233}; + 233 -> {235 234}; + 234 -> {245}; 235 -> {236}; 236 -> {237}; 237 -> {238}; @@ -752,9 +753,9 @@ digraph boundSmartcastsInBranches_kt { 249 -> {250}; 250 -> {251}; 251 -> {252}; - 252 -> {254 253}; - 253 -> {264}; - 254 -> {255}; + 252 -> {253}; + 253 -> {255 254}; + 254 -> {265}; 255 -> {256}; 256 -> {257}; 257 -> {258}; @@ -770,9 +771,9 @@ digraph boundSmartcastsInBranches_kt { 267 -> {268}; 268 -> {269}; 269 -> {270}; - 270 -> {272 271}; - 271 -> {282}; - 272 -> {273}; + 270 -> {271}; + 271 -> {273 272}; + 272 -> {283}; 273 -> {274}; 274 -> {275}; 275 -> {276}; @@ -788,9 +789,9 @@ digraph boundSmartcastsInBranches_kt { 285 -> {286}; 286 -> {287}; 287 -> {288}; - 288 -> {290 289}; - 289 -> {300}; - 290 -> {291}; + 288 -> {289}; + 289 -> {291 290}; + 290 -> {301}; 291 -> {292}; 292 -> {293}; 293 -> {294}; @@ -801,5 +802,6 @@ digraph boundSmartcastsInBranches_kt { 298 -> {299}; 299 -> {300}; 300 -> {301}; + 301 -> {302}; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot b/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot index cec3a974cb1..809a0757b34 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot @@ -6,95 +6,99 @@ digraph functionCallBound_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function " style="filled" fillcolor=red]; - 3 [label="Exit function " style="filled" fillcolor=red]; + 3 [label="Enter function " style="filled" fillcolor=red]; + 4 [label="Delegated constructor call: super()"]; + 5 [label="Exit function " style="filled" fillcolor=red]; } - 2 -> {3}; + 3 -> {4}; + 4 -> {5}; subgraph cluster_2 { color=red - 4 [label="Enter function getter" style="filled" fillcolor=red]; - 5 [label="Exit function getter" style="filled" fillcolor=red]; - } - - 4 -> {5}; - - subgraph cluster_3 { - color=red - 6 [label="Enter property" style="filled" fillcolor=red]; - 7 [label="Access variable R|/data|"]; - 8 [label="Exit property" style="filled" fillcolor=red]; + 6 [label="Enter function getter" style="filled" fillcolor=red]; + 7 [label="Exit function getter" style="filled" fillcolor=red]; } 6 -> {7}; - 7 -> {8}; + + subgraph cluster_3 { + color=red + 8 [label="Enter property" style="filled" fillcolor=red]; + 9 [label="Access variable R|/data|"]; + 10 [label="Exit property" style="filled" fillcolor=red]; + } + + 8 -> {9}; + 9 -> {10}; subgraph cluster_4 { color=red - 9 [label="Enter function isOk" style="filled" fillcolor=red]; - 10 [label="Const: Boolean(true)"]; - 11 [label="Jump: ^isOk Boolean(true)"]; - 12 [label="Stub" style="filled" fillcolor=gray]; - 13 [label="Exit function isOk" style="filled" fillcolor=red]; + 11 [label="Enter function isOk" style="filled" fillcolor=red]; + 12 [label="Const: Boolean(true)"]; + 13 [label="Jump: ^isOk Boolean(true)"]; + 14 [label="Stub" style="filled" fillcolor=gray]; + 15 [label="Exit function isOk" style="filled" fillcolor=red]; } - 9 -> {10}; - 10 -> {11}; - 11 -> {13}; - 11 -> {12} [style=dotted]; - 12 -> {13} [style=dotted]; + 11 -> {12}; + 12 -> {13}; + 13 -> {15}; + 13 -> {14} [style=dotted]; + 14 -> {15} [style=dotted]; subgraph cluster_5 { color=red - 14 [label="Enter function check" style="filled" fillcolor=red]; + 16 [label="Enter function check" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 15 [label="Enter when"]; + 17 [label="Enter when"]; subgraph cluster_7 { color=blue - 16 [label="Enter when branch condition "]; - 17 [label="Access variable R|/base|"]; - 18 [label="Type operator: (R|/base| as? R|Sub|)"]; - 19 [label="Enter safe call"]; - 20 [label="Function call: (R|/base| as? R|Sub|)?.R|/isOk|()"]; - 21 [label="Exit safe call"]; - 22 [label="Const: Boolean(true)"]; - 23 [label="Operator =="]; - 24 [label="Exit when branch condition"]; + 18 [label="Enter when branch condition "]; + 19 [label="Access variable R|/base|"]; + 20 [label="Type operator: (R|/base| as? R|Sub|)"]; + 21 [label="Enter safe call"]; + 22 [label="Function call: (R|/base| as? R|Sub|)?.R|/isOk|()"]; + 23 [label="Exit safe call"]; + 24 [label="Const: Boolean(true)"]; + 25 [label="Operator =="]; + 26 [label="Exit when branch condition"]; } subgraph cluster_8 { color=blue - 25 [label="Enter when branch condition else"]; - 26 [label="Exit when branch condition"]; + 27 [label="Enter when branch condition else"]; + 28 [label="Exit when branch condition"]; } - 27 [label="Enter when branch result"]; + 29 [label="Enter when branch result"]; subgraph cluster_9 { color=blue - 28 [label="Enter block"]; - 29 [label="Access variable R|/base|"]; - 30 [label="Exit block"]; + 30 [label="Enter block"]; + 31 [label="Access variable R|/base|"]; + 32 [label="Exit block"]; } - 31 [label="Exit when branch result"]; - 32 [label="Enter when branch result"]; + 33 [label="Exit when branch result"]; + 34 [label="Enter when branch result"]; subgraph cluster_10 { color=blue - 33 [label="Enter block"]; - 34 [label="Access variable R|/base|"]; - 35 [label="Access variable R|/Sub.data|"]; - 36 [label="Exit block"]; + 35 [label="Enter block"]; + 36 [label="Access variable R|/base|"]; + 37 [label="Access variable R|/Sub.data|"]; + 38 [label="Exit block"]; } - 37 [label="Exit when branch result"]; - 38 [label="Exit when"]; + 39 [label="Exit when branch result"]; + 40 [label="Exit when"]; } - 39 [label="Jump: ^check when () { + 41 [label="Jump: ^check when () { ==((R|/base| as? R|Sub|)?.R|/isOk|(), Boolean(true)) -> { R|/base|.R|/Sub.data| } @@ -103,37 +107,37 @@ digraph functionCallBound_kt { } } "]; - 40 [label="Stub" style="filled" fillcolor=gray]; - 41 [label="Exit function check" style="filled" fillcolor=red]; + 42 [label="Stub" style="filled" fillcolor=gray]; + 43 [label="Exit function check" style="filled" fillcolor=red]; } - 14 -> {15}; - 15 -> {16}; 16 -> {17}; 17 -> {18}; - 18 -> {19 21}; + 18 -> {19}; 19 -> {20}; - 20 -> {21}; + 20 -> {21 23}; 21 -> {22}; 22 -> {23}; 23 -> {24}; - 24 -> {32 25}; + 24 -> {25}; 25 -> {26}; - 26 -> {27}; + 26 -> {34 27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; - 31 -> {38}; + 31 -> {32}; 32 -> {33}; - 33 -> {34}; + 33 -> {40}; 34 -> {35}; 35 -> {36}; 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {41}; - 39 -> {40} [style=dotted]; - 40 -> {41} [style=dotted]; + 39 -> {40}; + 40 -> {41}; + 41 -> {43}; + 41 -> {42} [style=dotted]; + 42 -> {43} [style=dotted]; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/nullability.dot b/compiler/fir/resolve/testData/resolve/smartcasts/nullability.dot index e3ba1407eef..22cd46978c6 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/nullability.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/nullability.dot @@ -70,452 +70,455 @@ digraph nullability_kt { subgraph cluster_8 { color=red 16 [label="Enter function " style="filled" fillcolor=red]; - 17 [label="Exit function " style="filled" fillcolor=red]; + 17 [label="Delegated constructor call: super()"]; + 18 [label="Exit function " style="filled" fillcolor=red]; } 16 -> {17}; + 17 -> {18}; subgraph cluster_9 { color=red - 18 [label="Enter function getter" style="filled" fillcolor=red]; - 19 [label="Exit function getter" style="filled" fillcolor=red]; + 19 [label="Enter function getter" style="filled" fillcolor=red]; + 20 [label="Exit function getter" style="filled" fillcolor=red]; } - 18 -> {19}; + 19 -> {20}; subgraph cluster_10 { color=red - 20 [label="Enter property" style="filled" fillcolor=red]; - 21 [label="Access variable R|/data|"]; - 22 [label="Exit property" style="filled" fillcolor=red]; + 21 [label="Enter property" style="filled" fillcolor=red]; + 22 [label="Access variable R|/data|"]; + 23 [label="Exit property" style="filled" fillcolor=red]; } - 20 -> {21}; 21 -> {22}; + 22 -> {23}; subgraph cluster_11 { color=red - 23 [label="Enter function fdata" style="filled" fillcolor=red]; - 24 [label="Const: Null(null)"]; - 25 [label="Jump: ^fdata Null(null)"]; - 26 [label="Stub" style="filled" fillcolor=gray]; - 27 [label="Exit function fdata" style="filled" fillcolor=red]; + 24 [label="Enter function fdata" style="filled" fillcolor=red]; + 25 [label="Const: Null(null)"]; + 26 [label="Jump: ^fdata Null(null)"]; + 27 [label="Stub" style="filled" fillcolor=gray]; + 28 [label="Exit function fdata" style="filled" fillcolor=red]; } - 23 -> {24}; 24 -> {25}; - 25 -> {27}; - 25 -> {26} [style=dotted]; + 25 -> {26}; + 26 -> {28}; 26 -> {27} [style=dotted]; + 27 -> {28} [style=dotted]; subgraph cluster_12 { color=red - 28 [label="Enter function " style="filled" fillcolor=red]; - 29 [label="Exit function " style="filled" fillcolor=red]; + 29 [label="Enter function " style="filled" fillcolor=red]; + 30 [label="Delegated constructor call: super()"]; + 31 [label="Exit function " style="filled" fillcolor=red]; } - 28 -> {29}; + 29 -> {30}; + 30 -> {31}; subgraph cluster_13 { color=red - 30 [label="Enter function getter" style="filled" fillcolor=red]; - 31 [label="Exit function getter" style="filled" fillcolor=red]; - } - - 30 -> {31}; - - subgraph cluster_14 { - color=red - 32 [label="Enter function setter" style="filled" fillcolor=red]; - 33 [label="Exit function setter" style="filled" fillcolor=red]; + 32 [label="Enter function getter" style="filled" fillcolor=red]; + 33 [label="Exit function getter" style="filled" fillcolor=red]; } 32 -> {33}; - subgraph cluster_15 { + subgraph cluster_14 { color=red - 34 [label="Enter property" style="filled" fillcolor=red]; - 35 [label="Access variable R|/data|"]; - 36 [label="Exit property" style="filled" fillcolor=red]; + 34 [label="Enter function setter" style="filled" fillcolor=red]; + 35 [label="Exit function setter" style="filled" fillcolor=red]; } 34 -> {35}; - 35 -> {36}; + + subgraph cluster_15 { + color=red + 36 [label="Enter property" style="filled" fillcolor=red]; + 37 [label="Access variable R|/data|"]; + 38 [label="Exit property" style="filled" fillcolor=red]; + } + + 36 -> {37}; + 37 -> {38}; subgraph cluster_16 { color=red - 37 [label="Enter function fdata" style="filled" fillcolor=red]; - 38 [label="Const: Null(null)"]; - 39 [label="Jump: ^fdata Null(null)"]; - 40 [label="Stub" style="filled" fillcolor=gray]; - 41 [label="Exit function fdata" style="filled" fillcolor=red]; + 39 [label="Enter function fdata" style="filled" fillcolor=red]; + 40 [label="Const: Null(null)"]; + 41 [label="Jump: ^fdata Null(null)"]; + 42 [label="Stub" style="filled" fillcolor=gray]; + 43 [label="Exit function fdata" style="filled" fillcolor=red]; } - 37 -> {38}; - 38 -> {39}; - 39 -> {41}; - 39 -> {40} [style=dotted]; - 40 -> {41} [style=dotted]; + 39 -> {40}; + 40 -> {41}; + 41 -> {43}; + 41 -> {42} [style=dotted]; + 42 -> {43} [style=dotted]; subgraph cluster_17 { color=red - 42 [label="Enter function " style="filled" fillcolor=red]; - 43 [label="Exit function " style="filled" fillcolor=red]; - } - - 42 -> {43}; - - subgraph cluster_18 { - color=red - 44 [label="Enter function getter" style="filled" fillcolor=red]; - 45 [label="Const: Null(null)"]; - 46 [label="Jump: ^ Null(null)"]; - 47 [label="Stub" style="filled" fillcolor=gray]; - 48 [label="Exit function getter" style="filled" fillcolor=red]; + 44 [label="Enter function " style="filled" fillcolor=red]; + 45 [label="Delegated constructor call: super()"]; + 46 [label="Exit function " style="filled" fillcolor=red]; } 44 -> {45}; 45 -> {46}; - 46 -> {48}; - 46 -> {47} [style=dotted]; - 47 -> {48} [style=dotted]; + + subgraph cluster_18 { + color=red + 47 [label="Enter function getter" style="filled" fillcolor=red]; + 48 [label="Const: Null(null)"]; + 49 [label="Jump: ^ Null(null)"]; + 50 [label="Stub" style="filled" fillcolor=gray]; + 51 [label="Exit function getter" style="filled" fillcolor=red]; + } + + 47 -> {48}; + 48 -> {49}; + 49 -> {51}; + 49 -> {50} [style=dotted]; + 50 -> {51} [style=dotted]; subgraph cluster_19 { color=red - 49 [label="Enter property" style="filled" fillcolor=red]; - 50 [label="Exit property" style="filled" fillcolor=red]; + 52 [label="Enter property" style="filled" fillcolor=red]; + 53 [label="Exit property" style="filled" fillcolor=red]; } - 49 -> {50}; + 52 -> {53}; subgraph cluster_20 { color=red - 51 [label="Enter function fdata" style="filled" fillcolor=red]; - 52 [label="Const: Null(null)"]; - 53 [label="Jump: ^fdata Null(null)"]; - 54 [label="Stub" style="filled" fillcolor=gray]; - 55 [label="Exit function fdata" style="filled" fillcolor=red]; + 54 [label="Enter function fdata" style="filled" fillcolor=red]; + 55 [label="Const: Null(null)"]; + 56 [label="Jump: ^fdata Null(null)"]; + 57 [label="Stub" style="filled" fillcolor=gray]; + 58 [label="Exit function fdata" style="filled" fillcolor=red]; } - 51 -> {52}; - 52 -> {53}; - 53 -> {55}; - 53 -> {54} [style=dotted]; - 54 -> {55} [style=dotted]; + 54 -> {55}; + 55 -> {56}; + 56 -> {58}; + 56 -> {57} [style=dotted]; + 57 -> {58} [style=dotted]; subgraph cluster_21 { color=red - 56 [label="Enter function test_1" style="filled" fillcolor=red]; + 59 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_22 { color=blue - 57 [label="Enter when"]; + 60 [label="Enter when"]; subgraph cluster_23 { color=blue - 58 [label="Enter when branch condition "]; - 59 [label="Access variable R|/x|"]; - 60 [label="Const: Null(null)"]; - 61 [label="Operator !="]; - 62 [label="Exit when branch condition"]; + 61 [label="Enter when branch condition "]; + 62 [label="Access variable R|/x|"]; + 63 [label="Const: Null(null)"]; + 64 [label="Operator !="]; + 65 [label="Exit when branch condition"]; } subgraph cluster_24 { color=blue - 63 [label="Enter when branch condition else"]; - 64 [label="Exit when branch condition"]; + 66 [label="Enter when branch condition else"]; + 67 [label="Exit when branch condition"]; } - 65 [label="Enter when branch result"]; + 68 [label="Enter when branch result"]; subgraph cluster_25 { color=blue - 66 [label="Enter block"]; - 67 [label="Access variable R|/x|"]; - 68 [label="Function call: R|/x|.#()"]; - 69 [label="Exit block"]; + 69 [label="Enter block"]; + 70 [label="Access variable R|/x|"]; + 71 [label="Function call: R|/x|.#()"]; + 72 [label="Exit block"]; } - 70 [label="Exit when branch result"]; - 71 [label="Enter when branch result"]; + 73 [label="Exit when branch result"]; + 74 [label="Enter when branch result"]; subgraph cluster_26 { color=blue - 72 [label="Enter block"]; - 73 [label="Access variable R|/x|"]; - 74 [label="Function call: R|/x|.R|/A.foo|()"]; - 75 [label="Exit block"]; + 75 [label="Enter block"]; + 76 [label="Access variable R|/x|"]; + 77 [label="Function call: R|/x|.R|/A.foo|()"]; + 78 [label="Exit block"]; } - 76 [label="Exit when branch result"]; - 77 [label="Exit when"]; + 79 [label="Exit when branch result"]; + 80 [label="Exit when"]; } - 78 [label="Access variable R|/x|"]; - 79 [label="Function call: R|/x|.#()"]; - 80 [label="Exit function test_1" style="filled" fillcolor=red]; + 81 [label="Access variable R|/x|"]; + 82 [label="Function call: R|/x|.#()"]; + 83 [label="Exit function test_1" style="filled" fillcolor=red]; } - 56 -> {57}; - 57 -> {58}; - 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; - 62 -> {71 63}; + 62 -> {63}; 63 -> {64}; 64 -> {65}; - 65 -> {66}; + 65 -> {74 66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {77}; + 70 -> {71}; 71 -> {72}; 72 -> {73}; - 73 -> {74}; + 73 -> {80}; 74 -> {75}; 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; + 80 -> {81}; + 81 -> {82}; + 82 -> {83}; subgraph cluster_27 { color=red - 81 [label="Enter function test_2" style="filled" fillcolor=red]; + 84 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_28 { color=blue - 82 [label="Enter when"]; + 85 [label="Enter when"]; subgraph cluster_29 { color=blue - 83 [label="Enter when branch condition "]; - 84 [label="Access variable R|/x|"]; - 85 [label="Const: Null(null)"]; - 86 [label="Operator =="]; - 87 [label="Exit when branch condition"]; + 86 [label="Enter when branch condition "]; + 87 [label="Access variable R|/x|"]; + 88 [label="Const: Null(null)"]; + 89 [label="Operator =="]; + 90 [label="Exit when branch condition"]; } subgraph cluster_30 { color=blue - 88 [label="Enter when branch condition else"]; - 89 [label="Exit when branch condition"]; + 91 [label="Enter when branch condition else"]; + 92 [label="Exit when branch condition"]; } - 90 [label="Enter when branch result"]; + 93 [label="Enter when branch result"]; subgraph cluster_31 { color=blue - 91 [label="Enter block"]; - 92 [label="Access variable R|/x|"]; - 93 [label="Function call: R|/x|.R|/A.foo|()"]; - 94 [label="Exit block"]; + 94 [label="Enter block"]; + 95 [label="Access variable R|/x|"]; + 96 [label="Function call: R|/x|.R|/A.foo|()"]; + 97 [label="Exit block"]; } - 95 [label="Exit when branch result"]; - 96 [label="Enter when branch result"]; + 98 [label="Exit when branch result"]; + 99 [label="Enter when branch result"]; subgraph cluster_32 { color=blue - 97 [label="Enter block"]; - 98 [label="Access variable R|/x|"]; - 99 [label="Function call: R|/x|.#()"]; - 100 [label="Exit block"]; + 100 [label="Enter block"]; + 101 [label="Access variable R|/x|"]; + 102 [label="Function call: R|/x|.#()"]; + 103 [label="Exit block"]; } - 101 [label="Exit when branch result"]; - 102 [label="Exit when"]; + 104 [label="Exit when branch result"]; + 105 [label="Exit when"]; } - 103 [label="Access variable R|/x|"]; - 104 [label="Function call: R|/x|.#()"]; - 105 [label="Exit function test_2" style="filled" fillcolor=red]; + 106 [label="Access variable R|/x|"]; + 107 [label="Function call: R|/x|.#()"]; + 108 [label="Exit function test_2" style="filled" fillcolor=red]; } - 81 -> {82}; - 82 -> {83}; - 83 -> {84}; 84 -> {85}; 85 -> {86}; 86 -> {87}; - 87 -> {96 88}; + 87 -> {88}; 88 -> {89}; 89 -> {90}; - 90 -> {91}; + 90 -> {99 91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; 94 -> {95}; - 95 -> {102}; + 95 -> {96}; 96 -> {97}; 97 -> {98}; - 98 -> {99}; + 98 -> {105}; 99 -> {100}; 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; 104 -> {105}; + 105 -> {106}; + 106 -> {107}; + 107 -> {108}; subgraph cluster_33 { color=red - 106 [label="Enter function test_3" style="filled" fillcolor=red]; + 109 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_34 { color=blue - 107 [label="Enter when"]; - 108 [label="Access variable R|/x|"]; - 109 [label="Variable declaration: lval : R|A?|"]; + 110 [label="Enter when"]; + 111 [label="Access variable R|/x|"]; + 112 [label="Variable declaration: lval : R|A?|"]; subgraph cluster_35 { color=blue - 110 [label="Enter when branch condition "]; - 111 [label="Const: Null(null)"]; - 112 [label="Operator =="]; - 113 [label="Exit when branch condition"]; + 113 [label="Enter when branch condition "]; + 114 [label="Const: Null(null)"]; + 115 [label="Operator =="]; + 116 [label="Exit when branch condition"]; } subgraph cluster_36 { color=blue - 114 [label="Enter when branch condition else"]; - 115 [label="Exit when branch condition"]; + 117 [label="Enter when branch condition else"]; + 118 [label="Exit when branch condition"]; } - 116 [label="Enter when branch result"]; + 119 [label="Enter when branch result"]; subgraph cluster_37 { color=blue - 117 [label="Enter block"]; - 118 [label="Access variable R|/|"]; - 119 [label="Exit block"]; + 120 [label="Enter block"]; + 121 [label="Access variable R|/|"]; + 122 [label="Exit block"]; } - 120 [label="Exit when branch result"]; - 121 [label="Enter when branch result"]; + 123 [label="Exit when branch result"]; + 124 [label="Enter when branch result"]; subgraph cluster_38 { color=blue - 122 [label="Enter block"]; - 123 [label="Jump: ^test_3 Unit"]; - 124 [label="Stub" style="filled" fillcolor=gray]; - 125 [label="Exit block" style="filled" fillcolor=gray]; + 125 [label="Enter block"]; + 126 [label="Jump: ^test_3 Unit"]; + 127 [label="Stub" style="filled" fillcolor=gray]; + 128 [label="Exit block" style="filled" fillcolor=gray]; } - 126 [label="Exit when branch result" style="filled" fillcolor=gray]; - 127 [label="Exit when"]; + 129 [label="Exit when branch result" style="filled" fillcolor=gray]; + 130 [label="Exit when"]; } - 128 [label="Access variable R|/x|"]; - 129 [label="Function call: R|/x|.R|/A.foo|()"]; - 130 [label="Exit function test_3" style="filled" fillcolor=red]; + 131 [label="Access variable R|/x|"]; + 132 [label="Function call: R|/x|.R|/A.foo|()"]; + 133 [label="Exit function test_3" style="filled" fillcolor=red]; } - 106 -> {107}; - 107 -> {108}; - 108 -> {109}; 109 -> {110}; 110 -> {111}; 111 -> {112}; 112 -> {113}; - 113 -> {121 114}; + 113 -> {114}; 114 -> {115}; 115 -> {116}; - 116 -> {117}; + 116 -> {124 117}; 117 -> {118}; 118 -> {119}; 119 -> {120}; - 120 -> {127}; + 120 -> {121}; 121 -> {122}; 122 -> {123}; 123 -> {130}; - 123 -> {124} [style=dotted]; - 124 -> {125} [style=dotted]; - 125 -> {126} [style=dotted]; + 124 -> {125}; + 125 -> {126}; + 126 -> {133}; 126 -> {127} [style=dotted]; - 127 -> {128}; - 128 -> {129}; - 129 -> {130}; + 127 -> {128} [style=dotted]; + 128 -> {129} [style=dotted]; + 129 -> {130} [style=dotted]; + 130 -> {131}; + 131 -> {132}; + 132 -> {133}; subgraph cluster_39 { color=red - 131 [label="Enter function test_4" style="filled" fillcolor=red]; + 134 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_40 { color=blue - 132 [label="Enter when"]; + 135 [label="Enter when"]; subgraph cluster_41 { color=blue - 133 [label="Enter when branch condition "]; - 134 [label="Access variable R|/x|"]; - 135 [label="Enter safe call"]; - 136 [label="Function call: R|/x|?.R|/A.getA|()"]; - 137 [label="Exit safe call"]; - 138 [label="Const: Null(null)"]; - 139 [label="Operator =="]; - 140 [label="Exit when branch condition"]; + 136 [label="Enter when branch condition "]; + 137 [label="Access variable R|/x|"]; + 138 [label="Enter safe call"]; + 139 [label="Function call: R|/x|?.R|/A.getA|()"]; + 140 [label="Exit safe call"]; + 141 [label="Const: Null(null)"]; + 142 [label="Operator =="]; + 143 [label="Exit when branch condition"]; } - 141 [label="Synthetic else branch"]; - 142 [label="Enter when branch result"]; + 144 [label="Synthetic else branch"]; + 145 [label="Enter when branch result"]; subgraph cluster_42 { color=blue - 143 [label="Enter block"]; - 144 [label="Jump: ^test_4 Unit"]; - 145 [label="Stub" style="filled" fillcolor=gray]; - 146 [label="Exit block" style="filled" fillcolor=gray]; + 146 [label="Enter block"]; + 147 [label="Jump: ^test_4 Unit"]; + 148 [label="Stub" style="filled" fillcolor=gray]; + 149 [label="Exit block" style="filled" fillcolor=gray]; } - 147 [label="Exit when branch result" style="filled" fillcolor=gray]; - 148 [label="Exit when"]; + 150 [label="Exit when branch result" style="filled" fillcolor=gray]; + 151 [label="Exit when"]; } - 149 [label="Access variable R|/x|"]; - 150 [label="Function call: R|/x|.R|/A.foo|()"]; - 151 [label="Exit function test_4" style="filled" fillcolor=red]; + 152 [label="Access variable R|/x|"]; + 153 [label="Function call: R|/x|.R|/A.foo|()"]; + 154 [label="Exit function test_4" style="filled" fillcolor=red]; } - 131 -> {132}; - 132 -> {133}; - 133 -> {134}; - 134 -> {135 137}; + 134 -> {135}; 135 -> {136}; 136 -> {137}; - 137 -> {138}; + 137 -> {138 140}; 138 -> {139}; 139 -> {140}; - 140 -> {142 141}; - 141 -> {148}; + 140 -> {141}; + 141 -> {142}; 142 -> {143}; - 143 -> {144}; + 143 -> {145 144}; 144 -> {151}; - 144 -> {145} [style=dotted]; - 145 -> {146} [style=dotted]; - 146 -> {147} [style=dotted]; + 145 -> {146}; + 146 -> {147}; + 147 -> {154}; 147 -> {148} [style=dotted]; - 148 -> {149}; - 149 -> {150}; - 150 -> {151}; + 148 -> {149} [style=dotted]; + 149 -> {150} [style=dotted]; + 150 -> {151} [style=dotted]; + 151 -> {152}; + 152 -> {153}; + 153 -> {154}; subgraph cluster_43 { color=red - 152 [label="Enter function test_5" style="filled" fillcolor=red]; + 155 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_44 { color=blue - 153 [label="Enter when"]; + 156 [label="Enter when"]; subgraph cluster_45 { color=blue - 154 [label="Enter when branch condition "]; - 155 [label="Access variable R|/q|"]; - 156 [label="Enter safe call"]; - 157 [label="Access variable R|/Q.data|"]; - 158 [label="Exit safe call"]; + 157 [label="Enter when branch condition "]; + 158 [label="Access variable R|/q|"]; 159 [label="Enter safe call"]; - 160 [label="Access variable R|/MyData.s|"]; + 160 [label="Access variable R|/Q.data|"]; 161 [label="Exit safe call"]; 162 [label="Enter safe call"]; - 163 [label="Function call: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 163 [label="Access variable R|/MyData.s|"]; 164 [label="Exit safe call"]; - 165 [label="Const: Null(null)"]; - 166 [label="Operator !="]; - 167 [label="Exit when branch condition"]; + 165 [label="Enter safe call"]; + 166 [label="Function call: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 167 [label="Exit safe call"]; + 168 [label="Const: Null(null)"]; + 169 [label="Operator !="]; + 170 [label="Exit when branch condition"]; } - 168 [label="Synthetic else branch"]; - 169 [label="Enter when branch result"]; + 171 [label="Synthetic else branch"]; + 172 [label="Enter when branch result"]; subgraph cluster_46 { color=blue - 170 [label="Enter block"]; - 171 [label="Access variable R|/q|"]; - 172 [label="Access variable R|/Q.data|"]; - 173 [label="Access variable R|/q|"]; - 174 [label="Access variable R|/Q.data|"]; - 175 [label="Access variable #"]; + 173 [label="Enter block"]; + 174 [label="Access variable R|/q|"]; + 175 [label="Access variable R|/Q.data|"]; 176 [label="Access variable R|/q|"]; 177 [label="Access variable R|/Q.data|"]; 178 [label="Access variable #"]; - 179 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; - 180 [label="Exit block"]; + 179 [label="Access variable R|/q|"]; + 180 [label="Access variable R|/Q.data|"]; + 181 [label="Access variable #"]; + 182 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; + 183 [label="Exit block"]; } - 181 [label="Exit when branch result"]; - 182 [label="Exit when"]; + 184 [label="Exit when branch result"]; + 185 [label="Exit when"]; } - 183 [label="Exit function test_5" style="filled" fillcolor=red]; + 186 [label="Exit function test_5" style="filled" fillcolor=red]; } - 152 -> {153}; - 153 -> {154}; - 154 -> {155}; - 155 -> {156 158}; + 155 -> {156}; 156 -> {157}; 157 -> {158}; 158 -> {159 161}; @@ -524,14 +527,14 @@ digraph nullability_kt { 161 -> {162 164}; 162 -> {163}; 163 -> {164}; - 164 -> {165}; + 164 -> {165 167}; 165 -> {166}; 166 -> {167}; - 167 -> {169 168}; - 168 -> {182}; + 167 -> {168}; + 168 -> {169}; 169 -> {170}; - 170 -> {171}; - 171 -> {172}; + 170 -> {172 171}; + 171 -> {185}; 172 -> {173}; 173 -> {174}; 174 -> {175}; @@ -543,70 +546,70 @@ digraph nullability_kt { 180 -> {181}; 181 -> {182}; 182 -> {183}; + 183 -> {184}; + 184 -> {185}; + 185 -> {186}; subgraph cluster_47 { color=red - 184 [label="Enter function test_6" style="filled" fillcolor=red]; + 187 [label="Enter function test_6" style="filled" fillcolor=red]; subgraph cluster_48 { color=blue - 185 [label="Enter when"]; - 186 [label="Access variable R|/q|"]; - 187 [label="Enter safe call"]; - 188 [label="Access variable R|/Q.data|"]; - 189 [label="Exit safe call"]; + 188 [label="Enter when"]; + 189 [label="Access variable R|/q|"]; 190 [label="Enter safe call"]; - 191 [label="Access variable R|/MyData.s|"]; + 191 [label="Access variable R|/Q.data|"]; 192 [label="Exit safe call"]; 193 [label="Enter safe call"]; - 194 [label="Function call: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 194 [label="Access variable R|/MyData.s|"]; 195 [label="Exit safe call"]; - 196 [label="Variable declaration: lval : R|kotlin/Int?|"]; + 196 [label="Enter safe call"]; + 197 [label="Function call: R|/q|?.R|/Q.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 198 [label="Exit safe call"]; + 199 [label="Variable declaration: lval : R|kotlin/Int?|"]; subgraph cluster_49 { color=blue - 197 [label="Enter when branch condition "]; - 198 [label="Const: Null(null)"]; - 199 [label="Operator =="]; - 200 [label="Exit when branch condition"]; + 200 [label="Enter when branch condition "]; + 201 [label="Const: Null(null)"]; + 202 [label="Operator =="]; + 203 [label="Exit when branch condition"]; } subgraph cluster_50 { color=blue - 201 [label="Enter when branch condition else"]; - 202 [label="Exit when branch condition"]; + 204 [label="Enter when branch condition else"]; + 205 [label="Exit when branch condition"]; } - 203 [label="Enter when branch result"]; + 206 [label="Enter when branch result"]; subgraph cluster_51 { color=blue - 204 [label="Enter block"]; - 205 [label="Access variable R|/|"]; - 206 [label="Exit block"]; + 207 [label="Enter block"]; + 208 [label="Access variable R|/|"]; + 209 [label="Exit block"]; } - 207 [label="Exit when branch result"]; - 208 [label="Enter when branch result"]; + 210 [label="Exit when branch result"]; + 211 [label="Enter when branch result"]; subgraph cluster_52 { color=blue - 209 [label="Enter block"]; - 210 [label="Jump: ^test_6 Unit"]; - 211 [label="Stub" style="filled" fillcolor=gray]; - 212 [label="Exit block" style="filled" fillcolor=gray]; + 212 [label="Enter block"]; + 213 [label="Jump: ^test_6 Unit"]; + 214 [label="Stub" style="filled" fillcolor=gray]; + 215 [label="Exit block" style="filled" fillcolor=gray]; } - 213 [label="Exit when branch result" style="filled" fillcolor=gray]; - 214 [label="Exit when"]; + 216 [label="Exit when branch result" style="filled" fillcolor=gray]; + 217 [label="Exit when"]; } - 215 [label="Access variable R|/q|"]; - 216 [label="Access variable R|/Q.data|"]; - 217 [label="Access variable R|/q|"]; - 218 [label="Access variable R|/Q.data|"]; - 219 [label="Access variable #"]; + 218 [label="Access variable R|/q|"]; + 219 [label="Access variable R|/Q.data|"]; 220 [label="Access variable R|/q|"]; 221 [label="Access variable R|/Q.data|"]; 222 [label="Access variable #"]; - 223 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; - 224 [label="Exit function test_6" style="filled" fillcolor=red]; + 223 [label="Access variable R|/q|"]; + 224 [label="Access variable R|/Q.data|"]; + 225 [label="Access variable #"]; + 226 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; + 227 [label="Exit function test_6" style="filled" fillcolor=red]; } - 184 -> {185}; - 185 -> {186}; - 186 -> {187 189}; 187 -> {188}; 188 -> {189}; 189 -> {190 192}; @@ -615,29 +618,29 @@ digraph nullability_kt { 192 -> {193 195}; 193 -> {194}; 194 -> {195}; - 195 -> {196}; + 195 -> {196 198}; 196 -> {197}; 197 -> {198}; 198 -> {199}; 199 -> {200}; - 200 -> {208 201}; + 200 -> {201}; 201 -> {202}; 202 -> {203}; - 203 -> {204}; + 203 -> {211 204}; 204 -> {205}; 205 -> {206}; 206 -> {207}; - 207 -> {214}; + 207 -> {208}; 208 -> {209}; 209 -> {210}; - 210 -> {224}; - 210 -> {211} [style=dotted]; - 211 -> {212} [style=dotted]; - 212 -> {213} [style=dotted]; + 210 -> {217}; + 211 -> {212}; + 212 -> {213}; + 213 -> {227}; 213 -> {214} [style=dotted]; - 214 -> {215}; - 215 -> {216}; - 216 -> {217}; + 214 -> {215} [style=dotted]; + 215 -> {216} [style=dotted]; + 216 -> {217} [style=dotted]; 217 -> {218}; 218 -> {219}; 219 -> {220}; @@ -645,56 +648,56 @@ digraph nullability_kt { 221 -> {222}; 222 -> {223}; 223 -> {224}; + 224 -> {225}; + 225 -> {226}; + 226 -> {227}; subgraph cluster_53 { color=red - 225 [label="Enter function test_7" style="filled" fillcolor=red]; + 228 [label="Enter function test_7" style="filled" fillcolor=red]; subgraph cluster_54 { color=blue - 226 [label="Enter when"]; + 229 [label="Enter when"]; subgraph cluster_55 { color=blue - 227 [label="Enter when branch condition "]; - 228 [label="Access variable R|/q|"]; - 229 [label="Enter safe call"]; - 230 [label="Function call: R|/q|?.R|/Q.fdata|()"]; - 231 [label="Exit safe call"]; + 230 [label="Enter when branch condition "]; + 231 [label="Access variable R|/q|"]; 232 [label="Enter safe call"]; - 233 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()"]; + 233 [label="Function call: R|/q|?.R|/Q.fdata|()"]; 234 [label="Exit safe call"]; 235 [label="Enter safe call"]; - 236 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()?.R|kotlin/Int.inc|()"]; + 236 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()"]; 237 [label="Exit safe call"]; - 238 [label="Const: Null(null)"]; - 239 [label="Operator !="]; - 240 [label="Exit when branch condition"]; + 238 [label="Enter safe call"]; + 239 [label="Function call: R|/q|?.R|/Q.fdata|()?.R|/MyData.fs|()?.R|kotlin/Int.inc|()"]; + 240 [label="Exit safe call"]; + 241 [label="Const: Null(null)"]; + 242 [label="Operator !="]; + 243 [label="Exit when branch condition"]; } - 241 [label="Synthetic else branch"]; - 242 [label="Enter when branch result"]; + 244 [label="Synthetic else branch"]; + 245 [label="Enter when branch result"]; subgraph cluster_56 { color=blue - 243 [label="Enter block"]; - 244 [label="Access variable R|/q|"]; - 245 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 246 [label="Access variable R|/q|"]; - 247 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 248 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; + 246 [label="Enter block"]; + 247 [label="Access variable R|/q|"]; + 248 [label="Function call: R|/q|.R|/Q.fdata|()"]; 249 [label="Access variable R|/q|"]; 250 [label="Function call: R|/q|.R|/Q.fdata|()"]; 251 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; - 252 [label="Function call: R|/q|.R|/Q.fdata|().#().#()"]; - 253 [label="Exit block"]; + 252 [label="Access variable R|/q|"]; + 253 [label="Function call: R|/q|.R|/Q.fdata|()"]; + 254 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; + 255 [label="Function call: R|/q|.R|/Q.fdata|().#().#()"]; + 256 [label="Exit block"]; } - 254 [label="Exit when branch result"]; - 255 [label="Exit when"]; + 257 [label="Exit when branch result"]; + 258 [label="Exit when"]; } - 256 [label="Exit function test_7" style="filled" fillcolor=red]; + 259 [label="Exit function test_7" style="filled" fillcolor=red]; } - 225 -> {226}; - 226 -> {227}; - 227 -> {228}; - 228 -> {229 231}; + 228 -> {229}; 229 -> {230}; 230 -> {231}; 231 -> {232 234}; @@ -703,14 +706,14 @@ digraph nullability_kt { 234 -> {235 237}; 235 -> {236}; 236 -> {237}; - 237 -> {238}; + 237 -> {238 240}; 238 -> {239}; 239 -> {240}; - 240 -> {242 241}; - 241 -> {255}; + 240 -> {241}; + 241 -> {242}; 242 -> {243}; - 243 -> {244}; - 244 -> {245}; + 243 -> {245 244}; + 244 -> {258}; 245 -> {246}; 246 -> {247}; 247 -> {248}; @@ -722,169 +725,169 @@ digraph nullability_kt { 253 -> {254}; 254 -> {255}; 255 -> {256}; + 256 -> {257}; + 257 -> {258}; + 258 -> {259}; subgraph cluster_57 { color=red - 257 [label="Enter function test_8" style="filled" fillcolor=red]; + 260 [label="Enter function test_8" style="filled" fillcolor=red]; subgraph cluster_58 { color=blue - 258 [label="Enter when"]; + 261 [label="Enter when"]; subgraph cluster_59 { color=blue - 259 [label="Enter when branch condition "]; - 260 [label="Access variable R|/b|"]; - 261 [label="Const: Boolean(true)"]; - 262 [label="Operator =="]; - 263 [label="Exit when branch condition"]; + 262 [label="Enter when branch condition "]; + 263 [label="Access variable R|/b|"]; + 264 [label="Const: Boolean(true)"]; + 265 [label="Operator =="]; + 266 [label="Exit when branch condition"]; } - 264 [label="Synthetic else branch"]; - 265 [label="Enter when branch result"]; + 267 [label="Synthetic else branch"]; + 268 [label="Enter when branch result"]; subgraph cluster_60 { color=blue - 266 [label="Enter block"]; - 267 [label="Access variable R|/b|"]; - 268 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 269 [label="Exit block"]; + 269 [label="Enter block"]; + 270 [label="Access variable R|/b|"]; + 271 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 272 [label="Exit block"]; } - 270 [label="Exit when branch result"]; - 271 [label="Exit when"]; + 273 [label="Exit when branch result"]; + 274 [label="Exit when"]; } - 272 [label="Exit function test_8" style="filled" fillcolor=red]; + 275 [label="Exit function test_8" style="filled" fillcolor=red]; } - 257 -> {258}; - 258 -> {259}; - 259 -> {260}; 260 -> {261}; 261 -> {262}; 262 -> {263}; - 263 -> {265 264}; - 264 -> {271}; + 263 -> {264}; + 264 -> {265}; 265 -> {266}; - 266 -> {267}; - 267 -> {268}; + 266 -> {268 267}; + 267 -> {274}; 268 -> {269}; 269 -> {270}; 270 -> {271}; 271 -> {272}; + 272 -> {273}; + 273 -> {274}; + 274 -> {275}; subgraph cluster_61 { color=red - 273 [label="Enter function test_9" style="filled" fillcolor=red]; + 276 [label="Enter function test_9" style="filled" fillcolor=red]; subgraph cluster_62 { color=blue - 274 [label="Enter when"]; + 277 [label="Enter when"]; subgraph cluster_63 { color=blue - 275 [label="Enter when branch condition "]; - 276 [label="Access variable R|/a|"]; - 277 [label="Access variable R|/b|"]; - 278 [label="Operator =="]; - 279 [label="Exit when branch condition"]; + 278 [label="Enter when branch condition "]; + 279 [label="Access variable R|/a|"]; + 280 [label="Access variable R|/b|"]; + 281 [label="Operator =="]; + 282 [label="Exit when branch condition"]; } - 280 [label="Synthetic else branch"]; - 281 [label="Enter when branch result"]; + 283 [label="Synthetic else branch"]; + 284 [label="Enter when branch result"]; subgraph cluster_64 { color=blue - 282 [label="Enter block"]; - 283 [label="Access variable R|/b|"]; - 284 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 285 [label="Exit block"]; + 285 [label="Enter block"]; + 286 [label="Access variable R|/b|"]; + 287 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 288 [label="Exit block"]; } - 286 [label="Exit when branch result"]; - 287 [label="Exit when"]; + 289 [label="Exit when branch result"]; + 290 [label="Exit when"]; } - 288 [label="Access variable R|/b|"]; - 289 [label="Function call: R|/b|.#()"]; + 291 [label="Access variable R|/b|"]; + 292 [label="Function call: R|/b|.#()"]; subgraph cluster_65 { color=blue - 290 [label="Enter when"]; + 293 [label="Enter when"]; subgraph cluster_66 { color=blue - 291 [label="Enter when branch condition "]; - 292 [label="Access variable R|/a|"]; - 293 [label="Access variable R|/b|"]; - 294 [label="Operator ==="]; - 295 [label="Exit when branch condition"]; + 294 [label="Enter when branch condition "]; + 295 [label="Access variable R|/a|"]; + 296 [label="Access variable R|/b|"]; + 297 [label="Operator ==="]; + 298 [label="Exit when branch condition"]; } - 296 [label="Synthetic else branch"]; - 297 [label="Enter when branch result"]; + 299 [label="Synthetic else branch"]; + 300 [label="Enter when branch result"]; subgraph cluster_67 { color=blue - 298 [label="Enter block"]; - 299 [label="Access variable R|/b|"]; - 300 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 301 [label="Exit block"]; + 301 [label="Enter block"]; + 302 [label="Access variable R|/b|"]; + 303 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 304 [label="Exit block"]; } - 302 [label="Exit when branch result"]; - 303 [label="Exit when"]; + 305 [label="Exit when branch result"]; + 306 [label="Exit when"]; } - 304 [label="Access variable R|/b|"]; - 305 [label="Function call: R|/b|.#()"]; + 307 [label="Access variable R|/b|"]; + 308 [label="Function call: R|/b|.#()"]; subgraph cluster_68 { color=blue - 306 [label="Enter when"]; + 309 [label="Enter when"]; subgraph cluster_69 { color=blue - 307 [label="Enter when branch condition "]; - 308 [label="Access variable R|/b|"]; - 309 [label="Access variable R|/a|"]; - 310 [label="Operator =="]; - 311 [label="Exit when branch condition"]; + 310 [label="Enter when branch condition "]; + 311 [label="Access variable R|/b|"]; + 312 [label="Access variable R|/a|"]; + 313 [label="Operator =="]; + 314 [label="Exit when branch condition"]; } - 312 [label="Synthetic else branch"]; - 313 [label="Enter when branch result"]; + 315 [label="Synthetic else branch"]; + 316 [label="Enter when branch result"]; subgraph cluster_70 { color=blue - 314 [label="Enter block"]; - 315 [label="Access variable R|/b|"]; - 316 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 317 [label="Exit block"]; + 317 [label="Enter block"]; + 318 [label="Access variable R|/b|"]; + 319 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 320 [label="Exit block"]; } - 318 [label="Exit when branch result"]; - 319 [label="Exit when"]; + 321 [label="Exit when branch result"]; + 322 [label="Exit when"]; } - 320 [label="Access variable R|/b|"]; - 321 [label="Function call: R|/b|.#()"]; + 323 [label="Access variable R|/b|"]; + 324 [label="Function call: R|/b|.#()"]; subgraph cluster_71 { color=blue - 322 [label="Enter when"]; + 325 [label="Enter when"]; subgraph cluster_72 { color=blue - 323 [label="Enter when branch condition "]; - 324 [label="Access variable R|/b|"]; - 325 [label="Access variable R|/a|"]; - 326 [label="Operator ==="]; - 327 [label="Exit when branch condition"]; + 326 [label="Enter when branch condition "]; + 327 [label="Access variable R|/b|"]; + 328 [label="Access variable R|/a|"]; + 329 [label="Operator ==="]; + 330 [label="Exit when branch condition"]; } - 328 [label="Synthetic else branch"]; - 329 [label="Enter when branch result"]; + 331 [label="Synthetic else branch"]; + 332 [label="Enter when branch result"]; subgraph cluster_73 { color=blue - 330 [label="Enter block"]; - 331 [label="Access variable R|/b|"]; - 332 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 333 [label="Exit block"]; + 333 [label="Enter block"]; + 334 [label="Access variable R|/b|"]; + 335 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 336 [label="Exit block"]; } - 334 [label="Exit when branch result"]; - 335 [label="Exit when"]; + 337 [label="Exit when branch result"]; + 338 [label="Exit when"]; } - 336 [label="Access variable R|/b|"]; - 337 [label="Function call: R|/b|.#()"]; - 338 [label="Exit function test_9" style="filled" fillcolor=red]; + 339 [label="Access variable R|/b|"]; + 340 [label="Function call: R|/b|.#()"]; + 341 [label="Exit function test_9" style="filled" fillcolor=red]; } - 273 -> {274}; - 274 -> {275}; - 275 -> {276}; 276 -> {277}; 277 -> {278}; 278 -> {279}; - 279 -> {281 280}; - 280 -> {287}; + 279 -> {280}; + 280 -> {281}; 281 -> {282}; - 282 -> {283}; - 283 -> {284}; + 282 -> {284 283}; + 283 -> {290}; 284 -> {285}; 285 -> {286}; 286 -> {287}; @@ -896,11 +899,11 @@ digraph nullability_kt { 292 -> {293}; 293 -> {294}; 294 -> {295}; - 295 -> {297 296}; - 296 -> {303}; + 295 -> {296}; + 296 -> {297}; 297 -> {298}; - 298 -> {299}; - 299 -> {300}; + 298 -> {300 299}; + 299 -> {306}; 300 -> {301}; 301 -> {302}; 302 -> {303}; @@ -912,11 +915,11 @@ digraph nullability_kt { 308 -> {309}; 309 -> {310}; 310 -> {311}; - 311 -> {313 312}; - 312 -> {319}; + 311 -> {312}; + 312 -> {313}; 313 -> {314}; - 314 -> {315}; - 315 -> {316}; + 314 -> {316 315}; + 315 -> {322}; 316 -> {317}; 317 -> {318}; 318 -> {319}; @@ -928,135 +931,135 @@ digraph nullability_kt { 324 -> {325}; 325 -> {326}; 326 -> {327}; - 327 -> {329 328}; - 328 -> {335}; + 327 -> {328}; + 328 -> {329}; 329 -> {330}; - 330 -> {331}; - 331 -> {332}; + 330 -> {332 331}; + 331 -> {338}; 332 -> {333}; 333 -> {334}; 334 -> {335}; 335 -> {336}; 336 -> {337}; 337 -> {338}; + 338 -> {339}; + 339 -> {340}; + 340 -> {341}; subgraph cluster_74 { color=red - 339 [label="Enter function test_10" style="filled" fillcolor=red]; + 342 [label="Enter function test_10" style="filled" fillcolor=red]; subgraph cluster_75 { color=blue - 340 [label="Enter when"]; + 343 [label="Enter when"]; subgraph cluster_76 { color=blue - 341 [label="Enter when branch condition "]; - 342 [label="Access variable R|/a|"]; - 343 [label="Access variable R|/b|"]; - 344 [label="Operator =="]; - 345 [label="Exit when branch condition"]; + 344 [label="Enter when branch condition "]; + 345 [label="Access variable R|/a|"]; + 346 [label="Access variable R|/b|"]; + 347 [label="Operator =="]; + 348 [label="Exit when branch condition"]; } - 346 [label="Synthetic else branch"]; - 347 [label="Enter when branch result"]; + 349 [label="Synthetic else branch"]; + 350 [label="Enter when branch result"]; subgraph cluster_77 { color=blue - 348 [label="Enter block"]; - 349 [label="Access variable R|/b|"]; - 350 [label="Function call: R|/b|.#()"]; - 351 [label="Exit block"]; + 351 [label="Enter block"]; + 352 [label="Access variable R|/b|"]; + 353 [label="Function call: R|/b|.#()"]; + 354 [label="Exit block"]; } - 352 [label="Exit when branch result"]; - 353 [label="Exit when"]; + 355 [label="Exit when branch result"]; + 356 [label="Exit when"]; } - 354 [label="Access variable R|/b|"]; - 355 [label="Function call: R|/b|.#()"]; + 357 [label="Access variable R|/b|"]; + 358 [label="Function call: R|/b|.#()"]; subgraph cluster_78 { color=blue - 356 [label="Enter when"]; + 359 [label="Enter when"]; subgraph cluster_79 { color=blue - 357 [label="Enter when branch condition "]; - 358 [label="Access variable R|/a|"]; - 359 [label="Access variable R|/b|"]; - 360 [label="Operator ==="]; - 361 [label="Exit when branch condition"]; + 360 [label="Enter when branch condition "]; + 361 [label="Access variable R|/a|"]; + 362 [label="Access variable R|/b|"]; + 363 [label="Operator ==="]; + 364 [label="Exit when branch condition"]; } - 362 [label="Synthetic else branch"]; - 363 [label="Enter when branch result"]; + 365 [label="Synthetic else branch"]; + 366 [label="Enter when branch result"]; subgraph cluster_80 { color=blue - 364 [label="Enter block"]; - 365 [label="Access variable R|/b|"]; - 366 [label="Function call: R|/b|.#()"]; - 367 [label="Exit block"]; + 367 [label="Enter block"]; + 368 [label="Access variable R|/b|"]; + 369 [label="Function call: R|/b|.#()"]; + 370 [label="Exit block"]; } - 368 [label="Exit when branch result"]; - 369 [label="Exit when"]; + 371 [label="Exit when branch result"]; + 372 [label="Exit when"]; } - 370 [label="Access variable R|/b|"]; - 371 [label="Function call: R|/b|.#()"]; + 373 [label="Access variable R|/b|"]; + 374 [label="Function call: R|/b|.#()"]; subgraph cluster_81 { color=blue - 372 [label="Enter when"]; + 375 [label="Enter when"]; subgraph cluster_82 { color=blue - 373 [label="Enter when branch condition "]; - 374 [label="Access variable R|/b|"]; - 375 [label="Access variable R|/a|"]; - 376 [label="Operator =="]; - 377 [label="Exit when branch condition"]; + 376 [label="Enter when branch condition "]; + 377 [label="Access variable R|/b|"]; + 378 [label="Access variable R|/a|"]; + 379 [label="Operator =="]; + 380 [label="Exit when branch condition"]; } - 378 [label="Synthetic else branch"]; - 379 [label="Enter when branch result"]; + 381 [label="Synthetic else branch"]; + 382 [label="Enter when branch result"]; subgraph cluster_83 { color=blue - 380 [label="Enter block"]; - 381 [label="Access variable R|/b|"]; - 382 [label="Function call: R|/b|.#()"]; - 383 [label="Exit block"]; + 383 [label="Enter block"]; + 384 [label="Access variable R|/b|"]; + 385 [label="Function call: R|/b|.#()"]; + 386 [label="Exit block"]; } - 384 [label="Exit when branch result"]; - 385 [label="Exit when"]; + 387 [label="Exit when branch result"]; + 388 [label="Exit when"]; } - 386 [label="Access variable R|/b|"]; - 387 [label="Function call: R|/b|.#()"]; + 389 [label="Access variable R|/b|"]; + 390 [label="Function call: R|/b|.#()"]; subgraph cluster_84 { color=blue - 388 [label="Enter when"]; + 391 [label="Enter when"]; subgraph cluster_85 { color=blue - 389 [label="Enter when branch condition "]; - 390 [label="Access variable R|/b|"]; - 391 [label="Access variable R|/a|"]; - 392 [label="Operator ==="]; - 393 [label="Exit when branch condition"]; + 392 [label="Enter when branch condition "]; + 393 [label="Access variable R|/b|"]; + 394 [label="Access variable R|/a|"]; + 395 [label="Operator ==="]; + 396 [label="Exit when branch condition"]; } - 394 [label="Synthetic else branch"]; - 395 [label="Enter when branch result"]; + 397 [label="Synthetic else branch"]; + 398 [label="Enter when branch result"]; subgraph cluster_86 { color=blue - 396 [label="Enter block"]; - 397 [label="Access variable R|/b|"]; - 398 [label="Function call: R|/b|.#()"]; - 399 [label="Exit block"]; + 399 [label="Enter block"]; + 400 [label="Access variable R|/b|"]; + 401 [label="Function call: R|/b|.#()"]; + 402 [label="Exit block"]; } - 400 [label="Exit when branch result"]; - 401 [label="Exit when"]; + 403 [label="Exit when branch result"]; + 404 [label="Exit when"]; } - 402 [label="Access variable R|/b|"]; - 403 [label="Function call: R|/b|.#()"]; - 404 [label="Exit function test_10" style="filled" fillcolor=red]; + 405 [label="Access variable R|/b|"]; + 406 [label="Function call: R|/b|.#()"]; + 407 [label="Exit function test_10" style="filled" fillcolor=red]; } - 339 -> {340}; - 340 -> {341}; - 341 -> {342}; 342 -> {343}; 343 -> {344}; 344 -> {345}; - 345 -> {347 346}; - 346 -> {353}; + 345 -> {346}; + 346 -> {347}; 347 -> {348}; - 348 -> {349}; - 349 -> {350}; + 348 -> {350 349}; + 349 -> {356}; 350 -> {351}; 351 -> {352}; 352 -> {353}; @@ -1068,11 +1071,11 @@ digraph nullability_kt { 358 -> {359}; 359 -> {360}; 360 -> {361}; - 361 -> {363 362}; - 362 -> {369}; + 361 -> {362}; + 362 -> {363}; 363 -> {364}; - 364 -> {365}; - 365 -> {366}; + 364 -> {366 365}; + 365 -> {372}; 366 -> {367}; 367 -> {368}; 368 -> {369}; @@ -1084,11 +1087,11 @@ digraph nullability_kt { 374 -> {375}; 375 -> {376}; 376 -> {377}; - 377 -> {379 378}; - 378 -> {385}; + 377 -> {378}; + 378 -> {379}; 379 -> {380}; - 380 -> {381}; - 381 -> {382}; + 380 -> {382 381}; + 381 -> {388}; 382 -> {383}; 383 -> {384}; 384 -> {385}; @@ -1100,105 +1103,105 @@ digraph nullability_kt { 390 -> {391}; 391 -> {392}; 392 -> {393}; - 393 -> {395 394}; - 394 -> {401}; + 393 -> {394}; + 394 -> {395}; 395 -> {396}; - 396 -> {397}; - 397 -> {398}; + 396 -> {398 397}; + 397 -> {404}; 398 -> {399}; 399 -> {400}; 400 -> {401}; 401 -> {402}; 402 -> {403}; 403 -> {404}; + 404 -> {405}; + 405 -> {406}; + 406 -> {407}; subgraph cluster_87 { color=red - 405 [label="Enter function test_11" style="filled" fillcolor=red]; + 408 [label="Enter function test_11" style="filled" fillcolor=red]; subgraph cluster_88 { color=blue - 406 [label="Enter when"]; + 409 [label="Enter when"]; subgraph cluster_89 { color=blue - 407 [label="Enter when branch condition "]; - 408 [label="Access variable R|/q|"]; - 409 [label="Enter safe call"]; - 410 [label="Access variable R|/QImpl.data|"]; - 411 [label="Exit safe call"]; + 410 [label="Enter when branch condition "]; + 411 [label="Access variable R|/q|"]; 412 [label="Enter safe call"]; - 413 [label="Access variable R|/MyData.s|"]; + 413 [label="Access variable R|/QImpl.data|"]; 414 [label="Exit safe call"]; 415 [label="Enter safe call"]; - 416 [label="Function call: R|/q|?.R|/QImpl.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 416 [label="Access variable R|/MyData.s|"]; 417 [label="Exit safe call"]; - 418 [label="Const: Null(null)"]; - 419 [label="Operator !="]; - 420 [label="Exit when branch condition"]; + 418 [label="Enter safe call"]; + 419 [label="Function call: R|/q|?.R|/QImpl.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 420 [label="Exit safe call"]; + 421 [label="Const: Null(null)"]; + 422 [label="Operator !="]; + 423 [label="Exit when branch condition"]; } - 421 [label="Synthetic else branch"]; - 422 [label="Enter when branch result"]; + 424 [label="Synthetic else branch"]; + 425 [label="Enter when branch result"]; subgraph cluster_90 { color=blue - 423 [label="Enter block"]; - 424 [label="Access variable R|/q|"]; - 425 [label="Access variable R|/QImpl.data|"]; - 426 [label="Access variable R|/q|"]; - 427 [label="Access variable R|/QImpl.data|"]; - 428 [label="Access variable R|/MyData.s|"]; + 426 [label="Enter block"]; + 427 [label="Access variable R|/q|"]; + 428 [label="Access variable R|/QImpl.data|"]; 429 [label="Access variable R|/q|"]; 430 [label="Access variable R|/QImpl.data|"]; 431 [label="Access variable R|/MyData.s|"]; - 432 [label="Function call: R|/q|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; - 433 [label="Access variable R|/q2|"]; - 434 [label="Access variable R|/QImpl.data|"]; - 435 [label="Access variable R|/q2|"]; - 436 [label="Access variable R|/QImpl.data|"]; - 437 [label="Access variable #"]; + 432 [label="Access variable R|/q|"]; + 433 [label="Access variable R|/QImpl.data|"]; + 434 [label="Access variable R|/MyData.s|"]; + 435 [label="Function call: R|/q|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; + 436 [label="Access variable R|/q2|"]; + 437 [label="Access variable R|/QImpl.data|"]; 438 [label="Access variable R|/q2|"]; 439 [label="Access variable R|/QImpl.data|"]; 440 [label="Access variable #"]; - 441 [label="Function call: R|/q2|.R|/QImpl.data|.#.#()"]; + 441 [label="Access variable R|/q2|"]; + 442 [label="Access variable R|/QImpl.data|"]; + 443 [label="Access variable #"]; + 444 [label="Function call: R|/q2|.R|/QImpl.data|.#.#()"]; subgraph cluster_91 { color=blue - 442 [label="Enter when"]; + 445 [label="Enter when"]; subgraph cluster_92 { color=blue - 443 [label="Enter when branch condition "]; - 444 [label="Access variable R|/q2|"]; - 445 [label="Access variable R|/QImpl.data|"]; - 446 [label="Const: Null(null)"]; - 447 [label="Operator !="]; - 448 [label="Exit when branch condition"]; + 446 [label="Enter when branch condition "]; + 447 [label="Access variable R|/q2|"]; + 448 [label="Access variable R|/QImpl.data|"]; + 449 [label="Const: Null(null)"]; + 450 [label="Operator !="]; + 451 [label="Exit when branch condition"]; } - 449 [label="Synthetic else branch"]; - 450 [label="Enter when branch result"]; + 452 [label="Synthetic else branch"]; + 453 [label="Enter when branch result"]; subgraph cluster_93 { color=blue - 451 [label="Enter block"]; - 452 [label="Access variable R|/q2|"]; - 453 [label="Access variable R|/QImpl.data|"]; - 454 [label="Access variable R|/MyData.s|"]; + 454 [label="Enter block"]; 455 [label="Access variable R|/q2|"]; 456 [label="Access variable R|/QImpl.data|"]; 457 [label="Access variable R|/MyData.s|"]; - 458 [label="Function call: R|/q2|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; - 459 [label="Exit block"]; + 458 [label="Access variable R|/q2|"]; + 459 [label="Access variable R|/QImpl.data|"]; + 460 [label="Access variable R|/MyData.s|"]; + 461 [label="Function call: R|/q2|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; + 462 [label="Exit block"]; } - 460 [label="Exit when branch result"]; - 461 [label="Exit when"]; + 463 [label="Exit when branch result"]; + 464 [label="Exit when"]; } - 462 [label="Exit block"]; + 465 [label="Exit block"]; } - 463 [label="Exit when branch result"]; - 464 [label="Exit when"]; + 466 [label="Exit when branch result"]; + 467 [label="Exit when"]; } - 465 [label="Exit function test_11" style="filled" fillcolor=red]; + 468 [label="Exit function test_11" style="filled" fillcolor=red]; } - 405 -> {406}; - 406 -> {407}; - 407 -> {408}; - 408 -> {409 411}; + 408 -> {409}; 409 -> {410}; 410 -> {411}; 411 -> {412 414}; @@ -1207,14 +1210,14 @@ digraph nullability_kt { 414 -> {415 417}; 415 -> {416}; 416 -> {417}; - 417 -> {418}; + 417 -> {418 420}; 418 -> {419}; 419 -> {420}; - 420 -> {422 421}; - 421 -> {464}; + 420 -> {421}; + 421 -> {422}; 422 -> {423}; - 423 -> {424}; - 424 -> {425}; + 423 -> {425 424}; + 424 -> {467}; 425 -> {426}; 426 -> {427}; 427 -> {428}; @@ -1238,11 +1241,11 @@ digraph nullability_kt { 445 -> {446}; 446 -> {447}; 447 -> {448}; - 448 -> {450 449}; - 449 -> {461}; + 448 -> {449}; + 449 -> {450}; 450 -> {451}; - 451 -> {452}; - 452 -> {453}; + 451 -> {453 452}; + 452 -> {464}; 453 -> {454}; 454 -> {455}; 455 -> {456}; @@ -1255,56 +1258,56 @@ digraph nullability_kt { 462 -> {463}; 463 -> {464}; 464 -> {465}; + 465 -> {466}; + 466 -> {467}; + 467 -> {468}; subgraph cluster_94 { color=red - 466 [label="Enter function test_12" style="filled" fillcolor=red]; + 469 [label="Enter function test_12" style="filled" fillcolor=red]; subgraph cluster_95 { color=blue - 467 [label="Enter when"]; + 470 [label="Enter when"]; subgraph cluster_96 { color=blue - 468 [label="Enter when branch condition "]; - 469 [label="Access variable R|/q|"]; - 470 [label="Enter safe call"]; - 471 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 472 [label="Exit safe call"]; + 471 [label="Enter when branch condition "]; + 472 [label="Access variable R|/q|"]; 473 [label="Enter safe call"]; - 474 [label="Access variable R|/MyData.s|"]; + 474 [label="Access variable R|/QImplWithCustomGetter.data|"]; 475 [label="Exit safe call"]; 476 [label="Enter safe call"]; - 477 [label="Function call: R|/q|?.R|/QImplWithCustomGetter.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 477 [label="Access variable R|/MyData.s|"]; 478 [label="Exit safe call"]; - 479 [label="Const: Null(null)"]; - 480 [label="Operator !="]; - 481 [label="Exit when branch condition"]; + 479 [label="Enter safe call"]; + 480 [label="Function call: R|/q|?.R|/QImplWithCustomGetter.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 481 [label="Exit safe call"]; + 482 [label="Const: Null(null)"]; + 483 [label="Operator !="]; + 484 [label="Exit when branch condition"]; } - 482 [label="Synthetic else branch"]; - 483 [label="Enter when branch result"]; + 485 [label="Synthetic else branch"]; + 486 [label="Enter when branch result"]; subgraph cluster_97 { color=blue - 484 [label="Enter block"]; - 485 [label="Access variable R|/q|"]; - 486 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 487 [label="Access variable R|/q|"]; - 488 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 489 [label="Access variable #"]; + 487 [label="Enter block"]; + 488 [label="Access variable R|/q|"]; + 489 [label="Access variable R|/QImplWithCustomGetter.data|"]; 490 [label="Access variable R|/q|"]; 491 [label="Access variable R|/QImplWithCustomGetter.data|"]; 492 [label="Access variable #"]; - 493 [label="Function call: R|/q|.R|/QImplWithCustomGetter.data|.#.#()"]; - 494 [label="Exit block"]; + 493 [label="Access variable R|/q|"]; + 494 [label="Access variable R|/QImplWithCustomGetter.data|"]; + 495 [label="Access variable #"]; + 496 [label="Function call: R|/q|.R|/QImplWithCustomGetter.data|.#.#()"]; + 497 [label="Exit block"]; } - 495 [label="Exit when branch result"]; - 496 [label="Exit when"]; + 498 [label="Exit when branch result"]; + 499 [label="Exit when"]; } - 497 [label="Exit function test_12" style="filled" fillcolor=red]; + 500 [label="Exit function test_12" style="filled" fillcolor=red]; } - 466 -> {467}; - 467 -> {468}; - 468 -> {469}; - 469 -> {470 472}; + 469 -> {470}; 470 -> {471}; 471 -> {472}; 472 -> {473 475}; @@ -1313,14 +1316,14 @@ digraph nullability_kt { 475 -> {476 478}; 476 -> {477}; 477 -> {478}; - 478 -> {479}; + 478 -> {479 481}; 479 -> {480}; 480 -> {481}; - 481 -> {483 482}; - 482 -> {496}; + 481 -> {482}; + 482 -> {483}; 483 -> {484}; - 484 -> {485}; - 485 -> {486}; + 484 -> {486 485}; + 485 -> {499}; 486 -> {487}; 487 -> {488}; 488 -> {489}; @@ -1332,56 +1335,56 @@ digraph nullability_kt { 494 -> {495}; 495 -> {496}; 496 -> {497}; + 497 -> {498}; + 498 -> {499}; + 499 -> {500}; subgraph cluster_98 { color=red - 498 [label="Enter function test_13" style="filled" fillcolor=red]; + 501 [label="Enter function test_13" style="filled" fillcolor=red]; subgraph cluster_99 { color=blue - 499 [label="Enter when"]; + 502 [label="Enter when"]; subgraph cluster_100 { color=blue - 500 [label="Enter when branch condition "]; - 501 [label="Access variable R|/q|"]; - 502 [label="Enter safe call"]; - 503 [label="Access variable R|/QImplMutable.data|"]; - 504 [label="Exit safe call"]; + 503 [label="Enter when branch condition "]; + 504 [label="Access variable R|/q|"]; 505 [label="Enter safe call"]; - 506 [label="Access variable R|/MyData.s|"]; + 506 [label="Access variable R|/QImplMutable.data|"]; 507 [label="Exit safe call"]; 508 [label="Enter safe call"]; - 509 [label="Function call: R|/q|?.R|/QImplMutable.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 509 [label="Access variable R|/MyData.s|"]; 510 [label="Exit safe call"]; - 511 [label="Const: Null(null)"]; - 512 [label="Operator !="]; - 513 [label="Exit when branch condition"]; + 511 [label="Enter safe call"]; + 512 [label="Function call: R|/q|?.R|/QImplMutable.data|?.R|/MyData.s|?.R|kotlin/Int.inc|()"]; + 513 [label="Exit safe call"]; + 514 [label="Const: Null(null)"]; + 515 [label="Operator !="]; + 516 [label="Exit when branch condition"]; } - 514 [label="Synthetic else branch"]; - 515 [label="Enter when branch result"]; + 517 [label="Synthetic else branch"]; + 518 [label="Enter when branch result"]; subgraph cluster_101 { color=blue - 516 [label="Enter block"]; - 517 [label="Access variable R|/q|"]; - 518 [label="Access variable R|/QImplMutable.data|"]; - 519 [label="Access variable R|/q|"]; - 520 [label="Access variable R|/QImplMutable.data|"]; - 521 [label="Access variable #"]; + 519 [label="Enter block"]; + 520 [label="Access variable R|/q|"]; + 521 [label="Access variable R|/QImplMutable.data|"]; 522 [label="Access variable R|/q|"]; 523 [label="Access variable R|/QImplMutable.data|"]; 524 [label="Access variable #"]; - 525 [label="Function call: R|/q|.R|/QImplMutable.data|.#.#()"]; - 526 [label="Exit block"]; + 525 [label="Access variable R|/q|"]; + 526 [label="Access variable R|/QImplMutable.data|"]; + 527 [label="Access variable #"]; + 528 [label="Function call: R|/q|.R|/QImplMutable.data|.#.#()"]; + 529 [label="Exit block"]; } - 527 [label="Exit when branch result"]; - 528 [label="Exit when"]; + 530 [label="Exit when branch result"]; + 531 [label="Exit when"]; } - 529 [label="Exit function test_13" style="filled" fillcolor=red]; + 532 [label="Exit function test_13" style="filled" fillcolor=red]; } - 498 -> {499}; - 499 -> {500}; - 500 -> {501}; - 501 -> {502 504}; + 501 -> {502}; 502 -> {503}; 503 -> {504}; 504 -> {505 507}; @@ -1390,14 +1393,14 @@ digraph nullability_kt { 507 -> {508 510}; 508 -> {509}; 509 -> {510}; - 510 -> {511}; + 510 -> {511 513}; 511 -> {512}; 512 -> {513}; - 513 -> {515 514}; - 514 -> {528}; + 513 -> {514}; + 514 -> {515}; 515 -> {516}; - 516 -> {517}; - 517 -> {518}; + 516 -> {518 517}; + 517 -> {531}; 518 -> {519}; 519 -> {520}; 520 -> {521}; @@ -1409,5 +1412,8 @@ digraph nullability_kt { 526 -> {527}; 527 -> {528}; 528 -> {529}; + 529 -> {530}; + 530 -> {531}; + 531 -> {532}; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/receivers/implicitReceivers.dot b/compiler/fir/resolve/testData/resolve/smartcasts/receivers/implicitReceivers.dot index b99eaff8f73..68331e84712 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/receivers/implicitReceivers.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/receivers/implicitReceivers.dot @@ -6,106 +6,108 @@ digraph implicitReceivers_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function foo" style="filled" fillcolor=red]; - 3 [label="Exit function foo" style="filled" fillcolor=red]; + 3 [label="Enter function foo" style="filled" fillcolor=red]; + 4 [label="Exit function foo" style="filled" fillcolor=red]; } - 2 -> {3}; + 3 -> {4}; subgraph cluster_2 { color=red - 4 [label="Enter function " style="filled" fillcolor=red]; - 5 [label="Exit function " style="filled" fillcolor=red]; + 5 [label="Enter function " style="filled" fillcolor=red]; + 6 [label="Delegated constructor call: super()"]; + 7 [label="Exit function " style="filled" fillcolor=red]; } - 4 -> {5}; + 5 -> {6}; + 6 -> {7}; subgraph cluster_3 { color=red - 6 [label="Enter function bar" style="filled" fillcolor=red]; - 7 [label="Exit function bar" style="filled" fillcolor=red]; - } - - 6 -> {7}; - - subgraph cluster_4 { - color=red - 8 [label="Enter function with" style="filled" fillcolor=red]; - 9 [label="Exit function with" style="filled" fillcolor=red]; + 8 [label="Enter function bar" style="filled" fillcolor=red]; + 9 [label="Exit function bar" style="filled" fillcolor=red]; } 8 -> {9}; - subgraph cluster_5 { + subgraph cluster_4 { color=red - 10 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_6 { - color=blue - 11 [label="Enter when"]; - subgraph cluster_7 { - color=blue - 12 [label="Enter when branch condition "]; - 13 [label="Access variable this@R|/test_1|"]; - 14 [label="Type operator: (this@R|/test_1| is R|A|)"]; - 15 [label="Exit when branch condition"]; - } - subgraph cluster_8 { - color=blue - 16 [label="Enter when branch condition else"]; - 17 [label="Exit when branch condition"]; - } - 18 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 19 [label="Enter block"]; - 20 [label="Access variable this@R|/test_1|"]; - 21 [label="Function call: this@R|/test_1|.#()"]; - 22 [label="Function call: #()"]; - 23 [label="Exit block"]; - } - 24 [label="Exit when branch result"]; - 25 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 26 [label="Enter block"]; - 27 [label="Access variable this@R|/test_1|"]; - 28 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; - 29 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; - 30 [label="Exit block"]; - } - 31 [label="Exit when branch result"]; - 32 [label="Exit when"]; - } - 33 [label="Access variable this@R|/test_1|"]; - 34 [label="Function call: this@R|/test_1|.#()"]; - 35 [label="Function call: #()"]; - 36 [label="Exit function test_1" style="filled" fillcolor=red]; + 10 [label="Enter function with" style="filled" fillcolor=red]; + 11 [label="Exit function with" style="filled" fillcolor=red]; } 10 -> {11}; - 11 -> {12}; + + subgraph cluster_5 { + color=red + 12 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_6 { + color=blue + 13 [label="Enter when"]; + subgraph cluster_7 { + color=blue + 14 [label="Enter when branch condition "]; + 15 [label="Access variable this@R|/test_1|"]; + 16 [label="Type operator: (this@R|/test_1| is R|A|)"]; + 17 [label="Exit when branch condition"]; + } + subgraph cluster_8 { + color=blue + 18 [label="Enter when branch condition else"]; + 19 [label="Exit when branch condition"]; + } + 20 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 21 [label="Enter block"]; + 22 [label="Access variable this@R|/test_1|"]; + 23 [label="Function call: this@R|/test_1|.#()"]; + 24 [label="Function call: #()"]; + 25 [label="Exit block"]; + } + 26 [label="Exit when branch result"]; + 27 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 28 [label="Enter block"]; + 29 [label="Access variable this@R|/test_1|"]; + 30 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; + 31 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; + 32 [label="Exit block"]; + } + 33 [label="Exit when branch result"]; + 34 [label="Exit when"]; + } + 35 [label="Access variable this@R|/test_1|"]; + 36 [label="Function call: this@R|/test_1|.#()"]; + 37 [label="Function call: #()"]; + 38 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {25 16}; + 15 -> {16}; 16 -> {17}; - 17 -> {18}; + 17 -> {27 18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; - 24 -> {32}; + 24 -> {25}; 25 -> {26}; - 26 -> {27}; + 26 -> {34}; 27 -> {28}; 28 -> {29}; 29 -> {30}; @@ -115,70 +117,70 @@ digraph implicitReceivers_kt { 33 -> {34}; 34 -> {35}; 35 -> {36}; + 36 -> {37}; + 37 -> {38}; subgraph cluster_11 { color=red - 37 [label="Enter function test_2" style="filled" fillcolor=red]; + 39 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_12 { color=blue - 38 [label="Enter when"]; + 40 [label="Enter when"]; subgraph cluster_13 { color=blue - 39 [label="Enter when branch condition "]; - 40 [label="Access variable this@R|/test_2|"]; - 41 [label="Type operator: (this@R|/test_2| !is R|A|)"]; - 42 [label="Exit when branch condition"]; + 41 [label="Enter when branch condition "]; + 42 [label="Access variable this@R|/test_2|"]; + 43 [label="Type operator: (this@R|/test_2| !is R|A|)"]; + 44 [label="Exit when branch condition"]; } subgraph cluster_14 { color=blue - 43 [label="Enter when branch condition else"]; - 44 [label="Exit when branch condition"]; + 45 [label="Enter when branch condition else"]; + 46 [label="Exit when branch condition"]; } - 45 [label="Enter when branch result"]; + 47 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 46 [label="Enter block"]; - 47 [label="Access variable this@R|/test_2|"]; - 48 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; - 49 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; - 50 [label="Exit block"]; + 48 [label="Enter block"]; + 49 [label="Access variable this@R|/test_2|"]; + 50 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; + 51 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; + 52 [label="Exit block"]; } - 51 [label="Exit when branch result"]; - 52 [label="Enter when branch result"]; + 53 [label="Exit when branch result"]; + 54 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 53 [label="Enter block"]; - 54 [label="Access variable this@R|/test_2|"]; - 55 [label="Function call: this@R|/test_2|.#()"]; - 56 [label="Function call: #()"]; - 57 [label="Exit block"]; + 55 [label="Enter block"]; + 56 [label="Access variable this@R|/test_2|"]; + 57 [label="Function call: this@R|/test_2|.#()"]; + 58 [label="Function call: #()"]; + 59 [label="Exit block"]; } - 58 [label="Exit when branch result"]; - 59 [label="Exit when"]; + 60 [label="Exit when branch result"]; + 61 [label="Exit when"]; } - 60 [label="Access variable this@R|/test_2|"]; - 61 [label="Function call: this@R|/test_2|.#()"]; - 62 [label="Function call: #()"]; - 63 [label="Exit function test_2" style="filled" fillcolor=red]; + 62 [label="Access variable this@R|/test_2|"]; + 63 [label="Function call: this@R|/test_2|.#()"]; + 64 [label="Function call: #()"]; + 65 [label="Exit function test_2" style="filled" fillcolor=red]; } - 37 -> {38}; - 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {52 43}; + 42 -> {43}; 43 -> {44}; - 44 -> {45}; + 44 -> {54 45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; 48 -> {49}; 49 -> {50}; 50 -> {51}; - 51 -> {59}; + 51 -> {52}; 52 -> {53}; - 53 -> {54}; + 53 -> {61}; 54 -> {55}; 55 -> {56}; 56 -> {57}; @@ -188,197 +190,197 @@ digraph implicitReceivers_kt { 60 -> {61}; 61 -> {62}; 62 -> {63}; + 63 -> {64}; + 64 -> {65}; subgraph cluster_17 { color=red - 64 [label="Enter function test_3" style="filled" fillcolor=red]; - 65 [label="Access variable R|/a|"]; - 66 [label="Postponed enter to lambda"]; + 66 [label="Enter function test_3" style="filled" fillcolor=red]; + 67 [label="Access variable R|/a|"]; + 68 [label="Postponed enter to lambda"]; subgraph cluster_18 { color=blue - 67 [label="Enter function anonymousFunction"]; - 68 [label="Access variable R|/b|"]; - 69 [label="Postponed enter to lambda"]; + 69 [label="Enter function anonymousFunction"]; + 70 [label="Access variable R|/b|"]; + 71 [label="Postponed enter to lambda"]; subgraph cluster_19 { color=blue - 70 [label="Enter function anonymousFunction"]; - 71 [label="Access variable R|/c|"]; - 72 [label="Postponed enter to lambda"]; + 72 [label="Enter function anonymousFunction"]; + 73 [label="Access variable R|/c|"]; + 74 [label="Postponed enter to lambda"]; subgraph cluster_20 { color=blue - 73 [label="Enter function anonymousFunction"]; - 74 [label="Access variable this@R|special/anonymous|"]; - 75 [label="Type operator: (this@R|special/anonymous| as R|A|)"]; + 75 [label="Enter function anonymousFunction"]; 76 [label="Access variable this@R|special/anonymous|"]; - 77 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 78 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 79 [label="Exit function anonymousFunction"]; + 77 [label="Type operator: (this@R|special/anonymous| as R|A|)"]; + 78 [label="Access variable this@R|special/anonymous|"]; + 79 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 80 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 81 [label="Exit function anonymousFunction"]; } - 80 [label="Call arguments union" style="filled" fillcolor=yellow]; - 81 [label="Postponed exit from lambda"]; - 82 [label="Function call: R|kotlin/with|(...)"]; - 83 [label="Access variable this@R|special/anonymous|"]; - 84 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 85 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 86 [label="Exit function anonymousFunction"]; + 82 [label="Call arguments union" style="filled" fillcolor=yellow]; + 83 [label="Postponed exit from lambda"]; + 84 [label="Function call: R|kotlin/with|(...)"]; + 85 [label="Access variable this@R|special/anonymous|"]; + 86 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 87 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 88 [label="Exit function anonymousFunction"]; } - 87 [label="Call arguments union" style="filled" fillcolor=yellow]; - 88 [label="Postponed exit from lambda"]; - 89 [label="Function call: R|kotlin/with|(...)"]; - 90 [label="Exit function anonymousFunction"]; + 89 [label="Call arguments union" style="filled" fillcolor=yellow]; + 90 [label="Postponed exit from lambda"]; + 91 [label="Function call: R|kotlin/with|(...)"]; + 92 [label="Exit function anonymousFunction"]; } - 91 [label="Call arguments union" style="filled" fillcolor=yellow]; - 92 [label="Postponed exit from lambda"]; - 93 [label="Function call: R|kotlin/with|(...)"]; - 94 [label="Exit function test_3" style="filled" fillcolor=red]; + 93 [label="Call arguments union" style="filled" fillcolor=yellow]; + 94 [label="Postponed exit from lambda"]; + 95 [label="Function call: R|kotlin/with|(...)"]; + 96 [label="Exit function test_3" style="filled" fillcolor=red]; } - 64 -> {65}; - 65 -> {66}; 66 -> {67}; - 66 -> {92} [color=red]; 67 -> {68}; 68 -> {69}; + 68 -> {94} [color=red]; 69 -> {70}; - 69 -> {88} [color=red]; 70 -> {71}; 71 -> {72}; + 71 -> {90} [color=red]; 72 -> {73}; - 72 -> {81} [color=red]; 73 -> {74}; 74 -> {75}; + 74 -> {83} [color=red]; 75 -> {76}; 76 -> {77}; 77 -> {78}; 78 -> {79}; - 79 -> {81} [color=green]; - 79 -> {80} [color=red]; - 80 -> {82} [color=red]; - 81 -> {82} [color=green]; - 82 -> {83}; - 83 -> {84}; + 79 -> {80}; + 80 -> {81}; + 81 -> {83} [color=green]; + 81 -> {82} [color=red]; + 82 -> {84} [color=red]; + 83 -> {84} [color=green]; 84 -> {85}; 85 -> {86}; - 86 -> {88} [color=green]; - 86 -> {87} [color=red]; - 87 -> {89} [color=red]; - 88 -> {89} [color=green]; - 89 -> {90}; - 90 -> {92} [color=green]; - 90 -> {91} [color=red]; - 91 -> {93} [color=red]; - 92 -> {93} [color=green]; - 93 -> {94}; + 86 -> {87}; + 87 -> {88}; + 88 -> {90} [color=green]; + 88 -> {89} [color=red]; + 89 -> {91} [color=red]; + 90 -> {91} [color=green]; + 91 -> {92}; + 92 -> {94} [color=green]; + 92 -> {93} [color=red]; + 93 -> {95} [color=red]; + 94 -> {95} [color=green]; + 95 -> {96}; subgraph cluster_21 { color=red - 95 [label="Enter function test_4" style="filled" fillcolor=red]; + 97 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_22 { color=blue - 96 [label="Enter when"]; + 98 [label="Enter when"]; subgraph cluster_23 { color=blue - 97 [label="Enter when branch condition "]; - 98 [label="Access variable this@R|/test_4|"]; - 99 [label="Type operator: (this@R|/test_4| !is R|A|)"]; - 100 [label="Exit when branch condition"]; + 99 [label="Enter when branch condition "]; + 100 [label="Access variable this@R|/test_4|"]; + 101 [label="Type operator: (this@R|/test_4| !is R|A|)"]; + 102 [label="Exit when branch condition"]; } subgraph cluster_24 { color=blue - 101 [label="Enter when branch condition else"]; - 102 [label="Exit when branch condition"]; + 103 [label="Enter when branch condition else"]; + 104 [label="Exit when branch condition"]; } - 103 [label="Enter when branch result"]; + 105 [label="Enter when branch result"]; subgraph cluster_25 { color=blue - 104 [label="Enter block"]; + 106 [label="Enter block"]; subgraph cluster_26 { color=blue - 105 [label="Enter when"]; + 107 [label="Enter when"]; subgraph cluster_27 { color=blue - 106 [label="Enter when branch condition "]; - 107 [label="Access variable this@R|/test_4|"]; - 108 [label="Type operator: (this@R|/test_4| !is R|B|)"]; - 109 [label="Exit when branch condition"]; + 108 [label="Enter when branch condition "]; + 109 [label="Access variable this@R|/test_4|"]; + 110 [label="Type operator: (this@R|/test_4| !is R|B|)"]; + 111 [label="Exit when branch condition"]; } subgraph cluster_28 { color=blue - 110 [label="Enter when branch condition else"]; - 111 [label="Exit when branch condition"]; + 112 [label="Enter when branch condition else"]; + 113 [label="Exit when branch condition"]; } - 112 [label="Enter when branch result"]; + 114 [label="Enter when branch result"]; subgraph cluster_29 { color=blue - 113 [label="Enter block"]; - 114 [label="Access variable this@R|/test_4|"]; - 115 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 116 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 117 [label="Access variable this@R|/test_4|"]; - 118 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; - 119 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; - 120 [label="Exit block"]; + 115 [label="Enter block"]; + 116 [label="Access variable this@R|/test_4|"]; + 117 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 118 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 119 [label="Access variable this@R|/test_4|"]; + 120 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; + 121 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; + 122 [label="Exit block"]; } - 121 [label="Exit when branch result"]; - 122 [label="Enter when branch result"]; + 123 [label="Exit when branch result"]; + 124 [label="Enter when branch result"]; subgraph cluster_30 { color=blue - 123 [label="Enter block"]; - 124 [label="Access variable this@R|/test_4|"]; - 125 [label="Function call: this@R|/test_4|.#()"]; - 126 [label="Function call: #()"]; - 127 [label="Access variable this@R|/test_4|"]; - 128 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 129 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 130 [label="Exit block"]; + 125 [label="Enter block"]; + 126 [label="Access variable this@R|/test_4|"]; + 127 [label="Function call: this@R|/test_4|.#()"]; + 128 [label="Function call: #()"]; + 129 [label="Access variable this@R|/test_4|"]; + 130 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 131 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 132 [label="Exit block"]; } - 131 [label="Exit when branch result"]; - 132 [label="Exit when"]; + 133 [label="Exit when branch result"]; + 134 [label="Exit when"]; } - 133 [label="Exit block"]; + 135 [label="Exit block"]; } - 134 [label="Exit when branch result"]; - 135 [label="Enter when branch result"]; + 136 [label="Exit when branch result"]; + 137 [label="Enter when branch result"]; subgraph cluster_31 { color=blue - 136 [label="Enter block"]; - 137 [label="Access variable this@R|/test_4|"]; - 138 [label="Function call: this@R|/test_4|.#()"]; - 139 [label="Function call: #()"]; - 140 [label="Access variable this@R|/test_4|"]; - 141 [label="Function call: this@R|/test_4|.#()"]; - 142 [label="Function call: #()"]; - 143 [label="Exit block"]; + 138 [label="Enter block"]; + 139 [label="Access variable this@R|/test_4|"]; + 140 [label="Function call: this@R|/test_4|.#()"]; + 141 [label="Function call: #()"]; + 142 [label="Access variable this@R|/test_4|"]; + 143 [label="Function call: this@R|/test_4|.#()"]; + 144 [label="Function call: #()"]; + 145 [label="Exit block"]; } - 144 [label="Exit when branch result"]; - 145 [label="Exit when"]; + 146 [label="Exit when branch result"]; + 147 [label="Exit when"]; } - 146 [label="Access variable this@R|/test_4|"]; - 147 [label="Function call: this@R|/test_4|.#()"]; - 148 [label="Function call: #()"]; - 149 [label="Access variable this@R|/test_4|"]; - 150 [label="Function call: this@R|/test_4|.#()"]; - 151 [label="Function call: #()"]; - 152 [label="Exit function test_4" style="filled" fillcolor=red]; + 148 [label="Access variable this@R|/test_4|"]; + 149 [label="Function call: this@R|/test_4|.#()"]; + 150 [label="Function call: #()"]; + 151 [label="Access variable this@R|/test_4|"]; + 152 [label="Function call: this@R|/test_4|.#()"]; + 153 [label="Function call: #()"]; + 154 [label="Exit function test_4" style="filled" fillcolor=red]; } - 95 -> {96}; - 96 -> {97}; 97 -> {98}; 98 -> {99}; 99 -> {100}; - 100 -> {135 101}; + 100 -> {101}; 101 -> {102}; - 102 -> {103}; + 102 -> {137 103}; 103 -> {104}; 104 -> {105}; 105 -> {106}; 106 -> {107}; 107 -> {108}; 108 -> {109}; - 109 -> {122 110}; + 109 -> {110}; 110 -> {111}; - 111 -> {112}; + 111 -> {124 112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; @@ -388,9 +390,9 @@ digraph implicitReceivers_kt { 118 -> {119}; 119 -> {120}; 120 -> {121}; - 121 -> {132}; + 121 -> {122}; 122 -> {123}; - 123 -> {124}; + 123 -> {134}; 124 -> {125}; 125 -> {126}; 126 -> {127}; @@ -401,9 +403,9 @@ digraph implicitReceivers_kt { 131 -> {132}; 132 -> {133}; 133 -> {134}; - 134 -> {145}; + 134 -> {135}; 135 -> {136}; - 136 -> {137}; + 136 -> {147}; 137 -> {138}; 138 -> {139}; 139 -> {140}; @@ -419,59 +421,61 @@ digraph implicitReceivers_kt { 149 -> {150}; 150 -> {151}; 151 -> {152}; + 152 -> {153}; + 153 -> {154}; subgraph cluster_32 { color=red - 153 [label="Enter function test_5" style="filled" fillcolor=red]; + 155 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_33 { color=blue - 154 [label="Enter when"]; + 156 [label="Enter when"]; subgraph cluster_34 { color=blue - 155 [label="Enter when branch condition "]; - 156 [label="Access variable this@R|/test_5|"]; - 157 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"]; - 158 [label="Exit when branch condition"]; + 157 [label="Enter when branch condition "]; + 158 [label="Access variable this@R|/test_5|"]; + 159 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"]; + 160 [label="Exit when branch condition"]; } subgraph cluster_35 { color=blue - 159 [label="Enter when branch condition "]; - 160 [label="Access variable this@R|/test_5|"]; - 161 [label="Type operator: (this@R|/test_5| is R|kotlin/String|)"]; - 162 [label="Exit when branch condition"]; + 161 [label="Enter when branch condition "]; + 162 [label="Access variable this@R|/test_5|"]; + 163 [label="Type operator: (this@R|/test_5| is R|kotlin/String|)"]; + 164 [label="Exit when branch condition"]; } subgraph cluster_36 { color=blue - 163 [label="Enter when branch condition else"]; - 164 [label="Exit when branch condition"]; + 165 [label="Enter when branch condition else"]; + 166 [label="Exit when branch condition"]; } - 165 [label="Enter when branch result"]; + 167 [label="Enter when branch result"]; subgraph cluster_37 { color=blue - 166 [label="Enter block"]; - 167 [label="Const: Int(0)"]; - 168 [label="Exit block"]; + 168 [label="Enter block"]; + 169 [label="Const: Int(0)"]; + 170 [label="Exit block"]; } - 169 [label="Exit when branch result"]; - 170 [label="Enter when branch result"]; + 171 [label="Exit when branch result"]; + 172 [label="Enter when branch result"]; subgraph cluster_38 { color=blue - 171 [label="Enter block"]; - 172 [label="Access variable R|kotlin/String.length|"]; - 173 [label="Exit block"]; + 173 [label="Enter block"]; + 174 [label="Access variable R|kotlin/String.length|"]; + 175 [label="Exit block"]; } - 174 [label="Exit when branch result"]; - 175 [label="Enter when branch result"]; + 176 [label="Exit when branch result"]; + 177 [label="Enter when branch result"]; subgraph cluster_39 { color=blue - 176 [label="Enter block"]; - 177 [label="Access variable R|kotlin/collections/List.size|"]; - 178 [label="Exit block"]; + 178 [label="Enter block"]; + 179 [label="Access variable R|kotlin/collections/List.size|"]; + 180 [label="Exit block"]; } - 179 [label="Exit when branch result"]; - 180 [label="Exit when"]; + 181 [label="Exit when branch result"]; + 182 [label="Exit when"]; } - 181 [label="Jump: ^test_5 when () { + 183 [label="Jump: ^test_5 when () { (this@R|/test_5| is R|kotlin/collections/List<*>|) -> { this@R|/test_5|.R|kotlin/collections/List.size| } @@ -483,60 +487,60 @@ digraph implicitReceivers_kt { } } "]; - 182 [label="Stub" style="filled" fillcolor=gray]; - 183 [label="Exit function test_5" style="filled" fillcolor=red]; + 184 [label="Stub" style="filled" fillcolor=gray]; + 185 [label="Exit function test_5" style="filled" fillcolor=red]; } - 153 -> {154}; - 154 -> {155}; 155 -> {156}; 156 -> {157}; 157 -> {158}; - 158 -> {175 159}; + 158 -> {159}; 159 -> {160}; - 160 -> {161}; + 160 -> {177 161}; 161 -> {162}; - 162 -> {170 163}; + 162 -> {163}; 163 -> {164}; - 164 -> {165}; + 164 -> {172 165}; 165 -> {166}; 166 -> {167}; 167 -> {168}; 168 -> {169}; - 169 -> {180}; + 169 -> {170}; 170 -> {171}; - 171 -> {172}; + 171 -> {182}; 172 -> {173}; 173 -> {174}; - 174 -> {180}; + 174 -> {175}; 175 -> {176}; - 176 -> {177}; + 176 -> {182}; 177 -> {178}; 178 -> {179}; 179 -> {180}; 180 -> {181}; - 181 -> {183}; - 181 -> {182} [style=dotted]; - 182 -> {183} [style=dotted]; + 181 -> {182}; + 182 -> {183}; + 183 -> {185}; + 183 -> {184} [style=dotted]; + 184 -> {185} [style=dotted]; subgraph cluster_40 { color=red - 184 [label="Enter function test_6" style="filled" fillcolor=red]; - 185 [label="Access variable this@R|/test_6|"]; - 186 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"]; - 187 [label="Access variable R|kotlin/collections/List.size|"]; - 188 [label="Access variable this@R|/test_6|"]; - 189 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"]; - 190 [label="Access variable R|kotlin/String.length|"]; - 191 [label="Exit function test_6" style="filled" fillcolor=red]; + 186 [label="Enter function test_6" style="filled" fillcolor=red]; + 187 [label="Access variable this@R|/test_6|"]; + 188 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"]; + 189 [label="Access variable R|kotlin/collections/List.size|"]; + 190 [label="Access variable this@R|/test_6|"]; + 191 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"]; + 192 [label="Access variable R|kotlin/String.length|"]; + 193 [label="Exit function test_6" style="filled" fillcolor=red]; } - 184 -> {185}; - 185 -> {186}; 186 -> {187}; 187 -> {188}; 188 -> {189}; 189 -> {190}; 190 -> {191}; + 191 -> {192}; + 192 -> {193}; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot b/compiler/fir/resolve/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot index ef7667bbfa4..8517ce47116 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot @@ -6,89 +6,90 @@ digraph assignSafeCall_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function foo" style="filled" fillcolor=red]; - 3 [label="Const: Int(1)"]; - 4 [label="Jump: ^foo Int(1)"]; - 5 [label="Stub" style="filled" fillcolor=gray]; - 6 [label="Exit function foo" style="filled" fillcolor=red]; + 3 [label="Enter function foo" style="filled" fillcolor=red]; + 4 [label="Const: Int(1)"]; + 5 [label="Jump: ^foo Int(1)"]; + 6 [label="Stub" style="filled" fillcolor=gray]; + 7 [label="Exit function foo" style="filled" fillcolor=red]; } - 2 -> {3}; 3 -> {4}; - 4 -> {6}; - 4 -> {5} [style=dotted]; + 4 -> {5}; + 5 -> {7}; 5 -> {6} [style=dotted]; + 6 -> {7} [style=dotted]; subgraph cluster_2 { color=red - 7 [label="Enter function getter" style="filled" fillcolor=red]; - 8 [label="Exit function getter" style="filled" fillcolor=red]; + 8 [label="Enter function getter" style="filled" fillcolor=red]; + 9 [label="Exit function getter" style="filled" fillcolor=red]; } - 7 -> {8}; + 8 -> {9}; subgraph cluster_3 { color=red - 9 [label="Enter property" style="filled" fillcolor=red]; - 10 [label="Const: Int(1)"]; - 11 [label="Exit property" style="filled" fillcolor=red]; + 10 [label="Enter property" style="filled" fillcolor=red]; + 11 [label="Const: Int(1)"]; + 12 [label="Exit property" style="filled" fillcolor=red]; } - 9 -> {10}; 10 -> {11}; + 11 -> {12}; subgraph cluster_4 { color=red - 12 [label="Enter function bar" style="filled" fillcolor=red]; - 13 [label="Exit function bar" style="filled" fillcolor=red]; + 13 [label="Enter function bar" style="filled" fillcolor=red]; + 14 [label="Exit function bar" style="filled" fillcolor=red]; } - 12 -> {13}; + 13 -> {14}; subgraph cluster_5 { color=red - 14 [label="Enter function test_1" style="filled" fillcolor=red]; - 15 [label="Access variable R|/a|"]; - 16 [label="Enter safe call"]; - 17 [label="Access variable R|/A.x|"]; - 18 [label="Exit safe call"]; - 19 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 15 [label="Enter function test_1" style="filled" fillcolor=red]; + 16 [label="Access variable R|/a|"]; + 17 [label="Enter safe call"]; + 18 [label="Access variable R|/A.x|"]; + 19 [label="Exit safe call"]; + 20 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_6 { color=blue - 20 [label="Enter when"]; + 21 [label="Enter when"]; subgraph cluster_7 { color=blue - 21 [label="Enter when branch condition "]; - 22 [label="Access variable R|/x|"]; - 23 [label="Const: Null(null)"]; - 24 [label="Operator !="]; - 25 [label="Exit when branch condition"]; + 22 [label="Enter when branch condition "]; + 23 [label="Access variable R|/x|"]; + 24 [label="Const: Null(null)"]; + 25 [label="Operator !="]; + 26 [label="Exit when branch condition"]; } - 26 [label="Synthetic else branch"]; - 27 [label="Enter when branch result"]; + 27 [label="Synthetic else branch"]; + 28 [label="Enter when branch result"]; subgraph cluster_8 { color=blue - 28 [label="Enter block"]; - 29 [label="Access variable R|/a|"]; - 30 [label="Function call: R|/a|.R|/A.bar|()"]; - 31 [label="Exit block"]; + 29 [label="Enter block"]; + 30 [label="Access variable R|/a|"]; + 31 [label="Function call: R|/a|.R|/A.bar|()"]; + 32 [label="Exit block"]; } - 32 [label="Exit when branch result"]; - 33 [label="Exit when"]; + 33 [label="Exit when branch result"]; + 34 [label="Exit when"]; } - 34 [label="Exit function test_1" style="filled" fillcolor=red]; + 35 [label="Exit function test_1" style="filled" fillcolor=red]; } - 14 -> {15}; - 15 -> {16 18}; - 16 -> {17}; + 15 -> {16}; + 16 -> {17 19}; 17 -> {18}; 18 -> {19}; 19 -> {20}; @@ -97,53 +98,53 @@ digraph assignSafeCall_kt { 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {27 26}; - 26 -> {33}; - 27 -> {28}; + 25 -> {26}; + 26 -> {28 27}; + 27 -> {34}; 28 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; + 34 -> {35}; subgraph cluster_9 { color=red - 35 [label="Enter function test_2" style="filled" fillcolor=red]; - 36 [label="Access variable R|/a|"]; - 37 [label="Enter safe call"]; - 38 [label="Function call: R|/a|?.R|/A.foo|()"]; - 39 [label="Exit safe call"]; - 40 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 36 [label="Enter function test_2" style="filled" fillcolor=red]; + 37 [label="Access variable R|/a|"]; + 38 [label="Enter safe call"]; + 39 [label="Function call: R|/a|?.R|/A.foo|()"]; + 40 [label="Exit safe call"]; + 41 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_10 { color=blue - 41 [label="Enter when"]; + 42 [label="Enter when"]; subgraph cluster_11 { color=blue - 42 [label="Enter when branch condition "]; - 43 [label="Access variable R|/x|"]; - 44 [label="Const: Null(null)"]; - 45 [label="Operator !="]; - 46 [label="Exit when branch condition"]; + 43 [label="Enter when branch condition "]; + 44 [label="Access variable R|/x|"]; + 45 [label="Const: Null(null)"]; + 46 [label="Operator !="]; + 47 [label="Exit when branch condition"]; } - 47 [label="Synthetic else branch"]; - 48 [label="Enter when branch result"]; + 48 [label="Synthetic else branch"]; + 49 [label="Enter when branch result"]; subgraph cluster_12 { color=blue - 49 [label="Enter block"]; - 50 [label="Access variable R|/a|"]; - 51 [label="Function call: R|/a|.R|/A.bar|()"]; - 52 [label="Exit block"]; + 50 [label="Enter block"]; + 51 [label="Access variable R|/a|"]; + 52 [label="Function call: R|/a|.R|/A.bar|()"]; + 53 [label="Exit block"]; } - 53 [label="Exit when branch result"]; - 54 [label="Exit when"]; + 54 [label="Exit when branch result"]; + 55 [label="Exit when"]; } - 55 [label="Exit function test_2" style="filled" fillcolor=red]; + 56 [label="Exit function test_2" style="filled" fillcolor=red]; } - 35 -> {36}; - 36 -> {37 39}; - 37 -> {38}; + 36 -> {37}; + 37 -> {38 40}; 38 -> {39}; 39 -> {40}; 40 -> {41}; @@ -152,65 +153,65 @@ digraph assignSafeCall_kt { 43 -> {44}; 44 -> {45}; 45 -> {46}; - 46 -> {48 47}; - 47 -> {54}; - 48 -> {49}; + 46 -> {47}; + 47 -> {49 48}; + 48 -> {55}; 49 -> {50}; 50 -> {51}; 51 -> {52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; + 55 -> {56}; subgraph cluster_13 { color=red - 56 [label="Enter function test_3" style="filled" fillcolor=red]; + 57 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_14 { color=blue - 57 [label="Enter when"]; - 58 [label="Access variable R|/x|"]; - 59 [label="Type operator: (R|/x| as? R|A|)"]; - 60 [label="Variable declaration: lval : R|A?|"]; + 58 [label="Enter when"]; + 59 [label="Access variable R|/x|"]; + 60 [label="Type operator: (R|/x| as? R|A|)"]; + 61 [label="Variable declaration: lval : R|A?|"]; subgraph cluster_15 { color=blue - 61 [label="Enter when branch condition "]; - 62 [label="Const: Null(null)"]; - 63 [label="Operator =="]; - 64 [label="Exit when branch condition"]; + 62 [label="Enter when branch condition "]; + 63 [label="Const: Null(null)"]; + 64 [label="Operator =="]; + 65 [label="Exit when branch condition"]; } subgraph cluster_16 { color=blue - 65 [label="Enter when branch condition else"]; - 66 [label="Exit when branch condition"]; + 66 [label="Enter when branch condition else"]; + 67 [label="Exit when branch condition"]; } - 67 [label="Enter when branch result"]; + 68 [label="Enter when branch result"]; subgraph cluster_17 { color=blue - 68 [label="Enter block"]; - 69 [label="Access variable R|/|"]; - 70 [label="Exit block"]; + 69 [label="Enter block"]; + 70 [label="Access variable R|/|"]; + 71 [label="Exit block"]; } - 71 [label="Exit when branch result"]; - 72 [label="Enter when branch result"]; + 72 [label="Exit when branch result"]; + 73 [label="Enter when branch result"]; subgraph cluster_18 { color=blue - 73 [label="Enter block"]; - 74 [label="Jump: ^test_3 Unit"]; - 75 [label="Stub" style="filled" fillcolor=gray]; - 76 [label="Exit block" style="filled" fillcolor=gray]; + 74 [label="Enter block"]; + 75 [label="Jump: ^test_3 Unit"]; + 76 [label="Stub" style="filled" fillcolor=gray]; + 77 [label="Exit block" style="filled" fillcolor=gray]; } - 77 [label="Exit when branch result" style="filled" fillcolor=gray]; - 78 [label="Exit when"]; + 78 [label="Exit when branch result" style="filled" fillcolor=gray]; + 79 [label="Exit when"]; } - 79 [label="Variable declaration: lval a: R|A|"]; - 80 [label="Access variable R|/a|"]; - 81 [label="Function call: R|/a|.R|/A.foo|()"]; - 82 [label="Access variable R|/x|"]; - 83 [label="Function call: R|/x|.R|/A.foo|()"]; - 84 [label="Exit function test_3" style="filled" fillcolor=red]; + 80 [label="Variable declaration: lval a: R|A|"]; + 81 [label="Access variable R|/a|"]; + 82 [label="Function call: R|/a|.R|/A.foo|()"]; + 83 [label="Access variable R|/x|"]; + 84 [label="Function call: R|/x|.R|/A.foo|()"]; + 85 [label="Exit function test_3" style="filled" fillcolor=red]; } - 56 -> {57}; 57 -> {58}; 58 -> {59}; 59 -> {60}; @@ -218,97 +219,97 @@ digraph assignSafeCall_kt { 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {72 65}; - 65 -> {66}; + 64 -> {65}; + 65 -> {73 66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; 70 -> {71}; - 71 -> {78}; - 72 -> {73}; + 71 -> {72}; + 72 -> {79}; 73 -> {74}; - 74 -> {84}; - 74 -> {75} [style=dotted]; + 74 -> {75}; + 75 -> {85}; 75 -> {76} [style=dotted]; 76 -> {77} [style=dotted]; 77 -> {78} [style=dotted]; - 78 -> {79}; + 78 -> {79} [style=dotted]; 79 -> {80}; 80 -> {81}; 81 -> {82}; 82 -> {83}; 83 -> {84}; + 84 -> {85}; subgraph cluster_19 { color=red - 85 [label="Enter function foo" style="filled" fillcolor=red]; - 86 [label="Exit function foo" style="filled" fillcolor=red]; + 86 [label="Enter function foo" style="filled" fillcolor=red]; + 87 [label="Exit function foo" style="filled" fillcolor=red]; } - 85 -> {86}; + 86 -> {87}; subgraph cluster_20 { color=red - 87 [label="Enter function getter" style="filled" fillcolor=red]; - 88 [label="Exit function getter" style="filled" fillcolor=red]; + 88 [label="Enter function getter" style="filled" fillcolor=red]; + 89 [label="Exit function getter" style="filled" fillcolor=red]; } - 87 -> {88}; + 88 -> {89}; subgraph cluster_21 { color=red - 89 [label="Enter property" style="filled" fillcolor=red]; - 90 [label="Exit property" style="filled" fillcolor=red]; + 90 [label="Enter property" style="filled" fillcolor=red]; + 91 [label="Exit property" style="filled" fillcolor=red]; } - 89 -> {90}; + 90 -> {91}; subgraph cluster_22 { color=red - 91 [label="Enter function bar" style="filled" fillcolor=red]; - 92 [label="Exit function bar" style="filled" fillcolor=red]; + 92 [label="Enter function bar" style="filled" fillcolor=red]; + 93 [label="Exit function bar" style="filled" fillcolor=red]; } - 91 -> {92}; + 92 -> {93}; subgraph cluster_23 { color=red - 93 [label="Enter function test_1" style="filled" fillcolor=red]; - 94 [label="Access variable R|/a|"]; - 95 [label="Enter safe call"]; - 96 [label="Access variable R|/B.x|"]; - 97 [label="Exit safe call"]; - 98 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 94 [label="Enter function test_1" style="filled" fillcolor=red]; + 95 [label="Access variable R|/a|"]; + 96 [label="Enter safe call"]; + 97 [label="Access variable R|/B.x|"]; + 98 [label="Exit safe call"]; + 99 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_24 { color=blue - 99 [label="Enter when"]; + 100 [label="Enter when"]; subgraph cluster_25 { color=blue - 100 [label="Enter when branch condition "]; - 101 [label="Access variable R|/x|"]; - 102 [label="Const: Null(null)"]; - 103 [label="Operator !="]; - 104 [label="Exit when branch condition"]; + 101 [label="Enter when branch condition "]; + 102 [label="Access variable R|/x|"]; + 103 [label="Const: Null(null)"]; + 104 [label="Operator !="]; + 105 [label="Exit when branch condition"]; } - 105 [label="Synthetic else branch"]; - 106 [label="Enter when branch result"]; + 106 [label="Synthetic else branch"]; + 107 [label="Enter when branch result"]; subgraph cluster_26 { color=blue - 107 [label="Enter block"]; - 108 [label="Access variable R|/a|"]; - 109 [label="Function call: R|/a|.R|/B.bar|()"]; - 110 [label="Exit block"]; + 108 [label="Enter block"]; + 109 [label="Access variable R|/a|"]; + 110 [label="Function call: R|/a|.R|/B.bar|()"]; + 111 [label="Exit block"]; } - 111 [label="Exit when branch result"]; - 112 [label="Exit when"]; + 112 [label="Exit when branch result"]; + 113 [label="Exit when"]; } - 113 [label="Exit function test_1" style="filled" fillcolor=red]; + 114 [label="Exit function test_1" style="filled" fillcolor=red]; } - 93 -> {94}; - 94 -> {95 97}; - 95 -> {96}; + 94 -> {95}; + 95 -> {96 98}; 96 -> {97}; 97 -> {98}; 98 -> {99}; @@ -317,53 +318,53 @@ digraph assignSafeCall_kt { 101 -> {102}; 102 -> {103}; 103 -> {104}; - 104 -> {106 105}; - 105 -> {112}; - 106 -> {107}; + 104 -> {105}; + 105 -> {107 106}; + 106 -> {113}; 107 -> {108}; 108 -> {109}; 109 -> {110}; 110 -> {111}; 111 -> {112}; 112 -> {113}; + 113 -> {114}; subgraph cluster_27 { color=red - 114 [label="Enter function test_2" style="filled" fillcolor=red]; - 115 [label="Access variable R|/a|"]; - 116 [label="Enter safe call"]; - 117 [label="Function call: R|/a|?.R|/B.foo|()"]; - 118 [label="Exit safe call"]; - 119 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 115 [label="Enter function test_2" style="filled" fillcolor=red]; + 116 [label="Access variable R|/a|"]; + 117 [label="Enter safe call"]; + 118 [label="Function call: R|/a|?.R|/B.foo|()"]; + 119 [label="Exit safe call"]; + 120 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_28 { color=blue - 120 [label="Enter when"]; + 121 [label="Enter when"]; subgraph cluster_29 { color=blue - 121 [label="Enter when branch condition "]; - 122 [label="Access variable R|/x|"]; - 123 [label="Const: Null(null)"]; - 124 [label="Operator !="]; - 125 [label="Exit when branch condition"]; + 122 [label="Enter when branch condition "]; + 123 [label="Access variable R|/x|"]; + 124 [label="Const: Null(null)"]; + 125 [label="Operator !="]; + 126 [label="Exit when branch condition"]; } - 126 [label="Synthetic else branch"]; - 127 [label="Enter when branch result"]; + 127 [label="Synthetic else branch"]; + 128 [label="Enter when branch result"]; subgraph cluster_30 { color=blue - 128 [label="Enter block"]; - 129 [label="Access variable R|/a|"]; - 130 [label="Function call: R|/a|.R|/B.bar|()"]; - 131 [label="Exit block"]; + 129 [label="Enter block"]; + 130 [label="Access variable R|/a|"]; + 131 [label="Function call: R|/a|.R|/B.bar|()"]; + 132 [label="Exit block"]; } - 132 [label="Exit when branch result"]; - 133 [label="Exit when"]; + 133 [label="Exit when branch result"]; + 134 [label="Exit when"]; } - 134 [label="Exit function test_2" style="filled" fillcolor=red]; + 135 [label="Exit function test_2" style="filled" fillcolor=red]; } - 114 -> {115}; - 115 -> {116 118}; - 116 -> {117}; + 115 -> {116}; + 116 -> {117 119}; 117 -> {118}; 118 -> {119}; 119 -> {120}; @@ -372,65 +373,65 @@ digraph assignSafeCall_kt { 122 -> {123}; 123 -> {124}; 124 -> {125}; - 125 -> {127 126}; - 126 -> {133}; - 127 -> {128}; + 125 -> {126}; + 126 -> {128 127}; + 127 -> {134}; 128 -> {129}; 129 -> {130}; 130 -> {131}; 131 -> {132}; 132 -> {133}; 133 -> {134}; + 134 -> {135}; subgraph cluster_31 { color=red - 135 [label="Enter function test_3" style="filled" fillcolor=red]; + 136 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_32 { color=blue - 136 [label="Enter when"]; - 137 [label="Access variable R|/x|"]; - 138 [label="Type operator: (R|/x| as? R|B|)"]; - 139 [label="Variable declaration: lval : R|B?|"]; + 137 [label="Enter when"]; + 138 [label="Access variable R|/x|"]; + 139 [label="Type operator: (R|/x| as? R|B|)"]; + 140 [label="Variable declaration: lval : R|B?|"]; subgraph cluster_33 { color=blue - 140 [label="Enter when branch condition "]; - 141 [label="Const: Null(null)"]; - 142 [label="Operator =="]; - 143 [label="Exit when branch condition"]; + 141 [label="Enter when branch condition "]; + 142 [label="Const: Null(null)"]; + 143 [label="Operator =="]; + 144 [label="Exit when branch condition"]; } subgraph cluster_34 { color=blue - 144 [label="Enter when branch condition else"]; - 145 [label="Exit when branch condition"]; + 145 [label="Enter when branch condition else"]; + 146 [label="Exit when branch condition"]; } - 146 [label="Enter when branch result"]; + 147 [label="Enter when branch result"]; subgraph cluster_35 { color=blue - 147 [label="Enter block"]; - 148 [label="Access variable R|/|"]; - 149 [label="Exit block"]; + 148 [label="Enter block"]; + 149 [label="Access variable R|/|"]; + 150 [label="Exit block"]; } - 150 [label="Exit when branch result"]; - 151 [label="Enter when branch result"]; + 151 [label="Exit when branch result"]; + 152 [label="Enter when branch result"]; subgraph cluster_36 { color=blue - 152 [label="Enter block"]; - 153 [label="Jump: ^test_3 Unit"]; - 154 [label="Stub" style="filled" fillcolor=gray]; - 155 [label="Exit block" style="filled" fillcolor=gray]; + 153 [label="Enter block"]; + 154 [label="Jump: ^test_3 Unit"]; + 155 [label="Stub" style="filled" fillcolor=gray]; + 156 [label="Exit block" style="filled" fillcolor=gray]; } - 156 [label="Exit when branch result" style="filled" fillcolor=gray]; - 157 [label="Exit when"]; + 157 [label="Exit when branch result" style="filled" fillcolor=gray]; + 158 [label="Exit when"]; } - 158 [label="Variable declaration: lval a: R|B|"]; - 159 [label="Access variable R|/a|"]; - 160 [label="Function call: R|/a|.R|/B.foo|()"]; - 161 [label="Access variable R|/x|"]; - 162 [label="Function call: R|/x|.R|/B.foo|()"]; - 163 [label="Exit function test_3" style="filled" fillcolor=red]; + 159 [label="Variable declaration: lval a: R|B|"]; + 160 [label="Access variable R|/a|"]; + 161 [label="Function call: R|/a|.R|/B.foo|()"]; + 162 [label="Access variable R|/x|"]; + 163 [label="Function call: R|/x|.R|/B.foo|()"]; + 164 [label="Exit function test_3" style="filled" fillcolor=red]; } - 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; @@ -438,26 +439,27 @@ digraph assignSafeCall_kt { 140 -> {141}; 141 -> {142}; 142 -> {143}; - 143 -> {151 144}; - 144 -> {145}; + 143 -> {144}; + 144 -> {152 145}; 145 -> {146}; 146 -> {147}; 147 -> {148}; 148 -> {149}; 149 -> {150}; - 150 -> {157}; - 151 -> {152}; + 150 -> {151}; + 151 -> {158}; 152 -> {153}; - 153 -> {163}; - 153 -> {154} [style=dotted]; + 153 -> {154}; + 154 -> {164}; 154 -> {155} [style=dotted]; 155 -> {156} [style=dotted]; 156 -> {157} [style=dotted]; - 157 -> {158}; + 157 -> {158} [style=dotted]; 158 -> {159}; 159 -> {160}; 160 -> {161}; 161 -> {162}; 162 -> {163}; + 163 -> {164}; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/smartCastInInit.dot b/compiler/fir/resolve/testData/resolve/smartcasts/smartCastInInit.dot index 908bf8d840a..d4cd5f1786d 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/smartCastInInit.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/smartCastInInit.dot @@ -31,25 +31,27 @@ digraph smartCastInInit_kt { subgraph cluster_2 { color=red 8 [label="Enter function " style="filled" fillcolor=red]; - 9 [label="Exit function " style="filled" fillcolor=red]; + 9 [label="Delegated constructor call: super()"]; + 10 [label="Exit function " style="filled" fillcolor=red]; } 8 -> {9}; + 9 -> {10}; subgraph cluster_3 { color=red - 10 [label="Enter function getter" style="filled" fillcolor=red]; - 11 [label="Exit function getter" style="filled" fillcolor=red]; + 11 [label="Enter function getter" style="filled" fillcolor=red]; + 12 [label="Exit function getter" style="filled" fillcolor=red]; } - 10 -> {11}; + 11 -> {12}; subgraph cluster_4 { color=red - 12 [label="Enter property" style="filled" fillcolor=red]; - 13 [label="Exit property" style="filled" fillcolor=red]; + 13 [label="Enter property" style="filled" fillcolor=red]; + 14 [label="Exit property" style="filled" fillcolor=red]; } - 12 -> {13}; + 13 -> {14}; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/smartcastToNothing.dot b/compiler/fir/resolve/testData/resolve/smartcasts/smartcastToNothing.dot index 5496468a8bc..9077b674811 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/smartcastToNothing.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/smartcastToNothing.dot @@ -103,125 +103,126 @@ digraph smartcastToNothing_kt { subgraph cluster_7 { color=red 32 [label="Enter function " style="filled" fillcolor=red]; - 33 [label="Exit function " style="filled" fillcolor=red]; + 33 [label="Delegated constructor call: super()"]; + 34 [label="Exit function " style="filled" fillcolor=red]; } 32 -> {33}; + 33 -> {34}; subgraph cluster_8 { color=red - 34 [label="Enter function getter" style="filled" fillcolor=red]; - 35 [label="Exit function getter" style="filled" fillcolor=red]; + 35 [label="Enter function getter" style="filled" fillcolor=red]; + 36 [label="Exit function getter" style="filled" fillcolor=red]; } - 34 -> {35}; + 35 -> {36}; subgraph cluster_9 { color=red - 36 [label="Enter property" style="filled" fillcolor=red]; - 37 [label="Const: Int(1)"]; - 38 [label="Exit property" style="filled" fillcolor=red]; + 37 [label="Enter property" style="filled" fillcolor=red]; + 38 [label="Const: Int(1)"]; + 39 [label="Exit property" style="filled" fillcolor=red]; } - 36 -> {37}; 37 -> {38}; + 38 -> {39}; subgraph cluster_10 { color=red - 39 [label="Enter function getter" style="filled" fillcolor=red]; - 40 [label="Exit function getter" style="filled" fillcolor=red]; + 40 [label="Enter function getter" style="filled" fillcolor=red]; + 41 [label="Exit function getter" style="filled" fillcolor=red]; } - 39 -> {40}; + 40 -> {41}; subgraph cluster_11 { color=red - 41 [label="Enter property" style="filled" fillcolor=red]; - 42 [label="Const: Boolean(true)"]; - 43 [label="Exit property" style="filled" fillcolor=red]; + 42 [label="Enter property" style="filled" fillcolor=red]; + 43 [label="Const: Boolean(true)"]; + 44 [label="Exit property" style="filled" fillcolor=red]; } - 41 -> {42}; 42 -> {43}; + 43 -> {44}; subgraph cluster_12 { color=red - 44 [label="Enter function test_0" style="filled" fillcolor=red]; - 45 [label="Const: Null(null)"]; - 46 [label="Variable declaration: lvar s: R|A?|"]; - 47 [label="Access variable R|/results|"]; - 48 [label="Function call: R|/results|.R|FakeOverride|>|()"]; - 49 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + 45 [label="Enter function test_0" style="filled" fillcolor=red]; + 46 [label="Const: Null(null)"]; + 47 [label="Variable declaration: lvar s: R|A?|"]; + 48 [label="Access variable R|/results|"]; + 49 [label="Function call: R|/results|.R|FakeOverride|>|()"]; + 50 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; subgraph cluster_13 { color=blue - 50 [label="Enter while loop"]; + 51 [label="Enter while loop"]; subgraph cluster_14 { color=blue - 51 [label="Enter loop condition"]; - 52 [label="Access variable R|/|"]; - 53 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 54 [label="Exit loop condition"]; + 52 [label="Enter loop condition"]; + 53 [label="Access variable R|/|"]; + 54 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; + 55 [label="Exit loop condition"]; } subgraph cluster_15 { color=blue - 55 [label="Enter loop block"]; + 56 [label="Enter loop block"]; subgraph cluster_16 { color=blue - 56 [label="Enter block"]; - 57 [label="Access variable R|/|"]; - 58 [label="Function call: R|/|.R|FakeOverride|()"]; - 59 [label="Stub" style="filled" fillcolor=gray]; - 60 [label="Variable declaration: lval result: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 61 [label="Access variable R|/result|" style="filled" fillcolor=gray]; - 62 [label="Stub" style="filled" fillcolor=gray]; - 63 [label="Assignmenet: R|/s|" style="filled" fillcolor=gray]; + 57 [label="Enter block"]; + 58 [label="Access variable R|/|"]; + 59 [label="Function call: R|/|.R|FakeOverride|()"]; + 60 [label="Stub" style="filled" fillcolor=gray]; + 61 [label="Variable declaration: lval result: R|kotlin/Nothing|" style="filled" fillcolor=gray]; + 62 [label="Access variable R|/result|" style="filled" fillcolor=gray]; + 63 [label="Stub" style="filled" fillcolor=gray]; + 64 [label="Assignmenet: R|/s|" style="filled" fillcolor=gray]; subgraph cluster_17 { color=blue - 64 [label="Enter when" style="filled" fillcolor=gray]; + 65 [label="Enter when" style="filled" fillcolor=gray]; subgraph cluster_18 { color=blue - 65 [label="Enter when branch condition " style="filled" fillcolor=gray]; - 66 [label="Access variable R|/result|" style="filled" fillcolor=gray]; - 67 [label="Stub" style="filled" fillcolor=gray]; - 68 [label="Access variable #" style="filled" fillcolor=gray]; - 69 [label="Exit when branch condition" style="filled" fillcolor=gray]; + 66 [label="Enter when branch condition " style="filled" fillcolor=gray]; + 67 [label="Access variable R|/result|" style="filled" fillcolor=gray]; + 68 [label="Stub" style="filled" fillcolor=gray]; + 69 [label="Access variable #" style="filled" fillcolor=gray]; + 70 [label="Exit when branch condition" style="filled" fillcolor=gray]; } - 70 [label="Synthetic else branch" style="filled" fillcolor=gray]; - 71 [label="Enter when branch result" style="filled" fillcolor=gray]; + 71 [label="Synthetic else branch" style="filled" fillcolor=gray]; + 72 [label="Enter when branch result" style="filled" fillcolor=gray]; subgraph cluster_19 { color=blue - 72 [label="Enter block" style="filled" fillcolor=gray]; - 73 [label="Jump: break@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] " style="filled" fillcolor=gray]; - 74 [label="Stub" style="filled" fillcolor=gray]; - 75 [label="Exit block" style="filled" fillcolor=gray]; + 73 [label="Enter block" style="filled" fillcolor=gray]; + 74 [label="Jump: break@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] " style="filled" fillcolor=gray]; + 75 [label="Stub" style="filled" fillcolor=gray]; + 76 [label="Exit block" style="filled" fillcolor=gray]; } - 76 [label="Exit when branch result" style="filled" fillcolor=gray]; - 77 [label="Exit when" style="filled" fillcolor=gray]; + 77 [label="Exit when branch result" style="filled" fillcolor=gray]; + 78 [label="Exit when" style="filled" fillcolor=gray]; } - 78 [label="Exit block" style="filled" fillcolor=gray]; + 79 [label="Exit block" style="filled" fillcolor=gray]; } - 79 [label="Exit loop block" style="filled" fillcolor=gray]; + 80 [label="Exit loop block" style="filled" fillcolor=gray]; } - 80 [label="Exit whileloop"]; + 81 [label="Exit whileloop"]; } - 81 [label="Access variable R|/s|"]; - 82 [label="Enter safe call"]; - 83 [label="Postponed enter to lambda"]; + 82 [label="Access variable R|/s|"]; + 83 [label="Enter safe call"]; + 84 [label="Postponed enter to lambda"]; subgraph cluster_20 { color=blue - 84 [label="Enter function anonymousFunction"]; - 85 [label="Access variable R|/it|"]; - 86 [label="Access variable R|/A.a|"]; - 87 [label="Exit function anonymousFunction"]; + 85 [label="Enter function anonymousFunction"]; + 86 [label="Access variable R|/it|"]; + 87 [label="Access variable R|/A.a|"]; + 88 [label="Exit function anonymousFunction"]; } - 88 [label="Call arguments union" style="filled" fillcolor=yellow]; - 89 [label="Postponed exit from lambda"]; - 90 [label="Function call: R|/s|?.R|kotlin/let|(...)"]; - 91 [label="Exit safe call"]; - 92 [label="Exit function test_0" style="filled" fillcolor=red]; + 89 [label="Call arguments union" style="filled" fillcolor=yellow]; + 90 [label="Postponed exit from lambda"]; + 91 [label="Function call: R|/s|?.R|kotlin/let|(...)"]; + 92 [label="Exit safe call"]; + 93 [label="Exit function test_0" style="filled" fillcolor=red]; } - 44 -> {45}; 45 -> {46}; 46 -> {47}; 47 -> {48}; @@ -231,46 +232,47 @@ digraph smartcastToNothing_kt { 51 -> {52}; 52 -> {53}; 53 -> {54}; - 54 -> {80 55}; - 55 -> {56}; + 54 -> {55}; + 55 -> {81 56}; 56 -> {57}; 57 -> {58}; - 58 -> {92}; - 58 -> {59} [style=dotted]; + 58 -> {59}; + 59 -> {93}; 59 -> {60} [style=dotted]; 60 -> {61} [style=dotted]; - 61 -> {92 62} [style=dotted]; - 62 -> {63} [style=dotted]; + 61 -> {62} [style=dotted]; + 62 -> {93 63} [style=dotted]; 63 -> {64} [style=dotted]; 64 -> {65} [style=dotted]; 65 -> {66} [style=dotted]; - 66 -> {92 67} [style=dotted]; - 67 -> {68} [style=dotted]; + 66 -> {67} [style=dotted]; + 67 -> {93 68} [style=dotted]; 68 -> {69} [style=dotted]; - 69 -> {71 70} [style=dotted]; - 70 -> {77} [style=dotted]; - 71 -> {72} [style=dotted]; + 69 -> {70} [style=dotted]; + 70 -> {72 71} [style=dotted]; + 71 -> {78} [style=dotted]; 72 -> {73} [style=dotted]; - 73 -> {80 74} [style=dotted]; - 74 -> {75} [style=dotted]; + 73 -> {74} [style=dotted]; + 74 -> {81 75} [style=dotted]; 75 -> {76} [style=dotted]; 76 -> {77} [style=dotted]; 77 -> {78} [style=dotted]; 78 -> {79} [style=dotted]; - 79 -> {51} [style=dotted]; - 80 -> {81}; - 81 -> {82 91}; - 82 -> {83}; + 79 -> {80} [style=dotted]; + 80 -> {52} [style=dotted]; + 81 -> {82}; + 82 -> {83 92}; 83 -> {84}; - 83 -> {89} [color=red]; 84 -> {85}; + 84 -> {90} [color=red]; 85 -> {86}; 86 -> {87}; - 87 -> {89} [color=green]; - 87 -> {88} [color=red]; - 88 -> {90} [color=red]; - 89 -> {90} [color=green]; - 90 -> {91}; - 91 -> {92} [style=dotted]; + 87 -> {88}; + 88 -> {90} [color=green]; + 88 -> {89} [color=red]; + 89 -> {91} [color=red]; + 90 -> {91} [color=green]; + 91 -> {92}; + 92 -> {93} [style=dotted]; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/stability/overridenOpenVal.dot b/compiler/fir/resolve/testData/resolve/smartcasts/stability/overridenOpenVal.dot index 1ba679ee251..7e34ee23880 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/stability/overridenOpenVal.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/stability/overridenOpenVal.dot @@ -6,127 +6,131 @@ digraph overridenOpenVal_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function getter" style="filled" fillcolor=red]; - 3 [label="Exit function getter" style="filled" fillcolor=red]; + 3 [label="Enter function getter" style="filled" fillcolor=red]; + 4 [label="Exit function getter" style="filled" fillcolor=red]; } - 2 -> {3}; + 3 -> {4}; subgraph cluster_2 { color=red - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Access variable R|/x|"]; - 6 [label="Exit property" style="filled" fillcolor=red]; + 5 [label="Enter property" style="filled" fillcolor=red]; + 6 [label="Access variable R|/x|"]; + 7 [label="Exit property" style="filled" fillcolor=red]; } - 4 -> {5}; 5 -> {6}; + 6 -> {7}; subgraph cluster_3 { color=red - 7 [label="Enter function " style="filled" fillcolor=red]; - 8 [label="Access variable R|/x|"]; - 9 [label="Exit function " style="filled" fillcolor=red]; + 8 [label="Enter function " style="filled" fillcolor=red]; + 9 [label="Access variable R|/x|"]; + 10 [label="Delegated constructor call: super(...)"]; + 11 [label="Exit function " style="filled" fillcolor=red]; } - 7 -> {8}; 8 -> {9}; + 9 -> {10}; + 10 -> {11}; subgraph cluster_4 { color=red - 10 [label="Enter function test_1" style="filled" fillcolor=red]; + 12 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 11 [label="Enter when"]; + 13 [label="Enter when"]; subgraph cluster_6 { color=blue - 12 [label="Enter when branch condition "]; - 13 [label="Access variable R|/A.x|"]; - 14 [label="Type operator: (this@R|/B|.R|/A.x| is R|kotlin/String|)"]; - 15 [label="Exit when branch condition"]; + 14 [label="Enter when branch condition "]; + 15 [label="Access variable R|/A.x|"]; + 16 [label="Type operator: (this@R|/B|.R|/A.x| is R|kotlin/String|)"]; + 17 [label="Exit when branch condition"]; } - 16 [label="Synthetic else branch"]; - 17 [label="Enter when branch result"]; + 18 [label="Synthetic else branch"]; + 19 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 18 [label="Enter block"]; - 19 [label="Access variable R|/A.x|"]; - 20 [label="Access variable R|kotlin/String.length|"]; - 21 [label="Exit block"]; + 20 [label="Enter block"]; + 21 [label="Access variable R|/A.x|"]; + 22 [label="Access variable R|kotlin/String.length|"]; + 23 [label="Exit block"]; } - 22 [label="Exit when branch result"]; - 23 [label="Exit when"]; + 24 [label="Exit when branch result"]; + 25 [label="Exit when"]; } - 24 [label="Exit function test_1" style="filled" fillcolor=red]; + 26 [label="Exit function test_1" style="filled" fillcolor=red]; } - 10 -> {11}; - 11 -> {12}; 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {17 16}; - 16 -> {23}; - 17 -> {18}; - 18 -> {19}; + 15 -> {16}; + 16 -> {17}; + 17 -> {19 18}; + 18 -> {25}; 19 -> {20}; 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; + 24 -> {25}; + 25 -> {26}; subgraph cluster_8 { color=red - 25 [label="Enter function test_2" style="filled" fillcolor=red]; + 27 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_9 { color=blue - 26 [label="Enter when"]; + 28 [label="Enter when"]; subgraph cluster_10 { color=blue - 27 [label="Enter when branch condition "]; - 28 [label="Access variable R|/b|"]; - 29 [label="Access variable R|/A.x|"]; - 30 [label="Type operator: (R|/b|.R|/A.x| is R|kotlin/String|)"]; - 31 [label="Exit when branch condition"]; + 29 [label="Enter when branch condition "]; + 30 [label="Access variable R|/b|"]; + 31 [label="Access variable R|/A.x|"]; + 32 [label="Type operator: (R|/b|.R|/A.x| is R|kotlin/String|)"]; + 33 [label="Exit when branch condition"]; } - 32 [label="Synthetic else branch"]; - 33 [label="Enter when branch result"]; + 34 [label="Synthetic else branch"]; + 35 [label="Enter when branch result"]; subgraph cluster_11 { color=blue - 34 [label="Enter block"]; - 35 [label="Access variable R|/b|"]; - 36 [label="Access variable R|/A.x|"]; - 37 [label="Access variable R|kotlin/String.length|"]; - 38 [label="Exit block"]; + 36 [label="Enter block"]; + 37 [label="Access variable R|/b|"]; + 38 [label="Access variable R|/A.x|"]; + 39 [label="Access variable R|kotlin/String.length|"]; + 40 [label="Exit block"]; } - 39 [label="Exit when branch result"]; - 40 [label="Exit when"]; + 41 [label="Exit when branch result"]; + 42 [label="Exit when"]; } - 41 [label="Exit function test_2" style="filled" fillcolor=red]; + 43 [label="Exit function test_2" style="filled" fillcolor=red]; } - 25 -> {26}; - 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; - 31 -> {33 32}; - 32 -> {40}; - 33 -> {34}; - 34 -> {35}; + 31 -> {32}; + 32 -> {33}; + 33 -> {35 34}; + 34 -> {42}; 35 -> {36}; 36 -> {37}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; + 41 -> {42}; + 42 -> {43}; } diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/variables/delayedAssignment.dot b/compiler/fir/resolve/testData/resolve/smartcasts/variables/delayedAssignment.dot index d278af32553..44420933d7f 100644 --- a/compiler/fir/resolve/testData/resolve/smartcasts/variables/delayedAssignment.dot +++ b/compiler/fir/resolve/testData/resolve/smartcasts/variables/delayedAssignment.dot @@ -6,79 +6,80 @@ digraph delayedAssignment_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function foo" style="filled" fillcolor=red]; - 3 [label="Exit function foo" style="filled" fillcolor=red]; + 3 [label="Enter function foo" style="filled" fillcolor=red]; + 4 [label="Exit function foo" style="filled" fillcolor=red]; } - 2 -> {3}; + 3 -> {4}; subgraph cluster_2 { color=red - 4 [label="Enter function test" style="filled" fillcolor=red]; - 5 [label="Variable declaration: lval a: R|A?|"]; + 5 [label="Enter function test" style="filled" fillcolor=red]; + 6 [label="Variable declaration: lval a: R|A?|"]; subgraph cluster_3 { color=blue - 6 [label="Enter when"]; + 7 [label="Enter when"]; subgraph cluster_4 { color=blue - 7 [label="Enter when branch condition "]; - 8 [label="Access variable R|/b|"]; - 9 [label="Exit when branch condition"]; + 8 [label="Enter when branch condition "]; + 9 [label="Access variable R|/b|"]; + 10 [label="Exit when branch condition"]; } subgraph cluster_5 { color=blue - 10 [label="Enter when branch condition else"]; - 11 [label="Exit when branch condition"]; + 11 [label="Enter when branch condition else"]; + 12 [label="Exit when branch condition"]; } - 12 [label="Enter when branch result"]; + 13 [label="Enter when branch result"]; subgraph cluster_6 { color=blue - 13 [label="Enter block"]; - 14 [label="Const: Null(null)"]; - 15 [label="Assignmenet: R|/a|"]; - 16 [label="Exit block"]; + 14 [label="Enter block"]; + 15 [label="Const: Null(null)"]; + 16 [label="Assignmenet: R|/a|"]; + 17 [label="Exit block"]; } - 17 [label="Exit when branch result"]; - 18 [label="Enter when branch result"]; + 18 [label="Exit when branch result"]; + 19 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 19 [label="Enter block"]; - 20 [label="Function call: R|/A.A|()"]; - 21 [label="Assignmenet: R|/a|"]; - 22 [label="Access variable R|/a|"]; - 23 [label="Function call: R|/a|.R|/A.foo|()"]; - 24 [label="Exit block"]; + 20 [label="Enter block"]; + 21 [label="Function call: R|/A.A|()"]; + 22 [label="Assignmenet: R|/a|"]; + 23 [label="Access variable R|/a|"]; + 24 [label="Function call: R|/a|.R|/A.foo|()"]; + 25 [label="Exit block"]; } - 25 [label="Exit when branch result"]; - 26 [label="Exit when"]; + 26 [label="Exit when branch result"]; + 27 [label="Exit when"]; } - 27 [label="Access variable R|/a|"]; - 28 [label="Function call: R|/a|.#()"]; - 29 [label="Exit function test" style="filled" fillcolor=red]; + 28 [label="Access variable R|/a|"]; + 29 [label="Function call: R|/a|.#()"]; + 30 [label="Exit function test" style="filled" fillcolor=red]; } - 4 -> {5}; 5 -> {6}; 6 -> {7}; 7 -> {8}; 8 -> {9}; - 9 -> {18 10}; - 10 -> {11}; + 9 -> {10}; + 10 -> {19 11}; 11 -> {12}; 12 -> {13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {26}; - 18 -> {19}; + 17 -> {18}; + 18 -> {27}; 19 -> {20}; 20 -> {21}; 21 -> {22}; @@ -89,5 +90,6 @@ digraph delayedAssignment_kt { 26 -> {27}; 27 -> {28}; 28 -> {29}; + 29 -> {30}; } diff --git a/compiler/fir/resolve/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot b/compiler/fir/resolve/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot index 528016bcf69..e4055329a54 100644 --- a/compiler/fir/resolve/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot +++ b/compiler/fir/resolve/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot @@ -6,165 +6,173 @@ digraph delegateWithAnonymousObject_kt { subgraph cluster_0 { color=red 0 [label="Enter function " style="filled" fillcolor=red]; - 1 [label="Exit function " style="filled" fillcolor=red]; + 1 [label="Delegated constructor call: super()"]; + 2 [label="Exit function " style="filled" fillcolor=red]; } 0 -> {1}; + 1 -> {2}; subgraph cluster_1 { color=red - 2 [label="Enter function delegate" style="filled" fillcolor=red]; - 3 [label="Const: Null(null)"]; - 4 [label="Check not null: Null(null)!!"]; - 5 [label="Jump: ^delegate Null(null)!!"]; - 6 [label="Stub" style="filled" fillcolor=gray]; - 7 [label="Exit function delegate" style="filled" fillcolor=red]; + 3 [label="Enter function delegate" style="filled" fillcolor=red]; + 4 [label="Const: Null(null)"]; + 5 [label="Check not null: Null(null)!!"]; + 6 [label="Jump: ^delegate Null(null)!!"]; + 7 [label="Stub" style="filled" fillcolor=gray]; + 8 [label="Exit function delegate" style="filled" fillcolor=red]; } - 2 -> {3}; 3 -> {4}; 4 -> {5}; - 5 -> {7}; - 5 -> {6} [style=dotted]; + 5 -> {6}; + 6 -> {8}; 6 -> {7} [style=dotted]; + 7 -> {8} [style=dotted]; subgraph cluster_2 { color=red - 8 [label="Enter function " style="filled" fillcolor=red]; - 9 [label="Exit function " style="filled" fillcolor=red]; + 9 [label="Enter function " style="filled" fillcolor=red]; + 10 [label="Delegated constructor call: super|>()"]; + 11 [label="Exit function " style="filled" fillcolor=red]; } - 8 -> {9}; + 9 -> {10}; + 10 -> {11}; subgraph cluster_3 { color=red - 10 [label="Enter function updateFrom" style="filled" fillcolor=red]; - 11 [label="Exit function updateFrom" style="filled" fillcolor=red]; - } - - 10 -> {11}; - - subgraph cluster_4 { - color=red - 12 [label="Enter function " style="filled" fillcolor=red]; - 13 [label="Exit function " style="filled" fillcolor=red]; + 12 [label="Enter function updateFrom" style="filled" fillcolor=red]; + 13 [label="Exit function updateFrom" style="filled" fillcolor=red]; } 12 -> {13}; - subgraph cluster_5 { + subgraph cluster_4 { color=red - 14 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 15 [label="Exit anonymous object"]; - 16 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 14 [label="Enter function " style="filled" fillcolor=red]; + 15 [label="Delegated constructor call: super|>()"]; + 16 [label="Exit function " style="filled" fillcolor=red]; } 14 -> {15}; 15 -> {16}; - subgraph cluster_6 { + subgraph cluster_5 { color=red - 17 [label="Enter function " style="filled" fillcolor=red]; - 18 [label="Exit function " style="filled" fillcolor=red]; + 17 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + 18 [label="Exit anonymous object"]; + 19 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } 17 -> {18}; + 18 -> {19}; + + subgraph cluster_6 { + color=red + 20 [label="Enter function " style="filled" fillcolor=red]; + 21 [label="Delegated constructor call: super()"]; + 22 [label="Exit function " style="filled" fillcolor=red]; + } + + 20 -> {21}; + 21 -> {22}; subgraph cluster_7 { color=red - 19 [label="Enter function getValue" style="filled" fillcolor=red]; - 20 [label="Function call: R|/IssueListView.IssueListView|()"]; - 21 [label="Jump: ^getValue R|/IssueListView.IssueListView|()"]; - 22 [label="Stub" style="filled" fillcolor=gray]; - 23 [label="Exit function getValue" style="filled" fillcolor=red]; + 23 [label="Enter function getValue" style="filled" fillcolor=red]; + 24 [label="Function call: R|/IssueListView.IssueListView|()"]; + 25 [label="Jump: ^getValue R|/IssueListView.IssueListView|()"]; + 26 [label="Stub" style="filled" fillcolor=gray]; + 27 [label="Exit function getValue" style="filled" fillcolor=red]; } - 19 -> {20}; - 20 -> {21}; - 21 -> {23}; - 21 -> {22} [style=dotted]; - 22 -> {23} [style=dotted]; + 23 -> {24}; + 24 -> {25}; + 25 -> {27}; + 25 -> {26} [style=dotted]; + 26 -> {27} [style=dotted]; subgraph cluster_8 { color=red - 24 [label="Enter function setValue" style="filled" fillcolor=red]; - 25 [label="Function call: R|/IssueListView.IssueListView|()"]; - 26 [label="Access variable R|/value|"]; - 27 [label="Function call: R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(...)"]; - 28 [label="Jump: ^setValue R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(R|/value|)"]; - 29 [label="Stub" style="filled" fillcolor=gray]; - 30 [label="Exit function setValue" style="filled" fillcolor=red]; + 28 [label="Enter function setValue" style="filled" fillcolor=red]; + 29 [label="Function call: R|/IssueListView.IssueListView|()"]; + 30 [label="Access variable R|/value|"]; + 31 [label="Function call: R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(...)"]; + 32 [label="Jump: ^setValue R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(R|/value|)"]; + 33 [label="Stub" style="filled" fillcolor=gray]; + 34 [label="Exit function setValue" style="filled" fillcolor=red]; } - 24 -> {25}; - 25 -> {26}; - 26 -> {27}; - 27 -> {28}; - 28 -> {30}; - 28 -> {29} [style=dotted]; - 29 -> {30} [style=dotted]; + 28 -> {29}; + 29 -> {30}; + 30 -> {31}; + 31 -> {32}; + 32 -> {34}; + 32 -> {33} [style=dotted]; + 33 -> {34} [style=dotted]; subgraph cluster_9 { color=red - 31 [label="Enter function getter" style="filled" fillcolor=red]; - 32 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 33 [label="Access variable this@R|/IssuesListUserProfile|"]; - 34 [label="Function call: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; - 35 [label="Jump: ^ D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; - 36 [label="Stub" style="filled" fillcolor=gray]; - 37 [label="Exit function getter" style="filled" fillcolor=red]; + 35 [label="Enter function getter" style="filled" fillcolor=red]; + 36 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; + 37 [label="Access variable this@R|/IssuesListUserProfile|"]; + 38 [label="Function call: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; + 39 [label="Jump: ^ D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; + 40 [label="Stub" style="filled" fillcolor=gray]; + 41 [label="Exit function getter" style="filled" fillcolor=red]; } - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {35}; - 35 -> {37}; - 35 -> {36} [style=dotted]; - 36 -> {37} [style=dotted]; + 35 -> {36}; + 36 -> {37}; + 37 -> {38}; + 38 -> {39}; + 39 -> {41}; + 39 -> {40} [style=dotted]; + 40 -> {41} [style=dotted]; subgraph cluster_10 { color=red - 38 [label="Enter function setter" style="filled" fillcolor=red]; - 39 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 40 [label="Access variable this@R|/IssuesListUserProfile|"]; - 41 [label="Access variable R|/issueListView|"]; - 42 [label="Function call: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; - 43 [label="Exit function setter" style="filled" fillcolor=red]; + 42 [label="Enter function setter" style="filled" fillcolor=red]; + 43 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; + 44 [label="Access variable this@R|/IssuesListUserProfile|"]; + 45 [label="Access variable R|/issueListView|"]; + 46 [label="Function call: D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; + 47 [label="Exit function setter" style="filled" fillcolor=red]; } - 38 -> {39}; - 39 -> {40}; - 40 -> {41}; - 41 -> {42}; 42 -> {43}; + 43 -> {44}; + 44 -> {45}; + 45 -> {46}; + 46 -> {47}; subgraph cluster_11 { color=red - 44 [label="Enter property" style="filled" fillcolor=red]; - 45 [label="Postponed enter to lambda"]; - 46 [label="Postponed exit from lambda"]; - 47 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; - 48 [label="Access variable this@R|/IssuesListUserProfile|"]; - 49 [label="Access variable this@R|/IssuesListUserProfile|"]; - 50 [label="Access variable this@R|/IssuesListUserProfile|"]; - 51 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...).#(...)"]; - 52 [label="Postponed enter to lambda"]; - 53 [label="Postponed exit from lambda"]; - 54 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; - 55 [label="Exit property" style="filled" fillcolor=red]; + 48 [label="Enter property" style="filled" fillcolor=red]; + 49 [label="Postponed enter to lambda"]; + 50 [label="Postponed exit from lambda"]; + 51 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; + 52 [label="Access variable this@R|/IssuesListUserProfile|"]; + 53 [label="Access variable this@R|/IssuesListUserProfile|"]; + 54 [label="Access variable this@R|/IssuesListUserProfile|"]; + 55 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...).#(...)"]; + 56 [label="Postponed enter to lambda"]; + 57 [label="Postponed exit from lambda"]; + 58 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; + 59 [label="Exit property" style="filled" fillcolor=red]; } - 44 -> {45}; - 45 -> {46 46} [color=green]; - 46 -> {47}; - 47 -> {48}; 48 -> {49}; - 49 -> {50}; + 49 -> {50 50} [color=green]; 50 -> {51}; 51 -> {52}; - 52 -> {53 53} [color=green]; + 52 -> {53}; 53 -> {54}; 54 -> {55}; + 55 -> {56}; + 56 -> {57 57} [color=green]; + 57 -> {58}; + 58 -> {59}; } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index 545419afdce..3c4087eab0c 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -606,6 +606,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/resolve/testData/resolve/cfg/loops.kt"); } + @TestMetadata("postponedLambdaInConstructor.kt") + public void testPostponedLambdaInConstructor() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/cfg/postponedLambdaInConstructor.kt"); + } + @TestMetadata("postponedLambdas.kt") public void testPostponedLambdas() throws Exception { runTest("compiler/fir/resolve/testData/resolve/cfg/postponedLambdas.kt"); diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index f969031e1cd..0c129ccd970 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -581,6 +581,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/resolve/testData/resolve/cfg/initBlockAndInPlaceLambda.kt"); } + @TestMetadata("inplaceLambdaInControlFlowExpressions.kt") + public void testInplaceLambdaInControlFlowExpressions() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.kt"); + } + @TestMetadata("jumps.kt") public void testJumps() throws Exception { runTest("compiler/fir/resolve/testData/resolve/cfg/jumps.kt");