From 87859b0faa0298e3167980a4e626c01a62cf3f16 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 5 Jun 2020 15:47:57 +0300 Subject: [PATCH] [FIR] Introduce new algorithm for building CFG for declarations --- .../resolve/cfg/annotatedLocalClass.dot | 104 +- .../testData/resolve/cfg/binaryOperations.dot | 370 +-- .../cfg/booleanOperatorsWithConsts.dot | 700 ++--- .../testData/resolve/cfg/complex.dot | 381 +-- .../testData/resolve/cfg/defaultArguments.dot | 85 + .../testData/resolve/cfg/defaultArguments.kt | 7 + .../testData/resolve/cfg/defaultArguments.txt | 10 + .../testData/resolve/cfg/emptyWhen.dot | 85 +- .../resolve/cfg/flowFromInplaceLambda.dot | 871 +++--- .../testData/resolve/cfg/initBlock.dot | 16 +- .../resolve/cfg/initBlockAndInPlaceLambda.dot | 89 +- .../cfg/innerClassInAnonymousObject.dot | 53 +- .../cfg/innerClassInAnonymousObject.txt | 6 +- .../inplaceLambdaInControlFlowExpressions.dot | 327 ++- .../testData/resolve/cfg/jumps.dot | 596 +++-- .../resolve/cfg/lambdaAsReturnOfLambda.dot | 147 +- .../resolve/cfg/lambdaReturningObject.dot | 123 +- .../testData/resolve/cfg/lambdas.dot | 395 +-- .../resolve/cfg/localClassesWithImplicit.dot | 700 ++--- .../testData/resolve/cfg/loops.dot | 829 +++--- .../cfg/postponedLambdaInConstructor.dot | 91 +- .../testData/resolve/cfg/postponedLambdas.dot | 65 +- .../resolve/cfg/propertiesAndInitBlocks.dot | 474 ++-- .../resolve/cfg/propertiesAndInitBlocks.kt | 4 +- .../resolve/cfg/propertiesAndInitBlocks.txt | 8 +- .../resolve/cfg/returnValuesFromLambda.dot | 261 +- .../testData/resolve/cfg/safeCalls.dot | 134 +- .../testData/resolve/cfg/simple.dot | 44 +- .../testData/resolve/cfg/tryCatch.dot | 455 ++-- .../testData/resolve/cfg/when.dot | 298 ++- .../resolve/exhaustiveWhenAndDNNType.dot | 462 ++-- .../problems/secondaryConstructorCfg.dot | 96 +- .../testData/resolve/smartcasts/bangbang.dot | 618 +++-- .../smartcasts/booleans/booleanOperators.dot | 1324 +++++----- .../smartcasts/booleans/equalsToBoolean.dot | 880 +++--- .../booleans/jumpFromRhsOfOperator.dot | 722 ++--- .../boundSmartcasts/boundSmartcasts.dot | 757 +++--- .../boundSmartcastsInBranches.dot | 1221 +++++---- .../boundSmartcasts/functionCallBound.dot | 167 +- .../testData/resolve/smartcasts/casts.dot | 550 ++-- .../smartcasts/controlStructures/elvis.dot | 406 +-- .../smartcasts/controlStructures/returns.dot | 757 +++--- .../smartcasts/controlStructures/simpleIf.dot | 269 +- .../smartcastFromArgument.dot | 176 +- .../smartcasts/controlStructures/when.dot | 926 +++---- .../resolve/smartcasts/equalsAndIdentity.dot | 465 ++-- .../smartcasts/lambdas/inPlaceLambdas.dot | 294 ++- .../smartcasts/lambdas/smartcastOnLambda.dot | 53 +- .../loops/dataFlowInfoFromWhileCondition.dot | 93 +- .../resolve/smartcasts/loops/endlessLoops.dot | 991 +++---- .../resolve/smartcasts/multipleCasts.dot | 193 +- .../resolve/smartcasts/nullability.dot | 2348 +++++++++-------- .../implicitReceiverAsWhenSubject.dot | 272 +- .../receivers/implicitReceivers.dot | 898 ++++--- .../receivers/thisOfExtensionProperty.dot | 142 +- .../smartcasts/safeCalls/assignSafeCall.dot | 777 +++--- .../safeCalls/safeCallAndEqualityToBool.dot | 483 ++-- .../smartcasts/safeCalls/safeCalls.dot | 446 ++-- .../resolve/smartcasts/safeCalls/safeCalls.kt | 2 +- .../smartcasts/safeCalls/safeCalls.txt | 3 +- .../resolve/smartcasts/smartCastInInit.dot | 81 +- .../resolve/smartcasts/smartcastToNothing.dot | 461 ++-- .../smartcasts/stability/overridenOpenVal.dot | 153 +- .../variables/delayedAssignment.dot | 124 +- .../variables/smartcastAfterReassignment.dot | 151 +- .../resolveWithStdlib/complexPostponedCfg.dot | 186 +- .../contracts/fromLibrary/callsInPlace.dot | 595 +++-- .../fromLibrary/conditionalEffects.dot | 526 ++-- .../good/callsInPlace/atLeastOnce.dot | 152 +- .../good/callsInPlace/atMostOnce.dot | 150 +- .../good/callsInPlace/exactlyOnce.dot | 168 +- .../fromSource/good/callsInPlace/unknown.dot | 154 +- .../delegates/delegateWithAnonymousObject.dot | 307 ++- .../smartcasts/tryWithLambdaInside.dot | 309 ++- .../fir/FirDiagnosticsTestGenerated.java | 5 + ...DiagnosticsWithLightTreeTestGenerated.java | 5 + .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 44 +- .../jetbrains/kotlin/fir/resolve/dfa/Stack.kt | 1 + .../kotlin/fir/resolve/dfa/cfg/CFGNode.kt | 98 +- .../fir/resolve/dfa/cfg/CFGNodeRenderer.kt | 3 + .../fir/resolve/dfa/cfg/ControlFlowGraph.kt | 10 +- .../dfa/cfg/ControlFlowGraphBuilder.kt | 847 +++--- .../dfa/cfg/ControlFlowGraphNodeBuilder.kt | 153 +- .../dfa/cfg/ControlFlowGraphRenderer.kt | 16 +- .../dfa/cfg/ControlFlowGraphVisitor.kt | 10 + .../jetbrains/kotlin/fir/resolve/dfa/util.kt | 2 + .../FirDeclarationsResolveTransformer.kt | 23 +- .../fir/declarations/FirDeclarationUtil.kt | 1 + .../box/assert/jvm/lambdaNotEvaluated.kt | 1 - .../reflection/enclosing/lambdaInLambda.kt | 1 - ...anonymousFunAsLastExpressionInBlock.fir.kt | 2 +- .../tests/smartCasts/kt32358_1.fir.kt | 2 +- .../tests/smartCasts/kt32358_2.fir.kt | 2 +- .../smartCasts/loops/doWhileLiteral.fir.kt | 2 +- .../kotlin/fir/AbstractFirDiagnosticTest.kt | 5 +- 95 files changed, 16070 insertions(+), 13199 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.dot create mode 100644 compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.kt create mode 100644 compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.txt diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/annotatedLocalClass.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/annotatedLocalClass.dot index 8a5ee80605d..ec3f4697a9b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/annotatedLocalClass.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/annotatedLocalClass.dot @@ -14,85 +14,91 @@ digraph annotatedLocalClass_kt { subgraph cluster_1 { color=red - 3 [label="Enter class Ann" style="filled" fillcolor=red]; - 4 [label="Exit class Ann" style="filled" fillcolor=red]; + 4 [label="Enter class Ann" style="filled" fillcolor=red]; + 3 [label="Exit class Ann" style="filled" fillcolor=red]; } - 3 -> {4} [color=green]; + 4 -> {3} [color=green]; subgraph cluster_2 { color=red 5 [label="Enter function foo" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 7 [label="Enter when"]; - subgraph cluster_4 { - color=blue - 9 [label="Enter when branch condition "]; - 10 [label="Access variable R|/b|"]; - 11 [label="Exit when branch condition"]; - } - 18 [label="Synthetic else branch"]; - 12 [label="Enter when branch result"]; + 24 [label="Enter class Local" style="filled" fillcolor=red]; + 23 [label="Exit class Local" style="filled" fillcolor=red]; + } + subgraph cluster_4 { + color=blue + 7 [label="Enter block"]; subgraph cluster_5 { color=blue - 13 [label="Enter block"]; - 14 [label="Jump: ^foo Unit"]; - 15 [label="Stub" style="filled" fillcolor=gray]; - 16 [label="Exit block" style="filled" fillcolor=gray]; + 8 [label="Enter when"]; + subgraph cluster_6 { + color=blue + 10 [label="Enter when branch condition "]; + 11 [label="Access variable R|/b|"]; + 12 [label="Exit when branch condition"]; + } + 19 [label="Synthetic else branch"]; + 13 [label="Enter when branch result"]; + subgraph cluster_7 { + color=blue + 14 [label="Enter block"]; + 15 [label="Jump: ^foo Unit"]; + 16 [label="Stub" style="filled" fillcolor=gray]; + 17 [label="Exit block" style="filled" fillcolor=gray]; + } + 18 [label="Exit when branch result" style="filled" fillcolor=gray]; + 9 [label="Exit when"]; } - 17 [label="Exit when branch result" style="filled" fillcolor=gray]; - 8 [label="Exit when"]; + 20 [label="Exit local class foo"]; + 21 [label="Function call: R|/bar|()"]; + 22 [label="Exit block"]; } - subgraph cluster_6 { - color=blue - 19 [label="Enter annotation"]; - 20 [label="Exit annotation"]; - } - 21 [label="Exit local class foo"]; - 22 [label="Function call: R|/bar|()"]; 6 [label="Exit function foo" style="filled" fillcolor=red]; } 5 -> {7}; - 7 -> {9}; - 8 -> {19}; - 9 -> {10}; + 7 -> {8}; + 8 -> {10}; + 9 -> {20}; + 9 -> {25} [color=red]; 10 -> {11}; - 11 -> {12 18}; - 12 -> {13}; + 11 -> {12}; + 12 -> {13 19}; 13 -> {14}; - 14 -> {6}; - 14 -> {15} [style=dotted]; + 14 -> {15}; + 15 -> {6}; 15 -> {16} [style=dotted]; 16 -> {17} [style=dotted]; - 17 -> {8} [style=dotted]; - 18 -> {8}; - 19 -> {20}; + 17 -> {18} [style=dotted]; + 18 -> {9} [style=dotted]; + 19 -> {9}; 20 -> {21}; - 20 -> {23} [color=red]; 21 -> {22}; 22 -> {6}; - - subgraph cluster_7 { - color=red - 23 [label="Enter function " style="filled" fillcolor=red]; - 25 [label="Delegated constructor call: super()"]; - 24 [label="Exit function " style="filled" fillcolor=red]; - } - 23 -> {25}; - 25 -> {24}; + 24 -> {23} [color=green]; subgraph cluster_8 { color=red - 26 [label="Enter class Local" style="filled" fillcolor=red]; - 27 [label="Exit class Local" style="filled" fillcolor=red]; + 25 [label="Enter function " style="filled" fillcolor=red]; + 27 [label="Delegated constructor call: super()"]; + 26 [label="Exit function " style="filled" fillcolor=red]; } - 26 -> {27} [color=green]; + 25 -> {27}; + 27 -> {26}; subgraph cluster_9 { color=red 28 [label="Enter function bar" style="filled" fillcolor=red]; + subgraph cluster_10 { + color=blue + 30 [label="Enter block"]; + 31 [label="Exit block"]; + } 29 [label="Exit function bar" style="filled" fillcolor=red]; } - 28 -> {29}; + 28 -> {30}; + 30 -> {31}; + 31 -> {29}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/binaryOperations.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/binaryOperations.dot index b530ffdfa23..d18fe558b4f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/binaryOperations.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/binaryOperations.dot @@ -8,229 +8,257 @@ digraph binaryOperations_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Enter when branch condition "]; + 3 [label="Enter when"]; subgraph cluster_3 { color=blue - 6 [label="Enter ||"]; - 7 [label="Access variable R|/b1|"]; - 8 [label="Exit left part of ||"]; - 9 [label="Enter right part of ||"]; - 10 [label="Access variable R|/b2|"]; - 5 [label="Exit ||"]; + 5 [label="Enter when branch condition "]; + subgraph cluster_4 { + color=blue + 7 [label="Enter ||"]; + 8 [label="Access variable R|/b1|"]; + 9 [label="Exit left part of ||"]; + 10 [label="Enter right part of ||"]; + 11 [label="Access variable R|/b2|"]; + 6 [label="Exit ||"]; + } + 12 [label="Exit when branch condition"]; } - 11 [label="Exit when branch condition"]; + 18 [label="Synthetic else branch"]; + 13 [label="Enter when branch result"]; + subgraph cluster_5 { + color=blue + 14 [label="Enter block"]; + 15 [label="Const: Int(1)"]; + 16 [label="Exit block"]; + } + 17 [label="Exit when branch result"]; + 4 [label="Exit when"]; } - 17 [label="Synthetic else branch"]; - 12 [label="Enter when branch result"]; - subgraph cluster_4 { - color=blue - 13 [label="Enter block"]; - 14 [label="Const: Int(1)"]; - 15 [label="Exit block"]; - } - 16 [label="Exit when branch result"]; - 3 [label="Exit when"]; + 19 [label="Exit block"]; } 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {1}; - 4 -> {6}; - 5 -> {11}; - 6 -> {7}; + 2 -> {3}; + 3 -> {5}; + 4 -> {19}; + 5 -> {7}; + 6 -> {12}; 7 -> {8}; - 8 -> {5 9}; - 9 -> {10}; - 10 -> {5}; - 11 -> {12 17}; - 12 -> {13}; + 8 -> {9}; + 9 -> {6 10}; + 10 -> {11}; + 11 -> {6}; + 12 -> {13 18}; 13 -> {14}; 14 -> {15}; 15 -> {16}; - 16 -> {3}; - 17 -> {3}; + 16 -> {17}; + 17 -> {4}; + 18 -> {4}; + 19 -> {1}; - subgraph cluster_5 { + subgraph cluster_6 { color=red - 18 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_6 { + 20 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_7 { color=blue - 20 [label="Enter when"]; - subgraph cluster_7 { + 22 [label="Enter block"]; + subgraph cluster_8 { color=blue - 22 [label="Enter when branch condition "]; - subgraph cluster_8 { + 23 [label="Enter when"]; + subgraph cluster_9 { color=blue - 24 [label="Enter &&"]; - 25 [label="Access variable R|/b1|"]; - 26 [label="Exit left part of &&"]; - 27 [label="Enter right part of &&"]; - 28 [label="Access variable R|/b2|"]; - 23 [label="Exit &&"]; + 25 [label="Enter when branch condition "]; + subgraph cluster_10 { + color=blue + 27 [label="Enter &&"]; + 28 [label="Access variable R|/b1|"]; + 29 [label="Exit left part of &&"]; + 30 [label="Enter right part of &&"]; + 31 [label="Access variable R|/b2|"]; + 26 [label="Exit &&"]; + } + 32 [label="Exit when branch condition"]; } - 29 [label="Exit when branch condition"]; + 38 [label="Synthetic else branch"]; + 33 [label="Enter when branch result"]; + subgraph cluster_11 { + color=blue + 34 [label="Enter block"]; + 35 [label="Const: Int(1)"]; + 36 [label="Exit block"]; + } + 37 [label="Exit when branch result"]; + 24 [label="Exit when"]; } - 35 [label="Synthetic else branch"]; - 30 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 31 [label="Enter block"]; - 32 [label="Const: Int(1)"]; - 33 [label="Exit block"]; - } - 34 [label="Exit when branch result"]; - 21 [label="Exit when"]; + 39 [label="Exit block"]; } - 19 [label="Exit function test_2" style="filled" fillcolor=red]; + 21 [label="Exit function test_2" style="filled" fillcolor=red]; } - 18 -> {20}; 20 -> {22}; - 21 -> {19}; - 22 -> {24}; - 23 -> {29}; - 24 -> {25}; - 25 -> {26}; - 26 -> {23 27}; + 22 -> {23}; + 23 -> {25}; + 24 -> {39}; + 25 -> {27}; + 26 -> {32}; 27 -> {28}; - 28 -> {23}; - 29 -> {30 35}; + 28 -> {29}; + 29 -> {26 30}; 30 -> {31}; - 31 -> {32}; - 32 -> {33}; + 31 -> {26}; + 32 -> {33 38}; 33 -> {34}; - 34 -> {21}; - 35 -> {21}; + 34 -> {35}; + 35 -> {36}; + 36 -> {37}; + 37 -> {24}; + 38 -> {24}; + 39 -> {21}; - subgraph cluster_10 { + subgraph cluster_12 { color=red - 36 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_11 { + 40 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_13 { color=blue - 38 [label="Enter when"]; - subgraph cluster_12 { + 42 [label="Enter block"]; + subgraph cluster_14 { color=blue - 40 [label="Enter when branch condition "]; - subgraph cluster_13 { + 43 [label="Enter when"]; + subgraph cluster_15 { color=blue - 42 [label="Enter ||"]; - subgraph cluster_14 { + 45 [label="Enter when branch condition "]; + subgraph cluster_16 { color=blue - 44 [label="Enter &&"]; - 45 [label="Access variable R|/b1|"]; - 46 [label="Exit left part of &&"]; - 47 [label="Enter right part of &&"]; - 48 [label="Access variable R|/b2|"]; - 43 [label="Exit &&"]; + 47 [label="Enter ||"]; + subgraph cluster_17 { + color=blue + 49 [label="Enter &&"]; + 50 [label="Access variable R|/b1|"]; + 51 [label="Exit left part of &&"]; + 52 [label="Enter right part of &&"]; + 53 [label="Access variable R|/b2|"]; + 48 [label="Exit &&"]; + } + 54 [label="Exit left part of ||"]; + 55 [label="Enter right part of ||"]; + 56 [label="Access variable R|/b3|"]; + 46 [label="Exit ||"]; } - 49 [label="Exit left part of ||"]; - 50 [label="Enter right part of ||"]; - 51 [label="Access variable R|/b3|"]; - 41 [label="Exit ||"]; + 57 [label="Exit when branch condition"]; } - 52 [label="Exit when branch condition"]; + 63 [label="Synthetic else branch"]; + 58 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 59 [label="Enter block"]; + 60 [label="Const: Int(1)"]; + 61 [label="Exit block"]; + } + 62 [label="Exit when branch result"]; + 44 [label="Exit when"]; } - 58 [label="Synthetic else branch"]; - 53 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 54 [label="Enter block"]; - 55 [label="Const: Int(1)"]; - 56 [label="Exit block"]; - } - 57 [label="Exit when branch result"]; - 39 [label="Exit when"]; + 64 [label="Exit block"]; } - 37 [label="Exit function test_3" style="filled" fillcolor=red]; + 41 [label="Exit function test_3" style="filled" fillcolor=red]; } - 36 -> {38}; - 38 -> {40}; - 39 -> {37}; 40 -> {42}; - 41 -> {52}; - 42 -> {44}; - 43 -> {49}; - 44 -> {45}; - 45 -> {46}; - 46 -> {43 47}; - 47 -> {48}; - 48 -> {43}; - 49 -> {41 50}; + 42 -> {43}; + 43 -> {45}; + 44 -> {64}; + 45 -> {47}; + 46 -> {57}; + 47 -> {49}; + 48 -> {54}; + 49 -> {50}; 50 -> {51}; - 51 -> {41}; - 52 -> {53 58}; - 53 -> {54}; - 54 -> {55}; + 51 -> {48 52}; + 52 -> {53}; + 53 -> {48}; + 54 -> {46 55}; 55 -> {56}; - 56 -> {57}; - 57 -> {39}; - 58 -> {39}; + 56 -> {46}; + 57 -> {58 63}; + 58 -> {59}; + 59 -> {60}; + 60 -> {61}; + 61 -> {62}; + 62 -> {44}; + 63 -> {44}; + 64 -> {41}; - subgraph cluster_16 { + subgraph cluster_19 { color=red - 59 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_17 { + 65 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_20 { color=blue - 61 [label="Enter when"]; - subgraph cluster_18 { - color=blue - 63 [label="Enter when branch condition "]; - subgraph cluster_19 { - color=blue - 65 [label="Enter ||"]; - 66 [label="Access variable R|/b1|"]; - 67 [label="Exit left part of ||"]; - 68 [label="Enter right part of ||"]; - subgraph cluster_20 { - color=blue - 70 [label="Enter &&"]; - 71 [label="Access variable R|/b2|"]; - 72 [label="Exit left part of &&"]; - 73 [label="Enter right part of &&"]; - 74 [label="Access variable R|/b3|"]; - 69 [label="Exit &&"]; - } - 64 [label="Exit ||"]; - } - 75 [label="Exit when branch condition"]; - } - 81 [label="Synthetic else branch"]; - 76 [label="Enter when branch result"]; + 67 [label="Enter block"]; subgraph cluster_21 { color=blue - 77 [label="Enter block"]; - 78 [label="Const: Int(1)"]; - 79 [label="Exit block"]; + 68 [label="Enter when"]; + subgraph cluster_22 { + color=blue + 70 [label="Enter when branch condition "]; + subgraph cluster_23 { + color=blue + 72 [label="Enter ||"]; + 73 [label="Access variable R|/b1|"]; + 74 [label="Exit left part of ||"]; + 75 [label="Enter right part of ||"]; + subgraph cluster_24 { + color=blue + 77 [label="Enter &&"]; + 78 [label="Access variable R|/b2|"]; + 79 [label="Exit left part of &&"]; + 80 [label="Enter right part of &&"]; + 81 [label="Access variable R|/b3|"]; + 76 [label="Exit &&"]; + } + 71 [label="Exit ||"]; + } + 82 [label="Exit when branch condition"]; + } + 88 [label="Synthetic else branch"]; + 83 [label="Enter when branch result"]; + subgraph cluster_25 { + color=blue + 84 [label="Enter block"]; + 85 [label="Const: Int(1)"]; + 86 [label="Exit block"]; + } + 87 [label="Exit when branch result"]; + 69 [label="Exit when"]; } - 80 [label="Exit when branch result"]; - 62 [label="Exit when"]; + 89 [label="Exit block"]; } - 60 [label="Exit function test_4" style="filled" fillcolor=red]; + 66 [label="Exit function test_4" style="filled" fillcolor=red]; } - 59 -> {61}; - 61 -> {63}; - 62 -> {60}; - 63 -> {65}; - 64 -> {75}; - 65 -> {66}; - 66 -> {67}; - 67 -> {64 68}; + 65 -> {67}; + 67 -> {68}; 68 -> {70}; - 69 -> {64}; - 70 -> {71}; - 71 -> {72}; - 72 -> {69 73}; + 69 -> {89}; + 70 -> {72}; + 71 -> {82}; + 72 -> {73}; 73 -> {74}; - 74 -> {69}; - 75 -> {76 81}; - 76 -> {77}; + 74 -> {71 75}; + 75 -> {77}; + 76 -> {71}; 77 -> {78}; 78 -> {79}; - 79 -> {80}; - 80 -> {62}; - 81 -> {62}; + 79 -> {76 80}; + 80 -> {81}; + 81 -> {76}; + 82 -> {83 88}; + 83 -> {84}; + 84 -> {85}; + 85 -> {86}; + 86 -> {87}; + 87 -> {69}; + 88 -> {69}; + 89 -> {66}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/booleanOperatorsWithConsts.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/booleanOperatorsWithConsts.dot index 325c8269f17..8a04ccb6642 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/booleanOperatorsWithConsts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/booleanOperatorsWithConsts.dot @@ -8,411 +8,467 @@ digraph booleanOperatorsWithConsts_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Enter when branch condition "]; + 3 [label="Enter when"]; subgraph cluster_3 { color=blue - 6 [label="Enter ||"]; - 7 [label="Access variable R|/b|"]; - 8 [label="Exit left part of ||"]; - 9 [label="Enter right part of ||"]; - 10 [label="Const: Boolean(false)"]; - 5 [label="Exit ||"]; + 5 [label="Enter when branch condition "]; + subgraph cluster_4 { + color=blue + 7 [label="Enter ||"]; + 8 [label="Access variable R|/b|"]; + 9 [label="Exit left part of ||"]; + 10 [label="Enter right part of ||"]; + 11 [label="Const: Boolean(false)"]; + 6 [label="Exit ||"]; + } + 12 [label="Exit when branch condition"]; } - 11 [label="Exit when branch condition"]; + 18 [label="Synthetic else branch"]; + 13 [label="Enter when branch result"]; + subgraph cluster_5 { + color=blue + 14 [label="Enter block"]; + 15 [label="Const: Int(1)"]; + 16 [label="Exit block"]; + } + 17 [label="Exit when branch result"]; + 4 [label="Exit when"]; } - 17 [label="Synthetic else branch"]; - 12 [label="Enter when branch result"]; - subgraph cluster_4 { - color=blue - 13 [label="Enter block"]; - 14 [label="Const: Int(1)"]; - 15 [label="Exit block"]; - } - 16 [label="Exit when branch result"]; - 3 [label="Exit when"]; + 19 [label="Exit block"]; } 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {1}; - 4 -> {6}; - 5 -> {11}; - 6 -> {7}; + 2 -> {3}; + 3 -> {5}; + 4 -> {19}; + 5 -> {7}; + 6 -> {12}; 7 -> {8}; - 8 -> {5 9}; - 9 -> {10}; - 10 -> {5}; - 11 -> {12 17}; - 12 -> {13}; + 8 -> {9}; + 9 -> {6 10}; + 10 -> {11}; + 11 -> {6}; + 12 -> {13 18}; 13 -> {14}; 14 -> {15}; 15 -> {16}; - 16 -> {3}; - 17 -> {3}; + 16 -> {17}; + 17 -> {4}; + 18 -> {4}; + 19 -> {1}; - subgraph cluster_5 { + subgraph cluster_6 { color=red - 18 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_6 { + 20 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_7 { color=blue - 20 [label="Enter when"]; - subgraph cluster_7 { + 22 [label="Enter block"]; + subgraph cluster_8 { color=blue - 22 [label="Enter when branch condition "]; - subgraph cluster_8 { + 23 [label="Enter when"]; + subgraph cluster_9 { color=blue - 24 [label="Enter ||"]; - 25 [label="Const: Boolean(false)"]; - 26 [label="Exit left part of ||"]; - 27 [label="Enter right part of ||"]; - 28 [label="Access variable R|/b|"]; - 23 [label="Exit ||"]; + 25 [label="Enter when branch condition "]; + subgraph cluster_10 { + color=blue + 27 [label="Enter ||"]; + 28 [label="Const: Boolean(false)"]; + 29 [label="Exit left part of ||"]; + 30 [label="Enter right part of ||"]; + 31 [label="Access variable R|/b|"]; + 26 [label="Exit ||"]; + } + 32 [label="Exit when branch condition"]; } - 29 [label="Exit when branch condition"]; + 38 [label="Synthetic else branch"]; + 33 [label="Enter when branch result"]; + subgraph cluster_11 { + color=blue + 34 [label="Enter block"]; + 35 [label="Const: Int(1)"]; + 36 [label="Exit block"]; + } + 37 [label="Exit when branch result"]; + 24 [label="Exit when"]; } - 35 [label="Synthetic else branch"]; - 30 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 31 [label="Enter block"]; - 32 [label="Const: Int(1)"]; - 33 [label="Exit block"]; - } - 34 [label="Exit when branch result"]; - 21 [label="Exit when"]; + 39 [label="Exit block"]; } - 19 [label="Exit function test_2" style="filled" fillcolor=red]; + 21 [label="Exit function test_2" style="filled" fillcolor=red]; } - 18 -> {20}; 20 -> {22}; - 21 -> {19}; - 22 -> {24}; - 23 -> {29}; - 24 -> {25}; - 25 -> {26}; - 26 -> {27}; - 26 -> {23} [style=dotted]; + 22 -> {23}; + 23 -> {25}; + 24 -> {39}; + 25 -> {27}; + 26 -> {32}; 27 -> {28}; - 28 -> {23}; - 29 -> {30 35}; + 28 -> {29}; + 29 -> {30}; + 29 -> {26} [style=dotted]; 30 -> {31}; - 31 -> {32}; - 32 -> {33}; + 31 -> {26}; + 32 -> {33 38}; 33 -> {34}; - 34 -> {21}; - 35 -> {21}; + 34 -> {35}; + 35 -> {36}; + 36 -> {37}; + 37 -> {24}; + 38 -> {24}; + 39 -> {21}; - subgraph cluster_10 { + subgraph cluster_12 { color=red - 36 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_11 { + 40 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_13 { color=blue - 38 [label="Enter when"]; - subgraph cluster_12 { - color=blue - 40 [label="Enter when branch condition "]; - subgraph cluster_13 { - color=blue - 42 [label="Enter ||"]; - 43 [label="Access variable R|/b|"]; - 44 [label="Exit left part of ||"]; - 45 [label="Enter right part of ||"]; - 46 [label="Const: Boolean(true)"]; - 41 [label="Exit ||"]; - } - 47 [label="Exit when branch condition"]; - } - 53 [label="Synthetic else branch"]; - 48 [label="Enter when branch result"]; + 42 [label="Enter block"]; subgraph cluster_14 { color=blue - 49 [label="Enter block"]; - 50 [label="Const: Int(1)"]; - 51 [label="Exit block"]; - } - 52 [label="Exit when branch result"]; - 39 [label="Exit when"]; - } - 37 [label="Exit function test_3" style="filled" fillcolor=red]; - } - 36 -> {38}; - 38 -> {40}; - 39 -> {37}; - 40 -> {42}; - 41 -> {47}; - 42 -> {43}; - 43 -> {44}; - 44 -> {41 45}; - 45 -> {46}; - 46 -> {41}; - 47 -> {48 53}; - 48 -> {49}; - 49 -> {50}; - 50 -> {51}; - 51 -> {52}; - 52 -> {39}; - 53 -> {39}; - - subgraph cluster_15 { - color=red - 54 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_16 { - color=blue - 56 [label="Enter when"]; - subgraph cluster_17 { - color=blue - 58 [label="Enter when branch condition "]; - subgraph cluster_18 { + 43 [label="Enter when"]; + subgraph cluster_15 { color=blue - 60 [label="Enter ||"]; - 61 [label="Const: Boolean(true)"]; - 62 [label="Exit left part of ||"]; - 63 [label="Enter right part of ||" style="filled" fillcolor=gray]; - 64 [label="Access variable R|/b|" style="filled" fillcolor=gray]; - 59 [label="Exit ||"]; + 45 [label="Enter when branch condition "]; + subgraph cluster_16 { + color=blue + 47 [label="Enter ||"]; + 48 [label="Access variable R|/b|"]; + 49 [label="Exit left part of ||"]; + 50 [label="Enter right part of ||"]; + 51 [label="Const: Boolean(true)"]; + 46 [label="Exit ||"]; + } + 52 [label="Exit when branch condition"]; } - 65 [label="Exit when branch condition"]; + 58 [label="Synthetic else branch"]; + 53 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 54 [label="Enter block"]; + 55 [label="Const: Int(1)"]; + 56 [label="Exit block"]; + } + 57 [label="Exit when branch result"]; + 44 [label="Exit when"]; } - 71 [label="Synthetic else branch"]; - 66 [label="Enter when branch result"]; - subgraph cluster_19 { - color=blue - 67 [label="Enter block"]; - 68 [label="Const: Int(1)"]; - 69 [label="Exit block"]; - } - 70 [label="Exit when branch result"]; - 57 [label="Exit when"]; + 59 [label="Exit block"]; } - 55 [label="Exit function test_4" style="filled" fillcolor=red]; + 41 [label="Exit function test_3" style="filled" fillcolor=red]; } - 54 -> {56}; - 56 -> {58}; - 57 -> {55}; - 58 -> {60}; - 59 -> {65}; - 60 -> {61}; - 61 -> {62}; - 62 -> {59}; - 62 -> {63} [style=dotted]; - 63 -> {64} [style=dotted]; - 64 -> {59} [style=dotted]; - 65 -> {66 71}; - 66 -> {67}; - 67 -> {68}; - 68 -> {69}; - 69 -> {70}; - 70 -> {57}; - 71 -> {57}; + 40 -> {42}; + 42 -> {43}; + 43 -> {45}; + 44 -> {59}; + 45 -> {47}; + 46 -> {52}; + 47 -> {48}; + 48 -> {49}; + 49 -> {46 50}; + 50 -> {51}; + 51 -> {46}; + 52 -> {53 58}; + 53 -> {54}; + 54 -> {55}; + 55 -> {56}; + 56 -> {57}; + 57 -> {44}; + 58 -> {44}; + 59 -> {41}; - subgraph cluster_20 { + subgraph cluster_18 { color=red - 72 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_21 { + 60 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_19 { color=blue - 74 [label="Enter when"]; - subgraph cluster_22 { + 62 [label="Enter block"]; + subgraph cluster_20 { color=blue - 76 [label="Enter when branch condition "]; + 63 [label="Enter when"]; + subgraph cluster_21 { + color=blue + 65 [label="Enter when branch condition "]; + subgraph cluster_22 { + color=blue + 67 [label="Enter ||"]; + 68 [label="Const: Boolean(true)"]; + 69 [label="Exit left part of ||"]; + 70 [label="Enter right part of ||" style="filled" fillcolor=gray]; + 71 [label="Access variable R|/b|" style="filled" fillcolor=gray]; + 66 [label="Exit ||"]; + } + 72 [label="Exit when branch condition"]; + } + 78 [label="Synthetic else branch"]; + 73 [label="Enter when branch result"]; subgraph cluster_23 { color=blue - 78 [label="Enter &&"]; - 79 [label="Access variable R|/b|"]; - 80 [label="Exit left part of &&"]; - 81 [label="Enter right part of &&"]; - 82 [label="Const: Boolean(false)"]; - 77 [label="Exit &&"]; + 74 [label="Enter block"]; + 75 [label="Const: Int(1)"]; + 76 [label="Exit block"]; } - 83 [label="Exit when branch condition"]; + 77 [label="Exit when branch result"]; + 64 [label="Exit when"]; } - 89 [label="Synthetic else branch"]; - 84 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 85 [label="Enter block"]; - 86 [label="Const: Int(1)"]; - 87 [label="Exit block"]; - } - 88 [label="Exit when branch result"]; - 75 [label="Exit when"]; + 79 [label="Exit block"]; } - 73 [label="Exit function test_5" style="filled" fillcolor=red]; + 61 [label="Exit function test_4" style="filled" fillcolor=red]; } - 72 -> {74}; - 74 -> {76}; - 75 -> {73}; - 76 -> {78}; - 77 -> {83}; - 78 -> {79}; - 79 -> {80}; - 80 -> {77 81}; - 81 -> {82}; - 82 -> {77}; - 83 -> {84 89}; - 84 -> {85}; - 85 -> {86}; - 86 -> {87}; - 87 -> {88}; - 88 -> {75}; - 89 -> {75}; + 60 -> {62}; + 62 -> {63}; + 63 -> {65}; + 64 -> {79}; + 65 -> {67}; + 66 -> {72}; + 67 -> {68}; + 68 -> {69}; + 69 -> {66}; + 69 -> {70} [style=dotted]; + 70 -> {71} [style=dotted]; + 71 -> {66} [style=dotted]; + 72 -> {73 78}; + 73 -> {74}; + 74 -> {75}; + 75 -> {76}; + 76 -> {77}; + 77 -> {64}; + 78 -> {64}; + 79 -> {61}; - subgraph cluster_25 { + subgraph cluster_24 { color=red - 90 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_26 { + 80 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_25 { color=blue - 92 [label="Enter when"]; - subgraph cluster_27 { + 82 [label="Enter block"]; + subgraph cluster_26 { color=blue - 94 [label="Enter when branch condition "]; - subgraph cluster_28 { + 83 [label="Enter when"]; + subgraph cluster_27 { color=blue - 96 [label="Enter &&"]; - 97 [label="Const: Boolean(false)"]; - 98 [label="Exit left part of &&"]; - 99 [label="Enter right part of &&" style="filled" fillcolor=gray]; - 100 [label="Access variable R|/b|" style="filled" fillcolor=gray]; - 95 [label="Exit &&"]; + 85 [label="Enter when branch condition "]; + subgraph cluster_28 { + color=blue + 87 [label="Enter &&"]; + 88 [label="Access variable R|/b|"]; + 89 [label="Exit left part of &&"]; + 90 [label="Enter right part of &&"]; + 91 [label="Const: Boolean(false)"]; + 86 [label="Exit &&"]; + } + 92 [label="Exit when branch condition"]; } - 101 [label="Exit when branch condition"]; + 98 [label="Synthetic else branch"]; + 93 [label="Enter when branch result"]; + subgraph cluster_29 { + color=blue + 94 [label="Enter block"]; + 95 [label="Const: Int(1)"]; + 96 [label="Exit block"]; + } + 97 [label="Exit when branch result"]; + 84 [label="Exit when"]; } - 107 [label="Synthetic else branch"]; - 102 [label="Enter when branch result"]; - subgraph cluster_29 { - color=blue - 103 [label="Enter block"]; - 104 [label="Const: Int(1)"]; - 105 [label="Exit block"]; - } - 106 [label="Exit when branch result"]; - 93 [label="Exit when"]; + 99 [label="Exit block"]; } - 91 [label="Exit function test_6" style="filled" fillcolor=red]; + 81 [label="Exit function test_5" style="filled" fillcolor=red]; } - 90 -> {92}; - 92 -> {94}; - 93 -> {91}; - 94 -> {96}; - 95 -> {101}; + 80 -> {82}; + 82 -> {83}; + 83 -> {85}; + 84 -> {99}; + 85 -> {87}; + 86 -> {92}; + 87 -> {88}; + 88 -> {89}; + 89 -> {86 90}; + 90 -> {91}; + 91 -> {86}; + 92 -> {93 98}; + 93 -> {94}; + 94 -> {95}; + 95 -> {96}; 96 -> {97}; - 97 -> {98}; - 98 -> {95}; - 98 -> {99} [style=dotted]; - 99 -> {100} [style=dotted]; - 100 -> {95} [style=dotted]; - 101 -> {102 107}; - 102 -> {103}; - 103 -> {104}; - 104 -> {105}; - 105 -> {106}; - 106 -> {93}; - 107 -> {93}; + 97 -> {84}; + 98 -> {84}; + 99 -> {81}; subgraph cluster_30 { color=red - 108 [label="Enter function test_7" style="filled" fillcolor=red]; + 100 [label="Enter function test_6" style="filled" fillcolor=red]; subgraph cluster_31 { color=blue - 110 [label="Enter when"]; + 102 [label="Enter block"]; subgraph cluster_32 { color=blue - 112 [label="Enter when branch condition "]; + 103 [label="Enter when"]; subgraph cluster_33 { color=blue - 114 [label="Enter &&"]; - 115 [label="Access variable R|/b|"]; - 116 [label="Exit left part of &&"]; - 117 [label="Enter right part of &&"]; - 118 [label="Const: Boolean(true)"]; - 113 [label="Exit &&"]; + 105 [label="Enter when branch condition "]; + subgraph cluster_34 { + color=blue + 107 [label="Enter &&"]; + 108 [label="Const: Boolean(false)"]; + 109 [label="Exit left part of &&"]; + 110 [label="Enter right part of &&" style="filled" fillcolor=gray]; + 111 [label="Access variable R|/b|" style="filled" fillcolor=gray]; + 106 [label="Exit &&"]; + } + 112 [label="Exit when branch condition"]; } - 119 [label="Exit when branch condition"]; + 118 [label="Synthetic else branch"]; + 113 [label="Enter when branch result"]; + subgraph cluster_35 { + color=blue + 114 [label="Enter block"]; + 115 [label="Const: Int(1)"]; + 116 [label="Exit block"]; + } + 117 [label="Exit when branch result"]; + 104 [label="Exit when"]; } - 125 [label="Synthetic else branch"]; - 120 [label="Enter when branch result"]; - subgraph cluster_34 { - color=blue - 121 [label="Enter block"]; - 122 [label="Const: Int(1)"]; - 123 [label="Exit block"]; - } - 124 [label="Exit when branch result"]; - 111 [label="Exit when"]; + 119 [label="Exit block"]; } - 109 [label="Exit function test_7" style="filled" fillcolor=red]; + 101 [label="Exit function test_6" style="filled" fillcolor=red]; } - 108 -> {110}; - 110 -> {112}; - 111 -> {109}; - 112 -> {114}; - 113 -> {119}; + 100 -> {102}; + 102 -> {103}; + 103 -> {105}; + 104 -> {119}; + 105 -> {107}; + 106 -> {112}; + 107 -> {108}; + 108 -> {109}; + 109 -> {106}; + 109 -> {110} [style=dotted]; + 110 -> {111} [style=dotted]; + 111 -> {106} [style=dotted]; + 112 -> {113 118}; + 113 -> {114}; 114 -> {115}; 115 -> {116}; - 116 -> {113 117}; - 117 -> {118}; - 118 -> {113}; - 119 -> {120 125}; - 120 -> {121}; - 121 -> {122}; - 122 -> {123}; - 123 -> {124}; - 124 -> {111}; - 125 -> {111}; + 116 -> {117}; + 117 -> {104}; + 118 -> {104}; + 119 -> {101}; - subgraph cluster_35 { + subgraph cluster_36 { color=red - 126 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_36 { + 120 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_37 { color=blue - 128 [label="Enter when"]; - subgraph cluster_37 { + 122 [label="Enter block"]; + subgraph cluster_38 { color=blue - 130 [label="Enter when branch condition "]; - subgraph cluster_38 { + 123 [label="Enter when"]; + subgraph cluster_39 { color=blue - 132 [label="Enter &&"]; - 133 [label="Const: Boolean(true)"]; - 134 [label="Exit left part of &&"]; - 135 [label="Enter right part of &&"]; - 136 [label="Access variable R|/b|"]; - 131 [label="Exit &&"]; + 125 [label="Enter when branch condition "]; + subgraph cluster_40 { + color=blue + 127 [label="Enter &&"]; + 128 [label="Access variable R|/b|"]; + 129 [label="Exit left part of &&"]; + 130 [label="Enter right part of &&"]; + 131 [label="Const: Boolean(true)"]; + 126 [label="Exit &&"]; + } + 132 [label="Exit when branch condition"]; } - 137 [label="Exit when branch condition"]; + 138 [label="Synthetic else branch"]; + 133 [label="Enter when branch result"]; + subgraph cluster_41 { + color=blue + 134 [label="Enter block"]; + 135 [label="Const: Int(1)"]; + 136 [label="Exit block"]; + } + 137 [label="Exit when branch result"]; + 124 [label="Exit when"]; } - 143 [label="Synthetic else branch"]; - 138 [label="Enter when branch result"]; - subgraph cluster_39 { - color=blue - 139 [label="Enter block"]; - 140 [label="Const: Int(1)"]; - 141 [label="Exit block"]; - } - 142 [label="Exit when branch result"]; - 129 [label="Exit when"]; + 139 [label="Exit block"]; } - 127 [label="Exit function test_8" style="filled" fillcolor=red]; + 121 [label="Exit function test_7" style="filled" fillcolor=red]; } - 126 -> {128}; - 128 -> {130}; - 129 -> {127}; - 130 -> {132}; - 131 -> {137}; - 132 -> {133}; + 120 -> {122}; + 122 -> {123}; + 123 -> {125}; + 124 -> {139}; + 125 -> {127}; + 126 -> {132}; + 127 -> {128}; + 128 -> {129}; + 129 -> {126 130}; + 130 -> {131}; + 131 -> {126}; + 132 -> {133 138}; 133 -> {134}; 134 -> {135}; - 134 -> {131} [style=dotted]; 135 -> {136}; - 136 -> {131}; - 137 -> {138 143}; - 138 -> {139}; - 139 -> {140}; - 140 -> {141}; - 141 -> {142}; - 142 -> {129}; - 143 -> {129}; + 136 -> {137}; + 137 -> {124}; + 138 -> {124}; + 139 -> {121}; + + subgraph cluster_42 { + color=red + 140 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_43 { + color=blue + 142 [label="Enter block"]; + subgraph cluster_44 { + color=blue + 143 [label="Enter when"]; + subgraph cluster_45 { + color=blue + 145 [label="Enter when branch condition "]; + subgraph cluster_46 { + color=blue + 147 [label="Enter &&"]; + 148 [label="Const: Boolean(true)"]; + 149 [label="Exit left part of &&"]; + 150 [label="Enter right part of &&"]; + 151 [label="Access variable R|/b|"]; + 146 [label="Exit &&"]; + } + 152 [label="Exit when branch condition"]; + } + 158 [label="Synthetic else branch"]; + 153 [label="Enter when branch result"]; + subgraph cluster_47 { + color=blue + 154 [label="Enter block"]; + 155 [label="Const: Int(1)"]; + 156 [label="Exit block"]; + } + 157 [label="Exit when branch result"]; + 144 [label="Exit when"]; + } + 159 [label="Exit block"]; + } + 141 [label="Exit function test_8" style="filled" fillcolor=red]; + } + 140 -> {142}; + 142 -> {143}; + 143 -> {145}; + 144 -> {159}; + 145 -> {147}; + 146 -> {152}; + 147 -> {148}; + 148 -> {149}; + 149 -> {150}; + 149 -> {146} [style=dotted]; + 150 -> {151}; + 151 -> {146}; + 152 -> {153 158}; + 153 -> {154}; + 154 -> {155}; + 155 -> {156}; + 156 -> {157}; + 157 -> {144}; + 158 -> {144}; + 159 -> {141}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot index 782bfdcb4b3..5054e7ac1b7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/complex.dot @@ -12,99 +12,109 @@ digraph complex_kt { subgraph cluster_1 { color=red - 2 [label="Enter class AutoCloseable" style="filled" fillcolor=red]; - 3 [label="Exit class AutoCloseable" style="filled" fillcolor=red]; + 3 [label="Enter class AutoCloseable" style="filled" fillcolor=red]; + 2 [label="Exit class AutoCloseable" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function addSuppressed" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 6 [label="Enter block"]; + 7 [label="Exit block"]; + } 5 [label="Exit function addSuppressed" style="filled" fillcolor=red]; } - 4 -> {5}; + 4 -> {6}; + 6 -> {7}; + 7 -> {5}; - subgraph cluster_3 { + subgraph cluster_4 { color=red - 6 [label="Enter function closeFinally" style="filled" fillcolor=red]; - subgraph cluster_4 { + 8 [label="Enter function closeFinally" style="filled" fillcolor=red]; + subgraph cluster_5 { color=blue - 8 [label="Enter when"]; - subgraph cluster_5 { - color=blue - 10 [label="Enter when branch condition "]; - 11 [label="Access variable this@R|/closeFinally|"]; - 12 [label="Const: Null(null)"]; - 13 [label="Operator =="]; - 14 [label="Exit when branch condition"]; - } + 10 [label="Enter block"]; subgraph cluster_6 { color=blue - 19 [label="Enter when branch condition "]; - 20 [label="Access variable R|/cause|"]; - 21 [label="Const: Null(null)"]; - 22 [label="Operator =="]; - 23 [label="Exit when branch condition"]; - } - subgraph cluster_7 { - color=blue - 29 [label="Enter when branch condition else"]; - 30 [label="Exit when branch condition"]; - } - 31 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 32 [label="Enter block"]; + 11 [label="Enter when"]; + subgraph cluster_7 { + color=blue + 13 [label="Enter when branch condition "]; + 14 [label="Access variable this@R|/closeFinally|"]; + 15 [label="Const: Null(null)"]; + 16 [label="Operator =="]; + 17 [label="Exit when branch condition"]; + } + subgraph cluster_8 { + color=blue + 22 [label="Enter when branch condition "]; + 23 [label="Access variable R|/cause|"]; + 24 [label="Const: Null(null)"]; + 25 [label="Operator =="]; + 26 [label="Exit when branch condition"]; + } subgraph cluster_9 { color=blue - 33 [label="Try expression enter"]; - subgraph cluster_10 { - color=blue - 35 [label="Try main block enter"]; - subgraph cluster_11 { - color=blue - 37 [label="Enter block"]; - 38 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; - 39 [label="Exit block"]; - } - 40 [label="Try main block exit"]; - } - subgraph cluster_12 { - color=blue - 36 [label="Catch enter"]; - subgraph cluster_13 { - color=blue - 41 [label="Enter block"]; - 42 [label="Access variable R|/cause|"]; - 43 [label="Access variable R|/closeException|"]; - 44 [label="Function call: R|/cause|.R|/addSuppressed|(...)"]; - 45 [label="Exit block"]; - } - 46 [label="Catch exit"]; - } - 34 [label="Try expression exit"]; + 32 [label="Enter when branch condition else"]; + 33 [label="Exit when branch condition"]; } - 47 [label="Exit block"]; + 34 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 35 [label="Enter block"]; + subgraph cluster_11 { + color=blue + 36 [label="Try expression enter"]; + subgraph cluster_12 { + color=blue + 38 [label="Try main block enter"]; + subgraph cluster_13 { + color=blue + 40 [label="Enter block"]; + 41 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; + 42 [label="Exit block"]; + } + 43 [label="Try main block exit"]; + } + subgraph cluster_14 { + color=blue + 39 [label="Catch enter"]; + subgraph cluster_15 { + color=blue + 44 [label="Enter block"]; + 45 [label="Access variable R|/cause|"]; + 46 [label="Access variable R|/closeException|"]; + 47 [label="Function call: R|/cause|.R|/addSuppressed|(...)"]; + 48 [label="Exit block"]; + } + 49 [label="Catch exit"]; + } + 37 [label="Try expression exit"]; + } + 50 [label="Exit block"]; + } + 51 [label="Exit when branch result"]; + 27 [label="Enter when branch result"]; + subgraph cluster_16 { + color=blue + 28 [label="Enter block"]; + 29 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; + 30 [label="Exit block"]; + } + 31 [label="Exit when branch result"]; + 18 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 19 [label="Enter block"]; + 20 [label="Exit block"]; + } + 21 [label="Exit when branch result"]; + 12 [label="Exit when"]; } - 48 [label="Exit when branch result"]; - 24 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 25 [label="Enter block"]; - 26 [label="Function call: this@R|/closeFinally|.R|/AutoCloseable.close|()"]; - 27 [label="Exit block"]; - } - 28 [label="Exit when branch result"]; - 15 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 16 [label="Enter block"]; - 17 [label="Exit block"]; - } - 18 [label="Exit when branch result"]; - 9 [label="Exit when"]; - } - 49 [label="Jump: ^closeFinally when () { + 52 [label="Jump: ^closeFinally when () { ==(this@R|/closeFinally|, Null(null)) -> { } ==(R|/cause|, Null(null)) -> { @@ -121,149 +131,160 @@ digraph complex_kt { } } "]; - 50 [label="Stub" style="filled" fillcolor=gray]; - 7 [label="Exit function closeFinally" style="filled" fillcolor=red]; + 53 [label="Stub" style="filled" fillcolor=gray]; + 54 [label="Exit block" style="filled" fillcolor=gray]; + } + 9 [label="Exit function closeFinally" style="filled" fillcolor=red]; } - 6 -> {8}; 8 -> {10}; - 9 -> {49}; 10 -> {11}; - 11 -> {12}; - 12 -> {13}; + 11 -> {13}; + 12 -> {52}; 13 -> {14}; - 14 -> {15 19}; + 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {18}; - 18 -> {9}; + 17 -> {18 22}; + 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {22}; + 21 -> {12}; 22 -> {23}; - 23 -> {24 29}; + 23 -> {24}; 24 -> {25}; 25 -> {26}; - 26 -> {27}; + 26 -> {27 32}; 27 -> {28}; - 28 -> {9}; + 28 -> {29}; 29 -> {30}; 30 -> {31}; - 31 -> {32}; + 31 -> {12}; 32 -> {33}; - 33 -> {35}; - 34 -> {47}; - 35 -> {7 36 37}; - 36 -> {7 41}; - 37 -> {38}; - 38 -> {39}; - 39 -> {40}; - 40 -> {34}; + 33 -> {34}; + 34 -> {35}; + 35 -> {36}; + 36 -> {38}; + 37 -> {50}; + 38 -> {9 39 40}; + 39 -> {9 44}; + 40 -> {41}; 41 -> {42}; 42 -> {43}; - 43 -> {44}; + 43 -> {37}; 44 -> {45}; 45 -> {46}; - 46 -> {34}; + 46 -> {47}; 47 -> {48}; - 48 -> {9}; - 49 -> {7}; - 49 -> {50} [style=dotted]; - 50 -> {7} [style=dotted]; + 48 -> {49}; + 49 -> {37}; + 50 -> {51}; + 51 -> {12}; + 52 -> {9}; + 52 -> {53} [style=dotted]; + 53 -> {54} [style=dotted]; + 54 -> {9} [style=dotted]; - subgraph cluster_16 { + subgraph cluster_18 { color=red - 51 [label="Enter function firstIsInstanceOrNull" style="filled" fillcolor=red]; - 53 [label="Access variable this@R|/firstIsInstanceOrNull|"]; - 54 [label="Function call: this@R|/firstIsInstanceOrNull|.R|FakeOverride|>|()"]; - 55 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; - subgraph cluster_17 { + 55 [label="Enter function firstIsInstanceOrNull" style="filled" fillcolor=red]; + subgraph cluster_19 { color=blue - 56 [label="Enter while loop"]; - subgraph cluster_18 { + 57 [label="Enter block"]; + 58 [label="Access variable this@R|/firstIsInstanceOrNull|"]; + 59 [label="Function call: this@R|/firstIsInstanceOrNull|.R|FakeOverride|>|()"]; + 60 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + subgraph cluster_20 { color=blue - 58 [label="Enter loop condition"]; - 59 [label="Access variable R|/|"]; - 60 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 61 [label="Exit loop condition"]; - } - subgraph cluster_19 { - color=blue - 62 [label="Enter loop block"]; - subgraph cluster_20 { + 61 [label="Enter while loop"]; + subgraph cluster_21 { color=blue - 63 [label="Enter block"]; + 63 [label="Enter loop condition"]; 64 [label="Access variable R|/|"]; - 65 [label="Function call: R|/|.R|FakeOverride|()"]; - 66 [label="Variable declaration: lval element: R|kotlin/Any?|"]; - subgraph cluster_21 { - color=blue - 67 [label="Enter when"]; - subgraph cluster_22 { - color=blue - 69 [label="Enter when branch condition "]; - 70 [label="Access variable R|/element|"]; - 71 [label="Type operator: (R|/element| is R|T|)"]; - 72 [label="Exit when branch condition"]; - } - 80 [label="Synthetic else branch"]; - 73 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 74 [label="Enter block"]; - 75 [label="Access variable R|/element|"]; - 76 [label="Jump: ^firstIsInstanceOrNull R|/element|"]; - 77 [label="Stub" style="filled" fillcolor=gray]; - 78 [label="Exit block" style="filled" fillcolor=gray]; - } - 79 [label="Exit when branch result" style="filled" fillcolor=gray]; - 68 [label="Exit when"]; - } - 81 [label="Exit block"]; + 65 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; + 66 [label="Exit loop condition"]; } - 82 [label="Exit loop block"]; + subgraph cluster_22 { + color=blue + 67 [label="Enter loop block"]; + subgraph cluster_23 { + color=blue + 68 [label="Enter block"]; + 69 [label="Access variable R|/|"]; + 70 [label="Function call: R|/|.R|FakeOverride|()"]; + 71 [label="Variable declaration: lval element: R|kotlin/Any?|"]; + subgraph cluster_24 { + color=blue + 72 [label="Enter when"]; + subgraph cluster_25 { + color=blue + 74 [label="Enter when branch condition "]; + 75 [label="Access variable R|/element|"]; + 76 [label="Type operator: (R|/element| is R|T|)"]; + 77 [label="Exit when branch condition"]; + } + 85 [label="Synthetic else branch"]; + 78 [label="Enter when branch result"]; + subgraph cluster_26 { + color=blue + 79 [label="Enter block"]; + 80 [label="Access variable R|/element|"]; + 81 [label="Jump: ^firstIsInstanceOrNull R|/element|"]; + 82 [label="Stub" style="filled" fillcolor=gray]; + 83 [label="Exit block" style="filled" fillcolor=gray]; + } + 84 [label="Exit when branch result" style="filled" fillcolor=gray]; + 73 [label="Exit when"]; + } + 86 [label="Exit block"]; + } + 87 [label="Exit loop block"]; + } + 62 [label="Exit whileloop"]; } - 57 [label="Exit whileloop"]; + 88 [label="Const: Null(null)"]; + 89 [label="Jump: ^firstIsInstanceOrNull Null(null)"]; + 90 [label="Stub" style="filled" fillcolor=gray]; + 91 [label="Exit block" style="filled" fillcolor=gray]; } - 83 [label="Const: Null(null)"]; - 84 [label="Jump: ^firstIsInstanceOrNull Null(null)"]; - 85 [label="Stub" style="filled" fillcolor=gray]; - 52 [label="Exit function firstIsInstanceOrNull" style="filled" fillcolor=red]; + 56 [label="Exit function firstIsInstanceOrNull" style="filled" fillcolor=red]; } - 51 -> {53}; - 53 -> {54}; - 54 -> {55}; - 55 -> {56}; - 56 -> {58}; - 57 -> {83}; + 55 -> {57}; + 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; - 61 -> {57 62}; - 62 -> {63}; + 61 -> {63}; + 62 -> {88}; 63 -> {64}; 64 -> {65}; 65 -> {66}; - 66 -> {67}; - 67 -> {69}; - 68 -> {81}; + 66 -> {62 67}; + 67 -> {68}; + 68 -> {69}; 69 -> {70}; 70 -> {71}; 71 -> {72}; - 72 -> {73 80}; - 73 -> {74}; + 72 -> {74}; + 73 -> {86}; 74 -> {75}; 75 -> {76}; - 76 -> {52}; - 76 -> {77} [style=dotted]; - 77 -> {78} [style=dotted]; - 78 -> {79} [style=dotted]; - 79 -> {68} [style=dotted]; - 80 -> {68}; - 81 -> {82}; - 82 -> {58} [color=green style=dashed]; - 83 -> {84}; - 84 -> {52}; - 84 -> {85} [style=dotted]; - 85 -> {52} [style=dotted]; + 76 -> {77}; + 77 -> {78 85}; + 78 -> {79}; + 79 -> {80}; + 80 -> {81}; + 81 -> {56}; + 81 -> {82} [style=dotted]; + 82 -> {83} [style=dotted]; + 83 -> {84} [style=dotted]; + 84 -> {73} [style=dotted]; + 85 -> {73}; + 86 -> {87}; + 87 -> {63} [color=green style=dashed]; + 88 -> {89}; + 89 -> {56}; + 89 -> {90} [style=dotted]; + 90 -> {91} [style=dotted]; + 91 -> {56} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.dot new file mode 100644 index 00000000000..9ea9ee2bd88 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.dot @@ -0,0 +1,85 @@ +digraph defaultArguments_kt { + graph [nodesep=3] + node [shape=box penwidth=2] + edge [penwidth=2] + + subgraph cluster_0 { + color=red + 0 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Const: Int(1)"]; + 4 [label="Jump: ^foo Int(1)"]; + 5 [label="Stub" style="filled" fillcolor=gray]; + 6 [label="Exit block" style="filled" fillcolor=gray]; + } + 1 [label="Exit function foo" style="filled" fillcolor=red]; + } + 0 -> {2}; + 2 -> {3}; + 3 -> {4}; + 4 -> {1}; + 4 -> {5} [style=dotted]; + 5 -> {6} [style=dotted]; + 6 -> {1} [style=dotted]; + + subgraph cluster_2 { + color=red + 7 [label="Enter function test" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 17 [label="Enter default value of z" style="filled" fillcolor=red]; + 18 [label="Postponed enter to lambda"]; + subgraph cluster_4 { + color=blue + 22 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 24 [label="Enter block"]; + 25 [label="Function call: R|/foo|()"]; + 26 [label="Exit block"]; + } + 23 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 21 [label="Call arguments union" style="filled" fillcolor=yellow]; + 19 [label="Postponed exit from lambda"]; + 20 [label="Function call: R|kotlin/run|(...)"]; + 16 [label="Exit default value of z" style="filled" fillcolor=red]; + } + subgraph cluster_6 { + color=blue + 13 [label="Enter default value of y" style="filled" fillcolor=red]; + 14 [label="Access variable R|/x|"]; + 15 [label="Type operator: (R|/x| as R|kotlin/String|)"]; + 12 [label="Exit default value of y" style="filled" fillcolor=red]; + } + subgraph cluster_7 { + color=blue + 9 [label="Enter block"]; + 10 [label="Function call: R|/foo|()"]; + 11 [label="Exit block"]; + } + 8 [label="Exit function test" style="filled" fillcolor=red]; + } + 7 -> {13 17 9}; + 9 -> {10}; + 10 -> {11}; + 11 -> {8}; + 13 -> {14}; + 14 -> {15}; + 15 -> {12}; + 17 -> {18}; + 18 -> {22}; + 18 -> {19} [color=red]; + 19 -> {20} [color=green]; + 20 -> {16}; + 21 -> {20} [color=red]; + 22 -> {24}; + 23 -> {19} [color=green]; + 23 -> {21} [color=red]; + 24 -> {25}; + 25 -> {26}; + 26 -> {23}; + +} diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.kt b/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.kt new file mode 100644 index 00000000000..a87092e9d52 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.kt @@ -0,0 +1,7 @@ +// !DUMP_CFG + +fun foo(): Int = 1 + +fun test(x: Any, y: String = x as String, z: Int = run { foo() }) { + foo() +} diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.txt b/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.txt new file mode 100644 index 00000000000..e04d4ef537b --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.txt @@ -0,0 +1,10 @@ +FILE: defaultArguments.kt + public final fun foo(): R|kotlin/Int| { + ^foo Int(1) + } + public final fun test(x: R|kotlin/Any|, y: R|kotlin/String| = (R|/x| as R|kotlin/String|), z: R|kotlin/Int| = R|kotlin/run|( = run@fun (): R|kotlin/Int| { + ^ R|/foo|() + } + )): R|kotlin/Unit| { + R|/foo|() + } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.dot index 80847240a8b..2e396b849b2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.dot @@ -8,53 +8,74 @@ digraph emptyWhen_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; - 4 [label="Synthetic else branch"]; - 3 [label="Exit when"]; + 2 [label="Enter block"]; + subgraph cluster_2 { + color=blue + 3 [label="Enter when"]; + 5 [label="Synthetic else branch"]; + 4 [label="Exit when"]; + } + 6 [label="Exit block"]; } 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {1}; - 4 -> {3}; + 2 -> {3}; + 3 -> {5}; + 4 -> {6}; + 5 -> {4}; + 6 -> {1}; - subgraph cluster_2 { + subgraph cluster_3 { color=red - 5 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_3 { + 7 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_4 { color=blue - 7 [label="Enter when"]; - 9 [label="Access variable R|/x|"]; - 10 [label="Synthetic else branch"]; - 8 [label="Exit when"]; + 9 [label="Enter block"]; + subgraph cluster_5 { + color=blue + 10 [label="Enter when"]; + 12 [label="Access variable R|/x|"]; + 13 [label="Synthetic else branch"]; + 11 [label="Exit when"]; + } + 14 [label="Exit block"]; } - 6 [label="Exit function test_2" style="filled" fillcolor=red]; + 8 [label="Exit function test_2" style="filled" fillcolor=red]; } - 5 -> {7}; 7 -> {9}; - 8 -> {6}; 9 -> {10}; - 10 -> {8}; + 10 -> {12}; + 11 -> {14}; + 12 -> {13}; + 13 -> {11}; + 14 -> {8}; - subgraph cluster_4 { + subgraph cluster_6 { color=red - 11 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_5 { + 15 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_7 { color=blue - 13 [label="Enter when"]; - 15 [label="Access variable R|/x|"]; - 16 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 17 [label="Synthetic else branch"]; - 14 [label="Exit when"]; + 17 [label="Enter block"]; + subgraph cluster_8 { + color=blue + 18 [label="Enter when"]; + 20 [label="Access variable R|/x|"]; + 21 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 22 [label="Synthetic else branch"]; + 19 [label="Exit when"]; + } + 23 [label="Exit block"]; } - 12 [label="Exit function test_3" style="filled" fillcolor=red]; + 16 [label="Exit function test_3" style="filled" fillcolor=red]; } - 11 -> {13}; - 13 -> {15}; - 14 -> {12}; - 15 -> {16}; - 16 -> {17}; - 17 -> {14}; + 15 -> {17}; + 17 -> {18}; + 18 -> {20}; + 19 -> {23}; + 20 -> {21}; + 21 -> {22}; + 22 -> {19}; + 23 -> {16}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot index 3df2428ebc2..2a57e42464f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda.dot @@ -6,428 +6,579 @@ digraph flowFromInplaceLambda_kt { subgraph cluster_0 { color=red 0 [label="Enter function takeInt" style="filled" fillcolor=red]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Exit block"]; + } 1 [label="Exit function takeInt" style="filled" fillcolor=red]; } - 0 -> {1}; - - subgraph cluster_1 { - color=red - 2 [label="Enter function select" style="filled" fillcolor=red]; - 4 [label="Access variable R|/x|"]; - 5 [label="Const: Int(0)"]; - 6 [label="Function call: R|/x|.R|FakeOverride|(...)"]; - 7 [label="Jump: ^select R|/x|.R|FakeOverride|(Int(0))"]; - 8 [label="Stub" style="filled" fillcolor=gray]; - 3 [label="Exit function select" style="filled" fillcolor=red]; - } - 2 -> {4}; - 4 -> {5}; - 5 -> {6}; - 6 -> {7}; - 7 -> {3}; - 7 -> {8} [style=dotted]; - 8 -> {3} [style=dotted]; + 0 -> {2}; + 2 -> {3}; + 3 -> {1}; subgraph cluster_2 { color=red - 9 [label="Enter function id" style="filled" fillcolor=red]; - 11 [label="Access variable R|/x|"]; - 12 [label="Jump: ^id R|/x|"]; - 13 [label="Stub" style="filled" fillcolor=gray]; - 10 [label="Exit function id" style="filled" fillcolor=red]; + 4 [label="Enter function select" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 6 [label="Enter block"]; + 7 [label="Access variable R|/x|"]; + 8 [label="Const: Int(0)"]; + 9 [label="Function call: R|/x|.R|FakeOverride|(...)"]; + 10 [label="Jump: ^select R|/x|.R|FakeOverride|(Int(0))"]; + 11 [label="Stub" style="filled" fillcolor=gray]; + 12 [label="Exit block" style="filled" fillcolor=gray]; + } + 5 [label="Exit function select" style="filled" fillcolor=red]; } - 9 -> {11}; - 11 -> {12}; - 12 -> {10}; - 12 -> {13} [style=dotted]; - 13 -> {10} [style=dotted]; - - subgraph cluster_3 { - color=red - 14 [label="Enter function materialize" style="filled" fillcolor=red]; - 16 [label="Const: Null(null)"]; - 17 [label="Check not null: Null(null)!!"]; - 18 [label="Jump: ^materialize Null(null)!!"]; - 19 [label="Stub" style="filled" fillcolor=gray]; - 15 [label="Exit function materialize" style="filled" fillcolor=red]; - } - 14 -> {16}; - 16 -> {17}; - 17 -> {18}; - 18 -> {15}; - 18 -> {19} [style=dotted]; - 19 -> {15} [style=dotted]; + 4 -> {6}; + 6 -> {7}; + 7 -> {8}; + 8 -> {9}; + 9 -> {10}; + 10 -> {5}; + 10 -> {11} [style=dotted]; + 11 -> {12} [style=dotted]; + 12 -> {5} [style=dotted]; subgraph cluster_4 { color=red - 20 [label="Enter function myRun" style="filled" fillcolor=red]; - 22 [label="Function call: R|/block|.R|FakeOverride|()"]; - 23 [label="Jump: ^myRun R|/block|.R|FakeOverride|()"]; - 24 [label="Stub" style="filled" fillcolor=gray]; - 21 [label="Exit function myRun" style="filled" fillcolor=red]; + 13 [label="Enter function id" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 15 [label="Enter block"]; + 16 [label="Access variable R|/x|"]; + 17 [label="Jump: ^id R|/x|"]; + 18 [label="Stub" style="filled" fillcolor=gray]; + 19 [label="Exit block" style="filled" fillcolor=gray]; + } + 14 [label="Exit function id" style="filled" fillcolor=red]; + } + 13 -> {15}; + 15 -> {16}; + 16 -> {17}; + 17 -> {14}; + 17 -> {18} [style=dotted]; + 18 -> {19} [style=dotted]; + 19 -> {14} [style=dotted]; + + subgraph cluster_6 { + color=red + 20 [label="Enter function materialize" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 22 [label="Enter block"]; + 23 [label="Const: Null(null)"]; + 24 [label="Check not null: Null(null)!!"]; + 25 [label="Jump: ^materialize Null(null)!!"]; + 26 [label="Stub" style="filled" fillcolor=gray]; + 27 [label="Exit block" style="filled" fillcolor=gray]; + } + 21 [label="Exit function materialize" style="filled" fillcolor=red]; } 20 -> {22}; 22 -> {23}; - 23 -> {21}; - 23 -> {24} [style=dotted]; - 24 -> {21} [style=dotted]; + 23 -> {24}; + 24 -> {25}; + 25 -> {21}; + 25 -> {26} [style=dotted]; + 26 -> {27} [style=dotted]; + 27 -> {21} [style=dotted]; - subgraph cluster_5 { + subgraph cluster_8 { color=red - 25 [label="Enter function test_1" style="filled" fillcolor=red]; - 27 [label="Postponed enter to lambda"]; - subgraph cluster_6 { - color=blue - 33 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 35 [label="Access variable R|/x|"]; - 36 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 34 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 30 [label="Call arguments union" style="filled" fillcolor=yellow]; - 28 [label="Postponed exit from lambda"]; - 29 [label="Function call: R|kotlin/run|(...)"]; - 31 [label="Access variable R|/x|"]; - 32 [label="Function call: R|/takeInt|(...)"]; - 26 [label="Exit function test_1" style="filled" fillcolor=red]; - } - 25 -> {27}; - 27 -> {33}; - 27 -> {28} [color=red]; - 28 -> {29} [color=green]; - 29 -> {31}; - 30 -> {29} [color=red]; - 31 -> {32}; - 32 -> {26}; - 33 -> {35}; - 34 -> {28} [color=green]; - 34 -> {30} [color=red]; - 35 -> {36}; - 36 -> {34}; - - subgraph cluster_7 { - color=red - 37 [label="Enter function test_2" style="filled" fillcolor=red]; - 39 [label="Postponed enter to lambda"]; - subgraph cluster_8 { - color=blue - 58 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 60 [label="Access variable R|/y|"]; - 61 [label="Function call: R|/y|.#()"]; - 62 [label="Access variable R|/x|"]; - 63 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 59 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 40 [label="Postponed exit from lambda"]; - 41 [label="Function call: R|kotlin/run|(...)"]; - 43 [label="Call arguments union" style="filled" fillcolor=yellow]; - 42 [label="Function call: R|/id|(...)"]; - 44 [label="Access variable R|/y|"]; - 45 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 46 [label="Postponed enter to lambda"]; + 28 [label="Enter function myRun" style="filled" fillcolor=red]; subgraph cluster_9 { color=blue - 64 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 66 [label="Access variable R|/x|"]; - 67 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 68 [label="Access variable R|/y|"]; - 69 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 70 [label="Const: Int(1)"]; - 65 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 30 [label="Enter block"]; + 31 [label="Function call: R|/block|.R|FakeOverride|()"]; + 32 [label="Jump: ^myRun R|/block|.R|FakeOverride|()"]; + 33 [label="Stub" style="filled" fillcolor=gray]; + 34 [label="Exit block" style="filled" fillcolor=gray]; } - 47 [label="Postponed exit from lambda"]; - 48 [label="Function call: R|kotlin/run|(...)"]; - 50 [label="Call arguments union" style="filled" fillcolor=yellow]; - 49 [label="Function call: R|/select|(...)"]; - 51 [label="Variable declaration: lval a: R|kotlin/Int|"]; - 52 [label="Access variable R|/x|"]; - 53 [label="Function call: R|/takeInt|(...)"]; - 54 [label="Access variable R|/y|"]; - 55 [label="Function call: R|/takeInt|(...)"]; - 56 [label="Access variable R|/a|"]; - 57 [label="Function call: R|/takeInt|(...)"]; - 38 [label="Exit function test_2" style="filled" fillcolor=red]; + 29 [label="Exit function myRun" style="filled" fillcolor=red]; } - 37 -> {39}; - 39 -> {58}; - 39 -> {40} [color=red]; - 40 -> {41}; - 41 -> {43}; - 42 -> {44}; - 43 -> {42}; - 44 -> {45}; - 45 -> {46}; - 46 -> {64}; - 46 -> {47} [color=red]; + 28 -> {30}; + 30 -> {31}; + 31 -> {32}; + 32 -> {29}; + 32 -> {33} [style=dotted]; + 33 -> {34} [style=dotted]; + 34 -> {29} [style=dotted]; + + subgraph cluster_10 { + color=red + 35 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 37 [label="Enter block"]; + 38 [label="Postponed enter to lambda"]; + subgraph cluster_12 { + color=blue + 45 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_13 { + color=blue + 47 [label="Enter block"]; + 48 [label="Access variable R|/x|"]; + 49 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 50 [label="Exit block"]; + } + 46 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 41 [label="Call arguments union" style="filled" fillcolor=yellow]; + 39 [label="Postponed exit from lambda"]; + 40 [label="Function call: R|kotlin/run|(...)"]; + 42 [label="Access variable R|/x|"]; + 43 [label="Function call: R|/takeInt|(...)"]; + 44 [label="Exit block"]; + } + 36 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 35 -> {37}; + 37 -> {38}; + 38 -> {45}; + 38 -> {39} [color=red]; + 39 -> {40} [color=green]; + 40 -> {42}; + 41 -> {40} [color=red]; + 42 -> {43}; + 43 -> {44}; + 44 -> {36}; + 45 -> {47}; + 46 -> {39} [color=green]; + 46 -> {41} [color=red]; 47 -> {48}; - 48 -> {50}; - 49 -> {51}; - 50 -> {49}; - 51 -> {52}; - 52 -> {53}; + 48 -> {49}; + 49 -> {50}; + 50 -> {46}; + + subgraph cluster_14 { + color=red + 51 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_15 { + color=blue + 53 [label="Enter block"]; + 54 [label="Postponed enter to lambda"]; + subgraph cluster_16 { + color=blue + 74 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_17 { + color=blue + 76 [label="Enter block"]; + 77 [label="Access variable R|/y|"]; + 78 [label="Function call: R|/y|.#()"]; + 79 [label="Access variable R|/x|"]; + 80 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 81 [label="Exit block"]; + } + 75 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 55 [label="Postponed exit from lambda"]; + 56 [label="Function call: R|kotlin/run|(...)"]; + 58 [label="Call arguments union" style="filled" fillcolor=yellow]; + 57 [label="Function call: R|/id|(...)"]; + 59 [label="Access variable R|/y|"]; + 60 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 61 [label="Postponed enter to lambda"]; + subgraph cluster_18 { + color=blue + 82 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 84 [label="Enter block"]; + 85 [label="Access variable R|/x|"]; + 86 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 87 [label="Access variable R|/y|"]; + 88 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 89 [label="Const: Int(1)"]; + 90 [label="Exit block"]; + } + 83 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 62 [label="Postponed exit from lambda"]; + 63 [label="Function call: R|kotlin/run|(...)"]; + 65 [label="Call arguments union" style="filled" fillcolor=yellow]; + 64 [label="Function call: R|/select|(...)"]; + 66 [label="Variable declaration: lval a: R|kotlin/Int|"]; + 67 [label="Access variable R|/x|"]; + 68 [label="Function call: R|/takeInt|(...)"]; + 69 [label="Access variable R|/y|"]; + 70 [label="Function call: R|/takeInt|(...)"]; + 71 [label="Access variable R|/a|"]; + 72 [label="Function call: R|/takeInt|(...)"]; + 73 [label="Exit block"]; + } + 52 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 51 -> {53}; 53 -> {54}; - 54 -> {55}; + 54 -> {74}; + 54 -> {55} [color=red]; 55 -> {56}; - 56 -> {57}; - 57 -> {38}; - 58 -> {60}; - 59 -> {40} [color=green]; - 59 -> {43} [color=red]; + 56 -> {58}; + 57 -> {59}; + 58 -> {57}; + 59 -> {60}; 60 -> {61}; - 61 -> {62}; + 61 -> {82}; + 61 -> {62} [color=red]; 62 -> {63}; - 63 -> {59}; + 63 -> {65}; 64 -> {66}; - 65 -> {47} [color=green]; - 65 -> {50} [color=red]; + 65 -> {64}; 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {65}; - - subgraph cluster_10 { - color=red - 71 [label="Enter function test_3" style="filled" fillcolor=red]; - 73 [label="Postponed enter to lambda"]; - subgraph cluster_11 { - color=blue - 89 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 91 [label="Access variable R|/y|"]; - 92 [label="Function call: R|/y|.#()"]; - 93 [label="Access variable R|/x|"]; - 94 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 95 [label="Function call: R|/materialize|()"]; - 90 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 74 [label="Postponed exit from lambda"]; - 75 [label="Function call: R|kotlin/run|(...)"]; - 76 [label="Function call: R|/id|(...)"]; - 77 [label="Postponed enter to lambda"]; - subgraph cluster_12 { - color=blue - 96 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 98 [label="Access variable R|/y|"]; - 99 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 100 [label="Access variable R|/x|"]; - 101 [label="Function call: R|/x|.#()"]; - 102 [label="Access variable R|/y|"]; - 103 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 104 [label="Const: Int(1)"]; - 97 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 78 [label="Postponed exit from lambda"]; - 79 [label="Function call: R|kotlin/run|(...)"]; - 81 [label="Call arguments union" style="filled" fillcolor=yellow]; - 80 [label="Function call: R|/select|(...)"]; - 82 [label="Variable declaration: lval a: R|kotlin/Int|"]; - 83 [label="Access variable R|/x|"]; - 84 [label="Function call: R|/takeInt|(...)"]; - 85 [label="Access variable R|/y|"]; - 86 [label="Function call: R|/takeInt|(...)"]; - 87 [label="Access variable R|/a|"]; - 88 [label="Function call: R|/takeInt|(...)"]; - 72 [label="Exit function test_3" style="filled" fillcolor=red]; - } - 71 -> {73}; - 73 -> {89}; - 73 -> {74} [color=red]; - 74 -> {75}; - 75 -> {76}; + 70 -> {71}; + 71 -> {72}; + 72 -> {73}; + 73 -> {52}; + 74 -> {76}; + 75 -> {55} [color=green]; + 75 -> {58} [color=red]; 76 -> {77}; - 77 -> {96}; - 77 -> {78} [color=red]; + 77 -> {78}; 78 -> {79}; - 79 -> {81}; - 80 -> {82}; - 81 -> {80}; - 82 -> {83}; - 83 -> {84}; + 79 -> {80}; + 80 -> {81}; + 81 -> {75}; + 82 -> {84}; + 83 -> {62} [color=green]; + 83 -> {65} [color=red]; 84 -> {85}; 85 -> {86}; 86 -> {87}; 87 -> {88}; - 88 -> {72}; - 89 -> {91}; - 90 -> {74} [color=green]; - 90 -> {81} [color=red]; - 91 -> {92}; - 92 -> {93}; - 93 -> {94}; - 94 -> {95}; - 95 -> {90}; - 96 -> {98}; - 97 -> {78} [color=green]; - 97 -> {81} [color=red]; - 98 -> {99}; - 99 -> {100}; - 100 -> {101}; - 101 -> {102}; - 102 -> {103}; - 103 -> {104}; - 104 -> {97}; + 88 -> {89}; + 89 -> {90}; + 90 -> {83}; - subgraph cluster_13 { + subgraph cluster_20 { color=red - 105 [label="Enter function test_4" style="filled" fillcolor=red]; - 107 [label="Postponed enter to lambda"]; - subgraph cluster_14 { + 91 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_21 { color=blue - 124 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 126 [label="Access variable R|/y|"]; - 127 [label="Function call: R|/y|.#()"]; - 128 [label="Access variable R|/x|"]; - 129 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 125 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 93 [label="Enter block"]; + 94 [label="Postponed enter to lambda"]; + subgraph cluster_22 { + color=blue + 111 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_23 { + color=blue + 113 [label="Enter block"]; + 114 [label="Access variable R|/y|"]; + 115 [label="Function call: R|/y|.#()"]; + 116 [label="Access variable R|/x|"]; + 117 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 118 [label="Function call: R|/materialize|()"]; + 119 [label="Exit block"]; + } + 112 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 95 [label="Postponed exit from lambda"]; + 96 [label="Function call: R|kotlin/run|(...)"]; + 97 [label="Function call: R|/id|(...)"]; + 98 [label="Postponed enter to lambda"]; + subgraph cluster_24 { + color=blue + 120 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_25 { + color=blue + 122 [label="Enter block"]; + 123 [label="Access variable R|/y|"]; + 124 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 125 [label="Access variable R|/x|"]; + 126 [label="Function call: R|/x|.#()"]; + 127 [label="Access variable R|/y|"]; + 128 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 129 [label="Const: Int(1)"]; + 130 [label="Exit block"]; + } + 121 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 99 [label="Postponed exit from lambda"]; + 100 [label="Function call: R|kotlin/run|(...)"]; + 102 [label="Call arguments union" style="filled" fillcolor=yellow]; + 101 [label="Function call: R|/select|(...)"]; + 103 [label="Variable declaration: lval a: R|kotlin/Int|"]; + 104 [label="Access variable R|/x|"]; + 105 [label="Function call: R|/takeInt|(...)"]; + 106 [label="Access variable R|/y|"]; + 107 [label="Function call: R|/takeInt|(...)"]; + 108 [label="Access variable R|/a|"]; + 109 [label="Function call: R|/takeInt|(...)"]; + 110 [label="Exit block"]; } - 108 [label="Postponed exit from lambda"]; - 109 [label="Function call: R|/myRun|(...)"]; - 110 [label="Function call: R|/id|(...)"]; - 111 [label="Access variable R|/y|"]; - 112 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; - 113 [label="Postponed enter to lambda"]; - subgraph cluster_15 { - color=blue - 130 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 132 [label="Access variable R|/x|"]; - 133 [label="Function call: R|/x|.#()"]; - 134 [label="Access variable R|/y|"]; - 135 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 136 [label="Const: Int(1)"]; - 131 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 114 [label="Postponed exit from lambda"]; - 115 [label="Function call: R|/myRun|(...)"]; - 116 [label="Function call: R|/select|(...)"]; - 117 [label="Variable declaration: lval a: R|kotlin/Int|"]; - 118 [label="Access variable R|/x|"]; - 119 [label="Function call: #(...)"]; - 120 [label="Access variable R|/y|"]; - 121 [label="Function call: R|/takeInt|(...)"]; - 122 [label="Access variable R|/a|"]; - 123 [label="Function call: R|/takeInt|(...)"]; - 106 [label="Exit function test_4" style="filled" fillcolor=red]; + 92 [label="Exit function test_3" style="filled" fillcolor=red]; } - 105 -> {107}; + 91 -> {93}; + 93 -> {94}; + 94 -> {111}; + 94 -> {95} [color=red]; + 95 -> {96}; + 96 -> {97}; + 97 -> {98}; + 98 -> {120}; + 98 -> {99} [color=red]; + 99 -> {100}; + 100 -> {102}; + 101 -> {103}; + 102 -> {101}; + 103 -> {104}; + 104 -> {105}; + 105 -> {106}; + 106 -> {107}; 107 -> {108}; - 107 -> {124} [color=red]; 108 -> {109}; 109 -> {110}; - 110 -> {111}; - 111 -> {112}; - 112 -> {113}; + 110 -> {92}; + 111 -> {113}; + 112 -> {95} [color=green]; + 112 -> {102} [color=red]; 113 -> {114}; - 113 -> {130} [color=red]; 114 -> {115}; 115 -> {116}; 116 -> {117}; 117 -> {118}; 118 -> {119}; - 119 -> {120}; - 120 -> {121}; - 121 -> {122}; + 119 -> {112}; + 120 -> {122}; + 121 -> {99} [color=green]; + 121 -> {102} [color=red]; 122 -> {123}; - 123 -> {106}; - 124 -> {126}; + 123 -> {124}; + 124 -> {125}; + 125 -> {126}; 126 -> {127}; 127 -> {128}; 128 -> {129}; - 129 -> {125}; - 130 -> {132}; - 132 -> {133}; - 133 -> {134}; - 134 -> {135}; - 135 -> {136}; - 136 -> {131}; + 129 -> {130}; + 130 -> {121}; - subgraph cluster_16 { + subgraph cluster_26 { color=red - 137 [label="Enter function test_5" style="filled" fillcolor=red]; - 139 [label="Postponed enter to lambda"]; - subgraph cluster_17 { + 131 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_27 { color=blue - 150 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 152 [label="Function call: R|/materialize|()"]; - 151 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 133 [label="Enter block"]; + 134 [label="Postponed enter to lambda"]; + subgraph cluster_28 { + color=blue + 152 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_29 { + color=blue + 154 [label="Enter block"]; + 155 [label="Access variable R|/y|"]; + 156 [label="Function call: R|/y|.#()"]; + 157 [label="Access variable R|/x|"]; + 158 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 159 [label="Exit block"]; + } + 153 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 135 [label="Postponed exit from lambda"]; + 136 [label="Function call: R|/myRun|(...)"]; + 137 [label="Function call: R|/id|(...)"]; + 138 [label="Access variable R|/y|"]; + 139 [label="Type operator: (R|/y| as R|kotlin/Int|)"]; + 140 [label="Postponed enter to lambda"]; + subgraph cluster_30 { + color=blue + 160 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_31 { + color=blue + 162 [label="Enter block"]; + 163 [label="Access variable R|/x|"]; + 164 [label="Function call: R|/x|.#()"]; + 165 [label="Access variable R|/y|"]; + 166 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 167 [label="Const: Int(1)"]; + 168 [label="Exit block"]; + } + 161 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 141 [label="Postponed exit from lambda"]; + 142 [label="Function call: R|/myRun|(...)"]; + 143 [label="Function call: R|/select|(...)"]; + 144 [label="Variable declaration: lval a: R|kotlin/Int|"]; + 145 [label="Access variable R|/x|"]; + 146 [label="Function call: #(...)"]; + 147 [label="Access variable R|/y|"]; + 148 [label="Function call: R|/takeInt|(...)"]; + 149 [label="Access variable R|/a|"]; + 150 [label="Function call: R|/takeInt|(...)"]; + 151 [label="Exit block"]; } - 140 [label="Postponed exit from lambda"]; - 141 [label="Function call: R|kotlin/run|(...)"]; - 142 [label="Postponed enter to lambda"]; - subgraph cluster_18 { - color=blue - 153 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 155 [label="Function call: R|/materialize|()"]; - 154 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 143 [label="Postponed exit from lambda"]; - 144 [label="Function call: R|kotlin/run|(...)"]; - 146 [label="Call arguments union" style="filled" fillcolor=yellow]; - 145 [label="Function call: R|/select|(...)"]; - 147 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 148 [label="Access variable R|/x|"]; - 149 [label="Function call: R|/takeInt|(...)"]; - 138 [label="Exit function test_5" style="filled" fillcolor=red]; + 132 [label="Exit function test_4" style="filled" fillcolor=red]; } - 137 -> {139}; - 139 -> {150}; - 139 -> {140} [color=red]; - 140 -> {141}; + 131 -> {133}; + 133 -> {134}; + 134 -> {135 152}; + 135 -> {136}; + 136 -> {137}; + 137 -> {138}; + 138 -> {139}; + 139 -> {140}; + 140 -> {141 160}; 141 -> {142}; - 142 -> {153}; - 142 -> {143} [color=red]; + 142 -> {143}; 143 -> {144}; - 144 -> {146}; - 145 -> {147}; - 146 -> {145}; + 144 -> {145}; + 145 -> {146}; + 146 -> {147}; 147 -> {148}; 148 -> {149}; - 149 -> {138}; - 150 -> {152}; - 151 -> {140} [color=green]; - 151 -> {146} [color=red]; - 152 -> {151}; - 153 -> {155}; - 154 -> {143} [color=green]; - 154 -> {146} [color=red]; - 155 -> {154}; - - subgraph cluster_19 { - color=red - 156 [label="Enter function test_6" style="filled" fillcolor=red]; - 158 [label="Postponed enter to lambda"]; - subgraph cluster_20 { - color=blue - 163 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 165 [label="Postponed enter to lambda"]; - subgraph cluster_21 { - color=blue - 168 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 170 [label="Function call: R|/materialize|()"]; - 169 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 166 [label="Postponed exit from lambda"]; - 167 [label="Function call: R|kotlin/run|(...)"]; - 164 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 159 [label="Postponed exit from lambda"]; - 160 [label="Function call: R|/myRun|(...)"]; - 161 [label="Function call: R|/id|(...)"]; - 162 [label="Variable declaration: lval x: R|kotlin/String|"]; - 157 [label="Exit function test_6" style="filled" fillcolor=red]; - } - 156 -> {158}; + 149 -> {150}; + 150 -> {151}; + 151 -> {132}; + 152 -> {154}; + 154 -> {155}; + 155 -> {156}; + 156 -> {157}; + 157 -> {158}; 158 -> {159}; - 158 -> {163} [color=red]; - 159 -> {160}; - 160 -> {161}; - 161 -> {162}; - 162 -> {157}; - 163 -> {165}; - 165 -> {168}; - 165 -> {166} [color=red]; + 159 -> {153}; + 160 -> {162}; + 162 -> {163}; + 163 -> {164}; + 164 -> {165}; + 165 -> {166}; 166 -> {167}; - 167 -> {164}; - 168 -> {170}; - 169 -> {166} [color=green]; - 170 -> {169}; + 167 -> {168}; + 168 -> {161}; + + subgraph cluster_32 { + color=red + 169 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_33 { + color=blue + 171 [label="Enter block"]; + 172 [label="Postponed enter to lambda"]; + subgraph cluster_34 { + color=blue + 184 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_35 { + color=blue + 186 [label="Enter block"]; + 187 [label="Function call: R|/materialize|()"]; + 188 [label="Exit block"]; + } + 185 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 173 [label="Postponed exit from lambda"]; + 174 [label="Function call: R|kotlin/run|(...)"]; + 175 [label="Postponed enter to lambda"]; + subgraph cluster_36 { + color=blue + 189 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_37 { + color=blue + 191 [label="Enter block"]; + 192 [label="Function call: R|/materialize|()"]; + 193 [label="Exit block"]; + } + 190 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 176 [label="Postponed exit from lambda"]; + 177 [label="Function call: R|kotlin/run|(...)"]; + 179 [label="Call arguments union" style="filled" fillcolor=yellow]; + 178 [label="Function call: R|/select|(...)"]; + 180 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 181 [label="Access variable R|/x|"]; + 182 [label="Function call: R|/takeInt|(...)"]; + 183 [label="Exit block"]; + } + 170 [label="Exit function test_5" style="filled" fillcolor=red]; + } + 169 -> {171}; + 171 -> {172}; + 172 -> {184}; + 172 -> {173} [color=red]; + 173 -> {174}; + 174 -> {175}; + 175 -> {189}; + 175 -> {176} [color=red]; + 176 -> {177}; + 177 -> {179}; + 178 -> {180}; + 179 -> {178}; + 180 -> {181}; + 181 -> {182}; + 182 -> {183}; + 183 -> {170}; + 184 -> {186}; + 185 -> {173} [color=green]; + 185 -> {179} [color=red]; + 186 -> {187}; + 187 -> {188}; + 188 -> {185}; + 189 -> {191}; + 190 -> {176} [color=green]; + 190 -> {179} [color=red]; + 191 -> {192}; + 192 -> {193}; + 193 -> {190}; + + subgraph cluster_38 { + color=red + 194 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_39 { + color=blue + 196 [label="Enter block"]; + 197 [label="Postponed enter to lambda"]; + subgraph cluster_40 { + color=blue + 203 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_41 { + color=blue + 205 [label="Enter block"]; + 206 [label="Postponed enter to lambda"]; + subgraph cluster_42 { + color=blue + 210 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_43 { + color=blue + 212 [label="Enter block"]; + 213 [label="Function call: R|/materialize|()"]; + 214 [label="Exit block"]; + } + 211 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 207 [label="Postponed exit from lambda"]; + 208 [label="Function call: R|kotlin/run|(...)"]; + 209 [label="Exit block"]; + } + 204 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 198 [label="Postponed exit from lambda"]; + 199 [label="Function call: R|/myRun|(...)"]; + 200 [label="Function call: R|/id|(...)"]; + 201 [label="Variable declaration: lval x: R|kotlin/String|"]; + 202 [label="Exit block"]; + } + 195 [label="Exit function test_6" style="filled" fillcolor=red]; + } + 194 -> {196}; + 196 -> {197}; + 197 -> {198 203}; + 198 -> {199}; + 199 -> {200}; + 200 -> {201}; + 201 -> {202}; + 202 -> {195}; + 203 -> {205}; + 205 -> {206}; + 206 -> {210}; + 206 -> {207} [color=red]; + 207 -> {208}; + 208 -> {209}; + 209 -> {204}; + 210 -> {212}; + 211 -> {207} [color=green]; + 212 -> {213}; + 213 -> {214}; + 214 -> {211}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot index 5ba9741cdb6..4e7305aea29 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlock.dot @@ -14,7 +14,7 @@ digraph initBlock_kt { subgraph cluster_1 { color=red - 9 [label="Enter class Foo" style="filled" fillcolor=red]; + 10 [label="Enter class Foo" style="filled" fillcolor=red]; subgraph cluster_2 { color=blue 3 [label="Enter init block" style="filled" fillcolor=red]; @@ -27,11 +27,11 @@ digraph initBlock_kt { } 4 [label="Exit init block" style="filled" fillcolor=red]; } - 10 [label="Exit class Foo" style="filled" fillcolor=red]; + 9 [label="Exit class Foo" style="filled" fillcolor=red]; } - 9 -> {3} [color=green]; + 10 -> {3} [color=green]; 3 -> {5}; - 4 -> {10} [color=green]; + 4 -> {9} [color=green]; 5 -> {6}; 6 -> {7}; 7 -> {8}; @@ -48,7 +48,7 @@ digraph initBlock_kt { subgraph cluster_5 { color=red - 25 [label="Enter class Bar" style="filled" fillcolor=red]; + 26 [label="Enter class Bar" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue 14 [label="Enter init block" style="filled" fillcolor=red]; @@ -66,11 +66,11 @@ digraph initBlock_kt { } 15 [label="Exit init block" style="filled" fillcolor=red]; } - 26 [label="Exit class Bar" style="filled" fillcolor=red]; + 25 [label="Exit class Bar" style="filled" fillcolor=red]; } - 25 -> {14} [color=green]; + 26 -> {14} [color=green]; 14 -> {16}; - 15 -> {26} [color=green]; + 15 -> {25} [color=green]; 16 -> {17}; 17 -> {18}; 18 -> {19}; diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot index 7e24859abde..309fd53e5ce 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/initBlockAndInPlaceLambda.dot @@ -5,60 +5,59 @@ digraph initBlockAndInPlaceLambda_kt { subgraph cluster_0 { color=red - 0 [label="Enter class B" style="filled" fillcolor=red]; - 1 [label="Exit class B" style="filled" fillcolor=red]; + 1 [label="Enter class B" style="filled" fillcolor=red]; + 0 [label="Exit class B" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; + 1 -> {0} [color=green]; subgraph cluster_1 { color=red - 6 [label="Enter class A" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 2 [label="Enter function getter" style="filled" fillcolor=red]; - 3 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_3 { - color=blue - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Exit property" style="filled" fillcolor=red]; - } - 7 [label="Exit class A" style="filled" fillcolor=red]; + 2 [label="Enter function getter" style="filled" fillcolor=red]; + 3 [label="Exit function getter" style="filled" fillcolor=red]; } - 6 -> {4} [color=green]; - 4 -> {5}; - 5 -> {7} [color=green]; 2 -> {3}; + subgraph cluster_2 { + color=red + 5 [label="Enter class A" style="filled" fillcolor=red]; + 4 [label="Exit class A" style="filled" fillcolor=red]; + } + 5 -> {4} [color=green]; + + subgraph cluster_3 { + color=red + 6 [label="Enter function " style="filled" fillcolor=red]; + 8 [label="Delegated constructor call: super()"]; + 7 [label="Exit function " style="filled" fillcolor=red]; + } + 6 -> {8}; + 8 -> {7}; + subgraph cluster_4 { color=red - 8 [label="Enter function " style="filled" fillcolor=red]; - 10 [label="Delegated constructor call: super()"]; - 9 [label="Exit function " style="filled" fillcolor=red]; - } - 8 -> {10}; - 10 -> {9}; - - subgraph cluster_5 { - color=red - 29 [label="Enter class C" style="filled" fillcolor=red]; - subgraph cluster_6 { + 30 [label="Enter class C" style="filled" fillcolor=red]; + subgraph cluster_5 { color=blue 16 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_7 { + subgraph cluster_6 { color=blue 18 [label="Enter block"]; 19 [label="Access variable R|/a|"]; 20 [label="Access variable R|/A.b|"]; 21 [label="Enter safe call"]; 23 [label="Postponed enter to lambda"]; - subgraph cluster_8 { + subgraph cluster_7 { color=blue - 11 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 13 [label="Access variable R|/a|"]; - 14 [label="Access variable R|/it|"]; - 15 [label="Function call: R|/C.C|(...)"]; - 12 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 9 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_8 { + color=blue + 11 [label="Enter block"]; + 12 [label="Access variable R|/a|"]; + 13 [label="Access variable R|/it|"]; + 14 [label="Function call: R|/C.C|(...)"]; + 15 [label="Exit block"]; + } + 10 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } 26 [label="Call arguments union" style="filled" fillcolor=yellow]; 24 [label="Postponed exit from lambda"]; @@ -69,28 +68,30 @@ digraph initBlockAndInPlaceLambda_kt { } 17 [label="Exit init block" style="filled" fillcolor=red]; } - 30 [label="Exit class C" style="filled" fillcolor=red]; + 29 [label="Exit class C" style="filled" fillcolor=red]; } - 29 -> {16} [color=green]; + 30 -> {16} [color=green]; 16 -> {18}; - 17 -> {30} [color=green]; + 17 -> {29} [color=green]; 18 -> {19}; 19 -> {20}; 20 -> {21 22}; 21 -> {23}; 22 -> {27}; - 23 -> {11}; + 23 -> {9}; 23 -> {24} [color=red]; 24 -> {25} [color=green]; 25 -> {22}; 26 -> {25} [color=red]; 27 -> {28}; 28 -> {17}; - 11 -> {13}; - 12 -> {24} [color=green]; - 12 -> {26} [color=red]; + 9 -> {11}; + 10 -> {24} [color=green]; + 10 -> {26} [color=red]; + 11 -> {12}; + 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {12}; + 15 -> {10}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.dot index 023097f593f..657fe870dd9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.dot @@ -24,38 +24,45 @@ digraph innerClassInAnonymousObject_kt { subgraph cluster_2 { color=red 6 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 8 [label="Enter block"]; + 9 [label="Exit block"]; + } 7 [label="Exit function foo" style="filled" fillcolor=red]; } - 6 -> {7}; - - subgraph cluster_3 { - color=red - 8 [label="Enter class Nested" style="filled" fillcolor=red]; - 9 [label="Exit class Nested" style="filled" fillcolor=red]; - } - 8 -> {9} [color=green]; + 6 -> {8}; + 8 -> {9}; + 9 -> {7}; subgraph cluster_4 { color=red - 10 [label="Enter class " style="filled" fillcolor=red]; - 11 [label="Exit class " style="filled" fillcolor=red]; + 11 [label="Enter class Nested" style="filled" fillcolor=red]; + 10 [label="Exit class Nested" style="filled" fillcolor=red]; } - 10 -> {11} [color=green]; + 11 -> {10} [color=green]; subgraph cluster_5 { color=red - 14 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_6 { - color=blue - 12 [label="Enter function getter" style="filled" fillcolor=red]; - 13 [label="Exit function getter" style="filled" fillcolor=red]; - } - 16 [label="Exit anonymous object"]; - 15 [label="Exit property" style="filled" fillcolor=red]; + 14 [label="Enter function getter" style="filled" fillcolor=red]; + 15 [label="Exit function getter" style="filled" fillcolor=red]; } - 14 -> {16}; - 14 -> {0 3 6} [color=red]; - 16 -> {15}; - 12 -> {13}; + 14 -> {15}; + + subgraph cluster_6 { + color=red + 16 [label="Enter property" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 13 [label="Enter class " style="filled" fillcolor=red]; + 12 [label="Exit class " style="filled" fillcolor=red]; + } + 18 [label="Exit anonymous object"]; + 17 [label="Exit property" style="filled" fillcolor=red]; + } + 16 -> {18}; + 16 -> {0 3 6} [color=red]; + 18 -> {17}; + 13 -> {12} [color=green]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.txt b/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.txt index 7611a39a83f..aec9ba50f4c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.txt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/innerClassInAnonymousObject.txt @@ -1,6 +1,6 @@ FILE: innerClassInAnonymousObject.kt - public final val x: R|anonymous| = object : R|kotlin/Any| { - private[local] constructor(): R|anonymous| { + public final val x: R|| = object : R|kotlin/Any| { + private[local] constructor(): R|| { super() } @@ -16,4 +16,4 @@ FILE: innerClassInAnonymousObject.kt } - public get(): R|anonymous| + public get(): R|| diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.dot index 2217cdf1578..e50c128f585 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/inplaceLambdaInControlFlowExpressions.dot @@ -6,187 +6,236 @@ digraph inplaceLambdaInControlFlowExpressions_kt { subgraph cluster_0 { color=red 0 [label="Enter function materialize" style="filled" fillcolor=red]; - 2 [label="Const: Null(null)"]; - 3 [label="Check not null: Null(null)!!"]; - 4 [label="Jump: ^materialize Null(null)!!"]; - 5 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Const: Null(null)"]; + 4 [label="Check not null: Null(null)!!"]; + 5 [label="Jump: ^materialize Null(null)!!"]; + 6 [label="Stub" style="filled" fillcolor=gray]; + 7 [label="Exit block" style="filled" fillcolor=gray]; + } 1 [label="Exit function materialize" style="filled" fillcolor=red]; } 0 -> {2}; 2 -> {3}; 3 -> {4}; - 4 -> {1}; - 4 -> {5} [style=dotted]; - 5 -> {1} [style=dotted]; + 4 -> {5}; + 5 -> {1}; + 5 -> {6} [style=dotted]; + 6 -> {7} [style=dotted]; + 7 -> {1} [style=dotted]; - subgraph cluster_1 { + subgraph cluster_2 { color=red - 6 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_2 { + 8 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_3 { color=blue - 8 [label="Enter when"]; - subgraph cluster_3 { - color=blue - 10 [label="Enter when branch condition "]; - 11 [label="Const: Boolean(true)"]; - 12 [label="Exit when branch condition"]; - } + 10 [label="Enter block"]; subgraph cluster_4 { color=blue - 20 [label="Enter when branch condition else"]; - 21 [label="Exit when branch condition"]; - } - 22 [label="Enter when branch result"]; - subgraph cluster_5 { - color=blue - 23 [label="Enter block"]; - 24 [label="Const: String()"]; - 25 [label="Exit block"]; - } - 26 [label="Exit when branch result"]; - 13 [label="Enter when branch result"]; - subgraph cluster_6 { - color=blue - 14 [label="Enter block"]; - 15 [label="Postponed enter to lambda"]; + 11 [label="Enter when"]; + subgraph cluster_5 { + color=blue + 13 [label="Enter when branch condition "]; + 14 [label="Const: Boolean(true)"]; + 15 [label="Exit when branch condition"]; + } + subgraph cluster_6 { + color=blue + 23 [label="Enter when branch condition else"]; + 24 [label="Exit when branch condition"]; + } + 25 [label="Enter when branch result"]; subgraph cluster_7 { color=blue - 29 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 31 [label="Function call: R|/materialize|()"]; - 30 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 26 [label="Enter block"]; + 27 [label="Const: String()"]; + 28 [label="Exit block"]; } - 16 [label="Postponed exit from lambda"]; - 17 [label="Function call: R|kotlin/run|(...)"]; - 18 [label="Exit block"]; + 29 [label="Exit when branch result"]; + 16 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 17 [label="Enter block"]; + 18 [label="Postponed enter to lambda"]; + subgraph cluster_9 { + color=blue + 33 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_10 { + color=blue + 35 [label="Enter block"]; + 36 [label="Function call: R|/materialize|()"]; + 37 [label="Exit block"]; + } + 34 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 19 [label="Postponed exit from lambda"]; + 20 [label="Function call: R|kotlin/run|(...)"]; + 21 [label="Exit block"]; + } + 22 [label="Exit when branch result"]; + 12 [label="Exit when"]; } - 19 [label="Exit when branch result"]; - 9 [label="Exit when"]; + 30 [label="Call arguments union" style="filled" fillcolor=yellow]; + 31 [label="Variable declaration: lval x: R|kotlin/String|"]; + 32 [label="Exit block"]; } - 27 [label="Call arguments union" style="filled" fillcolor=yellow]; - 28 [label="Variable declaration: lval x: R|kotlin/String|"]; - 7 [label="Exit function test_1" style="filled" fillcolor=red]; + 9 [label="Exit function test_1" style="filled" fillcolor=red]; } - 6 -> {8}; 8 -> {10}; - 9 -> {27}; 10 -> {11}; - 11 -> {12}; - 12 -> {13 20}; + 11 -> {13}; + 12 -> {30}; 13 -> {14}; 14 -> {15}; - 15 -> {29}; - 15 -> {16} [color=red]; + 15 -> {16 23}; 16 -> {17}; 17 -> {18}; - 18 -> {19}; - 19 -> {9}; + 18 -> {33}; + 18 -> {19} [color=red]; + 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {23}; + 22 -> {12}; 23 -> {24}; 24 -> {25}; 25 -> {26}; - 26 -> {9}; + 26 -> {27}; 27 -> {28}; - 28 -> {7}; - 29 -> {31}; - 30 -> {16} [color=green]; - 30 -> {27} [color=red]; - 31 -> {30}; + 28 -> {29}; + 29 -> {12}; + 30 -> {31}; + 31 -> {32}; + 32 -> {9}; + 33 -> {35}; + 34 -> {19} [color=green]; + 34 -> {30} [color=red]; + 35 -> {36}; + 36 -> {37}; + 37 -> {34}; - subgraph cluster_8 { + subgraph cluster_11 { color=red - 32 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_9 { + 38 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_12 { color=blue - 34 [label="Try expression enter"]; - subgraph cluster_10 { - color=blue - 36 [label="Try main block enter"]; - subgraph cluster_11 { - color=blue - 38 [label="Enter block"]; - 39 [label="Postponed enter to lambda"]; - subgraph cluster_12 { - color=blue - 50 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 52 [label="Function call: R|/materialize|()"]; - 51 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 40 [label="Postponed exit from lambda"]; - 41 [label="Function call: R|kotlin/run|(...)"]; - 42 [label="Exit block"]; - } - 43 [label="Try main block exit"]; - } + 40 [label="Enter block"]; subgraph cluster_13 { color=blue - 37 [label="Catch enter"]; + 41 [label="Try expression enter"]; subgraph cluster_14 { color=blue - 44 [label="Enter block"]; - 45 [label="Const: String()"]; - 46 [label="Exit block"]; + 43 [label="Try main block enter"]; + subgraph cluster_15 { + color=blue + 45 [label="Enter block"]; + 46 [label="Postponed enter to lambda"]; + subgraph cluster_16 { + color=blue + 58 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_17 { + color=blue + 60 [label="Enter block"]; + 61 [label="Function call: R|/materialize|()"]; + 62 [label="Exit block"]; + } + 59 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 47 [label="Postponed exit from lambda"]; + 48 [label="Function call: R|kotlin/run|(...)"]; + 49 [label="Exit block"]; + } + 50 [label="Try main block exit"]; } - 47 [label="Catch exit"]; + subgraph cluster_18 { + color=blue + 44 [label="Catch enter"]; + subgraph cluster_19 { + color=blue + 51 [label="Enter block"]; + 52 [label="Const: String()"]; + 53 [label="Exit block"]; + } + 54 [label="Catch exit"]; + } + 42 [label="Try expression exit"]; } - 35 [label="Try expression exit"]; + 55 [label="Call arguments union" style="filled" fillcolor=yellow]; + 56 [label="Variable declaration: lval x: R|kotlin/String|"]; + 57 [label="Exit block"]; } - 48 [label="Call arguments union" style="filled" fillcolor=yellow]; - 49 [label="Variable declaration: lval x: R|kotlin/String|"]; - 33 [label="Exit function test_2" style="filled" fillcolor=red]; + 39 [label="Exit function test_2" style="filled" fillcolor=red]; } - 32 -> {34}; - 34 -> {36}; - 35 -> {48}; - 36 -> {33 37 38}; - 37 -> {33 44}; - 38 -> {39}; - 39 -> {50}; - 39 -> {40} [color=red]; + 38 -> {40}; 40 -> {41}; - 41 -> {42}; - 42 -> {43}; - 43 -> {35}; - 44 -> {45}; + 41 -> {43}; + 42 -> {55}; + 43 -> {39 44 45}; + 44 -> {39 51}; 45 -> {46}; - 46 -> {47}; - 47 -> {35}; + 46 -> {58}; + 46 -> {47} [color=red]; + 47 -> {48}; 48 -> {49}; - 49 -> {33}; - 50 -> {52}; - 51 -> {40} [color=green]; - 51 -> {48} [color=red]; - 52 -> {51}; - - subgraph cluster_15 { - color=red - 53 [label="Enter function test_3" style="filled" fillcolor=red]; - 55 [label="Postponed enter to lambda"]; - subgraph cluster_16 { - color=blue - 61 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 63 [label="Function call: R|/materialize|()"]; - 62 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 56 [label="Postponed exit from lambda"]; - 57 [label="Function call: R|kotlin/run|(...)"]; - 58 [label="Check not null: R|kotlin/run|(...)!!"]; - 59 [label="Call arguments union" style="filled" fillcolor=yellow]; - 60 [label="Variable declaration: lval x: R|kotlin/String|"]; - 54 [label="Exit function test_3" style="filled" fillcolor=red]; - } - 53 -> {55}; - 55 -> {61}; - 55 -> {56} [color=red]; + 49 -> {50}; + 50 -> {42}; + 51 -> {52}; + 52 -> {53}; + 53 -> {54}; + 54 -> {42}; + 55 -> {56}; 56 -> {57}; - 57 -> {58}; - 58 -> {59}; - 59 -> {60}; - 60 -> {54}; - 61 -> {63}; - 62 -> {56} [color=green]; - 62 -> {59} [color=red]; - 63 -> {62}; + 57 -> {39}; + 58 -> {60}; + 59 -> {47} [color=green]; + 59 -> {55} [color=red]; + 60 -> {61}; + 61 -> {62}; + 62 -> {59}; + + subgraph cluster_20 { + color=red + 63 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_21 { + color=blue + 65 [label="Enter block"]; + 66 [label="Postponed enter to lambda"]; + subgraph cluster_22 { + color=blue + 73 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_23 { + color=blue + 75 [label="Enter block"]; + 76 [label="Function call: R|/materialize|()"]; + 77 [label="Exit block"]; + } + 74 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 67 [label="Postponed exit from lambda"]; + 68 [label="Function call: R|kotlin/run|(...)"]; + 69 [label="Check not null: R|kotlin/run|(...)!!"]; + 70 [label="Call arguments union" style="filled" fillcolor=yellow]; + 71 [label="Variable declaration: lval x: R|kotlin/String|"]; + 72 [label="Exit block"]; + } + 64 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 63 -> {65}; + 65 -> {66}; + 66 -> {73}; + 66 -> {67} [color=red]; + 67 -> {68}; + 68 -> {69}; + 69 -> {70}; + 70 -> {71}; + 71 -> {72}; + 72 -> {64}; + 73 -> {75}; + 74 -> {67} [color=green]; + 74 -> {70} [color=red]; + 75 -> {76}; + 76 -> {77}; + 77 -> {74}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/jumps.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/jumps.dot index dfdd5232c2d..42208b518ba 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/jumps.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/jumps.dot @@ -8,349 +8,405 @@ digraph jumps_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Enter when branch condition "]; - 5 [label="Access variable R|/x|"]; - 6 [label="Const: Null(null)"]; - 7 [label="Operator =="]; - 8 [label="Exit when branch condition"]; + 3 [label="Enter when"]; + subgraph cluster_3 { + color=blue + 5 [label="Enter when branch condition "]; + 6 [label="Access variable R|/x|"]; + 7 [label="Const: Null(null)"]; + 8 [label="Operator =="]; + 9 [label="Exit when branch condition"]; + } + subgraph cluster_4 { + color=blue + 17 [label="Enter when branch condition else"]; + 18 [label="Exit when branch condition"]; + } + 19 [label="Enter when branch result"]; + subgraph cluster_5 { + color=blue + 20 [label="Enter block"]; + 21 [label="Access variable R|/x|"]; + 22 [label="Exit block"]; + } + 23 [label="Exit when branch result"]; + 10 [label="Enter when branch result"]; + subgraph cluster_6 { + color=blue + 11 [label="Enter block"]; + 12 [label="Function call: R|java/lang/Exception.Exception|()"]; + 13 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 14 [label="Stub" style="filled" fillcolor=gray]; + 15 [label="Exit block" style="filled" fillcolor=gray]; + } + 16 [label="Exit when branch result" style="filled" fillcolor=gray]; + 4 [label="Exit when"]; } - subgraph cluster_3 { - color=blue - 16 [label="Enter when branch condition else"]; - 17 [label="Exit when branch condition"]; - } - 18 [label="Enter when branch result"]; - subgraph cluster_4 { - color=blue - 19 [label="Enter block"]; - 20 [label="Access variable R|/x|"]; - 21 [label="Exit block"]; - } - 22 [label="Exit when branch result"]; - 9 [label="Enter when branch result"]; - subgraph cluster_5 { - color=blue - 10 [label="Enter block"]; - 11 [label="Function call: R|java/lang/Exception.Exception|()"]; - 12 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 13 [label="Stub" style="filled" fillcolor=gray]; - 14 [label="Exit block" style="filled" fillcolor=gray]; - } - 15 [label="Exit when branch result" style="filled" fillcolor=gray]; - 3 [label="Exit when"]; + 24 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 25 [label="Access variable R|/y|"]; + 26 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 27 [label="Access variable R|/x|"]; + 28 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 29 [label="Exit block"]; } - 23 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 24 [label="Access variable R|/y|"]; - 25 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 26 [label="Access variable R|/x|"]; - 27 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {23}; - 4 -> {5}; + 2 -> {3}; + 3 -> {5}; + 4 -> {24}; 5 -> {6}; 6 -> {7}; 7 -> {8}; - 8 -> {9 16}; - 9 -> {10}; + 8 -> {9}; + 9 -> {10 17}; 10 -> {11}; 11 -> {12}; - 12 -> {1}; - 12 -> {13} [style=dotted]; + 12 -> {13}; + 13 -> {1}; 13 -> {14} [style=dotted]; 14 -> {15} [style=dotted]; - 15 -> {3} [style=dotted]; - 16 -> {17}; + 15 -> {16} [style=dotted]; + 16 -> {4} [style=dotted]; 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {3}; - 23 -> {24}; + 22 -> {23}; + 23 -> {4}; 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {1}; + 27 -> {28}; + 28 -> {29}; + 29 -> {1}; - subgraph cluster_6 { + subgraph cluster_7 { color=red - 28 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_7 { + 30 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_8 { color=blue - 30 [label="Enter when"]; - subgraph cluster_8 { - color=blue - 32 [label="Enter when branch condition "]; - 33 [label="Access variable R|/x|"]; - 34 [label="Const: Null(null)"]; - 35 [label="Operator =="]; - 36 [label="Exit when branch condition"]; - } + 32 [label="Enter block"]; subgraph cluster_9 { color=blue - 42 [label="Enter when branch condition else"]; - 43 [label="Exit when branch condition"]; + 33 [label="Enter when"]; + subgraph cluster_10 { + color=blue + 35 [label="Enter when branch condition "]; + 36 [label="Access variable R|/x|"]; + 37 [label="Const: Null(null)"]; + 38 [label="Operator =="]; + 39 [label="Exit when branch condition"]; + } + subgraph cluster_11 { + color=blue + 45 [label="Enter when branch condition else"]; + 46 [label="Exit when branch condition"]; + } + 47 [label="Enter when branch result"]; + subgraph cluster_12 { + color=blue + 48 [label="Enter block"]; + 49 [label="Access variable R|/x|"]; + 50 [label="Exit block"]; + } + 51 [label="Exit when branch result"]; + 40 [label="Enter when branch result"]; + subgraph cluster_13 { + color=blue + 41 [label="Enter block"]; + 42 [label="Access variable R|/x|"]; + 43 [label="Exit block"]; + } + 44 [label="Exit when branch result"]; + 34 [label="Exit when"]; } - 44 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 45 [label="Enter block"]; - 46 [label="Access variable R|/x|"]; - 47 [label="Exit block"]; - } - 48 [label="Exit when branch result"]; - 37 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 38 [label="Enter block"]; - 39 [label="Access variable R|/x|"]; - 40 [label="Exit block"]; - } - 41 [label="Exit when branch result"]; - 31 [label="Exit when"]; + 52 [label="Variable declaration: lval y: R|kotlin/Int?|"]; + 53 [label="Access variable R|/y|"]; + 54 [label="Function call: R|/y|.#()"]; + 55 [label="Exit block"]; } - 49 [label="Variable declaration: lval y: R|kotlin/Int?|"]; - 50 [label="Access variable R|/y|"]; - 51 [label="Function call: R|/y|.#()"]; - 29 [label="Exit function test_2" style="filled" fillcolor=red]; + 31 [label="Exit function test_2" style="filled" fillcolor=red]; } - 28 -> {30}; 30 -> {32}; - 31 -> {49}; 32 -> {33}; - 33 -> {34}; - 34 -> {35}; + 33 -> {35}; + 34 -> {52}; 35 -> {36}; - 36 -> {37 42}; + 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {40}; + 39 -> {40 45}; 40 -> {41}; - 41 -> {31}; + 41 -> {42}; 42 -> {43}; 43 -> {44}; - 44 -> {45}; + 44 -> {34}; 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {31}; + 48 -> {49}; 49 -> {50}; 50 -> {51}; - 51 -> {29}; + 51 -> {34}; + 52 -> {53}; + 53 -> {54}; + 54 -> {55}; + 55 -> {31}; - subgraph cluster_12 { + subgraph cluster_14 { color=red - 52 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_13 { + 56 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_15 { color=blue - 54 [label="Enter while loop"]; - subgraph cluster_14 { + 58 [label="Enter block"]; + subgraph cluster_16 { color=blue - 56 [label="Enter loop condition"]; - 57 [label="Const: Boolean(true)"]; - 58 [label="Exit loop condition"]; - } - subgraph cluster_15 { - color=blue - 59 [label="Enter loop block"]; - subgraph cluster_16 { + 59 [label="Enter while loop"]; + subgraph cluster_17 { color=blue - 60 [label="Enter block"]; - 61 [label="Access variable R|/x|"]; - 62 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 63 [label="Jump: break@@@[Boolean(true)] "]; - 64 [label="Stub" style="filled" fillcolor=gray]; - 65 [label="Exit block" style="filled" fillcolor=gray]; + 61 [label="Enter loop condition"]; + 62 [label="Const: Boolean(true)"]; + 63 [label="Exit loop condition"]; } - 66 [label="Exit loop block" style="filled" fillcolor=gray]; + subgraph cluster_18 { + color=blue + 64 [label="Enter loop block"]; + subgraph cluster_19 { + color=blue + 65 [label="Enter block"]; + 66 [label="Access variable R|/x|"]; + 67 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 68 [label="Jump: break@@@[Boolean(true)] "]; + 69 [label="Stub" style="filled" fillcolor=gray]; + 70 [label="Exit block" style="filled" fillcolor=gray]; + } + 71 [label="Exit loop block" style="filled" fillcolor=gray]; + } + 60 [label="Exit whileloop"]; } - 55 [label="Exit whileloop"]; + 72 [label="Access variable R|/x|"]; + 73 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 74 [label="Exit block"]; } - 67 [label="Access variable R|/x|"]; - 68 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 53 [label="Exit function test_3" style="filled" fillcolor=red]; + 57 [label="Exit function test_3" style="filled" fillcolor=red]; } - 52 -> {54}; - 54 -> {56}; - 55 -> {67}; - 56 -> {57}; - 57 -> {58}; + 56 -> {58}; 58 -> {59}; - 58 -> {55} [style=dotted]; - 59 -> {60}; - 60 -> {61}; + 59 -> {61}; + 60 -> {72}; 61 -> {62}; 62 -> {63}; - 63 -> {55}; - 63 -> {64} [style=dotted]; - 64 -> {65} [style=dotted]; - 65 -> {66} [style=dotted]; - 66 -> {56} [color=green style=dotted]; + 63 -> {64}; + 63 -> {60} [style=dotted]; + 64 -> {65}; + 65 -> {66}; + 66 -> {67}; 67 -> {68}; - 68 -> {53}; - - subgraph cluster_17 { - color=red - 69 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_18 { - color=blue - 71 [label="Enter do-while loop"]; - subgraph cluster_19 { - color=blue - 73 [label="Enter loop block"]; - subgraph cluster_20 { - color=blue - 74 [label="Enter block"]; - 75 [label="Access variable R|/x|"]; - 76 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 77 [label="Jump: break@@@[Boolean(true)] "]; - 78 [label="Stub" style="filled" fillcolor=gray]; - 79 [label="Exit block" style="filled" fillcolor=gray]; - } - 80 [label="Exit loop block" style="filled" fillcolor=gray]; - } - subgraph cluster_21 { - color=blue - 81 [label="Enter loop condition" style="filled" fillcolor=gray]; - 82 [label="Const: Boolean(true)" style="filled" fillcolor=gray]; - 83 [label="Exit loop condition" style="filled" fillcolor=gray]; - } - 72 [label="Exit do-whileloop"]; - } - 84 [label="Access variable R|/x|"]; - 85 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 70 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 69 -> {71}; - 71 -> {73}; - 72 -> {84}; + 68 -> {60}; + 68 -> {69} [style=dotted]; + 69 -> {70} [style=dotted]; + 70 -> {71} [style=dotted]; + 71 -> {61} [color=green style=dotted]; + 72 -> {73}; 73 -> {74}; - 74 -> {75}; - 75 -> {76}; - 76 -> {77}; - 77 -> {72}; - 77 -> {78} [style=dotted]; - 78 -> {79} [style=dotted]; - 79 -> {80} [style=dotted]; - 80 -> {81} [style=dotted]; - 81 -> {82} [style=dotted]; - 82 -> {83} [style=dotted]; - 83 -> {72} [style=dotted]; - 83 -> {73} [color=green style=dotted]; - 84 -> {85}; - 85 -> {70}; + 74 -> {57}; - subgraph cluster_22 { + subgraph cluster_20 { color=red - 86 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_23 { + 75 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_21 { color=blue - 88 [label="Enter while loop"]; - subgraph cluster_24 { + 77 [label="Enter block"]; + subgraph cluster_22 { color=blue - 90 [label="Enter loop condition"]; - 91 [label="Access variable R|/b|"]; - 92 [label="Exit loop condition"]; - } - subgraph cluster_25 { - color=blue - 93 [label="Enter loop block"]; - subgraph cluster_26 { + 78 [label="Enter do-while loop"]; + subgraph cluster_23 { color=blue - 94 [label="Enter block"]; - subgraph cluster_27 { + 80 [label="Enter loop block"]; + subgraph cluster_24 { color=blue - 95 [label="Enter when"]; - subgraph cluster_28 { - color=blue - 97 [label="Enter when branch condition "]; - 98 [label="Access variable R|/b|"]; - 99 [label="Exit when branch condition"]; - } - 106 [label="Synthetic else branch"]; - 100 [label="Enter when branch result"]; - subgraph cluster_29 { - color=blue - 101 [label="Enter block"]; - 102 [label="Jump: continue@@@[R|/b|] "]; - 103 [label="Stub" style="filled" fillcolor=gray]; - 104 [label="Exit block" style="filled" fillcolor=gray]; - } - 105 [label="Exit when branch result" style="filled" fillcolor=gray]; - 96 [label="Exit when"]; + 81 [label="Enter block"]; + 82 [label="Access variable R|/x|"]; + 83 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 84 [label="Jump: break@@@[Boolean(true)] "]; + 85 [label="Stub" style="filled" fillcolor=gray]; + 86 [label="Exit block" style="filled" fillcolor=gray]; } - 107 [label="Exit block"]; + 87 [label="Exit loop block" style="filled" fillcolor=gray]; } - 108 [label="Exit loop block"]; + subgraph cluster_25 { + color=blue + 88 [label="Enter loop condition" style="filled" fillcolor=gray]; + 89 [label="Const: Boolean(true)" style="filled" fillcolor=gray]; + 90 [label="Exit loop condition" style="filled" fillcolor=gray]; + } + 79 [label="Exit do-whileloop"]; } - 89 [label="Exit whileloop"]; + 91 [label="Access variable R|/x|"]; + 92 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 93 [label="Exit block"]; } - 87 [label="Exit function test_5" style="filled" fillcolor=red]; + 76 [label="Exit function test_4" style="filled" fillcolor=red]; } - 86 -> {88}; - 88 -> {90}; - 89 -> {87}; - 90 -> {91}; + 75 -> {77}; + 77 -> {78}; + 78 -> {80}; + 79 -> {91}; + 80 -> {81}; + 81 -> {82}; + 82 -> {83}; + 83 -> {84}; + 84 -> {79}; + 84 -> {85} [style=dotted]; + 85 -> {86} [style=dotted]; + 86 -> {87} [style=dotted]; + 87 -> {88} [style=dotted]; + 88 -> {89} [style=dotted]; + 89 -> {90} [style=dotted]; + 90 -> {79} [style=dotted]; + 90 -> {80} [color=green style=dotted]; 91 -> {92}; - 92 -> {89 93}; - 93 -> {94}; - 94 -> {95}; - 95 -> {97}; - 96 -> {107}; - 97 -> {98}; - 98 -> {99}; - 99 -> {100 106}; - 100 -> {101}; - 101 -> {102}; - 102 -> {103} [style=dotted]; - 102 -> {88} [color=green style=dashed]; - 103 -> {104} [style=dotted]; - 104 -> {105} [style=dotted]; - 105 -> {96} [style=dotted]; - 106 -> {96}; - 107 -> {108}; - 108 -> {90} [color=green style=dashed]; + 92 -> {93}; + 93 -> {76}; - subgraph cluster_30 { + subgraph cluster_26 { color=red - 109 [label="Enter function run" style="filled" fillcolor=red]; - 111 [label="Function call: R|/block|.R|FakeOverride|()"]; - 110 [label="Exit function run" style="filled" fillcolor=red]; - } - 109 -> {111}; - 111 -> {110}; - - subgraph cluster_31 { - color=red - 112 [label="Enter function test_6" style="filled" fillcolor=red]; - 114 [label="Postponed enter to lambda"]; - subgraph cluster_32 { + 94 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_27 { color=blue - 117 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 119 [label="Jump: ^@run Unit"]; - 120 [label="Stub" style="filled" fillcolor=gray]; - 118 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 96 [label="Enter block"]; + subgraph cluster_28 { + color=blue + 97 [label="Enter while loop"]; + subgraph cluster_29 { + color=blue + 99 [label="Enter loop condition"]; + 100 [label="Access variable R|/b|"]; + 101 [label="Exit loop condition"]; + } + subgraph cluster_30 { + color=blue + 102 [label="Enter loop block"]; + subgraph cluster_31 { + color=blue + 103 [label="Enter block"]; + subgraph cluster_32 { + color=blue + 104 [label="Enter when"]; + subgraph cluster_33 { + color=blue + 106 [label="Enter when branch condition "]; + 107 [label="Access variable R|/b|"]; + 108 [label="Exit when branch condition"]; + } + 115 [label="Synthetic else branch"]; + 109 [label="Enter when branch result"]; + subgraph cluster_34 { + color=blue + 110 [label="Enter block"]; + 111 [label="Jump: continue@@@[R|/b|] "]; + 112 [label="Stub" style="filled" fillcolor=gray]; + 113 [label="Exit block" style="filled" fillcolor=gray]; + } + 114 [label="Exit when branch result" style="filled" fillcolor=gray]; + 105 [label="Exit when"]; + } + 116 [label="Exit block"]; + } + 117 [label="Exit loop block"]; + } + 98 [label="Exit whileloop"]; + } + 118 [label="Exit block"]; } - 115 [label="Postponed exit from lambda"]; - 116 [label="Function call: R|/run|(...)"]; - 113 [label="Exit function test_6" style="filled" fillcolor=red]; + 95 [label="Exit function test_5" style="filled" fillcolor=red]; } - 112 -> {114}; - 114 -> {117}; - 114 -> {115} [color=red]; - 115 -> {116}; - 116 -> {113}; - 117 -> {118 119}; - 118 -> {115} [color=green]; - 118 -> {117} [color=green style=dashed]; - 119 -> {118}; - 119 -> {120} [style=dotted]; - 120 -> {118} [style=dotted]; + 94 -> {96}; + 96 -> {97}; + 97 -> {99}; + 98 -> {118}; + 99 -> {100}; + 100 -> {101}; + 101 -> {98 102}; + 102 -> {103}; + 103 -> {104}; + 104 -> {106}; + 105 -> {116}; + 106 -> {107}; + 107 -> {108}; + 108 -> {109 115}; + 109 -> {110}; + 110 -> {111}; + 111 -> {112} [style=dotted]; + 111 -> {97} [color=green style=dashed]; + 112 -> {113} [style=dotted]; + 113 -> {114} [style=dotted]; + 114 -> {105} [style=dotted]; + 115 -> {105}; + 116 -> {117}; + 117 -> {99} [color=green style=dashed]; + 118 -> {95}; + + subgraph cluster_35 { + color=red + 119 [label="Enter function run" style="filled" fillcolor=red]; + subgraph cluster_36 { + color=blue + 121 [label="Enter block"]; + 122 [label="Function call: R|/block|.R|FakeOverride|()"]; + 123 [label="Exit block"]; + } + 120 [label="Exit function run" style="filled" fillcolor=red]; + } + 119 -> {121}; + 121 -> {122}; + 122 -> {123}; + 123 -> {120}; + + subgraph cluster_37 { + color=red + 124 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_38 { + color=blue + 126 [label="Enter block"]; + 127 [label="Postponed enter to lambda"]; + subgraph cluster_39 { + color=blue + 131 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_40 { + color=blue + 133 [label="Enter block"]; + 134 [label="Jump: ^@run Unit"]; + 135 [label="Stub" style="filled" fillcolor=gray]; + 136 [label="Exit block" style="filled" fillcolor=gray]; + } + 132 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 128 [label="Postponed exit from lambda"]; + 129 [label="Function call: R|/run|(...)"]; + 130 [label="Exit block"]; + } + 125 [label="Exit function test_6" style="filled" fillcolor=red]; + } + 124 -> {126}; + 126 -> {127}; + 127 -> {131}; + 127 -> {128} [color=red]; + 128 -> {129}; + 129 -> {130}; + 130 -> {125}; + 131 -> {132 133}; + 132 -> {128} [color=green]; + 132 -> {131} [color=green style=dashed]; + 133 -> {134}; + 134 -> {132}; + 134 -> {135} [style=dotted]; + 135 -> {136} [style=dotted]; + 136 -> {132} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaAsReturnOfLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaAsReturnOfLambda.dot index a71167b4cd1..b748d0c7440 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaAsReturnOfLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaAsReturnOfLambda.dot @@ -5,75 +5,106 @@ digraph lambdaAsReturnOfLambda_kt { subgraph cluster_0 { color=red - 10 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_1 { - color=blue - 8 [label="Enter function getter" style="filled" fillcolor=red]; - 9 [label="Exit function getter" style="filled" fillcolor=red]; - } - 12 [label="Postponed enter to lambda"]; + 14 [label="Enter function getter" style="filled" fillcolor=red]; + 15 [label="Exit function getter" style="filled" fillcolor=red]; + } + 14 -> {15}; + + subgraph cluster_1 { + color=red + 16 [label="Enter property" style="filled" fillcolor=red]; + 18 [label="Postponed enter to lambda"]; subgraph cluster_2 { color=blue 0 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 2 [label="Jump: ^@run lambda@fun (foo: R|kotlin/String|): R|kotlin/Unit| { + subgraph cluster_3 { + color=blue + 2 [label="Enter block"]; + 3 [label="Postponed enter to lambda"]; + subgraph cluster_4 { + color=blue + 8 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 10 [label="Enter block"]; + 11 [label="Access variable R|/foo|"]; + 12 [label="Function call: R|/bar|(...)"]; + 13 [label="Exit block"]; + } + 9 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 4 [label="Postponed exit from lambda"]; + 5 [label="Jump: ^@run lambda@fun (foo: R|kotlin/String|): R|kotlin/Unit| { R|/bar|(R|/foo|) } "]; - 3 [label="Stub" style="filled" fillcolor=gray]; + 6 [label="Stub" style="filled" fillcolor=gray]; + 7 [label="Exit block" style="filled" fillcolor=gray]; + } 1 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - subgraph cluster_3 { + 19 [label="Postponed exit from lambda"]; + subgraph cluster_6 { color=blue - 4 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 6 [label="Access variable R|/foo|"]; - 7 [label="Function call: R|/bar|(...)"]; - 5 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 20 [label="Enter block"]; + 21 [label="Exit block"]; } - 13 [label="Postponed exit from lambda"]; - subgraph cluster_4 { - color=blue - 14 [label="Enter block"]; - 15 [label="Exit block"]; - } - 16 [label="Function call: R|/run| kotlin/Unit|>(...)"]; - 11 [label="Exit property" style="filled" fillcolor=red]; + 22 [label="Function call: R|/run| kotlin/Unit|>(...)"]; + 17 [label="Exit property" style="filled" fillcolor=red]; } - 10 -> {12}; - 12 -> {13}; - 12 -> {0} [color=red]; - 13 -> {14}; - 14 -> {15}; - 15 -> {16}; - 16 -> {11}; - 0 -> {2}; - 0 -> {4} [color=red]; - 2 -> {1}; - 2 -> {3} [style=dotted]; - 3 -> {1} [style=dotted]; - 4 -> {6}; - 6 -> {7}; - 7 -> {5}; - 8 -> {9}; - - subgraph cluster_5 { - color=red - 17 [label="Enter function bar" style="filled" fillcolor=red]; - 18 [label="Exit function bar" style="filled" fillcolor=red]; - } - 17 -> {18}; - - subgraph cluster_6 { - color=red - 19 [label="Enter function run" style="filled" fillcolor=red]; - 21 [label="Function call: R|/block|.R|FakeOverride|()"]; - 22 [label="Jump: ^run R|/block|.R|FakeOverride|()"]; - 23 [label="Stub" style="filled" fillcolor=gray]; - 20 [label="Exit function run" style="filled" fillcolor=red]; - } - 19 -> {21}; + 16 -> {18}; + 18 -> {19 0}; + 19 -> {20}; + 20 -> {21}; 21 -> {22}; - 22 -> {20}; - 22 -> {23} [style=dotted]; - 23 -> {20} [style=dotted]; + 22 -> {17}; + 0 -> {2}; + 2 -> {3}; + 3 -> {4 8}; + 4 -> {5}; + 5 -> {1}; + 5 -> {6} [style=dotted]; + 6 -> {7} [style=dotted]; + 7 -> {1} [style=dotted]; + 8 -> {10}; + 10 -> {11}; + 11 -> {12}; + 12 -> {13}; + 13 -> {9}; + + subgraph cluster_7 { + color=red + 23 [label="Enter function bar" style="filled" fillcolor=red]; + subgraph cluster_8 { + color=blue + 25 [label="Enter block"]; + 26 [label="Exit block"]; + } + 24 [label="Exit function bar" style="filled" fillcolor=red]; + } + 23 -> {25}; + 25 -> {26}; + 26 -> {24}; + + subgraph cluster_9 { + color=red + 27 [label="Enter function run" style="filled" fillcolor=red]; + subgraph cluster_10 { + color=blue + 29 [label="Enter block"]; + 30 [label="Function call: R|/block|.R|FakeOverride|()"]; + 31 [label="Jump: ^run R|/block|.R|FakeOverride|()"]; + 32 [label="Stub" style="filled" fillcolor=gray]; + 33 [label="Exit block" style="filled" fillcolor=gray]; + } + 28 [label="Exit function run" style="filled" fillcolor=red]; + } + 27 -> {29}; + 29 -> {30}; + 30 -> {31}; + 31 -> {28}; + 31 -> {32} [style=dotted]; + 32 -> {33} [style=dotted]; + 33 -> {28} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot index 55520d65a8e..cc64bd76b13 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdaReturningObject.dot @@ -5,79 +5,106 @@ digraph lambdaReturningObject_kt { subgraph cluster_0 { color=red - 0 [label="Enter class Out" style="filled" fillcolor=red]; - 1 [label="Exit class Out" style="filled" fillcolor=red]; + 1 [label="Enter class Out" style="filled" fillcolor=red]; + 0 [label="Exit class Out" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; + 1 -> {0} [color=green]; subgraph cluster_1 { color=red 2 [label="Enter function bar" style="filled" fillcolor=red]; + subgraph cluster_2 { + color=blue + 4 [label="Enter block"]; + 5 [label="Exit block"]; + } 3 [label="Exit function bar" style="filled" fillcolor=red]; } - 2 -> {3}; - - subgraph cluster_2 { - color=red - 4 [label="Enter class IrTypeArgument" style="filled" fillcolor=red]; - 5 [label="Exit class IrTypeArgument" style="filled" fillcolor=red]; - } - 4 -> {5} [color=green]; + 2 -> {4}; + 4 -> {5}; + 5 -> {3}; subgraph cluster_3 { color=red - 6 [label="Enter function " style="filled" fillcolor=red]; - 8 [label="Delegated constructor call: super()"]; - 7 [label="Exit function " style="filled" fillcolor=red]; + 7 [label="Enter class IrTypeArgument" style="filled" fillcolor=red]; + 6 [label="Exit class IrTypeArgument" style="filled" fillcolor=red]; } - 6 -> {8}; - 8 -> {7}; + 7 -> {6} [color=green]; subgraph cluster_4 { color=red - 9 [label="Enter class IrStarProjectionImpl" style="filled" fillcolor=red]; - 10 [label="Exit class IrStarProjectionImpl" style="filled" fillcolor=red]; + 8 [label="Enter function " style="filled" fillcolor=red]; + 10 [label="Delegated constructor call: super()"]; + 9 [label="Exit function " style="filled" fillcolor=red]; } - 9 -> {10} [color=green]; + 8 -> {10}; + 10 -> {9}; subgraph cluster_5 { color=red - 11 [label="Enter function MyOut" style="filled" fillcolor=red]; - 13 [label="Function call: R|kotlin/TODO|()"]; - 14 [label="Stub" style="filled" fillcolor=gray]; - 15 [label="Jump: ^MyOut R|kotlin/TODO|()" style="filled" fillcolor=gray]; - 16 [label="Stub" style="filled" fillcolor=gray]; - 12 [label="Exit function MyOut" style="filled" fillcolor=red]; + 12 [label="Enter class IrStarProjectionImpl" style="filled" fillcolor=red]; + 11 [label="Exit class IrStarProjectionImpl" style="filled" fillcolor=red]; } - 11 -> {13}; - 13 -> {12}; - 13 -> {14} [style=dotted]; - 14 -> {15} [style=dotted]; - 15 -> {12 16} [style=dotted]; - 16 -> {12} [style=dotted]; + 12 -> {11} [color=green]; subgraph cluster_6 { color=red - 17 [label="Enter function foo" style="filled" fillcolor=red]; - 19 [label="Postponed enter to lambda"]; + 13 [label="Enter function MyOut" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue - 23 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 25 [label="Access qualifier /IrStarProjectionImpl"]; - 24 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 15 [label="Enter block"]; + 16 [label="Function call: R|kotlin/TODO|()"]; + 17 [label="Stub" style="filled" fillcolor=gray]; + 18 [label="Jump: ^MyOut R|kotlin/TODO|()" style="filled" fillcolor=gray]; + 19 [label="Stub" style="filled" fillcolor=gray]; + 20 [label="Exit block" style="filled" fillcolor=gray]; } - 20 [label="Postponed exit from lambda"]; - 21 [label="Function call: R|/MyOut|(...)"]; - 22 [label="Function call: R|/bar|(...)"]; - 18 [label="Exit function foo" style="filled" fillcolor=red]; + 14 [label="Exit function MyOut" style="filled" fillcolor=red]; } - 17 -> {19}; - 19 -> {20}; - 19 -> {23} [color=red]; - 20 -> {21}; - 21 -> {22}; - 22 -> {18}; - 23 -> {25}; - 25 -> {24}; + 13 -> {15}; + 15 -> {16}; + 16 -> {14}; + 16 -> {17} [style=dotted]; + 17 -> {18} [style=dotted]; + 18 -> {14 19} [style=dotted]; + 19 -> {20} [style=dotted]; + 20 -> {14} [style=dotted]; + + subgraph cluster_8 { + color=red + 21 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 23 [label="Enter block"]; + 24 [label="Postponed enter to lambda"]; + subgraph cluster_10 { + color=blue + 29 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 31 [label="Enter block"]; + 32 [label="Access qualifier /IrStarProjectionImpl"]; + 33 [label="Exit block"]; + } + 30 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 25 [label="Postponed exit from lambda"]; + 26 [label="Function call: R|/MyOut|(...)"]; + 27 [label="Function call: R|/bar|(...)"]; + 28 [label="Exit block"]; + } + 22 [label="Exit function foo" style="filled" fillcolor=red]; + } + 21 -> {23}; + 23 -> {24}; + 24 -> {25 29}; + 25 -> {26}; + 26 -> {27}; + 27 -> {28}; + 28 -> {22}; + 29 -> {31}; + 31 -> {32}; + 32 -> {33}; + 33 -> {30}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot index 3c4b2c8bcca..4007ae6eb6d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/lambdas.dot @@ -6,208 +6,281 @@ digraph lambdas_kt { subgraph cluster_0 { color=red 0 [label="Enter function run" style="filled" fillcolor=red]; - 2 [label="Function call: R|/block|.R|FakeOverride|()"]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Function call: R|/block|.R|FakeOverride|()"]; + 4 [label="Exit block"]; + } 1 [label="Exit function run" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {1}; + 2 -> {3}; + 3 -> {4}; + 4 -> {1}; - subgraph cluster_1 { + subgraph cluster_2 { color=red - 3 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_2 { + 5 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_3 { color=blue - 5 [label="Enter when"]; - subgraph cluster_3 { - color=blue - 7 [label="Enter when branch condition "]; - 8 [label="Access variable R|/x|"]; - 9 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 10 [label="Exit when branch condition"]; - } - 18 [label="Synthetic else branch"]; - 11 [label="Enter when branch result"]; + 7 [label="Enter block"]; subgraph cluster_4 { color=blue - 12 [label="Enter block"]; - 13 [label="Postponed enter to lambda"]; + 8 [label="Enter when"]; subgraph cluster_5 { color=blue - 19 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 21 [label="Access variable R|/x|"]; - 22 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 20 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 10 [label="Enter when branch condition "]; + 11 [label="Access variable R|/x|"]; + 12 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; + 13 [label="Exit when branch condition"]; } - 14 [label="Postponed exit from lambda"]; - 15 [label="Function call: R|/run|(...)"]; - 16 [label="Exit block"]; + 21 [label="Synthetic else branch"]; + 14 [label="Enter when branch result"]; + subgraph cluster_6 { + color=blue + 15 [label="Enter block"]; + 16 [label="Postponed enter to lambda"]; + subgraph cluster_7 { + color=blue + 23 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_8 { + color=blue + 25 [label="Enter block"]; + 26 [label="Access variable R|/x|"]; + 27 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 28 [label="Exit block"]; + } + 24 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 17 [label="Postponed exit from lambda"]; + 18 [label="Function call: R|/run|(...)"]; + 19 [label="Exit block"]; + } + 20 [label="Exit when branch result"]; + 9 [label="Exit when"]; } - 17 [label="Exit when branch result"]; - 6 [label="Exit when"]; + 22 [label="Exit block"]; } - 4 [label="Exit function test_1" style="filled" fillcolor=red]; + 6 [label="Exit function test_1" style="filled" fillcolor=red]; } - 3 -> {5}; 5 -> {7}; - 6 -> {4}; 7 -> {8}; - 8 -> {9}; - 9 -> {10}; - 10 -> {11 18}; + 8 -> {10}; + 9 -> {22}; + 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {19}; - 13 -> {14} [color=red]; + 13 -> {14 21}; 14 -> {15}; 15 -> {16}; - 16 -> {17}; - 17 -> {6}; - 18 -> {6}; - 19 -> {20 21}; - 20 -> {14} [color=green]; - 20 -> {19} [color=green style=dashed]; - 21 -> {22}; - 22 -> {20}; + 16 -> {23}; + 16 -> {17} [color=red]; + 17 -> {18}; + 18 -> {19}; + 19 -> {20}; + 20 -> {9}; + 21 -> {9}; + 22 -> {6}; + 23 -> {24 25}; + 24 -> {17} [color=green]; + 24 -> {23} [color=green style=dashed]; + 25 -> {26}; + 26 -> {27}; + 27 -> {28}; + 28 -> {24}; - subgraph cluster_6 { + subgraph cluster_9 { color=red - 23 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_7 { - color=blue - 25 [label="Enter when"]; - subgraph cluster_8 { - color=blue - 27 [label="Enter when branch condition "]; - 28 [label="Access variable R|/x|"]; - 29 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 30 [label="Exit when branch condition"]; - } - 36 [label="Synthetic else branch"]; - 31 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 32 [label="Enter block"]; - 33 [label="Variable declaration: lval lambda: R|() -> kotlin/Int|"]; - 34 [label="Exit block"]; - } - 35 [label="Exit when branch result"]; - 26 [label="Exit when"]; - } + 29 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_10 { color=blue - 37 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 39 [label="Access variable R|/x|"]; - 40 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 38 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 31 [label="Enter block"]; + subgraph cluster_11 { + color=blue + 32 [label="Enter when"]; + subgraph cluster_12 { + color=blue + 34 [label="Enter when branch condition "]; + 35 [label="Access variable R|/x|"]; + 36 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; + 37 [label="Exit when branch condition"]; + } + 45 [label="Synthetic else branch"]; + 38 [label="Enter when branch result"]; + subgraph cluster_13 { + color=blue + 39 [label="Enter block"]; + 40 [label="Postponed enter to lambda"]; + subgraph cluster_14 { + color=blue + 47 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_15 { + color=blue + 49 [label="Enter block"]; + 50 [label="Access variable R|/x|"]; + 51 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 52 [label="Exit block"]; + } + 48 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 41 [label="Postponed exit from lambda"]; + 42 [label="Variable declaration: lval lambda: R|() -> kotlin/Int|"]; + 43 [label="Exit block"]; + } + 44 [label="Exit when branch result"]; + 33 [label="Exit when"]; + } + 46 [label="Exit block"]; } - 24 [label="Exit function test_2" style="filled" fillcolor=red]; + 30 [label="Exit function test_2" style="filled" fillcolor=red]; } - 23 -> {25}; - 25 -> {27}; - 26 -> {24}; - 27 -> {28}; - 28 -> {29}; - 29 -> {30}; - 30 -> {31 36}; + 29 -> {31}; 31 -> {32}; - 32 -> {33}; - 32 -> {37} [color=red]; - 33 -> {34}; + 32 -> {34}; + 33 -> {46}; 34 -> {35}; - 35 -> {26}; - 36 -> {26}; - 37 -> {39}; + 35 -> {36}; + 36 -> {37}; + 37 -> {38 45}; + 38 -> {39}; 39 -> {40}; - 40 -> {38}; - - subgraph cluster_11 { - color=red - 41 [label="Enter function getInt" style="filled" fillcolor=red]; - 43 [label="Function call: R|/block|.R|FakeOverride|()"]; - 44 [label="Const: Int(1)"]; - 45 [label="Jump: ^getInt Int(1)"]; - 46 [label="Stub" style="filled" fillcolor=gray]; - 42 [label="Exit function getInt" style="filled" fillcolor=red]; - } - 41 -> {43}; + 40 -> {41 47}; + 41 -> {42}; + 42 -> {43}; 43 -> {44}; - 44 -> {45}; - 45 -> {42}; - 45 -> {46} [style=dotted]; - 46 -> {42} [style=dotted]; - - subgraph cluster_12 { - color=red - 47 [label="Enter function test_3" style="filled" fillcolor=red]; - 49 [label="Postponed enter to lambda"]; - subgraph cluster_13 { - color=blue - 54 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 56 [label="Const: Int(1)"]; - 57 [label="Jump: ^test_3 Int(1)"]; - 58 [label="Stub" style="filled" fillcolor=gray]; - 55 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 50 [label="Postponed exit from lambda"]; - 51 [label="Function call: R|/getInt|(...)"]; - 52 [label="Jump: ^test_3 R|/getInt|( = getInt@fun (): R|kotlin/Unit| { - ^test_3 Int(1) -} -)"]; - 53 [label="Stub" style="filled" fillcolor=gray]; - 48 [label="Exit function test_3" style="filled" fillcolor=red]; - } + 44 -> {33}; + 45 -> {33}; + 46 -> {30}; 47 -> {49}; - 49 -> {54}; - 49 -> {50} [color=red]; + 49 -> {50}; 50 -> {51}; 51 -> {52}; 52 -> {48}; - 52 -> {53} [style=dotted]; - 53 -> {48} [style=dotted]; - 54 -> {55 56}; - 55 -> {50} [color=green]; - 55 -> {54} [color=green style=dashed]; - 56 -> {57}; - 57 -> {48}; - 57 -> {58} [style=dotted]; - 58 -> {55} [style=dotted]; - subgraph cluster_14 { + subgraph cluster_16 { color=red - 59 [label="Enter function test_4" style="filled" fillcolor=red]; - 61 [label="Postponed enter to lambda"]; - subgraph cluster_15 { + 53 [label="Enter function getInt" style="filled" fillcolor=red]; + subgraph cluster_17 { color=blue - 66 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 68 [label="Const: Int(1)"]; - 69 [label="Jump: ^test_4 Int(1)"]; - 70 [label="Stub" style="filled" fillcolor=gray]; - 67 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 55 [label="Enter block"]; + 56 [label="Function call: R|/block|.R|FakeOverride|()"]; + 57 [label="Const: Int(1)"]; + 58 [label="Jump: ^getInt Int(1)"]; + 59 [label="Stub" style="filled" fillcolor=gray]; + 60 [label="Exit block" style="filled" fillcolor=gray]; } - 62 [label="Postponed exit from lambda"]; - 63 [label="Function call: R|/getInt|(...)"]; - 64 [label="Jump: ^test_4 R|/getInt|(block = getInt@fun (): R|kotlin/Unit| { + 54 [label="Exit function getInt" style="filled" fillcolor=red]; + } + 53 -> {55}; + 55 -> {56}; + 56 -> {57}; + 57 -> {58}; + 58 -> {54}; + 58 -> {59} [style=dotted]; + 59 -> {60} [style=dotted]; + 60 -> {54} [style=dotted]; + + subgraph cluster_18 { + color=red + 61 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 63 [label="Enter block"]; + 64 [label="Postponed enter to lambda"]; + subgraph cluster_20 { + color=blue + 70 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_21 { + color=blue + 72 [label="Enter block"]; + 73 [label="Const: Int(1)"]; + 74 [label="Jump: ^test_3 Int(1)"]; + 75 [label="Stub" style="filled" fillcolor=gray]; + 76 [label="Exit block" style="filled" fillcolor=gray]; + } + 71 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 65 [label="Postponed exit from lambda"]; + 66 [label="Function call: R|/getInt|(...)"]; + 67 [label="Jump: ^test_3 R|/getInt|( = getInt@fun (): R|kotlin/Unit| { + ^test_3 Int(1) +} +)"]; + 68 [label="Stub" style="filled" fillcolor=gray]; + 69 [label="Exit block" style="filled" fillcolor=gray]; + } + 62 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 61 -> {63}; + 63 -> {64}; + 64 -> {70}; + 64 -> {65} [color=red]; + 65 -> {66}; + 66 -> {67}; + 67 -> {62}; + 67 -> {68} [style=dotted]; + 68 -> {69} [style=dotted]; + 69 -> {62} [style=dotted]; + 70 -> {71 72}; + 71 -> {65} [color=green]; + 71 -> {70} [color=green style=dashed]; + 72 -> {73}; + 73 -> {74}; + 74 -> {62}; + 74 -> {75} [style=dotted]; + 75 -> {76} [style=dotted]; + 76 -> {71} [style=dotted]; + + subgraph cluster_22 { + color=red + 77 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_23 { + color=blue + 79 [label="Enter block"]; + 80 [label="Postponed enter to lambda"]; + subgraph cluster_24 { + color=blue + 86 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_25 { + color=blue + 88 [label="Enter block"]; + 89 [label="Const: Int(1)"]; + 90 [label="Jump: ^test_4 Int(1)"]; + 91 [label="Stub" style="filled" fillcolor=gray]; + 92 [label="Exit block" style="filled" fillcolor=gray]; + } + 87 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 81 [label="Postponed exit from lambda"]; + 82 [label="Function call: R|/getInt|(...)"]; + 83 [label="Jump: ^test_4 R|/getInt|(block = getInt@fun (): R|kotlin/Unit| { ^test_4 Int(1) } )"]; - 65 [label="Stub" style="filled" fillcolor=gray]; - 60 [label="Exit function test_4" style="filled" fillcolor=red]; + 84 [label="Stub" style="filled" fillcolor=gray]; + 85 [label="Exit block" style="filled" fillcolor=gray]; + } + 78 [label="Exit function test_4" style="filled" fillcolor=red]; } - 59 -> {61}; - 61 -> {66}; - 61 -> {62} [color=red]; - 62 -> {63}; - 63 -> {64}; - 64 -> {60}; - 64 -> {65} [style=dotted]; - 65 -> {60} [style=dotted]; - 66 -> {67 68}; - 67 -> {62} [color=green]; - 67 -> {66} [color=green style=dashed]; - 68 -> {69}; - 69 -> {60}; - 69 -> {70} [style=dotted]; - 70 -> {67} [style=dotted]; + 77 -> {79}; + 79 -> {80}; + 80 -> {86}; + 80 -> {81} [color=red]; + 81 -> {82}; + 82 -> {83}; + 83 -> {78}; + 83 -> {84} [style=dotted]; + 84 -> {85} [style=dotted]; + 85 -> {78} [style=dotted]; + 86 -> {87 88}; + 87 -> {81} [color=green]; + 87 -> {86} [color=green style=dashed]; + 88 -> {89}; + 89 -> {90}; + 90 -> {78}; + 90 -> {91} [style=dotted]; + 91 -> {92} [style=dotted]; + 92 -> {87} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot index 2a180cb1101..9b4872834f3 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/localClassesWithImplicit.dot @@ -6,159 +6,160 @@ digraph localClassesWithImplicit_kt { subgraph cluster_0 { color=red 0 [label="Enter function myRun" style="filled" fillcolor=red]; - 2 [label="Function call: R|/block|.R|FakeOverride|()"]; - 3 [label="Jump: ^myRun R|/block|.R|FakeOverride|()"]; - 4 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Function call: R|/block|.R|FakeOverride|()"]; + 4 [label="Jump: ^myRun R|/block|.R|FakeOverride|()"]; + 5 [label="Stub" style="filled" fillcolor=gray]; + 6 [label="Exit block" style="filled" fillcolor=gray]; + } 1 [label="Exit function myRun" style="filled" fillcolor=red]; } 0 -> {2}; 2 -> {3}; - 3 -> {1}; - 3 -> {4} [style=dotted]; - 4 -> {1} [style=dotted]; + 3 -> {4}; + 4 -> {1}; + 4 -> {5} [style=dotted]; + 5 -> {6} [style=dotted]; + 6 -> {1} [style=dotted]; - subgraph cluster_1 { + subgraph cluster_2 { color=red - 5 [label="Enter function test" style="filled" fillcolor=red]; - subgraph cluster_2 { + 7 [label="Enter function test" style="filled" fillcolor=red]; + subgraph cluster_3 { color=blue - 7 [label="Enter when"]; - subgraph cluster_3 { - color=blue - 9 [label="Enter when branch condition "]; - 10 [label="Access variable R|/a|"]; - 11 [label="Type operator: (R|/a| !is R|kotlin/String|)"]; - 12 [label="Exit when branch condition"]; - } - 19 [label="Synthetic else branch"]; - 13 [label="Enter when branch result"]; - subgraph cluster_4 { - color=blue - 14 [label="Enter block"]; - 15 [label="Jump: ^test Unit"]; - 16 [label="Stub" style="filled" fillcolor=gray]; - 17 [label="Exit block" style="filled" fillcolor=gray]; - } - 18 [label="Exit when branch result" style="filled" fillcolor=gray]; - 8 [label="Exit when"]; + 30 [label="Enter class " style="filled" fillcolor=red]; + 29 [label="Exit class " style="filled" fillcolor=red]; } - 20 [label="Exit local class test"]; - 21 [label="Exit anonymous object"]; - 22 [label="Variable declaration: lval x: R||"]; - 6 [label="Exit function test" style="filled" fillcolor=red]; + subgraph cluster_4 { + color=blue + 28 [label="Enter class A" style="filled" fillcolor=red]; + 27 [label="Exit class A" style="filled" fillcolor=red]; + } + subgraph cluster_5 { + color=blue + 9 [label="Enter block"]; + subgraph cluster_6 { + color=blue + 10 [label="Enter when"]; + subgraph cluster_7 { + color=blue + 12 [label="Enter when branch condition "]; + 13 [label="Access variable R|/a|"]; + 14 [label="Type operator: (R|/a| !is R|kotlin/String|)"]; + 15 [label="Exit when branch condition"]; + } + 22 [label="Synthetic else branch"]; + 16 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 17 [label="Enter block"]; + 18 [label="Jump: ^test Unit"]; + 19 [label="Stub" style="filled" fillcolor=gray]; + 20 [label="Exit block" style="filled" fillcolor=gray]; + } + 21 [label="Exit when branch result" style="filled" fillcolor=gray]; + 11 [label="Exit when"]; + } + 23 [label="Exit local class test"]; + 24 [label="Exit anonymous object"]; + 25 [label="Variable declaration: lval x: R||"]; + 26 [label="Exit block"]; + } + 8 [label="Exit function test" style="filled" fillcolor=red]; } - 5 -> {7}; 7 -> {9}; - 8 -> {20}; - 8 -> {23 26 57 71} [color=red]; 9 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {13 19}; + 10 -> {12}; + 11 -> {23}; + 11 -> {31 34 69 87} [color=red]; + 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {6}; - 15 -> {16} [style=dotted]; - 16 -> {17} [style=dotted]; - 17 -> {18} [style=dotted]; - 18 -> {8} [style=dotted]; - 19 -> {8}; - 20 -> {21}; - 20 -> {78 81 112 126} [color=red]; - 21 -> {22}; - 22 -> {6}; + 15 -> {16 22}; + 16 -> {17}; + 17 -> {18}; + 18 -> {8}; + 18 -> {19} [style=dotted]; + 19 -> {20} [style=dotted]; + 20 -> {21} [style=dotted]; + 21 -> {11} [style=dotted]; + 22 -> {11}; + 23 -> {24}; + 23 -> {94 97 132 150} [color=red]; + 24 -> {25}; + 25 -> {26}; + 26 -> {8}; + 28 -> {27} [color=green]; + 30 -> {29} [color=green]; - subgraph cluster_5 { + subgraph cluster_9 { color=red - 23 [label="Enter function " style="filled" fillcolor=red]; - 25 [label="Delegated constructor call: super()"]; - 24 [label="Exit function " style="filled" fillcolor=red]; + 31 [label="Enter function " style="filled" fillcolor=red]; + 33 [label="Delegated constructor call: super()"]; + 32 [label="Exit function " style="filled" fillcolor=red]; } - 23 -> {25}; - 25 -> {24}; + 31 -> {33}; + 33 -> {32}; - subgraph cluster_6 { + subgraph cluster_10 { color=red - 26 [label="Enter function foo" style="filled" fillcolor=red]; - subgraph cluster_7 { + 34 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_11 { color=blue - 71 [label="Enter function baz" style="filled" fillcolor=red]; - 73 [label="Const: Int(1)"]; - 74 [label="Jump: ^baz Int(1)"]; - 75 [label="Stub" style="filled" fillcolor=gray]; - 72 [label="Exit function baz" style="filled" fillcolor=red]; - } - subgraph cluster_8 { - color=blue - 57 [label="Enter function bar" style="filled" fillcolor=red]; - 59 [label="Postponed enter to lambda"]; - subgraph cluster_9 { + 36 [label="Enter block"]; + 37 [label="Postponed enter to lambda"]; + subgraph cluster_12 { color=blue - 64 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 66 [label="Access variable R|/b|"]; - 67 [label="Access variable #"]; - 68 [label="Access variable R|/a|"]; - 69 [label="Access variable R|kotlin/String.length|"]; - 70 [label="Function call: this@R|/A|.R|/A.baz|()"]; - 65 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 60 [label="Postponed exit from lambda"]; - 61 [label="Function call: R|/myRun|(...)"]; - 62 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { - R|/b|.# - R|/a|.R|kotlin/String.length| - ^ this@R|/A|.R|/A.baz|() -} -)"]; - 63 [label="Stub" style="filled" fillcolor=gray]; - 58 [label="Exit function bar" style="filled" fillcolor=red]; - } - 28 [label="Postponed enter to lambda"]; - subgraph cluster_10 { - color=blue - 33 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 35 [label="Access variable R|/a|"]; - 36 [label="Access variable R|kotlin/String.length|"]; - subgraph cluster_11 { - color=blue - 37 [label="Enter when"]; - subgraph cluster_12 { - color=blue - 39 [label="Enter when branch condition "]; - 40 [label="Access variable R|/b|"]; - 41 [label="Type operator: (R|/b| is R|kotlin/String|)"]; - 42 [label="Exit when branch condition"]; - } + 43 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; subgraph cluster_13 { color=blue - 50 [label="Enter when branch condition else"]; - 51 [label="Exit when branch condition"]; + 45 [label="Enter block"]; + 46 [label="Access variable R|/a|"]; + 47 [label="Access variable R|kotlin/String.length|"]; + subgraph cluster_14 { + color=blue + 48 [label="Enter when"]; + subgraph cluster_15 { + color=blue + 50 [label="Enter when branch condition "]; + 51 [label="Access variable R|/b|"]; + 52 [label="Type operator: (R|/b| is R|kotlin/String|)"]; + 53 [label="Exit when branch condition"]; + } + subgraph cluster_16 { + color=blue + 61 [label="Enter when branch condition else"]; + 62 [label="Exit when branch condition"]; + } + 63 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 64 [label="Enter block"]; + 65 [label="Const: Int(1)"]; + 66 [label="Exit block"]; + } + 67 [label="Exit when branch result"]; + 54 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 55 [label="Enter block"]; + 56 [label="Access variable R|/b|"]; + 57 [label="Access variable R|kotlin/String.length|"]; + 58 [label="Function call: this@R|/A|.R|/A.bar|()"]; + 59 [label="Exit block"]; + } + 60 [label="Exit when branch result"]; + 49 [label="Exit when"]; + } + 68 [label="Exit block"]; } - 52 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 53 [label="Enter block"]; - 54 [label="Const: Int(1)"]; - 55 [label="Exit block"]; - } - 56 [label="Exit when branch result"]; - 43 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 44 [label="Enter block"]; - 45 [label="Access variable R|/b|"]; - 46 [label="Access variable R|kotlin/String.length|"]; - 47 [label="Function call: this@R|/A|.R|/A.bar|()"]; - 48 [label="Exit block"]; - } - 49 [label="Exit when branch result"]; - 38 [label="Exit when"]; + 44 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - 34 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 29 [label="Postponed exit from lambda"]; - 30 [label="Function call: R|/myRun|(...)"]; - 31 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 38 [label="Postponed exit from lambda"]; + 39 [label="Function call: R|/myRun|(...)"]; + 40 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| ^ when () { (R|/b| is R|kotlin/String|) -> { @@ -172,129 +173,192 @@ digraph localClassesWithImplicit_kt { } )"]; - 32 [label="Stub" style="filled" fillcolor=gray]; - 27 [label="Exit function foo" style="filled" fillcolor=red]; + 41 [label="Stub" style="filled" fillcolor=gray]; + 42 [label="Exit block" style="filled" fillcolor=gray]; + } + 35 [label="Exit function foo" style="filled" fillcolor=red]; } - 26 -> {28}; - 28 -> {33}; - 28 -> {29} [color=red]; - 29 -> {30}; - 30 -> {31}; - 31 -> {27}; - 31 -> {32} [style=dotted]; - 32 -> {27} [style=dotted]; - 33 -> {34 35}; - 34 -> {29} [color=green]; - 34 -> {33} [color=green style=dashed]; - 35 -> {36}; + 34 -> {36}; 36 -> {37}; - 37 -> {39}; - 38 -> {34}; + 37 -> {43}; + 37 -> {38} [color=red]; + 38 -> {39}; 39 -> {40}; - 40 -> {41}; - 41 -> {42}; - 42 -> {43 50}; - 43 -> {44}; - 44 -> {45}; + 40 -> {35}; + 40 -> {41} [style=dotted]; + 41 -> {42} [style=dotted]; + 42 -> {35} [style=dotted]; + 43 -> {44 45}; + 44 -> {38} [color=green]; + 44 -> {43} [color=green style=dashed]; 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {49}; - 49 -> {38}; + 48 -> {50}; + 49 -> {68}; 50 -> {51}; 51 -> {52}; 52 -> {53}; - 53 -> {54}; + 53 -> {54 61}; 54 -> {55}; 55 -> {56}; - 56 -> {38}; - 57 -> {59}; - 59 -> {64}; - 59 -> {60} [color=red]; - 60 -> {61}; + 56 -> {57}; + 57 -> {58}; + 58 -> {59}; + 59 -> {60}; + 60 -> {49}; 61 -> {62}; - 62 -> {58}; - 62 -> {63} [style=dotted]; - 63 -> {58} [style=dotted]; - 64 -> {65 66}; - 65 -> {60} [color=green]; - 65 -> {64} [color=green style=dashed]; + 62 -> {63}; + 63 -> {64}; + 64 -> {65}; + 65 -> {66}; 66 -> {67}; - 67 -> {68}; - 68 -> {69}; - 69 -> {70}; - 70 -> {65}; - 71 -> {73}; - 73 -> {74}; - 74 -> {72}; - 74 -> {75} [style=dotted]; - 75 -> {72} [style=dotted]; + 67 -> {49}; + 68 -> {44}; - subgraph cluster_16 { + subgraph cluster_19 { color=red - 76 [label="Enter class A" style="filled" fillcolor=red]; - 77 [label="Exit class A" style="filled" fillcolor=red]; - } - 76 -> {77} [color=green]; - - subgraph cluster_17 { - color=red - 78 [label="Enter function " style="filled" fillcolor=red]; - 80 [label="Delegated constructor call: super()"]; - 79 [label="Exit function " style="filled" fillcolor=red]; - } - 78 -> {80}; - 80 -> {79}; - - subgraph cluster_18 { - color=red - 81 [label="Enter function foo" style="filled" fillcolor=red]; - 83 [label="Postponed enter to lambda"]; - subgraph cluster_19 { + 69 [label="Enter function bar" style="filled" fillcolor=red]; + subgraph cluster_20 { color=blue - 88 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 90 [label="Access variable R|/a|"]; - 91 [label="Access variable R|kotlin/String.length|"]; - subgraph cluster_20 { + 71 [label="Enter block"]; + 72 [label="Postponed enter to lambda"]; + subgraph cluster_21 { color=blue - 92 [label="Enter when"]; - subgraph cluster_21 { - color=blue - 94 [label="Enter when branch condition "]; - 95 [label="Access variable R|/b|"]; - 96 [label="Type operator: (R|/b| is R|kotlin/String|)"]; - 97 [label="Exit when branch condition"]; - } + 78 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; subgraph cluster_22 { color=blue - 105 [label="Enter when branch condition else"]; - 106 [label="Exit when branch condition"]; + 80 [label="Enter block"]; + 81 [label="Access variable R|/b|"]; + 82 [label="Access variable #"]; + 83 [label="Access variable R|/a|"]; + 84 [label="Access variable R|kotlin/String.length|"]; + 85 [label="Function call: this@R|/A|.R|/A.baz|()"]; + 86 [label="Exit block"]; } - 107 [label="Enter when branch result"]; - subgraph cluster_23 { + 79 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 73 [label="Postponed exit from lambda"]; + 74 [label="Function call: R|/myRun|(...)"]; + 75 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { + R|/b|.# + R|/a|.R|kotlin/String.length| + ^ this@R|/A|.R|/A.baz|() +} +)"]; + 76 [label="Stub" style="filled" fillcolor=gray]; + 77 [label="Exit block" style="filled" fillcolor=gray]; + } + 70 [label="Exit function bar" style="filled" fillcolor=red]; + } + 69 -> {71}; + 71 -> {72}; + 72 -> {78}; + 72 -> {73} [color=red]; + 73 -> {74}; + 74 -> {75}; + 75 -> {70}; + 75 -> {76} [style=dotted]; + 76 -> {77} [style=dotted]; + 77 -> {70} [style=dotted]; + 78 -> {79 80}; + 79 -> {73} [color=green]; + 79 -> {78} [color=green style=dashed]; + 80 -> {81}; + 81 -> {82}; + 82 -> {83}; + 83 -> {84}; + 84 -> {85}; + 85 -> {86}; + 86 -> {79}; + + subgraph cluster_23 { + color=red + 87 [label="Enter function baz" style="filled" fillcolor=red]; + subgraph cluster_24 { + color=blue + 89 [label="Enter block"]; + 90 [label="Const: Int(1)"]; + 91 [label="Jump: ^baz Int(1)"]; + 92 [label="Stub" style="filled" fillcolor=gray]; + 93 [label="Exit block" style="filled" fillcolor=gray]; + } + 88 [label="Exit function baz" style="filled" fillcolor=red]; + } + 87 -> {89}; + 89 -> {90}; + 90 -> {91}; + 91 -> {88}; + 91 -> {92} [style=dotted]; + 92 -> {93} [style=dotted]; + 93 -> {88} [style=dotted]; + + subgraph cluster_25 { + color=red + 94 [label="Enter function " style="filled" fillcolor=red]; + 96 [label="Delegated constructor call: super()"]; + 95 [label="Exit function " style="filled" fillcolor=red]; + } + 94 -> {96}; + 96 -> {95}; + + subgraph cluster_26 { + color=red + 97 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_27 { + color=blue + 99 [label="Enter block"]; + 100 [label="Postponed enter to lambda"]; + subgraph cluster_28 { + color=blue + 106 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_29 { color=blue 108 [label="Enter block"]; - 109 [label="Const: Int(1)"]; - 110 [label="Exit block"]; + 109 [label="Access variable R|/a|"]; + 110 [label="Access variable R|kotlin/String.length|"]; + subgraph cluster_30 { + color=blue + 111 [label="Enter when"]; + subgraph cluster_31 { + color=blue + 113 [label="Enter when branch condition "]; + 114 [label="Access variable R|/b|"]; + 115 [label="Type operator: (R|/b| is R|kotlin/String|)"]; + 116 [label="Exit when branch condition"]; + } + subgraph cluster_32 { + color=blue + 124 [label="Enter when branch condition else"]; + 125 [label="Exit when branch condition"]; + } + 126 [label="Enter when branch result"]; + subgraph cluster_33 { + color=blue + 127 [label="Enter block"]; + 128 [label="Const: Int(1)"]; + 129 [label="Exit block"]; + } + 130 [label="Exit when branch result"]; + 117 [label="Enter when branch result"]; + subgraph cluster_34 { + color=blue + 118 [label="Enter block"]; + 119 [label="Access variable R|/b|"]; + 120 [label="Access variable R|kotlin/String.length|"]; + 121 [label="Function call: this@R|/|.R|/.bar|()"]; + 122 [label="Exit block"]; + } + 123 [label="Exit when branch result"]; + 112 [label="Exit when"]; + } + 131 [label="Exit block"]; } - 111 [label="Exit when branch result"]; - 98 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 99 [label="Enter block"]; - 100 [label="Access variable R|/b|"]; - 101 [label="Access variable R|kotlin/String.length|"]; - 102 [label="Function call: this@R|/|.R|/.bar|()"]; - 103 [label="Exit block"]; - } - 104 [label="Exit when branch result"]; - 93 [label="Exit when"]; + 107 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - 89 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 84 [label="Postponed exit from lambda"]; - 85 [label="Function call: R|/myRun|(...)"]; - 86 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 101 [label="Postponed exit from lambda"]; + 102 [label="Function call: R|/myRun|(...)"]; + 103 [label="Jump: ^foo R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| ^ when () { (R|/b| is R|kotlin/String|) -> { @@ -308,104 +372,124 @@ digraph localClassesWithImplicit_kt { } )"]; - 87 [label="Stub" style="filled" fillcolor=gray]; - 82 [label="Exit function foo" style="filled" fillcolor=red]; + 104 [label="Stub" style="filled" fillcolor=gray]; + 105 [label="Exit block" style="filled" fillcolor=gray]; + } + 98 [label="Exit function foo" style="filled" fillcolor=red]; } - 81 -> {83}; - 83 -> {88}; - 83 -> {84} [color=red]; - 84 -> {85}; - 85 -> {86}; - 86 -> {82}; - 86 -> {87} [style=dotted]; - 87 -> {82} [style=dotted]; - 88 -> {89 90}; - 89 -> {84} [color=green]; - 89 -> {88} [color=green style=dashed]; - 90 -> {91}; - 91 -> {92}; - 92 -> {94}; - 93 -> {89}; - 94 -> {95}; - 95 -> {96}; - 96 -> {97}; - 97 -> {98 105}; - 98 -> {99}; + 97 -> {99}; 99 -> {100}; - 100 -> {101}; + 100 -> {106}; + 100 -> {101} [color=red]; 101 -> {102}; 102 -> {103}; - 103 -> {104}; - 104 -> {93}; - 105 -> {106}; - 106 -> {107}; - 107 -> {108}; + 103 -> {98}; + 103 -> {104} [style=dotted]; + 104 -> {105} [style=dotted]; + 105 -> {98} [style=dotted]; + 106 -> {107 108}; + 107 -> {101} [color=green]; + 107 -> {106} [color=green style=dashed]; 108 -> {109}; 109 -> {110}; 110 -> {111}; - 111 -> {93}; + 111 -> {113}; + 112 -> {131}; + 113 -> {114}; + 114 -> {115}; + 115 -> {116}; + 116 -> {117 124}; + 117 -> {118}; + 118 -> {119}; + 119 -> {120}; + 120 -> {121}; + 121 -> {122}; + 122 -> {123}; + 123 -> {112}; + 124 -> {125}; + 125 -> {126}; + 126 -> {127}; + 127 -> {128}; + 128 -> {129}; + 129 -> {130}; + 130 -> {112}; + 131 -> {107}; - subgraph cluster_25 { + subgraph cluster_35 { color=red - 112 [label="Enter function bar" style="filled" fillcolor=red]; - 114 [label="Postponed enter to lambda"]; - subgraph cluster_26 { + 132 [label="Enter function bar" style="filled" fillcolor=red]; + subgraph cluster_36 { color=blue - 119 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 121 [label="Access variable R|/a|"]; - 122 [label="Access variable R|kotlin/String.length|"]; - 123 [label="Access variable R|/b|"]; - 124 [label="Access variable #"]; - 125 [label="Function call: this@R|/|.R|/.baz|()"]; - 120 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 115 [label="Postponed exit from lambda"]; - 116 [label="Function call: R|/myRun|(...)"]; - 117 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { + 134 [label="Enter block"]; + 135 [label="Postponed enter to lambda"]; + subgraph cluster_37 { + color=blue + 141 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_38 { + color=blue + 143 [label="Enter block"]; + 144 [label="Access variable R|/a|"]; + 145 [label="Access variable R|kotlin/String.length|"]; + 146 [label="Access variable R|/b|"]; + 147 [label="Access variable #"]; + 148 [label="Function call: this@R|/|.R|/.baz|()"]; + 149 [label="Exit block"]; + } + 142 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 136 [label="Postponed exit from lambda"]; + 137 [label="Function call: R|/myRun|(...)"]; + 138 [label="Jump: ^bar R|/myRun|( = myRun@fun (): R|kotlin/Int| { R|/a|.R|kotlin/String.length| R|/b|.# ^ this@R|/|.R|/.baz|() } )"]; - 118 [label="Stub" style="filled" fillcolor=gray]; - 113 [label="Exit function bar" style="filled" fillcolor=red]; + 139 [label="Stub" style="filled" fillcolor=gray]; + 140 [label="Exit block" style="filled" fillcolor=gray]; + } + 133 [label="Exit function bar" style="filled" fillcolor=red]; } - 112 -> {114}; - 114 -> {119}; - 114 -> {115} [color=red]; - 115 -> {116}; - 116 -> {117}; - 117 -> {113}; - 117 -> {118} [style=dotted]; - 118 -> {113} [style=dotted]; - 119 -> {120 121}; - 120 -> {115} [color=green]; - 120 -> {119} [color=green style=dashed]; - 121 -> {122}; - 122 -> {123}; - 123 -> {124}; - 124 -> {125}; - 125 -> {120}; + 132 -> {134}; + 134 -> {135}; + 135 -> {141}; + 135 -> {136} [color=red]; + 136 -> {137}; + 137 -> {138}; + 138 -> {133}; + 138 -> {139} [style=dotted]; + 139 -> {140} [style=dotted]; + 140 -> {133} [style=dotted]; + 141 -> {142 143}; + 142 -> {136} [color=green]; + 142 -> {141} [color=green style=dashed]; + 143 -> {144}; + 144 -> {145}; + 145 -> {146}; + 146 -> {147}; + 147 -> {148}; + 148 -> {149}; + 149 -> {142}; - subgraph cluster_27 { + subgraph cluster_39 { color=red - 126 [label="Enter function baz" style="filled" fillcolor=red]; - 128 [label="Const: Int(1)"]; - 129 [label="Jump: ^baz Int(1)"]; - 130 [label="Stub" style="filled" fillcolor=gray]; - 127 [label="Exit function baz" style="filled" fillcolor=red]; + 150 [label="Enter function baz" style="filled" fillcolor=red]; + subgraph cluster_40 { + color=blue + 152 [label="Enter block"]; + 153 [label="Const: Int(1)"]; + 154 [label="Jump: ^baz Int(1)"]; + 155 [label="Stub" style="filled" fillcolor=gray]; + 156 [label="Exit block" style="filled" fillcolor=gray]; + } + 151 [label="Exit function baz" style="filled" fillcolor=red]; } - 126 -> {128}; - 128 -> {129}; - 129 -> {127}; - 129 -> {130} [style=dotted]; - 130 -> {127} [style=dotted]; - - subgraph cluster_28 { - color=red - 131 [label="Enter class " style="filled" fillcolor=red]; - 132 [label="Exit class " style="filled" fillcolor=red]; - } - 131 -> {132} [color=green]; + 150 -> {152}; + 152 -> {153}; + 153 -> {154}; + 154 -> {151}; + 154 -> {155} [style=dotted]; + 155 -> {156} [style=dotted]; + 156 -> {151} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/loops.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/loops.dot index ecdbe51176b..1c938991406 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/loops.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/loops.dot @@ -8,475 +8,538 @@ digraph loops_kt { 0 [label="Enter function testWhile" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter while loop"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Enter loop condition"]; - 5 [label="Access variable R|/b|"]; - 6 [label="Exit loop condition"]; - } - subgraph cluster_3 { - color=blue - 7 [label="Enter loop block"]; + 3 [label="Enter while loop"]; + subgraph cluster_3 { + color=blue + 5 [label="Enter loop condition"]; + 6 [label="Access variable R|/b|"]; + 7 [label="Exit loop condition"]; + } subgraph cluster_4 { color=blue - 8 [label="Enter block"]; - 9 [label="Access variable R|/x|"]; - 10 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 11 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; - 12 [label="Exit block"]; + 8 [label="Enter loop block"]; + subgraph cluster_5 { + color=blue + 9 [label="Enter block"]; + 10 [label="Access variable R|/x|"]; + 11 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 12 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; + 13 [label="Exit block"]; + } + 14 [label="Exit loop block"]; } - 13 [label="Exit loop block"]; + 4 [label="Exit whileloop"]; } - 3 [label="Exit whileloop"]; + 15 [label="Access variable R|/x|"]; + 16 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 17 [label="Exit block"]; } - 14 [label="Access variable R|/x|"]; - 15 [label="Type operator: (R|/x| is R|kotlin/String|)"]; 1 [label="Exit function testWhile" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {14}; - 4 -> {5}; + 2 -> {3}; + 3 -> {5}; + 4 -> {15}; 5 -> {6}; - 6 -> {3 7}; - 7 -> {8}; + 6 -> {7}; + 7 -> {4 8}; 8 -> {9}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {4} [color=green style=dashed]; - 14 -> {15}; - 15 -> {1}; + 13 -> {14}; + 14 -> {5} [color=green style=dashed]; + 15 -> {16}; + 16 -> {17}; + 17 -> {1}; - subgraph cluster_5 { + subgraph cluster_6 { color=red - 16 [label="Enter function testDoWhile" style="filled" fillcolor=red]; - subgraph cluster_6 { + 18 [label="Enter function testDoWhile" style="filled" fillcolor=red]; + subgraph cluster_7 { color=blue - 18 [label="Enter do-while loop"]; - subgraph cluster_7 { + 20 [label="Enter block"]; + subgraph cluster_8 { color=blue - 20 [label="Enter loop block"]; - subgraph cluster_8 { + 21 [label="Enter do-while loop"]; + subgraph cluster_9 { color=blue - 21 [label="Enter block"]; - 22 [label="Access variable R|/x|"]; - 23 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 24 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; - 25 [label="Exit block"]; + 23 [label="Enter loop block"]; + subgraph cluster_10 { + color=blue + 24 [label="Enter block"]; + 25 [label="Access variable R|/x|"]; + 26 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 27 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; + 28 [label="Exit block"]; + } + 29 [label="Exit loop block"]; } - 26 [label="Exit loop block"]; + subgraph cluster_11 { + color=blue + 30 [label="Enter loop condition"]; + 31 [label="Access variable R|/b|"]; + 32 [label="Exit loop condition"]; + } + 22 [label="Exit do-whileloop"]; } - subgraph cluster_9 { - color=blue - 27 [label="Enter loop condition"]; - 28 [label="Access variable R|/b|"]; - 29 [label="Exit loop condition"]; - } - 19 [label="Exit do-whileloop"]; + 33 [label="Access variable R|/x|"]; + 34 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 35 [label="Exit block"]; } - 30 [label="Access variable R|/x|"]; - 31 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 17 [label="Exit function testDoWhile" style="filled" fillcolor=red]; + 19 [label="Exit function testDoWhile" style="filled" fillcolor=red]; } - 16 -> {18}; 18 -> {20}; - 19 -> {30}; 20 -> {21}; - 21 -> {22}; - 22 -> {23}; + 21 -> {23}; + 22 -> {33}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; 28 -> {29}; - 29 -> {19}; - 29 -> {20} [color=green style=dashed]; + 29 -> {30}; 30 -> {31}; - 31 -> {17}; - - subgraph cluster_10 { - color=red - 32 [label="Enter function testFor" style="filled" fillcolor=red]; - 34 [label="Const: Int(0)"]; - 35 [label="Const: Int(5)"]; - 36 [label="Function call: Int(0).R|kotlin/Int.rangeTo|(...)"]; - 37 [label="Function call: Int(0).R|kotlin/Int.rangeTo|(...).R|kotlin/ranges/IntProgression.iterator|()"]; - 38 [label="Variable declaration: lval : R|kotlin/collections/IntIterator|"]; - subgraph cluster_11 { - color=blue - 39 [label="Enter while loop"]; - subgraph cluster_12 { - color=blue - 41 [label="Enter loop condition"]; - 42 [label="Access variable R|/|"]; - 43 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 44 [label="Exit loop condition"]; - } - subgraph cluster_13 { - color=blue - 45 [label="Enter loop block"]; - subgraph cluster_14 { - color=blue - 46 [label="Enter block"]; - 47 [label="Access variable R|/|"]; - 48 [label="Function call: R|/|.R|kotlin/collections/IntIterator.next|()"]; - 49 [label="Variable declaration: lval i: R|kotlin/Int|"]; - 50 [label="Access variable R|/x|"]; - 51 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 52 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; - 53 [label="Exit block"]; - } - 54 [label="Exit loop block"]; - } - 40 [label="Exit whileloop"]; - } - 55 [label="Access variable R|/x|"]; - 56 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 33 [label="Exit function testFor" style="filled" fillcolor=red]; - } - 32 -> {34}; + 31 -> {32}; + 32 -> {22}; + 32 -> {23} [color=green style=dashed]; + 33 -> {34}; 34 -> {35}; - 35 -> {36}; - 36 -> {37}; - 37 -> {38}; + 35 -> {19}; + + subgraph cluster_12 { + color=red + 36 [label="Enter function testFor" style="filled" fillcolor=red]; + subgraph cluster_13 { + color=blue + 38 [label="Enter block"]; + 39 [label="Const: Int(0)"]; + 40 [label="Const: Int(5)"]; + 41 [label="Function call: Int(0).R|kotlin/Int.rangeTo|(...)"]; + 42 [label="Function call: Int(0).R|kotlin/Int.rangeTo|(...).R|kotlin/ranges/IntProgression.iterator|()"]; + 43 [label="Variable declaration: lval : R|kotlin/collections/IntIterator|"]; + subgraph cluster_14 { + color=blue + 44 [label="Enter while loop"]; + subgraph cluster_15 { + color=blue + 46 [label="Enter loop condition"]; + 47 [label="Access variable R|/|"]; + 48 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; + 49 [label="Exit loop condition"]; + } + subgraph cluster_16 { + color=blue + 50 [label="Enter loop block"]; + subgraph cluster_17 { + color=blue + 51 [label="Enter block"]; + 52 [label="Access variable R|/|"]; + 53 [label="Function call: R|/|.R|kotlin/collections/IntIterator.next|()"]; + 54 [label="Variable declaration: lval i: R|kotlin/Int|"]; + 55 [label="Access variable R|/x|"]; + 56 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 57 [label="Variable declaration: lval y: R|kotlin/Boolean|"]; + 58 [label="Exit block"]; + } + 59 [label="Exit loop block"]; + } + 45 [label="Exit whileloop"]; + } + 60 [label="Access variable R|/x|"]; + 61 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 62 [label="Exit block"]; + } + 37 [label="Exit function testFor" style="filled" fillcolor=red]; + } + 36 -> {38}; 38 -> {39}; - 39 -> {41}; - 40 -> {55}; + 39 -> {40}; + 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; - 44 -> {40 45}; - 45 -> {46}; + 44 -> {46}; + 45 -> {60}; 46 -> {47}; 47 -> {48}; 48 -> {49}; - 49 -> {50}; + 49 -> {45 50}; 50 -> {51}; 51 -> {52}; 52 -> {53}; 53 -> {54}; - 54 -> {41} [color=green style=dashed]; + 54 -> {55}; 55 -> {56}; - 56 -> {33}; - - subgraph cluster_15 { - color=red - 57 [label="Enter function testWhileTrue" style="filled" fillcolor=red]; - subgraph cluster_16 { - color=blue - 59 [label="Enter while loop"]; - subgraph cluster_17 { - color=blue - 61 [label="Enter loop condition"]; - 62 [label="Const: Boolean(true)"]; - 63 [label="Exit loop condition"]; - } - subgraph cluster_18 { - color=blue - 64 [label="Enter loop block"]; - subgraph cluster_19 { - color=blue - 65 [label="Enter block"]; - 66 [label="Const: Int(1)"]; - 67 [label="Exit block"]; - } - 68 [label="Exit loop block"]; - } - 60 [label="Exit whileloop" style="filled" fillcolor=gray]; - } - 69 [label="Const: Int(1)" style="filled" fillcolor=gray]; - 58 [label="Exit function testWhileTrue" style="filled" fillcolor=red style="filled" fillcolor=gray]; - } - 57 -> {59}; - 59 -> {61}; - 60 -> {69} [style=dotted]; + 56 -> {57}; + 57 -> {58}; + 58 -> {59}; + 59 -> {46} [color=green style=dashed]; + 60 -> {61}; 61 -> {62}; - 62 -> {63}; - 63 -> {64}; - 63 -> {60} [style=dotted]; - 64 -> {65}; - 65 -> {66}; - 66 -> {67}; - 67 -> {68}; - 68 -> {61} [color=green style=dashed]; - 69 -> {58} [style=dotted]; + 62 -> {37}; - subgraph cluster_20 { + subgraph cluster_18 { color=red - 70 [label="Enter function testWhileTrueWithBreak" style="filled" fillcolor=red]; - subgraph cluster_21 { + 63 [label="Enter function testWhileTrue" style="filled" fillcolor=red]; + subgraph cluster_19 { color=blue - 72 [label="Enter while loop"]; - subgraph cluster_22 { + 65 [label="Enter block"]; + subgraph cluster_20 { color=blue - 74 [label="Enter loop condition"]; - 75 [label="Const: Boolean(true)"]; - 76 [label="Exit loop condition"]; - } - subgraph cluster_23 { - color=blue - 77 [label="Enter loop block"]; - subgraph cluster_24 { + 66 [label="Enter while loop"]; + subgraph cluster_21 { color=blue - 78 [label="Enter block"]; - subgraph cluster_25 { - color=blue - 79 [label="Enter when"]; - subgraph cluster_26 { - color=blue - 81 [label="Enter when branch condition "]; - 82 [label="Access variable R|/b|"]; - 83 [label="Exit when branch condition"]; - } - 90 [label="Synthetic else branch"]; - 84 [label="Enter when branch result"]; - subgraph cluster_27 { - color=blue - 85 [label="Enter block"]; - 86 [label="Jump: break@@@[Boolean(true)] "]; - 87 [label="Stub" style="filled" fillcolor=gray]; - 88 [label="Exit block" style="filled" fillcolor=gray]; - } - 89 [label="Exit when branch result" style="filled" fillcolor=gray]; - 80 [label="Exit when"]; - } - 91 [label="Exit block"]; + 68 [label="Enter loop condition"]; + 69 [label="Const: Boolean(true)"]; + 70 [label="Exit loop condition"]; } - 92 [label="Exit loop block"]; + subgraph cluster_22 { + color=blue + 71 [label="Enter loop block"]; + subgraph cluster_23 { + color=blue + 72 [label="Enter block"]; + 73 [label="Const: Int(1)"]; + 74 [label="Exit block"]; + } + 75 [label="Exit loop block"]; + } + 67 [label="Exit whileloop" style="filled" fillcolor=gray]; } - 73 [label="Exit whileloop"]; + 76 [label="Const: Int(1)" style="filled" fillcolor=gray]; + 77 [label="Exit block" style="filled" fillcolor=gray]; } - 93 [label="Const: Int(1)"]; - 71 [label="Exit function testWhileTrueWithBreak" style="filled" fillcolor=red]; + 64 [label="Exit function testWhileTrue" style="filled" fillcolor=red style="filled" fillcolor=gray]; } - 70 -> {72}; - 72 -> {74}; - 73 -> {93}; + 63 -> {65}; + 65 -> {66}; + 66 -> {68}; + 67 -> {76} [style=dotted]; + 68 -> {69}; + 69 -> {70}; + 70 -> {71}; + 70 -> {67} [style=dotted]; + 71 -> {72}; + 72 -> {73}; + 73 -> {74}; 74 -> {75}; - 75 -> {76}; - 76 -> {77}; - 76 -> {73} [style=dotted]; - 77 -> {78}; - 78 -> {79}; - 79 -> {81}; - 80 -> {91}; - 81 -> {82}; - 82 -> {83}; - 83 -> {84 90}; + 75 -> {68} [color=green style=dashed]; + 76 -> {77} [style=dotted]; + 77 -> {64} [style=dotted]; + + subgraph cluster_24 { + color=red + 78 [label="Enter function testWhileTrueWithBreak" style="filled" fillcolor=red]; + subgraph cluster_25 { + color=blue + 80 [label="Enter block"]; + subgraph cluster_26 { + color=blue + 81 [label="Enter while loop"]; + subgraph cluster_27 { + color=blue + 83 [label="Enter loop condition"]; + 84 [label="Const: Boolean(true)"]; + 85 [label="Exit loop condition"]; + } + subgraph cluster_28 { + color=blue + 86 [label="Enter loop block"]; + subgraph cluster_29 { + color=blue + 87 [label="Enter block"]; + subgraph cluster_30 { + color=blue + 88 [label="Enter when"]; + subgraph cluster_31 { + color=blue + 90 [label="Enter when branch condition "]; + 91 [label="Access variable R|/b|"]; + 92 [label="Exit when branch condition"]; + } + 99 [label="Synthetic else branch"]; + 93 [label="Enter when branch result"]; + subgraph cluster_32 { + color=blue + 94 [label="Enter block"]; + 95 [label="Jump: break@@@[Boolean(true)] "]; + 96 [label="Stub" style="filled" fillcolor=gray]; + 97 [label="Exit block" style="filled" fillcolor=gray]; + } + 98 [label="Exit when branch result" style="filled" fillcolor=gray]; + 89 [label="Exit when"]; + } + 100 [label="Exit block"]; + } + 101 [label="Exit loop block"]; + } + 82 [label="Exit whileloop"]; + } + 102 [label="Const: Int(1)"]; + 103 [label="Exit block"]; + } + 79 [label="Exit function testWhileTrueWithBreak" style="filled" fillcolor=red]; + } + 78 -> {80}; + 80 -> {81}; + 81 -> {83}; + 82 -> {102}; + 83 -> {84}; 84 -> {85}; 85 -> {86}; - 86 -> {73}; - 86 -> {87} [style=dotted]; - 87 -> {88} [style=dotted]; - 88 -> {89} [style=dotted]; - 89 -> {80} [style=dotted]; - 90 -> {80}; + 85 -> {82} [style=dotted]; + 86 -> {87}; + 87 -> {88}; + 88 -> {90}; + 89 -> {100}; + 90 -> {91}; 91 -> {92}; - 92 -> {74} [color=green style=dashed]; - 93 -> {71}; - - subgraph cluster_28 { - color=red - 94 [label="Enter function testWhileFalse" style="filled" fillcolor=red]; - subgraph cluster_29 { - color=blue - 96 [label="Enter while loop"]; - subgraph cluster_30 { - color=blue - 98 [label="Enter loop condition"]; - 99 [label="Const: Boolean(false)"]; - 100 [label="Exit loop condition"]; - } - subgraph cluster_31 { - color=blue - 101 [label="Enter loop block" style="filled" fillcolor=gray]; - subgraph cluster_32 { - color=blue - 102 [label="Enter block" style="filled" fillcolor=gray]; - 103 [label="Const: Int(1)" style="filled" fillcolor=gray]; - 104 [label="Exit block" style="filled" fillcolor=gray]; - } - 105 [label="Exit loop block" style="filled" fillcolor=gray]; - } - 97 [label="Exit whileloop"]; - } - 106 [label="Const: Int(1)"]; - 95 [label="Exit function testWhileFalse" style="filled" fillcolor=red]; - } - 94 -> {96}; - 96 -> {98}; - 97 -> {106}; - 98 -> {99}; - 99 -> {100}; - 100 -> {97}; - 100 -> {101} [style=dotted]; - 101 -> {102} [style=dotted]; - 102 -> {103} [style=dotted]; - 103 -> {104} [style=dotted]; - 104 -> {105} [style=dotted]; - 105 -> {98} [color=green style=dotted]; - 106 -> {95}; + 92 -> {93 99}; + 93 -> {94}; + 94 -> {95}; + 95 -> {82}; + 95 -> {96} [style=dotted]; + 96 -> {97} [style=dotted]; + 97 -> {98} [style=dotted]; + 98 -> {89} [style=dotted]; + 99 -> {89}; + 100 -> {101}; + 101 -> {83} [color=green style=dashed]; + 102 -> {103}; + 103 -> {79}; subgraph cluster_33 { color=red - 107 [label="Enter function testDoWhileTrue" style="filled" fillcolor=red]; + 104 [label="Enter function testWhileFalse" style="filled" fillcolor=red]; subgraph cluster_34 { color=blue - 109 [label="Enter do-while loop"]; + 106 [label="Enter block"]; subgraph cluster_35 { color=blue - 111 [label="Enter loop block"]; + 107 [label="Enter while loop"]; subgraph cluster_36 { color=blue - 112 [label="Enter block"]; - 113 [label="Const: Int(1)"]; - 114 [label="Exit block"]; + 109 [label="Enter loop condition"]; + 110 [label="Const: Boolean(false)"]; + 111 [label="Exit loop condition"]; } - 115 [label="Exit loop block"]; - } - subgraph cluster_37 { - color=blue - 116 [label="Enter loop condition"]; - 117 [label="Const: Boolean(true)"]; - 118 [label="Exit loop condition"]; - } - 110 [label="Exit do-whileloop" style="filled" fillcolor=gray]; - } - 119 [label="Const: Int(1)" style="filled" fillcolor=gray]; - 108 [label="Exit function testDoWhileTrue" style="filled" fillcolor=red style="filled" fillcolor=gray]; - } - 107 -> {109}; - 109 -> {111}; - 110 -> {119} [style=dotted]; - 111 -> {112}; - 112 -> {113}; - 113 -> {114}; - 114 -> {115}; - 115 -> {116}; - 116 -> {117}; - 117 -> {118}; - 118 -> {110} [style=dotted]; - 118 -> {111} [color=green style=dashed]; - 119 -> {108} [style=dotted]; - - subgraph cluster_38 { - color=red - 120 [label="Enter function testDoWhileTrueWithBreak" style="filled" fillcolor=red]; - subgraph cluster_39 { - color=blue - 122 [label="Enter do-while loop"]; - subgraph cluster_40 { - color=blue - 124 [label="Enter loop block"]; - subgraph cluster_41 { + subgraph cluster_37 { color=blue - 125 [label="Enter block"]; - subgraph cluster_42 { + 112 [label="Enter loop block" style="filled" fillcolor=gray]; + subgraph cluster_38 { color=blue - 126 [label="Enter when"]; - subgraph cluster_43 { - color=blue - 128 [label="Enter when branch condition "]; - 129 [label="Access variable R|/b|"]; - 130 [label="Exit when branch condition"]; - } - 137 [label="Synthetic else branch"]; - 131 [label="Enter when branch result"]; - subgraph cluster_44 { - color=blue - 132 [label="Enter block"]; - 133 [label="Jump: break@@@[Boolean(true)] "]; - 134 [label="Stub" style="filled" fillcolor=gray]; - 135 [label="Exit block" style="filled" fillcolor=gray]; - } - 136 [label="Exit when branch result" style="filled" fillcolor=gray]; - 127 [label="Exit when"]; + 113 [label="Enter block" style="filled" fillcolor=gray]; + 114 [label="Const: Int(1)" style="filled" fillcolor=gray]; + 115 [label="Exit block" style="filled" fillcolor=gray]; } - 138 [label="Exit block"]; + 116 [label="Exit loop block" style="filled" fillcolor=gray]; } - 139 [label="Exit loop block"]; + 108 [label="Exit whileloop"]; } - subgraph cluster_45 { - color=blue - 140 [label="Enter loop condition"]; - 141 [label="Const: Boolean(true)"]; - 142 [label="Exit loop condition"]; - } - 123 [label="Exit do-whileloop"]; + 117 [label="Const: Int(1)"]; + 118 [label="Exit block"]; } - 143 [label="Const: Int(1)"]; - 121 [label="Exit function testDoWhileTrueWithBreak" style="filled" fillcolor=red]; + 105 [label="Exit function testWhileFalse" style="filled" fillcolor=red]; } - 120 -> {122}; + 104 -> {106}; + 106 -> {107}; + 107 -> {109}; + 108 -> {117}; + 109 -> {110}; + 110 -> {111}; + 111 -> {108}; + 111 -> {112} [style=dotted]; + 112 -> {113} [style=dotted]; + 113 -> {114} [style=dotted]; + 114 -> {115} [style=dotted]; + 115 -> {116} [style=dotted]; + 116 -> {109} [color=green style=dotted]; + 117 -> {118}; + 118 -> {105}; + + subgraph cluster_39 { + color=red + 119 [label="Enter function testDoWhileTrue" style="filled" fillcolor=red]; + subgraph cluster_40 { + color=blue + 121 [label="Enter block"]; + subgraph cluster_41 { + color=blue + 122 [label="Enter do-while loop"]; + subgraph cluster_42 { + color=blue + 124 [label="Enter loop block"]; + subgraph cluster_43 { + color=blue + 125 [label="Enter block"]; + 126 [label="Const: Int(1)"]; + 127 [label="Exit block"]; + } + 128 [label="Exit loop block"]; + } + subgraph cluster_44 { + color=blue + 129 [label="Enter loop condition"]; + 130 [label="Const: Boolean(true)"]; + 131 [label="Exit loop condition"]; + } + 123 [label="Exit do-whileloop" style="filled" fillcolor=gray]; + } + 132 [label="Const: Int(1)" style="filled" fillcolor=gray]; + 133 [label="Exit block" style="filled" fillcolor=gray]; + } + 120 [label="Exit function testDoWhileTrue" style="filled" fillcolor=red style="filled" fillcolor=gray]; + } + 119 -> {121}; + 121 -> {122}; 122 -> {124}; - 123 -> {143}; + 123 -> {132} [style=dotted]; 124 -> {125}; 125 -> {126}; - 126 -> {128}; - 127 -> {138}; + 126 -> {127}; + 127 -> {128}; 128 -> {129}; 129 -> {130}; - 130 -> {131 137}; - 131 -> {132}; - 132 -> {133}; - 133 -> {123}; - 133 -> {134} [style=dotted]; - 134 -> {135} [style=dotted]; - 135 -> {136} [style=dotted]; - 136 -> {127} [style=dotted]; - 137 -> {127}; - 138 -> {139}; + 130 -> {131}; + 131 -> {123} [style=dotted]; + 131 -> {124} [color=green style=dashed]; + 132 -> {133} [style=dotted]; + 133 -> {120} [style=dotted]; + + subgraph cluster_45 { + color=red + 134 [label="Enter function testDoWhileTrueWithBreak" style="filled" fillcolor=red]; + subgraph cluster_46 { + color=blue + 136 [label="Enter block"]; + subgraph cluster_47 { + color=blue + 137 [label="Enter do-while loop"]; + subgraph cluster_48 { + color=blue + 139 [label="Enter loop block"]; + subgraph cluster_49 { + color=blue + 140 [label="Enter block"]; + subgraph cluster_50 { + color=blue + 141 [label="Enter when"]; + subgraph cluster_51 { + color=blue + 143 [label="Enter when branch condition "]; + 144 [label="Access variable R|/b|"]; + 145 [label="Exit when branch condition"]; + } + 152 [label="Synthetic else branch"]; + 146 [label="Enter when branch result"]; + subgraph cluster_52 { + color=blue + 147 [label="Enter block"]; + 148 [label="Jump: break@@@[Boolean(true)] "]; + 149 [label="Stub" style="filled" fillcolor=gray]; + 150 [label="Exit block" style="filled" fillcolor=gray]; + } + 151 [label="Exit when branch result" style="filled" fillcolor=gray]; + 142 [label="Exit when"]; + } + 153 [label="Exit block"]; + } + 154 [label="Exit loop block"]; + } + subgraph cluster_53 { + color=blue + 155 [label="Enter loop condition"]; + 156 [label="Const: Boolean(true)"]; + 157 [label="Exit loop condition"]; + } + 138 [label="Exit do-whileloop"]; + } + 158 [label="Const: Int(1)"]; + 159 [label="Exit block"]; + } + 135 [label="Exit function testDoWhileTrueWithBreak" style="filled" fillcolor=red]; + } + 134 -> {136}; + 136 -> {137}; + 137 -> {139}; + 138 -> {158}; 139 -> {140}; 140 -> {141}; - 141 -> {142}; - 142 -> {123} [style=dotted]; - 142 -> {124} [color=green style=dashed]; - 143 -> {121}; - - subgraph cluster_46 { - color=red - 144 [label="Enter function testDoWhileFalse" style="filled" fillcolor=red]; - subgraph cluster_47 { - color=blue - 146 [label="Enter do-while loop"]; - subgraph cluster_48 { - color=blue - 148 [label="Enter loop block"]; - subgraph cluster_49 { - color=blue - 149 [label="Enter block"]; - 150 [label="Const: Int(1)"]; - 151 [label="Exit block"]; - } - 152 [label="Exit loop block"]; - } - subgraph cluster_50 { - color=blue - 153 [label="Enter loop condition"]; - 154 [label="Const: Boolean(false)"]; - 155 [label="Exit loop condition"]; - } - 147 [label="Exit do-whileloop"]; - } - 156 [label="Const: Int(1)"]; - 145 [label="Exit function testDoWhileFalse" style="filled" fillcolor=red]; - } - 144 -> {146}; - 146 -> {148}; - 147 -> {156}; - 148 -> {149}; - 149 -> {150}; - 150 -> {151}; - 151 -> {152}; - 152 -> {153}; + 141 -> {143}; + 142 -> {153}; + 143 -> {144}; + 144 -> {145}; + 145 -> {146 152}; + 146 -> {147}; + 147 -> {148}; + 148 -> {138}; + 148 -> {149} [style=dotted]; + 149 -> {150} [style=dotted]; + 150 -> {151} [style=dotted]; + 151 -> {142} [style=dotted]; + 152 -> {142}; 153 -> {154}; 154 -> {155}; - 155 -> {147}; - 155 -> {148} [color=green style=dotted]; - 156 -> {145}; + 155 -> {156}; + 156 -> {157}; + 157 -> {138} [style=dotted]; + 157 -> {139} [color=green style=dashed]; + 158 -> {159}; + 159 -> {135}; + + subgraph cluster_54 { + color=red + 160 [label="Enter function testDoWhileFalse" style="filled" fillcolor=red]; + subgraph cluster_55 { + color=blue + 162 [label="Enter block"]; + subgraph cluster_56 { + color=blue + 163 [label="Enter do-while loop"]; + subgraph cluster_57 { + color=blue + 165 [label="Enter loop block"]; + subgraph cluster_58 { + color=blue + 166 [label="Enter block"]; + 167 [label="Const: Int(1)"]; + 168 [label="Exit block"]; + } + 169 [label="Exit loop block"]; + } + subgraph cluster_59 { + color=blue + 170 [label="Enter loop condition"]; + 171 [label="Const: Boolean(false)"]; + 172 [label="Exit loop condition"]; + } + 164 [label="Exit do-whileloop"]; + } + 173 [label="Const: Int(1)"]; + 174 [label="Exit block"]; + } + 161 [label="Exit function testDoWhileFalse" style="filled" fillcolor=red]; + } + 160 -> {162}; + 162 -> {163}; + 163 -> {165}; + 164 -> {173}; + 165 -> {166}; + 166 -> {167}; + 167 -> {168}; + 168 -> {169}; + 169 -> {170}; + 170 -> {171}; + 171 -> {172}; + 172 -> {164}; + 172 -> {165} [color=green style=dotted]; + 173 -> {174}; + 174 -> {161}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot index c9230fcef5a..32c673b832f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdaInConstructor.dot @@ -14,10 +14,10 @@ digraph postponedLambdaInConstructor_kt { subgraph cluster_1 { color=red - 3 [label="Enter class A" style="filled" fillcolor=red]; - 4 [label="Exit class A" style="filled" fillcolor=red]; + 4 [label="Enter class A" style="filled" fillcolor=red]; + 3 [label="Exit class A" style="filled" fillcolor=red]; } - 3 -> {4} [color=green]; + 4 -> {3} [color=green]; subgraph cluster_2 { color=red @@ -27,14 +27,24 @@ digraph postponedLambdaInConstructor_kt { subgraph cluster_3 { color=blue 13 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 15 [label="Postponed enter to lambda"]; subgraph cluster_4 { color=blue - 17 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 19 [label="Access variable R|/it|"]; - 18 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 15 [label="Enter block"]; + 16 [label="Postponed enter to lambda"]; + subgraph cluster_5 { + color=blue + 19 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_6 { + color=blue + 21 [label="Enter block"]; + 22 [label="Access variable R|/it|"]; + 23 [label="Exit block"]; + } + 20 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 17 [label="Postponed exit from lambda"]; + 18 [label="Exit block"]; } - 16 [label="Postponed exit from lambda"]; 14 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } 9 [label="Postponed exit from lambda"]; @@ -55,40 +65,51 @@ digraph postponedLambdaInConstructor_kt { 14 -> {9} [color=green]; 14 -> {12} [color=red]; 15 -> {16}; - 15 -> {17} [color=red]; - 16 -> {14}; - 17 -> {19}; - 19 -> {18}; + 16 -> {17 19}; + 17 -> {18}; + 18 -> {14}; + 19 -> {21}; + 21 -> {22}; + 22 -> {23}; + 23 -> {20}; - subgraph cluster_5 { + subgraph cluster_7 { color=red - 25 [label="Enter function foo" style="filled" fillcolor=red]; - 27 [label="Function call: this@R|/B|.R|/B.foo|()"]; - 26 [label="Exit function foo" style="filled" fillcolor=red]; + 24 [label="Enter function getter" style="filled" fillcolor=red]; + 25 [label="Exit function getter" style="filled" fillcolor=red]; } - 25 -> {27}; - 27 -> {26}; + 24 -> {25}; - subgraph cluster_6 { + subgraph cluster_8 { color=red - 28 [label="Enter class B" style="filled" fillcolor=red]; - subgraph cluster_7 { + 29 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_9 { color=blue - 20 [label="Enter function getter" style="filled" fillcolor=red]; - 21 [label="Exit function getter" style="filled" fillcolor=red]; + 31 [label="Enter block"]; + 32 [label="Function call: this@R|/B|.R|/B.foo|()"]; + 33 [label="Exit block"]; } - subgraph cluster_8 { - color=blue - 22 [label="Enter property" style="filled" fillcolor=red]; - 24 [label="Access variable R|/s|"]; - 23 [label="Exit property" style="filled" fillcolor=red]; - } - 29 [label="Exit class B" style="filled" fillcolor=red]; + 30 [label="Exit function foo" style="filled" fillcolor=red]; } - 28 -> {22} [color=green]; - 22 -> {24}; - 23 -> {29} [color=green]; - 24 -> {23}; - 20 -> {21}; + 29 -> {31}; + 31 -> {32}; + 32 -> {33}; + 33 -> {30}; + + subgraph cluster_10 { + color=red + 35 [label="Enter class B" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 26 [label="Enter property" style="filled" fillcolor=red]; + 28 [label="Access variable R|/s|"]; + 27 [label="Exit property" style="filled" fillcolor=red]; + } + 34 [label="Exit class B" style="filled" fillcolor=red]; + } + 35 -> {26} [color=green]; + 26 -> {28}; + 27 -> {34} [color=green]; + 28 -> {27}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.dot index 29073b231c3..574108d704d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.dot @@ -6,36 +6,57 @@ digraph postponedLambdas_kt { subgraph cluster_0 { color=red 0 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Exit block"]; + } 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; + 0 -> {2}; + 2 -> {3}; + 3 -> {1}; - subgraph cluster_1 { + subgraph cluster_2 { color=red - 2 [label="Enter function test" style="filled" fillcolor=red]; - 4 [label="Access variable R|/a|"]; - 5 [label="Postponed enter to lambda"]; - subgraph cluster_2 { + 4 [label="Enter function test" style="filled" fillcolor=red]; + subgraph cluster_3 { color=blue - 9 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 11 [label="Const: String()"]; - 10 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 6 [label="Enter block"]; + 7 [label="Access variable R|/a|"]; + 8 [label="Postponed enter to lambda"]; + subgraph cluster_4 { + color=blue + 13 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 15 [label="Enter block"]; + 16 [label="Const: String()"]; + 17 [label="Exit block"]; + } + 14 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 9 [label="Postponed exit from lambda"]; + 10 [label="Access variable R|/b|"]; + 11 [label="Function call: R|/foo|(...)"]; + 12 [label="Exit block"]; } - 6 [label="Postponed exit from lambda"]; - 7 [label="Access variable R|/b|"]; - 8 [label="Function call: R|/foo|(...)"]; - 3 [label="Exit function test" style="filled" fillcolor=red]; + 5 [label="Exit function test" style="filled" fillcolor=red]; } - 2 -> {4}; - 4 -> {5}; - 5 -> {9}; - 5 -> {6} [color=red]; + 4 -> {6}; 6 -> {7}; 7 -> {8}; - 8 -> {3}; - 9 -> {10 11}; - 10 -> {6} [color=green]; - 10 -> {9} [color=green style=dashed]; - 11 -> {10}; + 8 -> {13}; + 8 -> {9} [color=red]; + 9 -> {10}; + 10 -> {11}; + 11 -> {12}; + 12 -> {5}; + 13 -> {14 15}; + 14 -> {9} [color=green]; + 14 -> {13} [color=green style=dashed]; + 15 -> {16}; + 16 -> {17}; + 17 -> {14}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot index 501ef0ed2d9..e8993ca3947 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.dot @@ -6,263 +6,309 @@ digraph propertiesAndInitBlocks_kt { subgraph cluster_0 { color=red 0 [label="Enter function run" style="filled" fillcolor=red]; - 2 [label="Function call: R|/block|.R|FakeOverride|()"]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Function call: R|/block|.R|FakeOverride|()"]; + 4 [label="Exit block"]; + } 1 [label="Exit function run" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {1}; - - subgraph cluster_1 { - color=red - 5 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 3 [label="Enter function getter" style="filled" fillcolor=red]; - 4 [label="Exit function getter" style="filled" fillcolor=red]; - } - 7 [label="Const: Int(1)"]; - 6 [label="Exit property" style="filled" fillcolor=red]; - } - 5 -> {7}; - 7 -> {6}; + 2 -> {3}; 3 -> {4}; + 4 -> {1}; + + subgraph cluster_2 { + color=red + 5 [label="Enter function getter" style="filled" fillcolor=red]; + 6 [label="Exit function getter" style="filled" fillcolor=red]; + } + 5 -> {6}; subgraph cluster_3 { color=red - 17 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_4 { - color=blue - 13 [label="Enter function setter" style="filled" fillcolor=red]; - 15 [label="Const: Int(1)"]; - 16 [label="Assignment: F|/x2|"]; - 14 [label="Exit function setter" style="filled" fillcolor=red]; - } + 7 [label="Enter property" style="filled" fillcolor=red]; + 9 [label="Const: Int(1)"]; + 8 [label="Exit property" style="filled" fillcolor=red]; + } + 7 -> {9}; + 9 -> {8}; + + subgraph cluster_4 { + color=red + 10 [label="Enter function getter" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 8 [label="Enter function getter" style="filled" fillcolor=red]; - 10 [label="Const: Int(1)"]; - 11 [label="Jump: ^ Int(1)"]; - 12 [label="Stub" style="filled" fillcolor=gray]; - 9 [label="Exit function getter" style="filled" fillcolor=red]; + 12 [label="Enter block"]; + 13 [label="Const: Int(1)"]; + 14 [label="Jump: ^ Int(1)"]; + 15 [label="Stub" style="filled" fillcolor=gray]; + 16 [label="Exit block" style="filled" fillcolor=gray]; } - 19 [label="Const: Int(1)"]; - 18 [label="Exit property" style="filled" fillcolor=red]; + 11 [label="Exit function getter" style="filled" fillcolor=red]; } - 17 -> {19}; - 19 -> {18}; - 8 -> {10}; - 10 -> {11}; - 11 -> {9}; - 11 -> {12} [style=dotted]; - 12 -> {9} [style=dotted]; - 13 -> {15}; - 15 -> {16}; - 16 -> {14}; + 10 -> {12}; + 12 -> {13}; + 13 -> {14}; + 14 -> {11}; + 14 -> {15} [style=dotted]; + 15 -> {16} [style=dotted]; + 16 -> {11} [style=dotted]; subgraph cluster_6 { color=red - 35 [label="Enter function " style="filled" fillcolor=red]; - 37 [label="Delegated constructor call: super()"]; - 36 [label="Exit function " style="filled" fillcolor=red]; - } - 35 -> {37}; - 37 -> {36}; - - subgraph cluster_7 { - color=red - 46 [label="Enter class LocalClass" style="filled" fillcolor=red]; - subgraph cluster_8 { + 17 [label="Enter function setter" style="filled" fillcolor=red]; + subgraph cluster_7 { color=blue - 38 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_9 { - color=blue - 40 [label="Enter block"]; - 41 [label="Function call: R|java/lang/Exception.Exception|()"]; - 42 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 43 [label="Stub" style="filled" fillcolor=gray]; - 44 [label="Const: Int(1)" style="filled" fillcolor=gray]; - 45 [label="Exit block" style="filled" fillcolor=gray]; - } - 39 [label="Exit init block" style="filled" fillcolor=red]; + 19 [label="Enter block"]; + 20 [label="Const: Int(1)"]; + 21 [label="Assignment: F|/x2|"]; + 22 [label="Exit block"]; } - 47 [label="Exit class LocalClass" style="filled" fillcolor=red]; + 18 [label="Exit function setter" style="filled" fillcolor=red]; } - 46 -> {38} [color=green]; - 38 -> {40}; - 39 -> {47} [color=green]; - 40 -> {41}; - 41 -> {42}; - 42 -> {39}; - 42 -> {43} [style=dotted]; - 43 -> {44} [style=dotted]; - 44 -> {45} [style=dotted]; - 45 -> {39} [style=dotted]; + 17 -> {19}; + 19 -> {20}; + 20 -> {21}; + 21 -> {22}; + 22 -> {18}; - subgraph cluster_10 { + subgraph cluster_8 { color=red - 51 [label="Enter function " style="filled" fillcolor=red]; - 53 [label="Delegated constructor call: super()"]; - 52 [label="Exit function " style="filled" fillcolor=red]; + 23 [label="Enter property" style="filled" fillcolor=red]; + 25 [label="Const: Int(1)"]; + 24 [label="Exit property" style="filled" fillcolor=red]; } - 51 -> {53}; - 53 -> {52}; + 23 -> {25}; + 25 -> {24}; + + subgraph cluster_9 { + color=red + 44 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_10 { + color=blue + 46 [label="Enter block"]; + 47 [label="Const: Int(1)"]; + 48 [label="Const: Int(1)"]; + 49 [label="Function call: Int(1).R|kotlin/Int.plus|(...)"]; + 50 [label="Variable declaration: lval c: R|kotlin/Int|"]; + 51 [label="Function call: R|java/lang/Exception.Exception|()"]; + 52 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 53 [label="Stub" style="filled" fillcolor=gray]; + 54 [label="Exit block" style="filled" fillcolor=gray]; + } + 45 [label="Exit function foo" style="filled" fillcolor=red]; + } + 44 -> {46}; + 46 -> {47}; + 47 -> {48}; + 48 -> {49}; + 49 -> {50}; + 50 -> {51}; + 51 -> {52}; + 52 -> {45}; + 52 -> {53} [style=dotted]; + 53 -> {54} [style=dotted]; + 54 -> {45} [style=dotted]; subgraph cluster_11 { color=red - 61 [label="Enter class LocalClass" style="filled" fillcolor=red]; - subgraph cluster_12 { - color=blue - 54 [label="Enter init block" style="filled" fillcolor=red]; - subgraph cluster_13 { - color=blue - 56 [label="Enter block"]; - 57 [label="Function call: R|java/lang/Exception.Exception|()"]; - 58 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 59 [label="Stub" style="filled" fillcolor=gray]; - 60 [label="Exit block" style="filled" fillcolor=gray]; - } - 55 [label="Exit init block" style="filled" fillcolor=red]; - } - 62 [label="Exit class LocalClass" style="filled" fillcolor=red]; + 55 [label="Enter function " style="filled" fillcolor=red]; + 57 [label="Delegated constructor call: super()"]; + 56 [label="Exit function " style="filled" fillcolor=red]; } - 61 -> {54} [color=green]; - 54 -> {56}; - 55 -> {62} [color=green]; - 56 -> {57}; - 57 -> {58}; - 58 -> {55}; - 58 -> {59} [style=dotted]; - 59 -> {60} [style=dotted]; - 60 -> {55} [style=dotted]; + 55 -> {57}; + 57 -> {56}; - subgraph cluster_14 { + subgraph cluster_12 { color=red - 63 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_15 { + 58 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_13 { color=blue - 48 [label="Enter function getter" style="filled" fillcolor=red]; - 50 [label="Exit local class "]; - 49 [label="Exit function getter" style="filled" fillcolor=red]; - } - 65 [label="Postponed enter to lambda"]; - subgraph cluster_16 { - color=blue - 20 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 22 [label="Exit local class "]; - 23 [label="Function call: R|java/lang/Exception.Exception|()"]; - 24 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 25 [label="Stub" style="filled" fillcolor=gray]; - subgraph cluster_17 { + 64 [label="Enter class GetterLocalClass" style="filled" fillcolor=red]; + subgraph cluster_14 { color=blue - 26 [label="Enter function foo" style="filled" fillcolor=red]; - 28 [label="Const: Int(1)"]; - 29 [label="Const: Int(1)"]; - 30 [label="Function call: Int(1).R|kotlin/Int.plus|(...)"]; - 31 [label="Variable declaration: lval c: R|kotlin/Int|"]; - 32 [label="Function call: R|java/lang/Exception.Exception|()"]; - 33 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 34 [label="Stub" style="filled" fillcolor=gray]; - 27 [label="Exit function foo" style="filled" fillcolor=red]; + 60 [label="Enter block"]; + 61 [label="Exit local class "]; + 62 [label="Exit block"]; } - 21 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_15 { + color=blue + 65 [label="Enter init block" style="filled" fillcolor=red]; + subgraph cluster_16 { + color=blue + 67 [label="Enter block"]; + 68 [label="Function call: R|java/lang/Exception.Exception|()"]; + 69 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 70 [label="Stub" style="filled" fillcolor=gray]; + 71 [label="Exit block" style="filled" fillcolor=gray]; + } + 66 [label="Exit init block" style="filled" fillcolor=red]; + } + 63 [label="Exit class GetterLocalClass" style="filled" fillcolor=red]; } - 66 [label="Postponed exit from lambda"]; - 67 [label="Function call: R|/run|(...)"]; - 64 [label="Exit property" style="filled" fillcolor=red]; + 59 [label="Exit function getter" style="filled" fillcolor=red]; } - 63 -> {65}; - 65 -> {20}; - 65 -> {66} [color=red]; - 66 -> {67}; - 67 -> {64}; - 20 -> {21 22}; - 20 -> {26 35 38} [color=red]; - 21 -> {66} [color=green]; - 21 -> {20} [color=green style=dashed]; - 22 -> {23}; - 23 -> {24}; - 24 -> {64}; - 24 -> {25} [style=dotted]; - 25 -> {21} [style=dotted]; - 26 -> {28}; - 28 -> {29}; - 29 -> {30}; - 30 -> {31}; - 31 -> {32}; - 32 -> {33}; - 33 -> {27}; - 33 -> {34} [style=dotted]; - 34 -> {27} [style=dotted]; - 48 -> {50}; - 48 -> {51 54} [color=red]; - 50 -> {49}; + 58 -> {60}; + 60 -> {61}; + 60 -> {72 65} [color=red]; + 61 -> {62}; + 62 -> {59}; + 64 -> {65} [color=green]; + 65 -> {67}; + 66 -> {63} [color=green]; + 67 -> {68}; + 68 -> {69}; + 69 -> {66}; + 69 -> {70} [style=dotted]; + 70 -> {71} [style=dotted]; + 71 -> {66} [style=dotted]; + + subgraph cluster_17 { + color=red + 72 [label="Enter function " style="filled" fillcolor=red]; + 74 [label="Delegated constructor call: super()"]; + 73 [label="Exit function " style="filled" fillcolor=red]; + } + 72 -> {74}; + 74 -> {73}; subgraph cluster_18 { color=red - 70 [label="Enter property" style="filled" fillcolor=red]; + 75 [label="Enter property" style="filled" fillcolor=red]; subgraph cluster_19 { color=blue - 68 [label="Enter function getter" style="filled" fillcolor=red]; - 69 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_20 { - color=blue - 72 [label="Try expression enter"]; - subgraph cluster_21 { + 35 [label="Enter class InitializerLocalClass" style="filled" fillcolor=red]; + 77 [label="Postponed enter to lambda"]; + subgraph cluster_20 { color=blue - 74 [label="Try main block enter"]; + 26 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_21 { + color=blue + 28 [label="Enter block"]; + 29 [label="Exit local class "]; + 30 [label="Function call: R|java/lang/Exception.Exception|()"]; + 31 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 32 [label="Stub" style="filled" fillcolor=gray]; + 33 [label="Exit block" style="filled" fillcolor=gray]; + } subgraph cluster_22 { color=blue - 77 [label="Enter block"]; - 78 [label="Const: Int(1)"]; - 79 [label="Exit block"]; + 36 [label="Enter init block" style="filled" fillcolor=red]; + subgraph cluster_23 { + color=blue + 38 [label="Enter block"]; + 39 [label="Function call: R|java/lang/Exception.Exception|()"]; + 40 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 41 [label="Stub" style="filled" fillcolor=gray]; + 42 [label="Const: Int(1)" style="filled" fillcolor=gray]; + 43 [label="Exit block" style="filled" fillcolor=gray]; + } + 37 [label="Exit init block" style="filled" fillcolor=red]; } - 80 [label="Try main block exit"]; + 34 [label="Exit class InitializerLocalClass" style="filled" fillcolor=red]; } - subgraph cluster_23 { - color=blue - 76 [label="Enter finally"]; - subgraph cluster_24 { - color=blue - 85 [label="Enter block"]; - 86 [label="Const: Int(0)"]; - 87 [label="Exit block"]; - } - 88 [label="Exit finally"]; - } - subgraph cluster_25 { - color=blue - 75 [label="Catch enter"]; - subgraph cluster_26 { - color=blue - 81 [label="Enter block"]; - 82 [label="Const: Int(2)"]; - 83 [label="Exit block"]; - } - 84 [label="Catch exit"]; - } - 73 [label="Try expression exit"]; + 27 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - 71 [label="Exit property" style="filled" fillcolor=red]; + 78 [label="Postponed exit from lambda"]; + 79 [label="Function call: R|/run|(...)"]; + 76 [label="Exit property" style="filled" fillcolor=red]; } - 70 -> {72}; - 72 -> {74}; - 73 -> {71}; - 74 -> {71 75 76 77}; - 75 -> {71 81}; - 76 -> {85}; - 77 -> {78}; + 75 -> {77}; + 77 -> {26}; + 77 -> {78} [color=red]; 78 -> {79}; - 79 -> {80}; - 80 -> {73}; - 81 -> {82}; - 82 -> {83}; - 83 -> {84}; - 84 -> {73}; - 85 -> {86}; - 86 -> {87}; - 87 -> {88}; - 88 -> {73}; - 68 -> {69}; + 79 -> {76}; + 26 -> {27 28}; + 27 -> {78} [color=green]; + 27 -> {26} [color=green style=dashed]; + 28 -> {29}; + 28 -> {44 55 36} [color=red]; + 29 -> {30}; + 30 -> {31}; + 31 -> {27}; + 31 -> {32} [style=dotted]; + 32 -> {33} [style=dotted]; + 33 -> {27} [style=dotted]; + 35 -> {36} [color=green]; + 36 -> {38}; + 37 -> {34} [color=green]; + 38 -> {39}; + 39 -> {40}; + 40 -> {37}; + 40 -> {41} [style=dotted]; + 41 -> {42} [style=dotted]; + 42 -> {43} [style=dotted]; + 43 -> {37} [style=dotted]; + + subgraph cluster_24 { + color=red + 80 [label="Enter function getter" style="filled" fillcolor=red]; + 81 [label="Exit function getter" style="filled" fillcolor=red]; + } + 80 -> {81}; + + subgraph cluster_25 { + color=red + 82 [label="Enter property" style="filled" fillcolor=red]; + subgraph cluster_26 { + color=blue + 84 [label="Try expression enter"]; + subgraph cluster_27 { + color=blue + 86 [label="Try main block enter"]; + subgraph cluster_28 { + color=blue + 89 [label="Enter block"]; + 90 [label="Const: Int(1)"]; + 91 [label="Exit block"]; + } + 92 [label="Try main block exit"]; + } + subgraph cluster_29 { + color=blue + 88 [label="Enter finally"]; + subgraph cluster_30 { + color=blue + 97 [label="Enter block"]; + 98 [label="Const: Int(0)"]; + 99 [label="Exit block"]; + } + 100 [label="Exit finally"]; + } + subgraph cluster_31 { + color=blue + 87 [label="Catch enter"]; + subgraph cluster_32 { + color=blue + 93 [label="Enter block"]; + 94 [label="Const: Int(2)"]; + 95 [label="Exit block"]; + } + 96 [label="Catch exit"]; + } + 85 [label="Try expression exit"]; + } + 83 [label="Exit property" style="filled" fillcolor=red]; + } + 82 -> {84}; + 84 -> {86}; + 85 -> {83}; + 86 -> {83 87 88 89}; + 87 -> {83 93}; + 88 -> {97}; + 89 -> {90}; + 90 -> {91}; + 91 -> {92}; + 92 -> {85}; + 93 -> {94}; + 94 -> {95}; + 95 -> {96}; + 96 -> {85}; + 97 -> {98}; + 98 -> {99}; + 99 -> {100}; + 100 -> {85}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.kt b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.kt index 15c4611b86b..8f9f0dd5234 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.kt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.kt @@ -17,7 +17,7 @@ val x3 = run { throw Exception() } - class LocalClass { + class InitializerLocalClass { init { throw Exception() 1 @@ -27,7 +27,7 @@ val x3 = run { throw Exception() } get() { - class LocalClass { + class GetterLocalClass { init { throw Exception() } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.txt b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.txt index d98f9ab34ee..604e844dd89 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.txt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/propertiesAndInitBlocks.txt @@ -17,8 +17,8 @@ FILE: propertiesAndInitBlocks.kt throw R|java/lang/Exception.Exception|() } - local final class LocalClass : R|kotlin/Any| { - public[local] constructor(): R|LocalClass| { + local final class InitializerLocalClass : R|kotlin/Any| { + public[local] constructor(): R|InitializerLocalClass| { super() } @@ -33,8 +33,8 @@ FILE: propertiesAndInitBlocks.kt } ) public get(): R|kotlin/Unit| { - local final class LocalClass : R|kotlin/Any| { - public[local] constructor(): R|LocalClass| { + local final class GetterLocalClass : R|kotlin/Any| { + public[local] constructor(): R|GetterLocalClass| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot index 65f37b607d7..5264909ee5f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/returnValuesFromLambda.dot @@ -5,10 +5,10 @@ digraph returnValuesFromLambda_kt { subgraph cluster_0 { color=red - 0 [label="Enter class A" style="filled" fillcolor=red]; - 1 [label="Exit class A" style="filled" fillcolor=red]; + 1 [label="Enter class A" style="filled" fillcolor=red]; + 0 [label="Exit class A" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; + 1 -> {0} [color=green]; subgraph cluster_1 { color=red @@ -21,10 +21,10 @@ digraph returnValuesFromLambda_kt { subgraph cluster_2 { color=red - 5 [label="Enter class B" style="filled" fillcolor=red]; - 6 [label="Exit class B" style="filled" fillcolor=red]; + 6 [label="Enter class B" style="filled" fillcolor=red]; + 5 [label="Exit class B" style="filled" fillcolor=red]; } - 5 -> {6} [color=green]; + 6 -> {5} [color=green]; subgraph cluster_3 { color=red @@ -37,139 +37,180 @@ digraph returnValuesFromLambda_kt { subgraph cluster_4 { color=red - 10 [label="Enter class C" style="filled" fillcolor=red]; - 11 [label="Exit class C" style="filled" fillcolor=red]; + 11 [label="Enter class C" style="filled" fillcolor=red]; + 10 [label="Exit class C" style="filled" fillcolor=red]; } - 10 -> {11} [color=green]; + 11 -> {10} [color=green]; subgraph cluster_5 { color=red 12 [label="Enter function test_1" style="filled" fillcolor=red]; - 14 [label="Postponed enter to lambda"]; subgraph cluster_6 { color=blue - 19 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + 14 [label="Enter block"]; + 15 [label="Postponed enter to lambda"]; subgraph cluster_7 { color=blue - 21 [label="Enter when"]; + 21 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue - 23 [label="Enter when branch condition "]; - 24 [label="Access variable R|/b|"]; - 25 [label="Exit when branch condition"]; + 23 [label="Enter block"]; + subgraph cluster_9 { + color=blue + 24 [label="Enter when"]; + subgraph cluster_10 { + color=blue + 26 [label="Enter when branch condition "]; + 27 [label="Access variable R|/b|"]; + 28 [label="Exit when branch condition"]; + } + 36 [label="Synthetic else branch"]; + 29 [label="Enter when branch result"]; + subgraph cluster_11 { + color=blue + 30 [label="Enter block"]; + 31 [label="Function call: R|/B.B|()"]; + 32 [label="Jump: ^@run R|/B.B|()"]; + 33 [label="Stub" style="filled" fillcolor=gray]; + 34 [label="Exit block" style="filled" fillcolor=gray]; + } + 35 [label="Exit when branch result" style="filled" fillcolor=gray]; + 25 [label="Exit when"]; + } + 37 [label="Function call: R|/C.C|()"]; + 38 [label="Exit block"]; } - 33 [label="Synthetic else branch"]; - 26 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 27 [label="Enter block"]; - 28 [label="Function call: R|/B.B|()"]; - 29 [label="Jump: ^@run R|/B.B|()"]; - 30 [label="Stub" style="filled" fillcolor=gray]; - 31 [label="Exit block" style="filled" fillcolor=gray]; - } - 32 [label="Exit when branch result" style="filled" fillcolor=gray]; - 22 [label="Exit when"]; + 22 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - 34 [label="Function call: R|/C.C|()"]; - 20 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 18 [label="Call arguments union" style="filled" fillcolor=yellow]; + 16 [label="Postponed exit from lambda"]; + 17 [label="Function call: R|kotlin/run|(...)"]; + 19 [label="Variable declaration: lval x: R|A|"]; + 20 [label="Exit block"]; } - 17 [label="Call arguments union" style="filled" fillcolor=yellow]; - 15 [label="Postponed exit from lambda"]; - 16 [label="Function call: R|kotlin/run|(...)"]; - 18 [label="Variable declaration: lval x: R|A|"]; 13 [label="Exit function test_1" style="filled" fillcolor=red]; } 12 -> {14}; - 14 -> {19}; - 14 -> {15} [color=red]; - 15 -> {16} [color=green]; - 16 -> {18}; - 17 -> {16} [color=red]; - 18 -> {13}; - 19 -> {21}; - 20 -> {15} [color=green]; - 20 -> {17} [color=red]; + 14 -> {15}; + 15 -> {21}; + 15 -> {16} [color=red]; + 16 -> {17} [color=green]; + 17 -> {19}; + 18 -> {17} [color=red]; + 19 -> {20}; + 20 -> {13}; 21 -> {23}; - 22 -> {34}; + 22 -> {16} [color=green]; + 22 -> {18} [color=red]; 23 -> {24}; - 24 -> {25}; - 25 -> {26 33}; + 24 -> {26}; + 25 -> {37}; 26 -> {27}; 27 -> {28}; - 28 -> {29}; - 29 -> {20}; - 29 -> {30} [style=dotted]; - 30 -> {31} [style=dotted]; - 31 -> {32} [style=dotted]; - 32 -> {22} [style=dotted]; - 33 -> {22}; - 34 -> {20}; - - subgraph cluster_10 { - color=red - 35 [label="Enter function test_2" style="filled" fillcolor=red]; - 37 [label="Postponed enter to lambda"]; - subgraph cluster_11 { - color=blue - 42 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 44 [label="Function call: R|/C.C|()"]; - 45 [label="Jump: ^@run R|/C.C|()"]; - 46 [label="Stub" style="filled" fillcolor=gray]; - 43 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 40 [label="Call arguments union" style="filled" fillcolor=yellow]; - 38 [label="Postponed exit from lambda"]; - 39 [label="Function call: R|kotlin/run|(...)"]; - 41 [label="Variable declaration: lval x: R|C|"]; - 36 [label="Exit function test_2" style="filled" fillcolor=red]; - } - 35 -> {37}; - 37 -> {42}; - 37 -> {38} [color=red]; - 38 -> {39} [color=green]; - 39 -> {41}; - 40 -> {39} [color=red]; - 41 -> {36}; - 42 -> {44}; - 43 -> {38} [color=green]; - 43 -> {40} [color=red]; - 44 -> {45}; - 45 -> {43}; - 45 -> {46} [style=dotted]; - 46 -> {43} [style=dotted]; + 28 -> {29 36}; + 29 -> {30}; + 30 -> {31}; + 31 -> {32}; + 32 -> {22}; + 32 -> {33} [style=dotted]; + 33 -> {34} [style=dotted]; + 34 -> {35} [style=dotted]; + 35 -> {25} [style=dotted]; + 36 -> {25}; + 37 -> {38}; + 38 -> {22}; subgraph cluster_12 { color=red - 47 [label="Enter function test_3" style="filled" fillcolor=red]; - 49 [label="Postponed enter to lambda"]; + 39 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_13 { color=blue - 55 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 57 [label="Jump: ^test_3 Unit"]; - 58 [label="Stub" style="filled" fillcolor=gray]; - 56 [label="Exit function anonymousFunction" style="filled" fillcolor=red style="filled" fillcolor=gray]; + 41 [label="Enter block"]; + 42 [label="Postponed enter to lambda"]; + subgraph cluster_14 { + color=blue + 48 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_15 { + color=blue + 50 [label="Enter block"]; + 51 [label="Function call: R|/C.C|()"]; + 52 [label="Jump: ^@run R|/C.C|()"]; + 53 [label="Stub" style="filled" fillcolor=gray]; + 54 [label="Exit block" style="filled" fillcolor=gray]; + } + 49 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 45 [label="Call arguments union" style="filled" fillcolor=yellow]; + 43 [label="Postponed exit from lambda"]; + 44 [label="Function call: R|kotlin/run|(...)"]; + 46 [label="Variable declaration: lval x: R|C|"]; + 47 [label="Exit block"]; } - 52 [label="Call arguments union" style="filled" fillcolor=gray]; - 50 [label="Postponed exit from lambda"]; - 51 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=gray]; - 53 [label="Stub" style="filled" fillcolor=gray]; - 54 [label="Variable declaration: lval x: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 48 [label="Exit function test_3" style="filled" fillcolor=red]; + 40 [label="Exit function test_2" style="filled" fillcolor=red]; } - 47 -> {49}; - 49 -> {55}; - 49 -> {50} [color=red]; - 50 -> {51} [color=green]; - 51 -> {48 53} [style=dotted]; - 52 -> {51} [style=dotted]; + 39 -> {41}; + 41 -> {42}; + 42 -> {48}; + 42 -> {43} [color=red]; + 43 -> {44} [color=green]; + 44 -> {46}; + 45 -> {44} [color=red]; + 46 -> {47}; + 47 -> {40}; + 48 -> {50}; + 49 -> {43} [color=green]; + 49 -> {45} [color=red]; + 50 -> {51}; + 51 -> {52}; + 52 -> {49}; + 52 -> {53} [style=dotted]; 53 -> {54} [style=dotted]; - 54 -> {48} [style=dotted]; + 54 -> {49} [style=dotted]; + + subgraph cluster_16 { + color=red + 55 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_17 { + color=blue + 57 [label="Enter block"]; + 58 [label="Postponed enter to lambda"]; + subgraph cluster_18 { + color=blue + 65 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 67 [label="Enter block"]; + 68 [label="Jump: ^test_3 Unit"]; + 69 [label="Stub" style="filled" fillcolor=gray]; + 70 [label="Exit block" style="filled" fillcolor=gray]; + } + 66 [label="Exit function anonymousFunction" style="filled" fillcolor=red style="filled" fillcolor=gray]; + } + 61 [label="Call arguments union" style="filled" fillcolor=gray]; + 59 [label="Postponed exit from lambda" style="filled" fillcolor=gray]; + 60 [label="Function call: R|kotlin/run|(...)" style="filled" fillcolor=gray]; + 62 [label="Stub" style="filled" fillcolor=gray]; + 63 [label="Variable declaration: lval x: R|kotlin/Nothing|" style="filled" fillcolor=gray]; + 64 [label="Exit block" style="filled" fillcolor=gray]; + } + 56 [label="Exit function test_3" style="filled" fillcolor=red]; + } 55 -> {57}; - 56 -> {52} [style=dotted]; - 56 -> {50} [color=green]; - 57 -> {48}; - 57 -> {58} [style=dotted]; - 58 -> {56} [style=dotted]; + 57 -> {58}; + 58 -> {65}; + 58 -> {59} [color=red]; + 59 -> {60} [style=dotted]; + 60 -> {56 62} [style=dotted]; + 61 -> {60} [style=dotted]; + 62 -> {63} [style=dotted]; + 63 -> {64} [style=dotted]; + 64 -> {56} [style=dotted]; + 65 -> {67}; + 66 -> {59 61} [style=dotted]; + 67 -> {68}; + 68 -> {56}; + 68 -> {69} [style=dotted]; + 69 -> {70} [style=dotted]; + 70 -> {66} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot index d76cdefab62..d07a712b48a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/safeCalls.dot @@ -19,84 +19,86 @@ digraph safeCalls_kt { subgraph cluster_2 { color=red - 4 [label="Enter class A" style="filled" fillcolor=red]; - 5 [label="Exit class A" style="filled" fillcolor=red]; + 5 [label="Enter class A" style="filled" fillcolor=red]; + 4 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; + 5 -> {4} [color=green]; subgraph cluster_3 { color=red - 14 [label="Enter class B" style="filled" fillcolor=red]; - subgraph cluster_4 { - color=blue - 10 [label="Enter function getter" style="filled" fillcolor=red]; - 11 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_5 { - color=blue - 6 [label="Enter function getter" style="filled" fillcolor=red]; - 7 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_6 { - color=blue - 8 [label="Enter property" style="filled" fillcolor=red]; - 9 [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}; + + subgraph cluster_4 { + color=red + 8 [label="Enter function getter" style="filled" fillcolor=red]; + 9 [label="Exit function getter" style="filled" fillcolor=red]; + } + 8 -> {9}; + + subgraph cluster_5 { + color=red + 11 [label="Enter class B" style="filled" fillcolor=red]; + 10 [label="Exit class B" style="filled" fillcolor=red]; + } + 11 -> {10} [color=green]; + + subgraph cluster_6 { + color=red + 12 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue - 12 [label="Enter property" style="filled" fillcolor=red]; - 13 [label="Exit property" style="filled" fillcolor=red]; + 14 [label="Enter block"]; + 15 [label="Access variable R|/x|"]; + 16 [label="Enter safe call"]; + 18 [label="Function call: $subj$.R|/A.foo|()"]; + 17 [label="Exit safe call"]; + 19 [label="Enter safe call"]; + 21 [label="Function call: $subj$.R|/A.bar|()"]; + 20 [label="Exit safe call"]; + 22 [label="Exit block"]; } - 15 [label="Exit class B" style="filled" fillcolor=red]; + 13 [label="Exit function test_1" style="filled" fillcolor=red]; } - 14 -> {8} [color=green]; - 8 -> {9}; - 9 -> {12} [color=green]; - 6 -> {7}; - 12 -> {13}; - 13 -> {15} [color=green]; - 10 -> {11}; + 12 -> {14}; + 14 -> {15}; + 15 -> {16 17}; + 16 -> {18}; + 17 -> {19 20}; + 18 -> {17}; + 19 -> {21}; + 20 -> {22}; + 21 -> {20}; + 22 -> {13}; subgraph cluster_8 { color=red - 16 [label="Enter function test_1" style="filled" fillcolor=red]; - 18 [label="Access variable R|/x|"]; - 19 [label="Enter safe call"]; - 21 [label="Function call: $subj$.R|/A.foo|()"]; - 20 [label="Exit safe call"]; - 22 [label="Enter safe call"]; - 24 [label="Function call: $subj$.R|/A.bar|()"]; - 23 [label="Exit safe call"]; - 17 [label="Exit function test_1" style="filled" fillcolor=red]; + 23 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 25 [label="Enter block"]; + 26 [label="Access variable R|/x|"]; + 27 [label="Enter safe call"]; + 29 [label="Access variable R|/B.foo|"]; + 28 [label="Exit safe call"]; + 30 [label="Enter safe call"]; + 32 [label="Access variable R|/B.bar|"]; + 31 [label="Exit safe call"]; + 33 [label="Exit block"]; + } + 24 [label="Exit function test_2" style="filled" fillcolor=red]; } - 16 -> {18}; - 18 -> {19 20}; - 19 -> {21}; - 20 -> {22 23}; - 21 -> {20}; - 22 -> {24}; - 23 -> {17}; - 24 -> {23}; - - subgraph cluster_9 { - color=red - 25 [label="Enter function test_2" style="filled" fillcolor=red]; - 27 [label="Access variable R|/x|"]; - 28 [label="Enter safe call"]; - 30 [label="Access variable R|/B.foo|"]; - 29 [label="Exit safe call"]; - 31 [label="Enter safe call"]; - 33 [label="Access variable R|/B.bar|"]; - 32 [label="Exit safe call"]; - 26 [label="Exit function test_2" style="filled" fillcolor=red]; - } - 25 -> {27}; - 27 -> {28 29}; - 28 -> {30}; - 29 -> {31 32}; - 30 -> {29}; + 23 -> {25}; + 25 -> {26}; + 26 -> {27 28}; + 27 -> {29}; + 28 -> {30 31}; + 29 -> {28}; + 30 -> {32}; 31 -> {33}; - 32 -> {26}; - 33 -> {32}; + 32 -> {31}; + 33 -> {24}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/simple.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/simple.dot index d41ab8fcd31..5fe6fdadaba 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/simple.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/simple.dot @@ -6,29 +6,43 @@ digraph simple_kt { subgraph cluster_0 { color=red 0 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Exit block"]; + } 1 [label="Exit function foo" style="filled" fillcolor=red]; } - 0 -> {1}; + 0 -> {2}; + 2 -> {3}; + 3 -> {1}; - subgraph cluster_1 { + subgraph cluster_2 { color=red - 2 [label="Enter function test" style="filled" fillcolor=red]; - 4 [label="Const: Int(1)"]; - 5 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 6 [label="Access variable R|/x|"]; - 7 [label="Const: Int(1)"]; - 8 [label="Function call: R|/x|.R|kotlin/Int.plus|(...)"]; - 9 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 10 [label="Function call: R|/foo|()"]; - 3 [label="Exit function test" style="filled" fillcolor=red]; + 4 [label="Enter function test" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 6 [label="Enter block"]; + 7 [label="Const: Int(1)"]; + 8 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 9 [label="Access variable R|/x|"]; + 10 [label="Const: Int(1)"]; + 11 [label="Function call: R|/x|.R|kotlin/Int.plus|(...)"]; + 12 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 13 [label="Function call: R|/foo|()"]; + 14 [label="Exit block"]; + } + 5 [label="Exit function test" style="filled" fillcolor=red]; } - 2 -> {4}; - 4 -> {5}; - 5 -> {6}; + 4 -> {6}; 6 -> {7}; 7 -> {8}; 8 -> {9}; 9 -> {10}; - 10 -> {3}; + 10 -> {11}; + 11 -> {12}; + 12 -> {13}; + 13 -> {14}; + 14 -> {5}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/tryCatch.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/tryCatch.dot index c9da9d8f96e..c6b6c626463 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/tryCatch.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/tryCatch.dot @@ -8,294 +8,315 @@ digraph tryCatch_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Try expression enter"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Try main block enter"]; + 3 [label="Try expression enter"]; subgraph cluster_3 { color=blue - 7 [label="Enter block"]; - 8 [label="Const: Int(1)"]; - 9 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 10 [label="Exit block"]; + 5 [label="Try main block enter"]; + subgraph cluster_4 { + color=blue + 8 [label="Enter block"]; + 9 [label="Const: Int(1)"]; + 10 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 11 [label="Exit block"]; + } + 12 [label="Try main block exit"]; } - 11 [label="Try main block exit"]; - } - subgraph cluster_4 { - color=blue - 6 [label="Catch enter"]; subgraph cluster_5 { color=blue - 17 [label="Enter block"]; - 18 [label="Const: Int(3)"]; - 19 [label="Variable declaration: lval z: R|kotlin/Int|"]; - 20 [label="Exit block"]; + 7 [label="Catch enter"]; + subgraph cluster_6 { + color=blue + 18 [label="Enter block"]; + 19 [label="Const: Int(3)"]; + 20 [label="Variable declaration: lval z: R|kotlin/Int|"]; + 21 [label="Exit block"]; + } + 22 [label="Catch exit"]; } - 21 [label="Catch exit"]; - } - subgraph cluster_6 { - color=blue - 5 [label="Catch enter"]; subgraph cluster_7 { color=blue - 12 [label="Enter block"]; - 13 [label="Const: Int(2)"]; - 14 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 15 [label="Exit block"]; + 6 [label="Catch enter"]; + subgraph cluster_8 { + color=blue + 13 [label="Enter block"]; + 14 [label="Const: Int(2)"]; + 15 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 16 [label="Exit block"]; + } + 17 [label="Catch exit"]; } - 16 [label="Catch exit"]; + 4 [label="Try expression exit"]; } - 3 [label="Try expression exit"]; + 23 [label="Exit block"]; } 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {1}; - 4 -> {1 5 6 7}; - 5 -> {1 12}; - 6 -> {1 17}; - 7 -> {8}; + 2 -> {3}; + 3 -> {5}; + 4 -> {23}; + 5 -> {1 6 7 8}; + 6 -> {1 13}; + 7 -> {1 18}; 8 -> {9}; 9 -> {10}; 10 -> {11}; - 11 -> {3}; - 12 -> {13}; + 11 -> {12}; + 12 -> {4}; 13 -> {14}; 14 -> {15}; 15 -> {16}; - 16 -> {3}; - 17 -> {18}; + 16 -> {17}; + 17 -> {4}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {3}; + 21 -> {22}; + 22 -> {4}; + 23 -> {1}; - subgraph cluster_8 { + subgraph cluster_9 { color=red - 22 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_9 { + 24 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_10 { color=blue - 24 [label="Try expression enter"]; - subgraph cluster_10 { + 26 [label="Enter block"]; + subgraph cluster_11 { color=blue - 26 [label="Try main block enter"]; - subgraph cluster_11 { + 27 [label="Try expression enter"]; + subgraph cluster_12 { color=blue - 28 [label="Enter block"]; - 29 [label="Const: Int(1)"]; - 30 [label="Exit block"]; + 29 [label="Try main block enter"]; + subgraph cluster_13 { + color=blue + 31 [label="Enter block"]; + 32 [label="Const: Int(1)"]; + 33 [label="Exit block"]; + } + 34 [label="Try main block exit"]; } - 31 [label="Try main block exit"]; - } - subgraph cluster_12 { - color=blue - 27 [label="Catch enter"]; - subgraph cluster_13 { + subgraph cluster_14 { color=blue - 32 [label="Enter block"]; - 33 [label="Const: Int(2)"]; - 34 [label="Exit block"]; + 30 [label="Catch enter"]; + subgraph cluster_15 { + color=blue + 35 [label="Enter block"]; + 36 [label="Const: Int(2)"]; + 37 [label="Exit block"]; + } + 38 [label="Catch exit"]; } - 35 [label="Catch exit"]; + 28 [label="Try expression exit"]; } - 25 [label="Try expression exit"]; + 39 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 40 [label="Exit block"]; } - 36 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 23 [label="Exit function test_2" style="filled" fillcolor=red]; + 25 [label="Exit function test_2" style="filled" fillcolor=red]; } - 22 -> {24}; 24 -> {26}; - 25 -> {36}; - 26 -> {23 27 28}; - 27 -> {23 32}; - 28 -> {29}; - 29 -> {30}; - 30 -> {31}; - 31 -> {25}; + 26 -> {27}; + 27 -> {29}; + 28 -> {39}; + 29 -> {25 30 31}; + 30 -> {25 35}; + 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {35}; - 35 -> {25}; - 36 -> {23}; + 34 -> {28}; + 35 -> {36}; + 36 -> {37}; + 37 -> {38}; + 38 -> {28}; + 39 -> {40}; + 40 -> {25}; - subgraph cluster_14 { + subgraph cluster_16 { color=red - 37 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_15 { + 41 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_17 { color=blue - 39 [label="Enter while loop"]; - subgraph cluster_16 { + 43 [label="Enter block"]; + subgraph cluster_18 { color=blue - 41 [label="Enter loop condition"]; - 42 [label="Const: Boolean(true)"]; - 43 [label="Exit loop condition"]; - } - subgraph cluster_17 { - color=blue - 44 [label="Enter loop block"]; - subgraph cluster_18 { + 44 [label="Enter while loop"]; + subgraph cluster_19 { color=blue - 45 [label="Enter block"]; - subgraph cluster_19 { + 46 [label="Enter loop condition"]; + 47 [label="Const: Boolean(true)"]; + 48 [label="Exit loop condition"]; + } + subgraph cluster_20 { + color=blue + 49 [label="Enter loop block"]; + subgraph cluster_21 { color=blue - 46 [label="Try expression enter"]; - subgraph cluster_20 { + 50 [label="Enter block"]; + subgraph cluster_22 { color=blue - 48 [label="Try main block enter"]; - subgraph cluster_21 { + 51 [label="Try expression enter"]; + subgraph cluster_23 { color=blue - 51 [label="Enter block"]; - subgraph cluster_22 { + 53 [label="Try main block enter"]; + subgraph cluster_24 { color=blue - 52 [label="Enter when"]; - subgraph cluster_23 { + 56 [label="Enter block"]; + subgraph cluster_25 { color=blue - 54 [label="Enter when branch condition "]; - 55 [label="Access variable R|/b|"]; - 56 [label="Exit when branch condition"]; + 57 [label="Enter when"]; + subgraph cluster_26 { + color=blue + 59 [label="Enter when branch condition "]; + 60 [label="Access variable R|/b|"]; + 61 [label="Exit when branch condition"]; + } + 68 [label="Synthetic else branch"]; + 62 [label="Enter when branch result"]; + subgraph cluster_27 { + color=blue + 63 [label="Enter block"]; + 64 [label="Jump: ^test_3 Unit"]; + 65 [label="Stub" style="filled" fillcolor=gray]; + 66 [label="Exit block" style="filled" fillcolor=gray]; + } + 67 [label="Exit when branch result" style="filled" fillcolor=gray]; + 58 [label="Exit when"]; } - 63 [label="Synthetic else branch"]; - 57 [label="Enter when branch result"]; - subgraph cluster_24 { + 69 [label="Const: Int(1)"]; + 70 [label="Variable declaration: lval x: R|kotlin/Int|"]; + subgraph cluster_28 { color=blue - 58 [label="Enter block"]; - 59 [label="Jump: ^test_3 Unit"]; - 60 [label="Stub" style="filled" fillcolor=gray]; - 61 [label="Exit block" style="filled" fillcolor=gray]; + 71 [label="Enter when"]; + subgraph cluster_29 { + color=blue + 73 [label="Enter when branch condition "]; + 74 [label="Access variable R|/b|"]; + 75 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 76 [label="Exit when branch condition"]; + } + 83 [label="Synthetic else branch"]; + 77 [label="Enter when branch result"]; + subgraph cluster_30 { + color=blue + 78 [label="Enter block"]; + 79 [label="Jump: break@@@[Boolean(true)] "]; + 80 [label="Stub" style="filled" fillcolor=gray]; + 81 [label="Exit block" style="filled" fillcolor=gray]; + } + 82 [label="Exit when branch result" style="filled" fillcolor=gray]; + 72 [label="Exit when"]; } - 62 [label="Exit when branch result" style="filled" fillcolor=gray]; - 53 [label="Exit when"]; + 84 [label="Exit block"]; } - 64 [label="Const: Int(1)"]; - 65 [label="Variable declaration: lval x: R|kotlin/Int|"]; - subgraph cluster_25 { - color=blue - 66 [label="Enter when"]; - subgraph cluster_26 { - color=blue - 68 [label="Enter when branch condition "]; - 69 [label="Access variable R|/b|"]; - 70 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 71 [label="Exit when branch condition"]; - } - 78 [label="Synthetic else branch"]; - 72 [label="Enter when branch result"]; - subgraph cluster_27 { - color=blue - 73 [label="Enter block"]; - 74 [label="Jump: break@@@[Boolean(true)] "]; - 75 [label="Stub" style="filled" fillcolor=gray]; - 76 [label="Exit block" style="filled" fillcolor=gray]; - } - 77 [label="Exit when branch result" style="filled" fillcolor=gray]; - 67 [label="Exit when"]; - } - 79 [label="Exit block"]; + 85 [label="Try main block exit"]; } - 80 [label="Try main block exit"]; - } - subgraph cluster_28 { - color=blue - 50 [label="Catch enter"]; - subgraph cluster_29 { - color=blue - 86 [label="Enter block"]; - 87 [label="Jump: break@@@[Boolean(true)] "]; - 88 [label="Stub" style="filled" fillcolor=gray]; - 89 [label="Exit block" style="filled" fillcolor=gray]; - } - 90 [label="Catch exit" style="filled" fillcolor=gray]; - } - subgraph cluster_30 { - color=blue - 49 [label="Catch enter"]; subgraph cluster_31 { color=blue - 81 [label="Enter block"]; - 82 [label="Jump: continue@@@[Boolean(true)] "]; - 83 [label="Stub" style="filled" fillcolor=gray]; - 84 [label="Exit block" style="filled" fillcolor=gray]; + 55 [label="Catch enter"]; + subgraph cluster_32 { + color=blue + 91 [label="Enter block"]; + 92 [label="Jump: break@@@[Boolean(true)] "]; + 93 [label="Stub" style="filled" fillcolor=gray]; + 94 [label="Exit block" style="filled" fillcolor=gray]; + } + 95 [label="Catch exit" style="filled" fillcolor=gray]; } - 85 [label="Catch exit" style="filled" fillcolor=gray]; + subgraph cluster_33 { + color=blue + 54 [label="Catch enter"]; + subgraph cluster_34 { + color=blue + 86 [label="Enter block"]; + 87 [label="Jump: continue@@@[Boolean(true)] "]; + 88 [label="Stub" style="filled" fillcolor=gray]; + 89 [label="Exit block" style="filled" fillcolor=gray]; + } + 90 [label="Catch exit" style="filled" fillcolor=gray]; + } + 52 [label="Try expression exit"]; } - 47 [label="Try expression exit"]; + 96 [label="Const: Int(2)"]; + 97 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 98 [label="Exit block"]; } - 91 [label="Const: Int(2)"]; - 92 [label="Variable declaration: lval y: R|kotlin/Int|"]; - 93 [label="Exit block"]; + 99 [label="Exit loop block"]; } - 94 [label="Exit loop block"]; + 45 [label="Exit whileloop"]; } - 40 [label="Exit whileloop"]; + 100 [label="Const: Int(3)"]; + 101 [label="Variable declaration: lval z: R|kotlin/Int|"]; + 102 [label="Exit block"]; } - 95 [label="Const: Int(3)"]; - 96 [label="Variable declaration: lval z: R|kotlin/Int|"]; - 38 [label="Exit function test_3" style="filled" fillcolor=red]; + 42 [label="Exit function test_3" style="filled" fillcolor=red]; } - 37 -> {39}; - 39 -> {41}; - 40 -> {95}; - 41 -> {42}; - 42 -> {43}; + 41 -> {43}; 43 -> {44}; - 43 -> {40} [style=dotted]; - 44 -> {45}; - 45 -> {46}; - 46 -> {48}; - 47 -> {91}; - 48 -> {38 49 50 51}; - 49 -> {38 81}; - 50 -> {38 86}; - 51 -> {52}; - 52 -> {54}; - 53 -> {64}; - 54 -> {55}; - 55 -> {56}; - 56 -> {57 63}; - 57 -> {58}; - 58 -> {59}; - 59 -> {38}; - 59 -> {60} [style=dotted]; - 60 -> {61} [style=dotted]; - 61 -> {62} [style=dotted]; - 62 -> {53} [style=dotted]; - 63 -> {53}; - 64 -> {65}; - 65 -> {66}; - 66 -> {68}; - 67 -> {79}; - 68 -> {69}; + 44 -> {46}; + 45 -> {100}; + 46 -> {47}; + 47 -> {48}; + 48 -> {49}; + 48 -> {45} [style=dotted]; + 49 -> {50}; + 50 -> {51}; + 51 -> {53}; + 52 -> {96}; + 53 -> {42 54 55 56}; + 54 -> {42 86}; + 55 -> {42 91}; + 56 -> {57}; + 57 -> {59}; + 58 -> {69}; + 59 -> {60}; + 60 -> {61}; + 61 -> {62 68}; + 62 -> {63}; + 63 -> {64}; + 64 -> {42}; + 64 -> {65} [style=dotted]; + 65 -> {66} [style=dotted]; + 66 -> {67} [style=dotted]; + 67 -> {58} [style=dotted]; + 68 -> {58}; 69 -> {70}; 70 -> {71}; - 71 -> {72 78}; - 72 -> {73}; + 71 -> {73}; + 72 -> {84}; 73 -> {74}; - 74 -> {40}; - 74 -> {75} [style=dotted]; - 75 -> {76} [style=dotted]; - 76 -> {77} [style=dotted]; - 77 -> {67} [style=dotted]; - 78 -> {67}; - 79 -> {80}; - 80 -> {47}; - 81 -> {82}; - 82 -> {83} [style=dotted]; - 82 -> {39} [color=green style=dashed]; - 83 -> {84} [style=dotted]; - 84 -> {85} [style=dotted]; - 85 -> {47} [style=dotted]; + 74 -> {75}; + 75 -> {76}; + 76 -> {77 83}; + 77 -> {78}; + 78 -> {79}; + 79 -> {45}; + 79 -> {80} [style=dotted]; + 80 -> {81} [style=dotted]; + 81 -> {82} [style=dotted]; + 82 -> {72} [style=dotted]; + 83 -> {72}; + 84 -> {85}; + 85 -> {52}; 86 -> {87}; - 87 -> {40}; 87 -> {88} [style=dotted]; + 87 -> {44} [color=green style=dashed]; 88 -> {89} [style=dotted]; 89 -> {90} [style=dotted]; - 90 -> {47} [style=dotted]; + 90 -> {52} [style=dotted]; 91 -> {92}; - 92 -> {93}; - 93 -> {94}; - 94 -> {41} [color=green style=dashed]; - 95 -> {96}; - 96 -> {38}; + 92 -> {45}; + 92 -> {93} [style=dotted]; + 93 -> {94} [style=dotted]; + 94 -> {95} [style=dotted]; + 95 -> {52} [style=dotted]; + 96 -> {97}; + 97 -> {98}; + 98 -> {99}; + 99 -> {46} [color=green style=dashed]; + 100 -> {101}; + 101 -> {102}; + 102 -> {42}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot b/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot index 5b030373ebf..773ef55e4db 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/when.dot @@ -8,195 +8,209 @@ digraph when_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Enter when branch condition "]; - 5 [label="Access variable R|/x|"]; - 6 [label="Const: Int(1)"]; - 7 [label="Operator =="]; - 8 [label="Exit when branch condition"]; + 3 [label="Enter when"]; + subgraph cluster_3 { + color=blue + 5 [label="Enter when branch condition "]; + 6 [label="Access variable R|/x|"]; + 7 [label="Const: Int(1)"]; + 8 [label="Operator =="]; + 9 [label="Exit when branch condition"]; + } + subgraph cluster_4 { + color=blue + 15 [label="Enter when branch condition "]; + 16 [label="Access variable R|/x|"]; + 17 [label="Const: Int(2)"]; + 18 [label="Function call: R|/x|.R|kotlin/Int.rem|(...)"]; + 19 [label="Const: Int(0)"]; + 20 [label="Operator =="]; + 21 [label="Exit when branch condition"]; + } + subgraph cluster_5 { + color=blue + 27 [label="Enter when branch condition "]; + 28 [label="Const: Int(1)"]; + 29 [label="Const: Int(1)"]; + 30 [label="Function call: Int(1).R|kotlin/Int.minus|(...)"]; + 31 [label="Const: Int(0)"]; + 32 [label="Operator =="]; + 33 [label="Exit when branch condition"]; + } + subgraph cluster_6 { + color=blue + 40 [label="Enter when branch condition else"]; + 41 [label="Exit when branch condition"]; + } + 42 [label="Enter when branch result"]; + subgraph cluster_7 { + color=blue + 43 [label="Enter block"]; + 44 [label="Const: Int(5)"]; + 45 [label="Exit block"]; + } + 46 [label="Exit when branch result"]; + 34 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 35 [label="Enter block"]; + 36 [label="Jump: ^test_1 Unit"]; + 37 [label="Stub" style="filled" fillcolor=gray]; + 38 [label="Exit block" style="filled" fillcolor=gray]; + } + 39 [label="Exit when branch result" style="filled" fillcolor=gray]; + 22 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 23 [label="Enter block"]; + 24 [label="Const: Int(20)"]; + 25 [label="Exit block"]; + } + 26 [label="Exit when branch result"]; + 10 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 11 [label="Enter block"]; + 12 [label="Const: Int(10)"]; + 13 [label="Exit block"]; + } + 14 [label="Exit when branch result"]; + 4 [label="Exit when"]; } - subgraph cluster_3 { - color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Access variable R|/x|"]; - 16 [label="Const: Int(2)"]; - 17 [label="Function call: R|/x|.R|kotlin/Int.rem|(...)"]; - 18 [label="Const: Int(0)"]; - 19 [label="Operator =="]; - 20 [label="Exit when branch condition"]; - } - subgraph cluster_4 { - color=blue - 26 [label="Enter when branch condition "]; - 27 [label="Const: Int(1)"]; - 28 [label="Const: Int(1)"]; - 29 [label="Function call: Int(1).R|kotlin/Int.minus|(...)"]; - 30 [label="Const: Int(0)"]; - 31 [label="Operator =="]; - 32 [label="Exit when branch condition"]; - } - subgraph cluster_5 { - color=blue - 39 [label="Enter when branch condition else"]; - 40 [label="Exit when branch condition"]; - } - 41 [label="Enter when branch result"]; - subgraph cluster_6 { - color=blue - 42 [label="Enter block"]; - 43 [label="Const: Int(5)"]; - 44 [label="Exit block"]; - } - 45 [label="Exit when branch result"]; - 33 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 34 [label="Enter block"]; - 35 [label="Jump: ^test_1 Unit"]; - 36 [label="Stub" style="filled" fillcolor=gray]; - 37 [label="Exit block" style="filled" fillcolor=gray]; - } - 38 [label="Exit when branch result" style="filled" fillcolor=gray]; - 21 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 22 [label="Enter block"]; - 23 [label="Const: Int(20)"]; - 24 [label="Exit block"]; - } - 25 [label="Exit when branch result"]; - 9 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 10 [label="Enter block"]; - 11 [label="Const: Int(10)"]; - 12 [label="Exit block"]; - } - 13 [label="Exit when branch result"]; - 3 [label="Exit when"]; + 47 [label="Variable declaration: lval y: R|kotlin/Int|"]; + 48 [label="Exit block"]; } - 46 [label="Variable declaration: lval y: R|kotlin/Int|"]; 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {46}; - 4 -> {5}; + 2 -> {3}; + 3 -> {5}; + 4 -> {47}; 5 -> {6}; 6 -> {7}; 7 -> {8}; - 8 -> {9 14}; - 9 -> {10}; + 8 -> {9}; + 9 -> {10 15}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {3}; - 14 -> {15}; + 13 -> {14}; + 14 -> {4}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; 19 -> {20}; - 20 -> {21 26}; - 21 -> {22}; + 20 -> {21}; + 21 -> {22 27}; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {3}; - 26 -> {27}; + 25 -> {26}; + 26 -> {4}; 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; - 32 -> {33 39}; - 33 -> {34}; + 32 -> {33}; + 33 -> {34 40}; 34 -> {35}; - 35 -> {1}; - 35 -> {36} [style=dotted]; + 35 -> {36}; + 36 -> {1}; 36 -> {37} [style=dotted]; 37 -> {38} [style=dotted]; - 38 -> {3} [style=dotted]; - 39 -> {40}; + 38 -> {39} [style=dotted]; + 39 -> {4} [style=dotted]; 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; 44 -> {45}; - 45 -> {3}; - 46 -> {1}; - - subgraph cluster_10 { - color=red - 47 [label="Enter class A" style="filled" fillcolor=red]; - 48 [label="Exit class A" style="filled" fillcolor=red]; - } - 47 -> {48} [color=green]; + 45 -> {46}; + 46 -> {4}; + 47 -> {48}; + 48 -> {1}; subgraph cluster_11 { color=red - 49 [label="Enter class B" style="filled" fillcolor=red]; - 50 [label="Exit class B" style="filled" fillcolor=red]; + 50 [label="Enter class A" style="filled" fillcolor=red]; + 49 [label="Exit class A" style="filled" fillcolor=red]; } - 49 -> {50} [color=green]; + 50 -> {49} [color=green]; subgraph cluster_12 { color=red - 51 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_13 { - color=blue - 53 [label="Enter when"]; - subgraph cluster_14 { - color=blue - 55 [label="Enter when branch condition "]; - subgraph cluster_15 { - color=blue - 57 [label="Enter &&"]; - 58 [label="Access variable R|/x|"]; - 59 [label="Type operator: (R|/x| is R|A|)"]; - 60 [label="Exit left part of &&"]; - 61 [label="Enter right part of &&"]; - 62 [label="Access variable R|/x|"]; - 63 [label="Type operator: (R|/x| is R|B|)"]; - 56 [label="Exit &&"]; - } - 64 [label="Exit when branch condition"]; - } - 71 [label="Synthetic else branch"]; - 65 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 66 [label="Enter block"]; - 67 [label="Access variable R|/x|"]; - 68 [label="Type operator: (R|/x| is R|A|)"]; - 69 [label="Exit block"]; - } - 70 [label="Exit when branch result"]; - 54 [label="Exit when"]; - } - 52 [label="Exit function test_2" style="filled" fillcolor=red]; + 52 [label="Enter class B" style="filled" fillcolor=red]; + 51 [label="Exit class B" style="filled" fillcolor=red]; + } + 52 -> {51} [color=green]; + + subgraph cluster_13 { + color=red + 53 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_14 { + color=blue + 55 [label="Enter block"]; + subgraph cluster_15 { + color=blue + 56 [label="Enter when"]; + subgraph cluster_16 { + color=blue + 58 [label="Enter when branch condition "]; + subgraph cluster_17 { + color=blue + 60 [label="Enter &&"]; + 61 [label="Access variable R|/x|"]; + 62 [label="Type operator: (R|/x| is R|A|)"]; + 63 [label="Exit left part of &&"]; + 64 [label="Enter right part of &&"]; + 65 [label="Access variable R|/x|"]; + 66 [label="Type operator: (R|/x| is R|B|)"]; + 59 [label="Exit &&"]; + } + 67 [label="Exit when branch condition"]; + } + 74 [label="Synthetic else branch"]; + 68 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 69 [label="Enter block"]; + 70 [label="Access variable R|/x|"]; + 71 [label="Type operator: (R|/x| is R|A|)"]; + 72 [label="Exit block"]; + } + 73 [label="Exit when branch result"]; + 57 [label="Exit when"]; + } + 75 [label="Exit block"]; + } + 54 [label="Exit function test_2" style="filled" fillcolor=red]; } - 51 -> {53}; 53 -> {55}; - 54 -> {52}; - 55 -> {57}; - 56 -> {64}; - 57 -> {58}; - 58 -> {59}; - 59 -> {60}; - 60 -> {56 61}; + 55 -> {56}; + 56 -> {58}; + 57 -> {75}; + 58 -> {60}; + 59 -> {67}; + 60 -> {61}; 61 -> {62}; 62 -> {63}; - 63 -> {56}; - 64 -> {65 71}; + 63 -> {59 64}; + 64 -> {65}; 65 -> {66}; - 66 -> {67}; - 67 -> {68}; + 66 -> {59}; + 67 -> {68 74}; 68 -> {69}; 69 -> {70}; - 70 -> {54}; - 71 -> {54}; + 70 -> {71}; + 71 -> {72}; + 72 -> {73}; + 73 -> {57}; + 74 -> {57}; + 75 -> {54}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot b/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot index cfee9659b4a..614727a84af 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveWhenAndDNNType.dot @@ -15,289 +15,331 @@ digraph exhaustiveWhenAndDNNType_kt { subgraph cluster_1 { color=red 3 [label="Enter function values" style="filled" fillcolor=red]; + subgraph cluster_2 { + color=blue + 5 [label="Enter block"]; + 6 [label="Exit block"]; + } 4 [label="Exit function values" style="filled" fillcolor=red]; } - 3 -> {4}; - - subgraph cluster_2 { - color=red - 5 [label="Enter function valueOf" style="filled" fillcolor=red]; - 6 [label="Exit function valueOf" style="filled" fillcolor=red]; - } + 3 -> {5}; 5 -> {6}; + 6 -> {4}; subgraph cluster_3 { color=red - 7 [label="Enter class SomeEnum" style="filled" fillcolor=red]; - 8 [label="Exit class SomeEnum" style="filled" fillcolor=red]; + 7 [label="Enter function valueOf" style="filled" fillcolor=red]; + subgraph cluster_4 { + color=blue + 9 [label="Enter block"]; + 10 [label="Exit block"]; + } + 8 [label="Exit function valueOf" style="filled" fillcolor=red]; } - 7 -> {8} [color=green]; - - subgraph cluster_4 { - color=red - 9 [label="Enter function " style="filled" fillcolor=red]; - 11 [label="Delegated constructor call: super()"]; - 10 [label="Exit function " style="filled" fillcolor=red]; - } - 9 -> {11}; - 11 -> {10}; + 7 -> {9}; + 9 -> {10}; + 10 -> {8}; subgraph cluster_5 { color=red - 12 [label="Enter class B" style="filled" fillcolor=red]; - 13 [label="Exit class B" style="filled" fillcolor=red]; + 12 [label="Enter class SomeEnum" style="filled" fillcolor=red]; + 11 [label="Exit class SomeEnum" style="filled" fillcolor=red]; } - 12 -> {13} [color=green]; + 12 -> {11} [color=green]; subgraph cluster_6 { color=red - 14 [label="Enter function takeB" style="filled" fillcolor=red]; - 15 [label="Exit function takeB" style="filled" fillcolor=red]; + 13 [label="Enter function " style="filled" fillcolor=red]; + 15 [label="Delegated constructor call: super()"]; + 14 [label="Exit function " style="filled" fillcolor=red]; } - 14 -> {15}; + 13 -> {15}; + 15 -> {14}; subgraph cluster_7 { color=red - 16 [label="Enter function test_1" style="filled" fillcolor=red]; - 18 [label="Access qualifier /SomeEnum"]; - 19 [label="Access variable R|/SomeEnum.A1|"]; - 20 [label="Variable declaration: lval flag: R|SomeEnum|"]; - subgraph cluster_8 { + 17 [label="Enter class B" style="filled" fillcolor=red]; + 16 [label="Exit class B" style="filled" fillcolor=red]; + } + 17 -> {16} [color=green]; + + subgraph cluster_8 { + color=red + 18 [label="Enter function takeB" style="filled" fillcolor=red]; + subgraph cluster_9 { color=blue - 21 [label="Enter when"]; - 23 [label="Access variable R|/flag|"]; - 24 [label="Check not null: R|/flag|!!"]; - subgraph cluster_9 { - color=blue - 25 [label="Enter when branch condition "]; - 26 [label="Access qualifier /SomeEnum"]; - 27 [label="Access variable R|/SomeEnum.A1|"]; - 28 [label="Operator =="]; - 29 [label="Exit when branch condition"]; - } - subgraph cluster_10 { - color=blue - 35 [label="Enter when branch condition "]; - 36 [label="Access qualifier /SomeEnum"]; - 37 [label="Access variable R|/SomeEnum.A2|"]; - 38 [label="Operator =="]; - 39 [label="Exit when branch condition"]; - } - 40 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 41 [label="Enter block"]; - 42 [label="Function call: R|/B.B|()"]; - 43 [label="Exit block"]; - } - 44 [label="Exit when branch result"]; - 30 [label="Enter when branch result"]; + 20 [label="Enter block"]; + 21 [label="Exit block"]; + } + 19 [label="Exit function takeB" style="filled" fillcolor=red]; + } + 18 -> {20}; + 20 -> {21}; + 21 -> {19}; + + subgraph cluster_10 { + color=red + 22 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 24 [label="Enter block"]; + 25 [label="Access qualifier /SomeEnum"]; + 26 [label="Access variable R|/SomeEnum.A1|"]; + 27 [label="Variable declaration: lval flag: R|SomeEnum|"]; subgraph cluster_12 { color=blue - 31 [label="Enter block"]; - 32 [label="Function call: R|/B.B|()"]; - 33 [label="Exit block"]; + 28 [label="Enter when"]; + 30 [label="Access variable R|/flag|"]; + 31 [label="Check not null: R|/flag|!!"]; + subgraph cluster_13 { + color=blue + 32 [label="Enter when branch condition "]; + 33 [label="Access qualifier /SomeEnum"]; + 34 [label="Access variable R|/SomeEnum.A1|"]; + 35 [label="Operator =="]; + 36 [label="Exit when branch condition"]; + } + subgraph cluster_14 { + color=blue + 42 [label="Enter when branch condition "]; + 43 [label="Access qualifier /SomeEnum"]; + 44 [label="Access variable R|/SomeEnum.A2|"]; + 45 [label="Operator =="]; + 46 [label="Exit when branch condition"]; + } + 47 [label="Enter when branch result"]; + subgraph cluster_15 { + color=blue + 48 [label="Enter block"]; + 49 [label="Function call: R|/B.B|()"]; + 50 [label="Exit block"]; + } + 51 [label="Exit when branch result"]; + 37 [label="Enter when branch result"]; + subgraph cluster_16 { + color=blue + 38 [label="Enter block"]; + 39 [label="Function call: R|/B.B|()"]; + 40 [label="Exit block"]; + } + 41 [label="Exit when branch result"]; + 29 [label="Exit when"]; } - 34 [label="Exit when branch result"]; - 22 [label="Exit when"]; + 52 [label="Variable declaration: lval b: R|B|"]; + 53 [label="Access variable R|/b|"]; + 54 [label="Function call: R|/takeB|(...)"]; + 55 [label="Exit block"]; } - 45 [label="Variable declaration: lval b: R|B|"]; - 46 [label="Access variable R|/b|"]; - 47 [label="Function call: R|/takeB|(...)"]; - 17 [label="Exit function test_1" style="filled" fillcolor=red]; + 23 [label="Exit function test_1" style="filled" fillcolor=red]; } - 16 -> {18}; - 18 -> {19}; - 19 -> {20}; - 20 -> {21}; - 21 -> {23}; - 22 -> {45}; - 23 -> {24}; + 22 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {29}; - 29 -> {30 35}; + 28 -> {30}; + 29 -> {52}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {22}; + 34 -> {35}; 35 -> {36}; - 36 -> {37}; + 36 -> {37 42}; 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; - 41 -> {42}; + 41 -> {29}; 42 -> {43}; 43 -> {44}; - 44 -> {22}; + 44 -> {45}; 45 -> {46}; 46 -> {47}; - 47 -> {17}; - - subgraph cluster_13 { - color=red - 48 [label="Enter function test_2" style="filled" fillcolor=red]; - 50 [label="Access qualifier /SomeEnum"]; - 51 [label="Access variable R|/SomeEnum.A1|"]; - 52 [label="Variable declaration: lval flag: R|SomeEnum|"]; - subgraph cluster_14 { - color=blue - 53 [label="Enter when"]; - 55 [label="Access variable R|/flag|"]; - 56 [label="Check not null: R|/flag|!!"]; - subgraph cluster_15 { - color=blue - 57 [label="Enter when branch condition "]; - 58 [label="Access qualifier /SomeEnum"]; - 59 [label="Access variable R|/SomeEnum.A1|"]; - 60 [label="Operator =="]; - 61 [label="Exit when branch condition"]; - } - subgraph cluster_16 { - color=blue - 67 [label="Enter when branch condition "]; - 68 [label="Access qualifier /SomeEnum"]; - 69 [label="Access variable R|/SomeEnum.A2|"]; - 70 [label="Operator =="]; - 71 [label="Exit when branch condition"]; - } - 72 [label="Enter when branch result"]; - subgraph cluster_17 { - color=blue - 73 [label="Enter block"]; - 74 [label="Function call: R|/B.B|()"]; - 75 [label="Exit block"]; - } - 76 [label="Exit when branch result"]; - 62 [label="Enter when branch result"]; - subgraph cluster_18 { - color=blue - 63 [label="Enter block"]; - 64 [label="Function call: R|/B.B|()"]; - 65 [label="Exit block"]; - } - 66 [label="Exit when branch result"]; - 54 [label="Exit when"]; - } - 77 [label="Variable declaration: lval b: R|B|"]; - 78 [label="Access variable R|/b|"]; - 79 [label="Function call: R|/takeB|(...)"]; - 49 [label="Exit function test_2" style="filled" fillcolor=red]; - } - 48 -> {50}; + 47 -> {48}; + 48 -> {49}; + 49 -> {50}; 50 -> {51}; - 51 -> {52}; + 51 -> {29}; 52 -> {53}; - 53 -> {55}; - 54 -> {77}; - 55 -> {56}; - 56 -> {57}; - 57 -> {58}; + 53 -> {54}; + 54 -> {55}; + 55 -> {23}; + + subgraph cluster_17 { + color=red + 56 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_18 { + color=blue + 58 [label="Enter block"]; + 59 [label="Access qualifier /SomeEnum"]; + 60 [label="Access variable R|/SomeEnum.A1|"]; + 61 [label="Variable declaration: lval flag: R|SomeEnum|"]; + subgraph cluster_19 { + color=blue + 62 [label="Enter when"]; + 64 [label="Access variable R|/flag|"]; + 65 [label="Check not null: R|/flag|!!"]; + subgraph cluster_20 { + color=blue + 66 [label="Enter when branch condition "]; + 67 [label="Access qualifier /SomeEnum"]; + 68 [label="Access variable R|/SomeEnum.A1|"]; + 69 [label="Operator =="]; + 70 [label="Exit when branch condition"]; + } + subgraph cluster_21 { + color=blue + 76 [label="Enter when branch condition "]; + 77 [label="Access qualifier /SomeEnum"]; + 78 [label="Access variable R|/SomeEnum.A2|"]; + 79 [label="Operator =="]; + 80 [label="Exit when branch condition"]; + } + 81 [label="Enter when branch result"]; + subgraph cluster_22 { + color=blue + 82 [label="Enter block"]; + 83 [label="Function call: R|/B.B|()"]; + 84 [label="Exit block"]; + } + 85 [label="Exit when branch result"]; + 71 [label="Enter when branch result"]; + subgraph cluster_23 { + color=blue + 72 [label="Enter block"]; + 73 [label="Function call: R|/B.B|()"]; + 74 [label="Exit block"]; + } + 75 [label="Exit when branch result"]; + 63 [label="Exit when"]; + } + 86 [label="Variable declaration: lval b: R|B|"]; + 87 [label="Access variable R|/b|"]; + 88 [label="Function call: R|/takeB|(...)"]; + 89 [label="Exit block"]; + } + 57 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 56 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; - 61 -> {62 67}; - 62 -> {63}; - 63 -> {64}; + 61 -> {62}; + 62 -> {64}; + 63 -> {86}; 64 -> {65}; 65 -> {66}; - 66 -> {54}; + 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {71}; + 70 -> {71 76}; 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; - 75 -> {76}; - 76 -> {54}; + 75 -> {63}; + 76 -> {77}; 77 -> {78}; 78 -> {79}; - 79 -> {49}; - - subgraph cluster_19 { - color=red - 80 [label="Enter function test_3" style="filled" fillcolor=red]; - 82 [label="Access qualifier /SomeEnum"]; - 83 [label="Access variable R|/SomeEnum.A1|"]; - 84 [label="Variable declaration: lval flag: R|SomeEnum|"]; - subgraph cluster_20 { - color=blue - 85 [label="Enter when"]; - 87 [label="Access variable R|/flag|"]; - subgraph cluster_21 { - color=blue - 88 [label="Enter when branch condition "]; - 89 [label="Access qualifier /SomeEnum"]; - 90 [label="Access variable R|/SomeEnum.A1|"]; - 91 [label="Operator =="]; - 92 [label="Exit when branch condition"]; - } - subgraph cluster_22 { - color=blue - 98 [label="Enter when branch condition "]; - 99 [label="Access qualifier /SomeEnum"]; - 100 [label="Access variable R|/SomeEnum.A2|"]; - 101 [label="Operator =="]; - 102 [label="Exit when branch condition"]; - } - 103 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 104 [label="Enter block"]; - 105 [label="Function call: R|/B.B|()"]; - 106 [label="Exit block"]; - } - 107 [label="Exit when branch result"]; - 93 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 94 [label="Enter block"]; - 95 [label="Function call: R|/B.B|()"]; - 96 [label="Exit block"]; - } - 97 [label="Exit when branch result"]; - 86 [label="Exit when"]; - } - 108 [label="Variable declaration: lval b: R|B|"]; - 109 [label="Access variable R|/b|"]; - 110 [label="Function call: R|/takeB|(...)"]; - 81 [label="Exit function test_3" style="filled" fillcolor=red]; - } - 80 -> {82}; + 79 -> {80}; + 80 -> {81}; + 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; - 85 -> {87}; - 86 -> {108}; + 85 -> {63}; + 86 -> {87}; 87 -> {88}; 88 -> {89}; - 89 -> {90}; - 90 -> {91}; - 91 -> {92}; - 92 -> {93 98}; + 89 -> {57}; + + subgraph cluster_24 { + color=red + 90 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_25 { + color=blue + 92 [label="Enter block"]; + 93 [label="Access qualifier /SomeEnum"]; + 94 [label="Access variable R|/SomeEnum.A1|"]; + 95 [label="Variable declaration: lval flag: R|SomeEnum|"]; + subgraph cluster_26 { + color=blue + 96 [label="Enter when"]; + 98 [label="Access variable R|/flag|"]; + subgraph cluster_27 { + color=blue + 99 [label="Enter when branch condition "]; + 100 [label="Access qualifier /SomeEnum"]; + 101 [label="Access variable R|/SomeEnum.A1|"]; + 102 [label="Operator =="]; + 103 [label="Exit when branch condition"]; + } + subgraph cluster_28 { + color=blue + 109 [label="Enter when branch condition "]; + 110 [label="Access qualifier /SomeEnum"]; + 111 [label="Access variable R|/SomeEnum.A2|"]; + 112 [label="Operator =="]; + 113 [label="Exit when branch condition"]; + } + 114 [label="Enter when branch result"]; + subgraph cluster_29 { + color=blue + 115 [label="Enter block"]; + 116 [label="Function call: R|/B.B|()"]; + 117 [label="Exit block"]; + } + 118 [label="Exit when branch result"]; + 104 [label="Enter when branch result"]; + subgraph cluster_30 { + color=blue + 105 [label="Enter block"]; + 106 [label="Function call: R|/B.B|()"]; + 107 [label="Exit block"]; + } + 108 [label="Exit when branch result"]; + 97 [label="Exit when"]; + } + 119 [label="Variable declaration: lval b: R|B|"]; + 120 [label="Access variable R|/b|"]; + 121 [label="Function call: R|/takeB|(...)"]; + 122 [label="Exit block"]; + } + 91 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 90 -> {92}; + 92 -> {93}; 93 -> {94}; 94 -> {95}; 95 -> {96}; - 96 -> {97}; - 97 -> {86}; + 96 -> {98}; + 97 -> {119}; 98 -> {99}; 99 -> {100}; 100 -> {101}; 101 -> {102}; 102 -> {103}; - 103 -> {104}; + 103 -> {104 109}; 104 -> {105}; 105 -> {106}; 106 -> {107}; - 107 -> {86}; - 108 -> {109}; + 107 -> {108}; + 108 -> {97}; 109 -> {110}; - 110 -> {81}; + 110 -> {111}; + 111 -> {112}; + 112 -> {113}; + 113 -> {114}; + 114 -> {115}; + 115 -> {116}; + 116 -> {117}; + 117 -> {118}; + 118 -> {97}; + 119 -> {120}; + 120 -> {121}; + 121 -> {122}; + 122 -> {91}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/secondaryConstructorCfg.dot b/compiler/fir/analysis-tests/testData/resolve/problems/secondaryConstructorCfg.dot index 142575b4e1d..eeef8811a30 100644 --- a/compiler/fir/analysis-tests/testData/resolve/problems/secondaryConstructorCfg.dot +++ b/compiler/fir/analysis-tests/testData/resolve/problems/secondaryConstructorCfg.dot @@ -14,60 +14,70 @@ digraph secondaryConstructorCfg_kt { subgraph cluster_1 { color=red - 20 [label="Enter function " style="filled" fillcolor=red]; - 22 [label="Access variable R|/p0|"]; - 23 [label="Delegated constructor call: this(...)"]; - 24 [label="Access variable R|/p1|"]; - 25 [label="Assignment: R|/B.p3|"]; - 21 [label="Exit function " style="filled" fillcolor=red]; + 3 [label="Enter function getter" style="filled" fillcolor=red]; + 4 [label="Exit function getter" style="filled" fillcolor=red]; } - 20 -> {22}; - 22 -> {23}; - 23 -> {24}; - 24 -> {25}; - 25 -> {21}; + 3 -> {4}; subgraph cluster_2 { color=red - 35 [label="Enter class B" style="filled" fillcolor=red]; - subgraph cluster_3 { - color=blue - 16 [label="Enter function setter" style="filled" fillcolor=red]; - 17 [label="Exit function setter" style="filled" fillcolor=red]; - } - subgraph cluster_4 { - color=blue - 14 [label="Enter function getter" style="filled" fillcolor=red]; - 15 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_5 { - color=blue - 8 [label="Enter function getter" style="filled" fillcolor=red]; - 9 [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]; + } + 8 -> {9}; + + subgraph cluster_3 { + color=red + 14 [label="Enter function getter" style="filled" fillcolor=red]; + 15 [label="Exit function getter" style="filled" fillcolor=red]; + } + 14 -> {15}; + + subgraph cluster_4 { + color=red + 16 [label="Enter function setter" style="filled" fillcolor=red]; + 17 [label="Exit function setter" style="filled" fillcolor=red]; + } + 16 -> {17}; + + subgraph cluster_5 { + color=red + 18 [label="Enter function " style="filled" fillcolor=red]; + 20 [label="Access variable R|/p0|"]; + 21 [label="Delegated constructor call: this(...)"]; subgraph cluster_6 { color=blue - 3 [label="Enter function getter" style="filled" fillcolor=red]; - 4 [label="Exit function getter" style="filled" fillcolor=red]; + 22 [label="Enter block"]; + 23 [label="Access variable R|/p1|"]; + 24 [label="Assignment: R|/B.p3|"]; + 25 [label="Exit block"]; } - subgraph cluster_7 { + 19 [label="Exit function " style="filled" fillcolor=red]; + } + 18 -> {20}; + 20 -> {21}; + 21 -> {22}; + 22 -> {23}; + 23 -> {24}; + 24 -> {25}; + 25 -> {19}; + + subgraph cluster_7 { + color=red + 36 [label="Enter class B" style="filled" fillcolor=red]; + subgraph cluster_8 { color=blue 5 [label="Enter property" style="filled" fillcolor=red]; 7 [label="Access variable R|/p0|"]; 6 [label="Exit property" style="filled" fillcolor=red]; } - subgraph cluster_8 { + subgraph cluster_9 { color=blue 10 [label="Enter property" style="filled" fillcolor=red]; 12 [label="Access variable R|/p0|"]; 13 [label="Access variable R|kotlin/String.length|"]; 11 [label="Exit property" style="filled" fillcolor=red]; } - subgraph cluster_9 { - color=blue - 18 [label="Enter property" style="filled" fillcolor=red]; - 19 [label="Exit property" style="filled" fillcolor=red]; - } subgraph cluster_10 { color=blue 26 [label="Enter init block" style="filled" fillcolor=red]; @@ -83,24 +93,18 @@ digraph secondaryConstructorCfg_kt { } 27 [label="Exit init block" style="filled" fillcolor=red]; } - 36 [label="Exit class B" style="filled" fillcolor=red]; + 35 [label="Exit class B" style="filled" fillcolor=red]; } - 35 -> {5} [color=green]; + 36 -> {5} [color=green]; 5 -> {7}; 6 -> {10} [color=green]; 7 -> {6}; - 3 -> {4}; 10 -> {12}; - 11 -> {18} [color=green]; + 11 -> {26} [color=green]; 12 -> {13}; 13 -> {11}; - 8 -> {9}; - 18 -> {19}; - 19 -> {26} [color=green]; - 14 -> {15}; - 16 -> {17}; 26 -> {28}; - 27 -> {36} [color=green]; + 27 -> {35} [color=green]; 28 -> {29}; 29 -> {30}; 30 -> {31}; diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot index 3be4ff9de2e..fa4715502c7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/bangbang.dot @@ -12,19 +12,24 @@ digraph bangbang_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function test_0" style="filled" fillcolor=red]; - 6 [label="Access variable R|/a|"]; - 7 [label="Check not null: R|/a|!!"]; - 8 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 9 [label="Access variable R|/a|"]; - 10 [label="Function call: R|/a|.R|/A.foo|()"]; + subgraph cluster_3 { + color=blue + 6 [label="Enter block"]; + 7 [label="Access variable R|/a|"]; + 8 [label="Check not null: R|/a|!!"]; + 9 [label="Function call: R|/a|!!.R|/A.foo|()"]; + 10 [label="Access variable R|/a|"]; + 11 [label="Function call: R|/a|.R|/A.foo|()"]; + 12 [label="Exit block"]; + } 5 [label="Exit function test_0" style="filled" fillcolor=red]; } 4 -> {6}; @@ -32,324 +37,375 @@ digraph bangbang_kt { 7 -> {8}; 8 -> {9}; 9 -> {10}; - 10 -> {5}; + 10 -> {11}; + 11 -> {12}; + 12 -> {5}; - subgraph cluster_3 { + subgraph cluster_4 { color=red - 11 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_4 { + 13 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_5 { color=blue - 13 [label="Enter when"]; - subgraph cluster_5 { - color=blue - 15 [label="Enter when branch condition "]; - 16 [label="Access variable R|/a|"]; - 17 [label="Check not null: R|/a|!!"]; - 18 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 19 [label="Exit when branch condition"]; - } - 26 [label="Synthetic else branch"]; - 20 [label="Enter when branch result"]; + 15 [label="Enter block"]; subgraph cluster_6 { color=blue - 21 [label="Enter block"]; - 22 [label="Access variable R|/a|"]; - 23 [label="Function call: R|/a|.R|/A.foo|()"]; - 24 [label="Exit block"]; + 16 [label="Enter when"]; + subgraph cluster_7 { + color=blue + 18 [label="Enter when branch condition "]; + 19 [label="Access variable R|/a|"]; + 20 [label="Check not null: R|/a|!!"]; + 21 [label="Function call: R|/a|!!.R|/A.foo|()"]; + 22 [label="Exit when branch condition"]; + } + 29 [label="Synthetic else branch"]; + 23 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 24 [label="Enter block"]; + 25 [label="Access variable R|/a|"]; + 26 [label="Function call: R|/a|.R|/A.foo|()"]; + 27 [label="Exit block"]; + } + 28 [label="Exit when branch result"]; + 17 [label="Exit when"]; } - 25 [label="Exit when branch result"]; - 14 [label="Exit when"]; + 30 [label="Access variable R|/a|"]; + 31 [label="Function call: R|/a|.R|/A.foo|()"]; + 32 [label="Exit block"]; } - 27 [label="Access variable R|/a|"]; - 28 [label="Function call: R|/a|.R|/A.foo|()"]; - 12 [label="Exit function test_1" style="filled" fillcolor=red]; + 14 [label="Exit function test_1" style="filled" fillcolor=red]; } - 11 -> {13}; 13 -> {15}; - 14 -> {27}; 15 -> {16}; - 16 -> {17}; - 17 -> {18}; + 16 -> {18}; + 17 -> {30}; 18 -> {19}; - 19 -> {20 26}; + 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {23}; + 22 -> {23 29}; 23 -> {24}; 24 -> {25}; - 25 -> {14}; - 26 -> {14}; + 25 -> {26}; + 26 -> {27}; 27 -> {28}; - 28 -> {12}; + 28 -> {17}; + 29 -> {17}; + 30 -> {31}; + 31 -> {32}; + 32 -> {14}; - subgraph cluster_7 { + subgraph cluster_9 { color=red - 29 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_8 { + 33 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_10 { color=blue - 31 [label="Enter when"]; - subgraph cluster_9 { - color=blue - 33 [label="Enter when branch condition "]; - subgraph cluster_10 { - color=blue - 35 [label="Enter &&"]; - 36 [label="Access variable R|/a|"]; - 37 [label="Check not null: R|/a|!!"]; - 38 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 39 [label="Exit left part of &&"]; - 40 [label="Enter right part of &&"]; - 41 [label="Access variable R|/b|"]; - 34 [label="Exit &&"]; - } - 42 [label="Exit when branch condition"]; - } - 49 [label="Synthetic else branch"]; - 43 [label="Enter when branch result"]; + 35 [label="Enter block"]; subgraph cluster_11 { color=blue - 44 [label="Enter block"]; - 45 [label="Access variable R|/a|"]; - 46 [label="Function call: R|/a|.R|/A.foo|()"]; - 47 [label="Exit block"]; - } - 48 [label="Exit when branch result"]; - 32 [label="Exit when"]; - } - 50 [label="Access variable R|/a|"]; - 51 [label="Function call: R|/a|.R|/A.foo|()"]; - 30 [label="Exit function test_2" style="filled" fillcolor=red]; - } - 29 -> {31}; - 31 -> {33}; - 32 -> {50}; - 33 -> {35}; - 34 -> {42}; - 35 -> {36}; - 36 -> {37}; - 37 -> {38}; - 38 -> {39}; - 39 -> {34 40}; - 40 -> {41}; - 41 -> {34}; - 42 -> {43 49}; - 43 -> {44}; - 44 -> {45}; - 45 -> {46}; - 46 -> {47}; - 47 -> {48}; - 48 -> {32}; - 49 -> {32}; - 50 -> {51}; - 51 -> {30}; - - subgraph cluster_12 { - color=red - 52 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_13 { - color=blue - 54 [label="Enter when"]; - subgraph cluster_14 { - color=blue - 56 [label="Enter when branch condition "]; - subgraph cluster_15 { + 36 [label="Enter when"]; + subgraph cluster_12 { color=blue - 58 [label="Enter &&"]; - 59 [label="Access variable R|/b|"]; - 60 [label="Exit left part of &&"]; - 61 [label="Enter right part of &&"]; - 62 [label="Access variable R|/a|"]; - 63 [label="Check not null: R|/a|!!"]; - 64 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 57 [label="Exit &&"]; + 38 [label="Enter when branch condition "]; + subgraph cluster_13 { + color=blue + 40 [label="Enter &&"]; + 41 [label="Access variable R|/a|"]; + 42 [label="Check not null: R|/a|!!"]; + 43 [label="Function call: R|/a|!!.R|/A.foo|()"]; + 44 [label="Exit left part of &&"]; + 45 [label="Enter right part of &&"]; + 46 [label="Access variable R|/b|"]; + 39 [label="Exit &&"]; + } + 47 [label="Exit when branch condition"]; } - 65 [label="Exit when branch condition"]; + 54 [label="Synthetic else branch"]; + 48 [label="Enter when branch result"]; + subgraph cluster_14 { + color=blue + 49 [label="Enter block"]; + 50 [label="Access variable R|/a|"]; + 51 [label="Function call: R|/a|.R|/A.foo|()"]; + 52 [label="Exit block"]; + } + 53 [label="Exit when branch result"]; + 37 [label="Exit when"]; } - 72 [label="Synthetic else branch"]; - 66 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 67 [label="Enter block"]; - 68 [label="Access variable R|/a|"]; - 69 [label="Function call: R|/a|.R|/A.foo|()"]; - 70 [label="Exit block"]; - } - 71 [label="Exit when branch result"]; - 55 [label="Exit when"]; + 55 [label="Access variable R|/a|"]; + 56 [label="Function call: R|/a|.R|/A.foo|()"]; + 57 [label="Exit block"]; } - 73 [label="Access variable R|/a|"]; - 74 [label="Function call: R|/a|.#()"]; - 53 [label="Exit function test_3" style="filled" fillcolor=red]; + 34 [label="Exit function test_2" style="filled" fillcolor=red]; } - 52 -> {54}; - 54 -> {56}; - 55 -> {73}; - 56 -> {58}; - 57 -> {65}; - 58 -> {59}; - 59 -> {60}; - 60 -> {57 61}; - 61 -> {62}; - 62 -> {63}; - 63 -> {64}; - 64 -> {57}; - 65 -> {66 72}; + 33 -> {35}; + 35 -> {36}; + 36 -> {38}; + 37 -> {55}; + 38 -> {40}; + 39 -> {47}; + 40 -> {41}; + 41 -> {42}; + 42 -> {43}; + 43 -> {44}; + 44 -> {39 45}; + 45 -> {46}; + 46 -> {39}; + 47 -> {48 54}; + 48 -> {49}; + 49 -> {50}; + 50 -> {51}; + 51 -> {52}; + 52 -> {53}; + 53 -> {37}; + 54 -> {37}; + 55 -> {56}; + 56 -> {57}; + 57 -> {34}; + + subgraph cluster_15 { + color=red + 58 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_16 { + color=blue + 60 [label="Enter block"]; + subgraph cluster_17 { + color=blue + 61 [label="Enter when"]; + subgraph cluster_18 { + color=blue + 63 [label="Enter when branch condition "]; + subgraph cluster_19 { + color=blue + 65 [label="Enter &&"]; + 66 [label="Access variable R|/b|"]; + 67 [label="Exit left part of &&"]; + 68 [label="Enter right part of &&"]; + 69 [label="Access variable R|/a|"]; + 70 [label="Check not null: R|/a|!!"]; + 71 [label="Function call: R|/a|!!.R|/A.foo|()"]; + 64 [label="Exit &&"]; + } + 72 [label="Exit when branch condition"]; + } + 79 [label="Synthetic else branch"]; + 73 [label="Enter when branch result"]; + subgraph cluster_20 { + color=blue + 74 [label="Enter block"]; + 75 [label="Access variable R|/a|"]; + 76 [label="Function call: R|/a|.R|/A.foo|()"]; + 77 [label="Exit block"]; + } + 78 [label="Exit when branch result"]; + 62 [label="Exit when"]; + } + 80 [label="Access variable R|/a|"]; + 81 [label="Function call: R|/a|.#()"]; + 82 [label="Exit block"]; + } + 59 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 58 -> {60}; + 60 -> {61}; + 61 -> {63}; + 62 -> {80}; + 63 -> {65}; + 64 -> {72}; + 65 -> {66}; 66 -> {67}; - 67 -> {68}; + 67 -> {64 68}; 68 -> {69}; 69 -> {70}; 70 -> {71}; - 71 -> {55}; - 72 -> {55}; + 71 -> {64}; + 72 -> {73 79}; 73 -> {74}; - 74 -> {53}; - - subgraph cluster_17 { - color=red - 75 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_18 { - color=blue - 77 [label="Enter when"]; - subgraph cluster_19 { - color=blue - 79 [label="Enter when branch condition "]; - subgraph cluster_20 { - color=blue - 81 [label="Enter ||"]; - 82 [label="Access variable R|/a|"]; - 83 [label="Check not null: R|/a|!!"]; - 84 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 85 [label="Exit left part of ||"]; - 86 [label="Enter right part of ||"]; - 87 [label="Access variable R|/b|"]; - 80 [label="Exit ||"]; - } - 88 [label="Exit when branch condition"]; - } - 95 [label="Synthetic else branch"]; - 89 [label="Enter when branch result"]; - subgraph cluster_21 { - color=blue - 90 [label="Enter block"]; - 91 [label="Access variable R|/a|"]; - 92 [label="Function call: R|/a|.R|/A.foo|()"]; - 93 [label="Exit block"]; - } - 94 [label="Exit when branch result"]; - 78 [label="Exit when"]; - } - 96 [label="Access variable R|/a|"]; - 97 [label="Function call: R|/a|.R|/A.foo|()"]; - 76 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 75 -> {77}; - 77 -> {79}; - 78 -> {96}; - 79 -> {81}; - 80 -> {88}; + 74 -> {75}; + 75 -> {76}; + 76 -> {77}; + 77 -> {78}; + 78 -> {62}; + 79 -> {62}; + 80 -> {81}; 81 -> {82}; - 82 -> {83}; - 83 -> {84}; - 84 -> {85}; - 85 -> {80 86}; - 86 -> {87}; - 87 -> {80}; - 88 -> {89 95}; - 89 -> {90}; + 82 -> {59}; + + subgraph cluster_21 { + color=red + 83 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_22 { + color=blue + 85 [label="Enter block"]; + subgraph cluster_23 { + color=blue + 86 [label="Enter when"]; + subgraph cluster_24 { + color=blue + 88 [label="Enter when branch condition "]; + subgraph cluster_25 { + color=blue + 90 [label="Enter ||"]; + 91 [label="Access variable R|/a|"]; + 92 [label="Check not null: R|/a|!!"]; + 93 [label="Function call: R|/a|!!.R|/A.foo|()"]; + 94 [label="Exit left part of ||"]; + 95 [label="Enter right part of ||"]; + 96 [label="Access variable R|/b|"]; + 89 [label="Exit ||"]; + } + 97 [label="Exit when branch condition"]; + } + 104 [label="Synthetic else branch"]; + 98 [label="Enter when branch result"]; + subgraph cluster_26 { + color=blue + 99 [label="Enter block"]; + 100 [label="Access variable R|/a|"]; + 101 [label="Function call: R|/a|.R|/A.foo|()"]; + 102 [label="Exit block"]; + } + 103 [label="Exit when branch result"]; + 87 [label="Exit when"]; + } + 105 [label="Access variable R|/a|"]; + 106 [label="Function call: R|/a|.R|/A.foo|()"]; + 107 [label="Exit block"]; + } + 84 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 83 -> {85}; + 85 -> {86}; + 86 -> {88}; + 87 -> {105}; + 88 -> {90}; + 89 -> {97}; 90 -> {91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; - 94 -> {78}; - 95 -> {78}; - 96 -> {97}; - 97 -> {76}; - - subgraph cluster_22 { - color=red - 98 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_23 { - color=blue - 100 [label="Enter when"]; - subgraph cluster_24 { - color=blue - 102 [label="Enter when branch condition "]; - subgraph cluster_25 { - color=blue - 104 [label="Enter ||"]; - 105 [label="Access variable R|/b|"]; - 106 [label="Exit left part of ||"]; - 107 [label="Enter right part of ||"]; - 108 [label="Access variable R|/a|"]; - 109 [label="Check not null: R|/a|!!"]; - 110 [label="Function call: R|/a|!!.R|/A.foo|()"]; - 103 [label="Exit ||"]; - } - 111 [label="Exit when branch condition"]; - } - 118 [label="Synthetic else branch"]; - 112 [label="Enter when branch result"]; - subgraph cluster_26 { - color=blue - 113 [label="Enter block"]; - 114 [label="Access variable R|/a|"]; - 115 [label="Function call: R|/a|.#()"]; - 116 [label="Exit block"]; - } - 117 [label="Exit when branch result"]; - 101 [label="Exit when"]; - } - 119 [label="Access variable R|/a|"]; - 120 [label="Function call: R|/a|.#()"]; - 99 [label="Exit function test_5" style="filled" fillcolor=red]; - } - 98 -> {100}; - 100 -> {102}; - 101 -> {119}; - 102 -> {104}; - 103 -> {111}; - 104 -> {105}; + 94 -> {89 95}; + 95 -> {96}; + 96 -> {89}; + 97 -> {98 104}; + 98 -> {99}; + 99 -> {100}; + 100 -> {101}; + 101 -> {102}; + 102 -> {103}; + 103 -> {87}; + 104 -> {87}; 105 -> {106}; - 106 -> {103 107}; - 107 -> {108}; - 108 -> {109}; - 109 -> {110}; - 110 -> {103}; - 111 -> {112 118}; - 112 -> {113}; - 113 -> {114}; - 114 -> {115}; - 115 -> {116}; - 116 -> {117}; - 117 -> {101}; - 118 -> {101}; - 119 -> {120}; - 120 -> {99}; + 106 -> {107}; + 107 -> {84}; subgraph cluster_27 { color=red - 121 [label="Enter function test_6" style="filled" fillcolor=red]; - 123 [label="Access variable R|/x|"]; - 124 [label="Check not null: R|/x|!!"]; - 125 [label="Function call: R|/x|!!.R|/A.foo|()"]; - 122 [label="Exit function test_6" style="filled" fillcolor=red]; + 108 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_28 { + color=blue + 110 [label="Enter block"]; + subgraph cluster_29 { + color=blue + 111 [label="Enter when"]; + subgraph cluster_30 { + color=blue + 113 [label="Enter when branch condition "]; + subgraph cluster_31 { + color=blue + 115 [label="Enter ||"]; + 116 [label="Access variable R|/b|"]; + 117 [label="Exit left part of ||"]; + 118 [label="Enter right part of ||"]; + 119 [label="Access variable R|/a|"]; + 120 [label="Check not null: R|/a|!!"]; + 121 [label="Function call: R|/a|!!.R|/A.foo|()"]; + 114 [label="Exit ||"]; + } + 122 [label="Exit when branch condition"]; + } + 129 [label="Synthetic else branch"]; + 123 [label="Enter when branch result"]; + subgraph cluster_32 { + color=blue + 124 [label="Enter block"]; + 125 [label="Access variable R|/a|"]; + 126 [label="Function call: R|/a|.#()"]; + 127 [label="Exit block"]; + } + 128 [label="Exit when branch result"]; + 112 [label="Exit when"]; + } + 130 [label="Access variable R|/a|"]; + 131 [label="Function call: R|/a|.#()"]; + 132 [label="Exit block"]; + } + 109 [label="Exit function test_5" style="filled" fillcolor=red]; } - 121 -> {123}; + 108 -> {110}; + 110 -> {111}; + 111 -> {113}; + 112 -> {130}; + 113 -> {115}; + 114 -> {122}; + 115 -> {116}; + 116 -> {117}; + 117 -> {114 118}; + 118 -> {119}; + 119 -> {120}; + 120 -> {121}; + 121 -> {114}; + 122 -> {123 129}; 123 -> {124}; 124 -> {125}; - 125 -> {122}; + 125 -> {126}; + 126 -> {127}; + 127 -> {128}; + 128 -> {112}; + 129 -> {112}; + 130 -> {131}; + 131 -> {132}; + 132 -> {109}; - subgraph cluster_28 { + subgraph cluster_33 { color=red - 126 [label="Enter function test_7" style="filled" fillcolor=red]; - 128 [label="Access variable R|/x|"]; - 129 [label="Check not null: R|/x|!!"]; - 130 [label="Function call: R|/x|!!.R|/A.foo|()"]; - 127 [label="Exit function test_7" style="filled" fillcolor=red]; + 133 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_34 { + color=blue + 135 [label="Enter block"]; + 136 [label="Access variable R|/x|"]; + 137 [label="Check not null: R|/x|!!"]; + 138 [label="Function call: R|/x|!!.R|/A.foo|()"]; + 139 [label="Exit block"]; + } + 134 [label="Exit function test_6" style="filled" fillcolor=red]; } - 126 -> {128}; - 128 -> {129}; - 129 -> {130}; - 130 -> {127}; + 133 -> {135}; + 135 -> {136}; + 136 -> {137}; + 137 -> {138}; + 138 -> {139}; + 139 -> {134}; + + subgraph cluster_35 { + color=red + 140 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_36 { + color=blue + 142 [label="Enter block"]; + 143 [label="Access variable R|/x|"]; + 144 [label="Check not null: R|/x|!!"]; + 145 [label="Function call: R|/x|!!.R|/A.foo|()"]; + 146 [label="Exit block"]; + } + 141 [label="Exit function test_7" style="filled" fillcolor=red]; + } + 140 -> {142}; + 142 -> {143}; + 143 -> {144}; + 144 -> {145}; + 145 -> {146}; + 146 -> {141}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot index caedfeedd4a..858e6906493 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/booleanOperators.dot @@ -19,10 +19,10 @@ digraph booleanOperators_kt { subgraph cluster_2 { color=red - 4 [label="Enter class A" style="filled" fillcolor=red]; - 5 [label="Exit class A" style="filled" fillcolor=red]; + 5 [label="Enter class A" style="filled" fillcolor=red]; + 4 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; + 5 -> {4} [color=green]; subgraph cluster_3 { color=red @@ -33,10 +33,10 @@ digraph booleanOperators_kt { subgraph cluster_4 { color=red - 8 [label="Enter class B" style="filled" fillcolor=red]; - 9 [label="Exit class B" style="filled" fillcolor=red]; + 9 [label="Enter class B" style="filled" fillcolor=red]; + 8 [label="Exit class B" style="filled" fillcolor=red]; } - 8 -> {9} [color=green]; + 9 -> {8} [color=green]; subgraph cluster_5 { color=red @@ -47,65 +47,70 @@ digraph booleanOperators_kt { subgraph cluster_6 { color=red - 12 [label="Enter class C" style="filled" fillcolor=red]; - 13 [label="Exit class C" style="filled" fillcolor=red]; + 13 [label="Enter class C" style="filled" fillcolor=red]; + 12 [label="Exit class C" style="filled" fillcolor=red]; } - 12 -> {13} [color=green]; + 13 -> {12} [color=green]; subgraph cluster_7 { color=red 14 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue - 16 [label="Enter when"]; + 16 [label="Enter block"]; subgraph cluster_9 { color=blue - 18 [label="Enter when branch condition "]; + 17 [label="Enter when"]; subgraph cluster_10 { color=blue - 20 [label="Enter &&"]; - 21 [label="Access variable R|/x|"]; - 22 [label="Type operator: (R|/x| is R|B|)"]; - 23 [label="Exit left part of &&"]; - 24 [label="Enter right part of &&"]; - 25 [label="Access variable R|/x|"]; - 26 [label="Type operator: (R|/x| is R|C|)"]; - 19 [label="Exit &&"]; + 19 [label="Enter when branch condition "]; + subgraph cluster_11 { + color=blue + 21 [label="Enter &&"]; + 22 [label="Access variable R|/x|"]; + 23 [label="Type operator: (R|/x| is R|B|)"]; + 24 [label="Exit left part of &&"]; + 25 [label="Enter right part of &&"]; + 26 [label="Access variable R|/x|"]; + 27 [label="Type operator: (R|/x| is R|C|)"]; + 20 [label="Exit &&"]; + } + 28 [label="Exit when branch condition"]; } - 27 [label="Exit when branch condition"]; + 39 [label="Synthetic else branch"]; + 29 [label="Enter when branch result"]; + subgraph cluster_12 { + color=blue + 30 [label="Enter block"]; + 31 [label="Access variable R|/x|"]; + 32 [label="Function call: R|/x|.R|/A.foo|()"]; + 33 [label="Access variable R|/x|"]; + 34 [label="Function call: R|/x|.R|/B.bar|()"]; + 35 [label="Access variable R|/x|"]; + 36 [label="Function call: R|/x|.R|/C.baz|()"]; + 37 [label="Exit block"]; + } + 38 [label="Exit when branch result"]; + 18 [label="Exit when"]; } - 38 [label="Synthetic else branch"]; - 28 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 29 [label="Enter block"]; - 30 [label="Access variable R|/x|"]; - 31 [label="Function call: R|/x|.R|/A.foo|()"]; - 32 [label="Access variable R|/x|"]; - 33 [label="Function call: R|/x|.R|/B.bar|()"]; - 34 [label="Access variable R|/x|"]; - 35 [label="Function call: R|/x|.R|/C.baz|()"]; - 36 [label="Exit block"]; - } - 37 [label="Exit when branch result"]; - 17 [label="Exit when"]; + 40 [label="Exit block"]; } 15 [label="Exit function test_1" style="filled" fillcolor=red]; } 14 -> {16}; - 16 -> {18}; - 17 -> {15}; - 18 -> {20}; - 19 -> {27}; - 20 -> {21}; + 16 -> {17}; + 17 -> {19}; + 18 -> {40}; + 19 -> {21}; + 20 -> {28}; 21 -> {22}; 22 -> {23}; - 23 -> {19 24}; - 24 -> {25}; + 23 -> {24}; + 24 -> {20 25}; 25 -> {26}; - 26 -> {19}; - 27 -> {28 38}; - 28 -> {29}; + 26 -> {27}; + 27 -> {20}; + 28 -> {29 39}; 29 -> {30}; 30 -> {31}; 31 -> {32}; @@ -114,726 +119,819 @@ digraph booleanOperators_kt { 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {17}; - 38 -> {17}; + 37 -> {38}; + 38 -> {18}; + 39 -> {18}; + 40 -> {15}; - subgraph cluster_12 { + subgraph cluster_13 { color=red - 39 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_13 { + 41 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_14 { color=blue - 41 [label="Enter when"]; - subgraph cluster_14 { + 43 [label="Enter block"]; + subgraph cluster_15 { color=blue - 43 [label="Enter when branch condition "]; - subgraph cluster_15 { + 44 [label="Enter when"]; + subgraph cluster_16 { color=blue - 45 [label="Enter ||"]; - 46 [label="Access variable R|/x|"]; - 47 [label="Type operator: (R|/x| is R|B|)"]; - 48 [label="Exit left part of ||"]; - 49 [label="Enter right part of ||"]; - 50 [label="Access variable R|/x|"]; - 51 [label="Type operator: (R|/x| is R|C|)"]; - 44 [label="Exit ||"]; + 46 [label="Enter when branch condition "]; + subgraph cluster_17 { + color=blue + 48 [label="Enter ||"]; + 49 [label="Access variable R|/x|"]; + 50 [label="Type operator: (R|/x| is R|B|)"]; + 51 [label="Exit left part of ||"]; + 52 [label="Enter right part of ||"]; + 53 [label="Access variable R|/x|"]; + 54 [label="Type operator: (R|/x| is R|C|)"]; + 47 [label="Exit ||"]; + } + 55 [label="Exit when branch condition"]; } - 52 [label="Exit when branch condition"]; + 66 [label="Synthetic else branch"]; + 56 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 57 [label="Enter block"]; + 58 [label="Access variable R|/x|"]; + 59 [label="Function call: R|/x|.R|/A.foo|()"]; + 60 [label="Access variable R|/x|"]; + 61 [label="Function call: R|/x|.#()"]; + 62 [label="Access variable R|/x|"]; + 63 [label="Function call: R|/x|.#()"]; + 64 [label="Exit block"]; + } + 65 [label="Exit when branch result"]; + 45 [label="Exit when"]; } - 63 [label="Synthetic else branch"]; - 53 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 54 [label="Enter block"]; - 55 [label="Access variable R|/x|"]; - 56 [label="Function call: R|/x|.R|/A.foo|()"]; - 57 [label="Access variable R|/x|"]; - 58 [label="Function call: R|/x|.#()"]; - 59 [label="Access variable R|/x|"]; - 60 [label="Function call: R|/x|.#()"]; - 61 [label="Exit block"]; - } - 62 [label="Exit when branch result"]; - 42 [label="Exit when"]; + 67 [label="Exit block"]; } - 40 [label="Exit function test_2" style="filled" fillcolor=red]; + 42 [label="Exit function test_2" style="filled" fillcolor=red]; } - 39 -> {41}; 41 -> {43}; - 42 -> {40}; - 43 -> {45}; - 44 -> {52}; - 45 -> {46}; - 46 -> {47}; - 47 -> {48}; - 48 -> {44 49}; + 43 -> {44}; + 44 -> {46}; + 45 -> {67}; + 46 -> {48}; + 47 -> {55}; + 48 -> {49}; 49 -> {50}; 50 -> {51}; - 51 -> {44}; - 52 -> {53 63}; + 51 -> {47 52}; + 52 -> {53}; 53 -> {54}; - 54 -> {55}; - 55 -> {56}; + 54 -> {47}; + 55 -> {56 66}; 56 -> {57}; 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; 61 -> {62}; - 62 -> {42}; - 63 -> {42}; + 62 -> {63}; + 63 -> {64}; + 64 -> {65}; + 65 -> {45}; + 66 -> {45}; + 67 -> {42}; - subgraph cluster_17 { + subgraph cluster_19 { color=red - 64 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_18 { + 68 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_20 { color=blue - 66 [label="Enter when"]; - subgraph cluster_19 { + 70 [label="Enter block"]; + subgraph cluster_21 { color=blue - 68 [label="Enter when branch condition "]; - 69 [label="Access variable R|/x|"]; - 70 [label="Type operator: (R|/x| !is R|A|)"]; - 71 [label="Function call: (R|/x| !is R|A|).R|kotlin/Boolean.not|()"]; - 72 [label="Exit when branch condition"]; + 71 [label="Enter when"]; + subgraph cluster_22 { + color=blue + 73 [label="Enter when branch condition "]; + 74 [label="Access variable R|/x|"]; + 75 [label="Type operator: (R|/x| !is R|A|)"]; + 76 [label="Function call: (R|/x| !is R|A|).R|kotlin/Boolean.not|()"]; + 77 [label="Exit when branch condition"]; + } + 84 [label="Synthetic else branch"]; + 78 [label="Enter when branch result"]; + subgraph cluster_23 { + color=blue + 79 [label="Enter block"]; + 80 [label="Access variable R|/x|"]; + 81 [label="Function call: R|/x|.R|/A.foo|()"]; + 82 [label="Exit block"]; + } + 83 [label="Exit when branch result"]; + 72 [label="Exit when"]; } - 79 [label="Synthetic else branch"]; - 73 [label="Enter when branch result"]; - subgraph cluster_20 { - color=blue - 74 [label="Enter block"]; - 75 [label="Access variable R|/x|"]; - 76 [label="Function call: R|/x|.R|/A.foo|()"]; - 77 [label="Exit block"]; - } - 78 [label="Exit when branch result"]; - 67 [label="Exit when"]; + 85 [label="Exit block"]; } - 65 [label="Exit function test_3" style="filled" fillcolor=red]; + 69 [label="Exit function test_3" style="filled" fillcolor=red]; } - 64 -> {66}; - 66 -> {68}; - 67 -> {65}; - 68 -> {69}; - 69 -> {70}; + 68 -> {70}; 70 -> {71}; - 71 -> {72}; - 72 -> {73 79}; + 71 -> {73}; + 72 -> {85}; 73 -> {74}; 74 -> {75}; 75 -> {76}; 76 -> {77}; - 77 -> {78}; - 78 -> {67}; - 79 -> {67}; + 77 -> {78 84}; + 78 -> {79}; + 79 -> {80}; + 80 -> {81}; + 81 -> {82}; + 82 -> {83}; + 83 -> {72}; + 84 -> {72}; + 85 -> {69}; - subgraph cluster_21 { + subgraph cluster_24 { color=red - 80 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_22 { + 86 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_25 { color=blue - 82 [label="Enter when"]; - subgraph cluster_23 { + 88 [label="Enter block"]; + subgraph cluster_26 { color=blue - 84 [label="Enter when branch condition "]; - subgraph cluster_24 { + 89 [label="Enter when"]; + subgraph cluster_27 { color=blue - 86 [label="Enter ||"]; - 87 [label="Access variable R|/x|"]; - 88 [label="Type operator: (R|/x| !is R|kotlin/String|)"]; - 89 [label="Exit left part of ||"]; - 90 [label="Enter right part of ||"]; - 91 [label="Access variable R|/x|"]; - 92 [label="Access variable R|kotlin/String.length|"]; - 93 [label="Const: Int(0)"]; - 94 [label="Operator =="]; - 85 [label="Exit ||"]; + 91 [label="Enter when branch condition "]; + subgraph cluster_28 { + color=blue + 93 [label="Enter ||"]; + 94 [label="Access variable R|/x|"]; + 95 [label="Type operator: (R|/x| !is R|kotlin/String|)"]; + 96 [label="Exit left part of ||"]; + 97 [label="Enter right part of ||"]; + 98 [label="Access variable R|/x|"]; + 99 [label="Access variable R|kotlin/String.length|"]; + 100 [label="Const: Int(0)"]; + 101 [label="Operator =="]; + 92 [label="Exit ||"]; + } + 102 [label="Exit when branch condition"]; } - 95 [label="Exit when branch condition"]; + 109 [label="Synthetic else branch"]; + 103 [label="Enter when branch result"]; + subgraph cluster_29 { + color=blue + 104 [label="Enter block"]; + 105 [label="Access variable R|/x|"]; + 106 [label="Access variable #"]; + 107 [label="Exit block"]; + } + 108 [label="Exit when branch result"]; + 90 [label="Exit when"]; } - 102 [label="Synthetic else branch"]; - 96 [label="Enter when branch result"]; - subgraph cluster_25 { - color=blue - 97 [label="Enter block"]; - 98 [label="Access variable R|/x|"]; - 99 [label="Access variable #"]; - 100 [label="Exit block"]; - } - 101 [label="Exit when branch result"]; - 83 [label="Exit when"]; + 110 [label="Access variable R|/x|"]; + 111 [label="Access variable #"]; + 112 [label="Exit block"]; } - 103 [label="Access variable R|/x|"]; - 104 [label="Access variable #"]; - 81 [label="Exit function test_4" style="filled" fillcolor=red]; + 87 [label="Exit function test_4" style="filled" fillcolor=red]; } - 80 -> {82}; - 82 -> {84}; - 83 -> {103}; - 84 -> {86}; - 85 -> {95}; - 86 -> {87}; - 87 -> {88}; + 86 -> {88}; 88 -> {89}; - 89 -> {85 90}; - 90 -> {91}; - 91 -> {92}; - 92 -> {93}; + 89 -> {91}; + 90 -> {110}; + 91 -> {93}; + 92 -> {102}; 93 -> {94}; - 94 -> {85}; - 95 -> {96 102}; - 96 -> {97}; + 94 -> {95}; + 95 -> {96}; + 96 -> {92 97}; 97 -> {98}; 98 -> {99}; 99 -> {100}; 100 -> {101}; - 101 -> {83}; - 102 -> {83}; + 101 -> {92}; + 102 -> {103 109}; 103 -> {104}; - 104 -> {81}; - - subgraph cluster_26 { - color=red - 105 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_27 { - color=blue - 107 [label="Enter when"]; - subgraph cluster_28 { - color=blue - 109 [label="Enter when branch condition "]; - subgraph cluster_29 { - color=blue - 111 [label="Enter &&"]; - 112 [label="Access variable R|/x|"]; - 113 [label="Type operator: (R|/x| is R|A|)"]; - 114 [label="Exit left part of &&"]; - 115 [label="Enter right part of &&"]; - 116 [label="Access variable R|/x|"]; - 117 [label="Function call: R|/x|.R|/A.bool|()"]; - 110 [label="Exit &&"]; - } - 118 [label="Exit when branch condition"]; - } - 125 [label="Synthetic else branch"]; - 119 [label="Enter when branch result"]; - subgraph cluster_30 { - color=blue - 120 [label="Enter block"]; - 121 [label="Access variable R|/x|"]; - 122 [label="Function call: R|/x|.R|/A.foo|()"]; - 123 [label="Exit block"]; - } - 124 [label="Exit when branch result"]; - 108 [label="Exit when"]; - } - 106 [label="Exit function test_5" style="filled" fillcolor=red]; - } - 105 -> {107}; - 107 -> {109}; - 108 -> {106}; - 109 -> {111}; - 110 -> {118}; + 104 -> {105}; + 105 -> {106}; + 106 -> {107}; + 107 -> {108}; + 108 -> {90}; + 109 -> {90}; + 110 -> {111}; 111 -> {112}; - 112 -> {113}; - 113 -> {114}; - 114 -> {110 115}; + 112 -> {87}; + + subgraph cluster_30 { + color=red + 113 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_31 { + color=blue + 115 [label="Enter block"]; + subgraph cluster_32 { + color=blue + 116 [label="Enter when"]; + subgraph cluster_33 { + color=blue + 118 [label="Enter when branch condition "]; + subgraph cluster_34 { + color=blue + 120 [label="Enter &&"]; + 121 [label="Access variable R|/x|"]; + 122 [label="Type operator: (R|/x| is R|A|)"]; + 123 [label="Exit left part of &&"]; + 124 [label="Enter right part of &&"]; + 125 [label="Access variable R|/x|"]; + 126 [label="Function call: R|/x|.R|/A.bool|()"]; + 119 [label="Exit &&"]; + } + 127 [label="Exit when branch condition"]; + } + 134 [label="Synthetic else branch"]; + 128 [label="Enter when branch result"]; + subgraph cluster_35 { + color=blue + 129 [label="Enter block"]; + 130 [label="Access variable R|/x|"]; + 131 [label="Function call: R|/x|.R|/A.foo|()"]; + 132 [label="Exit block"]; + } + 133 [label="Exit when branch result"]; + 117 [label="Exit when"]; + } + 135 [label="Exit block"]; + } + 114 [label="Exit function test_5" style="filled" fillcolor=red]; + } + 113 -> {115}; 115 -> {116}; - 116 -> {117}; - 117 -> {110}; - 118 -> {119 125}; - 119 -> {120}; + 116 -> {118}; + 117 -> {135}; + 118 -> {120}; + 119 -> {127}; 120 -> {121}; 121 -> {122}; 122 -> {123}; - 123 -> {124}; - 124 -> {108}; - 125 -> {108}; - - subgraph cluster_31 { - color=red - 126 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_32 { - color=blue - 128 [label="Enter when"]; - subgraph cluster_33 { - color=blue - 130 [label="Enter when branch condition "]; - 131 [label="Access variable R|/x|"]; - 132 [label="Type operator: (R|/x| !is R|A|)"]; - 133 [label="Function call: (R|/x| !is R|A|).R|kotlin/Boolean.not|()"]; - 134 [label="Exit when branch condition"]; - } - 141 [label="Synthetic else branch"]; - 135 [label="Enter when branch result"]; - subgraph cluster_34 { - color=blue - 136 [label="Enter block"]; - 137 [label="Access variable R|/x|"]; - 138 [label="Function call: R|/x|.R|/A.foo|()"]; - 139 [label="Exit block"]; - } - 140 [label="Exit when branch result"]; - 129 [label="Exit when"]; - } - 127 [label="Exit function test_6" style="filled" fillcolor=red]; - } - 126 -> {128}; - 128 -> {130}; - 129 -> {127}; + 123 -> {119 124}; + 124 -> {125}; + 125 -> {126}; + 126 -> {119}; + 127 -> {128 134}; + 128 -> {129}; + 129 -> {130}; 130 -> {131}; 131 -> {132}; 132 -> {133}; - 133 -> {134}; - 134 -> {135 141}; - 135 -> {136}; - 136 -> {137}; - 137 -> {138}; - 138 -> {139}; - 139 -> {140}; - 140 -> {129}; - 141 -> {129}; + 133 -> {117}; + 134 -> {117}; + 135 -> {114}; - subgraph cluster_35 { + subgraph cluster_36 { color=red - 142 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_36 { + 136 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_37 { color=blue - 144 [label="Enter when"]; - subgraph cluster_37 { + 138 [label="Enter block"]; + subgraph cluster_38 { color=blue - 146 [label="Enter when branch condition "]; - subgraph cluster_38 { + 139 [label="Enter when"]; + subgraph cluster_39 { color=blue - 148 [label="Enter ||"]; - 149 [label="Access variable R|/x|"]; - 150 [label="Type operator: (R|/x| is R|A|)"]; - 151 [label="Exit left part of ||"]; - 152 [label="Enter right part of ||"]; - 153 [label="Const: Boolean(false)"]; - 147 [label="Exit ||"]; + 141 [label="Enter when branch condition "]; + 142 [label="Access variable R|/x|"]; + 143 [label="Type operator: (R|/x| !is R|A|)"]; + 144 [label="Function call: (R|/x| !is R|A|).R|kotlin/Boolean.not|()"]; + 145 [label="Exit when branch condition"]; } - 154 [label="Exit when branch condition"]; + 152 [label="Synthetic else branch"]; + 146 [label="Enter when branch result"]; + subgraph cluster_40 { + color=blue + 147 [label="Enter block"]; + 148 [label="Access variable R|/x|"]; + 149 [label="Function call: R|/x|.R|/A.foo|()"]; + 150 [label="Exit block"]; + } + 151 [label="Exit when branch result"]; + 140 [label="Exit when"]; } - 161 [label="Synthetic else branch"]; - 155 [label="Enter when branch result"]; - subgraph cluster_39 { - color=blue - 156 [label="Enter block"]; - 157 [label="Access variable R|/x|"]; - 158 [label="Function call: R|/x|.#()"]; - 159 [label="Exit block"]; - } - 160 [label="Exit when branch result"]; - 145 [label="Exit when"]; + 153 [label="Exit block"]; } - 143 [label="Exit function test_7" style="filled" fillcolor=red]; + 137 [label="Exit function test_6" style="filled" fillcolor=red]; } - 142 -> {144}; - 144 -> {146}; - 145 -> {143}; - 146 -> {148}; - 147 -> {154}; + 136 -> {138}; + 138 -> {139}; + 139 -> {141}; + 140 -> {153}; + 141 -> {142}; + 142 -> {143}; + 143 -> {144}; + 144 -> {145}; + 145 -> {146 152}; + 146 -> {147}; + 147 -> {148}; 148 -> {149}; 149 -> {150}; 150 -> {151}; - 151 -> {147 152}; - 152 -> {153}; - 153 -> {147}; - 154 -> {155 161}; - 155 -> {156}; - 156 -> {157}; - 157 -> {158}; - 158 -> {159}; - 159 -> {160}; - 160 -> {145}; - 161 -> {145}; + 151 -> {140}; + 152 -> {140}; + 153 -> {137}; - subgraph cluster_40 { + subgraph cluster_41 { color=red - 162 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_41 { + 154 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_42 { color=blue - 164 [label="Enter when"]; - subgraph cluster_42 { + 156 [label="Enter block"]; + subgraph cluster_43 { color=blue - 166 [label="Enter when branch condition "]; - subgraph cluster_43 { + 157 [label="Enter when"]; + subgraph cluster_44 { color=blue - 168 [label="Enter ||"]; - 169 [label="Const: Boolean(false)"]; - 170 [label="Exit left part of ||"]; - 171 [label="Enter right part of ||"]; - 172 [label="Access variable R|/x|"]; - 173 [label="Type operator: (R|/x| is R|A|)"]; - 167 [label="Exit ||"]; + 159 [label="Enter when branch condition "]; + subgraph cluster_45 { + color=blue + 161 [label="Enter ||"]; + 162 [label="Access variable R|/x|"]; + 163 [label="Type operator: (R|/x| is R|A|)"]; + 164 [label="Exit left part of ||"]; + 165 [label="Enter right part of ||"]; + 166 [label="Const: Boolean(false)"]; + 160 [label="Exit ||"]; + } + 167 [label="Exit when branch condition"]; } - 174 [label="Exit when branch condition"]; + 174 [label="Synthetic else branch"]; + 168 [label="Enter when branch result"]; + subgraph cluster_46 { + color=blue + 169 [label="Enter block"]; + 170 [label="Access variable R|/x|"]; + 171 [label="Function call: R|/x|.#()"]; + 172 [label="Exit block"]; + } + 173 [label="Exit when branch result"]; + 158 [label="Exit when"]; } - 181 [label="Synthetic else branch"]; - 175 [label="Enter when branch result"]; - subgraph cluster_44 { - color=blue - 176 [label="Enter block"]; - 177 [label="Access variable R|/x|"]; - 178 [label="Function call: R|/x|.#()"]; - 179 [label="Exit block"]; - } - 180 [label="Exit when branch result"]; - 165 [label="Exit when"]; + 175 [label="Exit block"]; } - 163 [label="Exit function test_8" style="filled" fillcolor=red]; + 155 [label="Exit function test_7" style="filled" fillcolor=red]; } - 162 -> {164}; - 164 -> {166}; - 165 -> {163}; - 166 -> {168}; - 167 -> {174}; + 154 -> {156}; + 156 -> {157}; + 157 -> {159}; + 158 -> {175}; + 159 -> {161}; + 160 -> {167}; + 161 -> {162}; + 162 -> {163}; + 163 -> {164}; + 164 -> {160 165}; + 165 -> {166}; + 166 -> {160}; + 167 -> {168 174}; 168 -> {169}; 169 -> {170}; 170 -> {171}; - 170 -> {167} [style=dotted]; 171 -> {172}; 172 -> {173}; - 173 -> {167}; - 174 -> {175 181}; - 175 -> {176}; - 176 -> {177}; - 177 -> {178}; - 178 -> {179}; - 179 -> {180}; - 180 -> {165}; - 181 -> {165}; + 173 -> {158}; + 174 -> {158}; + 175 -> {155}; - subgraph cluster_45 { + subgraph cluster_47 { color=red - 182 [label="Enter function test_9" style="filled" fillcolor=red]; - subgraph cluster_46 { + 176 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_48 { color=blue - 184 [label="Enter when"]; - subgraph cluster_47 { - color=blue - 186 [label="Enter when branch condition "]; - subgraph cluster_48 { - color=blue - 188 [label="Enter ||"]; - 189 [label="Access variable R|/x|"]; - 190 [label="Type operator: (R|/x| is R|A|)"]; - 191 [label="Exit left part of ||"]; - 192 [label="Enter right part of ||"]; - 193 [label="Const: Boolean(true)"]; - 187 [label="Exit ||"]; - } - 194 [label="Exit when branch condition"]; - } - 201 [label="Synthetic else branch"]; - 195 [label="Enter when branch result"]; + 178 [label="Enter block"]; subgraph cluster_49 { color=blue - 196 [label="Enter block"]; - 197 [label="Access variable R|/x|"]; - 198 [label="Function call: R|/x|.#()"]; - 199 [label="Exit block"]; - } - 200 [label="Exit when branch result"]; - 185 [label="Exit when"]; - } - 183 [label="Exit function test_9" style="filled" fillcolor=red]; - } - 182 -> {184}; - 184 -> {186}; - 185 -> {183}; - 186 -> {188}; - 187 -> {194}; - 188 -> {189}; - 189 -> {190}; - 190 -> {191}; - 191 -> {187 192}; - 192 -> {193}; - 193 -> {187}; - 194 -> {195 201}; - 195 -> {196}; - 196 -> {197}; - 197 -> {198}; - 198 -> {199}; - 199 -> {200}; - 200 -> {185}; - 201 -> {185}; - - subgraph cluster_50 { - color=red - 202 [label="Enter function test_10" style="filled" fillcolor=red]; - subgraph cluster_51 { - color=blue - 204 [label="Enter when"]; - subgraph cluster_52 { - color=blue - 206 [label="Enter when branch condition "]; - subgraph cluster_53 { + 179 [label="Enter when"]; + subgraph cluster_50 { color=blue - 208 [label="Enter ||"]; - 209 [label="Const: Boolean(true)"]; - 210 [label="Exit left part of ||"]; - 211 [label="Enter right part of ||" style="filled" fillcolor=gray]; - 212 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 213 [label="Type operator: (R|/x| is R|A|)" style="filled" fillcolor=gray]; - 207 [label="Exit ||"]; + 181 [label="Enter when branch condition "]; + subgraph cluster_51 { + color=blue + 183 [label="Enter ||"]; + 184 [label="Const: Boolean(false)"]; + 185 [label="Exit left part of ||"]; + 186 [label="Enter right part of ||"]; + 187 [label="Access variable R|/x|"]; + 188 [label="Type operator: (R|/x| is R|A|)"]; + 182 [label="Exit ||"]; + } + 189 [label="Exit when branch condition"]; } - 214 [label="Exit when branch condition"]; + 196 [label="Synthetic else branch"]; + 190 [label="Enter when branch result"]; + subgraph cluster_52 { + color=blue + 191 [label="Enter block"]; + 192 [label="Access variable R|/x|"]; + 193 [label="Function call: R|/x|.#()"]; + 194 [label="Exit block"]; + } + 195 [label="Exit when branch result"]; + 180 [label="Exit when"]; } - 221 [label="Synthetic else branch"]; - 215 [label="Enter when branch result"]; - subgraph cluster_54 { - color=blue - 216 [label="Enter block"]; - 217 [label="Access variable R|/x|"]; - 218 [label="Function call: R|/x|.#()"]; - 219 [label="Exit block"]; - } - 220 [label="Exit when branch result"]; - 205 [label="Exit when"]; + 197 [label="Exit block"]; } - 203 [label="Exit function test_10" style="filled" fillcolor=red]; + 177 [label="Exit function test_8" style="filled" fillcolor=red]; } - 202 -> {204}; - 204 -> {206}; - 205 -> {203}; - 206 -> {208}; - 207 -> {214}; - 208 -> {209}; - 209 -> {210}; - 210 -> {207}; - 210 -> {211} [style=dotted]; - 211 -> {212} [style=dotted]; - 212 -> {213} [style=dotted]; - 213 -> {207} [style=dotted]; - 214 -> {215 221}; - 215 -> {216}; - 216 -> {217}; - 217 -> {218}; - 218 -> {219}; - 219 -> {220}; - 220 -> {205}; - 221 -> {205}; + 176 -> {178}; + 178 -> {179}; + 179 -> {181}; + 180 -> {197}; + 181 -> {183}; + 182 -> {189}; + 183 -> {184}; + 184 -> {185}; + 185 -> {186}; + 185 -> {182} [style=dotted]; + 186 -> {187}; + 187 -> {188}; + 188 -> {182}; + 189 -> {190 196}; + 190 -> {191}; + 191 -> {192}; + 192 -> {193}; + 193 -> {194}; + 194 -> {195}; + 195 -> {180}; + 196 -> {180}; + 197 -> {177}; - subgraph cluster_55 { + subgraph cluster_53 { color=red - 222 [label="Enter function test_11" style="filled" fillcolor=red]; - subgraph cluster_56 { + 198 [label="Enter function test_9" style="filled" fillcolor=red]; + subgraph cluster_54 { color=blue - 224 [label="Enter when"]; - subgraph cluster_57 { + 200 [label="Enter block"]; + subgraph cluster_55 { color=blue - 226 [label="Enter when branch condition "]; + 201 [label="Enter when"]; + subgraph cluster_56 { + color=blue + 203 [label="Enter when branch condition "]; + subgraph cluster_57 { + color=blue + 205 [label="Enter ||"]; + 206 [label="Access variable R|/x|"]; + 207 [label="Type operator: (R|/x| is R|A|)"]; + 208 [label="Exit left part of ||"]; + 209 [label="Enter right part of ||"]; + 210 [label="Const: Boolean(true)"]; + 204 [label="Exit ||"]; + } + 211 [label="Exit when branch condition"]; + } + 218 [label="Synthetic else branch"]; + 212 [label="Enter when branch result"]; subgraph cluster_58 { color=blue - 228 [label="Enter &&"]; - 229 [label="Const: Boolean(false)"]; - 230 [label="Exit left part of &&"]; - 231 [label="Enter right part of &&" style="filled" fillcolor=gray]; - 232 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 233 [label="Type operator: (R|/x| is R|A|)" style="filled" fillcolor=gray]; - 227 [label="Exit &&"]; + 213 [label="Enter block"]; + 214 [label="Access variable R|/x|"]; + 215 [label="Function call: R|/x|.#()"]; + 216 [label="Exit block"]; } - 234 [label="Exit when branch condition"]; + 217 [label="Exit when branch result"]; + 202 [label="Exit when"]; } - 241 [label="Synthetic else branch"]; - 235 [label="Enter when branch result"]; - subgraph cluster_59 { - color=blue - 236 [label="Enter block"]; - 237 [label="Access variable R|/x|"]; - 238 [label="Function call: R|/x|.#()"]; - 239 [label="Exit block"]; - } - 240 [label="Exit when branch result"]; - 225 [label="Exit when"]; + 219 [label="Exit block"]; } - 223 [label="Exit function test_11" style="filled" fillcolor=red]; + 199 [label="Exit function test_9" style="filled" fillcolor=red]; } - 222 -> {224}; - 224 -> {226}; - 225 -> {223}; - 226 -> {228}; - 227 -> {234}; + 198 -> {200}; + 200 -> {201}; + 201 -> {203}; + 202 -> {219}; + 203 -> {205}; + 204 -> {211}; + 205 -> {206}; + 206 -> {207}; + 207 -> {208}; + 208 -> {204 209}; + 209 -> {210}; + 210 -> {204}; + 211 -> {212 218}; + 212 -> {213}; + 213 -> {214}; + 214 -> {215}; + 215 -> {216}; + 216 -> {217}; + 217 -> {202}; + 218 -> {202}; + 219 -> {199}; + + subgraph cluster_59 { + color=red + 220 [label="Enter function test_10" style="filled" fillcolor=red]; + subgraph cluster_60 { + color=blue + 222 [label="Enter block"]; + subgraph cluster_61 { + color=blue + 223 [label="Enter when"]; + subgraph cluster_62 { + color=blue + 225 [label="Enter when branch condition "]; + subgraph cluster_63 { + color=blue + 227 [label="Enter ||"]; + 228 [label="Const: Boolean(true)"]; + 229 [label="Exit left part of ||"]; + 230 [label="Enter right part of ||" style="filled" fillcolor=gray]; + 231 [label="Access variable R|/x|" style="filled" fillcolor=gray]; + 232 [label="Type operator: (R|/x| is R|A|)" style="filled" fillcolor=gray]; + 226 [label="Exit ||"]; + } + 233 [label="Exit when branch condition"]; + } + 240 [label="Synthetic else branch"]; + 234 [label="Enter when branch result"]; + subgraph cluster_64 { + color=blue + 235 [label="Enter block"]; + 236 [label="Access variable R|/x|"]; + 237 [label="Function call: R|/x|.#()"]; + 238 [label="Exit block"]; + } + 239 [label="Exit when branch result"]; + 224 [label="Exit when"]; + } + 241 [label="Exit block"]; + } + 221 [label="Exit function test_10" style="filled" fillcolor=red]; + } + 220 -> {222}; + 222 -> {223}; + 223 -> {225}; + 224 -> {241}; + 225 -> {227}; + 226 -> {233}; + 227 -> {228}; 228 -> {229}; - 229 -> {230}; - 230 -> {227}; + 229 -> {226}; + 229 -> {230} [style=dotted]; 230 -> {231} [style=dotted]; 231 -> {232} [style=dotted]; - 232 -> {233} [style=dotted]; - 233 -> {227} [style=dotted]; - 234 -> {235 241}; + 232 -> {226} [style=dotted]; + 233 -> {234 240}; + 234 -> {235}; 235 -> {236}; 236 -> {237}; 237 -> {238}; 238 -> {239}; - 239 -> {240}; - 240 -> {225}; - 241 -> {225}; + 239 -> {224}; + 240 -> {224}; + 241 -> {221}; - subgraph cluster_60 { + subgraph cluster_65 { color=red - 242 [label="Enter function test_12" style="filled" fillcolor=red]; - subgraph cluster_61 { + 242 [label="Enter function test_11" style="filled" fillcolor=red]; + subgraph cluster_66 { color=blue - 244 [label="Enter when"]; - subgraph cluster_62 { + 244 [label="Enter block"]; + subgraph cluster_67 { color=blue - 246 [label="Enter when branch condition "]; - subgraph cluster_63 { + 245 [label="Enter when"]; + subgraph cluster_68 { color=blue - 248 [label="Enter &&"]; - 249 [label="Access variable R|/x|"]; - 250 [label="Type operator: (R|/x| is R|A|)"]; - 251 [label="Exit left part of &&"]; - 252 [label="Enter right part of &&"]; - 253 [label="Const: Boolean(false)"]; - 247 [label="Exit &&"]; + 247 [label="Enter when branch condition "]; + subgraph cluster_69 { + color=blue + 249 [label="Enter &&"]; + 250 [label="Const: Boolean(false)"]; + 251 [label="Exit left part of &&"]; + 252 [label="Enter right part of &&" style="filled" fillcolor=gray]; + 253 [label="Access variable R|/x|" style="filled" fillcolor=gray]; + 254 [label="Type operator: (R|/x| is R|A|)" style="filled" fillcolor=gray]; + 248 [label="Exit &&"]; + } + 255 [label="Exit when branch condition"]; } - 254 [label="Exit when branch condition"]; + 262 [label="Synthetic else branch"]; + 256 [label="Enter when branch result"]; + subgraph cluster_70 { + color=blue + 257 [label="Enter block"]; + 258 [label="Access variable R|/x|"]; + 259 [label="Function call: R|/x|.#()"]; + 260 [label="Exit block"]; + } + 261 [label="Exit when branch result"]; + 246 [label="Exit when"]; } - 261 [label="Synthetic else branch"]; - 255 [label="Enter when branch result"]; - subgraph cluster_64 { - color=blue - 256 [label="Enter block"]; - 257 [label="Access variable R|/x|"]; - 258 [label="Function call: R|/x|.R|/A.foo|()"]; - 259 [label="Exit block"]; - } - 260 [label="Exit when branch result"]; - 245 [label="Exit when"]; + 263 [label="Exit block"]; } - 243 [label="Exit function test_12" style="filled" fillcolor=red]; + 243 [label="Exit function test_11" style="filled" fillcolor=red]; } 242 -> {244}; - 244 -> {246}; - 245 -> {243}; - 246 -> {248}; - 247 -> {254}; - 248 -> {249}; + 244 -> {245}; + 245 -> {247}; + 246 -> {263}; + 247 -> {249}; + 248 -> {255}; 249 -> {250}; 250 -> {251}; - 251 -> {247 252}; - 252 -> {253}; - 253 -> {247}; - 254 -> {255 261}; - 255 -> {256}; + 251 -> {248}; + 251 -> {252} [style=dotted]; + 252 -> {253} [style=dotted]; + 253 -> {254} [style=dotted]; + 254 -> {248} [style=dotted]; + 255 -> {256 262}; 256 -> {257}; 257 -> {258}; 258 -> {259}; 259 -> {260}; - 260 -> {245}; - 261 -> {245}; + 260 -> {261}; + 261 -> {246}; + 262 -> {246}; + 263 -> {243}; - subgraph cluster_65 { + subgraph cluster_71 { color=red - 262 [label="Enter function test_13" style="filled" fillcolor=red]; - subgraph cluster_66 { + 264 [label="Enter function test_12" style="filled" fillcolor=red]; + subgraph cluster_72 { color=blue - 264 [label="Enter when"]; - subgraph cluster_67 { + 266 [label="Enter block"]; + subgraph cluster_73 { color=blue - 266 [label="Enter when branch condition "]; - subgraph cluster_68 { + 267 [label="Enter when"]; + subgraph cluster_74 { color=blue - 268 [label="Enter &&"]; - 269 [label="Const: Boolean(true)"]; - 270 [label="Exit left part of &&"]; - 271 [label="Enter right part of &&"]; - 272 [label="Access variable R|/x|"]; - 273 [label="Type operator: (R|/x| is R|A|)"]; - 267 [label="Exit &&"]; + 269 [label="Enter when branch condition "]; + subgraph cluster_75 { + color=blue + 271 [label="Enter &&"]; + 272 [label="Access variable R|/x|"]; + 273 [label="Type operator: (R|/x| is R|A|)"]; + 274 [label="Exit left part of &&"]; + 275 [label="Enter right part of &&"]; + 276 [label="Const: Boolean(false)"]; + 270 [label="Exit &&"]; + } + 277 [label="Exit when branch condition"]; } - 274 [label="Exit when branch condition"]; + 284 [label="Synthetic else branch"]; + 278 [label="Enter when branch result"]; + subgraph cluster_76 { + color=blue + 279 [label="Enter block"]; + 280 [label="Access variable R|/x|"]; + 281 [label="Function call: R|/x|.R|/A.foo|()"]; + 282 [label="Exit block"]; + } + 283 [label="Exit when branch result"]; + 268 [label="Exit when"]; } - 281 [label="Synthetic else branch"]; - 275 [label="Enter when branch result"]; - subgraph cluster_69 { - color=blue - 276 [label="Enter block"]; - 277 [label="Access variable R|/x|"]; - 278 [label="Function call: R|/x|.R|/A.foo|()"]; - 279 [label="Exit block"]; - } - 280 [label="Exit when branch result"]; - 265 [label="Exit when"]; + 285 [label="Exit block"]; } - 263 [label="Exit function test_13" style="filled" fillcolor=red]; + 265 [label="Exit function test_12" style="filled" fillcolor=red]; } - 262 -> {264}; 264 -> {266}; - 265 -> {263}; - 266 -> {268}; - 267 -> {274}; - 268 -> {269}; - 269 -> {270}; - 270 -> {271}; - 270 -> {267} [style=dotted]; + 266 -> {267}; + 267 -> {269}; + 268 -> {285}; + 269 -> {271}; + 270 -> {277}; 271 -> {272}; 272 -> {273}; - 273 -> {267}; - 274 -> {275 281}; + 273 -> {274}; + 274 -> {270 275}; 275 -> {276}; - 276 -> {277}; - 277 -> {278}; + 276 -> {270}; + 277 -> {278 284}; 278 -> {279}; 279 -> {280}; - 280 -> {265}; - 281 -> {265}; + 280 -> {281}; + 281 -> {282}; + 282 -> {283}; + 283 -> {268}; + 284 -> {268}; + 285 -> {265}; - subgraph cluster_70 { + subgraph cluster_77 { color=red - 282 [label="Enter function test_14" style="filled" fillcolor=red]; - subgraph cluster_71 { + 286 [label="Enter function test_13" style="filled" fillcolor=red]; + subgraph cluster_78 { color=blue - 284 [label="Enter when"]; - subgraph cluster_72 { + 288 [label="Enter block"]; + subgraph cluster_79 { color=blue - 286 [label="Enter when branch condition "]; - subgraph cluster_73 { + 289 [label="Enter when"]; + subgraph cluster_80 { color=blue - 288 [label="Enter &&"]; - 289 [label="Access variable R|/x|"]; - 290 [label="Type operator: (R|/x| is R|A|)"]; - 291 [label="Exit left part of &&"]; - 292 [label="Enter right part of &&"]; - 293 [label="Const: Boolean(false)"]; - 287 [label="Exit &&"]; + 291 [label="Enter when branch condition "]; + subgraph cluster_81 { + color=blue + 293 [label="Enter &&"]; + 294 [label="Const: Boolean(true)"]; + 295 [label="Exit left part of &&"]; + 296 [label="Enter right part of &&"]; + 297 [label="Access variable R|/x|"]; + 298 [label="Type operator: (R|/x| is R|A|)"]; + 292 [label="Exit &&"]; + } + 299 [label="Exit when branch condition"]; } - 294 [label="Exit when branch condition"]; + 306 [label="Synthetic else branch"]; + 300 [label="Enter when branch result"]; + subgraph cluster_82 { + color=blue + 301 [label="Enter block"]; + 302 [label="Access variable R|/x|"]; + 303 [label="Function call: R|/x|.R|/A.foo|()"]; + 304 [label="Exit block"]; + } + 305 [label="Exit when branch result"]; + 290 [label="Exit when"]; } - 301 [label="Synthetic else branch"]; - 295 [label="Enter when branch result"]; - subgraph cluster_74 { - color=blue - 296 [label="Enter block"]; - 297 [label="Access variable R|/x|"]; - 298 [label="Function call: R|/x|.R|/A.foo|()"]; - 299 [label="Exit block"]; - } - 300 [label="Exit when branch result"]; - 285 [label="Exit when"]; + 307 [label="Exit block"]; } - 283 [label="Exit function test_14" style="filled" fillcolor=red]; + 287 [label="Exit function test_13" style="filled" fillcolor=red]; } - 282 -> {284}; - 284 -> {286}; - 285 -> {283}; 286 -> {288}; - 287 -> {294}; 288 -> {289}; - 289 -> {290}; - 290 -> {291}; - 291 -> {287 292}; - 292 -> {293}; - 293 -> {287}; - 294 -> {295 301}; + 289 -> {291}; + 290 -> {307}; + 291 -> {293}; + 292 -> {299}; + 293 -> {294}; + 294 -> {295}; 295 -> {296}; + 295 -> {292} [style=dotted]; 296 -> {297}; 297 -> {298}; - 298 -> {299}; - 299 -> {300}; - 300 -> {285}; - 301 -> {285}; + 298 -> {292}; + 299 -> {300 306}; + 300 -> {301}; + 301 -> {302}; + 302 -> {303}; + 303 -> {304}; + 304 -> {305}; + 305 -> {290}; + 306 -> {290}; + 307 -> {287}; + + subgraph cluster_83 { + color=red + 308 [label="Enter function test_14" style="filled" fillcolor=red]; + subgraph cluster_84 { + color=blue + 310 [label="Enter block"]; + subgraph cluster_85 { + color=blue + 311 [label="Enter when"]; + subgraph cluster_86 { + color=blue + 313 [label="Enter when branch condition "]; + subgraph cluster_87 { + color=blue + 315 [label="Enter &&"]; + 316 [label="Access variable R|/x|"]; + 317 [label="Type operator: (R|/x| is R|A|)"]; + 318 [label="Exit left part of &&"]; + 319 [label="Enter right part of &&"]; + 320 [label="Const: Boolean(false)"]; + 314 [label="Exit &&"]; + } + 321 [label="Exit when branch condition"]; + } + 328 [label="Synthetic else branch"]; + 322 [label="Enter when branch result"]; + subgraph cluster_88 { + color=blue + 323 [label="Enter block"]; + 324 [label="Access variable R|/x|"]; + 325 [label="Function call: R|/x|.R|/A.foo|()"]; + 326 [label="Exit block"]; + } + 327 [label="Exit when branch result"]; + 312 [label="Exit when"]; + } + 329 [label="Exit block"]; + } + 309 [label="Exit function test_14" style="filled" fillcolor=red]; + } + 308 -> {310}; + 310 -> {311}; + 311 -> {313}; + 312 -> {329}; + 313 -> {315}; + 314 -> {321}; + 315 -> {316}; + 316 -> {317}; + 317 -> {318}; + 318 -> {314 319}; + 319 -> {320}; + 320 -> {314}; + 321 -> {322 328}; + 322 -> {323}; + 323 -> {324}; + 324 -> {325}; + 325 -> {326}; + 326 -> {327}; + 327 -> {312}; + 328 -> {312}; + 329 -> {309}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot index a2b5cdc6b1f..46c70dc6f1e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/equalsToBoolean.dot @@ -12,566 +12,616 @@ digraph equalsToBoolean_kt { subgraph cluster_1 { color=red - 6 [label="Enter class A" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 2 [label="Enter function getter" style="filled" fillcolor=red]; - 3 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_3 { - color=blue - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Exit property" style="filled" fillcolor=red]; - } - 7 [label="Exit class A" style="filled" fillcolor=red]; + 2 [label="Enter function getter" style="filled" fillcolor=red]; + 3 [label="Exit function getter" style="filled" fillcolor=red]; } - 6 -> {4} [color=green]; - 4 -> {5}; - 5 -> {7} [color=green]; 2 -> {3}; - subgraph cluster_4 { + subgraph cluster_2 { color=red - 8 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_5 { - color=blue - 10 [label="Enter when"]; - subgraph cluster_6 { - color=blue - 12 [label="Enter when branch condition "]; - 13 [label="Access variable R|/b|"]; - 14 [label="Const: Boolean(true)"]; - 15 [label="Operator =="]; - 16 [label="Const: Boolean(true)"]; - 17 [label="Operator =="]; - 18 [label="Exit when branch condition"]; - } - subgraph cluster_7 { - color=blue - 25 [label="Enter when branch condition else"]; - 26 [label="Exit when branch condition"]; - } - 27 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 28 [label="Enter block"]; - 29 [label="Access variable R|/b|"]; - 30 [label="Function call: R|/b|.#()"]; - 31 [label="Exit block"]; - } - 32 [label="Exit when branch result"]; - 19 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 20 [label="Enter block"]; - 21 [label="Access variable R|/b|"]; - 22 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 23 [label="Exit block"]; - } - 24 [label="Exit when branch result"]; - 11 [label="Exit when"]; - } - 9 [label="Exit function test_1" style="filled" fillcolor=red]; + 5 [label="Enter class A" style="filled" fillcolor=red]; + 4 [label="Exit class A" style="filled" fillcolor=red]; } - 8 -> {10}; - 10 -> {12}; - 11 -> {9}; + 5 -> {4} [color=green]; + + subgraph cluster_3 { + color=red + 6 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_4 { + color=blue + 8 [label="Enter block"]; + subgraph cluster_5 { + color=blue + 9 [label="Enter when"]; + subgraph cluster_6 { + color=blue + 11 [label="Enter when branch condition "]; + 12 [label="Access variable R|/b|"]; + 13 [label="Const: Boolean(true)"]; + 14 [label="Operator =="]; + 15 [label="Const: Boolean(true)"]; + 16 [label="Operator =="]; + 17 [label="Exit when branch condition"]; + } + subgraph cluster_7 { + color=blue + 24 [label="Enter when branch condition else"]; + 25 [label="Exit when branch condition"]; + } + 26 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 27 [label="Enter block"]; + 28 [label="Access variable R|/b|"]; + 29 [label="Function call: R|/b|.#()"]; + 30 [label="Exit block"]; + } + 31 [label="Exit when branch result"]; + 18 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 19 [label="Enter block"]; + 20 [label="Access variable R|/b|"]; + 21 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 22 [label="Exit block"]; + } + 23 [label="Exit when branch result"]; + 10 [label="Exit when"]; + } + 32 [label="Exit block"]; + } + 7 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 6 -> {8}; + 8 -> {9}; + 9 -> {11}; + 10 -> {32}; + 11 -> {12}; 12 -> {13}; 13 -> {14}; 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {18}; - 18 -> {19 25}; + 17 -> {18 24}; + 18 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; 22 -> {23}; - 23 -> {24}; - 24 -> {11}; + 23 -> {10}; + 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; - 31 -> {32}; - 32 -> {11}; + 31 -> {10}; + 32 -> {7}; subgraph cluster_10 { color=red 33 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_11 { color=blue - 35 [label="Enter when"]; + 35 [label="Enter block"]; subgraph cluster_12 { color=blue - 37 [label="Enter when branch condition "]; - 38 [label="Access variable R|/b|"]; - 39 [label="Const: Boolean(true)"]; - 40 [label="Operator =="]; - 41 [label="Const: Boolean(true)"]; - 42 [label="Operator !="]; - 43 [label="Exit when branch condition"]; + 36 [label="Enter when"]; + subgraph cluster_13 { + color=blue + 38 [label="Enter when branch condition "]; + 39 [label="Access variable R|/b|"]; + 40 [label="Const: Boolean(true)"]; + 41 [label="Operator =="]; + 42 [label="Const: Boolean(true)"]; + 43 [label="Operator !="]; + 44 [label="Exit when branch condition"]; + } + subgraph cluster_14 { + color=blue + 51 [label="Enter when branch condition else"]; + 52 [label="Exit when branch condition"]; + } + 53 [label="Enter when branch result"]; + subgraph cluster_15 { + color=blue + 54 [label="Enter block"]; + 55 [label="Access variable R|/b|"]; + 56 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 57 [label="Exit block"]; + } + 58 [label="Exit when branch result"]; + 45 [label="Enter when branch result"]; + subgraph cluster_16 { + color=blue + 46 [label="Enter block"]; + 47 [label="Access variable R|/b|"]; + 48 [label="Function call: R|/b|.#()"]; + 49 [label="Exit block"]; + } + 50 [label="Exit when branch result"]; + 37 [label="Exit when"]; } - subgraph cluster_13 { - color=blue - 50 [label="Enter when branch condition else"]; - 51 [label="Exit when branch condition"]; - } - 52 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 53 [label="Enter block"]; - 54 [label="Access variable R|/b|"]; - 55 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 56 [label="Exit block"]; - } - 57 [label="Exit when branch result"]; - 44 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 45 [label="Enter block"]; - 46 [label="Access variable R|/b|"]; - 47 [label="Function call: R|/b|.#()"]; - 48 [label="Exit block"]; - } - 49 [label="Exit when branch result"]; - 36 [label="Exit when"]; + 59 [label="Exit block"]; } 34 [label="Exit function test_2" style="filled" fillcolor=red]; } 33 -> {35}; - 35 -> {37}; - 36 -> {34}; - 37 -> {38}; + 35 -> {36}; + 36 -> {38}; + 37 -> {59}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; 42 -> {43}; - 43 -> {44 50}; - 44 -> {45}; + 43 -> {44}; + 44 -> {45 51}; 45 -> {46}; 46 -> {47}; 47 -> {48}; 48 -> {49}; - 49 -> {36}; - 50 -> {51}; + 49 -> {50}; + 50 -> {37}; 51 -> {52}; 52 -> {53}; 53 -> {54}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {36}; + 57 -> {58}; + 58 -> {37}; + 59 -> {34}; - subgraph cluster_16 { + subgraph cluster_17 { color=red - 58 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_17 { + 60 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_18 { color=blue - 60 [label="Enter when"]; - subgraph cluster_18 { - color=blue - 62 [label="Enter when branch condition "]; - 63 [label="Access variable R|/b|"]; - 64 [label="Const: Boolean(true)"]; - 65 [label="Operator =="]; - 66 [label="Const: Boolean(false)"]; - 67 [label="Operator =="]; - 68 [label="Exit when branch condition"]; - } + 62 [label="Enter block"]; subgraph cluster_19 { color=blue - 75 [label="Enter when branch condition else"]; - 76 [label="Exit when branch condition"]; + 63 [label="Enter when"]; + subgraph cluster_20 { + color=blue + 65 [label="Enter when branch condition "]; + 66 [label="Access variable R|/b|"]; + 67 [label="Const: Boolean(true)"]; + 68 [label="Operator =="]; + 69 [label="Const: Boolean(false)"]; + 70 [label="Operator =="]; + 71 [label="Exit when branch condition"]; + } + subgraph cluster_21 { + color=blue + 78 [label="Enter when branch condition else"]; + 79 [label="Exit when branch condition"]; + } + 80 [label="Enter when branch result"]; + subgraph cluster_22 { + color=blue + 81 [label="Enter block"]; + 82 [label="Access variable R|/b|"]; + 83 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 84 [label="Exit block"]; + } + 85 [label="Exit when branch result"]; + 72 [label="Enter when branch result"]; + subgraph cluster_23 { + color=blue + 73 [label="Enter block"]; + 74 [label="Access variable R|/b|"]; + 75 [label="Function call: R|/b|.#()"]; + 76 [label="Exit block"]; + } + 77 [label="Exit when branch result"]; + 64 [label="Exit when"]; } - 77 [label="Enter when branch result"]; - subgraph cluster_20 { - color=blue - 78 [label="Enter block"]; - 79 [label="Access variable R|/b|"]; - 80 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 81 [label="Exit block"]; - } - 82 [label="Exit when branch result"]; - 69 [label="Enter when branch result"]; - subgraph cluster_21 { - color=blue - 70 [label="Enter block"]; - 71 [label="Access variable R|/b|"]; - 72 [label="Function call: R|/b|.#()"]; - 73 [label="Exit block"]; - } - 74 [label="Exit when branch result"]; - 61 [label="Exit when"]; + 86 [label="Exit block"]; } - 59 [label="Exit function test_3" style="filled" fillcolor=red]; + 61 [label="Exit function test_3" style="filled" fillcolor=red]; } - 58 -> {60}; 60 -> {62}; - 61 -> {59}; 62 -> {63}; - 63 -> {64}; - 64 -> {65}; + 63 -> {65}; + 64 -> {86}; 65 -> {66}; 66 -> {67}; 67 -> {68}; - 68 -> {69 75}; + 68 -> {69}; 69 -> {70}; 70 -> {71}; - 71 -> {72}; + 71 -> {72 78}; 72 -> {73}; 73 -> {74}; - 74 -> {61}; + 74 -> {75}; 75 -> {76}; 76 -> {77}; - 77 -> {78}; + 77 -> {64}; 78 -> {79}; 79 -> {80}; 80 -> {81}; 81 -> {82}; - 82 -> {61}; + 82 -> {83}; + 83 -> {84}; + 84 -> {85}; + 85 -> {64}; + 86 -> {61}; - subgraph cluster_22 { + subgraph cluster_24 { color=red - 83 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_23 { + 87 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_25 { color=blue - 85 [label="Enter when"]; - subgraph cluster_24 { - color=blue - 87 [label="Enter when branch condition "]; - 88 [label="Access variable R|/b|"]; - 89 [label="Const: Boolean(true)"]; - 90 [label="Operator =="]; - 91 [label="Const: Boolean(false)"]; - 92 [label="Operator !="]; - 93 [label="Exit when branch condition"]; - } - subgraph cluster_25 { - color=blue - 100 [label="Enter when branch condition else"]; - 101 [label="Exit when branch condition"]; - } - 102 [label="Enter when branch result"]; + 89 [label="Enter block"]; subgraph cluster_26 { color=blue - 103 [label="Enter block"]; - 104 [label="Access variable R|/b|"]; - 105 [label="Function call: R|/b|.#()"]; - 106 [label="Exit block"]; + 90 [label="Enter when"]; + subgraph cluster_27 { + color=blue + 92 [label="Enter when branch condition "]; + 93 [label="Access variable R|/b|"]; + 94 [label="Const: Boolean(true)"]; + 95 [label="Operator =="]; + 96 [label="Const: Boolean(false)"]; + 97 [label="Operator !="]; + 98 [label="Exit when branch condition"]; + } + subgraph cluster_28 { + color=blue + 105 [label="Enter when branch condition else"]; + 106 [label="Exit when branch condition"]; + } + 107 [label="Enter when branch result"]; + subgraph cluster_29 { + color=blue + 108 [label="Enter block"]; + 109 [label="Access variable R|/b|"]; + 110 [label="Function call: R|/b|.#()"]; + 111 [label="Exit block"]; + } + 112 [label="Exit when branch result"]; + 99 [label="Enter when branch result"]; + subgraph cluster_30 { + color=blue + 100 [label="Enter block"]; + 101 [label="Access variable R|/b|"]; + 102 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 103 [label="Exit block"]; + } + 104 [label="Exit when branch result"]; + 91 [label="Exit when"]; } - 107 [label="Exit when branch result"]; - 94 [label="Enter when branch result"]; - subgraph cluster_27 { - color=blue - 95 [label="Enter block"]; - 96 [label="Access variable R|/b|"]; - 97 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 98 [label="Exit block"]; - } - 99 [label="Exit when branch result"]; - 86 [label="Exit when"]; + 113 [label="Exit block"]; } - 84 [label="Exit function test_4" style="filled" fillcolor=red]; + 88 [label="Exit function test_4" style="filled" fillcolor=red]; } - 83 -> {85}; - 85 -> {87}; - 86 -> {84}; - 87 -> {88}; - 88 -> {89}; + 87 -> {89}; 89 -> {90}; - 90 -> {91}; - 91 -> {92}; + 90 -> {92}; + 91 -> {113}; 92 -> {93}; - 93 -> {94 100}; + 93 -> {94}; 94 -> {95}; 95 -> {96}; 96 -> {97}; 97 -> {98}; - 98 -> {99}; - 99 -> {86}; + 98 -> {99 105}; + 99 -> {100}; 100 -> {101}; 101 -> {102}; 102 -> {103}; 103 -> {104}; - 104 -> {105}; + 104 -> {91}; 105 -> {106}; 106 -> {107}; - 107 -> {86}; + 107 -> {108}; + 108 -> {109}; + 109 -> {110}; + 110 -> {111}; + 111 -> {112}; + 112 -> {91}; + 113 -> {88}; - subgraph cluster_28 { + subgraph cluster_31 { color=red - 108 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_29 { + 114 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_32 { color=blue - 110 [label="Enter when"]; - subgraph cluster_30 { - color=blue - 112 [label="Enter when branch condition "]; - 113 [label="Access variable R|/b|"]; - 114 [label="Const: Boolean(true)"]; - 115 [label="Operator !="]; - 116 [label="Const: Boolean(true)"]; - 117 [label="Operator =="]; - 118 [label="Exit when branch condition"]; - } - subgraph cluster_31 { - color=blue - 125 [label="Enter when branch condition else"]; - 126 [label="Exit when branch condition"]; - } - 127 [label="Enter when branch result"]; - subgraph cluster_32 { - color=blue - 128 [label="Enter block"]; - 129 [label="Access variable R|/b|"]; - 130 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 131 [label="Exit block"]; - } - 132 [label="Exit when branch result"]; - 119 [label="Enter when branch result"]; + 116 [label="Enter block"]; subgraph cluster_33 { color=blue - 120 [label="Enter block"]; - 121 [label="Access variable R|/b|"]; - 122 [label="Function call: R|/b|.#()"]; - 123 [label="Exit block"]; + 117 [label="Enter when"]; + subgraph cluster_34 { + color=blue + 119 [label="Enter when branch condition "]; + 120 [label="Access variable R|/b|"]; + 121 [label="Const: Boolean(true)"]; + 122 [label="Operator !="]; + 123 [label="Const: Boolean(true)"]; + 124 [label="Operator =="]; + 125 [label="Exit when branch condition"]; + } + subgraph cluster_35 { + color=blue + 132 [label="Enter when branch condition else"]; + 133 [label="Exit when branch condition"]; + } + 134 [label="Enter when branch result"]; + subgraph cluster_36 { + color=blue + 135 [label="Enter block"]; + 136 [label="Access variable R|/b|"]; + 137 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 138 [label="Exit block"]; + } + 139 [label="Exit when branch result"]; + 126 [label="Enter when branch result"]; + subgraph cluster_37 { + color=blue + 127 [label="Enter block"]; + 128 [label="Access variable R|/b|"]; + 129 [label="Function call: R|/b|.#()"]; + 130 [label="Exit block"]; + } + 131 [label="Exit when branch result"]; + 118 [label="Exit when"]; } - 124 [label="Exit when branch result"]; - 111 [label="Exit when"]; + 140 [label="Exit block"]; } - 109 [label="Exit function test_5" style="filled" fillcolor=red]; + 115 [label="Exit function test_5" style="filled" fillcolor=red]; } - 108 -> {110}; - 110 -> {112}; - 111 -> {109}; - 112 -> {113}; - 113 -> {114}; - 114 -> {115}; - 115 -> {116}; + 114 -> {116}; 116 -> {117}; - 117 -> {118}; - 118 -> {119 125}; + 117 -> {119}; + 118 -> {140}; 119 -> {120}; 120 -> {121}; 121 -> {122}; 122 -> {123}; 123 -> {124}; - 124 -> {111}; - 125 -> {126}; + 124 -> {125}; + 125 -> {126 132}; 126 -> {127}; 127 -> {128}; 128 -> {129}; 129 -> {130}; 130 -> {131}; - 131 -> {132}; - 132 -> {111}; - - subgraph cluster_34 { - color=red - 133 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_35 { - color=blue - 135 [label="Enter when"]; - subgraph cluster_36 { - color=blue - 137 [label="Enter when branch condition "]; - 138 [label="Access variable R|/b|"]; - 139 [label="Const: Boolean(true)"]; - 140 [label="Operator !="]; - 141 [label="Const: Boolean(true)"]; - 142 [label="Operator !="]; - 143 [label="Exit when branch condition"]; - } - subgraph cluster_37 { - color=blue - 150 [label="Enter when branch condition else"]; - 151 [label="Exit when branch condition"]; - } - 152 [label="Enter when branch result"]; - subgraph cluster_38 { - color=blue - 153 [label="Enter block"]; - 154 [label="Access variable R|/b|"]; - 155 [label="Function call: R|/b|.#()"]; - 156 [label="Exit block"]; - } - 157 [label="Exit when branch result"]; - 144 [label="Enter when branch result"]; - subgraph cluster_39 { - color=blue - 145 [label="Enter block"]; - 146 [label="Access variable R|/b|"]; - 147 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 148 [label="Exit block"]; - } - 149 [label="Exit when branch result"]; - 136 [label="Exit when"]; - } - 134 [label="Exit function test_6" style="filled" fillcolor=red]; - } - 133 -> {135}; - 135 -> {137}; - 136 -> {134}; + 131 -> {118}; + 132 -> {133}; + 133 -> {134}; + 134 -> {135}; + 135 -> {136}; + 136 -> {137}; 137 -> {138}; 138 -> {139}; - 139 -> {140}; - 140 -> {141}; - 141 -> {142}; - 142 -> {143}; - 143 -> {144 150}; - 144 -> {145}; - 145 -> {146}; + 139 -> {118}; + 140 -> {115}; + + subgraph cluster_38 { + color=red + 141 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_39 { + color=blue + 143 [label="Enter block"]; + subgraph cluster_40 { + color=blue + 144 [label="Enter when"]; + subgraph cluster_41 { + color=blue + 146 [label="Enter when branch condition "]; + 147 [label="Access variable R|/b|"]; + 148 [label="Const: Boolean(true)"]; + 149 [label="Operator !="]; + 150 [label="Const: Boolean(true)"]; + 151 [label="Operator !="]; + 152 [label="Exit when branch condition"]; + } + subgraph cluster_42 { + color=blue + 159 [label="Enter when branch condition else"]; + 160 [label="Exit when branch condition"]; + } + 161 [label="Enter when branch result"]; + subgraph cluster_43 { + color=blue + 162 [label="Enter block"]; + 163 [label="Access variable R|/b|"]; + 164 [label="Function call: R|/b|.#()"]; + 165 [label="Exit block"]; + } + 166 [label="Exit when branch result"]; + 153 [label="Enter when branch result"]; + subgraph cluster_44 { + color=blue + 154 [label="Enter block"]; + 155 [label="Access variable R|/b|"]; + 156 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 157 [label="Exit block"]; + } + 158 [label="Exit when branch result"]; + 145 [label="Exit when"]; + } + 167 [label="Exit block"]; + } + 142 [label="Exit function test_6" style="filled" fillcolor=red]; + } + 141 -> {143}; + 143 -> {144}; + 144 -> {146}; + 145 -> {167}; 146 -> {147}; 147 -> {148}; 148 -> {149}; - 149 -> {136}; + 149 -> {150}; 150 -> {151}; 151 -> {152}; - 152 -> {153}; + 152 -> {153 159}; 153 -> {154}; 154 -> {155}; 155 -> {156}; 156 -> {157}; - 157 -> {136}; - - subgraph cluster_40 { - color=red - 158 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_41 { - color=blue - 160 [label="Enter when"]; - subgraph cluster_42 { - color=blue - 162 [label="Enter when branch condition "]; - 163 [label="Access variable R|/b|"]; - 164 [label="Const: Boolean(true)"]; - 165 [label="Operator !="]; - 166 [label="Const: Boolean(false)"]; - 167 [label="Operator =="]; - 168 [label="Exit when branch condition"]; - } - subgraph cluster_43 { - color=blue - 175 [label="Enter when branch condition else"]; - 176 [label="Exit when branch condition"]; - } - 177 [label="Enter when branch result"]; - subgraph cluster_44 { - color=blue - 178 [label="Enter block"]; - 179 [label="Access variable R|/b|"]; - 180 [label="Function call: R|/b|.#()"]; - 181 [label="Exit block"]; - } - 182 [label="Exit when branch result"]; - 169 [label="Enter when branch result"]; - subgraph cluster_45 { - color=blue - 170 [label="Enter block"]; - 171 [label="Access variable R|/b|"]; - 172 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 173 [label="Exit block"]; - } - 174 [label="Exit when branch result"]; - 161 [label="Exit when"]; - } - 159 [label="Exit function test_7" style="filled" fillcolor=red]; - } - 158 -> {160}; - 160 -> {162}; - 161 -> {159}; + 157 -> {158}; + 158 -> {145}; + 159 -> {160}; + 160 -> {161}; + 161 -> {162}; 162 -> {163}; 163 -> {164}; 164 -> {165}; 165 -> {166}; - 166 -> {167}; - 167 -> {168}; - 168 -> {169 175}; - 169 -> {170}; + 166 -> {145}; + 167 -> {142}; + + subgraph cluster_45 { + color=red + 168 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_46 { + color=blue + 170 [label="Enter block"]; + subgraph cluster_47 { + color=blue + 171 [label="Enter when"]; + subgraph cluster_48 { + color=blue + 173 [label="Enter when branch condition "]; + 174 [label="Access variable R|/b|"]; + 175 [label="Const: Boolean(true)"]; + 176 [label="Operator !="]; + 177 [label="Const: Boolean(false)"]; + 178 [label="Operator =="]; + 179 [label="Exit when branch condition"]; + } + subgraph cluster_49 { + color=blue + 186 [label="Enter when branch condition else"]; + 187 [label="Exit when branch condition"]; + } + 188 [label="Enter when branch result"]; + subgraph cluster_50 { + color=blue + 189 [label="Enter block"]; + 190 [label="Access variable R|/b|"]; + 191 [label="Function call: R|/b|.#()"]; + 192 [label="Exit block"]; + } + 193 [label="Exit when branch result"]; + 180 [label="Enter when branch result"]; + subgraph cluster_51 { + color=blue + 181 [label="Enter block"]; + 182 [label="Access variable R|/b|"]; + 183 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 184 [label="Exit block"]; + } + 185 [label="Exit when branch result"]; + 172 [label="Exit when"]; + } + 194 [label="Exit block"]; + } + 169 [label="Exit function test_7" style="filled" fillcolor=red]; + } + 168 -> {170}; 170 -> {171}; - 171 -> {172}; - 172 -> {173}; + 171 -> {173}; + 172 -> {194}; 173 -> {174}; - 174 -> {161}; + 174 -> {175}; 175 -> {176}; 176 -> {177}; 177 -> {178}; 178 -> {179}; - 179 -> {180}; + 179 -> {180 186}; 180 -> {181}; 181 -> {182}; - 182 -> {161}; - - subgraph cluster_46 { - color=red - 183 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_47 { - color=blue - 185 [label="Enter when"]; - subgraph cluster_48 { - color=blue - 187 [label="Enter when branch condition "]; - 188 [label="Access variable R|/b|"]; - 189 [label="Const: Boolean(true)"]; - 190 [label="Operator !="]; - 191 [label="Const: Boolean(false)"]; - 192 [label="Operator !="]; - 193 [label="Exit when branch condition"]; - } - subgraph cluster_49 { - color=blue - 200 [label="Enter when branch condition else"]; - 201 [label="Exit when branch condition"]; - } - 202 [label="Enter when branch result"]; - subgraph cluster_50 { - color=blue - 203 [label="Enter block"]; - 204 [label="Access variable R|/b|"]; - 205 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 206 [label="Exit block"]; - } - 207 [label="Exit when branch result"]; - 194 [label="Enter when branch result"]; - subgraph cluster_51 { - color=blue - 195 [label="Enter block"]; - 196 [label="Access variable R|/b|"]; - 197 [label="Function call: R|/b|.#()"]; - 198 [label="Exit block"]; - } - 199 [label="Exit when branch result"]; - 186 [label="Exit when"]; - } - 184 [label="Exit function test_8" style="filled" fillcolor=red]; - } - 183 -> {185}; - 185 -> {187}; - 186 -> {184}; + 182 -> {183}; + 183 -> {184}; + 184 -> {185}; + 185 -> {172}; + 186 -> {187}; 187 -> {188}; 188 -> {189}; 189 -> {190}; 190 -> {191}; 191 -> {192}; 192 -> {193}; - 193 -> {194 200}; - 194 -> {195}; - 195 -> {196}; - 196 -> {197}; + 193 -> {172}; + 194 -> {169}; + + subgraph cluster_52 { + color=red + 195 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_53 { + color=blue + 197 [label="Enter block"]; + subgraph cluster_54 { + color=blue + 198 [label="Enter when"]; + subgraph cluster_55 { + color=blue + 200 [label="Enter when branch condition "]; + 201 [label="Access variable R|/b|"]; + 202 [label="Const: Boolean(true)"]; + 203 [label="Operator !="]; + 204 [label="Const: Boolean(false)"]; + 205 [label="Operator !="]; + 206 [label="Exit when branch condition"]; + } + subgraph cluster_56 { + color=blue + 213 [label="Enter when branch condition else"]; + 214 [label="Exit when branch condition"]; + } + 215 [label="Enter when branch result"]; + subgraph cluster_57 { + color=blue + 216 [label="Enter block"]; + 217 [label="Access variable R|/b|"]; + 218 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 219 [label="Exit block"]; + } + 220 [label="Exit when branch result"]; + 207 [label="Enter when branch result"]; + subgraph cluster_58 { + color=blue + 208 [label="Enter block"]; + 209 [label="Access variable R|/b|"]; + 210 [label="Function call: R|/b|.#()"]; + 211 [label="Exit block"]; + } + 212 [label="Exit when branch result"]; + 199 [label="Exit when"]; + } + 221 [label="Exit block"]; + } + 196 [label="Exit function test_8" style="filled" fillcolor=red]; + } + 195 -> {197}; 197 -> {198}; - 198 -> {199}; - 199 -> {186}; + 198 -> {200}; + 199 -> {221}; 200 -> {201}; 201 -> {202}; 202 -> {203}; 203 -> {204}; 204 -> {205}; 205 -> {206}; - 206 -> {207}; - 207 -> {186}; + 206 -> {207 213}; + 207 -> {208}; + 208 -> {209}; + 209 -> {210}; + 210 -> {211}; + 211 -> {212}; + 212 -> {199}; + 213 -> {214}; + 214 -> {215}; + 215 -> {216}; + 216 -> {217}; + 217 -> {218}; + 218 -> {219}; + 219 -> {220}; + 220 -> {199}; + 221 -> {196}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot index ef0bbc63de8..404caa229ea 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/booleans/jumpFromRhsOfOperator.dot @@ -12,413 +12,469 @@ digraph jumpFromRhsOfOperator_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 7 [label="Enter ||"]; - 8 [label="Access variable R|/a|"]; - 9 [label="Const: Null(null)"]; - 10 [label="Operator !="]; - 11 [label="Exit left part of ||"]; - 12 [label="Enter right part of ||"]; - 13 [label="Function call: R|java/lang/Exception.Exception|()"]; - 14 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 15 [label="Stub" style="filled" fillcolor=gray]; - 6 [label="Exit ||"]; + 6 [label="Enter block"]; + subgraph cluster_4 { + color=blue + 8 [label="Enter ||"]; + 9 [label="Access variable R|/a|"]; + 10 [label="Const: Null(null)"]; + 11 [label="Operator !="]; + 12 [label="Exit left part of ||"]; + 13 [label="Enter right part of ||"]; + 14 [label="Function call: R|java/lang/Exception.Exception|()"]; + 15 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 16 [label="Stub" style="filled" fillcolor=gray]; + 7 [label="Exit ||"]; + } + 17 [label="Access variable R|/a|"]; + 18 [label="Function call: R|/a|.R|/A.foo|()"]; + 19 [label="Exit block"]; } - 16 [label="Access variable R|/a|"]; - 17 [label="Function call: R|/a|.R|/A.foo|()"]; 5 [label="Exit function test_1" style="filled" fillcolor=red]; } - 4 -> {7}; - 6 -> {16}; - 7 -> {8}; + 4 -> {6}; + 6 -> {8}; + 7 -> {17}; 8 -> {9}; 9 -> {10}; 10 -> {11}; - 11 -> {6 12}; - 12 -> {13}; + 11 -> {12}; + 12 -> {7 13}; 13 -> {14}; - 14 -> {5}; - 14 -> {15} [style=dotted]; - 15 -> {6} [style=dotted]; - 16 -> {17}; - 17 -> {5}; + 14 -> {15}; + 15 -> {5}; + 15 -> {16} [style=dotted]; + 16 -> {7} [style=dotted]; + 17 -> {18}; + 18 -> {19}; + 19 -> {5}; - subgraph cluster_4 { + subgraph cluster_5 { color=red - 18 [label="Enter function teat_2" style="filled" fillcolor=red]; - subgraph cluster_5 { + 20 [label="Enter function teat_2" style="filled" fillcolor=red]; + subgraph cluster_6 { color=blue - 21 [label="Enter &&"]; - 22 [label="Access variable R|/a|"]; - 23 [label="Const: Null(null)"]; - 24 [label="Operator =="]; - 25 [label="Exit left part of &&"]; - 26 [label="Enter right part of &&"]; - 27 [label="Function call: R|java/lang/Exception.Exception|()"]; - 28 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 29 [label="Stub" style="filled" fillcolor=gray]; - 20 [label="Exit &&"]; + 22 [label="Enter block"]; + subgraph cluster_7 { + color=blue + 24 [label="Enter &&"]; + 25 [label="Access variable R|/a|"]; + 26 [label="Const: Null(null)"]; + 27 [label="Operator =="]; + 28 [label="Exit left part of &&"]; + 29 [label="Enter right part of &&"]; + 30 [label="Function call: R|java/lang/Exception.Exception|()"]; + 31 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 32 [label="Stub" style="filled" fillcolor=gray]; + 23 [label="Exit &&"]; + } + 33 [label="Access variable R|/a|"]; + 34 [label="Function call: R|/a|.R|/A.foo|()"]; + 35 [label="Exit block"]; } - 30 [label="Access variable R|/a|"]; - 31 [label="Function call: R|/a|.R|/A.foo|()"]; - 19 [label="Exit function teat_2" style="filled" fillcolor=red]; + 21 [label="Exit function teat_2" style="filled" fillcolor=red]; } - 18 -> {21}; - 20 -> {30}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24}; + 20 -> {22}; + 22 -> {24}; + 23 -> {33}; 24 -> {25}; - 25 -> {20 26}; + 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {19}; - 28 -> {29} [style=dotted]; - 29 -> {20} [style=dotted]; + 28 -> {23 29}; + 29 -> {30}; 30 -> {31}; - 31 -> {19}; + 31 -> {21}; + 31 -> {32} [style=dotted]; + 32 -> {23} [style=dotted]; + 33 -> {34}; + 34 -> {35}; + 35 -> {21}; - subgraph cluster_6 { + subgraph cluster_8 { color=red - 32 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_7 { + 36 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_9 { color=blue - 34 [label="Enter when"]; - subgraph cluster_8 { - color=blue - 36 [label="Enter when branch condition "]; - subgraph cluster_9 { - color=blue - 38 [label="Enter ||"]; - 39 [label="Access variable R|/a|"]; - 40 [label="Const: Null(null)"]; - 41 [label="Operator !="]; - 42 [label="Exit left part of ||"]; - 43 [label="Enter right part of ||"]; - 44 [label="Function call: R|java/lang/Exception.Exception|()"]; - 45 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 46 [label="Stub" style="filled" fillcolor=gray]; - 37 [label="Exit ||"]; - } - 47 [label="Exit when branch condition"]; - } - 54 [label="Synthetic else branch"]; - 48 [label="Enter when branch result"]; + 38 [label="Enter block"]; subgraph cluster_10 { color=blue - 49 [label="Enter block"]; - 50 [label="Access variable R|/a|"]; - 51 [label="Function call: R|/a|.R|/A.foo|()"]; - 52 [label="Exit block"]; + 39 [label="Enter when"]; + subgraph cluster_11 { + color=blue + 41 [label="Enter when branch condition "]; + subgraph cluster_12 { + color=blue + 43 [label="Enter ||"]; + 44 [label="Access variable R|/a|"]; + 45 [label="Const: Null(null)"]; + 46 [label="Operator !="]; + 47 [label="Exit left part of ||"]; + 48 [label="Enter right part of ||"]; + 49 [label="Function call: R|java/lang/Exception.Exception|()"]; + 50 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 51 [label="Stub" style="filled" fillcolor=gray]; + 42 [label="Exit ||"]; + } + 52 [label="Exit when branch condition"]; + } + 59 [label="Synthetic else branch"]; + 53 [label="Enter when branch result"]; + subgraph cluster_13 { + color=blue + 54 [label="Enter block"]; + 55 [label="Access variable R|/a|"]; + 56 [label="Function call: R|/a|.R|/A.foo|()"]; + 57 [label="Exit block"]; + } + 58 [label="Exit when branch result"]; + 40 [label="Exit when"]; } - 53 [label="Exit when branch result"]; - 35 [label="Exit when"]; + 60 [label="Access variable R|/a|"]; + 61 [label="Function call: R|/a|.R|/A.foo|()"]; + 62 [label="Exit block"]; } - 55 [label="Access variable R|/a|"]; - 56 [label="Function call: R|/a|.R|/A.foo|()"]; - 33 [label="Exit function test_3" style="filled" fillcolor=red]; + 37 [label="Exit function test_3" style="filled" fillcolor=red]; } - 32 -> {34}; - 34 -> {36}; - 35 -> {55}; 36 -> {38}; - 37 -> {47}; 38 -> {39}; - 39 -> {40}; - 40 -> {41}; - 41 -> {42}; - 42 -> {37 43}; + 39 -> {41}; + 40 -> {60}; + 41 -> {43}; + 42 -> {52}; 43 -> {44}; 44 -> {45}; - 45 -> {33}; - 45 -> {46} [style=dotted]; - 46 -> {37} [style=dotted]; - 47 -> {48 54}; + 45 -> {46}; + 46 -> {47}; + 47 -> {42 48}; 48 -> {49}; 49 -> {50}; - 50 -> {51}; - 51 -> {52}; - 52 -> {53}; - 53 -> {35}; - 54 -> {35}; + 50 -> {37}; + 50 -> {51} [style=dotted]; + 51 -> {42} [style=dotted]; + 52 -> {53 59}; + 53 -> {54}; + 54 -> {55}; 55 -> {56}; - 56 -> {33}; + 56 -> {57}; + 57 -> {58}; + 58 -> {40}; + 59 -> {40}; + 60 -> {61}; + 61 -> {62}; + 62 -> {37}; - subgraph cluster_11 { + subgraph cluster_14 { color=red - 57 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_12 { + 63 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_15 { color=blue - 59 [label="Enter when"]; - subgraph cluster_13 { + 65 [label="Enter block"]; + subgraph cluster_16 { color=blue - 61 [label="Enter when branch condition "]; - subgraph cluster_14 { + 66 [label="Enter when"]; + subgraph cluster_17 { color=blue - 63 [label="Enter &&"]; - 64 [label="Access variable R|/a|"]; - 65 [label="Const: Null(null)"]; - 66 [label="Operator =="]; - 67 [label="Exit left part of &&"]; - 68 [label="Enter right part of &&"]; - 69 [label="Function call: R|java/lang/Exception.Exception|()"]; - 70 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 71 [label="Stub" style="filled" fillcolor=gray]; - 62 [label="Exit &&"]; + 68 [label="Enter when branch condition "]; + subgraph cluster_18 { + color=blue + 70 [label="Enter &&"]; + 71 [label="Access variable R|/a|"]; + 72 [label="Const: Null(null)"]; + 73 [label="Operator =="]; + 74 [label="Exit left part of &&"]; + 75 [label="Enter right part of &&"]; + 76 [label="Function call: R|java/lang/Exception.Exception|()"]; + 77 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 78 [label="Stub" style="filled" fillcolor=gray]; + 69 [label="Exit &&"]; + } + 79 [label="Exit when branch condition"]; } - 72 [label="Exit when branch condition"]; + 86 [label="Synthetic else branch"]; + 80 [label="Enter when branch result"]; + subgraph cluster_19 { + color=blue + 81 [label="Enter block"]; + 82 [label="Access variable R|/a|"]; + 83 [label="Function call: R|/a|.R|/A.foo|()"]; + 84 [label="Exit block"]; + } + 85 [label="Exit when branch result"]; + 67 [label="Exit when"]; } - 79 [label="Synthetic else branch"]; - 73 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 74 [label="Enter block"]; - 75 [label="Access variable R|/a|"]; - 76 [label="Function call: R|/a|.R|/A.foo|()"]; - 77 [label="Exit block"]; - } - 78 [label="Exit when branch result"]; - 60 [label="Exit when"]; + 87 [label="Access variable R|/a|"]; + 88 [label="Function call: R|/a|.R|/A.foo|()"]; + 89 [label="Exit block"]; } - 80 [label="Access variable R|/a|"]; - 81 [label="Function call: R|/a|.R|/A.foo|()"]; - 58 [label="Exit function test_4" style="filled" fillcolor=red]; + 64 [label="Exit function test_4" style="filled" fillcolor=red]; } - 57 -> {59}; - 59 -> {61}; - 60 -> {80}; - 61 -> {63}; - 62 -> {72}; - 63 -> {64}; - 64 -> {65}; + 63 -> {65}; 65 -> {66}; - 66 -> {67}; - 67 -> {62 68}; - 68 -> {69}; - 69 -> {70}; - 70 -> {58}; - 70 -> {71} [style=dotted]; - 71 -> {62} [style=dotted]; - 72 -> {73 79}; + 66 -> {68}; + 67 -> {87}; + 68 -> {70}; + 69 -> {79}; + 70 -> {71}; + 71 -> {72}; + 72 -> {73}; 73 -> {74}; - 74 -> {75}; + 74 -> {69 75}; 75 -> {76}; 76 -> {77}; - 77 -> {78}; - 78 -> {60}; - 79 -> {60}; + 77 -> {64}; + 77 -> {78} [style=dotted]; + 78 -> {69} [style=dotted]; + 79 -> {80 86}; 80 -> {81}; - 81 -> {58}; - - subgraph cluster_16 { - color=red - 82 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_17 { - color=blue - 85 [label="Enter ||"]; - 86 [label="Access variable R|/a|"]; - 87 [label="Const: Null(null)"]; - 88 [label="Operator =="]; - 89 [label="Exit left part of ||"]; - 90 [label="Enter right part of ||"]; - 91 [label="Function call: R|java/lang/Exception.Exception|()"]; - 92 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 93 [label="Stub" style="filled" fillcolor=gray]; - 84 [label="Exit ||"]; - } - 94 [label="Access variable R|/a|"]; - 95 [label="Function call: R|/a|.#()"]; - 83 [label="Exit function test_5" style="filled" fillcolor=red]; - } - 82 -> {85}; - 84 -> {94}; - 85 -> {86}; - 86 -> {87}; + 81 -> {82}; + 82 -> {83}; + 83 -> {84}; + 84 -> {85}; + 85 -> {67}; + 86 -> {67}; 87 -> {88}; 88 -> {89}; - 89 -> {84 90}; - 90 -> {91}; - 91 -> {92}; - 92 -> {83}; - 92 -> {93} [style=dotted]; - 93 -> {84} [style=dotted]; - 94 -> {95}; - 95 -> {83}; - - subgraph cluster_18 { - color=red - 96 [label="Enter function teat_6" style="filled" fillcolor=red]; - subgraph cluster_19 { - color=blue - 99 [label="Enter &&"]; - 100 [label="Access variable R|/a|"]; - 101 [label="Const: Null(null)"]; - 102 [label="Operator !="]; - 103 [label="Exit left part of &&"]; - 104 [label="Enter right part of &&"]; - 105 [label="Function call: R|java/lang/Exception.Exception|()"]; - 106 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 107 [label="Stub" style="filled" fillcolor=gray]; - 98 [label="Exit &&"]; - } - 108 [label="Access variable R|/a|"]; - 109 [label="Function call: R|/a|.#()"]; - 97 [label="Exit function teat_6" style="filled" fillcolor=red]; - } - 96 -> {99}; - 98 -> {108}; - 99 -> {100}; - 100 -> {101}; - 101 -> {102}; - 102 -> {103}; - 103 -> {98 104}; - 104 -> {105}; - 105 -> {106}; - 106 -> {97}; - 106 -> {107} [style=dotted]; - 107 -> {98} [style=dotted]; - 108 -> {109}; - 109 -> {97}; + 89 -> {64}; subgraph cluster_20 { color=red - 110 [label="Enter function test_7" style="filled" fillcolor=red]; + 90 [label="Enter function test_5" style="filled" fillcolor=red]; subgraph cluster_21 { color=blue - 112 [label="Enter when"]; + 92 [label="Enter block"]; subgraph cluster_22 { color=blue - 114 [label="Enter when branch condition "]; - subgraph cluster_23 { - color=blue - 116 [label="Enter ||"]; - 117 [label="Access variable R|/a|"]; - 118 [label="Const: Null(null)"]; - 119 [label="Operator =="]; - 120 [label="Exit left part of ||"]; - 121 [label="Enter right part of ||"]; - 122 [label="Function call: R|java/lang/Exception.Exception|()"]; - 123 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 124 [label="Stub" style="filled" fillcolor=gray]; - 115 [label="Exit ||"]; - } - 125 [label="Exit when branch condition"]; + 94 [label="Enter ||"]; + 95 [label="Access variable R|/a|"]; + 96 [label="Const: Null(null)"]; + 97 [label="Operator =="]; + 98 [label="Exit left part of ||"]; + 99 [label="Enter right part of ||"]; + 100 [label="Function call: R|java/lang/Exception.Exception|()"]; + 101 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 102 [label="Stub" style="filled" fillcolor=gray]; + 93 [label="Exit ||"]; } - 132 [label="Synthetic else branch"]; - 126 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 127 [label="Enter block"]; - 128 [label="Access variable R|/a|"]; - 129 [label="Function call: R|/a|.#()"]; - 130 [label="Exit block"]; - } - 131 [label="Exit when branch result"]; - 113 [label="Exit when"]; + 103 [label="Access variable R|/a|"]; + 104 [label="Function call: R|/a|.#()"]; + 105 [label="Exit block"]; } - 133 [label="Access variable R|/a|"]; - 134 [label="Function call: R|/a|.#()"]; - 111 [label="Exit function test_7" style="filled" fillcolor=red]; + 91 [label="Exit function test_5" style="filled" fillcolor=red]; } - 110 -> {112}; - 112 -> {114}; - 113 -> {133}; - 114 -> {116}; - 115 -> {125}; + 90 -> {92}; + 92 -> {94}; + 93 -> {103}; + 94 -> {95}; + 95 -> {96}; + 96 -> {97}; + 97 -> {98}; + 98 -> {93 99}; + 99 -> {100}; + 100 -> {101}; + 101 -> {91}; + 101 -> {102} [style=dotted]; + 102 -> {93} [style=dotted]; + 103 -> {104}; + 104 -> {105}; + 105 -> {91}; + + subgraph cluster_23 { + color=red + 106 [label="Enter function teat_6" style="filled" fillcolor=red]; + subgraph cluster_24 { + color=blue + 108 [label="Enter block"]; + subgraph cluster_25 { + color=blue + 110 [label="Enter &&"]; + 111 [label="Access variable R|/a|"]; + 112 [label="Const: Null(null)"]; + 113 [label="Operator !="]; + 114 [label="Exit left part of &&"]; + 115 [label="Enter right part of &&"]; + 116 [label="Function call: R|java/lang/Exception.Exception|()"]; + 117 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 118 [label="Stub" style="filled" fillcolor=gray]; + 109 [label="Exit &&"]; + } + 119 [label="Access variable R|/a|"]; + 120 [label="Function call: R|/a|.#()"]; + 121 [label="Exit block"]; + } + 107 [label="Exit function teat_6" style="filled" fillcolor=red]; + } + 106 -> {108}; + 108 -> {110}; + 109 -> {119}; + 110 -> {111}; + 111 -> {112}; + 112 -> {113}; + 113 -> {114}; + 114 -> {109 115}; + 115 -> {116}; 116 -> {117}; - 117 -> {118}; - 118 -> {119}; + 117 -> {107}; + 117 -> {118} [style=dotted]; + 118 -> {109} [style=dotted]; 119 -> {120}; - 120 -> {115 121}; - 121 -> {122}; - 122 -> {123}; - 123 -> {111}; - 123 -> {124} [style=dotted]; - 124 -> {115} [style=dotted]; - 125 -> {126 132}; - 126 -> {127}; - 127 -> {128}; - 128 -> {129}; + 120 -> {121}; + 121 -> {107}; + + subgraph cluster_26 { + color=red + 122 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_27 { + color=blue + 124 [label="Enter block"]; + subgraph cluster_28 { + color=blue + 125 [label="Enter when"]; + subgraph cluster_29 { + color=blue + 127 [label="Enter when branch condition "]; + subgraph cluster_30 { + color=blue + 129 [label="Enter ||"]; + 130 [label="Access variable R|/a|"]; + 131 [label="Const: Null(null)"]; + 132 [label="Operator =="]; + 133 [label="Exit left part of ||"]; + 134 [label="Enter right part of ||"]; + 135 [label="Function call: R|java/lang/Exception.Exception|()"]; + 136 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 137 [label="Stub" style="filled" fillcolor=gray]; + 128 [label="Exit ||"]; + } + 138 [label="Exit when branch condition"]; + } + 145 [label="Synthetic else branch"]; + 139 [label="Enter when branch result"]; + subgraph cluster_31 { + color=blue + 140 [label="Enter block"]; + 141 [label="Access variable R|/a|"]; + 142 [label="Function call: R|/a|.#()"]; + 143 [label="Exit block"]; + } + 144 [label="Exit when branch result"]; + 126 [label="Exit when"]; + } + 146 [label="Access variable R|/a|"]; + 147 [label="Function call: R|/a|.#()"]; + 148 [label="Exit block"]; + } + 123 [label="Exit function test_7" style="filled" fillcolor=red]; + } + 122 -> {124}; + 124 -> {125}; + 125 -> {127}; + 126 -> {146}; + 127 -> {129}; + 128 -> {138}; 129 -> {130}; 130 -> {131}; - 131 -> {113}; - 132 -> {113}; - 133 -> {134}; - 134 -> {111}; - - subgraph cluster_25 { - color=red - 135 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_26 { - color=blue - 137 [label="Enter when"]; - subgraph cluster_27 { - color=blue - 139 [label="Enter when branch condition "]; - subgraph cluster_28 { - color=blue - 141 [label="Enter &&"]; - 142 [label="Access variable R|/a|"]; - 143 [label="Const: Null(null)"]; - 144 [label="Operator !="]; - 145 [label="Exit left part of &&"]; - 146 [label="Enter right part of &&"]; - 147 [label="Function call: R|java/lang/Exception.Exception|()"]; - 148 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 149 [label="Stub" style="filled" fillcolor=gray]; - 140 [label="Exit &&"]; - } - 150 [label="Exit when branch condition"]; - } - 157 [label="Synthetic else branch"]; - 151 [label="Enter when branch result"]; - subgraph cluster_29 { - color=blue - 152 [label="Enter block"]; - 153 [label="Access variable R|/a|"]; - 154 [label="Function call: R|/a|.#()"]; - 155 [label="Exit block"]; - } - 156 [label="Exit when branch result"]; - 138 [label="Exit when"]; - } - 158 [label="Access variable R|/a|"]; - 159 [label="Function call: R|/a|.#()"]; - 136 [label="Exit function test_8" style="filled" fillcolor=red]; - } - 135 -> {137}; - 137 -> {139}; - 138 -> {158}; - 139 -> {141}; - 140 -> {150}; + 131 -> {132}; + 132 -> {133}; + 133 -> {128 134}; + 134 -> {135}; + 135 -> {136}; + 136 -> {123}; + 136 -> {137} [style=dotted]; + 137 -> {128} [style=dotted]; + 138 -> {139 145}; + 139 -> {140}; + 140 -> {141}; 141 -> {142}; 142 -> {143}; 143 -> {144}; - 144 -> {145}; - 145 -> {140 146}; + 144 -> {126}; + 145 -> {126}; 146 -> {147}; 147 -> {148}; - 148 -> {136}; - 148 -> {149} [style=dotted]; - 149 -> {140} [style=dotted]; - 150 -> {151 157}; + 148 -> {123}; + + subgraph cluster_32 { + color=red + 149 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_33 { + color=blue + 151 [label="Enter block"]; + subgraph cluster_34 { + color=blue + 152 [label="Enter when"]; + subgraph cluster_35 { + color=blue + 154 [label="Enter when branch condition "]; + subgraph cluster_36 { + color=blue + 156 [label="Enter &&"]; + 157 [label="Access variable R|/a|"]; + 158 [label="Const: Null(null)"]; + 159 [label="Operator !="]; + 160 [label="Exit left part of &&"]; + 161 [label="Enter right part of &&"]; + 162 [label="Function call: R|java/lang/Exception.Exception|()"]; + 163 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 164 [label="Stub" style="filled" fillcolor=gray]; + 155 [label="Exit &&"]; + } + 165 [label="Exit when branch condition"]; + } + 172 [label="Synthetic else branch"]; + 166 [label="Enter when branch result"]; + subgraph cluster_37 { + color=blue + 167 [label="Enter block"]; + 168 [label="Access variable R|/a|"]; + 169 [label="Function call: R|/a|.#()"]; + 170 [label="Exit block"]; + } + 171 [label="Exit when branch result"]; + 153 [label="Exit when"]; + } + 173 [label="Access variable R|/a|"]; + 174 [label="Function call: R|/a|.#()"]; + 175 [label="Exit block"]; + } + 150 [label="Exit function test_8" style="filled" fillcolor=red]; + } + 149 -> {151}; 151 -> {152}; - 152 -> {153}; - 153 -> {154}; - 154 -> {155}; - 155 -> {156}; - 156 -> {138}; - 157 -> {138}; + 152 -> {154}; + 153 -> {173}; + 154 -> {156}; + 155 -> {165}; + 156 -> {157}; + 157 -> {158}; 158 -> {159}; - 159 -> {136}; + 159 -> {160}; + 160 -> {155 161}; + 161 -> {162}; + 162 -> {163}; + 163 -> {150}; + 163 -> {164} [style=dotted]; + 164 -> {155} [style=dotted]; + 165 -> {166 172}; + 166 -> {167}; + 167 -> {168}; + 168 -> {169}; + 169 -> {170}; + 170 -> {171}; + 171 -> {153}; + 172 -> {153}; + 173 -> {174}; + 174 -> {175}; + 175 -> {150}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot index 819c6934173..2ca2cde352e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcasts.dot @@ -12,10 +12,10 @@ digraph boundSmartcasts_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red @@ -26,410 +26,423 @@ digraph boundSmartcasts_kt { subgraph cluster_3 { color=red - 6 [label="Enter class B" style="filled" fillcolor=red]; - 7 [label="Exit class B" style="filled" fillcolor=red]; + 7 [label="Enter class B" style="filled" fillcolor=red]; + 6 [label="Exit class B" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; + 7 -> {6} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function test_1" style="filled" fillcolor=red]; - 10 [label="Access variable R|/x|"]; - 11 [label="Variable declaration: lval y: R|kotlin/Any|"]; subgraph cluster_5 { color=blue - 12 [label="Enter when"]; + 10 [label="Enter block"]; + 11 [label="Access variable R|/x|"]; + 12 [label="Variable declaration: lval y: R|kotlin/Any|"]; subgraph cluster_6 { color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Access variable R|/x|"]; - 16 [label="Type operator: (R|/x| is R|A|)"]; - 17 [label="Exit when branch condition"]; + 13 [label="Enter when"]; + subgraph cluster_7 { + color=blue + 15 [label="Enter when branch condition "]; + 16 [label="Access variable R|/x|"]; + 17 [label="Type operator: (R|/x| is R|A|)"]; + 18 [label="Exit when branch condition"]; + } + 27 [label="Synthetic else branch"]; + 19 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 20 [label="Enter block"]; + 21 [label="Access variable R|/x|"]; + 22 [label="Function call: R|/x|.R|/A.foo|()"]; + 23 [label="Access variable R|/y|"]; + 24 [label="Function call: R|/y|.R|/A.foo|()"]; + 25 [label="Exit block"]; + } + 26 [label="Exit when branch result"]; + 14 [label="Exit when"]; } - 26 [label="Synthetic else branch"]; - 18 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 19 [label="Enter block"]; - 20 [label="Access variable R|/x|"]; - 21 [label="Function call: R|/x|.R|/A.foo|()"]; - 22 [label="Access variable R|/y|"]; - 23 [label="Function call: R|/y|.R|/A.foo|()"]; - 24 [label="Exit block"]; - } - 25 [label="Exit when branch result"]; - 13 [label="Exit when"]; + 28 [label="Exit block"]; } 9 [label="Exit function test_1" style="filled" fillcolor=red]; } 8 -> {10}; 10 -> {11}; 11 -> {12}; - 12 -> {14}; - 13 -> {9}; - 14 -> {15}; + 12 -> {13}; + 13 -> {15}; + 14 -> {28}; 15 -> {16}; 16 -> {17}; - 17 -> {18 26}; - 18 -> {19}; + 17 -> {18}; + 18 -> {19 27}; 19 -> {20}; 20 -> {21}; 21 -> {22}; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {13}; - 26 -> {13}; + 25 -> {26}; + 26 -> {14}; + 27 -> {14}; + 28 -> {9}; - subgraph cluster_8 { + subgraph cluster_9 { color=red - 27 [label="Enter function test_2" style="filled" fillcolor=red]; - 29 [label="Access variable R|/x|"]; - 30 [label="Variable declaration: lval y: R|kotlin/Any|"]; - subgraph cluster_9 { + 29 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_10 { color=blue - 31 [label="Enter when"]; - subgraph cluster_10 { - color=blue - 33 [label="Enter when branch condition "]; - 34 [label="Access variable R|/y|"]; - 35 [label="Type operator: (R|/y| is R|A|)"]; - 36 [label="Exit when branch condition"]; - } - 45 [label="Synthetic else branch"]; - 37 [label="Enter when branch result"]; + 31 [label="Enter block"]; + 32 [label="Access variable R|/x|"]; + 33 [label="Variable declaration: lval y: R|kotlin/Any|"]; subgraph cluster_11 { color=blue - 38 [label="Enter block"]; - 39 [label="Access variable R|/x|"]; - 40 [label="Function call: R|/x|.R|/A.foo|()"]; - 41 [label="Access variable R|/y|"]; - 42 [label="Function call: R|/y|.R|/A.foo|()"]; - 43 [label="Exit block"]; + 34 [label="Enter when"]; + subgraph cluster_12 { + color=blue + 36 [label="Enter when branch condition "]; + 37 [label="Access variable R|/y|"]; + 38 [label="Type operator: (R|/y| is R|A|)"]; + 39 [label="Exit when branch condition"]; + } + 48 [label="Synthetic else branch"]; + 40 [label="Enter when branch result"]; + subgraph cluster_13 { + color=blue + 41 [label="Enter block"]; + 42 [label="Access variable R|/x|"]; + 43 [label="Function call: R|/x|.R|/A.foo|()"]; + 44 [label="Access variable R|/y|"]; + 45 [label="Function call: R|/y|.R|/A.foo|()"]; + 46 [label="Exit block"]; + } + 47 [label="Exit when branch result"]; + 35 [label="Exit when"]; } - 44 [label="Exit when branch result"]; - 32 [label="Exit when"]; + 49 [label="Exit block"]; } - 28 [label="Exit function test_2" style="filled" fillcolor=red]; + 30 [label="Exit function test_2" style="filled" fillcolor=red]; } - 27 -> {29}; - 29 -> {30}; - 30 -> {31}; - 31 -> {33}; - 32 -> {28}; + 29 -> {31}; + 31 -> {32}; + 32 -> {33}; 33 -> {34}; - 34 -> {35}; - 35 -> {36}; - 36 -> {37 45}; + 34 -> {36}; + 35 -> {49}; + 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {40}; + 39 -> {40 48}; 40 -> {41}; 41 -> {42}; 42 -> {43}; 43 -> {44}; - 44 -> {32}; - 45 -> {32}; + 44 -> {45}; + 45 -> {46}; + 46 -> {47}; + 47 -> {35}; + 48 -> {35}; + 49 -> {30}; - subgraph cluster_12 { + subgraph cluster_14 { color=red - 46 [label="Enter function test_3" style="filled" fillcolor=red]; - 48 [label="Access variable R|/x|"]; - 49 [label="Variable declaration: lvar z: R|kotlin/Any|"]; - subgraph cluster_13 { + 50 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_15 { color=blue - 50 [label="Enter when"]; - subgraph cluster_14 { + 52 [label="Enter block"]; + 53 [label="Access variable R|/x|"]; + 54 [label="Variable declaration: lvar z: R|kotlin/Any|"]; + subgraph cluster_16 { color=blue - 52 [label="Enter when branch condition "]; - 53 [label="Access variable R|/x|"]; - 54 [label="Type operator: (R|/x| is R|A|)"]; - 55 [label="Exit when branch condition"]; + 55 [label="Enter when"]; + subgraph cluster_17 { + color=blue + 57 [label="Enter when branch condition "]; + 58 [label="Access variable R|/x|"]; + 59 [label="Type operator: (R|/x| is R|A|)"]; + 60 [label="Exit when branch condition"]; + } + 67 [label="Synthetic else branch"]; + 61 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 62 [label="Enter block"]; + 63 [label="Access variable R|/z|"]; + 64 [label="Function call: R|/z|.R|/A.foo|()"]; + 65 [label="Exit block"]; + } + 66 [label="Exit when branch result"]; + 56 [label="Exit when"]; } - 62 [label="Synthetic else branch"]; - 56 [label="Enter when branch result"]; - subgraph cluster_15 { + 68 [label="Access variable R|/y|"]; + 69 [label="Assignment: R|/z|"]; + subgraph cluster_19 { color=blue - 57 [label="Enter block"]; - 58 [label="Access variable R|/z|"]; - 59 [label="Function call: R|/z|.R|/A.foo|()"]; - 60 [label="Exit block"]; + 70 [label="Enter when"]; + subgraph cluster_20 { + color=blue + 72 [label="Enter when branch condition "]; + 73 [label="Access variable R|/y|"]; + 74 [label="Type operator: (R|/y| is R|B|)"]; + 75 [label="Exit when branch condition"]; + } + 84 [label="Synthetic else branch"]; + 76 [label="Enter when branch result"]; + subgraph cluster_21 { + color=blue + 77 [label="Enter block"]; + 78 [label="Access variable R|/z|"]; + 79 [label="Function call: R|/z|.#()"]; + 80 [label="Access variable R|/z|"]; + 81 [label="Function call: R|/z|.R|/B.bar|()"]; + 82 [label="Exit block"]; + } + 83 [label="Exit when branch result"]; + 71 [label="Exit when"]; } - 61 [label="Exit when branch result"]; - 51 [label="Exit when"]; + 85 [label="Exit block"]; } - 63 [label="Access variable R|/y|"]; - 64 [label="Assignment: R|/z|"]; - subgraph cluster_16 { - color=blue - 65 [label="Enter when"]; - subgraph cluster_17 { - color=blue - 67 [label="Enter when branch condition "]; - 68 [label="Access variable R|/y|"]; - 69 [label="Type operator: (R|/y| is R|B|)"]; - 70 [label="Exit when branch condition"]; - } - 79 [label="Synthetic else branch"]; - 71 [label="Enter when branch result"]; - subgraph cluster_18 { - color=blue - 72 [label="Enter block"]; - 73 [label="Access variable R|/z|"]; - 74 [label="Function call: R|/z|.#()"]; - 75 [label="Access variable R|/z|"]; - 76 [label="Function call: R|/z|.R|/B.bar|()"]; - 77 [label="Exit block"]; - } - 78 [label="Exit when branch result"]; - 66 [label="Exit when"]; - } - 47 [label="Exit function test_3" style="filled" fillcolor=red]; + 51 [label="Exit function test_3" style="filled" fillcolor=red]; } - 46 -> {48}; - 48 -> {49}; - 49 -> {50}; 50 -> {52}; - 51 -> {63}; 52 -> {53}; 53 -> {54}; 54 -> {55}; - 55 -> {56 62}; - 56 -> {57}; + 55 -> {57}; + 56 -> {68}; 57 -> {58}; 58 -> {59}; 59 -> {60}; - 60 -> {61}; - 61 -> {51}; - 62 -> {51}; + 60 -> {61 67}; + 61 -> {62}; + 62 -> {63}; 63 -> {64}; 64 -> {65}; - 65 -> {67}; - 66 -> {47}; - 67 -> {68}; + 65 -> {66}; + 66 -> {56}; + 67 -> {56}; 68 -> {69}; 69 -> {70}; - 70 -> {71 79}; - 71 -> {72}; + 70 -> {72}; + 71 -> {85}; 72 -> {73}; 73 -> {74}; 74 -> {75}; - 75 -> {76}; + 75 -> {76 84}; 76 -> {77}; 77 -> {78}; - 78 -> {66}; - 79 -> {66}; - - subgraph cluster_19 { - color=red - 80 [label="Enter function test_4" style="filled" fillcolor=red]; - 82 [label="Const: Int(1)"]; - 83 [label="Variable declaration: lvar x: R|kotlin/Any|"]; - 84 [label="Access variable R|/x|"]; - 85 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - 86 [label="Access variable R|/x|"]; - 87 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 88 [label="Access variable R|/y|"]; - 89 [label="Assignment: R|/x|"]; - 90 [label="Access variable R|/x|"]; - 91 [label="Function call: R|/x|.#()"]; - subgraph cluster_20 { - color=blue - 92 [label="Enter when"]; - subgraph cluster_21 { - color=blue - 94 [label="Enter when branch condition "]; - 95 [label="Access variable R|/y|"]; - 96 [label="Type operator: (R|/y| is R|A|)"]; - 97 [label="Exit when branch condition"]; - } - 106 [label="Synthetic else branch"]; - 98 [label="Enter when branch result"]; - subgraph cluster_22 { - color=blue - 99 [label="Enter block"]; - 100 [label="Access variable R|/x|"]; - 101 [label="Function call: R|/x|.R|/A.foo|()"]; - 102 [label="Access variable R|/y|"]; - 103 [label="Function call: R|/y|.R|/A.foo|()"]; - 104 [label="Exit block"]; - } - 105 [label="Exit when branch result"]; - 93 [label="Exit when"]; - } - 81 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 80 -> {82}; + 78 -> {79}; + 79 -> {80}; + 80 -> {81}; + 81 -> {82}; 82 -> {83}; - 83 -> {84}; - 84 -> {85}; - 85 -> {86}; - 86 -> {87}; - 87 -> {88}; + 83 -> {71}; + 84 -> {71}; + 85 -> {51}; + + subgraph cluster_22 { + color=red + 86 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_23 { + color=blue + 88 [label="Enter block"]; + 89 [label="Const: Int(1)"]; + 90 [label="Variable declaration: lvar x: R|kotlin/Any|"]; + 91 [label="Access variable R|/x|"]; + 92 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + 93 [label="Access variable R|/x|"]; + 94 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 95 [label="Access variable R|/y|"]; + 96 [label="Assignment: R|/x|"]; + 97 [label="Access variable R|/x|"]; + 98 [label="Function call: R|/x|.#()"]; + subgraph cluster_24 { + color=blue + 99 [label="Enter when"]; + subgraph cluster_25 { + color=blue + 101 [label="Enter when branch condition "]; + 102 [label="Access variable R|/y|"]; + 103 [label="Type operator: (R|/y| is R|A|)"]; + 104 [label="Exit when branch condition"]; + } + 113 [label="Synthetic else branch"]; + 105 [label="Enter when branch result"]; + subgraph cluster_26 { + color=blue + 106 [label="Enter block"]; + 107 [label="Access variable R|/x|"]; + 108 [label="Function call: R|/x|.R|/A.foo|()"]; + 109 [label="Access variable R|/y|"]; + 110 [label="Function call: R|/y|.R|/A.foo|()"]; + 111 [label="Exit block"]; + } + 112 [label="Exit when branch result"]; + 100 [label="Exit when"]; + } + 114 [label="Exit block"]; + } + 87 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 86 -> {88}; 88 -> {89}; 89 -> {90}; 90 -> {91}; 91 -> {92}; - 92 -> {94}; - 93 -> {81}; + 92 -> {93}; + 93 -> {94}; 94 -> {95}; 95 -> {96}; 96 -> {97}; - 97 -> {98 106}; + 97 -> {98}; 98 -> {99}; - 99 -> {100}; - 100 -> {101}; + 99 -> {101}; + 100 -> {114}; 101 -> {102}; 102 -> {103}; 103 -> {104}; - 104 -> {105}; - 105 -> {93}; - 106 -> {93}; - - subgraph cluster_23 { - color=red - 107 [label="Enter function " style="filled" fillcolor=red]; - 109 [label="Delegated constructor call: super()"]; - 108 [label="Exit function " style="filled" fillcolor=red]; - } - 107 -> {109}; - 109 -> {108}; - - subgraph cluster_24 { - color=red - 115 [label="Enter class D" style="filled" fillcolor=red]; - subgraph cluster_25 { - color=blue - 110 [label="Enter function getter" style="filled" fillcolor=red]; - 111 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_26 { - color=blue - 112 [label="Enter property" style="filled" fillcolor=red]; - 114 [label="Access variable R|/any|"]; - 113 [label="Exit property" style="filled" fillcolor=red]; - } - 116 [label="Exit class D" style="filled" fillcolor=red]; - } - 115 -> {112} [color=green]; - 112 -> {114}; - 113 -> {116} [color=green]; - 114 -> {113}; + 104 -> {105 113}; + 105 -> {106}; + 106 -> {107}; + 107 -> {108}; + 108 -> {109}; + 109 -> {110}; 110 -> {111}; + 111 -> {112}; + 112 -> {100}; + 113 -> {100}; + 114 -> {87}; subgraph cluster_27 { color=red - 117 [label="Enter function baz" style="filled" fillcolor=red]; - 118 [label="Exit function baz" style="filled" fillcolor=red]; + 115 [label="Enter function " style="filled" fillcolor=red]; + 117 [label="Delegated constructor call: super()"]; + 116 [label="Exit function " style="filled" fillcolor=red]; } - 117 -> {118}; + 115 -> {117}; + 117 -> {116}; subgraph cluster_28 { color=red - 119 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_29 { - color=blue - 121 [label="Enter when"]; - 123 [label="Access variable R|/d|"]; - 124 [label="Access variable R|/D.any|"]; - 125 [label="Variable declaration: lval : R|kotlin/Any?|"]; - subgraph cluster_30 { - color=blue - 126 [label="Enter when branch condition "]; - 127 [label="Const: Null(null)"]; - 128 [label="Operator =="]; - 129 [label="Exit when branch condition"]; - } - subgraph cluster_31 { - color=blue - 136 [label="Enter when branch condition else"]; - 137 [label="Exit when branch condition"]; - } - 138 [label="Enter when branch result"]; - subgraph cluster_32 { - color=blue - 139 [label="Enter block"]; - 140 [label="Access variable R|/|"]; - 141 [label="Exit block"]; - } - 142 [label="Exit when branch result"]; - 130 [label="Enter when branch result"]; - subgraph cluster_33 { - color=blue - 131 [label="Enter block"]; - 132 [label="Jump: ^test_5 Unit"]; - 133 [label="Stub" style="filled" fillcolor=gray]; - 134 [label="Exit block" style="filled" fillcolor=gray]; - } - 135 [label="Exit when branch result" style="filled" fillcolor=gray]; - 122 [label="Exit when"]; - } - 143 [label="Variable declaration: lval a: R|kotlin/Any|"]; - 144 [label="Access variable R|/a|"]; - 145 [label="Function call: R|/a|.R|/baz|()"]; - 146 [label="Access variable R|/d|"]; - 147 [label="Access variable R|/D.any|"]; - 148 [label="Function call: R|/d|.R|/D.any|.R|/baz|()"]; - 149 [label="Access variable R|/a|"]; - 150 [label="Type operator: (R|/a| as R|A|)"]; - 151 [label="Access variable R|/a|"]; - 152 [label="Function call: R|/a|.R|/A.foo|()"]; - 120 [label="Exit function test_5" style="filled" fillcolor=red]; + 118 [label="Enter function getter" style="filled" fillcolor=red]; + 119 [label="Exit function getter" style="filled" fillcolor=red]; } - 119 -> {121}; - 121 -> {123}; - 122 -> {143}; - 123 -> {124}; - 124 -> {125}; - 125 -> {126}; - 126 -> {127}; + 118 -> {119}; + + subgraph cluster_29 { + color=red + 124 [label="Enter class D" style="filled" fillcolor=red]; + subgraph cluster_30 { + color=blue + 120 [label="Enter property" style="filled" fillcolor=red]; + 122 [label="Access variable R|/any|"]; + 121 [label="Exit property" style="filled" fillcolor=red]; + } + 123 [label="Exit class D" style="filled" fillcolor=red]; + } + 124 -> {120} [color=green]; + 120 -> {122}; + 121 -> {123} [color=green]; + 122 -> {121}; + + subgraph cluster_31 { + color=red + 125 [label="Enter function baz" style="filled" fillcolor=red]; + subgraph cluster_32 { + color=blue + 127 [label="Enter block"]; + 128 [label="Exit block"]; + } + 126 [label="Exit function baz" style="filled" fillcolor=red]; + } + 125 -> {127}; 127 -> {128}; - 128 -> {129}; - 129 -> {130 136}; - 130 -> {131}; + 128 -> {126}; + + subgraph cluster_33 { + color=red + 129 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_34 { + color=blue + 131 [label="Enter block"]; + subgraph cluster_35 { + color=blue + 132 [label="Enter when"]; + 134 [label="Access variable R|/d|"]; + 135 [label="Access variable R|/D.any|"]; + 136 [label="Variable declaration: lval : R|kotlin/Any?|"]; + subgraph cluster_36 { + color=blue + 137 [label="Enter when branch condition "]; + 138 [label="Const: Null(null)"]; + 139 [label="Operator =="]; + 140 [label="Exit when branch condition"]; + } + subgraph cluster_37 { + color=blue + 147 [label="Enter when branch condition else"]; + 148 [label="Exit when branch condition"]; + } + 149 [label="Enter when branch result"]; + subgraph cluster_38 { + color=blue + 150 [label="Enter block"]; + 151 [label="Access variable R|/|"]; + 152 [label="Exit block"]; + } + 153 [label="Exit when branch result"]; + 141 [label="Enter when branch result"]; + subgraph cluster_39 { + color=blue + 142 [label="Enter block"]; + 143 [label="Jump: ^test_5 Unit"]; + 144 [label="Stub" style="filled" fillcolor=gray]; + 145 [label="Exit block" style="filled" fillcolor=gray]; + } + 146 [label="Exit when branch result" style="filled" fillcolor=gray]; + 133 [label="Exit when"]; + } + 154 [label="Variable declaration: lval a: R|kotlin/Any|"]; + 155 [label="Access variable R|/a|"]; + 156 [label="Function call: R|/a|.R|/baz|()"]; + 157 [label="Access variable R|/d|"]; + 158 [label="Access variable R|/D.any|"]; + 159 [label="Function call: R|/d|.R|/D.any|.R|/baz|()"]; + 160 [label="Access variable R|/a|"]; + 161 [label="Type operator: (R|/a| as R|A|)"]; + 162 [label="Access variable R|/a|"]; + 163 [label="Function call: R|/a|.R|/A.foo|()"]; + 164 [label="Exit block"]; + } + 130 [label="Exit function test_5" style="filled" fillcolor=red]; + } + 129 -> {131}; 131 -> {132}; - 132 -> {120}; - 132 -> {133} [style=dotted]; - 133 -> {134} [style=dotted]; - 134 -> {135} [style=dotted]; - 135 -> {122} [style=dotted]; + 132 -> {134}; + 133 -> {154}; + 134 -> {135}; + 135 -> {136}; 136 -> {137}; 137 -> {138}; 138 -> {139}; 139 -> {140}; - 140 -> {141}; + 140 -> {141 147}; 141 -> {142}; - 142 -> {122}; - 143 -> {144}; - 144 -> {145}; - 145 -> {146}; - 146 -> {147}; + 142 -> {143}; + 143 -> {130}; + 143 -> {144} [style=dotted]; + 144 -> {145} [style=dotted]; + 145 -> {146} [style=dotted]; + 146 -> {133} [style=dotted]; 147 -> {148}; 148 -> {149}; 149 -> {150}; 150 -> {151}; 151 -> {152}; - 152 -> {120}; - - subgraph cluster_34 { - color=red - 153 [label="Enter function test_6" style="filled" fillcolor=red]; - 155 [label="Access variable R|/d1|"]; - 156 [label="Access variable R|/D.any|"]; - 157 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 158 [label="Access variable R|/a|"]; - 159 [label="Type operator: (R|/a| as R|A|)"]; - 160 [label="Access variable R|/a|"]; - 161 [label="Function call: R|/a|.R|/A.foo|()"]; - 162 [label="Access variable R|/d1|"]; - 163 [label="Access variable R|/D.any|"]; - 164 [label="Function call: R|/d1|.R|/D.any|.R|/A.foo|()"]; - 165 [label="Access variable R|/d1|"]; - 166 [label="Access variable R|/D.any|"]; - 167 [label="Function call: R|/d1|.R|/D.any|.R|/baz|()"]; - 154 [label="Exit function test_6" style="filled" fillcolor=red]; - } - 153 -> {155}; + 152 -> {153}; + 153 -> {133}; + 154 -> {155}; 155 -> {156}; 156 -> {157}; 157 -> {158}; @@ -439,52 +452,96 @@ digraph boundSmartcasts_kt { 161 -> {162}; 162 -> {163}; 163 -> {164}; - 164 -> {165}; - 165 -> {166}; - 166 -> {167}; - 167 -> {154}; + 164 -> {130}; - subgraph cluster_35 { + subgraph cluster_40 { color=red - 168 [label="Enter function test_7" style="filled" fillcolor=red]; - 170 [label="Access variable R|/d1|"]; - 171 [label="Enter safe call"]; - 173 [label="Access variable R|/D.any|"]; - 172 [label="Exit safe call"]; - 174 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 175 [label="Access variable R|/d2|"]; - 176 [label="Enter safe call"]; - 178 [label="Access variable R|/D.any|"]; - 177 [label="Exit safe call"]; - 179 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - 180 [label="Access variable R|/a|"]; - 181 [label="Type operator: (R|/a| as R|A|)"]; - 182 [label="Access variable R|/a|"]; - 183 [label="Function call: R|/a|.R|/A.foo|()"]; - 184 [label="Access variable R|/b|"]; - 185 [label="Type operator: (R|/b| as R|B|)"]; - 186 [label="Access variable R|/b|"]; - 187 [label="Function call: R|/b|.R|/B.bar|()"]; - 169 [label="Exit function test_7" style="filled" fillcolor=red]; + 165 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_41 { + color=blue + 167 [label="Enter block"]; + 168 [label="Access variable R|/d1|"]; + 169 [label="Access variable R|/D.any|"]; + 170 [label="Variable declaration: lval a: R|kotlin/Any?|"]; + 171 [label="Access variable R|/a|"]; + 172 [label="Type operator: (R|/a| as R|A|)"]; + 173 [label="Access variable R|/a|"]; + 174 [label="Function call: R|/a|.R|/A.foo|()"]; + 175 [label="Access variable R|/d1|"]; + 176 [label="Access variable R|/D.any|"]; + 177 [label="Function call: R|/d1|.R|/D.any|.R|/A.foo|()"]; + 178 [label="Access variable R|/d1|"]; + 179 [label="Access variable R|/D.any|"]; + 180 [label="Function call: R|/d1|.R|/D.any|.R|/baz|()"]; + 181 [label="Exit block"]; + } + 166 [label="Exit function test_6" style="filled" fillcolor=red]; } - 168 -> {170}; - 170 -> {171 172}; - 171 -> {173}; - 172 -> {174}; - 173 -> {172}; + 165 -> {167}; + 167 -> {168}; + 168 -> {169}; + 169 -> {170}; + 170 -> {171}; + 171 -> {172}; + 172 -> {173}; + 173 -> {174}; 174 -> {175}; - 175 -> {176 177}; - 176 -> {178}; - 177 -> {179}; - 178 -> {177}; + 175 -> {176}; + 176 -> {177}; + 177 -> {178}; + 178 -> {179}; 179 -> {180}; 180 -> {181}; - 181 -> {182}; - 182 -> {183}; - 183 -> {184}; + 181 -> {166}; + + subgraph cluster_42 { + color=red + 182 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_43 { + color=blue + 184 [label="Enter block"]; + 185 [label="Access variable R|/d1|"]; + 186 [label="Enter safe call"]; + 188 [label="Access variable R|/D.any|"]; + 187 [label="Exit safe call"]; + 189 [label="Variable declaration: lval a: R|kotlin/Any?|"]; + 190 [label="Access variable R|/d2|"]; + 191 [label="Enter safe call"]; + 193 [label="Access variable R|/D.any|"]; + 192 [label="Exit safe call"]; + 194 [label="Variable declaration: lval b: R|kotlin/Any?|"]; + 195 [label="Access variable R|/a|"]; + 196 [label="Type operator: (R|/a| as R|A|)"]; + 197 [label="Access variable R|/a|"]; + 198 [label="Function call: R|/a|.R|/A.foo|()"]; + 199 [label="Access variable R|/b|"]; + 200 [label="Type operator: (R|/b| as R|B|)"]; + 201 [label="Access variable R|/b|"]; + 202 [label="Function call: R|/b|.R|/B.bar|()"]; + 203 [label="Exit block"]; + } + 183 [label="Exit function test_7" style="filled" fillcolor=red]; + } + 182 -> {184}; 184 -> {185}; - 185 -> {186}; - 186 -> {187}; - 187 -> {169}; + 185 -> {186 187}; + 186 -> {188}; + 187 -> {189}; + 188 -> {187}; + 189 -> {190}; + 190 -> {191 192}; + 191 -> {193}; + 192 -> {194}; + 193 -> {192}; + 194 -> {195}; + 195 -> {196}; + 196 -> {197}; + 197 -> {198}; + 198 -> {199}; + 199 -> {200}; + 200 -> {201}; + 201 -> {202}; + 202 -> {203}; + 203 -> {183}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot index 15e92403ec7..9ca2300dd7e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/boundSmartcastsInBranches.dot @@ -14,85 +14,91 @@ digraph boundSmartcastsInBranches_kt { subgraph cluster_1 { color=red - 8 [label="Enter class A" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 3 [label="Enter function getter" style="filled" fillcolor=red]; - 4 [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]; + } + 3 -> {4}; + + subgraph cluster_2 { + color=red + 9 [label="Enter class A" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue 5 [label="Enter property" style="filled" fillcolor=red]; 7 [label="Const: String()"]; 6 [label="Exit property" style="filled" fillcolor=red]; } - 9 [label="Exit class A" style="filled" fillcolor=red]; + 8 [label="Exit class A" style="filled" fillcolor=red]; } - 8 -> {5} [color=green]; + 9 -> {5} [color=green]; 5 -> {7}; - 6 -> {9} [color=green]; + 6 -> {8} [color=green]; 7 -> {6}; - 3 -> {4}; subgraph cluster_4 { color=red 10 [label="Enter function test_0" style="filled" fillcolor=red]; - 12 [label="Const: Null(null)"]; - 13 [label="Variable declaration: lvar goodA: R|A?|"]; - 14 [label="Access variable R|/list|"]; - 15 [label="Function call: R|/list|.R|FakeOverride|>|()"]; - 16 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; subgraph cluster_5 { color=blue - 17 [label="Enter while loop"]; + 12 [label="Enter block"]; + 13 [label="Const: Null(null)"]; + 14 [label="Variable declaration: lvar goodA: R|A?|"]; + 15 [label="Access variable R|/list|"]; + 16 [label="Function call: R|/list|.R|FakeOverride|>|()"]; + 17 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; subgraph cluster_6 { color=blue - 19 [label="Enter loop condition"]; - 20 [label="Access variable R|/|"]; - 21 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 22 [label="Exit loop condition"]; - } - subgraph cluster_7 { - color=blue - 23 [label="Enter loop block"]; + 18 [label="Enter while loop"]; + subgraph cluster_7 { + color=blue + 20 [label="Enter loop condition"]; + 21 [label="Access variable R|/|"]; + 22 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; + 23 [label="Exit loop condition"]; + } subgraph cluster_8 { color=blue - 24 [label="Enter block"]; - 25 [label="Access variable R|/|"]; - 26 [label="Function call: R|/|.R|FakeOverride|()"]; - 27 [label="Variable declaration: lval a: R|A|"]; + 24 [label="Enter loop block"]; subgraph cluster_9 { color=blue - 28 [label="Enter when"]; + 25 [label="Enter block"]; + 26 [label="Access variable R|/|"]; + 27 [label="Function call: R|/|.R|FakeOverride|()"]; + 28 [label="Variable declaration: lval a: R|A|"]; subgraph cluster_10 { color=blue - 30 [label="Enter when branch condition "]; - 31 [label="Access variable R|/goodA|"]; - 32 [label="Const: Null(null)"]; - 33 [label="Operator =="]; - 34 [label="Exit when branch condition"]; + 29 [label="Enter when"]; + subgraph cluster_11 { + color=blue + 31 [label="Enter when branch condition "]; + 32 [label="Access variable R|/goodA|"]; + 33 [label="Const: Null(null)"]; + 34 [label="Operator =="]; + 35 [label="Exit when branch condition"]; + } + 44 [label="Synthetic else branch"]; + 36 [label="Enter when branch result"]; + subgraph cluster_12 { + color=blue + 37 [label="Enter block"]; + 38 [label="Access variable R|/a|"]; + 39 [label="Assignment: R|/goodA|"]; + 40 [label="Jump: continue@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] "]; + 41 [label="Stub" style="filled" fillcolor=gray]; + 42 [label="Exit block" style="filled" fillcolor=gray]; + } + 43 [label="Exit when branch result" style="filled" fillcolor=gray]; + 30 [label="Exit when"]; } - 43 [label="Synthetic else branch"]; - 35 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 36 [label="Enter block"]; - 37 [label="Access variable R|/a|"]; - 38 [label="Assignment: R|/goodA|"]; - 39 [label="Jump: continue@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] "]; - 40 [label="Stub" style="filled" fillcolor=gray]; - 41 [label="Exit block" style="filled" fillcolor=gray]; - } - 42 [label="Exit when branch result" style="filled" fillcolor=gray]; - 29 [label="Exit when"]; + 45 [label="Access variable R|/goodA|"]; + 46 [label="Access variable R|/A.s|"]; + 47 [label="Exit block"]; } - 44 [label="Access variable R|/goodA|"]; - 45 [label="Access variable R|/A.s|"]; - 46 [label="Exit block"]; + 48 [label="Exit loop block"]; } - 47 [label="Exit loop block"]; + 19 [label="Exit whileloop"]; } - 18 [label="Exit whileloop"]; + 49 [label="Exit block"]; } 11 [label="Exit function test_0" style="filled" fillcolor=red]; } @@ -102,600 +108,635 @@ digraph boundSmartcastsInBranches_kt { 14 -> {15}; 15 -> {16}; 16 -> {17}; - 17 -> {19}; - 18 -> {11}; - 19 -> {20}; + 17 -> {18}; + 18 -> {20}; + 19 -> {49}; 20 -> {21}; 21 -> {22}; - 22 -> {18 23}; - 23 -> {24}; + 22 -> {23}; + 23 -> {19 24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {30}; - 29 -> {44}; - 30 -> {31}; + 28 -> {29}; + 29 -> {31}; + 30 -> {45}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {35 43}; - 35 -> {36}; + 34 -> {35}; + 35 -> {36 44}; 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {40} [style=dotted]; - 39 -> {17} [color=green style=dashed]; + 39 -> {40}; 40 -> {41} [style=dotted]; + 40 -> {18} [color=green style=dashed]; 41 -> {42} [style=dotted]; - 42 -> {29} [style=dotted]; - 43 -> {29}; - 44 -> {45}; + 42 -> {43} [style=dotted]; + 43 -> {30} [style=dotted]; + 44 -> {30}; 45 -> {46}; 46 -> {47}; - 47 -> {19} [color=green style=dashed]; + 47 -> {48}; + 48 -> {20} [color=green style=dashed]; + 49 -> {11}; - subgraph cluster_12 { + subgraph cluster_13 { color=red - 48 [label="Enter function test_1" style="filled" fillcolor=red]; - 50 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_13 { + 50 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_14 { color=blue - 51 [label="Enter when"]; - subgraph cluster_14 { - color=blue - 53 [label="Enter when branch condition "]; - 54 [label="Access variable R|/b|"]; - 55 [label="Exit when branch condition"]; - } + 52 [label="Enter block"]; + 53 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_15 { color=blue - 62 [label="Enter when branch condition else"]; - 63 [label="Exit when branch condition"]; + 54 [label="Enter when"]; + subgraph cluster_16 { + color=blue + 56 [label="Enter when branch condition "]; + 57 [label="Access variable R|/b|"]; + 58 [label="Exit when branch condition"]; + } + subgraph cluster_17 { + color=blue + 65 [label="Enter when branch condition else"]; + 66 [label="Exit when branch condition"]; + } + 67 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 68 [label="Enter block"]; + 69 [label="Access variable R|/a|"]; + 70 [label="Assignment: R|/x|"]; + 71 [label="Exit block"]; + } + 72 [label="Exit when branch result"]; + 59 [label="Enter when branch result"]; + subgraph cluster_19 { + color=blue + 60 [label="Enter block"]; + 61 [label="Function call: R|/A.A|()"]; + 62 [label="Assignment: R|/x|"]; + 63 [label="Exit block"]; + } + 64 [label="Exit when branch result"]; + 55 [label="Exit when"]; } - 64 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 65 [label="Enter block"]; - 66 [label="Access variable R|/a|"]; - 67 [label="Assignment: R|/x|"]; - 68 [label="Exit block"]; - } - 69 [label="Exit when branch result"]; - 56 [label="Enter when branch result"]; - subgraph cluster_17 { - color=blue - 57 [label="Enter block"]; - 58 [label="Function call: R|/A.A|()"]; - 59 [label="Assignment: R|/x|"]; - 60 [label="Exit block"]; - } - 61 [label="Exit when branch result"]; - 52 [label="Exit when"]; + 73 [label="Access variable R|/x|"]; + 74 [label="Access variable R|/A.s|"]; + 75 [label="Exit block"]; } - 70 [label="Access variable R|/x|"]; - 71 [label="Access variable R|/A.s|"]; - 49 [label="Exit function test_1" style="filled" fillcolor=red]; + 51 [label="Exit function test_1" style="filled" fillcolor=red]; } - 48 -> {50}; - 50 -> {51}; - 51 -> {53}; - 52 -> {70}; + 50 -> {52}; + 52 -> {53}; 53 -> {54}; - 54 -> {55}; - 55 -> {56 62}; + 54 -> {56}; + 55 -> {73}; 56 -> {57}; 57 -> {58}; - 58 -> {59}; + 58 -> {59 65}; 59 -> {60}; 60 -> {61}; - 61 -> {52}; + 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {65}; + 64 -> {55}; 65 -> {66}; 66 -> {67}; 67 -> {68}; 68 -> {69}; - 69 -> {52}; + 69 -> {70}; 70 -> {71}; - 71 -> {49}; + 71 -> {72}; + 72 -> {55}; + 73 -> {74}; + 74 -> {75}; + 75 -> {51}; - subgraph cluster_18 { + subgraph cluster_20 { color=red - 72 [label="Enter function test_2" style="filled" fillcolor=red]; - 74 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_19 { + 76 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_21 { color=blue - 75 [label="Enter when"]; - subgraph cluster_20 { - color=blue - 77 [label="Enter when branch condition "]; - 78 [label="Access variable R|/b|"]; - 79 [label="Exit when branch condition"]; - } - subgraph cluster_21 { - color=blue - 86 [label="Enter when branch condition else"]; - 87 [label="Exit when branch condition"]; - } - 88 [label="Enter when branch result"]; + 78 [label="Enter block"]; + 79 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_22 { color=blue - 89 [label="Enter block"]; - 90 [label="Access variable R|/a|"]; - 91 [label="Assignment: R|/x|"]; - 92 [label="Access variable R|/a|"]; - 93 [label="Type operator: (R|/a| as R|A|)"]; - 94 [label="Exit block"]; + 80 [label="Enter when"]; + subgraph cluster_23 { + color=blue + 82 [label="Enter when branch condition "]; + 83 [label="Access variable R|/b|"]; + 84 [label="Exit when branch condition"]; + } + subgraph cluster_24 { + color=blue + 91 [label="Enter when branch condition else"]; + 92 [label="Exit when branch condition"]; + } + 93 [label="Enter when branch result"]; + subgraph cluster_25 { + color=blue + 94 [label="Enter block"]; + 95 [label="Access variable R|/a|"]; + 96 [label="Assignment: R|/x|"]; + 97 [label="Access variable R|/a|"]; + 98 [label="Type operator: (R|/a| as R|A|)"]; + 99 [label="Exit block"]; + } + 100 [label="Exit when branch result"]; + 85 [label="Enter when branch result"]; + subgraph cluster_26 { + color=blue + 86 [label="Enter block"]; + 87 [label="Function call: R|/A.A|()"]; + 88 [label="Assignment: R|/x|"]; + 89 [label="Exit block"]; + } + 90 [label="Exit when branch result"]; + 81 [label="Exit when"]; } - 95 [label="Exit when branch result"]; - 80 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 81 [label="Enter block"]; - 82 [label="Function call: R|/A.A|()"]; - 83 [label="Assignment: R|/x|"]; - 84 [label="Exit block"]; - } - 85 [label="Exit when branch result"]; - 76 [label="Exit when"]; + 101 [label="Access variable R|/x|"]; + 102 [label="Access variable R|/A.s|"]; + 103 [label="Exit block"]; } - 96 [label="Access variable R|/x|"]; - 97 [label="Access variable R|/A.s|"]; - 73 [label="Exit function test_2" style="filled" fillcolor=red]; + 77 [label="Exit function test_2" style="filled" fillcolor=red]; } - 72 -> {74}; - 74 -> {75}; - 75 -> {77}; - 76 -> {96}; - 77 -> {78}; + 76 -> {78}; 78 -> {79}; - 79 -> {80 86}; - 80 -> {81}; - 81 -> {82}; + 79 -> {80}; + 80 -> {82}; + 81 -> {101}; 82 -> {83}; 83 -> {84}; - 84 -> {85}; - 85 -> {76}; + 84 -> {85 91}; + 85 -> {86}; 86 -> {87}; 87 -> {88}; 88 -> {89}; 89 -> {90}; - 90 -> {91}; + 90 -> {81}; 91 -> {92}; 92 -> {93}; 93 -> {94}; 94 -> {95}; - 95 -> {76}; + 95 -> {96}; 96 -> {97}; - 97 -> {73}; + 97 -> {98}; + 98 -> {99}; + 99 -> {100}; + 100 -> {81}; + 101 -> {102}; + 102 -> {103}; + 103 -> {77}; - subgraph cluster_24 { + subgraph cluster_27 { color=red - 98 [label="Enter function test_3" style="filled" fillcolor=red]; - 100 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_25 { + 104 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_28 { color=blue - 101 [label="Enter when"]; - subgraph cluster_26 { - color=blue - 103 [label="Enter when branch condition "]; - 104 [label="Access variable R|/b|"]; - 105 [label="Exit when branch condition"]; - } - subgraph cluster_27 { - color=blue - 112 [label="Enter when branch condition else"]; - 113 [label="Exit when branch condition"]; - } - 114 [label="Enter when branch result"]; - subgraph cluster_28 { - color=blue - 115 [label="Enter block"]; - 116 [label="Access variable R|/a|"]; - 117 [label="Type operator: (R|/a| as R|A|)"]; - 118 [label="Access variable R|/a|"]; - 119 [label="Assignment: R|/x|"]; - 120 [label="Exit block"]; - } - 121 [label="Exit when branch result"]; - 106 [label="Enter when branch result"]; + 106 [label="Enter block"]; + 107 [label="Variable declaration: lval x: R|kotlin/Any|"]; subgraph cluster_29 { color=blue - 107 [label="Enter block"]; - 108 [label="Function call: R|/A.A|()"]; - 109 [label="Assignment: R|/x|"]; - 110 [label="Exit block"]; + 108 [label="Enter when"]; + subgraph cluster_30 { + color=blue + 110 [label="Enter when branch condition "]; + 111 [label="Access variable R|/b|"]; + 112 [label="Exit when branch condition"]; + } + subgraph cluster_31 { + color=blue + 119 [label="Enter when branch condition else"]; + 120 [label="Exit when branch condition"]; + } + 121 [label="Enter when branch result"]; + subgraph cluster_32 { + color=blue + 122 [label="Enter block"]; + 123 [label="Access variable R|/a|"]; + 124 [label="Type operator: (R|/a| as R|A|)"]; + 125 [label="Access variable R|/a|"]; + 126 [label="Assignment: R|/x|"]; + 127 [label="Exit block"]; + } + 128 [label="Exit when branch result"]; + 113 [label="Enter when branch result"]; + subgraph cluster_33 { + color=blue + 114 [label="Enter block"]; + 115 [label="Function call: R|/A.A|()"]; + 116 [label="Assignment: R|/x|"]; + 117 [label="Exit block"]; + } + 118 [label="Exit when branch result"]; + 109 [label="Exit when"]; } - 111 [label="Exit when branch result"]; - 102 [label="Exit when"]; + 129 [label="Access variable R|/x|"]; + 130 [label="Access variable R|/A.s|"]; + 131 [label="Exit block"]; } - 122 [label="Access variable R|/x|"]; - 123 [label="Access variable R|/A.s|"]; - 99 [label="Exit function test_3" style="filled" fillcolor=red]; + 105 [label="Exit function test_3" style="filled" fillcolor=red]; } - 98 -> {100}; - 100 -> {101}; - 101 -> {103}; - 102 -> {122}; - 103 -> {104}; - 104 -> {105}; - 105 -> {106 112}; + 104 -> {106}; 106 -> {107}; 107 -> {108}; - 108 -> {109}; - 109 -> {110}; + 108 -> {110}; + 109 -> {129}; 110 -> {111}; - 111 -> {102}; - 112 -> {113}; + 111 -> {112}; + 112 -> {113 119}; 113 -> {114}; 114 -> {115}; 115 -> {116}; 116 -> {117}; 117 -> {118}; - 118 -> {119}; + 118 -> {109}; 119 -> {120}; 120 -> {121}; - 121 -> {102}; + 121 -> {122}; 122 -> {123}; - 123 -> {99}; - - subgraph cluster_30 { - color=red - 124 [label="Enter function test_4" style="filled" fillcolor=red]; - 126 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_31 { - color=blue - 127 [label="Enter when"]; - subgraph cluster_32 { - color=blue - 129 [label="Enter when branch condition "]; - 130 [label="Access variable R|/b|"]; - 131 [label="Exit when branch condition"]; - } - subgraph cluster_33 { - color=blue - 138 [label="Enter when branch condition else"]; - 139 [label="Exit when branch condition"]; - } - 140 [label="Enter when branch result"]; - subgraph cluster_34 { - color=blue - 141 [label="Enter block"]; - 142 [label="Access variable R|/a|"]; - 143 [label="Assignment: R|/x|"]; - 144 [label="Exit block"]; - } - 145 [label="Exit when branch result"]; - 132 [label="Enter when branch result"]; - subgraph cluster_35 { - color=blue - 133 [label="Enter block"]; - 134 [label="Access variable R|/a|"]; - 135 [label="Assignment: R|/x|"]; - 136 [label="Exit block"]; - } - 137 [label="Exit when branch result"]; - 128 [label="Exit when"]; - } - 146 [label="Access variable R|/x|"]; - 147 [label="Type operator: (R|/x| as R|A|)"]; - 148 [label="Access variable R|/x|"]; - 149 [label="Access variable R|/A.s|"]; - 150 [label="Access variable R|/a|"]; - 151 [label="Access variable R|/A.s|"]; - 125 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 124 -> {126}; + 123 -> {124}; + 124 -> {125}; + 125 -> {126}; 126 -> {127}; - 127 -> {129}; - 128 -> {146}; + 127 -> {128}; + 128 -> {109}; 129 -> {130}; 130 -> {131}; - 131 -> {132 138}; - 132 -> {133}; - 133 -> {134}; + 131 -> {105}; + + subgraph cluster_34 { + color=red + 132 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_35 { + color=blue + 134 [label="Enter block"]; + 135 [label="Variable declaration: lval x: R|kotlin/Any|"]; + subgraph cluster_36 { + color=blue + 136 [label="Enter when"]; + subgraph cluster_37 { + color=blue + 138 [label="Enter when branch condition "]; + 139 [label="Access variable R|/b|"]; + 140 [label="Exit when branch condition"]; + } + subgraph cluster_38 { + color=blue + 147 [label="Enter when branch condition else"]; + 148 [label="Exit when branch condition"]; + } + 149 [label="Enter when branch result"]; + subgraph cluster_39 { + color=blue + 150 [label="Enter block"]; + 151 [label="Access variable R|/a|"]; + 152 [label="Assignment: R|/x|"]; + 153 [label="Exit block"]; + } + 154 [label="Exit when branch result"]; + 141 [label="Enter when branch result"]; + subgraph cluster_40 { + color=blue + 142 [label="Enter block"]; + 143 [label="Access variable R|/a|"]; + 144 [label="Assignment: R|/x|"]; + 145 [label="Exit block"]; + } + 146 [label="Exit when branch result"]; + 137 [label="Exit when"]; + } + 155 [label="Access variable R|/x|"]; + 156 [label="Type operator: (R|/x| as R|A|)"]; + 157 [label="Access variable R|/x|"]; + 158 [label="Access variable R|/A.s|"]; + 159 [label="Access variable R|/a|"]; + 160 [label="Access variable R|/A.s|"]; + 161 [label="Exit block"]; + } + 133 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 132 -> {134}; 134 -> {135}; 135 -> {136}; - 136 -> {137}; - 137 -> {128}; + 136 -> {138}; + 137 -> {155}; 138 -> {139}; 139 -> {140}; - 140 -> {141}; + 140 -> {141 147}; 141 -> {142}; 142 -> {143}; 143 -> {144}; 144 -> {145}; - 145 -> {128}; - 146 -> {147}; + 145 -> {146}; + 146 -> {137}; 147 -> {148}; 148 -> {149}; 149 -> {150}; 150 -> {151}; - 151 -> {125}; - - subgraph cluster_36 { - color=red - 152 [label="Enter function test_5" style="filled" fillcolor=red]; - 154 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_37 { - color=blue - 155 [label="Enter when"]; - subgraph cluster_38 { - color=blue - 157 [label="Enter when branch condition "]; - 158 [label="Access variable R|/b|"]; - 159 [label="Exit when branch condition"]; - } - subgraph cluster_39 { - color=blue - 166 [label="Enter when branch condition else"]; - 167 [label="Exit when branch condition"]; - } - 168 [label="Enter when branch result"]; - subgraph cluster_40 { - color=blue - 169 [label="Enter block"]; - 170 [label="Access variable R|/a|"]; - 171 [label="Assignment: R|/x|"]; - 172 [label="Exit block"]; - } - 173 [label="Exit when branch result"]; - 160 [label="Enter when branch result"]; - subgraph cluster_41 { - color=blue - 161 [label="Enter block"]; - 162 [label="Access variable R|/a|"]; - 163 [label="Assignment: R|/x|"]; - 164 [label="Exit block"]; - } - 165 [label="Exit when branch result"]; - 156 [label="Exit when"]; - } - 174 [label="Access variable R|/a|"]; - 175 [label="Type operator: (R|/a| as R|A|)"]; - 176 [label="Access variable R|/x|"]; - 177 [label="Access variable R|/A.s|"]; - 178 [label="Access variable R|/a|"]; - 179 [label="Access variable R|/A.s|"]; - 153 [label="Exit function test_5" style="filled" fillcolor=red]; - } - 152 -> {154}; - 154 -> {155}; - 155 -> {157}; - 156 -> {174}; + 151 -> {152}; + 152 -> {153}; + 153 -> {154}; + 154 -> {137}; + 155 -> {156}; + 156 -> {157}; 157 -> {158}; 158 -> {159}; - 159 -> {160 166}; + 159 -> {160}; 160 -> {161}; - 161 -> {162}; - 162 -> {163}; - 163 -> {164}; + 161 -> {133}; + + subgraph cluster_41 { + color=red + 162 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_42 { + color=blue + 164 [label="Enter block"]; + 165 [label="Variable declaration: lval x: R|kotlin/Any|"]; + subgraph cluster_43 { + color=blue + 166 [label="Enter when"]; + subgraph cluster_44 { + color=blue + 168 [label="Enter when branch condition "]; + 169 [label="Access variable R|/b|"]; + 170 [label="Exit when branch condition"]; + } + subgraph cluster_45 { + color=blue + 177 [label="Enter when branch condition else"]; + 178 [label="Exit when branch condition"]; + } + 179 [label="Enter when branch result"]; + subgraph cluster_46 { + color=blue + 180 [label="Enter block"]; + 181 [label="Access variable R|/a|"]; + 182 [label="Assignment: R|/x|"]; + 183 [label="Exit block"]; + } + 184 [label="Exit when branch result"]; + 171 [label="Enter when branch result"]; + subgraph cluster_47 { + color=blue + 172 [label="Enter block"]; + 173 [label="Access variable R|/a|"]; + 174 [label="Assignment: R|/x|"]; + 175 [label="Exit block"]; + } + 176 [label="Exit when branch result"]; + 167 [label="Exit when"]; + } + 185 [label="Access variable R|/a|"]; + 186 [label="Type operator: (R|/a| as R|A|)"]; + 187 [label="Access variable R|/x|"]; + 188 [label="Access variable R|/A.s|"]; + 189 [label="Access variable R|/a|"]; + 190 [label="Access variable R|/A.s|"]; + 191 [label="Exit block"]; + } + 163 [label="Exit function test_5" style="filled" fillcolor=red]; + } + 162 -> {164}; 164 -> {165}; - 165 -> {156}; - 166 -> {167}; - 167 -> {168}; + 165 -> {166}; + 166 -> {168}; + 167 -> {185}; 168 -> {169}; 169 -> {170}; - 170 -> {171}; + 170 -> {171 177}; 171 -> {172}; 172 -> {173}; - 173 -> {156}; + 173 -> {174}; 174 -> {175}; 175 -> {176}; - 176 -> {177}; + 176 -> {167}; 177 -> {178}; 178 -> {179}; - 179 -> {153}; - - subgraph cluster_42 { - color=red - 180 [label="Enter function test_6" style="filled" fillcolor=red]; - 182 [label="Variable declaration: lval x: R|kotlin/Any|"]; - 183 [label="Access variable R|/a|"]; - 184 [label="Assignment: R|/x|"]; - 185 [label="Access variable R|/x|"]; - 186 [label="Access variable R|/A.s|"]; - 181 [label="Exit function test_6" style="filled" fillcolor=red]; - } - 180 -> {182}; + 179 -> {180}; + 180 -> {181}; + 181 -> {182}; 182 -> {183}; 183 -> {184}; - 184 -> {185}; + 184 -> {167}; 185 -> {186}; - 186 -> {181}; - - subgraph cluster_43 { - color=red - 187 [label="Enter function test_7" style="filled" fillcolor=red]; - 189 [label="Const: Null(null)"]; - 190 [label="Variable declaration: lval z: R|kotlin/String?|"]; - 191 [label="Access variable R|/z|"]; - 192 [label="Variable declaration: lvar y: R|kotlin/String?|"]; - 193 [label="Access variable R|/y|"]; - 194 [label="Variable declaration: lval x: R|kotlin/String?|"]; - subgraph cluster_44 { - color=blue - 195 [label="Enter when"]; - subgraph cluster_45 { - color=blue - 197 [label="Enter when branch condition "]; - 198 [label="Access variable R|/x|"]; - 199 [label="Const: Null(null)"]; - 200 [label="Operator !="]; - 201 [label="Exit when branch condition"]; - } - 212 [label="Synthetic else branch"]; - 202 [label="Enter when branch result"]; - subgraph cluster_46 { - color=blue - 203 [label="Enter block"]; - 204 [label="Access variable R|/x|"]; - 205 [label="Access variable R|kotlin/String.length|"]; - 206 [label="Access variable R|/y|"]; - 207 [label="Access variable R|kotlin/String.length|"]; - 208 [label="Access variable R|/z|"]; - 209 [label="Access variable R|kotlin/String.length|"]; - 210 [label="Exit block"]; - } - 211 [label="Exit when branch result"]; - 196 [label="Exit when"]; - } - subgraph cluster_47 { - color=blue - 213 [label="Enter when"]; - subgraph cluster_48 { - color=blue - 215 [label="Enter when branch condition "]; - 216 [label="Access variable R|/y|"]; - 217 [label="Const: Null(null)"]; - 218 [label="Operator !="]; - 219 [label="Exit when branch condition"]; - } - 230 [label="Synthetic else branch"]; - 220 [label="Enter when branch result"]; - subgraph cluster_49 { - color=blue - 221 [label="Enter block"]; - 222 [label="Access variable R|/x|"]; - 223 [label="Access variable R|kotlin/String.length|"]; - 224 [label="Access variable R|/y|"]; - 225 [label="Access variable R|kotlin/String.length|"]; - 226 [label="Access variable R|/z|"]; - 227 [label="Access variable R|kotlin/String.length|"]; - 228 [label="Exit block"]; - } - 229 [label="Exit when branch result"]; - 214 [label="Exit when"]; - } - subgraph cluster_50 { - color=blue - 231 [label="Enter when"]; - subgraph cluster_51 { - color=blue - 233 [label="Enter when branch condition "]; - 234 [label="Access variable R|/z|"]; - 235 [label="Const: Null(null)"]; - 236 [label="Operator !="]; - 237 [label="Exit when branch condition"]; - } - 248 [label="Synthetic else branch"]; - 238 [label="Enter when branch result"]; - subgraph cluster_52 { - color=blue - 239 [label="Enter block"]; - 240 [label="Access variable R|/x|"]; - 241 [label="Access variable R|kotlin/String.length|"]; - 242 [label="Access variable R|/y|"]; - 243 [label="Access variable R|kotlin/String.length|"]; - 244 [label="Access variable R|/z|"]; - 245 [label="Access variable R|kotlin/String.length|"]; - 246 [label="Exit block"]; - } - 247 [label="Exit when branch result"]; - 232 [label="Exit when"]; - } - 249 [label="Const: Null(null)"]; - 250 [label="Assignment: R|/y|"]; - subgraph cluster_53 { - color=blue - 251 [label="Enter when"]; - subgraph cluster_54 { - color=blue - 253 [label="Enter when branch condition "]; - 254 [label="Access variable R|/x|"]; - 255 [label="Const: Null(null)"]; - 256 [label="Operator !="]; - 257 [label="Exit when branch condition"]; - } - 268 [label="Synthetic else branch"]; - 258 [label="Enter when branch result"]; - subgraph cluster_55 { - color=blue - 259 [label="Enter block"]; - 260 [label="Access variable R|/x|"]; - 261 [label="Access variable R|kotlin/String.length|"]; - 262 [label="Access variable R|/y|"]; - 263 [label="Access variable #"]; - 264 [label="Access variable R|/z|"]; - 265 [label="Access variable R|kotlin/String.length|"]; - 266 [label="Exit block"]; - } - 267 [label="Exit when branch result"]; - 252 [label="Exit when"]; - } - subgraph cluster_56 { - color=blue - 269 [label="Enter when"]; - subgraph cluster_57 { - color=blue - 271 [label="Enter when branch condition "]; - 272 [label="Access variable R|/y|"]; - 273 [label="Const: Null(null)"]; - 274 [label="Operator !="]; - 275 [label="Exit when branch condition"]; - } - 286 [label="Synthetic else branch"]; - 276 [label="Enter when branch result"]; - subgraph cluster_58 { - color=blue - 277 [label="Enter block"]; - 278 [label="Access variable R|/x|"]; - 279 [label="Access variable #"]; - 280 [label="Access variable R|/y|"]; - 281 [label="Access variable R|kotlin/String.length|"]; - 282 [label="Access variable R|/z|"]; - 283 [label="Access variable #"]; - 284 [label="Exit block"]; - } - 285 [label="Exit when branch result"]; - 270 [label="Exit when"]; - } - subgraph cluster_59 { - color=blue - 287 [label="Enter when"]; - subgraph cluster_60 { - color=blue - 289 [label="Enter when branch condition "]; - 290 [label="Access variable R|/z|"]; - 291 [label="Const: Null(null)"]; - 292 [label="Operator !="]; - 293 [label="Exit when branch condition"]; - } - 304 [label="Synthetic else branch"]; - 294 [label="Enter when branch result"]; - subgraph cluster_61 { - color=blue - 295 [label="Enter block"]; - 296 [label="Access variable R|/x|"]; - 297 [label="Access variable R|kotlin/String.length|"]; - 298 [label="Access variable R|/y|"]; - 299 [label="Access variable #"]; - 300 [label="Access variable R|/z|"]; - 301 [label="Access variable R|kotlin/String.length|"]; - 302 [label="Exit block"]; - } - 303 [label="Exit when branch result"]; - 288 [label="Exit when"]; - } - 188 [label="Exit function test_7" style="filled" fillcolor=red]; - } - 187 -> {189}; + 186 -> {187}; + 187 -> {188}; + 188 -> {189}; 189 -> {190}; 190 -> {191}; - 191 -> {192}; - 192 -> {193}; - 193 -> {194}; + 191 -> {163}; + + subgraph cluster_48 { + color=red + 192 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_49 { + color=blue + 194 [label="Enter block"]; + 195 [label="Variable declaration: lval x: R|kotlin/Any|"]; + 196 [label="Access variable R|/a|"]; + 197 [label="Assignment: R|/x|"]; + 198 [label="Access variable R|/x|"]; + 199 [label="Access variable R|/A.s|"]; + 200 [label="Exit block"]; + } + 193 [label="Exit function test_6" style="filled" fillcolor=red]; + } + 192 -> {194}; 194 -> {195}; - 195 -> {197}; - 196 -> {213}; + 195 -> {196}; + 196 -> {197}; 197 -> {198}; 198 -> {199}; 199 -> {200}; - 200 -> {201}; - 201 -> {202 212}; - 202 -> {203}; + 200 -> {193}; + + subgraph cluster_50 { + color=red + 201 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_51 { + color=blue + 203 [label="Enter block"]; + 204 [label="Const: Null(null)"]; + 205 [label="Variable declaration: lval z: R|kotlin/String?|"]; + 206 [label="Access variable R|/z|"]; + 207 [label="Variable declaration: lvar y: R|kotlin/String?|"]; + 208 [label="Access variable R|/y|"]; + 209 [label="Variable declaration: lval x: R|kotlin/String?|"]; + subgraph cluster_52 { + color=blue + 210 [label="Enter when"]; + subgraph cluster_53 { + color=blue + 212 [label="Enter when branch condition "]; + 213 [label="Access variable R|/x|"]; + 214 [label="Const: Null(null)"]; + 215 [label="Operator !="]; + 216 [label="Exit when branch condition"]; + } + 227 [label="Synthetic else branch"]; + 217 [label="Enter when branch result"]; + subgraph cluster_54 { + color=blue + 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"]; + } + 226 [label="Exit when branch result"]; + 211 [label="Exit when"]; + } + subgraph cluster_55 { + color=blue + 228 [label="Enter when"]; + subgraph cluster_56 { + color=blue + 230 [label="Enter when branch condition "]; + 231 [label="Access variable R|/y|"]; + 232 [label="Const: Null(null)"]; + 233 [label="Operator !="]; + 234 [label="Exit when branch condition"]; + } + 245 [label="Synthetic else branch"]; + 235 [label="Enter when branch result"]; + subgraph cluster_57 { + color=blue + 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"]; + } + 244 [label="Exit when branch result"]; + 229 [label="Exit when"]; + } + subgraph cluster_58 { + color=blue + 246 [label="Enter when"]; + subgraph cluster_59 { + color=blue + 248 [label="Enter when branch condition "]; + 249 [label="Access variable R|/z|"]; + 250 [label="Const: Null(null)"]; + 251 [label="Operator !="]; + 252 [label="Exit when branch condition"]; + } + 263 [label="Synthetic else branch"]; + 253 [label="Enter when branch result"]; + subgraph cluster_60 { + color=blue + 254 [label="Enter block"]; + 255 [label="Access variable R|/x|"]; + 256 [label="Access variable R|kotlin/String.length|"]; + 257 [label="Access variable R|/y|"]; + 258 [label="Access variable R|kotlin/String.length|"]; + 259 [label="Access variable R|/z|"]; + 260 [label="Access variable R|kotlin/String.length|"]; + 261 [label="Exit block"]; + } + 262 [label="Exit when branch result"]; + 247 [label="Exit when"]; + } + 264 [label="Const: Null(null)"]; + 265 [label="Assignment: R|/y|"]; + subgraph cluster_61 { + color=blue + 266 [label="Enter when"]; + subgraph cluster_62 { + color=blue + 268 [label="Enter when branch condition "]; + 269 [label="Access variable R|/x|"]; + 270 [label="Const: Null(null)"]; + 271 [label="Operator !="]; + 272 [label="Exit when branch condition"]; + } + 283 [label="Synthetic else branch"]; + 273 [label="Enter when branch result"]; + subgraph cluster_63 { + color=blue + 274 [label="Enter block"]; + 275 [label="Access variable R|/x|"]; + 276 [label="Access variable R|kotlin/String.length|"]; + 277 [label="Access variable R|/y|"]; + 278 [label="Access variable #"]; + 279 [label="Access variable R|/z|"]; + 280 [label="Access variable R|kotlin/String.length|"]; + 281 [label="Exit block"]; + } + 282 [label="Exit when branch result"]; + 267 [label="Exit when"]; + } + subgraph cluster_64 { + color=blue + 284 [label="Enter when"]; + subgraph cluster_65 { + color=blue + 286 [label="Enter when branch condition "]; + 287 [label="Access variable R|/y|"]; + 288 [label="Const: Null(null)"]; + 289 [label="Operator !="]; + 290 [label="Exit when branch condition"]; + } + 301 [label="Synthetic else branch"]; + 291 [label="Enter when branch result"]; + subgraph cluster_66 { + color=blue + 292 [label="Enter block"]; + 293 [label="Access variable R|/x|"]; + 294 [label="Access variable #"]; + 295 [label="Access variable R|/y|"]; + 296 [label="Access variable R|kotlin/String.length|"]; + 297 [label="Access variable R|/z|"]; + 298 [label="Access variable #"]; + 299 [label="Exit block"]; + } + 300 [label="Exit when branch result"]; + 285 [label="Exit when"]; + } + subgraph cluster_67 { + color=blue + 302 [label="Enter when"]; + subgraph cluster_68 { + color=blue + 304 [label="Enter when branch condition "]; + 305 [label="Access variable R|/z|"]; + 306 [label="Const: Null(null)"]; + 307 [label="Operator !="]; + 308 [label="Exit when branch condition"]; + } + 319 [label="Synthetic else branch"]; + 309 [label="Enter when branch result"]; + subgraph cluster_69 { + color=blue + 310 [label="Enter block"]; + 311 [label="Access variable R|/x|"]; + 312 [label="Access variable R|kotlin/String.length|"]; + 313 [label="Access variable R|/y|"]; + 314 [label="Access variable #"]; + 315 [label="Access variable R|/z|"]; + 316 [label="Access variable R|kotlin/String.length|"]; + 317 [label="Exit block"]; + } + 318 [label="Exit when branch result"]; + 303 [label="Exit when"]; + } + 320 [label="Exit block"]; + } + 202 [label="Exit function test_7" style="filled" fillcolor=red]; + } + 201 -> {203}; 203 -> {204}; 204 -> {205}; 205 -> {206}; @@ -703,100 +744,116 @@ digraph boundSmartcastsInBranches_kt { 207 -> {208}; 208 -> {209}; 209 -> {210}; - 210 -> {211}; - 211 -> {196}; - 212 -> {196}; - 213 -> {215}; - 214 -> {231}; + 210 -> {212}; + 211 -> {228}; + 212 -> {213}; + 213 -> {214}; + 214 -> {215}; 215 -> {216}; - 216 -> {217}; + 216 -> {217 227}; 217 -> {218}; 218 -> {219}; - 219 -> {220 230}; + 219 -> {220}; 220 -> {221}; 221 -> {222}; 222 -> {223}; 223 -> {224}; 224 -> {225}; 225 -> {226}; - 226 -> {227}; - 227 -> {228}; - 228 -> {229}; - 229 -> {214}; - 230 -> {214}; - 231 -> {233}; - 232 -> {249}; + 226 -> {211}; + 227 -> {211}; + 228 -> {230}; + 229 -> {246}; + 230 -> {231}; + 231 -> {232}; + 232 -> {233}; 233 -> {234}; - 234 -> {235}; + 234 -> {235 245}; 235 -> {236}; 236 -> {237}; - 237 -> {238 248}; + 237 -> {238}; 238 -> {239}; 239 -> {240}; 240 -> {241}; 241 -> {242}; 242 -> {243}; 243 -> {244}; - 244 -> {245}; - 245 -> {246}; - 246 -> {247}; - 247 -> {232}; - 248 -> {232}; + 244 -> {229}; + 245 -> {229}; + 246 -> {248}; + 247 -> {264}; + 248 -> {249}; 249 -> {250}; 250 -> {251}; - 251 -> {253}; - 252 -> {269}; + 251 -> {252}; + 252 -> {253 263}; 253 -> {254}; 254 -> {255}; 255 -> {256}; 256 -> {257}; - 257 -> {258 268}; + 257 -> {258}; 258 -> {259}; 259 -> {260}; 260 -> {261}; 261 -> {262}; - 262 -> {263}; - 263 -> {264}; + 262 -> {247}; + 263 -> {247}; 264 -> {265}; 265 -> {266}; - 266 -> {267}; - 267 -> {252}; - 268 -> {252}; - 269 -> {271}; - 270 -> {287}; + 266 -> {268}; + 267 -> {284}; + 268 -> {269}; + 269 -> {270}; + 270 -> {271}; 271 -> {272}; - 272 -> {273}; + 272 -> {273 283}; 273 -> {274}; 274 -> {275}; - 275 -> {276 286}; + 275 -> {276}; 276 -> {277}; 277 -> {278}; 278 -> {279}; 279 -> {280}; 280 -> {281}; 281 -> {282}; - 282 -> {283}; - 283 -> {284}; - 284 -> {285}; - 285 -> {270}; - 286 -> {270}; - 287 -> {289}; - 288 -> {188}; + 282 -> {267}; + 283 -> {267}; + 284 -> {286}; + 285 -> {302}; + 286 -> {287}; + 287 -> {288}; + 288 -> {289}; 289 -> {290}; - 290 -> {291}; + 290 -> {291 301}; 291 -> {292}; 292 -> {293}; - 293 -> {294 304}; + 293 -> {294}; 294 -> {295}; 295 -> {296}; 296 -> {297}; 297 -> {298}; 298 -> {299}; 299 -> {300}; - 300 -> {301}; - 301 -> {302}; - 302 -> {303}; - 303 -> {288}; - 304 -> {288}; + 300 -> {285}; + 301 -> {285}; + 302 -> {304}; + 303 -> {320}; + 304 -> {305}; + 305 -> {306}; + 306 -> {307}; + 307 -> {308}; + 308 -> {309 319}; + 309 -> {310}; + 310 -> {311}; + 311 -> {312}; + 312 -> {313}; + 313 -> {314}; + 314 -> {315}; + 315 -> {316}; + 316 -> {317}; + 317 -> {318}; + 318 -> {303}; + 319 -> {303}; + 320 -> {202}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot index ae788eac039..4925d1ed579 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/boundSmartcasts/functionCallBound.dot @@ -14,10 +14,10 @@ digraph functionCallBound_kt { subgraph cluster_1 { color=red - 3 [label="Enter class Base" style="filled" fillcolor=red]; - 4 [label="Exit class Base" style="filled" fillcolor=red]; + 4 [label="Enter class Base" style="filled" fillcolor=red]; + 3 [label="Exit class Base" style="filled" fillcolor=red]; } - 3 -> {4} [color=green]; + 4 -> {3} [color=green]; subgraph cluster_2 { color=red @@ -30,83 +30,94 @@ digraph functionCallBound_kt { subgraph cluster_3 { color=red - 13 [label="Enter class Sub" style="filled" fillcolor=red]; - subgraph cluster_4 { - color=blue - 8 [label="Enter function getter" style="filled" fillcolor=red]; - 9 [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]; + } + 8 -> {9}; + + subgraph cluster_4 { + color=red + 14 [label="Enter class Sub" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue 10 [label="Enter property" style="filled" fillcolor=red]; 12 [label="Access variable R|/data|"]; 11 [label="Exit property" style="filled" fillcolor=red]; } - 14 [label="Exit class Sub" style="filled" fillcolor=red]; + 13 [label="Exit class Sub" style="filled" fillcolor=red]; } - 13 -> {10} [color=green]; + 14 -> {10} [color=green]; 10 -> {12}; - 11 -> {14} [color=green]; + 11 -> {13} [color=green]; 12 -> {11}; - 8 -> {9}; subgraph cluster_6 { color=red 15 [label="Enter function isOk" style="filled" fillcolor=red]; - 17 [label="Const: Boolean(true)"]; - 18 [label="Jump: ^isOk Boolean(true)"]; - 19 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_7 { + color=blue + 17 [label="Enter block"]; + 18 [label="Const: Boolean(true)"]; + 19 [label="Jump: ^isOk Boolean(true)"]; + 20 [label="Stub" style="filled" fillcolor=gray]; + 21 [label="Exit block" style="filled" fillcolor=gray]; + } 16 [label="Exit function isOk" style="filled" fillcolor=red]; } 15 -> {17}; 17 -> {18}; - 18 -> {16}; - 18 -> {19} [style=dotted]; - 19 -> {16} [style=dotted]; + 18 -> {19}; + 19 -> {16}; + 19 -> {20} [style=dotted]; + 20 -> {21} [style=dotted]; + 21 -> {16} [style=dotted]; - subgraph cluster_7 { + subgraph cluster_8 { color=red - 20 [label="Enter function check" style="filled" fillcolor=red]; - subgraph cluster_8 { + 22 [label="Enter function check" style="filled" fillcolor=red]; + subgraph cluster_9 { color=blue - 22 [label="Enter when"]; - subgraph cluster_9 { - color=blue - 24 [label="Enter when branch condition "]; - 25 [label="Access variable R|/base|"]; - 26 [label="Type operator: (R|/base| as? R|Sub|)"]; - 27 [label="Enter safe call"]; - 29 [label="Function call: $subj$.R|/isOk|()"]; - 28 [label="Exit safe call"]; - 30 [label="Const: Boolean(true)"]; - 31 [label="Operator =="]; - 32 [label="Exit when branch condition"]; - } + 24 [label="Enter block"]; subgraph cluster_10 { color=blue - 39 [label="Enter when branch condition else"]; - 40 [label="Exit when branch condition"]; + 25 [label="Enter when"]; + subgraph cluster_11 { + color=blue + 27 [label="Enter when branch condition "]; + 28 [label="Access variable R|/base|"]; + 29 [label="Type operator: (R|/base| as? R|Sub|)"]; + 30 [label="Enter safe call"]; + 32 [label="Function call: $subj$.R|/isOk|()"]; + 31 [label="Exit safe call"]; + 33 [label="Const: Boolean(true)"]; + 34 [label="Operator =="]; + 35 [label="Exit when branch condition"]; + } + subgraph cluster_12 { + color=blue + 42 [label="Enter when branch condition else"]; + 43 [label="Exit when branch condition"]; + } + 44 [label="Enter when branch result"]; + subgraph cluster_13 { + color=blue + 45 [label="Enter block"]; + 46 [label="Access variable R|/base|"]; + 47 [label="Exit block"]; + } + 48 [label="Exit when branch result"]; + 36 [label="Enter when branch result"]; + subgraph cluster_14 { + color=blue + 37 [label="Enter block"]; + 38 [label="Access variable R|/base|"]; + 39 [label="Access variable R|/Sub.data|"]; + 40 [label="Exit block"]; + } + 41 [label="Exit when branch result"]; + 26 [label="Exit when"]; } - 41 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 42 [label="Enter block"]; - 43 [label="Access variable R|/base|"]; - 44 [label="Exit block"]; - } - 45 [label="Exit when branch result"]; - 33 [label="Enter when branch result"]; - subgraph cluster_12 { - color=blue - 34 [label="Enter block"]; - 35 [label="Access variable R|/base|"]; - 36 [label="Access variable R|/Sub.data|"]; - 37 [label="Exit block"]; - } - 38 [label="Exit when branch result"]; - 23 [label="Exit when"]; - } - 46 [label="Jump: ^check when () { + 49 [label="Jump: ^check when () { ==((R|/base| as? R|Sub|)?.{ $subj$.R|/isOk|() }, Boolean(true)) -> { R|/base|.R|/Sub.data| } @@ -115,36 +126,40 @@ digraph functionCallBound_kt { } } "]; - 47 [label="Stub" style="filled" fillcolor=gray]; - 21 [label="Exit function check" style="filled" fillcolor=red]; + 50 [label="Stub" style="filled" fillcolor=gray]; + 51 [label="Exit block" style="filled" fillcolor=gray]; + } + 23 [label="Exit function check" style="filled" fillcolor=red]; } - 20 -> {22}; 22 -> {24}; - 23 -> {46}; 24 -> {25}; - 25 -> {26}; - 26 -> {27 28}; - 27 -> {29}; - 28 -> {30}; - 29 -> {28}; - 30 -> {31}; - 31 -> {32}; - 32 -> {33 39}; + 25 -> {27}; + 26 -> {49}; + 27 -> {28}; + 28 -> {29}; + 29 -> {30 31}; + 30 -> {32}; + 31 -> {33}; + 32 -> {31}; 33 -> {34}; 34 -> {35}; - 35 -> {36}; + 35 -> {36 42}; 36 -> {37}; 37 -> {38}; - 38 -> {23}; + 38 -> {39}; 39 -> {40}; 40 -> {41}; - 41 -> {42}; + 41 -> {26}; 42 -> {43}; 43 -> {44}; 44 -> {45}; - 45 -> {23}; - 46 -> {21}; - 46 -> {47} [style=dotted]; - 47 -> {21} [style=dotted]; + 45 -> {46}; + 46 -> {47}; + 47 -> {48}; + 48 -> {26}; + 49 -> {23}; + 49 -> {50} [style=dotted]; + 50 -> {51} [style=dotted]; + 51 -> {23} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/casts.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/casts.dot index db014223517..a00a80cd71b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/casts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/casts.dot @@ -6,362 +6,390 @@ digraph casts_kt { subgraph cluster_0 { color=red 0 [label="Enter function test_1" style="filled" fillcolor=red]; - 2 [label="Access variable R|/x|"]; - 3 [label="Type operator: (R|/x| as R|kotlin/String|)"]; - 4 [label="Access variable R|/x|"]; - 5 [label="Access variable R|kotlin/String.length|"]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Access variable R|/x|"]; + 4 [label="Type operator: (R|/x| as R|kotlin/String|)"]; + 5 [label="Access variable R|/x|"]; + 6 [label="Access variable R|kotlin/String.length|"]; + 7 [label="Exit block"]; + } 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; 2 -> {3}; 3 -> {4}; 4 -> {5}; - 5 -> {1}; + 5 -> {6}; + 6 -> {7}; + 7 -> {1}; - subgraph cluster_1 { + subgraph cluster_2 { color=red - 6 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_2 { + 8 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_3 { color=blue - 8 [label="Enter when"]; - subgraph cluster_3 { - color=blue - 10 [label="Enter when branch condition "]; - 11 [label="Access variable R|/x|"]; - 12 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; - 13 [label="Exit when branch condition"]; - } - 20 [label="Synthetic else branch"]; - 14 [label="Enter when branch result"]; + 10 [label="Enter block"]; subgraph cluster_4 { color=blue - 15 [label="Enter block"]; - 16 [label="Access variable R|/x|"]; - 17 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; - 18 [label="Exit block"]; + 11 [label="Enter when"]; + subgraph cluster_5 { + color=blue + 13 [label="Enter when branch condition "]; + 14 [label="Access variable R|/x|"]; + 15 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; + 16 [label="Exit when branch condition"]; + } + 23 [label="Synthetic else branch"]; + 17 [label="Enter when branch result"]; + subgraph cluster_6 { + color=blue + 18 [label="Enter block"]; + 19 [label="Access variable R|/x|"]; + 20 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; + 21 [label="Exit block"]; + } + 22 [label="Exit when branch result"]; + 12 [label="Exit when"]; } - 19 [label="Exit when branch result"]; - 9 [label="Exit when"]; + 24 [label="Access variable R|/x|"]; + 25 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; + 26 [label="Exit block"]; } - 21 [label="Access variable R|/x|"]; - 22 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; - 7 [label="Exit function test_2" style="filled" fillcolor=red]; + 9 [label="Exit function test_2" style="filled" fillcolor=red]; } - 6 -> {8}; 8 -> {10}; - 9 -> {21}; 10 -> {11}; - 11 -> {12}; - 12 -> {13}; - 13 -> {14 20}; + 11 -> {13}; + 12 -> {24}; + 13 -> {14}; 14 -> {15}; 15 -> {16}; - 16 -> {17}; + 16 -> {17 23}; 17 -> {18}; 18 -> {19}; - 19 -> {9}; - 20 -> {9}; + 19 -> {20}; + 20 -> {21}; 21 -> {22}; - 22 -> {7}; + 22 -> {12}; + 23 -> {12}; + 24 -> {25}; + 25 -> {26}; + 26 -> {9}; - subgraph cluster_5 { + subgraph cluster_7 { color=red - 23 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_6 { + 27 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_8 { color=blue - 25 [label="Enter when"]; - subgraph cluster_7 { - color=blue - 27 [label="Enter when branch condition "]; - subgraph cluster_8 { - color=blue - 29 [label="Enter &&"]; - 30 [label="Access variable R|/b|"]; - 31 [label="Exit left part of &&"]; - 32 [label="Enter right part of &&"]; - 33 [label="Access variable R|/x|"]; - 34 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; - 28 [label="Exit &&"]; - } - 35 [label="Exit when branch condition"]; - } - 42 [label="Synthetic else branch"]; - 36 [label="Enter when branch result"]; + 29 [label="Enter block"]; subgraph cluster_9 { color=blue - 37 [label="Enter block"]; - 38 [label="Access variable R|/x|"]; - 39 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; - 40 [label="Exit block"]; - } - 41 [label="Exit when branch result"]; - 26 [label="Exit when"]; - } - 43 [label="Access variable R|/x|"]; - 44 [label="Function call: R|/x|.#()"]; - subgraph cluster_10 { - color=blue - 45 [label="Enter when"]; - subgraph cluster_11 { - color=blue - 47 [label="Enter when branch condition "]; + 30 [label="Enter when"]; + subgraph cluster_10 { + color=blue + 32 [label="Enter when branch condition "]; + subgraph cluster_11 { + color=blue + 34 [label="Enter &&"]; + 35 [label="Access variable R|/b|"]; + 36 [label="Exit left part of &&"]; + 37 [label="Enter right part of &&"]; + 38 [label="Access variable R|/x|"]; + 39 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; + 33 [label="Exit &&"]; + } + 40 [label="Exit when branch condition"]; + } + 47 [label="Synthetic else branch"]; + 41 [label="Enter when branch result"]; subgraph cluster_12 { color=blue - 49 [label="Enter &&"]; - 50 [label="Access variable R|/b|"]; - 51 [label="Exit left part of &&"]; - 52 [label="Enter right part of &&"]; - 53 [label="Access variable R|/x|"]; - 54 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; - 55 [label="Const: Boolean(true)"]; - 56 [label="Operator =="]; - 48 [label="Exit &&"]; + 42 [label="Enter block"]; + 43 [label="Access variable R|/x|"]; + 44 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; + 45 [label="Exit block"]; } - 57 [label="Exit when branch condition"]; + 46 [label="Exit when branch result"]; + 31 [label="Exit when"]; } - 64 [label="Synthetic else branch"]; - 58 [label="Enter when branch result"]; + 48 [label="Access variable R|/x|"]; + 49 [label="Function call: R|/x|.#()"]; subgraph cluster_13 { color=blue - 59 [label="Enter block"]; - 60 [label="Access variable R|/x|"]; - 61 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; - 62 [label="Exit block"]; - } - 63 [label="Exit when branch result"]; - 46 [label="Exit when"]; - } - 65 [label="Access variable R|/x|"]; - 66 [label="Function call: R|/x|.#()"]; - subgraph cluster_14 { - color=blue - 67 [label="Enter when"]; - subgraph cluster_15 { - color=blue - 69 [label="Enter when branch condition "]; + 50 [label="Enter when"]; + subgraph cluster_14 { + color=blue + 52 [label="Enter when branch condition "]; + subgraph cluster_15 { + color=blue + 54 [label="Enter &&"]; + 55 [label="Access variable R|/b|"]; + 56 [label="Exit left part of &&"]; + 57 [label="Enter right part of &&"]; + 58 [label="Access variable R|/x|"]; + 59 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; + 60 [label="Const: Boolean(true)"]; + 61 [label="Operator =="]; + 53 [label="Exit &&"]; + } + 62 [label="Exit when branch condition"]; + } + 69 [label="Synthetic else branch"]; + 63 [label="Enter when branch result"]; subgraph cluster_16 { color=blue - 71 [label="Enter ||"]; - 72 [label="Access variable R|/b|"]; - 73 [label="Exit left part of ||"]; - 74 [label="Enter right part of ||"]; - 75 [label="Access variable R|/x|"]; - 76 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; - 70 [label="Exit ||"]; + 64 [label="Enter block"]; + 65 [label="Access variable R|/x|"]; + 66 [label="Function call: R|/x|.R|kotlin/Boolean.not|()"]; + 67 [label="Exit block"]; } - 77 [label="Exit when branch condition"]; + 68 [label="Exit when branch result"]; + 51 [label="Exit when"]; } - 84 [label="Synthetic else branch"]; - 78 [label="Enter when branch result"]; + 70 [label="Access variable R|/x|"]; + 71 [label="Function call: R|/x|.#()"]; subgraph cluster_17 { color=blue - 79 [label="Enter block"]; - 80 [label="Access variable R|/x|"]; - 81 [label="Function call: R|/x|.#()"]; - 82 [label="Exit block"]; + 72 [label="Enter when"]; + subgraph cluster_18 { + color=blue + 74 [label="Enter when branch condition "]; + subgraph cluster_19 { + color=blue + 76 [label="Enter ||"]; + 77 [label="Access variable R|/b|"]; + 78 [label="Exit left part of ||"]; + 79 [label="Enter right part of ||"]; + 80 [label="Access variable R|/x|"]; + 81 [label="Type operator: (R|/x| as R|kotlin/Boolean|)"]; + 75 [label="Exit ||"]; + } + 82 [label="Exit when branch condition"]; + } + 89 [label="Synthetic else branch"]; + 83 [label="Enter when branch result"]; + subgraph cluster_20 { + color=blue + 84 [label="Enter block"]; + 85 [label="Access variable R|/x|"]; + 86 [label="Function call: R|/x|.#()"]; + 87 [label="Exit block"]; + } + 88 [label="Exit when branch result"]; + 73 [label="Exit when"]; } - 83 [label="Exit when branch result"]; - 68 [label="Exit when"]; + 90 [label="Access variable R|/x|"]; + 91 [label="Function call: R|/x|.#()"]; + 92 [label="Exit block"]; } - 85 [label="Access variable R|/x|"]; - 86 [label="Function call: R|/x|.#()"]; - 24 [label="Exit function test_3" style="filled" fillcolor=red]; + 28 [label="Exit function test_3" style="filled" fillcolor=red]; } - 23 -> {25}; - 25 -> {27}; - 26 -> {43}; 27 -> {29}; - 28 -> {35}; 29 -> {30}; - 30 -> {31}; - 31 -> {28 32}; - 32 -> {33}; - 33 -> {34}; - 34 -> {28}; - 35 -> {36 42}; - 36 -> {37}; + 30 -> {32}; + 31 -> {48}; + 32 -> {34}; + 33 -> {40}; + 34 -> {35}; + 35 -> {36}; + 36 -> {33 37}; 37 -> {38}; 38 -> {39}; - 39 -> {40}; - 40 -> {41}; - 41 -> {26}; - 42 -> {26}; + 39 -> {33}; + 40 -> {41 47}; + 41 -> {42}; + 42 -> {43}; 43 -> {44}; 44 -> {45}; - 45 -> {47}; - 46 -> {65}; - 47 -> {49}; - 48 -> {57}; + 45 -> {46}; + 46 -> {31}; + 47 -> {31}; + 48 -> {49}; 49 -> {50}; - 50 -> {51}; - 51 -> {48 52}; - 52 -> {53}; - 53 -> {54}; + 50 -> {52}; + 51 -> {70}; + 52 -> {54}; + 53 -> {62}; 54 -> {55}; 55 -> {56}; - 56 -> {48}; - 57 -> {58 64}; + 56 -> {53 57}; + 57 -> {58}; 58 -> {59}; 59 -> {60}; 60 -> {61}; - 61 -> {62}; - 62 -> {63}; - 63 -> {46}; - 64 -> {46}; + 61 -> {53}; + 62 -> {63 69}; + 63 -> {64}; + 64 -> {65}; 65 -> {66}; 66 -> {67}; - 67 -> {69}; - 68 -> {85}; - 69 -> {71}; - 70 -> {77}; + 67 -> {68}; + 68 -> {51}; + 69 -> {51}; + 70 -> {71}; 71 -> {72}; - 72 -> {73}; - 73 -> {70 74}; - 74 -> {75}; - 75 -> {76}; - 76 -> {70}; - 77 -> {78 84}; - 78 -> {79}; + 72 -> {74}; + 73 -> {90}; + 74 -> {76}; + 75 -> {82}; + 76 -> {77}; + 77 -> {78}; + 78 -> {75 79}; 79 -> {80}; 80 -> {81}; - 81 -> {82}; - 82 -> {83}; - 83 -> {68}; - 84 -> {68}; + 81 -> {75}; + 82 -> {83 89}; + 83 -> {84}; + 84 -> {85}; 85 -> {86}; - 86 -> {24}; + 86 -> {87}; + 87 -> {88}; + 88 -> {73}; + 89 -> {73}; + 90 -> {91}; + 91 -> {92}; + 92 -> {28}; - subgraph cluster_18 { + subgraph cluster_21 { color=red - 87 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_19 { + 93 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_22 { color=blue - 89 [label="Enter when"]; - subgraph cluster_20 { - color=blue - 91 [label="Enter when branch condition "]; - 92 [label="Access variable R|/b|"]; - 93 [label="Type operator: (R|/b| as? R|kotlin/Boolean|)"]; - 94 [label="Const: Null(null)"]; - 95 [label="Operator !="]; - 96 [label="Exit when branch condition"]; - } - subgraph cluster_21 { - color=blue - 103 [label="Enter when branch condition else"]; - 104 [label="Exit when branch condition"]; - } - 105 [label="Enter when branch result"]; - subgraph cluster_22 { - color=blue - 106 [label="Enter block"]; - 107 [label="Access variable R|/b|"]; - 108 [label="Function call: R|/b|.#()"]; - 109 [label="Exit block"]; - } - 110 [label="Exit when branch result"]; - 97 [label="Enter when branch result"]; + 95 [label="Enter block"]; subgraph cluster_23 { color=blue - 98 [label="Enter block"]; - 99 [label="Access variable R|/b|"]; - 100 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 101 [label="Exit block"]; + 96 [label="Enter when"]; + subgraph cluster_24 { + color=blue + 98 [label="Enter when branch condition "]; + 99 [label="Access variable R|/b|"]; + 100 [label="Type operator: (R|/b| as? R|kotlin/Boolean|)"]; + 101 [label="Const: Null(null)"]; + 102 [label="Operator !="]; + 103 [label="Exit when branch condition"]; + } + subgraph cluster_25 { + color=blue + 110 [label="Enter when branch condition else"]; + 111 [label="Exit when branch condition"]; + } + 112 [label="Enter when branch result"]; + subgraph cluster_26 { + color=blue + 113 [label="Enter block"]; + 114 [label="Access variable R|/b|"]; + 115 [label="Function call: R|/b|.#()"]; + 116 [label="Exit block"]; + } + 117 [label="Exit when branch result"]; + 104 [label="Enter when branch result"]; + subgraph cluster_27 { + color=blue + 105 [label="Enter block"]; + 106 [label="Access variable R|/b|"]; + 107 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 108 [label="Exit block"]; + } + 109 [label="Exit when branch result"]; + 97 [label="Exit when"]; } - 102 [label="Exit when branch result"]; - 90 [label="Exit when"]; - } - 111 [label="Access variable R|/b|"]; - 112 [label="Function call: R|/b|.#()"]; - subgraph cluster_24 { - color=blue - 113 [label="Enter when"]; - subgraph cluster_25 { - color=blue - 115 [label="Enter when branch condition "]; - 116 [label="Access variable R|/b|"]; - 117 [label="Type operator: (R|/b| as? R|kotlin/Boolean|)"]; - 118 [label="Const: Null(null)"]; - 119 [label="Operator =="]; - 120 [label="Exit when branch condition"]; - } - subgraph cluster_26 { - color=blue - 127 [label="Enter when branch condition else"]; - 128 [label="Exit when branch condition"]; - } - 129 [label="Enter when branch result"]; - subgraph cluster_27 { - color=blue - 130 [label="Enter block"]; - 131 [label="Access variable R|/b|"]; - 132 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 133 [label="Exit block"]; - } - 134 [label="Exit when branch result"]; - 121 [label="Enter when branch result"]; + 118 [label="Access variable R|/b|"]; + 119 [label="Function call: R|/b|.#()"]; subgraph cluster_28 { color=blue - 122 [label="Enter block"]; - 123 [label="Access variable R|/b|"]; - 124 [label="Function call: R|/b|.#()"]; - 125 [label="Exit block"]; + 120 [label="Enter when"]; + subgraph cluster_29 { + color=blue + 122 [label="Enter when branch condition "]; + 123 [label="Access variable R|/b|"]; + 124 [label="Type operator: (R|/b| as? R|kotlin/Boolean|)"]; + 125 [label="Const: Null(null)"]; + 126 [label="Operator =="]; + 127 [label="Exit when branch condition"]; + } + subgraph cluster_30 { + color=blue + 134 [label="Enter when branch condition else"]; + 135 [label="Exit when branch condition"]; + } + 136 [label="Enter when branch result"]; + subgraph cluster_31 { + color=blue + 137 [label="Enter block"]; + 138 [label="Access variable R|/b|"]; + 139 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 140 [label="Exit block"]; + } + 141 [label="Exit when branch result"]; + 128 [label="Enter when branch result"]; + subgraph cluster_32 { + color=blue + 129 [label="Enter block"]; + 130 [label="Access variable R|/b|"]; + 131 [label="Function call: R|/b|.#()"]; + 132 [label="Exit block"]; + } + 133 [label="Exit when branch result"]; + 121 [label="Exit when"]; } - 126 [label="Exit when branch result"]; - 114 [label="Exit when"]; + 142 [label="Access variable R|/b|"]; + 143 [label="Function call: R|/b|.#()"]; + 144 [label="Exit block"]; } - 135 [label="Access variable R|/b|"]; - 136 [label="Function call: R|/b|.#()"]; - 88 [label="Exit function test_4" style="filled" fillcolor=red]; + 94 [label="Exit function test_4" style="filled" fillcolor=red]; } - 87 -> {89}; - 89 -> {91}; - 90 -> {111}; - 91 -> {92}; - 92 -> {93}; - 93 -> {94}; - 94 -> {95}; + 93 -> {95}; 95 -> {96}; - 96 -> {97 103}; - 97 -> {98}; + 96 -> {98}; + 97 -> {118}; 98 -> {99}; 99 -> {100}; 100 -> {101}; 101 -> {102}; - 102 -> {90}; - 103 -> {104}; + 102 -> {103}; + 103 -> {104 110}; 104 -> {105}; 105 -> {106}; 106 -> {107}; 107 -> {108}; 108 -> {109}; - 109 -> {110}; - 110 -> {90}; + 109 -> {97}; + 110 -> {111}; 111 -> {112}; 112 -> {113}; - 113 -> {115}; - 114 -> {135}; + 113 -> {114}; + 114 -> {115}; 115 -> {116}; 116 -> {117}; - 117 -> {118}; + 117 -> {97}; 118 -> {119}; 119 -> {120}; - 120 -> {121 127}; - 121 -> {122}; + 120 -> {122}; + 121 -> {142}; 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {114}; - 127 -> {128}; + 126 -> {127}; + 127 -> {128 134}; 128 -> {129}; 129 -> {130}; 130 -> {131}; 131 -> {132}; 132 -> {133}; - 133 -> {134}; - 134 -> {114}; + 133 -> {121}; + 134 -> {135}; 135 -> {136}; - 136 -> {88}; + 136 -> {137}; + 137 -> {138}; + 138 -> {139}; + 139 -> {140}; + 140 -> {141}; + 141 -> {121}; + 142 -> {143}; + 143 -> {144}; + 144 -> {94}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot index 25a4b243ed0..aba1d2ff3e6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/elvis.dot @@ -12,211 +12,215 @@ digraph elvis_kt { subgraph cluster_1 { color=red - 6 [label="Enter class A" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 2 [label="Enter function getter" style="filled" fillcolor=red]; - 3 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_3 { - color=blue - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Exit property" style="filled" fillcolor=red]; - } - 7 [label="Exit class A" style="filled" fillcolor=red]; + 2 [label="Enter function getter" style="filled" fillcolor=red]; + 3 [label="Exit function getter" style="filled" fillcolor=red]; } - 6 -> {4} [color=green]; - 4 -> {5}; - 5 -> {7} [color=green]; 2 -> {3}; - subgraph cluster_4 { + subgraph cluster_2 { color=red - 8 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_5 { - color=blue - 10 [label="Enter when"]; - subgraph cluster_6 { - color=blue - 12 [label="Enter when branch condition "]; - subgraph cluster_7 { - color=blue - 13 [label="Enter when"]; - 15 [label="Access variable R|/x|"]; - 16 [label="Enter safe call"]; - 18 [label="Access variable R|/A.b|"]; - 17 [label="Exit safe call"]; - 19 [label="Variable declaration: lval : R|kotlin/Boolean?|"]; - subgraph cluster_8 { - color=blue - 20 [label="Enter when branch condition "]; - 21 [label="Const: Null(null)"]; - 22 [label="Operator =="]; - 23 [label="Exit when branch condition"]; - } - subgraph cluster_9 { - color=blue - 30 [label="Enter when branch condition else"]; - 31 [label="Exit when branch condition"]; - } - 32 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 33 [label="Enter block"]; - 34 [label="Access variable R|/|"]; - 35 [label="Exit block"]; - } - 36 [label="Exit when branch result"]; - 24 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 25 [label="Enter block"]; - 26 [label="Jump: ^test_1 Unit"]; - 27 [label="Stub" style="filled" fillcolor=gray]; - 28 [label="Exit block" style="filled" fillcolor=gray]; - } - 29 [label="Exit when branch result" style="filled" fillcolor=gray]; - 14 [label="Exit when"]; - } - 37 [label="Exit when branch condition"]; - } - 44 [label="Synthetic else branch"]; - 38 [label="Enter when branch result"]; - subgraph cluster_12 { - color=blue - 39 [label="Enter block"]; - 40 [label="Access variable R|/x|"]; - 41 [label="Function call: R|/x|.R|/A.foo|()"]; - 42 [label="Exit block"]; - } - 43 [label="Exit when branch result"]; - 11 [label="Exit when"]; - } - 9 [label="Exit function test_1" style="filled" fillcolor=red]; + 5 [label="Enter class A" style="filled" fillcolor=red]; + 4 [label="Exit class A" style="filled" fillcolor=red]; } - 8 -> {10}; - 10 -> {12}; - 11 -> {9}; - 12 -> {13}; - 13 -> {15}; - 14 -> {37}; - 15 -> {16 17}; + 5 -> {4} [color=green]; + + subgraph cluster_3 { + color=red + 6 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_4 { + color=blue + 8 [label="Enter block"]; + subgraph cluster_5 { + color=blue + 9 [label="Enter when"]; + subgraph cluster_6 { + color=blue + 11 [label="Enter when branch condition "]; + subgraph cluster_7 { + color=blue + 12 [label="Enter when"]; + 14 [label="Access variable R|/x|"]; + 15 [label="Enter safe call"]; + 17 [label="Access variable R|/A.b|"]; + 16 [label="Exit safe call"]; + 18 [label="Variable declaration: lval : R|kotlin/Boolean?|"]; + subgraph cluster_8 { + color=blue + 19 [label="Enter when branch condition "]; + 20 [label="Const: Null(null)"]; + 21 [label="Operator =="]; + 22 [label="Exit when branch condition"]; + } + subgraph cluster_9 { + color=blue + 29 [label="Enter when branch condition else"]; + 30 [label="Exit when branch condition"]; + } + 31 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 32 [label="Enter block"]; + 33 [label="Access variable R|/|"]; + 34 [label="Exit block"]; + } + 35 [label="Exit when branch result"]; + 23 [label="Enter when branch result"]; + subgraph cluster_11 { + color=blue + 24 [label="Enter block"]; + 25 [label="Jump: ^test_1 Unit"]; + 26 [label="Stub" style="filled" fillcolor=gray]; + 27 [label="Exit block" style="filled" fillcolor=gray]; + } + 28 [label="Exit when branch result" style="filled" fillcolor=gray]; + 13 [label="Exit when"]; + } + 36 [label="Exit when branch condition"]; + } + 43 [label="Synthetic else branch"]; + 37 [label="Enter when branch result"]; + subgraph cluster_12 { + color=blue + 38 [label="Enter block"]; + 39 [label="Access variable R|/x|"]; + 40 [label="Function call: R|/x|.R|/A.foo|()"]; + 41 [label="Exit block"]; + } + 42 [label="Exit when branch result"]; + 10 [label="Exit when"]; + } + 44 [label="Exit block"]; + } + 7 [label="Exit function test_1" style="filled" fillcolor=red]; + } + 6 -> {8}; + 8 -> {9}; + 9 -> {11}; + 10 -> {44}; + 11 -> {12}; + 12 -> {14}; + 13 -> {36}; + 14 -> {15 16}; + 15 -> {17}; 16 -> {18}; - 17 -> {19}; - 18 -> {17}; + 17 -> {16}; + 18 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {23}; - 23 -> {24 30}; + 22 -> {23 29}; + 23 -> {24}; 24 -> {25}; - 25 -> {26}; - 26 -> {9}; + 25 -> {7}; + 25 -> {26} [style=dotted]; 26 -> {27} [style=dotted]; 27 -> {28} [style=dotted]; - 28 -> {29} [style=dotted]; - 29 -> {14} [style=dotted]; + 28 -> {13} [style=dotted]; + 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; 34 -> {35}; - 35 -> {36}; - 36 -> {14}; - 37 -> {38 44}; + 35 -> {13}; + 36 -> {37 43}; + 37 -> {38}; 38 -> {39}; 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {43}; - 43 -> {11}; - 44 -> {11}; + 42 -> {10}; + 43 -> {10}; + 44 -> {7}; subgraph cluster_13 { color=red 45 [label="Enter function test2" style="filled" fillcolor=red]; subgraph cluster_14 { color=blue - 47 [label="Enter when"]; + 47 [label="Enter block"]; subgraph cluster_15 { color=blue - 49 [label="Enter when branch condition "]; - 50 [label="Access variable R|/b|"]; - 51 [label="Type operator: (R|/b| !is R|kotlin/String|)"]; - 52 [label="Exit when branch condition"]; + 48 [label="Enter when"]; + subgraph cluster_16 { + color=blue + 50 [label="Enter when branch condition "]; + 51 [label="Access variable R|/b|"]; + 52 [label="Type operator: (R|/b| !is R|kotlin/String|)"]; + 53 [label="Exit when branch condition"]; + } + 61 [label="Synthetic else branch"]; + 54 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 55 [label="Enter block"]; + 56 [label="Const: String()"]; + 57 [label="Jump: ^test2 String()"]; + 58 [label="Stub" style="filled" fillcolor=gray]; + 59 [label="Exit block" style="filled" fillcolor=gray]; + } + 60 [label="Exit when branch result" style="filled" fillcolor=gray]; + 49 [label="Exit when"]; } - 60 [label="Synthetic else branch"]; - 53 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 54 [label="Enter block"]; - 55 [label="Const: String()"]; - 56 [label="Jump: ^test2 String()"]; - 57 [label="Stub" style="filled" fillcolor=gray]; - 58 [label="Exit block" style="filled" fillcolor=gray]; - } - 59 [label="Exit when branch result" style="filled" fillcolor=gray]; - 48 [label="Exit when"]; - } - subgraph cluster_17 { - color=blue - 61 [label="Enter when"]; subgraph cluster_18 { color=blue - 63 [label="Enter when branch condition "]; - 64 [label="Access variable R|/a|"]; - 65 [label="Type operator: (R|/a| !is R|kotlin/String?|)"]; - 66 [label="Exit when branch condition"]; + 62 [label="Enter when"]; + subgraph cluster_19 { + color=blue + 64 [label="Enter when branch condition "]; + 65 [label="Access variable R|/a|"]; + 66 [label="Type operator: (R|/a| !is R|kotlin/String?|)"]; + 67 [label="Exit when branch condition"]; + } + 75 [label="Synthetic else branch"]; + 68 [label="Enter when branch result"]; + subgraph cluster_20 { + color=blue + 69 [label="Enter block"]; + 70 [label="Const: String()"]; + 71 [label="Jump: ^test2 String()"]; + 72 [label="Stub" style="filled" fillcolor=gray]; + 73 [label="Exit block" style="filled" fillcolor=gray]; + } + 74 [label="Exit when branch result" style="filled" fillcolor=gray]; + 63 [label="Exit when"]; } - 74 [label="Synthetic else branch"]; - 67 [label="Enter when branch result"]; - subgraph cluster_19 { - color=blue - 68 [label="Enter block"]; - 69 [label="Const: String()"]; - 70 [label="Jump: ^test2 String()"]; - 71 [label="Stub" style="filled" fillcolor=gray]; - 72 [label="Exit block" style="filled" fillcolor=gray]; - } - 73 [label="Exit when branch result" style="filled" fillcolor=gray]; - 62 [label="Exit when"]; - } - subgraph cluster_20 { - color=blue - 75 [label="Enter when"]; - 77 [label="Access variable R|/a|"]; - 78 [label="Variable declaration: lval : R|kotlin/String?|"]; subgraph cluster_21 { color=blue - 79 [label="Enter when branch condition "]; - 80 [label="Const: Null(null)"]; - 81 [label="Operator =="]; - 82 [label="Exit when branch condition"]; + 76 [label="Enter when"]; + 78 [label="Access variable R|/a|"]; + 79 [label="Variable declaration: lval : R|kotlin/String?|"]; + subgraph cluster_22 { + color=blue + 80 [label="Enter when branch condition "]; + 81 [label="Const: Null(null)"]; + 82 [label="Operator =="]; + 83 [label="Exit when branch condition"]; + } + subgraph cluster_23 { + color=blue + 89 [label="Enter when branch condition else"]; + 90 [label="Exit when branch condition"]; + } + 91 [label="Enter when branch result"]; + subgraph cluster_24 { + color=blue + 92 [label="Enter block"]; + 93 [label="Access variable R|/|"]; + 94 [label="Exit block"]; + } + 95 [label="Exit when branch result"]; + 84 [label="Enter when branch result"]; + subgraph cluster_25 { + color=blue + 85 [label="Enter block"]; + 86 [label="Access variable R|/b|"]; + 87 [label="Exit block"]; + } + 88 [label="Exit when branch result"]; + 77 [label="Exit when"]; } - subgraph cluster_22 { - color=blue - 88 [label="Enter when branch condition else"]; - 89 [label="Exit when branch condition"]; - } - 90 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 91 [label="Enter block"]; - 92 [label="Access variable R|/|"]; - 93 [label="Exit block"]; - } - 94 [label="Exit when branch result"]; - 83 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 84 [label="Enter block"]; - 85 [label="Access variable R|/b|"]; - 86 [label="Exit block"]; - } - 87 [label="Exit when branch result"]; - 76 [label="Exit when"]; - } - 95 [label="Jump: ^test2 when (lval : R|kotlin/String?| = R|/a|) { + 96 [label="Jump: ^test2 when (lval : R|kotlin/String?| = R|/a|) { ==($subj$, Null(null)) -> { R|/b| } @@ -225,62 +229,66 @@ digraph elvis_kt { } } "]; - 96 [label="Stub" style="filled" fillcolor=gray]; + 97 [label="Stub" style="filled" fillcolor=gray]; + 98 [label="Exit block" style="filled" fillcolor=gray]; + } 46 [label="Exit function test2" style="filled" fillcolor=red]; } 45 -> {47}; - 47 -> {49}; - 48 -> {61}; - 49 -> {50}; + 47 -> {48}; + 48 -> {50}; + 49 -> {62}; 50 -> {51}; 51 -> {52}; - 52 -> {53 60}; - 53 -> {54}; + 52 -> {53}; + 53 -> {54 61}; 54 -> {55}; 55 -> {56}; - 56 -> {46}; - 56 -> {57} [style=dotted]; + 56 -> {57}; + 57 -> {46}; 57 -> {58} [style=dotted]; 58 -> {59} [style=dotted]; - 59 -> {48} [style=dotted]; - 60 -> {48}; - 61 -> {63}; - 62 -> {75}; - 63 -> {64}; + 59 -> {60} [style=dotted]; + 60 -> {49} [style=dotted]; + 61 -> {49}; + 62 -> {64}; + 63 -> {76}; 64 -> {65}; 65 -> {66}; - 66 -> {67 74}; - 67 -> {68}; + 66 -> {67}; + 67 -> {68 75}; 68 -> {69}; 69 -> {70}; - 70 -> {46}; - 70 -> {71} [style=dotted]; + 70 -> {71}; + 71 -> {46}; 71 -> {72} [style=dotted]; 72 -> {73} [style=dotted]; - 73 -> {62} [style=dotted]; - 74 -> {62}; - 75 -> {77}; - 76 -> {95}; - 77 -> {78}; + 73 -> {74} [style=dotted]; + 74 -> {63} [style=dotted]; + 75 -> {63}; + 76 -> {78}; + 77 -> {96}; 78 -> {79}; 79 -> {80}; 80 -> {81}; 81 -> {82}; - 82 -> {83 88}; - 83 -> {84}; + 82 -> {83}; + 83 -> {84 89}; 84 -> {85}; 85 -> {86}; 86 -> {87}; - 87 -> {76}; - 88 -> {89}; + 87 -> {88}; + 88 -> {77}; 89 -> {90}; 90 -> {91}; 91 -> {92}; 92 -> {93}; 93 -> {94}; - 94 -> {76}; - 95 -> {46}; - 95 -> {96} [style=dotted]; - 96 -> {46} [style=dotted]; + 94 -> {95}; + 95 -> {77}; + 96 -> {46}; + 96 -> {97} [style=dotted]; + 97 -> {98} [style=dotted]; + 98 -> {46} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot index 4f3aaf03265..f103dd1e09f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/returns.dot @@ -8,481 +8,530 @@ digraph returns_kt { 0 [label="Enter function test_0" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Enter when branch condition "]; - 5 [label="Access variable R|/x|"]; - 6 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 7 [label="Exit when branch condition"]; + 3 [label="Enter when"]; + subgraph cluster_3 { + color=blue + 5 [label="Enter when branch condition "]; + 6 [label="Access variable R|/x|"]; + 7 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 8 [label="Exit when branch condition"]; + } + subgraph cluster_4 { + color=blue + 15 [label="Enter when branch condition else"]; + 16 [label="Exit when branch condition"]; + } + 17 [label="Enter when branch result"]; + subgraph cluster_5 { + color=blue + 18 [label="Enter block"]; + 19 [label="Exit block"]; + } + 20 [label="Exit when branch result"]; + 9 [label="Enter when branch result"]; + subgraph cluster_6 { + color=blue + 10 [label="Enter block"]; + 11 [label="Access variable R|/x|"]; + 12 [label="Access variable R|kotlin/String.length|"]; + 13 [label="Exit block"]; + } + 14 [label="Exit when branch result"]; + 4 [label="Exit when"]; } - subgraph cluster_3 { - color=blue - 14 [label="Enter when branch condition else"]; - 15 [label="Exit when branch condition"]; - } - 16 [label="Enter when branch result"]; - subgraph cluster_4 { - color=blue - 17 [label="Enter block"]; - 18 [label="Exit block"]; - } - 19 [label="Exit when branch result"]; - 8 [label="Enter when branch result"]; - subgraph cluster_5 { - color=blue - 9 [label="Enter block"]; - 10 [label="Access variable R|/x|"]; - 11 [label="Access variable R|kotlin/String.length|"]; - 12 [label="Exit block"]; - } - 13 [label="Exit when branch result"]; - 3 [label="Exit when"]; + 21 [label="Access variable R|/x|"]; + 22 [label="Access variable #"]; + 23 [label="Exit block"]; } - 20 [label="Access variable R|/x|"]; - 21 [label="Access variable #"]; 1 [label="Exit function test_0" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {20}; - 4 -> {5}; + 2 -> {3}; + 3 -> {5}; + 4 -> {21}; 5 -> {6}; 6 -> {7}; - 7 -> {8 14}; - 8 -> {9}; + 7 -> {8}; + 8 -> {9 15}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {3}; - 14 -> {15}; + 13 -> {14}; + 14 -> {4}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; - 19 -> {3}; - 20 -> {21}; - 21 -> {1}; + 19 -> {20}; + 20 -> {4}; + 21 -> {22}; + 22 -> {23}; + 23 -> {1}; - subgraph cluster_6 { + subgraph cluster_7 { color=red - 22 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_7 { + 24 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_8 { color=blue - 24 [label="Enter when"]; - subgraph cluster_8 { - color=blue - 26 [label="Enter when branch condition "]; - 27 [label="Access variable R|/x|"]; - 28 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 29 [label="Exit when branch condition"]; - } + 26 [label="Enter block"]; subgraph cluster_9 { color=blue - 36 [label="Enter when branch condition else"]; - 37 [label="Exit when branch condition"]; + 27 [label="Enter when"]; + subgraph cluster_10 { + color=blue + 29 [label="Enter when branch condition "]; + 30 [label="Access variable R|/x|"]; + 31 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 32 [label="Exit when branch condition"]; + } + subgraph cluster_11 { + color=blue + 39 [label="Enter when branch condition else"]; + 40 [label="Exit when branch condition"]; + } + 41 [label="Enter when branch result"]; + subgraph cluster_12 { + color=blue + 42 [label="Enter block"]; + 43 [label="Jump: ^test_1 Unit"]; + 44 [label="Stub" style="filled" fillcolor=gray]; + 45 [label="Exit block" style="filled" fillcolor=gray]; + } + 46 [label="Exit when branch result" style="filled" fillcolor=gray]; + 33 [label="Enter when branch result"]; + subgraph cluster_13 { + color=blue + 34 [label="Enter block"]; + 35 [label="Access variable R|/x|"]; + 36 [label="Access variable R|kotlin/String.length|"]; + 37 [label="Exit block"]; + } + 38 [label="Exit when branch result"]; + 28 [label="Exit when"]; } - 38 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 39 [label="Enter block"]; - 40 [label="Jump: ^test_1 Unit"]; - 41 [label="Stub" style="filled" fillcolor=gray]; - 42 [label="Exit block" style="filled" fillcolor=gray]; - } - 43 [label="Exit when branch result" style="filled" fillcolor=gray]; - 30 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 31 [label="Enter block"]; - 32 [label="Access variable R|/x|"]; - 33 [label="Access variable R|kotlin/String.length|"]; - 34 [label="Exit block"]; - } - 35 [label="Exit when branch result"]; - 25 [label="Exit when"]; + 47 [label="Access variable R|/x|"]; + 48 [label="Access variable R|kotlin/String.length|"]; + 49 [label="Exit block"]; } - 44 [label="Access variable R|/x|"]; - 45 [label="Access variable R|kotlin/String.length|"]; - 23 [label="Exit function test_1" style="filled" fillcolor=red]; + 25 [label="Exit function test_1" style="filled" fillcolor=red]; } - 22 -> {24}; 24 -> {26}; - 25 -> {44}; 26 -> {27}; - 27 -> {28}; - 28 -> {29}; - 29 -> {30 36}; + 27 -> {29}; + 28 -> {47}; + 29 -> {30}; 30 -> {31}; 31 -> {32}; - 32 -> {33}; + 32 -> {33 39}; 33 -> {34}; 34 -> {35}; - 35 -> {25}; + 35 -> {36}; 36 -> {37}; 37 -> {38}; - 38 -> {39}; + 38 -> {28}; 39 -> {40}; - 40 -> {23}; - 40 -> {41} [style=dotted]; - 41 -> {42} [style=dotted]; - 42 -> {43} [style=dotted]; - 43 -> {25} [style=dotted]; - 44 -> {45}; - 45 -> {23}; - - subgraph cluster_12 { - color=red - 46 [label="Enter function foo" style="filled" fillcolor=red]; - 47 [label="Exit function foo" style="filled" fillcolor=red]; - } - 46 -> {47}; - - subgraph cluster_13 { - color=red - 48 [label="Enter class A" style="filled" fillcolor=red]; - 49 [label="Exit class A" style="filled" fillcolor=red]; - } - 48 -> {49} [color=green]; + 40 -> {41}; + 41 -> {42}; + 42 -> {43}; + 43 -> {25}; + 43 -> {44} [style=dotted]; + 44 -> {45} [style=dotted]; + 45 -> {46} [style=dotted]; + 46 -> {28} [style=dotted]; + 47 -> {48}; + 48 -> {49}; + 49 -> {25}; subgraph cluster_14 { color=red - 50 [label="Enter function bar" style="filled" fillcolor=red]; - 51 [label="Exit function bar" style="filled" fillcolor=red]; + 50 [label="Enter function foo" style="filled" fillcolor=red]; + 51 [label="Exit function foo" style="filled" fillcolor=red]; } 50 -> {51}; subgraph cluster_15 { color=red - 52 [label="Enter class B" style="filled" fillcolor=red]; - 53 [label="Exit class B" style="filled" fillcolor=red]; + 53 [label="Enter class A" style="filled" fillcolor=red]; + 52 [label="Exit class A" style="filled" fillcolor=red]; } - 52 -> {53} [color=green]; + 53 -> {52} [color=green]; subgraph cluster_16 { color=red - 54 [label="Enter function baz" style="filled" fillcolor=red]; - 55 [label="Exit function baz" style="filled" fillcolor=red]; + 54 [label="Enter function bar" style="filled" fillcolor=red]; + 55 [label="Exit function bar" style="filled" fillcolor=red]; } 54 -> {55}; subgraph cluster_17 { color=red - 56 [label="Enter class C" style="filled" fillcolor=red]; - 57 [label="Exit class C" style="filled" fillcolor=red]; + 57 [label="Enter class B" style="filled" fillcolor=red]; + 56 [label="Exit class B" style="filled" fillcolor=red]; } - 56 -> {57} [color=green]; + 57 -> {56} [color=green]; subgraph cluster_18 { color=red - 58 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_19 { + 58 [label="Enter function baz" style="filled" fillcolor=red]; + 59 [label="Exit function baz" style="filled" fillcolor=red]; + } + 58 -> {59}; + + subgraph cluster_19 { + color=red + 61 [label="Enter class C" style="filled" fillcolor=red]; + 60 [label="Exit class C" style="filled" fillcolor=red]; + } + 61 -> {60} [color=green]; + + subgraph cluster_20 { + color=red + 62 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_21 { color=blue - 60 [label="Enter when"]; - subgraph cluster_20 { - color=blue - 62 [label="Enter when branch condition "]; - 63 [label="Access variable R|/x|"]; - 64 [label="Type operator: (R|/x| is R|B|)"]; - 65 [label="Exit when branch condition"]; - } - subgraph cluster_21 { - color=blue - 72 [label="Enter when branch condition "]; - 73 [label="Access variable R|/x|"]; - 74 [label="Type operator: (R|/x| is R|C|)"]; - 75 [label="Exit when branch condition"]; - } + 64 [label="Enter block"]; subgraph cluster_22 { color=blue - 82 [label="Enter when branch condition else"]; - 83 [label="Exit when branch condition"]; + 65 [label="Enter when"]; + subgraph cluster_23 { + color=blue + 67 [label="Enter when branch condition "]; + 68 [label="Access variable R|/x|"]; + 69 [label="Type operator: (R|/x| is R|B|)"]; + 70 [label="Exit when branch condition"]; + } + subgraph cluster_24 { + color=blue + 77 [label="Enter when branch condition "]; + 78 [label="Access variable R|/x|"]; + 79 [label="Type operator: (R|/x| is R|C|)"]; + 80 [label="Exit when branch condition"]; + } + subgraph cluster_25 { + color=blue + 87 [label="Enter when branch condition else"]; + 88 [label="Exit when branch condition"]; + } + 89 [label="Enter when branch result"]; + subgraph cluster_26 { + color=blue + 90 [label="Enter block"]; + 91 [label="Jump: ^test_2 Unit"]; + 92 [label="Stub" style="filled" fillcolor=gray]; + 93 [label="Exit block" style="filled" fillcolor=gray]; + } + 94 [label="Exit when branch result" style="filled" fillcolor=gray]; + 81 [label="Enter when branch result"]; + subgraph cluster_27 { + color=blue + 82 [label="Enter block"]; + 83 [label="Access variable R|/x|"]; + 84 [label="Function call: R|/x|.R|/C.baz|()"]; + 85 [label="Exit block"]; + } + 86 [label="Exit when branch result"]; + 71 [label="Enter when branch result"]; + subgraph cluster_28 { + color=blue + 72 [label="Enter block"]; + 73 [label="Access variable R|/x|"]; + 74 [label="Function call: R|/x|.R|/B.bar|()"]; + 75 [label="Exit block"]; + } + 76 [label="Exit when branch result"]; + 66 [label="Exit when"]; } - 84 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 85 [label="Enter block"]; - 86 [label="Jump: ^test_2 Unit"]; - 87 [label="Stub" style="filled" fillcolor=gray]; - 88 [label="Exit block" style="filled" fillcolor=gray]; - } - 89 [label="Exit when branch result" style="filled" fillcolor=gray]; - 76 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 77 [label="Enter block"]; - 78 [label="Access variable R|/x|"]; - 79 [label="Function call: R|/x|.R|/C.baz|()"]; - 80 [label="Exit block"]; - } - 81 [label="Exit when branch result"]; - 66 [label="Enter when branch result"]; - subgraph cluster_25 { - color=blue - 67 [label="Enter block"]; - 68 [label="Access variable R|/x|"]; - 69 [label="Function call: R|/x|.R|/B.bar|()"]; - 70 [label="Exit block"]; - } - 71 [label="Exit when branch result"]; - 61 [label="Exit when"]; + 95 [label="Access variable R|/x|"]; + 96 [label="Function call: R|/x|.R|/A.foo|()"]; + 97 [label="Access variable R|/x|"]; + 98 [label="Function call: R|/x|.#()"]; + 99 [label="Access variable R|/x|"]; + 100 [label="Function call: R|/x|.#()"]; + 101 [label="Exit block"]; } - 90 [label="Access variable R|/x|"]; - 91 [label="Function call: R|/x|.R|/A.foo|()"]; - 92 [label="Access variable R|/x|"]; - 93 [label="Function call: R|/x|.#()"]; - 94 [label="Access variable R|/x|"]; - 95 [label="Function call: R|/x|.#()"]; - 59 [label="Exit function test_2" style="filled" fillcolor=red]; + 63 [label="Exit function test_2" style="filled" fillcolor=red]; } - 58 -> {60}; - 60 -> {62}; - 61 -> {90}; - 62 -> {63}; - 63 -> {64}; + 62 -> {64}; 64 -> {65}; - 65 -> {66 72}; - 66 -> {67}; + 65 -> {67}; + 66 -> {95}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {71}; - 71 -> {61}; + 70 -> {71 77}; + 71 -> {72}; 72 -> {73}; 73 -> {74}; 74 -> {75}; - 75 -> {76 82}; - 76 -> {77}; + 75 -> {76}; + 76 -> {66}; 77 -> {78}; 78 -> {79}; 79 -> {80}; - 80 -> {81}; - 81 -> {61}; + 80 -> {81 87}; + 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; 85 -> {86}; - 86 -> {59}; - 86 -> {87} [style=dotted]; - 87 -> {88} [style=dotted]; - 88 -> {89} [style=dotted]; - 89 -> {61} [style=dotted]; + 86 -> {66}; + 87 -> {88}; + 88 -> {89}; + 89 -> {90}; 90 -> {91}; - 91 -> {92}; - 92 -> {93}; - 93 -> {94}; - 94 -> {95}; - 95 -> {59}; + 91 -> {63}; + 91 -> {92} [style=dotted]; + 92 -> {93} [style=dotted]; + 93 -> {94} [style=dotted]; + 94 -> {66} [style=dotted]; + 95 -> {96}; + 96 -> {97}; + 97 -> {98}; + 98 -> {99}; + 99 -> {100}; + 100 -> {101}; + 101 -> {63}; - subgraph cluster_26 { + subgraph cluster_29 { color=red - 96 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_27 { + 102 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_30 { color=blue - 98 [label="Enter when"]; - subgraph cluster_28 { - color=blue - 100 [label="Enter when branch condition "]; - 101 [label="Access variable R|/x|"]; - 102 [label="Type operator: (R|/x| is R|B|)"]; - 103 [label="Exit when branch condition"]; - } - subgraph cluster_29 { - color=blue - 110 [label="Enter when branch condition "]; - 111 [label="Access variable R|/x|"]; - 112 [label="Type operator: (R|/x| is R|C|)"]; - 113 [label="Exit when branch condition"]; - } - 120 [label="Synthetic else branch"]; - 114 [label="Enter when branch result"]; - subgraph cluster_30 { - color=blue - 115 [label="Enter block"]; - 116 [label="Access variable R|/x|"]; - 117 [label="Function call: R|/x|.R|/C.baz|()"]; - 118 [label="Exit block"]; - } - 119 [label="Exit when branch result"]; - 104 [label="Enter when branch result"]; + 104 [label="Enter block"]; subgraph cluster_31 { color=blue - 105 [label="Enter block"]; - 106 [label="Access variable R|/x|"]; - 107 [label="Function call: R|/x|.R|/B.bar|()"]; - 108 [label="Exit block"]; + 105 [label="Enter when"]; + subgraph cluster_32 { + color=blue + 107 [label="Enter when branch condition "]; + 108 [label="Access variable R|/x|"]; + 109 [label="Type operator: (R|/x| is R|B|)"]; + 110 [label="Exit when branch condition"]; + } + subgraph cluster_33 { + color=blue + 117 [label="Enter when branch condition "]; + 118 [label="Access variable R|/x|"]; + 119 [label="Type operator: (R|/x| is R|C|)"]; + 120 [label="Exit when branch condition"]; + } + 127 [label="Synthetic else branch"]; + 121 [label="Enter when branch result"]; + subgraph cluster_34 { + color=blue + 122 [label="Enter block"]; + 123 [label="Access variable R|/x|"]; + 124 [label="Function call: R|/x|.R|/C.baz|()"]; + 125 [label="Exit block"]; + } + 126 [label="Exit when branch result"]; + 111 [label="Enter when branch result"]; + subgraph cluster_35 { + color=blue + 112 [label="Enter block"]; + 113 [label="Access variable R|/x|"]; + 114 [label="Function call: R|/x|.R|/B.bar|()"]; + 115 [label="Exit block"]; + } + 116 [label="Exit when branch result"]; + 106 [label="Exit when"]; } - 109 [label="Exit when branch result"]; - 99 [label="Exit when"]; + 128 [label="Access variable R|/x|"]; + 129 [label="Function call: R|/x|.#()"]; + 130 [label="Access variable R|/x|"]; + 131 [label="Function call: R|/x|.#()"]; + 132 [label="Access variable R|/x|"]; + 133 [label="Function call: R|/x|.#()"]; + 134 [label="Exit block"]; } - 121 [label="Access variable R|/x|"]; - 122 [label="Function call: R|/x|.#()"]; - 123 [label="Access variable R|/x|"]; - 124 [label="Function call: R|/x|.#()"]; - 125 [label="Access variable R|/x|"]; - 126 [label="Function call: R|/x|.#()"]; - 97 [label="Exit function test_3" style="filled" fillcolor=red]; + 103 [label="Exit function test_3" style="filled" fillcolor=red]; } - 96 -> {98}; - 98 -> {100}; - 99 -> {121}; - 100 -> {101}; - 101 -> {102}; - 102 -> {103}; - 103 -> {104 110}; + 102 -> {104}; 104 -> {105}; - 105 -> {106}; - 106 -> {107}; + 105 -> {107}; + 106 -> {128}; 107 -> {108}; 108 -> {109}; - 109 -> {99}; - 110 -> {111}; + 109 -> {110}; + 110 -> {111 117}; 111 -> {112}; 112 -> {113}; - 113 -> {114 120}; + 113 -> {114}; 114 -> {115}; 115 -> {116}; - 116 -> {117}; + 116 -> {106}; 117 -> {118}; 118 -> {119}; - 119 -> {99}; - 120 -> {99}; + 119 -> {120}; + 120 -> {121 127}; 121 -> {122}; 122 -> {123}; 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {97}; - - subgraph cluster_32 { - color=red - 127 [label="Enter function runHigherOrder" style="filled" fillcolor=red]; - 129 [label="Function call: R|/f|.R|FakeOverride|()"]; - 130 [label="Jump: ^runHigherOrder R|/f|.R|FakeOverride|()"]; - 131 [label="Stub" style="filled" fillcolor=gray]; - 128 [label="Exit function runHigherOrder" style="filled" fillcolor=red]; - } - 127 -> {129}; + 126 -> {106}; + 127 -> {106}; + 128 -> {129}; 129 -> {130}; - 130 -> {128}; - 130 -> {131} [style=dotted]; - 131 -> {128} [style=dotted]; + 130 -> {131}; + 131 -> {132}; + 132 -> {133}; + 133 -> {134}; + 134 -> {103}; - subgraph cluster_33 { + subgraph cluster_36 { color=red - 137 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_34 { + 135 [label="Enter function runHigherOrder" style="filled" fillcolor=red]; + subgraph cluster_37 { color=blue - 132 [label="Enter function getter" style="filled" fillcolor=red]; - 134 [label="Access variable R|kotlin/String.length|"]; - 135 [label="Jump: ^ this@R|/ext|.R|kotlin/String.length|"]; - 136 [label="Stub" style="filled" fillcolor=gray]; - 133 [label="Exit function getter" style="filled" fillcolor=red]; + 137 [label="Enter block"]; + 138 [label="Function call: R|/f|.R|FakeOverride|()"]; + 139 [label="Jump: ^runHigherOrder R|/f|.R|FakeOverride|()"]; + 140 [label="Stub" style="filled" fillcolor=gray]; + 141 [label="Exit block" style="filled" fillcolor=gray]; } - 138 [label="Exit property" style="filled" fillcolor=red]; + 136 [label="Exit function runHigherOrder" style="filled" fillcolor=red]; } + 135 -> {137}; 137 -> {138}; - 132 -> {134}; - 134 -> {135}; - 135 -> {133}; - 135 -> {136} [style=dotted]; - 136 -> {133} [style=dotted]; + 138 -> {139}; + 139 -> {136}; + 139 -> {140} [style=dotted]; + 140 -> {141} [style=dotted]; + 141 -> {136} [style=dotted]; - subgraph cluster_35 { + subgraph cluster_38 { color=red - 139 [label="Enter function test_4" style="filled" fillcolor=red]; - 141 [label="Access variable R|/a|"]; - 142 [label="Type operator: (R|/a| as? R|kotlin/String|)"]; - 143 [label="Variable declaration: lval s: R|kotlin/String?|"]; - subgraph cluster_36 { + 142 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_39 { color=blue - 144 [label="Enter when"]; - 146 [label="Access variable R|/s|"]; - 147 [label="Enter safe call"]; - 149 [label="Access variable R|/ext|"]; - 148 [label="Exit safe call"]; - 150 [label="Variable declaration: lval : R|kotlin/Int?|"]; - subgraph cluster_37 { - color=blue - 151 [label="Enter when branch condition "]; - 152 [label="Const: Null(null)"]; - 153 [label="Operator =="]; - 154 [label="Exit when branch condition"]; - } - subgraph cluster_38 { - color=blue - 161 [label="Enter when branch condition else"]; - 162 [label="Exit when branch condition"]; - } - 163 [label="Enter when branch result"]; - subgraph cluster_39 { - color=blue - 164 [label="Enter block"]; - 165 [label="Access variable R|/|"]; - 166 [label="Exit block"]; - } - 167 [label="Exit when branch result"]; - 155 [label="Enter when branch result"]; - subgraph cluster_40 { - color=blue - 156 [label="Enter block"]; - 157 [label="Jump: ^test_4 Unit"]; - 158 [label="Stub" style="filled" fillcolor=gray]; - 159 [label="Exit block" style="filled" fillcolor=gray]; - } - 160 [label="Exit when branch result" style="filled" fillcolor=gray]; - 145 [label="Exit when"]; + 144 [label="Enter block"]; + 145 [label="Access variable R|kotlin/String.length|"]; + 146 [label="Jump: ^ this@R|/ext|.R|kotlin/String.length|"]; + 147 [label="Stub" style="filled" fillcolor=gray]; + 148 [label="Exit block" style="filled" fillcolor=gray]; } - 168 [label="Variable declaration: lval length: R|kotlin/Int|"]; - 169 [label="Postponed enter to lambda"]; + 143 [label="Exit function getter" style="filled" fillcolor=red]; + } + 142 -> {144}; + 144 -> {145}; + 145 -> {146}; + 146 -> {143}; + 146 -> {147} [style=dotted]; + 147 -> {148} [style=dotted]; + 148 -> {143} [style=dotted]; + + subgraph cluster_40 { + color=red + 149 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_41 { color=blue - 172 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 174 [label="Access variable R|/s|"]; - 175 [label="Access variable R|kotlin/String.length|"]; - 173 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 151 [label="Enter block"]; + 152 [label="Access variable R|/a|"]; + 153 [label="Type operator: (R|/a| as? R|kotlin/String|)"]; + 154 [label="Variable declaration: lval s: R|kotlin/String?|"]; + subgraph cluster_42 { + color=blue + 155 [label="Enter when"]; + 157 [label="Access variable R|/s|"]; + 158 [label="Enter safe call"]; + 160 [label="Access variable R|/ext|"]; + 159 [label="Exit safe call"]; + 161 [label="Variable declaration: lval : R|kotlin/Int?|"]; + subgraph cluster_43 { + color=blue + 162 [label="Enter when branch condition "]; + 163 [label="Const: Null(null)"]; + 164 [label="Operator =="]; + 165 [label="Exit when branch condition"]; + } + subgraph cluster_44 { + color=blue + 172 [label="Enter when branch condition else"]; + 173 [label="Exit when branch condition"]; + } + 174 [label="Enter when branch result"]; + subgraph cluster_45 { + color=blue + 175 [label="Enter block"]; + 176 [label="Access variable R|/|"]; + 177 [label="Exit block"]; + } + 178 [label="Exit when branch result"]; + 166 [label="Enter when branch result"]; + subgraph cluster_46 { + color=blue + 167 [label="Enter block"]; + 168 [label="Jump: ^test_4 Unit"]; + 169 [label="Stub" style="filled" fillcolor=gray]; + 170 [label="Exit block" style="filled" fillcolor=gray]; + } + 171 [label="Exit when branch result" style="filled" fillcolor=gray]; + 156 [label="Exit when"]; + } + 179 [label="Variable declaration: lval length: R|kotlin/Int|"]; + 180 [label="Postponed enter to lambda"]; + subgraph cluster_47 { + color=blue + 184 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_48 { + color=blue + 186 [label="Enter block"]; + 187 [label="Access variable R|/s|"]; + 188 [label="Access variable R|kotlin/String.length|"]; + 189 [label="Exit block"]; + } + 185 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 181 [label="Postponed exit from lambda"]; + 182 [label="Function call: R|/runHigherOrder|(...)"]; + 183 [label="Exit block"]; } - 170 [label="Postponed exit from lambda"]; - 171 [label="Function call: R|/runHigherOrder|(...)"]; - 140 [label="Exit function test_4" style="filled" fillcolor=red]; + 150 [label="Exit function test_4" style="filled" fillcolor=red]; } - 139 -> {141}; - 141 -> {142}; - 142 -> {143}; - 143 -> {144}; - 144 -> {146}; - 145 -> {168}; - 146 -> {147 148}; - 147 -> {149}; - 148 -> {150}; - 149 -> {148}; - 150 -> {151}; + 149 -> {151}; 151 -> {152}; 152 -> {153}; 153 -> {154}; - 154 -> {155 161}; - 155 -> {156}; - 156 -> {157}; - 157 -> {140}; - 157 -> {158} [style=dotted]; - 158 -> {159} [style=dotted]; - 159 -> {160} [style=dotted]; - 160 -> {145} [style=dotted]; + 154 -> {155}; + 155 -> {157}; + 156 -> {179}; + 157 -> {158 159}; + 158 -> {160}; + 159 -> {161}; + 160 -> {159}; 161 -> {162}; 162 -> {163}; 163 -> {164}; 164 -> {165}; - 165 -> {166}; + 165 -> {166 172}; 166 -> {167}; - 167 -> {145}; - 168 -> {169}; - 169 -> {170}; - 169 -> {172} [color=red]; - 170 -> {171}; - 171 -> {140}; - 172 -> {174}; + 167 -> {168}; + 168 -> {150}; + 168 -> {169} [style=dotted]; + 169 -> {170} [style=dotted]; + 170 -> {171} [style=dotted]; + 171 -> {156} [style=dotted]; + 172 -> {173}; + 173 -> {174}; 174 -> {175}; - 175 -> {173}; + 175 -> {176}; + 176 -> {177}; + 177 -> {178}; + 178 -> {156}; + 179 -> {180}; + 180 -> {181 184}; + 181 -> {182}; + 182 -> {183}; + 183 -> {150}; + 184 -> {186}; + 186 -> {187}; + 187 -> {188}; + 188 -> {189}; + 189 -> {185}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/simpleIf.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/simpleIf.dot index 40becd85207..d2f4d4c129c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/simpleIf.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/simpleIf.dot @@ -8,179 +8,200 @@ digraph simpleIf_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Enter when branch condition "]; - 5 [label="Access variable R|/x|"]; - 6 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 7 [label="Exit when branch condition"]; + 3 [label="Enter when"]; + subgraph cluster_3 { + color=blue + 5 [label="Enter when branch condition "]; + 6 [label="Access variable R|/x|"]; + 7 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 8 [label="Exit when branch condition"]; + } + 15 [label="Synthetic else branch"]; + 9 [label="Enter when branch result"]; + subgraph cluster_4 { + color=blue + 10 [label="Enter block"]; + 11 [label="Access variable R|/x|"]; + 12 [label="Access variable R|kotlin/String.length|"]; + 13 [label="Exit block"]; + } + 14 [label="Exit when branch result"]; + 4 [label="Exit when"]; } - 14 [label="Synthetic else branch"]; - 8 [label="Enter when branch result"]; - subgraph cluster_3 { - color=blue - 9 [label="Enter block"]; - 10 [label="Access variable R|/x|"]; - 11 [label="Access variable R|kotlin/String.length|"]; - 12 [label="Exit block"]; - } - 13 [label="Exit when branch result"]; - 3 [label="Exit when"]; + 16 [label="Access variable R|/x|"]; + 17 [label="Access variable #"]; + 18 [label="Exit block"]; } - 15 [label="Access variable R|/x|"]; - 16 [label="Access variable #"]; 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {15}; - 4 -> {5}; + 2 -> {3}; + 3 -> {5}; + 4 -> {16}; 5 -> {6}; 6 -> {7}; - 7 -> {8 14}; - 8 -> {9}; + 7 -> {8}; + 8 -> {9 15}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {3}; - 14 -> {3}; - 15 -> {16}; - 16 -> {1}; + 13 -> {14}; + 14 -> {4}; + 15 -> {4}; + 16 -> {17}; + 17 -> {18}; + 18 -> {1}; - subgraph cluster_4 { + subgraph cluster_5 { color=red - 17 [label="Enter function test_2" style="filled" fillcolor=red]; - 19 [label="Access variable R|/x|"]; - 20 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 21 [label="Variable declaration: lval b: R|kotlin/Boolean|"]; - subgraph cluster_5 { + 19 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_6 { color=blue - 22 [label="Enter when"]; - subgraph cluster_6 { - color=blue - 24 [label="Enter when branch condition "]; - 25 [label="Access variable R|/b|"]; - 26 [label="Exit when branch condition"]; - } - 33 [label="Synthetic else branch"]; - 27 [label="Enter when branch result"]; + 21 [label="Enter block"]; + 22 [label="Access variable R|/x|"]; + 23 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 24 [label="Variable declaration: lval b: R|kotlin/Boolean|"]; subgraph cluster_7 { color=blue - 28 [label="Enter block"]; - 29 [label="Access variable R|/x|"]; - 30 [label="Access variable R|kotlin/String.length|"]; - 31 [label="Exit block"]; + 25 [label="Enter when"]; + subgraph cluster_8 { + color=blue + 27 [label="Enter when branch condition "]; + 28 [label="Access variable R|/b|"]; + 29 [label="Exit when branch condition"]; + } + 36 [label="Synthetic else branch"]; + 30 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 31 [label="Enter block"]; + 32 [label="Access variable R|/x|"]; + 33 [label="Access variable R|kotlin/String.length|"]; + 34 [label="Exit block"]; + } + 35 [label="Exit when branch result"]; + 26 [label="Exit when"]; } - 32 [label="Exit when branch result"]; - 23 [label="Exit when"]; + 37 [label="Access variable R|/x|"]; + 38 [label="Access variable #"]; + 39 [label="Exit block"]; } - 34 [label="Access variable R|/x|"]; - 35 [label="Access variable #"]; - 18 [label="Exit function test_2" style="filled" fillcolor=red]; + 20 [label="Exit function test_2" style="filled" fillcolor=red]; } - 17 -> {19}; - 19 -> {20}; - 20 -> {21}; + 19 -> {21}; 21 -> {22}; - 22 -> {24}; - 23 -> {34}; + 22 -> {23}; + 23 -> {24}; 24 -> {25}; - 25 -> {26}; - 26 -> {27 33}; + 25 -> {27}; + 26 -> {37}; 27 -> {28}; 28 -> {29}; - 29 -> {30}; + 29 -> {30 36}; 30 -> {31}; 31 -> {32}; - 32 -> {23}; - 33 -> {23}; + 32 -> {33}; + 33 -> {34}; 34 -> {35}; - 35 -> {18}; + 35 -> {26}; + 36 -> {26}; + 37 -> {38}; + 38 -> {39}; + 39 -> {20}; - subgraph cluster_8 { + subgraph cluster_10 { color=red - 36 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_9 { + 40 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_11 { color=blue - 38 [label="Enter when"]; - subgraph cluster_10 { - color=blue - 40 [label="Enter when branch condition "]; - 41 [label="Access variable R|/x|"]; - 42 [label="Type operator: (R|/x| !is R|kotlin/String|)"]; - 43 [label="Exit when branch condition"]; - } - subgraph cluster_11 { - color=blue - 48 [label="Enter when branch condition "]; - 49 [label="Access variable R|/x|"]; - 50 [label="Type operator: (R|/x| !is R|kotlin/Int|)"]; - 51 [label="Exit when branch condition"]; - } + 42 [label="Enter block"]; subgraph cluster_12 { color=blue - 56 [label="Enter when branch condition else"]; - 57 [label="Exit when branch condition"]; + 43 [label="Enter when"]; + subgraph cluster_13 { + color=blue + 45 [label="Enter when branch condition "]; + 46 [label="Access variable R|/x|"]; + 47 [label="Type operator: (R|/x| !is R|kotlin/String|)"]; + 48 [label="Exit when branch condition"]; + } + subgraph cluster_14 { + color=blue + 53 [label="Enter when branch condition "]; + 54 [label="Access variable R|/x|"]; + 55 [label="Type operator: (R|/x| !is R|kotlin/Int|)"]; + 56 [label="Exit when branch condition"]; + } + subgraph cluster_15 { + color=blue + 61 [label="Enter when branch condition else"]; + 62 [label="Exit when branch condition"]; + } + 63 [label="Enter when branch result"]; + subgraph cluster_16 { + color=blue + 64 [label="Enter block"]; + 65 [label="Access variable R|/x|"]; + 66 [label="Access variable R|kotlin/String.length|"]; + 67 [label="Access variable R|/x|"]; + 68 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 69 [label="Exit block"]; + } + 70 [label="Exit when branch result"]; + 57 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 58 [label="Enter block"]; + 59 [label="Exit block"]; + } + 60 [label="Exit when branch result"]; + 49 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 50 [label="Enter block"]; + 51 [label="Exit block"]; + } + 52 [label="Exit when branch result"]; + 44 [label="Exit when"]; } - 58 [label="Enter when branch result"]; - subgraph cluster_13 { - color=blue - 59 [label="Enter block"]; - 60 [label="Access variable R|/x|"]; - 61 [label="Access variable R|kotlin/String.length|"]; - 62 [label="Access variable R|/x|"]; - 63 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 64 [label="Exit block"]; - } - 65 [label="Exit when branch result"]; - 52 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 53 [label="Enter block"]; - 54 [label="Exit block"]; - } - 55 [label="Exit when branch result"]; - 44 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 45 [label="Enter block"]; - 46 [label="Exit block"]; - } - 47 [label="Exit when branch result"]; - 39 [label="Exit when"]; + 71 [label="Exit block"]; } - 37 [label="Exit function test_3" style="filled" fillcolor=red]; + 41 [label="Exit function test_3" style="filled" fillcolor=red]; } - 36 -> {38}; - 38 -> {40}; - 39 -> {37}; - 40 -> {41}; - 41 -> {42}; + 40 -> {42}; 42 -> {43}; - 43 -> {44 48}; - 44 -> {45}; + 43 -> {45}; + 44 -> {71}; 45 -> {46}; 46 -> {47}; - 47 -> {39}; - 48 -> {49}; + 47 -> {48}; + 48 -> {49 53}; 49 -> {50}; 50 -> {51}; - 51 -> {52 56}; - 52 -> {53}; + 51 -> {52}; + 52 -> {44}; 53 -> {54}; 54 -> {55}; - 55 -> {39}; - 56 -> {57}; + 55 -> {56}; + 56 -> {57 61}; 57 -> {58}; 58 -> {59}; 59 -> {60}; - 60 -> {61}; + 60 -> {44}; 61 -> {62}; 62 -> {63}; 63 -> {64}; 64 -> {65}; - 65 -> {39}; + 65 -> {66}; + 66 -> {67}; + 67 -> {68}; + 68 -> {69}; + 69 -> {70}; + 70 -> {44}; + 71 -> {41}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot index 414c20d62d6..668f58cc69a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/smartcastFromArgument.dot @@ -12,123 +12,137 @@ digraph smartcastFromArgument_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function takeA" style="filled" fillcolor=red]; - 6 [label="Const: Boolean(true)"]; - 7 [label="Jump: ^takeA Boolean(true)"]; - 8 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_3 { + color=blue + 6 [label="Enter block"]; + 7 [label="Const: Boolean(true)"]; + 8 [label="Jump: ^takeA Boolean(true)"]; + 9 [label="Stub" style="filled" fillcolor=gray]; + 10 [label="Exit block" style="filled" fillcolor=gray]; + } 5 [label="Exit function takeA" style="filled" fillcolor=red]; } 4 -> {6}; 6 -> {7}; - 7 -> {5}; - 7 -> {8} [style=dotted]; - 8 -> {5} [style=dotted]; + 7 -> {8}; + 8 -> {5}; + 8 -> {9} [style=dotted]; + 9 -> {10} [style=dotted]; + 10 -> {5} [style=dotted]; - subgraph cluster_3 { + subgraph cluster_4 { color=red - 9 [label="Enter function test" style="filled" fillcolor=red]; - subgraph cluster_4 { + 11 [label="Enter function test" style="filled" fillcolor=red]; + subgraph cluster_5 { color=blue - 11 [label="Enter when"]; - subgraph cluster_5 { + 13 [label="Enter block"]; + subgraph cluster_6 { color=blue - 13 [label="Enter when branch condition "]; - subgraph cluster_6 { + 14 [label="Enter when"]; + subgraph cluster_7 { color=blue - 14 [label="Enter when"]; - 16 [label="Access variable R|/a|"]; - 17 [label="Type operator: (R|/a| as? R|A|)"]; - 18 [label="Variable declaration: lval : R|A?|"]; - subgraph cluster_7 { - color=blue - 19 [label="Enter when branch condition "]; - 20 [label="Const: Null(null)"]; - 21 [label="Operator =="]; - 22 [label="Exit when branch condition"]; - } + 16 [label="Enter when branch condition "]; subgraph cluster_8 { color=blue - 29 [label="Enter when branch condition else"]; - 30 [label="Exit when branch condition"]; + 17 [label="Enter when"]; + 19 [label="Access variable R|/a|"]; + 20 [label="Type operator: (R|/a| as? R|A|)"]; + 21 [label="Variable declaration: lval : R|A?|"]; + subgraph cluster_9 { + color=blue + 22 [label="Enter when branch condition "]; + 23 [label="Const: Null(null)"]; + 24 [label="Operator =="]; + 25 [label="Exit when branch condition"]; + } + subgraph cluster_10 { + color=blue + 32 [label="Enter when branch condition else"]; + 33 [label="Exit when branch condition"]; + } + 34 [label="Enter when branch result"]; + subgraph cluster_11 { + color=blue + 35 [label="Enter block"]; + 36 [label="Access variable R|/|"]; + 37 [label="Exit block"]; + } + 38 [label="Exit when branch result"]; + 26 [label="Enter when branch result"]; + subgraph cluster_12 { + color=blue + 27 [label="Enter block"]; + 28 [label="Jump: ^test Unit"]; + 29 [label="Stub" style="filled" fillcolor=gray]; + 30 [label="Exit block" style="filled" fillcolor=gray]; + } + 31 [label="Exit when branch result" style="filled" fillcolor=gray]; + 18 [label="Exit when"]; } - 31 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 32 [label="Enter block"]; - 33 [label="Access variable R|/|"]; - 34 [label="Exit block"]; - } - 35 [label="Exit when branch result"]; - 23 [label="Enter when branch result"]; - subgraph cluster_10 { - color=blue - 24 [label="Enter block"]; - 25 [label="Jump: ^test Unit"]; - 26 [label="Stub" style="filled" fillcolor=gray]; - 27 [label="Exit block" style="filled" fillcolor=gray]; - } - 28 [label="Exit when branch result" style="filled" fillcolor=gray]; - 15 [label="Exit when"]; + 39 [label="Function call: R|/takeA|(...)"]; + 40 [label="Exit when branch condition"]; } - 36 [label="Function call: R|/takeA|(...)"]; - 37 [label="Exit when branch condition"]; + 47 [label="Synthetic else branch"]; + 41 [label="Enter when branch result"]; + subgraph cluster_13 { + color=blue + 42 [label="Enter block"]; + 43 [label="Access variable R|/a|"]; + 44 [label="Function call: R|/a|.R|/A.foo|()"]; + 45 [label="Exit block"]; + } + 46 [label="Exit when branch result"]; + 15 [label="Exit when"]; } - 44 [label="Synthetic else branch"]; - 38 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 39 [label="Enter block"]; - 40 [label="Access variable R|/a|"]; - 41 [label="Function call: R|/a|.R|/A.foo|()"]; - 42 [label="Exit block"]; - } - 43 [label="Exit when branch result"]; - 12 [label="Exit when"]; + 48 [label="Exit block"]; } - 10 [label="Exit function test" style="filled" fillcolor=red]; + 12 [label="Exit function test" style="filled" fillcolor=red]; } - 9 -> {11}; 11 -> {13}; - 12 -> {10}; 13 -> {14}; 14 -> {16}; - 15 -> {36}; + 15 -> {48}; 16 -> {17}; - 17 -> {18}; - 18 -> {19}; + 17 -> {19}; + 18 -> {39}; 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {23 29}; + 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {10}; - 25 -> {26} [style=dotted]; - 26 -> {27} [style=dotted]; - 27 -> {28} [style=dotted]; - 28 -> {15} [style=dotted]; - 29 -> {30}; - 30 -> {31}; - 31 -> {32}; + 25 -> {26 32}; + 26 -> {27}; + 27 -> {28}; + 28 -> {12}; + 28 -> {29} [style=dotted]; + 29 -> {30} [style=dotted]; + 30 -> {31} [style=dotted]; + 31 -> {18} [style=dotted]; 32 -> {33}; 33 -> {34}; 34 -> {35}; - 35 -> {15}; + 35 -> {36}; 36 -> {37}; - 37 -> {38 44}; - 38 -> {39}; + 37 -> {38}; + 38 -> {18}; 39 -> {40}; - 40 -> {41}; + 40 -> {41 47}; 41 -> {42}; 42 -> {43}; - 43 -> {12}; - 44 -> {12}; + 43 -> {44}; + 44 -> {45}; + 45 -> {46}; + 46 -> {15}; + 47 -> {15}; + 48 -> {12}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot index 755b0ee9a37..009d4e48d18 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/controlStructures/when.dot @@ -12,10 +12,10 @@ digraph when_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red @@ -26,174 +26,179 @@ digraph when_kt { subgraph cluster_3 { color=red - 6 [label="Enter class B" style="filled" fillcolor=red]; - 7 [label="Exit class B" style="filled" fillcolor=red]; + 7 [label="Enter class B" style="filled" fillcolor=red]; + 6 [label="Exit class B" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; + 7 -> {6} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 10 [label="Enter when"]; + 10 [label="Enter block"]; subgraph cluster_6 { color=blue - 12 [label="Enter when branch condition "]; - 13 [label="Access variable R|/x|"]; - 14 [label="Type operator: (R|/x| is R|A|)"]; - 15 [label="Exit when branch condition"]; + 11 [label="Enter when"]; + subgraph cluster_7 { + color=blue + 13 [label="Enter when branch condition "]; + 14 [label="Access variable R|/x|"]; + 15 [label="Type operator: (R|/x| is R|A|)"]; + 16 [label="Exit when branch condition"]; + } + subgraph cluster_8 { + color=blue + 23 [label="Enter when branch condition "]; + 24 [label="Access variable R|/x|"]; + 25 [label="Type operator: (R|/x| is R|B|)"]; + 26 [label="Exit when branch condition"]; + } + 33 [label="Synthetic else branch"]; + 27 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 28 [label="Enter block"]; + 29 [label="Access variable R|/x|"]; + 30 [label="Function call: R|/x|.R|/B.bar|()"]; + 31 [label="Exit block"]; + } + 32 [label="Exit when branch result"]; + 17 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 18 [label="Enter block"]; + 19 [label="Access variable R|/x|"]; + 20 [label="Function call: R|/x|.R|/A.foo|()"]; + 21 [label="Exit block"]; + } + 22 [label="Exit when branch result"]; + 12 [label="Exit when"]; } - subgraph cluster_7 { - color=blue - 22 [label="Enter when branch condition "]; - 23 [label="Access variable R|/x|"]; - 24 [label="Type operator: (R|/x| is R|B|)"]; - 25 [label="Exit when branch condition"]; - } - 32 [label="Synthetic else branch"]; - 26 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 27 [label="Enter block"]; - 28 [label="Access variable R|/x|"]; - 29 [label="Function call: R|/x|.R|/B.bar|()"]; - 30 [label="Exit block"]; - } - 31 [label="Exit when branch result"]; - 16 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 17 [label="Enter block"]; - 18 [label="Access variable R|/x|"]; - 19 [label="Function call: R|/x|.R|/A.foo|()"]; - 20 [label="Exit block"]; - } - 21 [label="Exit when branch result"]; - 11 [label="Exit when"]; - } - subgraph cluster_10 { - color=blue - 33 [label="Enter when"]; subgraph cluster_11 { color=blue - 35 [label="Enter when branch condition "]; - 36 [label="Access variable R|/x|"]; - 37 [label="Type operator: (R|/x| !is R|A|)"]; - 38 [label="Exit when branch condition"]; + 34 [label="Enter when"]; + subgraph cluster_12 { + color=blue + 36 [label="Enter when branch condition "]; + 37 [label="Access variable R|/x|"]; + 38 [label="Type operator: (R|/x| !is R|A|)"]; + 39 [label="Exit when branch condition"]; + } + subgraph cluster_13 { + color=blue + 44 [label="Enter when branch condition "]; + 45 [label="Access variable R|/x|"]; + 46 [label="Type operator: (R|/x| !is R|B|)"]; + 47 [label="Exit when branch condition"]; + } + subgraph cluster_14 { + color=blue + 54 [label="Enter when branch condition "]; + 55 [label="Access variable R|/x|"]; + 56 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; + 57 [label="Exit when branch condition"]; + } + subgraph cluster_15 { + color=blue + 68 [label="Enter when branch condition else"]; + 69 [label="Exit when branch condition"]; + } + 70 [label="Enter when branch result"]; + subgraph cluster_16 { + color=blue + 71 [label="Enter block"]; + 72 [label="Access variable R|/x|"]; + 73 [label="Function call: R|/x|.R|/A.foo|()"]; + 74 [label="Access variable R|/x|"]; + 75 [label="Function call: R|/x|.R|/B.bar|()"]; + 76 [label="Exit block"]; + } + 77 [label="Exit when branch result"]; + 58 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 59 [label="Enter block"]; + 60 [label="Access variable R|/x|"]; + 61 [label="Function call: R|/x|.R|/A.foo|()"]; + 62 [label="Access variable R|/x|"]; + 63 [label="Function call: R|/x|.R|/B.bar|()"]; + 64 [label="Access variable R|/x|"]; + 65 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 66 [label="Exit block"]; + } + 67 [label="Exit when branch result"]; + 48 [label="Enter when branch result"]; + subgraph cluster_18 { + color=blue + 49 [label="Enter block"]; + 50 [label="Access variable R|/x|"]; + 51 [label="Function call: R|/x|.R|/A.foo|()"]; + 52 [label="Exit block"]; + } + 53 [label="Exit when branch result"]; + 40 [label="Enter when branch result"]; + subgraph cluster_19 { + color=blue + 41 [label="Enter block"]; + 42 [label="Exit block"]; + } + 43 [label="Exit when branch result"]; + 35 [label="Exit when"]; } - subgraph cluster_12 { - color=blue - 43 [label="Enter when branch condition "]; - 44 [label="Access variable R|/x|"]; - 45 [label="Type operator: (R|/x| !is R|B|)"]; - 46 [label="Exit when branch condition"]; - } - subgraph cluster_13 { - color=blue - 53 [label="Enter when branch condition "]; - 54 [label="Access variable R|/x|"]; - 55 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 56 [label="Exit when branch condition"]; - } - subgraph cluster_14 { - color=blue - 67 [label="Enter when branch condition else"]; - 68 [label="Exit when branch condition"]; - } - 69 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 70 [label="Enter block"]; - 71 [label="Access variable R|/x|"]; - 72 [label="Function call: R|/x|.R|/A.foo|()"]; - 73 [label="Access variable R|/x|"]; - 74 [label="Function call: R|/x|.R|/B.bar|()"]; - 75 [label="Exit block"]; - } - 76 [label="Exit when branch result"]; - 57 [label="Enter when branch result"]; - subgraph cluster_16 { - color=blue - 58 [label="Enter block"]; - 59 [label="Access variable R|/x|"]; - 60 [label="Function call: R|/x|.R|/A.foo|()"]; - 61 [label="Access variable R|/x|"]; - 62 [label="Function call: R|/x|.R|/B.bar|()"]; - 63 [label="Access variable R|/x|"]; - 64 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 65 [label="Exit block"]; - } - 66 [label="Exit when branch result"]; - 47 [label="Enter when branch result"]; - subgraph cluster_17 { - color=blue - 48 [label="Enter block"]; - 49 [label="Access variable R|/x|"]; - 50 [label="Function call: R|/x|.R|/A.foo|()"]; - 51 [label="Exit block"]; - } - 52 [label="Exit when branch result"]; - 39 [label="Enter when branch result"]; - subgraph cluster_18 { - color=blue - 40 [label="Enter block"]; - 41 [label="Exit block"]; - } - 42 [label="Exit when branch result"]; - 34 [label="Exit when"]; + 78 [label="Exit block"]; } 9 [label="Exit function test_1" style="filled" fillcolor=red]; } 8 -> {10}; - 10 -> {12}; - 11 -> {33}; - 12 -> {13}; + 10 -> {11}; + 11 -> {13}; + 12 -> {34}; 13 -> {14}; 14 -> {15}; - 15 -> {16 22}; - 16 -> {17}; + 15 -> {16}; + 16 -> {17 23}; 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {11}; - 22 -> {23}; + 21 -> {22}; + 22 -> {12}; 23 -> {24}; 24 -> {25}; - 25 -> {26 32}; - 26 -> {27}; + 25 -> {26}; + 26 -> {27 33}; 27 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; - 31 -> {11}; - 32 -> {11}; - 33 -> {35}; - 34 -> {9}; - 35 -> {36}; + 31 -> {32}; + 32 -> {12}; + 33 -> {12}; + 34 -> {36}; + 35 -> {78}; 36 -> {37}; 37 -> {38}; - 38 -> {39 43}; - 39 -> {40}; + 38 -> {39}; + 39 -> {40 44}; 40 -> {41}; 41 -> {42}; - 42 -> {34}; - 43 -> {44}; + 42 -> {43}; + 43 -> {35}; 44 -> {45}; 45 -> {46}; - 46 -> {47 53}; - 47 -> {48}; + 46 -> {47}; + 47 -> {48 54}; 48 -> {49}; 49 -> {50}; 50 -> {51}; 51 -> {52}; - 52 -> {34}; - 53 -> {54}; + 52 -> {53}; + 53 -> {35}; 54 -> {55}; 55 -> {56}; - 56 -> {57 67}; - 57 -> {58}; + 56 -> {57}; + 57 -> {58 68}; 58 -> {59}; 59 -> {60}; 60 -> {61}; @@ -202,8 +207,8 @@ digraph when_kt { 63 -> {64}; 64 -> {65}; 65 -> {66}; - 66 -> {34}; - 67 -> {68}; + 66 -> {67}; + 67 -> {35}; 68 -> {69}; 69 -> {70}; 70 -> {71}; @@ -212,372 +217,382 @@ digraph when_kt { 73 -> {74}; 74 -> {75}; 75 -> {76}; - 76 -> {34}; + 76 -> {77}; + 77 -> {35}; + 78 -> {9}; - subgraph cluster_19 { + subgraph cluster_20 { color=red - 77 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_20 { + 79 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_21 { color=blue - 79 [label="Enter when"]; - 81 [label="Access variable R|/x|"]; - subgraph cluster_21 { - color=blue - 82 [label="Enter when branch condition "]; - 83 [label="Type operator: ($subj$ is R|A|)"]; - 84 [label="Exit when branch condition"]; - } + 81 [label="Enter block"]; subgraph cluster_22 { color=blue - 91 [label="Enter when branch condition "]; - 92 [label="Type operator: ($subj$ is R|B|)"]; - 93 [label="Exit when branch condition"]; - } - 100 [label="Synthetic else branch"]; - 94 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 95 [label="Enter block"]; - 96 [label="Access variable R|/x|"]; - 97 [label="Function call: R|/x|.R|/B.bar|()"]; - 98 [label="Exit block"]; - } - 99 [label="Exit when branch result"]; - 85 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 86 [label="Enter block"]; - 87 [label="Access variable R|/x|"]; - 88 [label="Function call: R|/x|.R|/A.foo|()"]; - 89 [label="Exit block"]; - } - 90 [label="Exit when branch result"]; - 80 [label="Exit when"]; - } - subgraph cluster_25 { - color=blue - 101 [label="Enter when"]; - 103 [label="Access variable R|/x|"]; - subgraph cluster_26 { - color=blue - 104 [label="Enter when branch condition "]; - 105 [label="Type operator: ($subj$ !is R|A|)"]; - 106 [label="Exit when branch condition"]; + 82 [label="Enter when"]; + 84 [label="Access variable R|/x|"]; + subgraph cluster_23 { + color=blue + 85 [label="Enter when branch condition "]; + 86 [label="Type operator: ($subj$ is R|A|)"]; + 87 [label="Exit when branch condition"]; + } + subgraph cluster_24 { + color=blue + 94 [label="Enter when branch condition "]; + 95 [label="Type operator: ($subj$ is R|B|)"]; + 96 [label="Exit when branch condition"]; + } + 103 [label="Synthetic else branch"]; + 97 [label="Enter when branch result"]; + subgraph cluster_25 { + color=blue + 98 [label="Enter block"]; + 99 [label="Access variable R|/x|"]; + 100 [label="Function call: R|/x|.R|/B.bar|()"]; + 101 [label="Exit block"]; + } + 102 [label="Exit when branch result"]; + 88 [label="Enter when branch result"]; + subgraph cluster_26 { + color=blue + 89 [label="Enter block"]; + 90 [label="Access variable R|/x|"]; + 91 [label="Function call: R|/x|.R|/A.foo|()"]; + 92 [label="Exit block"]; + } + 93 [label="Exit when branch result"]; + 83 [label="Exit when"]; } subgraph cluster_27 { color=blue - 111 [label="Enter when branch condition "]; - 112 [label="Type operator: ($subj$ !is R|B|)"]; - 113 [label="Exit when branch condition"]; + 104 [label="Enter when"]; + 106 [label="Access variable R|/x|"]; + subgraph cluster_28 { + color=blue + 107 [label="Enter when branch condition "]; + 108 [label="Type operator: ($subj$ !is R|A|)"]; + 109 [label="Exit when branch condition"]; + } + subgraph cluster_29 { + color=blue + 114 [label="Enter when branch condition "]; + 115 [label="Type operator: ($subj$ !is R|B|)"]; + 116 [label="Exit when branch condition"]; + } + subgraph cluster_30 { + color=blue + 123 [label="Enter when branch condition "]; + 124 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; + 125 [label="Exit when branch condition"]; + } + subgraph cluster_31 { + color=blue + 136 [label="Enter when branch condition else"]; + 137 [label="Exit when branch condition"]; + } + 138 [label="Enter when branch result"]; + subgraph cluster_32 { + color=blue + 139 [label="Enter block"]; + 140 [label="Access variable R|/x|"]; + 141 [label="Function call: R|/x|.R|/A.foo|()"]; + 142 [label="Access variable R|/x|"]; + 143 [label="Function call: R|/x|.R|/B.bar|()"]; + 144 [label="Exit block"]; + } + 145 [label="Exit when branch result"]; + 126 [label="Enter when branch result"]; + subgraph cluster_33 { + color=blue + 127 [label="Enter block"]; + 128 [label="Access variable R|/x|"]; + 129 [label="Function call: R|/x|.R|/A.foo|()"]; + 130 [label="Access variable R|/x|"]; + 131 [label="Function call: R|/x|.R|/B.bar|()"]; + 132 [label="Access variable R|/x|"]; + 133 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 134 [label="Exit block"]; + } + 135 [label="Exit when branch result"]; + 117 [label="Enter when branch result"]; + subgraph cluster_34 { + color=blue + 118 [label="Enter block"]; + 119 [label="Access variable R|/x|"]; + 120 [label="Function call: R|/x|.R|/A.foo|()"]; + 121 [label="Exit block"]; + } + 122 [label="Exit when branch result"]; + 110 [label="Enter when branch result"]; + subgraph cluster_35 { + color=blue + 111 [label="Enter block"]; + 112 [label="Exit block"]; + } + 113 [label="Exit when branch result"]; + 105 [label="Exit when"]; } - subgraph cluster_28 { - color=blue - 120 [label="Enter when branch condition "]; - 121 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; - 122 [label="Exit when branch condition"]; - } - subgraph cluster_29 { - color=blue - 133 [label="Enter when branch condition else"]; - 134 [label="Exit when branch condition"]; - } - 135 [label="Enter when branch result"]; - subgraph cluster_30 { - color=blue - 136 [label="Enter block"]; - 137 [label="Access variable R|/x|"]; - 138 [label="Function call: R|/x|.R|/A.foo|()"]; - 139 [label="Access variable R|/x|"]; - 140 [label="Function call: R|/x|.R|/B.bar|()"]; - 141 [label="Exit block"]; - } - 142 [label="Exit when branch result"]; - 123 [label="Enter when branch result"]; - subgraph cluster_31 { - color=blue - 124 [label="Enter block"]; - 125 [label="Access variable R|/x|"]; - 126 [label="Function call: R|/x|.R|/A.foo|()"]; - 127 [label="Access variable R|/x|"]; - 128 [label="Function call: R|/x|.R|/B.bar|()"]; - 129 [label="Access variable R|/x|"]; - 130 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 131 [label="Exit block"]; - } - 132 [label="Exit when branch result"]; - 114 [label="Enter when branch result"]; - subgraph cluster_32 { - color=blue - 115 [label="Enter block"]; - 116 [label="Access variable R|/x|"]; - 117 [label="Function call: R|/x|.R|/A.foo|()"]; - 118 [label="Exit block"]; - } - 119 [label="Exit when branch result"]; - 107 [label="Enter when branch result"]; - subgraph cluster_33 { - color=blue - 108 [label="Enter block"]; - 109 [label="Exit block"]; - } - 110 [label="Exit when branch result"]; - 102 [label="Exit when"]; + 146 [label="Exit block"]; } - 78 [label="Exit function test_2" style="filled" fillcolor=red]; + 80 [label="Exit function test_2" style="filled" fillcolor=red]; } - 77 -> {79}; 79 -> {81}; - 80 -> {101}; 81 -> {82}; - 82 -> {83}; - 83 -> {84}; - 84 -> {85 91}; + 82 -> {84}; + 83 -> {104}; + 84 -> {85}; 85 -> {86}; 86 -> {87}; - 87 -> {88}; + 87 -> {88 94}; 88 -> {89}; 89 -> {90}; - 90 -> {80}; + 90 -> {91}; 91 -> {92}; 92 -> {93}; - 93 -> {94 100}; + 93 -> {83}; 94 -> {95}; 95 -> {96}; - 96 -> {97}; + 96 -> {97 103}; 97 -> {98}; 98 -> {99}; - 99 -> {80}; - 100 -> {80}; - 101 -> {103}; - 102 -> {78}; - 103 -> {104}; - 104 -> {105}; - 105 -> {106}; - 106 -> {107 111}; + 99 -> {100}; + 100 -> {101}; + 101 -> {102}; + 102 -> {83}; + 103 -> {83}; + 104 -> {106}; + 105 -> {146}; + 106 -> {107}; 107 -> {108}; 108 -> {109}; - 109 -> {110}; - 110 -> {102}; + 109 -> {110 114}; + 110 -> {111}; 111 -> {112}; 112 -> {113}; - 113 -> {114 120}; + 113 -> {105}; 114 -> {115}; 115 -> {116}; - 116 -> {117}; + 116 -> {117 123}; 117 -> {118}; 118 -> {119}; - 119 -> {102}; + 119 -> {120}; 120 -> {121}; 121 -> {122}; - 122 -> {123 133}; + 122 -> {105}; 123 -> {124}; 124 -> {125}; - 125 -> {126}; + 125 -> {126 136}; 126 -> {127}; 127 -> {128}; 128 -> {129}; 129 -> {130}; 130 -> {131}; 131 -> {132}; - 132 -> {102}; + 132 -> {133}; 133 -> {134}; 134 -> {135}; - 135 -> {136}; + 135 -> {105}; 136 -> {137}; 137 -> {138}; 138 -> {139}; 139 -> {140}; 140 -> {141}; 141 -> {142}; - 142 -> {102}; + 142 -> {143}; + 143 -> {144}; + 144 -> {145}; + 145 -> {105}; + 146 -> {80}; - subgraph cluster_34 { + subgraph cluster_36 { color=red - 143 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_35 { + 147 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_37 { color=blue - 145 [label="Enter when"]; - 147 [label="Access variable R|/x|"]; - 148 [label="Variable declaration: lval y: R|kotlin/Any?|"]; - subgraph cluster_36 { - color=blue - 149 [label="Enter when branch condition "]; - 150 [label="Type operator: ($subj$ is R|A|)"]; - 151 [label="Exit when branch condition"]; - } - subgraph cluster_37 { - color=blue - 160 [label="Enter when branch condition "]; - 161 [label="Type operator: ($subj$ is R|B|)"]; - 162 [label="Exit when branch condition"]; - } - 171 [label="Synthetic else branch"]; - 163 [label="Enter when branch result"]; + 149 [label="Enter block"]; subgraph cluster_38 { color=blue - 164 [label="Enter block"]; - 165 [label="Access variable R|/x|"]; - 166 [label="Function call: R|/x|.R|/B.bar|()"]; - 167 [label="Access variable R|/y|"]; - 168 [label="Function call: R|/y|.R|/B.bar|()"]; - 169 [label="Exit block"]; - } - 170 [label="Exit when branch result"]; - 152 [label="Enter when branch result"]; - subgraph cluster_39 { - color=blue - 153 [label="Enter block"]; - 154 [label="Access variable R|/x|"]; - 155 [label="Function call: R|/x|.R|/A.foo|()"]; - 156 [label="Access variable R|/y|"]; - 157 [label="Function call: R|/y|.R|/A.foo|()"]; - 158 [label="Exit block"]; - } - 159 [label="Exit when branch result"]; - 146 [label="Exit when"]; - } - subgraph cluster_40 { - color=blue - 172 [label="Enter when"]; - 174 [label="Access variable R|/x|"]; - 175 [label="Variable declaration: lval y: R|kotlin/Any?|"]; - subgraph cluster_41 { - color=blue - 176 [label="Enter when branch condition "]; - 177 [label="Type operator: ($subj$ !is R|A|)"]; - 178 [label="Exit when branch condition"]; - } - subgraph cluster_42 { - color=blue - 183 [label="Enter when branch condition "]; - 184 [label="Type operator: ($subj$ !is R|B|)"]; - 185 [label="Exit when branch condition"]; + 150 [label="Enter when"]; + 152 [label="Access variable R|/x|"]; + 153 [label="Variable declaration: lval y: R|kotlin/Any?|"]; + subgraph cluster_39 { + color=blue + 154 [label="Enter when branch condition "]; + 155 [label="Type operator: ($subj$ is R|A|)"]; + 156 [label="Exit when branch condition"]; + } + subgraph cluster_40 { + color=blue + 165 [label="Enter when branch condition "]; + 166 [label="Type operator: ($subj$ is R|B|)"]; + 167 [label="Exit when branch condition"]; + } + 176 [label="Synthetic else branch"]; + 168 [label="Enter when branch result"]; + subgraph cluster_41 { + color=blue + 169 [label="Enter block"]; + 170 [label="Access variable R|/x|"]; + 171 [label="Function call: R|/x|.R|/B.bar|()"]; + 172 [label="Access variable R|/y|"]; + 173 [label="Function call: R|/y|.R|/B.bar|()"]; + 174 [label="Exit block"]; + } + 175 [label="Exit when branch result"]; + 157 [label="Enter when branch result"]; + subgraph cluster_42 { + color=blue + 158 [label="Enter block"]; + 159 [label="Access variable R|/x|"]; + 160 [label="Function call: R|/x|.R|/A.foo|()"]; + 161 [label="Access variable R|/y|"]; + 162 [label="Function call: R|/y|.R|/A.foo|()"]; + 163 [label="Exit block"]; + } + 164 [label="Exit when branch result"]; + 151 [label="Exit when"]; } subgraph cluster_43 { color=blue - 194 [label="Enter when branch condition "]; - 195 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; - 196 [label="Exit when branch condition"]; + 177 [label="Enter when"]; + 179 [label="Access variable R|/x|"]; + 180 [label="Variable declaration: lval y: R|kotlin/Any?|"]; + subgraph cluster_44 { + color=blue + 181 [label="Enter when branch condition "]; + 182 [label="Type operator: ($subj$ !is R|A|)"]; + 183 [label="Exit when branch condition"]; + } + subgraph cluster_45 { + color=blue + 188 [label="Enter when branch condition "]; + 189 [label="Type operator: ($subj$ !is R|B|)"]; + 190 [label="Exit when branch condition"]; + } + subgraph cluster_46 { + color=blue + 199 [label="Enter when branch condition "]; + 200 [label="Type operator: ($subj$ is R|kotlin/Int|)"]; + 201 [label="Exit when branch condition"]; + } + subgraph cluster_47 { + color=blue + 218 [label="Enter when branch condition else"]; + 219 [label="Exit when branch condition"]; + } + 220 [label="Enter when branch result"]; + subgraph cluster_48 { + color=blue + 221 [label="Enter block"]; + 222 [label="Access variable R|/x|"]; + 223 [label="Function call: R|/x|.R|/A.foo|()"]; + 224 [label="Access variable R|/x|"]; + 225 [label="Function call: R|/x|.R|/B.bar|()"]; + 226 [label="Access variable R|/y|"]; + 227 [label="Function call: R|/y|.R|/A.foo|()"]; + 228 [label="Access variable R|/y|"]; + 229 [label="Function call: R|/y|.R|/B.bar|()"]; + 230 [label="Exit block"]; + } + 231 [label="Exit when branch result"]; + 202 [label="Enter when branch result"]; + subgraph cluster_49 { + color=blue + 203 [label="Enter block"]; + 204 [label="Access variable R|/x|"]; + 205 [label="Function call: R|/x|.R|/A.foo|()"]; + 206 [label="Access variable R|/x|"]; + 207 [label="Function call: R|/x|.R|/B.bar|()"]; + 208 [label="Access variable R|/x|"]; + 209 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 210 [label="Access variable R|/y|"]; + 211 [label="Function call: R|/y|.R|/A.foo|()"]; + 212 [label="Access variable R|/y|"]; + 213 [label="Function call: R|/y|.R|/B.bar|()"]; + 214 [label="Access variable R|/y|"]; + 215 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; + 216 [label="Exit block"]; + } + 217 [label="Exit when branch result"]; + 191 [label="Enter when branch result"]; + subgraph cluster_50 { + color=blue + 192 [label="Enter block"]; + 193 [label="Access variable R|/x|"]; + 194 [label="Function call: R|/x|.R|/A.foo|()"]; + 195 [label="Access variable R|/y|"]; + 196 [label="Function call: R|/y|.R|/A.foo|()"]; + 197 [label="Exit block"]; + } + 198 [label="Exit when branch result"]; + 184 [label="Enter when branch result"]; + subgraph cluster_51 { + color=blue + 185 [label="Enter block"]; + 186 [label="Exit block"]; + } + 187 [label="Exit when branch result"]; + 178 [label="Exit when"]; } - subgraph cluster_44 { - color=blue - 213 [label="Enter when branch condition else"]; - 214 [label="Exit when branch condition"]; - } - 215 [label="Enter when branch result"]; - subgraph cluster_45 { - color=blue - 216 [label="Enter block"]; - 217 [label="Access variable R|/x|"]; - 218 [label="Function call: R|/x|.R|/A.foo|()"]; - 219 [label="Access variable R|/x|"]; - 220 [label="Function call: R|/x|.R|/B.bar|()"]; - 221 [label="Access variable R|/y|"]; - 222 [label="Function call: R|/y|.R|/A.foo|()"]; - 223 [label="Access variable R|/y|"]; - 224 [label="Function call: R|/y|.R|/B.bar|()"]; - 225 [label="Exit block"]; - } - 226 [label="Exit when branch result"]; - 197 [label="Enter when branch result"]; - subgraph cluster_46 { - color=blue - 198 [label="Enter block"]; - 199 [label="Access variable R|/x|"]; - 200 [label="Function call: R|/x|.R|/A.foo|()"]; - 201 [label="Access variable R|/x|"]; - 202 [label="Function call: R|/x|.R|/B.bar|()"]; - 203 [label="Access variable R|/x|"]; - 204 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 205 [label="Access variable R|/y|"]; - 206 [label="Function call: R|/y|.R|/A.foo|()"]; - 207 [label="Access variable R|/y|"]; - 208 [label="Function call: R|/y|.R|/B.bar|()"]; - 209 [label="Access variable R|/y|"]; - 210 [label="Function call: R|/y|.R|kotlin/Int.inc|()"]; - 211 [label="Exit block"]; - } - 212 [label="Exit when branch result"]; - 186 [label="Enter when branch result"]; - subgraph cluster_47 { - color=blue - 187 [label="Enter block"]; - 188 [label="Access variable R|/x|"]; - 189 [label="Function call: R|/x|.R|/A.foo|()"]; - 190 [label="Access variable R|/y|"]; - 191 [label="Function call: R|/y|.R|/A.foo|()"]; - 192 [label="Exit block"]; - } - 193 [label="Exit when branch result"]; - 179 [label="Enter when branch result"]; - subgraph cluster_48 { - color=blue - 180 [label="Enter block"]; - 181 [label="Exit block"]; - } - 182 [label="Exit when branch result"]; - 173 [label="Exit when"]; + 232 [label="Exit block"]; } - 144 [label="Exit function test_3" style="filled" fillcolor=red]; + 148 [label="Exit function test_3" style="filled" fillcolor=red]; } - 143 -> {145}; - 145 -> {147}; - 146 -> {172}; - 147 -> {148}; - 148 -> {149}; + 147 -> {149}; 149 -> {150}; - 150 -> {151}; - 151 -> {152 160}; + 150 -> {152}; + 151 -> {177}; 152 -> {153}; 153 -> {154}; 154 -> {155}; 155 -> {156}; - 156 -> {157}; + 156 -> {157 165}; 157 -> {158}; 158 -> {159}; - 159 -> {146}; + 159 -> {160}; 160 -> {161}; 161 -> {162}; - 162 -> {163 171}; + 162 -> {163}; 163 -> {164}; - 164 -> {165}; + 164 -> {151}; 165 -> {166}; 166 -> {167}; - 167 -> {168}; + 167 -> {168 176}; 168 -> {169}; 169 -> {170}; - 170 -> {146}; - 171 -> {146}; - 172 -> {174}; - 173 -> {144}; + 170 -> {171}; + 171 -> {172}; + 172 -> {173}; + 173 -> {174}; 174 -> {175}; - 175 -> {176}; - 176 -> {177}; - 177 -> {178}; - 178 -> {179 183}; + 175 -> {151}; + 176 -> {151}; + 177 -> {179}; + 178 -> {232}; 179 -> {180}; 180 -> {181}; 181 -> {182}; - 182 -> {173}; - 183 -> {184}; + 182 -> {183}; + 183 -> {184 188}; 184 -> {185}; - 185 -> {186 194}; + 185 -> {186}; 186 -> {187}; - 187 -> {188}; + 187 -> {178}; 188 -> {189}; 189 -> {190}; - 190 -> {191}; + 190 -> {191 199}; 191 -> {192}; 192 -> {193}; - 193 -> {173}; + 193 -> {194}; 194 -> {195}; 195 -> {196}; - 196 -> {197 213}; + 196 -> {197}; 197 -> {198}; - 198 -> {199}; + 198 -> {178}; 199 -> {200}; 200 -> {201}; - 201 -> {202}; + 201 -> {202 218}; 202 -> {203}; 203 -> {204}; 204 -> {205}; @@ -588,12 +603,12 @@ digraph when_kt { 209 -> {210}; 210 -> {211}; 211 -> {212}; - 212 -> {173}; + 212 -> {213}; 213 -> {214}; 214 -> {215}; 215 -> {216}; 216 -> {217}; - 217 -> {218}; + 217 -> {178}; 218 -> {219}; 219 -> {220}; 220 -> {221}; @@ -602,56 +617,69 @@ digraph when_kt { 223 -> {224}; 224 -> {225}; 225 -> {226}; - 226 -> {173}; + 226 -> {227}; + 227 -> {228}; + 228 -> {229}; + 229 -> {230}; + 230 -> {231}; + 231 -> {178}; + 232 -> {148}; - subgraph cluster_49 { + subgraph cluster_52 { color=red - 227 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_50 { + 233 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_53 { color=blue - 229 [label="Enter when"]; - 231 [label="Access variable R|/x|"]; - 232 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; - subgraph cluster_51 { + 235 [label="Enter block"]; + subgraph cluster_54 { color=blue - 233 [label="Enter when branch condition "]; - 234 [label="Const: Int(1)"]; - 235 [label="Operator =="]; - 236 [label="Exit when branch condition"]; + 236 [label="Enter when"]; + 238 [label="Access variable R|/x|"]; + 239 [label="Type operator: (R|/x| as R|kotlin/Int|)"]; + subgraph cluster_55 { + color=blue + 240 [label="Enter when branch condition "]; + 241 [label="Const: Int(1)"]; + 242 [label="Operator =="]; + 243 [label="Exit when branch condition"]; + } + 250 [label="Synthetic else branch"]; + 244 [label="Enter when branch result"]; + subgraph cluster_56 { + color=blue + 245 [label="Enter block"]; + 246 [label="Access variable R|/x|"]; + 247 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 248 [label="Exit block"]; + } + 249 [label="Exit when branch result"]; + 237 [label="Exit when"]; } - 243 [label="Synthetic else branch"]; - 237 [label="Enter when branch result"]; - subgraph cluster_52 { - color=blue - 238 [label="Enter block"]; - 239 [label="Access variable R|/x|"]; - 240 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 241 [label="Exit block"]; - } - 242 [label="Exit when branch result"]; - 230 [label="Exit when"]; + 251 [label="Access variable R|/x|"]; + 252 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 253 [label="Exit block"]; } - 244 [label="Access variable R|/x|"]; - 245 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 228 [label="Exit function test_4" style="filled" fillcolor=red]; + 234 [label="Exit function test_4" style="filled" fillcolor=red]; } - 227 -> {229}; - 229 -> {231}; - 230 -> {244}; - 231 -> {232}; - 232 -> {233}; - 233 -> {234}; - 234 -> {235}; + 233 -> {235}; 235 -> {236}; - 236 -> {237 243}; - 237 -> {238}; + 236 -> {238}; + 237 -> {251}; 238 -> {239}; 239 -> {240}; 240 -> {241}; 241 -> {242}; - 242 -> {230}; - 243 -> {230}; + 242 -> {243}; + 243 -> {244 250}; 244 -> {245}; - 245 -> {228}; + 245 -> {246}; + 246 -> {247}; + 247 -> {248}; + 248 -> {249}; + 249 -> {237}; + 250 -> {237}; + 251 -> {252}; + 252 -> {253}; + 253 -> {234}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot index 75dc8077c7b..162ab1bdac9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/equalsAndIdentity.dot @@ -12,314 +12,335 @@ digraph equalsAndIdentity_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 6 [label="Enter when"]; + 6 [label="Enter block"]; subgraph cluster_4 { color=blue - 8 [label="Enter when branch condition "]; - 9 [label="Access variable R|/x|"]; - 10 [label="Access variable R|/y|"]; - 11 [label="Operator =="]; - 12 [label="Exit when branch condition"]; + 7 [label="Enter when"]; + subgraph cluster_5 { + color=blue + 9 [label="Enter when branch condition "]; + 10 [label="Access variable R|/x|"]; + 11 [label="Access variable R|/y|"]; + 12 [label="Operator =="]; + 13 [label="Exit when branch condition"]; + } + 22 [label="Synthetic else branch"]; + 14 [label="Enter when branch result"]; + subgraph cluster_6 { + color=blue + 15 [label="Enter block"]; + 16 [label="Access variable R|/x|"]; + 17 [label="Function call: R|/x|.R|/A.foo|()"]; + 18 [label="Access variable R|/y|"]; + 19 [label="Function call: R|/y|.R|/A.foo|()"]; + 20 [label="Exit block"]; + } + 21 [label="Exit when branch result"]; + 8 [label="Exit when"]; } - 21 [label="Synthetic else branch"]; - 13 [label="Enter when branch result"]; - subgraph cluster_5 { - color=blue - 14 [label="Enter block"]; - 15 [label="Access variable R|/x|"]; - 16 [label="Function call: R|/x|.R|/A.foo|()"]; - 17 [label="Access variable R|/y|"]; - 18 [label="Function call: R|/y|.R|/A.foo|()"]; - 19 [label="Exit block"]; - } - 20 [label="Exit when branch result"]; - 7 [label="Exit when"]; - } - subgraph cluster_6 { - color=blue - 22 [label="Enter when"]; subgraph cluster_7 { color=blue - 24 [label="Enter when branch condition "]; - 25 [label="Access variable R|/x|"]; - 26 [label="Access variable R|/y|"]; - 27 [label="Operator ==="]; - 28 [label="Exit when branch condition"]; + 23 [label="Enter when"]; + subgraph cluster_8 { + color=blue + 25 [label="Enter when branch condition "]; + 26 [label="Access variable R|/x|"]; + 27 [label="Access variable R|/y|"]; + 28 [label="Operator ==="]; + 29 [label="Exit when branch condition"]; + } + 38 [label="Synthetic else branch"]; + 30 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 31 [label="Enter block"]; + 32 [label="Access variable R|/x|"]; + 33 [label="Function call: R|/x|.R|/A.foo|()"]; + 34 [label="Access variable R|/y|"]; + 35 [label="Function call: R|/y|.R|/A.foo|()"]; + 36 [label="Exit block"]; + } + 37 [label="Exit when branch result"]; + 24 [label="Exit when"]; } - 37 [label="Synthetic else branch"]; - 29 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 30 [label="Enter block"]; - 31 [label="Access variable R|/x|"]; - 32 [label="Function call: R|/x|.R|/A.foo|()"]; - 33 [label="Access variable R|/y|"]; - 34 [label="Function call: R|/y|.R|/A.foo|()"]; - 35 [label="Exit block"]; - } - 36 [label="Exit when branch result"]; - 23 [label="Exit when"]; + 39 [label="Exit block"]; } 5 [label="Exit function test_1" style="filled" fillcolor=red]; } 4 -> {6}; - 6 -> {8}; - 7 -> {22}; - 8 -> {9}; + 6 -> {7}; + 7 -> {9}; + 8 -> {23}; 9 -> {10}; 10 -> {11}; 11 -> {12}; - 12 -> {13 21}; - 13 -> {14}; + 12 -> {13}; + 13 -> {14 22}; 14 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; 19 -> {20}; - 20 -> {7}; - 21 -> {7}; - 22 -> {24}; - 23 -> {5}; - 24 -> {25}; + 20 -> {21}; + 21 -> {8}; + 22 -> {8}; + 23 -> {25}; + 24 -> {39}; 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {29 37}; - 29 -> {30}; + 28 -> {29}; + 29 -> {30 38}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; 34 -> {35}; 35 -> {36}; - 36 -> {23}; - 37 -> {23}; + 36 -> {37}; + 37 -> {24}; + 38 -> {24}; + 39 -> {5}; - subgraph cluster_9 { + subgraph cluster_10 { color=red - 38 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_10 { + 40 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_11 { color=blue - 40 [label="Enter when"]; - subgraph cluster_11 { - color=blue - 42 [label="Enter when branch condition "]; - 43 [label="Access variable R|/x|"]; - 44 [label="Access variable R|/y|"]; - 45 [label="Operator =="]; - 46 [label="Exit when branch condition"]; - } - 55 [label="Synthetic else branch"]; - 47 [label="Enter when branch result"]; + 42 [label="Enter block"]; subgraph cluster_12 { color=blue - 48 [label="Enter block"]; - 49 [label="Access variable R|/x|"]; - 50 [label="Function call: R|/x|.#()"]; - 51 [label="Access variable R|/y|"]; - 52 [label="Function call: R|/y|.#()"]; - 53 [label="Exit block"]; + 43 [label="Enter when"]; + subgraph cluster_13 { + color=blue + 45 [label="Enter when branch condition "]; + 46 [label="Access variable R|/x|"]; + 47 [label="Access variable R|/y|"]; + 48 [label="Operator =="]; + 49 [label="Exit when branch condition"]; + } + 58 [label="Synthetic else branch"]; + 50 [label="Enter when branch result"]; + subgraph cluster_14 { + color=blue + 51 [label="Enter block"]; + 52 [label="Access variable R|/x|"]; + 53 [label="Function call: R|/x|.#()"]; + 54 [label="Access variable R|/y|"]; + 55 [label="Function call: R|/y|.#()"]; + 56 [label="Exit block"]; + } + 57 [label="Exit when branch result"]; + 44 [label="Exit when"]; } - 54 [label="Exit when branch result"]; - 41 [label="Exit when"]; - } - subgraph cluster_13 { - color=blue - 56 [label="Enter when"]; - subgraph cluster_14 { - color=blue - 58 [label="Enter when branch condition "]; - 59 [label="Access variable R|/x|"]; - 60 [label="Access variable R|/y|"]; - 61 [label="Operator ==="]; - 62 [label="Exit when branch condition"]; - } - 71 [label="Synthetic else branch"]; - 63 [label="Enter when branch result"]; subgraph cluster_15 { color=blue - 64 [label="Enter block"]; - 65 [label="Access variable R|/x|"]; - 66 [label="Function call: R|/x|.#()"]; - 67 [label="Access variable R|/y|"]; - 68 [label="Function call: R|/y|.#()"]; - 69 [label="Exit block"]; + 59 [label="Enter when"]; + subgraph cluster_16 { + color=blue + 61 [label="Enter when branch condition "]; + 62 [label="Access variable R|/x|"]; + 63 [label="Access variable R|/y|"]; + 64 [label="Operator ==="]; + 65 [label="Exit when branch condition"]; + } + 74 [label="Synthetic else branch"]; + 66 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 67 [label="Enter block"]; + 68 [label="Access variable R|/x|"]; + 69 [label="Function call: R|/x|.#()"]; + 70 [label="Access variable R|/y|"]; + 71 [label="Function call: R|/y|.#()"]; + 72 [label="Exit block"]; + } + 73 [label="Exit when branch result"]; + 60 [label="Exit when"]; } - 70 [label="Exit when branch result"]; - 57 [label="Exit when"]; + 75 [label="Exit block"]; } - 39 [label="Exit function test_2" style="filled" fillcolor=red]; + 41 [label="Exit function test_2" style="filled" fillcolor=red]; } - 38 -> {40}; 40 -> {42}; - 41 -> {56}; 42 -> {43}; - 43 -> {44}; - 44 -> {45}; + 43 -> {45}; + 44 -> {59}; 45 -> {46}; - 46 -> {47 55}; + 46 -> {47}; 47 -> {48}; 48 -> {49}; - 49 -> {50}; + 49 -> {50 58}; 50 -> {51}; 51 -> {52}; 52 -> {53}; 53 -> {54}; - 54 -> {41}; - 55 -> {41}; - 56 -> {58}; - 57 -> {39}; - 58 -> {59}; - 59 -> {60}; - 60 -> {61}; + 54 -> {55}; + 55 -> {56}; + 56 -> {57}; + 57 -> {44}; + 58 -> {44}; + 59 -> {61}; + 60 -> {75}; 61 -> {62}; - 62 -> {63 71}; + 62 -> {63}; 63 -> {64}; 64 -> {65}; - 65 -> {66}; + 65 -> {66 74}; 66 -> {67}; 67 -> {68}; 68 -> {69}; 69 -> {70}; - 70 -> {57}; - 71 -> {57}; + 70 -> {71}; + 71 -> {72}; + 72 -> {73}; + 73 -> {60}; + 74 -> {60}; + 75 -> {41}; - subgraph cluster_16 { + subgraph cluster_18 { color=red - 72 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_17 { + 76 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_19 { color=blue - 74 [label="Enter when"]; - subgraph cluster_18 { + 78 [label="Enter block"]; + subgraph cluster_20 { color=blue - 76 [label="Enter when branch condition "]; - 77 [label="Access variable R|/y|"]; - 78 [label="Const: Null(null)"]; - 79 [label="Operator =="]; - 80 [label="Exit when branch condition"]; + 79 [label="Enter when"]; + subgraph cluster_21 { + color=blue + 81 [label="Enter when branch condition "]; + 82 [label="Access variable R|/y|"]; + 83 [label="Const: Null(null)"]; + 84 [label="Operator =="]; + 85 [label="Exit when branch condition"]; + } + 92 [label="Synthetic else branch"]; + 86 [label="Enter when branch result"]; + subgraph cluster_22 { + color=blue + 87 [label="Enter block"]; + 88 [label="Jump: ^test_3 Unit"]; + 89 [label="Stub" style="filled" fillcolor=gray]; + 90 [label="Exit block" style="filled" fillcolor=gray]; + } + 91 [label="Exit when branch result" style="filled" fillcolor=gray]; + 80 [label="Exit when"]; } - 87 [label="Synthetic else branch"]; - 81 [label="Enter when branch result"]; - subgraph cluster_19 { + subgraph cluster_23 { color=blue - 82 [label="Enter block"]; - 83 [label="Jump: ^test_3 Unit"]; - 84 [label="Stub" style="filled" fillcolor=gray]; - 85 [label="Exit block" style="filled" fillcolor=gray]; + 93 [label="Enter when"]; + subgraph cluster_24 { + color=blue + 95 [label="Enter when branch condition "]; + 96 [label="Access variable R|/x|"]; + 97 [label="Access variable R|/y|"]; + 98 [label="Operator =="]; + 99 [label="Exit when branch condition"]; + } + 108 [label="Synthetic else branch"]; + 100 [label="Enter when branch result"]; + subgraph cluster_25 { + color=blue + 101 [label="Enter block"]; + 102 [label="Access variable R|/x|"]; + 103 [label="Function call: R|/x|.R|/A.foo|()"]; + 104 [label="Access variable R|/y|"]; + 105 [label="Function call: R|/y|.R|/A.foo|()"]; + 106 [label="Exit block"]; + } + 107 [label="Exit when branch result"]; + 94 [label="Exit when"]; } - 86 [label="Exit when branch result" style="filled" fillcolor=gray]; - 75 [label="Exit when"]; + subgraph cluster_26 { + color=blue + 109 [label="Enter when"]; + subgraph cluster_27 { + color=blue + 111 [label="Enter when branch condition "]; + 112 [label="Access variable R|/x|"]; + 113 [label="Access variable R|/y|"]; + 114 [label="Operator ==="]; + 115 [label="Exit when branch condition"]; + } + 124 [label="Synthetic else branch"]; + 116 [label="Enter when branch result"]; + subgraph cluster_28 { + color=blue + 117 [label="Enter block"]; + 118 [label="Access variable R|/x|"]; + 119 [label="Function call: R|/x|.R|/A.foo|()"]; + 120 [label="Access variable R|/y|"]; + 121 [label="Function call: R|/y|.R|/A.foo|()"]; + 122 [label="Exit block"]; + } + 123 [label="Exit when branch result"]; + 110 [label="Exit when"]; + } + 125 [label="Exit block"]; } - subgraph cluster_20 { - color=blue - 88 [label="Enter when"]; - subgraph cluster_21 { - color=blue - 90 [label="Enter when branch condition "]; - 91 [label="Access variable R|/x|"]; - 92 [label="Access variable R|/y|"]; - 93 [label="Operator =="]; - 94 [label="Exit when branch condition"]; - } - 103 [label="Synthetic else branch"]; - 95 [label="Enter when branch result"]; - subgraph cluster_22 { - color=blue - 96 [label="Enter block"]; - 97 [label="Access variable R|/x|"]; - 98 [label="Function call: R|/x|.R|/A.foo|()"]; - 99 [label="Access variable R|/y|"]; - 100 [label="Function call: R|/y|.R|/A.foo|()"]; - 101 [label="Exit block"]; - } - 102 [label="Exit when branch result"]; - 89 [label="Exit when"]; - } - subgraph cluster_23 { - color=blue - 104 [label="Enter when"]; - subgraph cluster_24 { - color=blue - 106 [label="Enter when branch condition "]; - 107 [label="Access variable R|/x|"]; - 108 [label="Access variable R|/y|"]; - 109 [label="Operator ==="]; - 110 [label="Exit when branch condition"]; - } - 119 [label="Synthetic else branch"]; - 111 [label="Enter when branch result"]; - subgraph cluster_25 { - color=blue - 112 [label="Enter block"]; - 113 [label="Access variable R|/x|"]; - 114 [label="Function call: R|/x|.R|/A.foo|()"]; - 115 [label="Access variable R|/y|"]; - 116 [label="Function call: R|/y|.R|/A.foo|()"]; - 117 [label="Exit block"]; - } - 118 [label="Exit when branch result"]; - 105 [label="Exit when"]; - } - 73 [label="Exit function test_3" style="filled" fillcolor=red]; + 77 [label="Exit function test_3" style="filled" fillcolor=red]; } - 72 -> {74}; - 74 -> {76}; - 75 -> {88}; - 76 -> {77}; - 77 -> {78}; + 76 -> {78}; 78 -> {79}; - 79 -> {80}; - 80 -> {81 87}; + 79 -> {81}; + 80 -> {93}; 81 -> {82}; 82 -> {83}; - 83 -> {73}; - 83 -> {84} [style=dotted]; - 84 -> {85} [style=dotted]; - 85 -> {86} [style=dotted]; - 86 -> {75} [style=dotted]; - 87 -> {75}; - 88 -> {90}; - 89 -> {104}; - 90 -> {91}; - 91 -> {92}; - 92 -> {93}; - 93 -> {94}; - 94 -> {95 103}; + 83 -> {84}; + 84 -> {85}; + 85 -> {86 92}; + 86 -> {87}; + 87 -> {88}; + 88 -> {77}; + 88 -> {89} [style=dotted]; + 89 -> {90} [style=dotted]; + 90 -> {91} [style=dotted]; + 91 -> {80} [style=dotted]; + 92 -> {80}; + 93 -> {95}; + 94 -> {109}; 95 -> {96}; 96 -> {97}; 97 -> {98}; 98 -> {99}; - 99 -> {100}; + 99 -> {100 108}; 100 -> {101}; 101 -> {102}; - 102 -> {89}; - 103 -> {89}; - 104 -> {106}; - 105 -> {73}; + 102 -> {103}; + 103 -> {104}; + 104 -> {105}; + 105 -> {106}; 106 -> {107}; - 107 -> {108}; - 108 -> {109}; - 109 -> {110}; - 110 -> {111 119}; + 107 -> {94}; + 108 -> {94}; + 109 -> {111}; + 110 -> {125}; 111 -> {112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; - 115 -> {116}; + 115 -> {116 124}; 116 -> {117}; 117 -> {118}; - 118 -> {105}; - 119 -> {105}; + 118 -> {119}; + 119 -> {120}; + 120 -> {121}; + 121 -> {122}; + 122 -> {123}; + 123 -> {110}; + 124 -> {110}; + 125 -> {77}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot index 841ef240620..f0dde385b9f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/inPlaceLambdas.dot @@ -12,10 +12,10 @@ digraph inPlaceLambdas_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red @@ -26,167 +26,209 @@ digraph inPlaceLambdas_kt { subgraph cluster_3 { color=red - 6 [label="Enter class B" style="filled" fillcolor=red]; - 7 [label="Exit class B" style="filled" fillcolor=red]; + 7 [label="Enter class B" style="filled" fillcolor=red]; + 6 [label="Exit class B" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; + 7 -> {6} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 10 [label="Enter when"]; + 10 [label="Enter block"]; subgraph cluster_6 { color=blue - 12 [label="Enter when branch condition "]; - 13 [label="Access variable R|/x|"]; - 14 [label="Type operator: (R|/x| is R|A|)"]; - 15 [label="Exit when branch condition"]; - } - 24 [label="Synthetic else branch"]; - 16 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 17 [label="Enter block"]; - 18 [label="Postponed enter to lambda"]; + 11 [label="Enter when"]; + subgraph cluster_7 { + color=blue + 13 [label="Enter when branch condition "]; + 14 [label="Access variable R|/x|"]; + 15 [label="Type operator: (R|/x| is R|A|)"]; + 16 [label="Exit when branch condition"]; + } + 25 [label="Synthetic else branch"]; + 17 [label="Enter when branch result"]; subgraph cluster_8 { color=blue - 25 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 27 [label="Access variable R|/x|"]; - 28 [label="Function call: R|/x|.R|/A.foo|()"]; - 26 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 18 [label="Enter block"]; + 19 [label="Postponed enter to lambda"]; + subgraph cluster_9 { + color=blue + 27 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_10 { + color=blue + 29 [label="Enter block"]; + 30 [label="Access variable R|/x|"]; + 31 [label="Function call: R|/x|.R|/A.foo|()"]; + 32 [label="Exit block"]; + } + 28 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 22 [label="Call arguments union" style="filled" fillcolor=yellow]; + 20 [label="Postponed exit from lambda"]; + 21 [label="Function call: R|kotlin/run|(...)"]; + 23 [label="Exit block"]; } - 21 [label="Call arguments union" style="filled" fillcolor=yellow]; - 19 [label="Postponed exit from lambda"]; - 20 [label="Function call: R|kotlin/run|(...)"]; - 22 [label="Exit block"]; + 24 [label="Exit when branch result"]; + 12 [label="Exit when"]; } - 23 [label="Exit when branch result"]; - 11 [label="Exit when"]; + 26 [label="Exit block"]; } 9 [label="Exit function test_1" style="filled" fillcolor=red]; } 8 -> {10}; - 10 -> {12}; - 11 -> {9}; - 12 -> {13}; + 10 -> {11}; + 11 -> {13}; + 12 -> {26}; 13 -> {14}; 14 -> {15}; - 15 -> {16 24}; - 16 -> {17}; + 15 -> {16}; + 16 -> {17 25}; 17 -> {18}; - 18 -> {25}; - 18 -> {19} [color=red]; - 19 -> {20} [color=green]; - 20 -> {22}; - 21 -> {20} [color=red]; - 22 -> {23}; - 23 -> {11}; - 24 -> {11}; - 25 -> {27}; - 26 -> {19} [color=green]; - 26 -> {21} [color=red]; - 27 -> {28}; - 28 -> {26}; - - subgraph cluster_9 { - color=red - 29 [label="Enter function test_2" style="filled" fillcolor=red]; - 31 [label="Postponed enter to lambda"]; - subgraph cluster_10 { - color=blue - 37 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 39 [label="Access variable R|/x|"]; - 40 [label="Type operator: (R|/x| as R|B|)"]; - 38 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 34 [label="Call arguments union" style="filled" fillcolor=yellow]; - 32 [label="Postponed exit from lambda"]; - 33 [label="Function call: R|kotlin/run|(...)"]; - 35 [label="Access variable R|/x|"]; - 36 [label="Function call: R|/x|.R|/B.bar|()"]; - 30 [label="Exit function test_2" style="filled" fillcolor=red]; - } - 29 -> {31}; - 31 -> {37}; - 31 -> {32} [color=red]; - 32 -> {33} [color=green]; - 33 -> {35}; - 34 -> {33} [color=red]; - 35 -> {36}; - 36 -> {30}; - 37 -> {39}; - 38 -> {32} [color=green]; - 38 -> {34} [color=red]; - 39 -> {40}; - 40 -> {38}; + 18 -> {19}; + 19 -> {27}; + 19 -> {20} [color=red]; + 20 -> {21} [color=green]; + 21 -> {23}; + 22 -> {21} [color=red]; + 23 -> {24}; + 24 -> {12}; + 25 -> {12}; + 26 -> {9}; + 27 -> {29}; + 28 -> {20} [color=green]; + 28 -> {22} [color=red]; + 29 -> {30}; + 30 -> {31}; + 31 -> {32}; + 32 -> {28}; subgraph cluster_11 { color=red - 41 [label="Enter function test_3" style="filled" fillcolor=red]; + 33 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_12 { color=blue - 43 [label="Enter when"]; + 35 [label="Enter block"]; + 36 [label="Postponed enter to lambda"]; subgraph cluster_13 { color=blue - 45 [label="Enter when branch condition "]; - 46 [label="Access variable R|/x|"]; - 47 [label="Type operator: (R|/x| is R|A|)"]; - 48 [label="Exit when branch condition"]; - } - 59 [label="Synthetic else branch"]; - 49 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 50 [label="Enter block"]; - 51 [label="Postponed enter to lambda"]; - subgraph cluster_15 { + 43 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_14 { color=blue - 60 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 62 [label="Access variable R|/x|"]; - 63 [label="Function call: R|/x|.R|/A.foo|()"]; - 64 [label="Access variable R|/x|"]; - 65 [label="Type operator: (R|/x| as R|B|)"]; - 61 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 45 [label="Enter block"]; + 46 [label="Access variable R|/x|"]; + 47 [label="Type operator: (R|/x| as R|B|)"]; + 48 [label="Exit block"]; } - 54 [label="Call arguments union" style="filled" fillcolor=yellow]; - 52 [label="Postponed exit from lambda"]; - 53 [label="Function call: R|kotlin/run|(...)"]; - 55 [label="Access variable R|/x|"]; - 56 [label="Function call: R|/x|.R|/B.bar|()"]; - 57 [label="Exit block"]; + 44 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - 58 [label="Exit when branch result"]; - 44 [label="Exit when"]; + 39 [label="Call arguments union" style="filled" fillcolor=yellow]; + 37 [label="Postponed exit from lambda"]; + 38 [label="Function call: R|kotlin/run|(...)"]; + 40 [label="Access variable R|/x|"]; + 41 [label="Function call: R|/x|.R|/B.bar|()"]; + 42 [label="Exit block"]; } - 42 [label="Exit function test_3" style="filled" fillcolor=red]; + 34 [label="Exit function test_2" style="filled" fillcolor=red]; } - 41 -> {43}; + 33 -> {35}; + 35 -> {36}; + 36 -> {43}; + 36 -> {37} [color=red]; + 37 -> {38} [color=green]; + 38 -> {40}; + 39 -> {38} [color=red]; + 40 -> {41}; + 41 -> {42}; + 42 -> {34}; 43 -> {45}; - 44 -> {42}; + 44 -> {37} [color=green]; + 44 -> {39} [color=red]; 45 -> {46}; 46 -> {47}; 47 -> {48}; - 48 -> {49 59}; - 49 -> {50}; - 50 -> {51}; - 51 -> {60}; - 51 -> {52} [color=red]; - 52 -> {53} [color=green]; - 53 -> {55}; - 54 -> {53} [color=red]; + 48 -> {44}; + + subgraph cluster_15 { + color=red + 49 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_16 { + color=blue + 51 [label="Enter block"]; + subgraph cluster_17 { + color=blue + 52 [label="Enter when"]; + subgraph cluster_18 { + color=blue + 54 [label="Enter when branch condition "]; + 55 [label="Access variable R|/x|"]; + 56 [label="Type operator: (R|/x| is R|A|)"]; + 57 [label="Exit when branch condition"]; + } + 68 [label="Synthetic else branch"]; + 58 [label="Enter when branch result"]; + subgraph cluster_19 { + color=blue + 59 [label="Enter block"]; + 60 [label="Postponed enter to lambda"]; + subgraph cluster_20 { + color=blue + 70 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_21 { + color=blue + 72 [label="Enter block"]; + 73 [label="Access variable R|/x|"]; + 74 [label="Function call: R|/x|.R|/A.foo|()"]; + 75 [label="Access variable R|/x|"]; + 76 [label="Type operator: (R|/x| as R|B|)"]; + 77 [label="Exit block"]; + } + 71 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 63 [label="Call arguments union" style="filled" fillcolor=yellow]; + 61 [label="Postponed exit from lambda"]; + 62 [label="Function call: R|kotlin/run|(...)"]; + 64 [label="Access variable R|/x|"]; + 65 [label="Function call: R|/x|.R|/B.bar|()"]; + 66 [label="Exit block"]; + } + 67 [label="Exit when branch result"]; + 53 [label="Exit when"]; + } + 69 [label="Exit block"]; + } + 50 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 49 -> {51}; + 51 -> {52}; + 52 -> {54}; + 53 -> {69}; + 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {58}; - 58 -> {44}; - 59 -> {44}; - 60 -> {62}; - 61 -> {52} [color=green]; - 61 -> {54} [color=red]; - 62 -> {63}; - 63 -> {64}; + 57 -> {58 68}; + 58 -> {59}; + 59 -> {60}; + 60 -> {70}; + 60 -> {61} [color=red]; + 61 -> {62} [color=green]; + 62 -> {64}; + 63 -> {62} [color=red]; 64 -> {65}; - 65 -> {61}; + 65 -> {66}; + 66 -> {67}; + 67 -> {53}; + 68 -> {53}; + 69 -> {50}; + 70 -> {72}; + 71 -> {61} [color=green]; + 71 -> {63} [color=red]; + 72 -> {73}; + 73 -> {74}; + 74 -> {75}; + 75 -> {76}; + 76 -> {77}; + 77 -> {71}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/smartcastOnLambda.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/smartcastOnLambda.dot index d17f2109ec7..054307f4d97 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/smartcastOnLambda.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/smartcastOnLambda.dot @@ -8,41 +8,48 @@ digraph smartcastOnLambda_kt { 0 [label="Enter function test" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 4 [label="Enter when branch condition "]; - 5 [label="Access variable R|/func|"]; - 6 [label="Const: Null(null)"]; - 7 [label="Operator !="]; - 8 [label="Exit when branch condition"]; + 3 [label="Enter when"]; + subgraph cluster_3 { + color=blue + 5 [label="Enter when branch condition "]; + 6 [label="Access variable R|/func|"]; + 7 [label="Const: Null(null)"]; + 8 [label="Operator !="]; + 9 [label="Exit when branch condition"]; + } + 15 [label="Synthetic else branch"]; + 10 [label="Enter when branch result"]; + subgraph cluster_4 { + color=blue + 11 [label="Enter block"]; + 12 [label="Function call: R|/func|.R|FakeOverride|()"]; + 13 [label="Exit block"]; + } + 14 [label="Exit when branch result"]; + 4 [label="Exit when"]; } - 14 [label="Synthetic else branch"]; - 9 [label="Enter when branch result"]; - subgraph cluster_3 { - color=blue - 10 [label="Enter block"]; - 11 [label="Function call: R|/func|.R|FakeOverride|()"]; - 12 [label="Exit block"]; - } - 13 [label="Exit when branch result"]; - 3 [label="Exit when"]; + 16 [label="Exit block"]; } 1 [label="Exit function test" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {1}; - 4 -> {5}; + 2 -> {3}; + 3 -> {5}; + 4 -> {16}; 5 -> {6}; 6 -> {7}; 7 -> {8}; - 8 -> {9 14}; - 9 -> {10}; + 8 -> {9}; + 9 -> {10 15}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {3}; - 14 -> {3}; + 13 -> {14}; + 14 -> {4}; + 15 -> {4}; + 16 -> {1}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot index d18d3268119..fd04310d6e8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/dataFlowInfoFromWhileCondition.dot @@ -12,85 +12,92 @@ digraph dataFlowInfoFromWhileCondition_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red - 4 [label="Enter class B" style="filled" fillcolor=red]; - 5 [label="Exit class B" style="filled" fillcolor=red]; + 5 [label="Enter class B" style="filled" fillcolor=red]; + 4 [label="Exit class B" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; + 5 -> {4} [color=green]; subgraph cluster_3 { color=red - 6 [label="Enter class C" style="filled" fillcolor=red]; - 7 [label="Exit class C" style="filled" fillcolor=red]; + 7 [label="Enter class C" style="filled" fillcolor=red]; + 6 [label="Exit class C" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; + 7 -> {6} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function test" style="filled" fillcolor=red]; - 10 [label="Const: Null(null)"]; - 11 [label="Variable declaration: lvar a: R|A?|"]; subgraph cluster_5 { color=blue - 12 [label="Enter while loop"]; + 10 [label="Enter block"]; + 11 [label="Const: Null(null)"]; + 12 [label="Variable declaration: lvar a: R|A?|"]; subgraph cluster_6 { color=blue - 14 [label="Enter loop condition"]; + 13 [label="Enter while loop"]; subgraph cluster_7 { color=blue - 16 [label="Enter ||"]; - 17 [label="Access variable R|/a|"]; - 18 [label="Type operator: (R|/a| is R|B|)"]; - 19 [label="Exit left part of ||"]; - 20 [label="Enter right part of ||"]; - 21 [label="Access variable R|/a|"]; - 22 [label="Type operator: (R|/a| is R|C|)"]; - 15 [label="Exit ||"]; + 15 [label="Enter loop condition"]; + subgraph cluster_8 { + color=blue + 17 [label="Enter ||"]; + 18 [label="Access variable R|/a|"]; + 19 [label="Type operator: (R|/a| is R|B|)"]; + 20 [label="Exit left part of ||"]; + 21 [label="Enter right part of ||"]; + 22 [label="Access variable R|/a|"]; + 23 [label="Type operator: (R|/a| is R|C|)"]; + 16 [label="Exit ||"]; + } + 24 [label="Exit loop condition"]; } - 23 [label="Exit loop condition"]; - } - subgraph cluster_8 { - color=blue - 24 [label="Enter loop block"]; subgraph cluster_9 { color=blue - 25 [label="Enter block"]; - 26 [label="Access variable R|/a|"]; - 27 [label="Function call: R|/a|.R|/A.foo|()"]; - 28 [label="Exit block"]; + 25 [label="Enter loop block"]; + subgraph cluster_10 { + color=blue + 26 [label="Enter block"]; + 27 [label="Access variable R|/a|"]; + 28 [label="Function call: R|/a|.R|/A.foo|()"]; + 29 [label="Exit block"]; + } + 30 [label="Exit loop block"]; } - 29 [label="Exit loop block"]; + 14 [label="Exit whileloop"]; } - 13 [label="Exit whileloop"]; + 31 [label="Exit block"]; } 9 [label="Exit function test" style="filled" fillcolor=red]; } 8 -> {10}; 10 -> {11}; 11 -> {12}; - 12 -> {14}; - 13 -> {9}; - 14 -> {16}; - 15 -> {23}; - 16 -> {17}; + 12 -> {13}; + 13 -> {15}; + 14 -> {31}; + 15 -> {17}; + 16 -> {24}; 17 -> {18}; 18 -> {19}; - 19 -> {15 20}; - 20 -> {21}; + 19 -> {20}; + 20 -> {16 21}; 21 -> {22}; - 22 -> {15}; - 23 -> {13 24}; - 24 -> {25}; + 22 -> {23}; + 23 -> {16}; + 24 -> {14 25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; 28 -> {29}; - 29 -> {14} [color=green style=dashed]; + 29 -> {30}; + 30 -> {15} [color=green style=dashed]; + 31 -> {9}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot index d2464d8b7b2..513a134c3b4 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/loops/endlessLoops.dot @@ -12,574 +12,623 @@ digraph endlessLoops_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 6 [label="Enter while loop"]; + 6 [label="Enter block"]; subgraph cluster_4 { color=blue - 8 [label="Enter loop condition"]; - 9 [label="Const: Boolean(true)"]; - 10 [label="Exit loop condition"]; - } - subgraph cluster_5 { - color=blue - 11 [label="Enter loop block"]; + 7 [label="Enter while loop"]; + subgraph cluster_5 { + color=blue + 9 [label="Enter loop condition"]; + 10 [label="Const: Boolean(true)"]; + 11 [label="Exit loop condition"]; + } subgraph cluster_6 { color=blue - 12 [label="Enter block"]; - 13 [label="Access variable R|/x|"]; - 14 [label="Type operator: (R|/x| as R|A|)"]; + 12 [label="Enter loop block"]; subgraph cluster_7 { color=blue - 15 [label="Enter when"]; + 13 [label="Enter block"]; + 14 [label="Access variable R|/x|"]; + 15 [label="Type operator: (R|/x| as R|A|)"]; subgraph cluster_8 { color=blue - 17 [label="Enter when branch condition "]; - 18 [label="Access variable R|/b|"]; - 19 [label="Exit when branch condition"]; + 16 [label="Enter when"]; + subgraph cluster_9 { + color=blue + 18 [label="Enter when branch condition "]; + 19 [label="Access variable R|/b|"]; + 20 [label="Exit when branch condition"]; + } + 27 [label="Synthetic else branch"]; + 21 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 22 [label="Enter block"]; + 23 [label="Jump: break@@@[Boolean(true)] "]; + 24 [label="Stub" style="filled" fillcolor=gray]; + 25 [label="Exit block" style="filled" fillcolor=gray]; + } + 26 [label="Exit when branch result" style="filled" fillcolor=gray]; + 17 [label="Exit when"]; } - 26 [label="Synthetic else branch"]; - 20 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 21 [label="Enter block"]; - 22 [label="Jump: break@@@[Boolean(true)] "]; - 23 [label="Stub" style="filled" fillcolor=gray]; - 24 [label="Exit block" style="filled" fillcolor=gray]; - } - 25 [label="Exit when branch result" style="filled" fillcolor=gray]; - 16 [label="Exit when"]; + 28 [label="Exit block"]; } - 27 [label="Exit block"]; + 29 [label="Exit loop block"]; } - 28 [label="Exit loop block"]; + 8 [label="Exit whileloop"]; } - 7 [label="Exit whileloop"]; + 30 [label="Access variable R|/x|"]; + 31 [label="Function call: R|/x|.R|/A.foo|()"]; + 32 [label="Exit block"]; } - 29 [label="Access variable R|/x|"]; - 30 [label="Function call: R|/x|.R|/A.foo|()"]; 5 [label="Exit function test_1" style="filled" fillcolor=red]; } 4 -> {6}; - 6 -> {8}; - 7 -> {29}; - 8 -> {9}; + 6 -> {7}; + 7 -> {9}; + 8 -> {30}; 9 -> {10}; 10 -> {11}; - 10 -> {7} [style=dotted]; 11 -> {12}; + 11 -> {8} [style=dotted]; 12 -> {13}; 13 -> {14}; 14 -> {15}; - 15 -> {17}; - 16 -> {27}; - 17 -> {18}; + 15 -> {16}; + 16 -> {18}; + 17 -> {28}; 18 -> {19}; - 19 -> {20 26}; - 20 -> {21}; + 19 -> {20}; + 20 -> {21 27}; 21 -> {22}; - 22 -> {7}; - 22 -> {23} [style=dotted]; + 22 -> {23}; + 23 -> {8}; 23 -> {24} [style=dotted]; 24 -> {25} [style=dotted]; - 25 -> {16} [style=dotted]; - 26 -> {16}; - 27 -> {28}; - 28 -> {8} [color=green style=dashed]; - 29 -> {30}; - 30 -> {5}; + 25 -> {26} [style=dotted]; + 26 -> {17} [style=dotted]; + 27 -> {17}; + 28 -> {29}; + 29 -> {9} [color=green style=dashed]; + 30 -> {31}; + 31 -> {32}; + 32 -> {5}; - subgraph cluster_10 { + subgraph cluster_11 { color=red - 31 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_11 { + 33 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_12 { color=blue - 33 [label="Enter while loop"]; - subgraph cluster_12 { - color=blue - 35 [label="Enter loop condition"]; - 36 [label="Const: Boolean(true)"]; - 37 [label="Exit loop condition"]; - } + 35 [label="Enter block"]; subgraph cluster_13 { color=blue - 38 [label="Enter loop block"]; + 36 [label="Enter while loop"]; subgraph cluster_14 { color=blue - 39 [label="Enter block"]; - subgraph cluster_15 { + 38 [label="Enter loop condition"]; + 39 [label="Const: Boolean(true)"]; + 40 [label="Exit loop condition"]; + } + subgraph cluster_15 { + color=blue + 41 [label="Enter loop block"]; + subgraph cluster_16 { color=blue - 40 [label="Enter when"]; - subgraph cluster_16 { - color=blue - 42 [label="Enter when branch condition "]; - 43 [label="Access variable R|/b|"]; - 44 [label="Exit when branch condition"]; - } - 53 [label="Synthetic else branch"]; - 45 [label="Enter when branch result"]; + 42 [label="Enter block"]; subgraph cluster_17 { color=blue - 46 [label="Enter block"]; - 47 [label="Access variable R|/x|"]; - 48 [label="Type operator: (R|/x| as R|A|)"]; - 49 [label="Jump: break@@@[Boolean(true)] "]; - 50 [label="Stub" style="filled" fillcolor=gray]; - 51 [label="Exit block" style="filled" fillcolor=gray]; + 43 [label="Enter when"]; + subgraph cluster_18 { + color=blue + 45 [label="Enter when branch condition "]; + 46 [label="Access variable R|/b|"]; + 47 [label="Exit when branch condition"]; + } + 56 [label="Synthetic else branch"]; + 48 [label="Enter when branch result"]; + subgraph cluster_19 { + color=blue + 49 [label="Enter block"]; + 50 [label="Access variable R|/x|"]; + 51 [label="Type operator: (R|/x| as R|A|)"]; + 52 [label="Jump: break@@@[Boolean(true)] "]; + 53 [label="Stub" style="filled" fillcolor=gray]; + 54 [label="Exit block" style="filled" fillcolor=gray]; + } + 55 [label="Exit when branch result" style="filled" fillcolor=gray]; + 44 [label="Exit when"]; } - 52 [label="Exit when branch result" style="filled" fillcolor=gray]; - 41 [label="Exit when"]; + 57 [label="Exit block"]; } - 54 [label="Exit block"]; + 58 [label="Exit loop block"]; } - 55 [label="Exit loop block"]; + 37 [label="Exit whileloop"]; } - 34 [label="Exit whileloop"]; + 59 [label="Access variable R|/x|"]; + 60 [label="Function call: R|/x|.R|/A.foo|()"]; + 61 [label="Exit block"]; } - 56 [label="Access variable R|/x|"]; - 57 [label="Function call: R|/x|.R|/A.foo|()"]; - 32 [label="Exit function test_2" style="filled" fillcolor=red]; + 34 [label="Exit function test_2" style="filled" fillcolor=red]; } - 31 -> {33}; 33 -> {35}; - 34 -> {56}; 35 -> {36}; - 36 -> {37}; - 37 -> {38}; - 37 -> {34} [style=dotted]; + 36 -> {38}; + 37 -> {59}; 38 -> {39}; 39 -> {40}; - 40 -> {42}; - 41 -> {54}; + 40 -> {41}; + 40 -> {37} [style=dotted]; + 41 -> {42}; 42 -> {43}; - 43 -> {44}; - 44 -> {45 53}; + 43 -> {45}; + 44 -> {57}; 45 -> {46}; 46 -> {47}; - 47 -> {48}; + 47 -> {48 56}; 48 -> {49}; - 49 -> {34}; - 49 -> {50} [style=dotted]; - 50 -> {51} [style=dotted]; - 51 -> {52} [style=dotted]; - 52 -> {41} [style=dotted]; - 53 -> {41}; - 54 -> {55}; - 55 -> {35} [color=green style=dashed]; - 56 -> {57}; - 57 -> {32}; + 49 -> {50}; + 50 -> {51}; + 51 -> {52}; + 52 -> {37}; + 52 -> {53} [style=dotted]; + 53 -> {54} [style=dotted]; + 54 -> {55} [style=dotted]; + 55 -> {44} [style=dotted]; + 56 -> {44}; + 57 -> {58}; + 58 -> {38} [color=green style=dashed]; + 59 -> {60}; + 60 -> {61}; + 61 -> {34}; - subgraph cluster_18 { + subgraph cluster_20 { color=red - 58 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_19 { + 62 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_21 { color=blue - 60 [label="Enter while loop"]; - subgraph cluster_20 { + 64 [label="Enter block"]; + subgraph cluster_22 { color=blue - 62 [label="Enter loop condition"]; - 63 [label="Const: Boolean(true)"]; - 64 [label="Exit loop condition"]; - } - subgraph cluster_21 { - color=blue - 65 [label="Enter loop block"]; - subgraph cluster_22 { + 65 [label="Enter while loop"]; + subgraph cluster_23 { color=blue - 66 [label="Enter block"]; - 67 [label="Access variable R|/x|"]; - 68 [label="Type operator: (R|/x| as R|A|)"]; - subgraph cluster_23 { - color=blue - 69 [label="Enter when"]; - subgraph cluster_24 { - color=blue - 71 [label="Enter when branch condition "]; - 72 [label="Access variable R|/b|"]; - 73 [label="Exit when branch condition"]; - } - 80 [label="Synthetic else branch"]; - 74 [label="Enter when branch result"]; - subgraph cluster_25 { - color=blue - 75 [label="Enter block"]; - 76 [label="Jump: break@@@[Boolean(true)] "]; - 77 [label="Stub" style="filled" fillcolor=gray]; - 78 [label="Exit block" style="filled" fillcolor=gray]; - } - 79 [label="Exit when branch result" style="filled" fillcolor=gray]; - 70 [label="Exit when"]; - } - subgraph cluster_26 { - color=blue - 81 [label="Enter when"]; - subgraph cluster_27 { - color=blue - 83 [label="Enter when branch condition "]; - 84 [label="Access variable R|/b|"]; - 85 [label="Exit when branch condition"]; - } - 92 [label="Synthetic else branch"]; - 86 [label="Enter when branch result"]; - subgraph cluster_28 { - color=blue - 87 [label="Enter block"]; - 88 [label="Jump: break@@@[Boolean(true)] "]; - 89 [label="Stub" style="filled" fillcolor=gray]; - 90 [label="Exit block" style="filled" fillcolor=gray]; - } - 91 [label="Exit when branch result" style="filled" fillcolor=gray]; - 82 [label="Exit when"]; - } - 93 [label="Exit block"]; + 67 [label="Enter loop condition"]; + 68 [label="Const: Boolean(true)"]; + 69 [label="Exit loop condition"]; } - 94 [label="Exit loop block"]; + subgraph cluster_24 { + color=blue + 70 [label="Enter loop block"]; + subgraph cluster_25 { + color=blue + 71 [label="Enter block"]; + 72 [label="Access variable R|/x|"]; + 73 [label="Type operator: (R|/x| as R|A|)"]; + subgraph cluster_26 { + color=blue + 74 [label="Enter when"]; + subgraph cluster_27 { + color=blue + 76 [label="Enter when branch condition "]; + 77 [label="Access variable R|/b|"]; + 78 [label="Exit when branch condition"]; + } + 85 [label="Synthetic else branch"]; + 79 [label="Enter when branch result"]; + subgraph cluster_28 { + color=blue + 80 [label="Enter block"]; + 81 [label="Jump: break@@@[Boolean(true)] "]; + 82 [label="Stub" style="filled" fillcolor=gray]; + 83 [label="Exit block" style="filled" fillcolor=gray]; + } + 84 [label="Exit when branch result" style="filled" fillcolor=gray]; + 75 [label="Exit when"]; + } + subgraph cluster_29 { + color=blue + 86 [label="Enter when"]; + subgraph cluster_30 { + color=blue + 88 [label="Enter when branch condition "]; + 89 [label="Access variable R|/b|"]; + 90 [label="Exit when branch condition"]; + } + 97 [label="Synthetic else branch"]; + 91 [label="Enter when branch result"]; + subgraph cluster_31 { + color=blue + 92 [label="Enter block"]; + 93 [label="Jump: break@@@[Boolean(true)] "]; + 94 [label="Stub" style="filled" fillcolor=gray]; + 95 [label="Exit block" style="filled" fillcolor=gray]; + } + 96 [label="Exit when branch result" style="filled" fillcolor=gray]; + 87 [label="Exit when"]; + } + 98 [label="Exit block"]; + } + 99 [label="Exit loop block"]; + } + 66 [label="Exit whileloop"]; } - 61 [label="Exit whileloop"]; + 100 [label="Access variable R|/x|"]; + 101 [label="Function call: R|/x|.R|/A.foo|()"]; + 102 [label="Exit block"]; } - 95 [label="Access variable R|/x|"]; - 96 [label="Function call: R|/x|.R|/A.foo|()"]; - 59 [label="Exit function test_3" style="filled" fillcolor=red]; + 63 [label="Exit function test_3" style="filled" fillcolor=red]; } - 58 -> {60}; - 60 -> {62}; - 61 -> {95}; - 62 -> {63}; - 63 -> {64}; + 62 -> {64}; 64 -> {65}; - 64 -> {61} [style=dotted]; - 65 -> {66}; - 66 -> {67}; + 65 -> {67}; + 66 -> {100}; 67 -> {68}; 68 -> {69}; - 69 -> {71}; - 70 -> {81}; + 69 -> {70}; + 69 -> {66} [style=dotted]; + 70 -> {71}; 71 -> {72}; 72 -> {73}; - 73 -> {74 80}; - 74 -> {75}; - 75 -> {76}; - 76 -> {61}; - 76 -> {77} [style=dotted]; - 77 -> {78} [style=dotted]; - 78 -> {79} [style=dotted]; - 79 -> {70} [style=dotted]; - 80 -> {70}; - 81 -> {83}; - 82 -> {93}; - 83 -> {84}; - 84 -> {85}; - 85 -> {86 92}; - 86 -> {87}; - 87 -> {88}; - 88 -> {61}; - 88 -> {89} [style=dotted]; - 89 -> {90} [style=dotted]; - 90 -> {91} [style=dotted]; - 91 -> {82} [style=dotted]; - 92 -> {82}; - 93 -> {94}; - 94 -> {62} [color=green style=dashed]; - 95 -> {96}; - 96 -> {59}; - - subgraph cluster_29 { - color=red - 97 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_30 { - color=blue - 99 [label="Enter while loop"]; - subgraph cluster_31 { - color=blue - 101 [label="Enter loop condition"]; - 102 [label="Const: Boolean(true)"]; - 103 [label="Exit loop condition"]; - } - subgraph cluster_32 { - color=blue - 104 [label="Enter loop block"]; - subgraph cluster_33 { - color=blue - 105 [label="Enter block"]; - subgraph cluster_34 { - color=blue - 106 [label="Enter when"]; - subgraph cluster_35 { - color=blue - 108 [label="Enter when branch condition "]; - 109 [label="Access variable R|/b|"]; - 110 [label="Exit when branch condition"]; - } - 119 [label="Synthetic else branch"]; - 111 [label="Enter when branch result"]; - subgraph cluster_36 { - color=blue - 112 [label="Enter block"]; - 113 [label="Access variable R|/x|"]; - 114 [label="Type operator: (R|/x| as R|A|)"]; - 115 [label="Jump: break@@@[Boolean(true)] "]; - 116 [label="Stub" style="filled" fillcolor=gray]; - 117 [label="Exit block" style="filled" fillcolor=gray]; - } - 118 [label="Exit when branch result" style="filled" fillcolor=gray]; - 107 [label="Exit when"]; - } - 120 [label="Jump: break@@@[Boolean(true)] "]; - 121 [label="Stub" style="filled" fillcolor=gray]; - 122 [label="Exit block" style="filled" fillcolor=gray]; - } - 123 [label="Exit loop block" style="filled" fillcolor=gray]; - } - 100 [label="Exit whileloop"]; - } - 124 [label="Access variable R|/x|"]; - 125 [label="Function call: R|/x|.#()"]; - 98 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 97 -> {99}; - 99 -> {101}; - 100 -> {124}; + 73 -> {74}; + 74 -> {76}; + 75 -> {86}; + 76 -> {77}; + 77 -> {78}; + 78 -> {79 85}; + 79 -> {80}; + 80 -> {81}; + 81 -> {66}; + 81 -> {82} [style=dotted]; + 82 -> {83} [style=dotted]; + 83 -> {84} [style=dotted]; + 84 -> {75} [style=dotted]; + 85 -> {75}; + 86 -> {88}; + 87 -> {98}; + 88 -> {89}; + 89 -> {90}; + 90 -> {91 97}; + 91 -> {92}; + 92 -> {93}; + 93 -> {66}; + 93 -> {94} [style=dotted]; + 94 -> {95} [style=dotted]; + 95 -> {96} [style=dotted]; + 96 -> {87} [style=dotted]; + 97 -> {87}; + 98 -> {99}; + 99 -> {67} [color=green style=dashed]; + 100 -> {101}; 101 -> {102}; - 102 -> {103}; - 103 -> {104}; - 103 -> {100} [style=dotted]; - 104 -> {105}; + 102 -> {63}; + + subgraph cluster_32 { + color=red + 103 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_33 { + color=blue + 105 [label="Enter block"]; + subgraph cluster_34 { + color=blue + 106 [label="Enter while loop"]; + subgraph cluster_35 { + color=blue + 108 [label="Enter loop condition"]; + 109 [label="Const: Boolean(true)"]; + 110 [label="Exit loop condition"]; + } + subgraph cluster_36 { + color=blue + 111 [label="Enter loop block"]; + subgraph cluster_37 { + color=blue + 112 [label="Enter block"]; + subgraph cluster_38 { + color=blue + 113 [label="Enter when"]; + subgraph cluster_39 { + color=blue + 115 [label="Enter when branch condition "]; + 116 [label="Access variable R|/b|"]; + 117 [label="Exit when branch condition"]; + } + 126 [label="Synthetic else branch"]; + 118 [label="Enter when branch result"]; + subgraph cluster_40 { + color=blue + 119 [label="Enter block"]; + 120 [label="Access variable R|/x|"]; + 121 [label="Type operator: (R|/x| as R|A|)"]; + 122 [label="Jump: break@@@[Boolean(true)] "]; + 123 [label="Stub" style="filled" fillcolor=gray]; + 124 [label="Exit block" style="filled" fillcolor=gray]; + } + 125 [label="Exit when branch result" style="filled" fillcolor=gray]; + 114 [label="Exit when"]; + } + 127 [label="Jump: break@@@[Boolean(true)] "]; + 128 [label="Stub" style="filled" fillcolor=gray]; + 129 [label="Exit block" style="filled" fillcolor=gray]; + } + 130 [label="Exit loop block" style="filled" fillcolor=gray]; + } + 107 [label="Exit whileloop"]; + } + 131 [label="Access variable R|/x|"]; + 132 [label="Function call: R|/x|.#()"]; + 133 [label="Exit block"]; + } + 104 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 103 -> {105}; 105 -> {106}; 106 -> {108}; - 107 -> {120}; + 107 -> {131}; 108 -> {109}; 109 -> {110}; - 110 -> {111 119}; + 110 -> {111}; + 110 -> {107} [style=dotted]; 111 -> {112}; 112 -> {113}; - 113 -> {114}; - 114 -> {115}; - 115 -> {100}; - 115 -> {116} [style=dotted]; - 116 -> {117} [style=dotted]; - 117 -> {118} [style=dotted]; - 118 -> {107} [style=dotted]; - 119 -> {107}; - 120 -> {100}; - 120 -> {121} [style=dotted]; - 121 -> {122} [style=dotted]; + 113 -> {115}; + 114 -> {127}; + 115 -> {116}; + 116 -> {117}; + 117 -> {118 126}; + 118 -> {119}; + 119 -> {120}; + 120 -> {121}; + 121 -> {122}; + 122 -> {107}; 122 -> {123} [style=dotted]; - 123 -> {101} [color=green style=dotted]; - 124 -> {125}; - 125 -> {98}; - - subgraph cluster_37 { - color=red - 126 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_38 { - color=blue - 128 [label="Enter do-while loop"]; - subgraph cluster_39 { - color=blue - 130 [label="Enter loop block"]; - subgraph cluster_40 { - color=blue - 131 [label="Enter block"]; - subgraph cluster_41 { - color=blue - 132 [label="Enter when"]; - subgraph cluster_42 { - color=blue - 134 [label="Enter when branch condition "]; - 135 [label="Access variable R|/b|"]; - 136 [label="Exit when branch condition"]; - } - 145 [label="Synthetic else branch"]; - 137 [label="Enter when branch result"]; - subgraph cluster_43 { - color=blue - 138 [label="Enter block"]; - 139 [label="Access variable R|/x|"]; - 140 [label="Type operator: (R|/x| as R|A|)"]; - 141 [label="Jump: break@@@[Boolean(true)] "]; - 142 [label="Stub" style="filled" fillcolor=gray]; - 143 [label="Exit block" style="filled" fillcolor=gray]; - } - 144 [label="Exit when branch result" style="filled" fillcolor=gray]; - 133 [label="Exit when"]; - } - 146 [label="Exit block"]; - } - 147 [label="Exit loop block"]; - } - subgraph cluster_44 { - color=blue - 148 [label="Enter loop condition"]; - 149 [label="Const: Boolean(true)"]; - 150 [label="Exit loop condition"]; - } - 129 [label="Exit do-whileloop"]; - } - 151 [label="Access variable R|/x|"]; - 152 [label="Function call: R|/x|.R|/A.foo|()"]; - 127 [label="Exit function test_5" style="filled" fillcolor=red]; - } - 126 -> {128}; - 128 -> {130}; - 129 -> {151}; - 130 -> {131}; + 123 -> {124} [style=dotted]; + 124 -> {125} [style=dotted]; + 125 -> {114} [style=dotted]; + 126 -> {114}; + 127 -> {107}; + 127 -> {128} [style=dotted]; + 128 -> {129} [style=dotted]; + 129 -> {130} [style=dotted]; + 130 -> {108} [color=green style=dotted]; 131 -> {132}; - 132 -> {134}; - 133 -> {146}; - 134 -> {135}; - 135 -> {136}; - 136 -> {137 145}; - 137 -> {138}; - 138 -> {139}; + 132 -> {133}; + 133 -> {104}; + + subgraph cluster_41 { + color=red + 134 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_42 { + color=blue + 136 [label="Enter block"]; + subgraph cluster_43 { + color=blue + 137 [label="Enter do-while loop"]; + subgraph cluster_44 { + color=blue + 139 [label="Enter loop block"]; + subgraph cluster_45 { + color=blue + 140 [label="Enter block"]; + subgraph cluster_46 { + color=blue + 141 [label="Enter when"]; + subgraph cluster_47 { + color=blue + 143 [label="Enter when branch condition "]; + 144 [label="Access variable R|/b|"]; + 145 [label="Exit when branch condition"]; + } + 154 [label="Synthetic else branch"]; + 146 [label="Enter when branch result"]; + subgraph cluster_48 { + color=blue + 147 [label="Enter block"]; + 148 [label="Access variable R|/x|"]; + 149 [label="Type operator: (R|/x| as R|A|)"]; + 150 [label="Jump: break@@@[Boolean(true)] "]; + 151 [label="Stub" style="filled" fillcolor=gray]; + 152 [label="Exit block" style="filled" fillcolor=gray]; + } + 153 [label="Exit when branch result" style="filled" fillcolor=gray]; + 142 [label="Exit when"]; + } + 155 [label="Exit block"]; + } + 156 [label="Exit loop block"]; + } + subgraph cluster_49 { + color=blue + 157 [label="Enter loop condition"]; + 158 [label="Const: Boolean(true)"]; + 159 [label="Exit loop condition"]; + } + 138 [label="Exit do-whileloop"]; + } + 160 [label="Access variable R|/x|"]; + 161 [label="Function call: R|/x|.R|/A.foo|()"]; + 162 [label="Exit block"]; + } + 135 [label="Exit function test_5" style="filled" fillcolor=red]; + } + 134 -> {136}; + 136 -> {137}; + 137 -> {139}; + 138 -> {160}; 139 -> {140}; 140 -> {141}; - 141 -> {129}; - 141 -> {142} [style=dotted]; - 142 -> {143} [style=dotted]; - 143 -> {144} [style=dotted]; - 144 -> {133} [style=dotted]; - 145 -> {133}; + 141 -> {143}; + 142 -> {155}; + 143 -> {144}; + 144 -> {145}; + 145 -> {146 154}; 146 -> {147}; 147 -> {148}; 148 -> {149}; 149 -> {150}; - 150 -> {129} [style=dotted]; - 150 -> {130} [color=green style=dashed]; - 151 -> {152}; - 152 -> {127}; - - subgraph cluster_45 { - color=red - 153 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_46 { - color=blue - 155 [label="Enter do-while loop"]; - subgraph cluster_47 { - color=blue - 157 [label="Enter loop block"]; - subgraph cluster_48 { - color=blue - 158 [label="Enter block"]; - 159 [label="Access variable R|/x|"]; - 160 [label="Type operator: (R|/x| as R|A|)"]; - subgraph cluster_49 { - color=blue - 161 [label="Enter when"]; - subgraph cluster_50 { - color=blue - 163 [label="Enter when branch condition "]; - 164 [label="Access variable R|/b|"]; - 165 [label="Exit when branch condition"]; - } - 172 [label="Synthetic else branch"]; - 166 [label="Enter when branch result"]; - subgraph cluster_51 { - color=blue - 167 [label="Enter block"]; - 168 [label="Jump: break@@@[Boolean(true)] "]; - 169 [label="Stub" style="filled" fillcolor=gray]; - 170 [label="Exit block" style="filled" fillcolor=gray]; - } - 171 [label="Exit when branch result" style="filled" fillcolor=gray]; - 162 [label="Exit when"]; - } - 173 [label="Exit block"]; - } - 174 [label="Exit loop block"]; - } - subgraph cluster_52 { - color=blue - 175 [label="Enter loop condition"]; - 176 [label="Const: Boolean(true)"]; - 177 [label="Exit loop condition"]; - } - 156 [label="Exit do-whileloop"]; - } - 178 [label="Access variable R|/x|"]; - 179 [label="Function call: R|/x|.R|/A.foo|()"]; - 154 [label="Exit function test_6" style="filled" fillcolor=red]; - } - 153 -> {155}; - 155 -> {157}; - 156 -> {178}; + 150 -> {138}; + 150 -> {151} [style=dotted]; + 151 -> {152} [style=dotted]; + 152 -> {153} [style=dotted]; + 153 -> {142} [style=dotted]; + 154 -> {142}; + 155 -> {156}; + 156 -> {157}; 157 -> {158}; 158 -> {159}; - 159 -> {160}; + 159 -> {138} [style=dotted]; + 159 -> {139} [color=green style=dashed]; 160 -> {161}; - 161 -> {163}; - 162 -> {173}; - 163 -> {164}; - 164 -> {165}; - 165 -> {166 172}; - 166 -> {167}; - 167 -> {168}; - 168 -> {156}; - 168 -> {169} [style=dotted]; - 169 -> {170} [style=dotted]; - 170 -> {171} [style=dotted]; - 171 -> {162} [style=dotted]; - 172 -> {162}; - 173 -> {174}; + 161 -> {162}; + 162 -> {135}; + + subgraph cluster_50 { + color=red + 163 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_51 { + color=blue + 165 [label="Enter block"]; + subgraph cluster_52 { + color=blue + 166 [label="Enter do-while loop"]; + subgraph cluster_53 { + color=blue + 168 [label="Enter loop block"]; + subgraph cluster_54 { + color=blue + 169 [label="Enter block"]; + 170 [label="Access variable R|/x|"]; + 171 [label="Type operator: (R|/x| as R|A|)"]; + subgraph cluster_55 { + color=blue + 172 [label="Enter when"]; + subgraph cluster_56 { + color=blue + 174 [label="Enter when branch condition "]; + 175 [label="Access variable R|/b|"]; + 176 [label="Exit when branch condition"]; + } + 183 [label="Synthetic else branch"]; + 177 [label="Enter when branch result"]; + subgraph cluster_57 { + color=blue + 178 [label="Enter block"]; + 179 [label="Jump: break@@@[Boolean(true)] "]; + 180 [label="Stub" style="filled" fillcolor=gray]; + 181 [label="Exit block" style="filled" fillcolor=gray]; + } + 182 [label="Exit when branch result" style="filled" fillcolor=gray]; + 173 [label="Exit when"]; + } + 184 [label="Exit block"]; + } + 185 [label="Exit loop block"]; + } + subgraph cluster_58 { + color=blue + 186 [label="Enter loop condition"]; + 187 [label="Const: Boolean(true)"]; + 188 [label="Exit loop condition"]; + } + 167 [label="Exit do-whileloop"]; + } + 189 [label="Access variable R|/x|"]; + 190 [label="Function call: R|/x|.R|/A.foo|()"]; + 191 [label="Exit block"]; + } + 164 [label="Exit function test_6" style="filled" fillcolor=red]; + } + 163 -> {165}; + 165 -> {166}; + 166 -> {168}; + 167 -> {189}; + 168 -> {169}; + 169 -> {170}; + 170 -> {171}; + 171 -> {172}; + 172 -> {174}; + 173 -> {184}; 174 -> {175}; 175 -> {176}; - 176 -> {177}; - 177 -> {156} [style=dotted]; - 177 -> {157} [color=green style=dashed]; + 176 -> {177 183}; + 177 -> {178}; 178 -> {179}; - 179 -> {154}; - - subgraph cluster_53 { - color=red - 180 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_54 { - color=blue - 182 [label="Enter do-while loop"]; - subgraph cluster_55 { - color=blue - 184 [label="Enter loop block"]; - subgraph cluster_56 { - color=blue - 185 [label="Enter block"]; - 186 [label="Access variable R|/x|"]; - 187 [label="Type operator: (R|/x| as R|A|)"]; - 188 [label="Exit block"]; - } - 189 [label="Exit loop block"]; - } - subgraph cluster_57 { - color=blue - 190 [label="Enter loop condition"]; - 191 [label="Const: Boolean(true)"]; - 192 [label="Exit loop condition"]; - } - 183 [label="Exit do-whileloop" style="filled" fillcolor=gray]; - } - 193 [label="Access variable R|/x|" style="filled" fillcolor=gray]; - 194 [label="Function call: R|/x|.R|/A.foo|()" style="filled" fillcolor=gray]; - 181 [label="Exit function test_7" style="filled" fillcolor=red style="filled" fillcolor=gray]; - } - 180 -> {182}; - 182 -> {184}; - 183 -> {193} [style=dotted]; + 179 -> {167}; + 179 -> {180} [style=dotted]; + 180 -> {181} [style=dotted]; + 181 -> {182} [style=dotted]; + 182 -> {173} [style=dotted]; + 183 -> {173}; 184 -> {185}; 185 -> {186}; 186 -> {187}; 187 -> {188}; - 188 -> {189}; + 188 -> {167} [style=dotted]; + 188 -> {168} [color=green style=dashed]; 189 -> {190}; 190 -> {191}; - 191 -> {192}; - 192 -> {183} [style=dotted]; - 192 -> {184} [color=green style=dashed]; - 193 -> {194} [style=dotted]; - 194 -> {181} [style=dotted]; + 191 -> {164}; + + subgraph cluster_59 { + color=red + 192 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_60 { + color=blue + 194 [label="Enter block"]; + subgraph cluster_61 { + color=blue + 195 [label="Enter do-while loop"]; + subgraph cluster_62 { + color=blue + 197 [label="Enter loop block"]; + subgraph cluster_63 { + color=blue + 198 [label="Enter block"]; + 199 [label="Access variable R|/x|"]; + 200 [label="Type operator: (R|/x| as R|A|)"]; + 201 [label="Exit block"]; + } + 202 [label="Exit loop block"]; + } + subgraph cluster_64 { + color=blue + 203 [label="Enter loop condition"]; + 204 [label="Const: Boolean(true)"]; + 205 [label="Exit loop condition"]; + } + 196 [label="Exit do-whileloop" style="filled" fillcolor=gray]; + } + 206 [label="Access variable R|/x|" style="filled" fillcolor=gray]; + 207 [label="Function call: R|/x|.R|/A.foo|()" style="filled" fillcolor=gray]; + 208 [label="Exit block" style="filled" fillcolor=gray]; + } + 193 [label="Exit function test_7" style="filled" fillcolor=red style="filled" fillcolor=gray]; + } + 192 -> {194}; + 194 -> {195}; + 195 -> {197}; + 196 -> {206} [style=dotted]; + 197 -> {198}; + 198 -> {199}; + 199 -> {200}; + 200 -> {201}; + 201 -> {202}; + 202 -> {203}; + 203 -> {204}; + 204 -> {205}; + 205 -> {196} [style=dotted]; + 205 -> {197} [color=green style=dashed]; + 206 -> {207} [style=dotted]; + 207 -> {208} [style=dotted]; + 208 -> {193} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot index 8fb3c88ed5d..16a6252bd9b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/multipleCasts.dot @@ -12,10 +12,10 @@ digraph multipleCasts_kt { subgraph cluster_1 { color=red - 2 [label="Enter class A" style="filled" fillcolor=red]; - 3 [label="Exit class A" style="filled" fillcolor=red]; + 3 [label="Enter class A" style="filled" fillcolor=red]; + 2 [label="Exit class A" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red @@ -26,45 +26,55 @@ digraph multipleCasts_kt { subgraph cluster_3 { color=red - 6 [label="Enter class B" style="filled" fillcolor=red]; - 7 [label="Exit class B" style="filled" fillcolor=red]; + 7 [label="Enter class B" style="filled" fillcolor=red]; + 6 [label="Exit class B" style="filled" fillcolor=red]; } - 6 -> {7} [color=green]; + 7 -> {6} [color=green]; subgraph cluster_4 { color=red 8 [label="Enter function getAny" style="filled" fillcolor=red]; - 10 [label="Const: Null(null)"]; - 11 [label="Jump: ^getAny Null(null)"]; - 12 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_5 { + color=blue + 10 [label="Enter block"]; + 11 [label="Const: Null(null)"]; + 12 [label="Jump: ^getAny Null(null)"]; + 13 [label="Stub" style="filled" fillcolor=gray]; + 14 [label="Exit block" style="filled" fillcolor=gray]; + } 9 [label="Exit function getAny" style="filled" fillcolor=red]; } 8 -> {10}; 10 -> {11}; - 11 -> {9}; - 11 -> {12} [style=dotted]; - 12 -> {9} [style=dotted]; + 11 -> {12}; + 12 -> {9}; + 12 -> {13} [style=dotted]; + 13 -> {14} [style=dotted]; + 14 -> {9} [style=dotted]; - subgraph cluster_5 { + subgraph cluster_6 { color=red - 13 [label="Enter function test_0" style="filled" fillcolor=red]; - 15 [label="Function call: R|/getAny|()"]; - 16 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 17 [label="Function call: R|/getAny|()"]; - 18 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - 19 [label="Access variable R|/a|"]; - 20 [label="Type operator: (R|/a| as R|A|)"]; - 21 [label="Access variable R|/a|"]; - 22 [label="Function call: R|/a|.R|/A.foo|()"]; - 23 [label="Access variable R|/b|"]; - 24 [label="Type operator: (R|/b| as R|B|)"]; - 25 [label="Access variable R|/b|"]; - 26 [label="Function call: R|/b|.R|/B.foo|()"]; - 14 [label="Exit function test_0" style="filled" fillcolor=red]; + 15 [label="Enter function test_0" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 17 [label="Enter block"]; + 18 [label="Function call: R|/getAny|()"]; + 19 [label="Variable declaration: lval a: R|kotlin/Any?|"]; + 20 [label="Function call: R|/getAny|()"]; + 21 [label="Variable declaration: lval b: R|kotlin/Any?|"]; + 22 [label="Access variable R|/a|"]; + 23 [label="Type operator: (R|/a| as R|A|)"]; + 24 [label="Access variable R|/a|"]; + 25 [label="Function call: R|/a|.R|/A.foo|()"]; + 26 [label="Access variable R|/b|"]; + 27 [label="Type operator: (R|/b| as R|B|)"]; + 28 [label="Access variable R|/b|"]; + 29 [label="Function call: R|/b|.R|/B.foo|()"]; + 30 [label="Exit block"]; + } + 16 [label="Exit function test_0" style="filled" fillcolor=red]; } - 13 -> {15}; - 15 -> {16}; - 16 -> {17}; + 15 -> {17}; 17 -> {18}; 18 -> {19}; 19 -> {20}; @@ -74,75 +84,86 @@ digraph multipleCasts_kt { 23 -> {24}; 24 -> {25}; 25 -> {26}; - 26 -> {14}; + 26 -> {27}; + 27 -> {28}; + 28 -> {29}; + 29 -> {30}; + 30 -> {16}; - subgraph cluster_6 { + subgraph cluster_8 { color=red - 27 [label="Enter function test_1" style="filled" fillcolor=red]; - 29 [label="Function call: R|/getAny|()"]; - 30 [label="Variable declaration: lval a: R|kotlin/Any?|"]; - 31 [label="Function call: R|/getAny|()"]; - 32 [label="Variable declaration: lval b: R|kotlin/Any?|"]; - subgraph cluster_7 { + 31 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_9 { color=blue - 33 [label="Enter when"]; - subgraph cluster_8 { - color=blue - 35 [label="Enter when branch condition "]; - subgraph cluster_9 { - color=blue - 37 [label="Enter &&"]; - 38 [label="Access variable R|/a|"]; - 39 [label="Type operator: (R|/a| is R|A|)"]; - 40 [label="Exit left part of &&"]; - 41 [label="Enter right part of &&"]; - 42 [label="Access variable R|/b|"]; - 43 [label="Type operator: (R|/b| is R|B|)"]; - 36 [label="Exit &&"]; - } - 44 [label="Exit when branch condition"]; - } - 53 [label="Synthetic else branch"]; - 45 [label="Enter when branch result"]; + 33 [label="Enter block"]; + 34 [label="Function call: R|/getAny|()"]; + 35 [label="Variable declaration: lval a: R|kotlin/Any?|"]; + 36 [label="Function call: R|/getAny|()"]; + 37 [label="Variable declaration: lval b: R|kotlin/Any?|"]; subgraph cluster_10 { color=blue - 46 [label="Enter block"]; - 47 [label="Access variable R|/a|"]; - 48 [label="Function call: R|/a|.R|/A.foo|()"]; - 49 [label="Access variable R|/b|"]; - 50 [label="Function call: R|/b|.R|/B.foo|()"]; - 51 [label="Exit block"]; + 38 [label="Enter when"]; + subgraph cluster_11 { + color=blue + 40 [label="Enter when branch condition "]; + subgraph cluster_12 { + color=blue + 42 [label="Enter &&"]; + 43 [label="Access variable R|/a|"]; + 44 [label="Type operator: (R|/a| is R|A|)"]; + 45 [label="Exit left part of &&"]; + 46 [label="Enter right part of &&"]; + 47 [label="Access variable R|/b|"]; + 48 [label="Type operator: (R|/b| is R|B|)"]; + 41 [label="Exit &&"]; + } + 49 [label="Exit when branch condition"]; + } + 58 [label="Synthetic else branch"]; + 50 [label="Enter when branch result"]; + subgraph cluster_13 { + color=blue + 51 [label="Enter block"]; + 52 [label="Access variable R|/a|"]; + 53 [label="Function call: R|/a|.R|/A.foo|()"]; + 54 [label="Access variable R|/b|"]; + 55 [label="Function call: R|/b|.R|/B.foo|()"]; + 56 [label="Exit block"]; + } + 57 [label="Exit when branch result"]; + 39 [label="Exit when"]; } - 52 [label="Exit when branch result"]; - 34 [label="Exit when"]; + 59 [label="Exit block"]; } - 28 [label="Exit function test_1" style="filled" fillcolor=red]; + 32 [label="Exit function test_1" style="filled" fillcolor=red]; } - 27 -> {29}; - 29 -> {30}; - 30 -> {31}; - 31 -> {32}; - 32 -> {33}; - 33 -> {35}; - 34 -> {28}; - 35 -> {37}; - 36 -> {44}; + 31 -> {33}; + 33 -> {34}; + 34 -> {35}; + 35 -> {36}; + 36 -> {37}; 37 -> {38}; - 38 -> {39}; - 39 -> {40}; - 40 -> {36 41}; - 41 -> {42}; + 38 -> {40}; + 39 -> {59}; + 40 -> {42}; + 41 -> {49}; 42 -> {43}; - 43 -> {36}; - 44 -> {45 53}; - 45 -> {46}; + 43 -> {44}; + 44 -> {45}; + 45 -> {41 46}; 46 -> {47}; 47 -> {48}; - 48 -> {49}; - 49 -> {50}; + 48 -> {41}; + 49 -> {50 58}; 50 -> {51}; 51 -> {52}; - 52 -> {34}; - 53 -> {34}; + 52 -> {53}; + 53 -> {54}; + 54 -> {55}; + 55 -> {56}; + 56 -> {57}; + 57 -> {39}; + 58 -> {39}; + 59 -> {32}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot index 54ba56a576a..fa9a3ab58a7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/nullability.dot @@ -19,160 +19,165 @@ digraph nullability_kt { subgraph cluster_2 { color=red - 4 [label="Enter class A" style="filled" fillcolor=red]; - 5 [label="Exit class A" style="filled" fillcolor=red]; + 5 [label="Enter class A" style="filled" fillcolor=red]; + 4 [label="Exit class A" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; + 5 -> {4} [color=green]; subgraph cluster_3 { color=red - 10 [label="Enter function fs" style="filled" fillcolor=red]; - 11 [label="Exit function fs" style="filled" fillcolor=red]; + 6 [label="Enter function getter" style="filled" fillcolor=red]; + 7 [label="Exit function getter" style="filled" fillcolor=red]; } - 10 -> {11}; + 6 -> {7}; subgraph cluster_4 { color=red - 12 [label="Enter class MyData" style="filled" fillcolor=red]; - subgraph cluster_5 { - color=blue - 6 [label="Enter function getter" style="filled" fillcolor=red]; - 7 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_6 { - color=blue - 8 [label="Enter property" style="filled" fillcolor=red]; - 9 [label="Exit property" style="filled" fillcolor=red]; - } - 13 [label="Exit class MyData" style="filled" fillcolor=red]; + 8 [label="Enter function fs" style="filled" fillcolor=red]; + 9 [label="Exit function fs" style="filled" fillcolor=red]; } - 12 -> {8} [color=green]; 8 -> {9}; - 9 -> {13} [color=green]; - 6 -> {7}; + + subgraph cluster_5 { + color=red + 11 [label="Enter class MyData" style="filled" fillcolor=red]; + 10 [label="Exit class MyData" style="filled" fillcolor=red]; + } + 11 -> {10} [color=green]; + + subgraph cluster_6 { + color=red + 12 [label="Enter function getter" style="filled" fillcolor=red]; + 13 [label="Exit function getter" style="filled" fillcolor=red]; + } + 12 -> {13}; subgraph cluster_7 { color=red - 18 [label="Enter function fdata" style="filled" fillcolor=red]; - 19 [label="Exit function fdata" style="filled" fillcolor=red]; + 14 [label="Enter function fdata" style="filled" fillcolor=red]; + 15 [label="Exit function fdata" style="filled" fillcolor=red]; } - 18 -> {19}; + 14 -> {15}; subgraph cluster_8 { color=red - 20 [label="Enter class Q" style="filled" fillcolor=red]; - subgraph cluster_9 { - color=blue - 14 [label="Enter function getter" style="filled" fillcolor=red]; - 15 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_10 { - color=blue - 16 [label="Enter property" style="filled" fillcolor=red]; - 17 [label="Exit property" style="filled" fillcolor=red]; - } - 21 [label="Exit class Q" style="filled" fillcolor=red]; + 17 [label="Enter class Q" style="filled" fillcolor=red]; + 16 [label="Exit class Q" style="filled" fillcolor=red]; } - 20 -> {16} [color=green]; - 16 -> {17}; - 17 -> {21} [color=green]; - 14 -> {15}; + 17 -> {16} [color=green]; + + subgraph cluster_9 { + color=red + 18 [label="Enter function " style="filled" fillcolor=red]; + 20 [label="Delegated constructor call: super()"]; + 19 [label="Exit function " style="filled" fillcolor=red]; + } + 18 -> {20}; + 20 -> {19}; + + subgraph cluster_10 { + color=red + 21 [label="Enter function getter" style="filled" fillcolor=red]; + 22 [label="Exit function getter" style="filled" fillcolor=red]; + } + 21 -> {22}; subgraph cluster_11 { color=red - 22 [label="Enter function " style="filled" fillcolor=red]; - 24 [label="Delegated constructor call: super()"]; - 23 [label="Exit function " style="filled" fillcolor=red]; + 26 [label="Enter function fdata" style="filled" fillcolor=red]; + subgraph cluster_12 { + color=blue + 28 [label="Enter block"]; + 29 [label="Const: Null(null)"]; + 30 [label="Jump: ^fdata Null(null)"]; + 31 [label="Stub" style="filled" fillcolor=gray]; + 32 [label="Exit block" style="filled" fillcolor=gray]; + } + 27 [label="Exit function fdata" style="filled" fillcolor=red]; } - 22 -> {24}; - 24 -> {23}; - - subgraph cluster_12 { - color=red - 30 [label="Enter function fdata" style="filled" fillcolor=red]; - 32 [label="Const: Null(null)"]; - 33 [label="Jump: ^fdata Null(null)"]; - 34 [label="Stub" style="filled" fillcolor=gray]; - 31 [label="Exit function fdata" style="filled" fillcolor=red]; - } - 30 -> {32}; - 32 -> {33}; - 33 -> {31}; - 33 -> {34} [style=dotted]; - 34 -> {31} [style=dotted]; + 26 -> {28}; + 28 -> {29}; + 29 -> {30}; + 30 -> {27}; + 30 -> {31} [style=dotted]; + 31 -> {32} [style=dotted]; + 32 -> {27} [style=dotted]; subgraph cluster_13 { color=red - 35 [label="Enter class QImpl" style="filled" fillcolor=red]; + 34 [label="Enter class QImpl" style="filled" fillcolor=red]; subgraph cluster_14 { color=blue - 25 [label="Enter function getter" style="filled" fillcolor=red]; - 26 [label="Exit function getter" style="filled" fillcolor=red]; + 23 [label="Enter property" style="filled" fillcolor=red]; + 25 [label="Access variable R|/data|"]; + 24 [label="Exit property" style="filled" fillcolor=red]; } - subgraph cluster_15 { - color=blue - 27 [label="Enter property" style="filled" fillcolor=red]; - 29 [label="Access variable R|/data|"]; - 28 [label="Exit property" style="filled" fillcolor=red]; - } - 36 [label="Exit class QImpl" style="filled" fillcolor=red]; + 33 [label="Exit class QImpl" style="filled" fillcolor=red]; } - 35 -> {27} [color=green]; - 27 -> {29}; - 28 -> {36} [color=green]; - 29 -> {28}; - 25 -> {26}; + 34 -> {23} [color=green]; + 23 -> {25}; + 24 -> {33} [color=green]; + 25 -> {24}; + + subgraph cluster_15 { + color=red + 35 [label="Enter function " style="filled" fillcolor=red]; + 37 [label="Delegated constructor call: super()"]; + 36 [label="Exit function " style="filled" fillcolor=red]; + } + 35 -> {37}; + 37 -> {36}; subgraph cluster_16 { color=red - 37 [label="Enter function " style="filled" fillcolor=red]; - 39 [label="Delegated constructor call: super()"]; - 38 [label="Exit function " style="filled" fillcolor=red]; + 38 [label="Enter function getter" style="filled" fillcolor=red]; + 39 [label="Exit function getter" style="filled" fillcolor=red]; } - 37 -> {39}; - 39 -> {38}; + 38 -> {39}; subgraph cluster_17 { color=red - 47 [label="Enter function fdata" style="filled" fillcolor=red]; - 49 [label="Const: Null(null)"]; - 50 [label="Jump: ^fdata Null(null)"]; - 51 [label="Stub" style="filled" fillcolor=gray]; - 48 [label="Exit function fdata" style="filled" fillcolor=red]; + 40 [label="Enter function setter" style="filled" fillcolor=red]; + 41 [label="Exit function setter" style="filled" fillcolor=red]; } - 47 -> {49}; - 49 -> {50}; - 50 -> {48}; - 50 -> {51} [style=dotted]; - 51 -> {48} [style=dotted]; + 40 -> {41}; subgraph cluster_18 { color=red - 52 [label="Enter class QImplMutable" style="filled" fillcolor=red]; + 45 [label="Enter function fdata" style="filled" fillcolor=red]; subgraph cluster_19 { color=blue - 42 [label="Enter function setter" style="filled" fillcolor=red]; - 43 [label="Exit function setter" style="filled" fillcolor=red]; - } - subgraph cluster_20 { - color=blue - 40 [label="Enter function getter" style="filled" fillcolor=red]; - 41 [label="Exit function getter" style="filled" fillcolor=red]; + 47 [label="Enter block"]; + 48 [label="Const: Null(null)"]; + 49 [label="Jump: ^fdata Null(null)"]; + 50 [label="Stub" style="filled" fillcolor=gray]; + 51 [label="Exit block" style="filled" fillcolor=gray]; } + 46 [label="Exit function fdata" style="filled" fillcolor=red]; + } + 45 -> {47}; + 47 -> {48}; + 48 -> {49}; + 49 -> {46}; + 49 -> {50} [style=dotted]; + 50 -> {51} [style=dotted]; + 51 -> {46} [style=dotted]; + + subgraph cluster_20 { + color=red + 53 [label="Enter class QImplMutable" style="filled" fillcolor=red]; subgraph cluster_21 { color=blue - 44 [label="Enter property" style="filled" fillcolor=red]; - 46 [label="Access variable R|/data|"]; - 45 [label="Exit property" style="filled" fillcolor=red]; + 42 [label="Enter property" style="filled" fillcolor=red]; + 44 [label="Access variable R|/data|"]; + 43 [label="Exit property" style="filled" fillcolor=red]; } - 53 [label="Exit class QImplMutable" style="filled" fillcolor=red]; + 52 [label="Exit class QImplMutable" style="filled" fillcolor=red]; } - 52 -> {44} [color=green]; - 44 -> {46}; - 45 -> {53} [color=green]; - 46 -> {45}; - 40 -> {41}; - 42 -> {43}; + 53 -> {42} [color=green]; + 42 -> {44}; + 43 -> {52} [color=green]; + 44 -> {43}; subgraph cluster_22 { color=red @@ -184,1072 +189,1133 @@ digraph nullability_kt { 56 -> {55}; subgraph cluster_23 { + color=red + 57 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_24 { + color=blue + 59 [label="Enter block"]; + 60 [label="Const: Null(null)"]; + 61 [label="Jump: ^ Null(null)"]; + 62 [label="Stub" style="filled" fillcolor=gray]; + 63 [label="Exit block" style="filled" fillcolor=gray]; + } + 58 [label="Exit function getter" style="filled" fillcolor=red]; + } + 57 -> {59}; + 59 -> {60}; + 60 -> {61}; + 61 -> {58}; + 61 -> {62} [style=dotted]; + 62 -> {63} [style=dotted]; + 63 -> {58} [style=dotted]; + + subgraph cluster_25 { color=red 64 [label="Enter function fdata" style="filled" fillcolor=red]; - 66 [label="Const: Null(null)"]; - 67 [label="Jump: ^fdata Null(null)"]; - 68 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_26 { + color=blue + 66 [label="Enter block"]; + 67 [label="Const: Null(null)"]; + 68 [label="Jump: ^fdata Null(null)"]; + 69 [label="Stub" style="filled" fillcolor=gray]; + 70 [label="Exit block" style="filled" fillcolor=gray]; + } 65 [label="Exit function fdata" style="filled" fillcolor=red]; } 64 -> {66}; 66 -> {67}; - 67 -> {65}; - 67 -> {68} [style=dotted]; - 68 -> {65} [style=dotted]; - - subgraph cluster_24 { - color=red - 69 [label="Enter class QImplWithCustomGetter" style="filled" fillcolor=red]; - subgraph cluster_25 { - color=blue - 57 [label="Enter function getter" style="filled" fillcolor=red]; - 59 [label="Const: Null(null)"]; - 60 [label="Jump: ^ Null(null)"]; - 61 [label="Stub" style="filled" fillcolor=gray]; - 58 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_26 { - color=blue - 62 [label="Enter property" style="filled" fillcolor=red]; - 63 [label="Exit property" style="filled" fillcolor=red]; - } - 70 [label="Exit class QImplWithCustomGetter" style="filled" fillcolor=red]; - } - 69 -> {62} [color=green]; - 62 -> {63}; - 63 -> {70} [color=green]; - 57 -> {59}; - 59 -> {60}; - 60 -> {58}; - 60 -> {61} [style=dotted]; - 61 -> {58} [style=dotted]; + 67 -> {68}; + 68 -> {65}; + 68 -> {69} [style=dotted]; + 69 -> {70} [style=dotted]; + 70 -> {65} [style=dotted]; subgraph cluster_27 { color=red - 71 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_28 { + 72 [label="Enter class QImplWithCustomGetter" style="filled" fillcolor=red]; + 71 [label="Exit class QImplWithCustomGetter" style="filled" fillcolor=red]; + } + 72 -> {71} [color=green]; + + subgraph cluster_28 { + color=red + 73 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_29 { color=blue - 73 [label="Enter when"]; - subgraph cluster_29 { - color=blue - 75 [label="Enter when branch condition "]; - 76 [label="Access variable R|/x|"]; - 77 [label="Const: Null(null)"]; - 78 [label="Operator !="]; - 79 [label="Exit when branch condition"]; - } + 75 [label="Enter block"]; subgraph cluster_30 { color=blue - 86 [label="Enter when branch condition else"]; - 87 [label="Exit when branch condition"]; + 76 [label="Enter when"]; + subgraph cluster_31 { + color=blue + 78 [label="Enter when branch condition "]; + 79 [label="Access variable R|/x|"]; + 80 [label="Const: Null(null)"]; + 81 [label="Operator !="]; + 82 [label="Exit when branch condition"]; + } + subgraph cluster_32 { + color=blue + 89 [label="Enter when branch condition else"]; + 90 [label="Exit when branch condition"]; + } + 91 [label="Enter when branch result"]; + subgraph cluster_33 { + color=blue + 92 [label="Enter block"]; + 93 [label="Access variable R|/x|"]; + 94 [label="Function call: R|/x|.#()"]; + 95 [label="Exit block"]; + } + 96 [label="Exit when branch result"]; + 83 [label="Enter when branch result"]; + subgraph cluster_34 { + color=blue + 84 [label="Enter block"]; + 85 [label="Access variable R|/x|"]; + 86 [label="Function call: R|/x|.R|/A.foo|()"]; + 87 [label="Exit block"]; + } + 88 [label="Exit when branch result"]; + 77 [label="Exit when"]; } - 88 [label="Enter when branch result"]; - subgraph cluster_31 { - color=blue - 89 [label="Enter block"]; - 90 [label="Access variable R|/x|"]; - 91 [label="Function call: R|/x|.#()"]; - 92 [label="Exit block"]; - } - 93 [label="Exit when branch result"]; - 80 [label="Enter when branch result"]; - subgraph cluster_32 { - color=blue - 81 [label="Enter block"]; - 82 [label="Access variable R|/x|"]; - 83 [label="Function call: R|/x|.R|/A.foo|()"]; - 84 [label="Exit block"]; - } - 85 [label="Exit when branch result"]; - 74 [label="Exit when"]; + 97 [label="Access variable R|/x|"]; + 98 [label="Function call: R|/x|.#()"]; + 99 [label="Exit block"]; } - 94 [label="Access variable R|/x|"]; - 95 [label="Function call: R|/x|.#()"]; - 72 [label="Exit function test_1" style="filled" fillcolor=red]; + 74 [label="Exit function test_1" style="filled" fillcolor=red]; } - 71 -> {73}; 73 -> {75}; - 74 -> {94}; 75 -> {76}; - 76 -> {77}; - 77 -> {78}; + 76 -> {78}; + 77 -> {97}; 78 -> {79}; - 79 -> {80 86}; + 79 -> {80}; 80 -> {81}; 81 -> {82}; - 82 -> {83}; + 82 -> {83 89}; 83 -> {84}; 84 -> {85}; - 85 -> {74}; + 85 -> {86}; 86 -> {87}; 87 -> {88}; - 88 -> {89}; + 88 -> {77}; 89 -> {90}; 90 -> {91}; 91 -> {92}; 92 -> {93}; - 93 -> {74}; + 93 -> {94}; 94 -> {95}; - 95 -> {72}; + 95 -> {96}; + 96 -> {77}; + 97 -> {98}; + 98 -> {99}; + 99 -> {74}; - subgraph cluster_33 { + subgraph cluster_35 { color=red - 96 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_34 { + 100 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_36 { color=blue - 98 [label="Enter when"]; - subgraph cluster_35 { - 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"]; - } - subgraph cluster_36 { - color=blue - 111 [label="Enter when branch condition else"]; - 112 [label="Exit when branch condition"]; - } - 113 [label="Enter when branch result"]; + 102 [label="Enter block"]; subgraph cluster_37 { color=blue - 114 [label="Enter block"]; - 115 [label="Access variable R|/x|"]; - 116 [label="Function call: R|/x|.R|/A.foo|()"]; - 117 [label="Exit block"]; + 103 [label="Enter when"]; + subgraph cluster_38 { + color=blue + 105 [label="Enter when branch condition "]; + 106 [label="Access variable R|/x|"]; + 107 [label="Const: Null(null)"]; + 108 [label="Operator =="]; + 109 [label="Exit when branch condition"]; + } + subgraph cluster_39 { + color=blue + 116 [label="Enter when branch condition else"]; + 117 [label="Exit when branch condition"]; + } + 118 [label="Enter when branch result"]; + subgraph cluster_40 { + color=blue + 119 [label="Enter block"]; + 120 [label="Access variable R|/x|"]; + 121 [label="Function call: R|/x|.R|/A.foo|()"]; + 122 [label="Exit block"]; + } + 123 [label="Exit when branch result"]; + 110 [label="Enter when branch result"]; + subgraph cluster_41 { + color=blue + 111 [label="Enter block"]; + 112 [label="Access variable R|/x|"]; + 113 [label="Function call: R|/x|.#()"]; + 114 [label="Exit block"]; + } + 115 [label="Exit when branch result"]; + 104 [label="Exit when"]; } - 118 [label="Exit when branch result"]; - 105 [label="Enter when branch result"]; - subgraph cluster_38 { - color=blue - 106 [label="Enter block"]; - 107 [label="Access variable R|/x|"]; - 108 [label="Function call: R|/x|.#()"]; - 109 [label="Exit block"]; - } - 110 [label="Exit when branch result"]; - 99 [label="Exit when"]; + 124 [label="Access variable R|/x|"]; + 125 [label="Function call: R|/x|.#()"]; + 126 [label="Exit block"]; } - 119 [label="Access variable R|/x|"]; - 120 [label="Function call: R|/x|.#()"]; - 97 [label="Exit function test_2" style="filled" fillcolor=red]; + 101 [label="Exit function test_2" style="filled" fillcolor=red]; } - 96 -> {98}; - 98 -> {100}; - 99 -> {119}; - 100 -> {101}; - 101 -> {102}; + 100 -> {102}; 102 -> {103}; - 103 -> {104}; - 104 -> {105 111}; + 103 -> {105}; + 104 -> {124}; 105 -> {106}; 106 -> {107}; 107 -> {108}; 108 -> {109}; - 109 -> {110}; - 110 -> {99}; + 109 -> {110 116}; + 110 -> {111}; 111 -> {112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; - 115 -> {116}; + 115 -> {104}; 116 -> {117}; 117 -> {118}; - 118 -> {99}; + 118 -> {119}; 119 -> {120}; - 120 -> {97}; + 120 -> {121}; + 121 -> {122}; + 122 -> {123}; + 123 -> {104}; + 124 -> {125}; + 125 -> {126}; + 126 -> {101}; - subgraph cluster_39 { + subgraph cluster_42 { color=red - 121 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_40 { + 127 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_43 { color=blue - 123 [label="Enter when"]; - 125 [label="Access variable R|/x|"]; - 126 [label="Variable declaration: lval : R|A?|"]; - subgraph cluster_41 { - color=blue - 127 [label="Enter when branch condition "]; - 128 [label="Const: Null(null)"]; - 129 [label="Operator =="]; - 130 [label="Exit when branch condition"]; - } - subgraph cluster_42 { - color=blue - 137 [label="Enter when branch condition else"]; - 138 [label="Exit when branch condition"]; - } - 139 [label="Enter when branch result"]; - subgraph cluster_43 { - color=blue - 140 [label="Enter block"]; - 141 [label="Access variable R|/|"]; - 142 [label="Exit block"]; - } - 143 [label="Exit when branch result"]; - 131 [label="Enter when branch result"]; + 129 [label="Enter block"]; subgraph cluster_44 { color=blue - 132 [label="Enter block"]; - 133 [label="Jump: ^test_3 Unit"]; - 134 [label="Stub" style="filled" fillcolor=gray]; - 135 [label="Exit block" style="filled" fillcolor=gray]; + 130 [label="Enter when"]; + 132 [label="Access variable R|/x|"]; + 133 [label="Variable declaration: lval : R|A?|"]; + subgraph cluster_45 { + color=blue + 134 [label="Enter when branch condition "]; + 135 [label="Const: Null(null)"]; + 136 [label="Operator =="]; + 137 [label="Exit when branch condition"]; + } + subgraph cluster_46 { + color=blue + 144 [label="Enter when branch condition else"]; + 145 [label="Exit when branch condition"]; + } + 146 [label="Enter when branch result"]; + subgraph cluster_47 { + color=blue + 147 [label="Enter block"]; + 148 [label="Access variable R|/|"]; + 149 [label="Exit block"]; + } + 150 [label="Exit when branch result"]; + 138 [label="Enter when branch result"]; + subgraph cluster_48 { + color=blue + 139 [label="Enter block"]; + 140 [label="Jump: ^test_3 Unit"]; + 141 [label="Stub" style="filled" fillcolor=gray]; + 142 [label="Exit block" style="filled" fillcolor=gray]; + } + 143 [label="Exit when branch result" style="filled" fillcolor=gray]; + 131 [label="Exit when"]; } - 136 [label="Exit when branch result" style="filled" fillcolor=gray]; - 124 [label="Exit when"]; + 151 [label="Access variable R|/x|"]; + 152 [label="Function call: R|/x|.R|/A.foo|()"]; + 153 [label="Exit block"]; } - 144 [label="Access variable R|/x|"]; - 145 [label="Function call: R|/x|.R|/A.foo|()"]; - 122 [label="Exit function test_3" style="filled" fillcolor=red]; + 128 [label="Exit function test_3" style="filled" fillcolor=red]; } - 121 -> {123}; - 123 -> {125}; - 124 -> {144}; - 125 -> {126}; - 126 -> {127}; - 127 -> {128}; - 128 -> {129}; + 127 -> {129}; 129 -> {130}; - 130 -> {131 137}; - 131 -> {132}; + 130 -> {132}; + 131 -> {151}; 132 -> {133}; - 133 -> {122}; - 133 -> {134} [style=dotted]; - 134 -> {135} [style=dotted]; - 135 -> {136} [style=dotted]; - 136 -> {124} [style=dotted]; - 137 -> {138}; + 133 -> {134}; + 134 -> {135}; + 135 -> {136}; + 136 -> {137}; + 137 -> {138 144}; 138 -> {139}; 139 -> {140}; - 140 -> {141}; - 141 -> {142}; - 142 -> {143}; - 143 -> {124}; + 140 -> {128}; + 140 -> {141} [style=dotted]; + 141 -> {142} [style=dotted]; + 142 -> {143} [style=dotted]; + 143 -> {131} [style=dotted]; 144 -> {145}; - 145 -> {122}; - - subgraph cluster_45 { - color=red - 146 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_46 { - color=blue - 148 [label="Enter when"]; - subgraph cluster_47 { - color=blue - 150 [label="Enter when branch condition "]; - 151 [label="Access variable R|/x|"]; - 152 [label="Enter safe call"]; - 154 [label="Function call: $subj$.R|/A.getA|()"]; - 153 [label="Exit safe call"]; - 155 [label="Const: Null(null)"]; - 156 [label="Operator =="]; - 157 [label="Exit when branch condition"]; - } - 164 [label="Synthetic else branch"]; - 158 [label="Enter when branch result"]; - subgraph cluster_48 { - color=blue - 159 [label="Enter block"]; - 160 [label="Jump: ^test_4 Unit"]; - 161 [label="Stub" style="filled" fillcolor=gray]; - 162 [label="Exit block" style="filled" fillcolor=gray]; - } - 163 [label="Exit when branch result" style="filled" fillcolor=gray]; - 149 [label="Exit when"]; - } - 165 [label="Access variable R|/x|"]; - 166 [label="Function call: R|/x|.R|/A.foo|()"]; - 147 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 146 -> {148}; - 148 -> {150}; - 149 -> {165}; - 150 -> {151}; - 151 -> {152 153}; - 152 -> {154}; - 153 -> {155}; - 154 -> {153}; - 155 -> {156}; - 156 -> {157}; - 157 -> {158 164}; - 158 -> {159}; - 159 -> {160}; - 160 -> {147}; - 160 -> {161} [style=dotted]; - 161 -> {162} [style=dotted]; - 162 -> {163} [style=dotted]; - 163 -> {149} [style=dotted]; - 164 -> {149}; - 165 -> {166}; - 166 -> {147}; + 145 -> {146}; + 146 -> {147}; + 147 -> {148}; + 148 -> {149}; + 149 -> {150}; + 150 -> {131}; + 151 -> {152}; + 152 -> {153}; + 153 -> {128}; subgraph cluster_49 { color=red - 167 [label="Enter function test_5" style="filled" fillcolor=red]; + 154 [label="Enter function test_4" style="filled" fillcolor=red]; subgraph cluster_50 { color=blue - 169 [label="Enter when"]; + 156 [label="Enter block"]; subgraph cluster_51 { color=blue - 171 [label="Enter when branch condition "]; - 172 [label="Access variable R|/q|"]; - 173 [label="Enter safe call"]; - 175 [label="Access variable R|/Q.data|"]; - 174 [label="Exit safe call"]; - 176 [label="Enter safe call"]; - 178 [label="Access variable R|/MyData.s|"]; - 177 [label="Exit safe call"]; - 179 [label="Enter safe call"]; - 181 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; - 180 [label="Exit safe call"]; - 182 [label="Const: Null(null)"]; - 183 [label="Operator !="]; - 184 [label="Exit when branch condition"]; + 157 [label="Enter when"]; + subgraph cluster_52 { + color=blue + 159 [label="Enter when branch condition "]; + 160 [label="Access variable R|/x|"]; + 161 [label="Enter safe call"]; + 163 [label="Function call: $subj$.R|/A.getA|()"]; + 162 [label="Exit safe call"]; + 164 [label="Const: Null(null)"]; + 165 [label="Operator =="]; + 166 [label="Exit when branch condition"]; + } + 173 [label="Synthetic else branch"]; + 167 [label="Enter when branch result"]; + subgraph cluster_53 { + color=blue + 168 [label="Enter block"]; + 169 [label="Jump: ^test_4 Unit"]; + 170 [label="Stub" style="filled" fillcolor=gray]; + 171 [label="Exit block" style="filled" fillcolor=gray]; + } + 172 [label="Exit when branch result" style="filled" fillcolor=gray]; + 158 [label="Exit when"]; } - 198 [label="Synthetic else branch"]; - 185 [label="Enter when branch result"]; - subgraph cluster_52 { - color=blue - 186 [label="Enter block"]; - 187 [label="Access variable R|/q|"]; - 188 [label="Access variable R|/Q.data|"]; - 189 [label="Access variable R|/q|"]; - 190 [label="Access variable R|/Q.data|"]; - 191 [label="Access variable #"]; - 192 [label="Access variable R|/q|"]; - 193 [label="Access variable R|/Q.data|"]; - 194 [label="Access variable #"]; - 195 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; - 196 [label="Exit block"]; - } - 197 [label="Exit when branch result"]; - 170 [label="Exit when"]; + 174 [label="Access variable R|/x|"]; + 175 [label="Function call: R|/x|.R|/A.foo|()"]; + 176 [label="Exit block"]; } - 168 [label="Exit function test_5" style="filled" fillcolor=red]; + 155 [label="Exit function test_4" style="filled" fillcolor=red]; } - 167 -> {169}; - 169 -> {171}; - 170 -> {168}; - 171 -> {172}; - 172 -> {173 174}; - 173 -> {175}; - 174 -> {176 177}; - 175 -> {174}; - 176 -> {178}; - 177 -> {179 180}; - 178 -> {177}; - 179 -> {181}; - 180 -> {182}; - 181 -> {180}; - 182 -> {183}; - 183 -> {184}; - 184 -> {185 198}; - 185 -> {186}; - 186 -> {187}; - 187 -> {188}; - 188 -> {189}; - 189 -> {190}; - 190 -> {191}; - 191 -> {192}; - 192 -> {193}; - 193 -> {194}; - 194 -> {195}; - 195 -> {196}; - 196 -> {197}; - 197 -> {170}; - 198 -> {170}; + 154 -> {156}; + 156 -> {157}; + 157 -> {159}; + 158 -> {174}; + 159 -> {160}; + 160 -> {161 162}; + 161 -> {163}; + 162 -> {164}; + 163 -> {162}; + 164 -> {165}; + 165 -> {166}; + 166 -> {167 173}; + 167 -> {168}; + 168 -> {169}; + 169 -> {155}; + 169 -> {170} [style=dotted]; + 170 -> {171} [style=dotted]; + 171 -> {172} [style=dotted]; + 172 -> {158} [style=dotted]; + 173 -> {158}; + 174 -> {175}; + 175 -> {176}; + 176 -> {155}; - subgraph cluster_53 { + subgraph cluster_54 { color=red - 199 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_54 { + 177 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_55 { color=blue - 201 [label="Enter when"]; - 203 [label="Access variable R|/q|"]; - 204 [label="Enter safe call"]; - 206 [label="Access variable R|/Q.data|"]; - 205 [label="Exit safe call"]; - 207 [label="Enter safe call"]; - 209 [label="Access variable R|/MyData.s|"]; - 208 [label="Exit safe call"]; - 210 [label="Enter safe call"]; - 212 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; - 211 [label="Exit safe call"]; - 213 [label="Variable declaration: lval : R|kotlin/Int?|"]; - subgraph cluster_55 { - color=blue - 214 [label="Enter when branch condition "]; - 215 [label="Const: Null(null)"]; - 216 [label="Operator =="]; - 217 [label="Exit when branch condition"]; - } + 179 [label="Enter block"]; subgraph cluster_56 { color=blue - 224 [label="Enter when branch condition else"]; - 225 [label="Exit when branch condition"]; + 180 [label="Enter when"]; + subgraph cluster_57 { + color=blue + 182 [label="Enter when branch condition "]; + 183 [label="Access variable R|/q|"]; + 184 [label="Enter safe call"]; + 186 [label="Access variable R|/Q.data|"]; + 185 [label="Exit safe call"]; + 187 [label="Enter safe call"]; + 189 [label="Access variable R|/MyData.s|"]; + 188 [label="Exit safe call"]; + 190 [label="Enter safe call"]; + 192 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; + 191 [label="Exit safe call"]; + 193 [label="Const: Null(null)"]; + 194 [label="Operator !="]; + 195 [label="Exit when branch condition"]; + } + 209 [label="Synthetic else branch"]; + 196 [label="Enter when branch result"]; + subgraph cluster_58 { + color=blue + 197 [label="Enter block"]; + 198 [label="Access variable R|/q|"]; + 199 [label="Access variable R|/Q.data|"]; + 200 [label="Access variable R|/q|"]; + 201 [label="Access variable R|/Q.data|"]; + 202 [label="Access variable #"]; + 203 [label="Access variable R|/q|"]; + 204 [label="Access variable R|/Q.data|"]; + 205 [label="Access variable #"]; + 206 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; + 207 [label="Exit block"]; + } + 208 [label="Exit when branch result"]; + 181 [label="Exit when"]; } - 226 [label="Enter when branch result"]; - subgraph cluster_57 { - color=blue - 227 [label="Enter block"]; - 228 [label="Access variable R|/|"]; - 229 [label="Exit block"]; - } - 230 [label="Exit when branch result"]; - 218 [label="Enter when branch result"]; - subgraph cluster_58 { - color=blue - 219 [label="Enter block"]; - 220 [label="Jump: ^test_6 Unit"]; - 221 [label="Stub" style="filled" fillcolor=gray]; - 222 [label="Exit block" style="filled" fillcolor=gray]; - } - 223 [label="Exit when branch result" style="filled" fillcolor=gray]; - 202 [label="Exit when"]; + 210 [label="Exit block"]; } - 231 [label="Access variable R|/q|"]; - 232 [label="Access variable R|/Q.data|"]; - 233 [label="Access variable R|/q|"]; - 234 [label="Access variable R|/Q.data|"]; - 235 [label="Access variable #"]; - 236 [label="Access variable R|/q|"]; - 237 [label="Access variable R|/Q.data|"]; - 238 [label="Access variable #"]; - 239 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; - 200 [label="Exit function test_6" style="filled" fillcolor=red]; + 178 [label="Exit function test_5" style="filled" fillcolor=red]; + } + 177 -> {179}; + 179 -> {180}; + 180 -> {182}; + 181 -> {210}; + 182 -> {183}; + 183 -> {184 185}; + 184 -> {186}; + 185 -> {187 188}; + 186 -> {185}; + 187 -> {189}; + 188 -> {190 191}; + 189 -> {188}; + 190 -> {192}; + 191 -> {193}; + 192 -> {191}; + 193 -> {194}; + 194 -> {195}; + 195 -> {196 209}; + 196 -> {197}; + 197 -> {198}; + 198 -> {199}; + 199 -> {200}; + 200 -> {201}; + 201 -> {202}; + 202 -> {203}; + 203 -> {204}; + 204 -> {205}; + 205 -> {206}; + 206 -> {207}; + 207 -> {208}; + 208 -> {181}; + 209 -> {181}; + 210 -> {178}; + + subgraph cluster_59 { + color=red + 211 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_60 { + color=blue + 213 [label="Enter block"]; + subgraph cluster_61 { + color=blue + 214 [label="Enter when"]; + 216 [label="Access variable R|/q|"]; + 217 [label="Enter safe call"]; + 219 [label="Access variable R|/Q.data|"]; + 218 [label="Exit safe call"]; + 220 [label="Enter safe call"]; + 222 [label="Access variable R|/MyData.s|"]; + 221 [label="Exit safe call"]; + 223 [label="Enter safe call"]; + 225 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; + 224 [label="Exit safe call"]; + 226 [label="Variable declaration: lval : R|kotlin/Int?|"]; + subgraph cluster_62 { + color=blue + 227 [label="Enter when branch condition "]; + 228 [label="Const: Null(null)"]; + 229 [label="Operator =="]; + 230 [label="Exit when branch condition"]; + } + subgraph cluster_63 { + color=blue + 237 [label="Enter when branch condition else"]; + 238 [label="Exit when branch condition"]; + } + 239 [label="Enter when branch result"]; + subgraph cluster_64 { + color=blue + 240 [label="Enter block"]; + 241 [label="Access variable R|/|"]; + 242 [label="Exit block"]; + } + 243 [label="Exit when branch result"]; + 231 [label="Enter when branch result"]; + subgraph cluster_65 { + color=blue + 232 [label="Enter block"]; + 233 [label="Jump: ^test_6 Unit"]; + 234 [label="Stub" style="filled" fillcolor=gray]; + 235 [label="Exit block" style="filled" fillcolor=gray]; + } + 236 [label="Exit when branch result" style="filled" fillcolor=gray]; + 215 [label="Exit when"]; + } + 244 [label="Access variable R|/q|"]; + 245 [label="Access variable R|/Q.data|"]; + 246 [label="Access variable R|/q|"]; + 247 [label="Access variable R|/Q.data|"]; + 248 [label="Access variable #"]; + 249 [label="Access variable R|/q|"]; + 250 [label="Access variable R|/Q.data|"]; + 251 [label="Access variable #"]; + 252 [label="Function call: R|/q|.R|/Q.data|.#.#()"]; + 253 [label="Exit block"]; + } + 212 [label="Exit function test_6" style="filled" fillcolor=red]; } - 199 -> {201}; - 201 -> {203}; - 202 -> {231}; - 203 -> {204 205}; - 204 -> {206}; - 205 -> {207 208}; - 206 -> {205}; - 207 -> {209}; - 208 -> {210 211}; - 209 -> {208}; - 210 -> {212}; 211 -> {213}; - 212 -> {211}; 213 -> {214}; - 214 -> {215}; - 215 -> {216}; - 216 -> {217}; - 217 -> {218 224}; - 218 -> {219}; - 219 -> {220}; - 220 -> {200}; - 220 -> {221} [style=dotted]; - 221 -> {222} [style=dotted]; - 222 -> {223} [style=dotted]; - 223 -> {202} [style=dotted]; - 224 -> {225}; - 225 -> {226}; + 214 -> {216}; + 215 -> {244}; + 216 -> {217 218}; + 217 -> {219}; + 218 -> {220 221}; + 219 -> {218}; + 220 -> {222}; + 221 -> {223 224}; + 222 -> {221}; + 223 -> {225}; + 224 -> {226}; + 225 -> {224}; 226 -> {227}; 227 -> {228}; 228 -> {229}; 229 -> {230}; - 230 -> {202}; + 230 -> {231 237}; 231 -> {232}; 232 -> {233}; - 233 -> {234}; - 234 -> {235}; - 235 -> {236}; - 236 -> {237}; + 233 -> {212}; + 233 -> {234} [style=dotted]; + 234 -> {235} [style=dotted]; + 235 -> {236} [style=dotted]; + 236 -> {215} [style=dotted]; 237 -> {238}; 238 -> {239}; - 239 -> {200}; - - subgraph cluster_59 { - color=red - 240 [label="Enter function test_7" style="filled" fillcolor=red]; - subgraph cluster_60 { - color=blue - 242 [label="Enter when"]; - subgraph cluster_61 { - color=blue - 244 [label="Enter when branch condition "]; - 245 [label="Access variable R|/q|"]; - 246 [label="Enter safe call"]; - 248 [label="Function call: $subj$.R|/Q.fdata|()"]; - 247 [label="Exit safe call"]; - 249 [label="Enter safe call"]; - 251 [label="Function call: $subj$.R|/MyData.fs|()"]; - 250 [label="Exit safe call"]; - 252 [label="Enter safe call"]; - 254 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; - 253 [label="Exit safe call"]; - 255 [label="Const: Null(null)"]; - 256 [label="Operator !="]; - 257 [label="Exit when branch condition"]; - } - 271 [label="Synthetic else branch"]; - 258 [label="Enter when branch result"]; - subgraph cluster_62 { - color=blue - 259 [label="Enter block"]; - 260 [label="Access variable R|/q|"]; - 261 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 262 [label="Access variable R|/q|"]; - 263 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 264 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; - 265 [label="Access variable R|/q|"]; - 266 [label="Function call: R|/q|.R|/Q.fdata|()"]; - 267 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; - 268 [label="Function call: R|/q|.R|/Q.fdata|().#().#()"]; - 269 [label="Exit block"]; - } - 270 [label="Exit when branch result"]; - 243 [label="Exit when"]; - } - 241 [label="Exit function test_7" style="filled" fillcolor=red]; - } - 240 -> {242}; - 242 -> {244}; - 243 -> {241}; + 239 -> {240}; + 240 -> {241}; + 241 -> {242}; + 242 -> {243}; + 243 -> {215}; 244 -> {245}; - 245 -> {246 247}; - 246 -> {248}; - 247 -> {249 250}; - 248 -> {247}; - 249 -> {251}; - 250 -> {252 253}; - 251 -> {250}; - 252 -> {254}; - 253 -> {255}; - 254 -> {253}; - 255 -> {256}; - 256 -> {257}; - 257 -> {258 271}; - 258 -> {259}; - 259 -> {260}; - 260 -> {261}; - 261 -> {262}; - 262 -> {263}; - 263 -> {264}; - 264 -> {265}; - 265 -> {266}; - 266 -> {267}; - 267 -> {268}; - 268 -> {269}; - 269 -> {270}; - 270 -> {243}; - 271 -> {243}; + 245 -> {246}; + 246 -> {247}; + 247 -> {248}; + 248 -> {249}; + 249 -> {250}; + 250 -> {251}; + 251 -> {252}; + 252 -> {253}; + 253 -> {212}; - subgraph cluster_63 { + subgraph cluster_66 { color=red - 272 [label="Enter function test_8" style="filled" fillcolor=red]; - subgraph cluster_64 { + 254 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_67 { color=blue - 274 [label="Enter when"]; - subgraph cluster_65 { + 256 [label="Enter block"]; + subgraph cluster_68 { color=blue - 276 [label="Enter when branch condition "]; - 277 [label="Access variable R|/b|"]; - 278 [label="Const: Boolean(true)"]; - 279 [label="Operator =="]; - 280 [label="Exit when branch condition"]; + 257 [label="Enter when"]; + subgraph cluster_69 { + color=blue + 259 [label="Enter when branch condition "]; + 260 [label="Access variable R|/q|"]; + 261 [label="Enter safe call"]; + 263 [label="Function call: $subj$.R|/Q.fdata|()"]; + 262 [label="Exit safe call"]; + 264 [label="Enter safe call"]; + 266 [label="Function call: $subj$.R|/MyData.fs|()"]; + 265 [label="Exit safe call"]; + 267 [label="Enter safe call"]; + 269 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; + 268 [label="Exit safe call"]; + 270 [label="Const: Null(null)"]; + 271 [label="Operator !="]; + 272 [label="Exit when branch condition"]; + } + 286 [label="Synthetic else branch"]; + 273 [label="Enter when branch result"]; + subgraph cluster_70 { + color=blue + 274 [label="Enter block"]; + 275 [label="Access variable R|/q|"]; + 276 [label="Function call: R|/q|.R|/Q.fdata|()"]; + 277 [label="Access variable R|/q|"]; + 278 [label="Function call: R|/q|.R|/Q.fdata|()"]; + 279 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; + 280 [label="Access variable R|/q|"]; + 281 [label="Function call: R|/q|.R|/Q.fdata|()"]; + 282 [label="Function call: R|/q|.R|/Q.fdata|().#()"]; + 283 [label="Function call: R|/q|.R|/Q.fdata|().#().#()"]; + 284 [label="Exit block"]; + } + 285 [label="Exit when branch result"]; + 258 [label="Exit when"]; } - 287 [label="Synthetic else branch"]; - 281 [label="Enter when branch result"]; - subgraph cluster_66 { - color=blue - 282 [label="Enter block"]; - 283 [label="Access variable R|/b|"]; - 284 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; - 285 [label="Exit block"]; - } - 286 [label="Exit when branch result"]; - 275 [label="Exit when"]; + 287 [label="Exit block"]; } - 273 [label="Exit function test_8" style="filled" fillcolor=red]; + 255 [label="Exit function test_7" style="filled" fillcolor=red]; } - 272 -> {274}; - 274 -> {276}; - 275 -> {273}; + 254 -> {256}; + 256 -> {257}; + 257 -> {259}; + 258 -> {287}; + 259 -> {260}; + 260 -> {261 262}; + 261 -> {263}; + 262 -> {264 265}; + 263 -> {262}; + 264 -> {266}; + 265 -> {267 268}; + 266 -> {265}; + 267 -> {269}; + 268 -> {270}; + 269 -> {268}; + 270 -> {271}; + 271 -> {272}; + 272 -> {273 286}; + 273 -> {274}; + 274 -> {275}; + 275 -> {276}; 276 -> {277}; 277 -> {278}; 278 -> {279}; 279 -> {280}; - 280 -> {281 287}; + 280 -> {281}; 281 -> {282}; 282 -> {283}; 283 -> {284}; 284 -> {285}; - 285 -> {286}; - 286 -> {275}; - 287 -> {275}; + 285 -> {258}; + 286 -> {258}; + 287 -> {255}; - subgraph cluster_67 { + subgraph cluster_71 { color=red - 288 [label="Enter function test_9" style="filled" fillcolor=red]; - subgraph cluster_68 { + 288 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_72 { color=blue - 290 [label="Enter when"]; - subgraph cluster_69 { - color=blue - 292 [label="Enter when branch condition "]; - 293 [label="Access variable R|/a|"]; - 294 [label="Access variable R|/b|"]; - 295 [label="Operator =="]; - 296 [label="Exit when branch condition"]; - } - 303 [label="Synthetic else branch"]; - 297 [label="Enter when branch result"]; - subgraph cluster_70 { - 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"]; - } - 302 [label="Exit when branch result"]; - 291 [label="Exit when"]; - } - 304 [label="Access variable R|/b|"]; - 305 [label="Function call: R|/b|.#()"]; - subgraph cluster_71 { - color=blue - 306 [label="Enter when"]; - subgraph cluster_72 { - color=blue - 308 [label="Enter when branch condition "]; - 309 [label="Access variable R|/a|"]; - 310 [label="Access variable R|/b|"]; - 311 [label="Operator ==="]; - 312 [label="Exit when branch condition"]; - } - 319 [label="Synthetic else branch"]; - 313 [label="Enter when branch result"]; + 290 [label="Enter block"]; subgraph cluster_73 { 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"]; + 291 [label="Enter when"]; + subgraph cluster_74 { + color=blue + 293 [label="Enter when branch condition "]; + 294 [label="Access variable R|/b|"]; + 295 [label="Const: Boolean(true)"]; + 296 [label="Operator =="]; + 297 [label="Exit when branch condition"]; + } + 304 [label="Synthetic else branch"]; + 298 [label="Enter when branch result"]; + subgraph cluster_75 { + color=blue + 299 [label="Enter block"]; + 300 [label="Access variable R|/b|"]; + 301 [label="Function call: R|/b|.R|kotlin/Boolean.not|()"]; + 302 [label="Exit block"]; + } + 303 [label="Exit when branch result"]; + 292 [label="Exit when"]; } - 318 [label="Exit when branch result"]; - 307 [label="Exit when"]; + 305 [label="Exit block"]; } - 320 [label="Access variable R|/b|"]; - 321 [label="Function call: R|/b|.#()"]; - subgraph cluster_74 { - color=blue - 322 [label="Enter when"]; - subgraph cluster_75 { - color=blue - 324 [label="Enter when branch condition "]; - 325 [label="Access variable R|/b|"]; - 326 [label="Access variable R|/a|"]; - 327 [label="Operator =="]; - 328 [label="Exit when branch condition"]; - } - 335 [label="Synthetic else branch"]; - 329 [label="Enter when branch result"]; - subgraph cluster_76 { - 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"]; - } - 334 [label="Exit when branch result"]; - 323 [label="Exit when"]; - } - 336 [label="Access variable R|/b|"]; - 337 [label="Function call: R|/b|.#()"]; - subgraph cluster_77 { - color=blue - 338 [label="Enter when"]; - subgraph cluster_78 { - color=blue - 340 [label="Enter when branch condition "]; - 341 [label="Access variable R|/b|"]; - 342 [label="Access variable R|/a|"]; - 343 [label="Operator ==="]; - 344 [label="Exit when branch condition"]; - } - 351 [label="Synthetic else branch"]; - 345 [label="Enter when branch result"]; - subgraph cluster_79 { - color=blue - 346 [label="Enter block"]; - 347 [label="Access variable R|/b|"]; - 348 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; - 349 [label="Exit block"]; - } - 350 [label="Exit when branch result"]; - 339 [label="Exit when"]; - } - 352 [label="Access variable R|/b|"]; - 353 [label="Function call: R|/b|.#()"]; - 289 [label="Exit function test_9" style="filled" fillcolor=red]; + 289 [label="Exit function test_8" style="filled" fillcolor=red]; } 288 -> {290}; - 290 -> {292}; - 291 -> {304}; - 292 -> {293}; + 290 -> {291}; + 291 -> {293}; + 292 -> {305}; 293 -> {294}; 294 -> {295}; 295 -> {296}; - 296 -> {297 303}; - 297 -> {298}; + 296 -> {297}; + 297 -> {298 304}; 298 -> {299}; 299 -> {300}; 300 -> {301}; 301 -> {302}; - 302 -> {291}; - 303 -> {291}; - 304 -> {305}; - 305 -> {306}; + 302 -> {303}; + 303 -> {292}; + 304 -> {292}; + 305 -> {289}; + + subgraph cluster_76 { + color=red + 306 [label="Enter function test_9" style="filled" fillcolor=red]; + subgraph cluster_77 { + color=blue + 308 [label="Enter block"]; + subgraph cluster_78 { + color=blue + 309 [label="Enter when"]; + subgraph cluster_79 { + color=blue + 311 [label="Enter when branch condition "]; + 312 [label="Access variable R|/a|"]; + 313 [label="Access variable R|/b|"]; + 314 [label="Operator =="]; + 315 [label="Exit when branch condition"]; + } + 322 [label="Synthetic else branch"]; + 316 [label="Enter when branch result"]; + subgraph cluster_80 { + color=blue + 317 [label="Enter block"]; + 318 [label="Access variable R|/b|"]; + 319 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 320 [label="Exit block"]; + } + 321 [label="Exit when branch result"]; + 310 [label="Exit when"]; + } + 323 [label="Access variable R|/b|"]; + 324 [label="Function call: R|/b|.#()"]; + subgraph cluster_81 { + color=blue + 325 [label="Enter when"]; + subgraph cluster_82 { + color=blue + 327 [label="Enter when branch condition "]; + 328 [label="Access variable R|/a|"]; + 329 [label="Access variable R|/b|"]; + 330 [label="Operator ==="]; + 331 [label="Exit when branch condition"]; + } + 338 [label="Synthetic else branch"]; + 332 [label="Enter when branch result"]; + subgraph cluster_83 { + color=blue + 333 [label="Enter block"]; + 334 [label="Access variable R|/b|"]; + 335 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 336 [label="Exit block"]; + } + 337 [label="Exit when branch result"]; + 326 [label="Exit when"]; + } + 339 [label="Access variable R|/b|"]; + 340 [label="Function call: R|/b|.#()"]; + subgraph cluster_84 { + color=blue + 341 [label="Enter when"]; + subgraph cluster_85 { + color=blue + 343 [label="Enter when branch condition "]; + 344 [label="Access variable R|/b|"]; + 345 [label="Access variable R|/a|"]; + 346 [label="Operator =="]; + 347 [label="Exit when branch condition"]; + } + 354 [label="Synthetic else branch"]; + 348 [label="Enter when branch result"]; + subgraph cluster_86 { + color=blue + 349 [label="Enter block"]; + 350 [label="Access variable R|/b|"]; + 351 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 352 [label="Exit block"]; + } + 353 [label="Exit when branch result"]; + 342 [label="Exit when"]; + } + 355 [label="Access variable R|/b|"]; + 356 [label="Function call: R|/b|.#()"]; + subgraph cluster_87 { + color=blue + 357 [label="Enter when"]; + subgraph cluster_88 { + color=blue + 359 [label="Enter when branch condition "]; + 360 [label="Access variable R|/b|"]; + 361 [label="Access variable R|/a|"]; + 362 [label="Operator ==="]; + 363 [label="Exit when branch condition"]; + } + 370 [label="Synthetic else branch"]; + 364 [label="Enter when branch result"]; + subgraph cluster_89 { + color=blue + 365 [label="Enter block"]; + 366 [label="Access variable R|/b|"]; + 367 [label="Function call: R|/b|.R|kotlin/Int.inc|()"]; + 368 [label="Exit block"]; + } + 369 [label="Exit when branch result"]; + 358 [label="Exit when"]; + } + 371 [label="Access variable R|/b|"]; + 372 [label="Function call: R|/b|.#()"]; + 373 [label="Exit block"]; + } + 307 [label="Exit function test_9" style="filled" fillcolor=red]; + } 306 -> {308}; - 307 -> {320}; 308 -> {309}; - 309 -> {310}; - 310 -> {311}; + 309 -> {311}; + 310 -> {323}; 311 -> {312}; - 312 -> {313 319}; + 312 -> {313}; 313 -> {314}; 314 -> {315}; - 315 -> {316}; + 315 -> {316 322}; 316 -> {317}; 317 -> {318}; - 318 -> {307}; - 319 -> {307}; + 318 -> {319}; + 319 -> {320}; 320 -> {321}; - 321 -> {322}; - 322 -> {324}; - 323 -> {336}; + 321 -> {310}; + 322 -> {310}; + 323 -> {324}; 324 -> {325}; - 325 -> {326}; - 326 -> {327}; + 325 -> {327}; + 326 -> {339}; 327 -> {328}; - 328 -> {329 335}; + 328 -> {329}; 329 -> {330}; 330 -> {331}; - 331 -> {332}; + 331 -> {332 338}; 332 -> {333}; 333 -> {334}; - 334 -> {323}; - 335 -> {323}; + 334 -> {335}; + 335 -> {336}; 336 -> {337}; - 337 -> {338}; - 338 -> {340}; - 339 -> {352}; + 337 -> {326}; + 338 -> {326}; + 339 -> {340}; 340 -> {341}; - 341 -> {342}; - 342 -> {343}; + 341 -> {343}; + 342 -> {355}; 343 -> {344}; - 344 -> {345 351}; + 344 -> {345}; 345 -> {346}; 346 -> {347}; - 347 -> {348}; + 347 -> {348 354}; 348 -> {349}; 349 -> {350}; - 350 -> {339}; - 351 -> {339}; + 350 -> {351}; + 351 -> {352}; 352 -> {353}; - 353 -> {289}; - - subgraph cluster_80 { - color=red - 354 [label="Enter function test_10" style="filled" fillcolor=red]; - subgraph cluster_81 { - color=blue - 356 [label="Enter when"]; - subgraph cluster_82 { - color=blue - 358 [label="Enter when branch condition "]; - 359 [label="Access variable R|/a|"]; - 360 [label="Access variable R|/b|"]; - 361 [label="Operator =="]; - 362 [label="Exit when branch condition"]; - } - 369 [label="Synthetic else branch"]; - 363 [label="Enter when branch result"]; - subgraph cluster_83 { - color=blue - 364 [label="Enter block"]; - 365 [label="Access variable R|/b|"]; - 366 [label="Function call: R|/b|.#()"]; - 367 [label="Exit block"]; - } - 368 [label="Exit when branch result"]; - 357 [label="Exit when"]; - } - 370 [label="Access variable R|/b|"]; - 371 [label="Function call: R|/b|.#()"]; - subgraph cluster_84 { - color=blue - 372 [label="Enter when"]; - subgraph cluster_85 { - color=blue - 374 [label="Enter when branch condition "]; - 375 [label="Access variable R|/a|"]; - 376 [label="Access variable R|/b|"]; - 377 [label="Operator ==="]; - 378 [label="Exit when branch condition"]; - } - 385 [label="Synthetic else branch"]; - 379 [label="Enter when branch result"]; - subgraph cluster_86 { - color=blue - 380 [label="Enter block"]; - 381 [label="Access variable R|/b|"]; - 382 [label="Function call: R|/b|.#()"]; - 383 [label="Exit block"]; - } - 384 [label="Exit when branch result"]; - 373 [label="Exit when"]; - } - 386 [label="Access variable R|/b|"]; - 387 [label="Function call: R|/b|.#()"]; - subgraph cluster_87 { - color=blue - 388 [label="Enter when"]; - subgraph cluster_88 { - color=blue - 390 [label="Enter when branch condition "]; - 391 [label="Access variable R|/b|"]; - 392 [label="Access variable R|/a|"]; - 393 [label="Operator =="]; - 394 [label="Exit when branch condition"]; - } - 401 [label="Synthetic else branch"]; - 395 [label="Enter when branch result"]; - subgraph cluster_89 { - color=blue - 396 [label="Enter block"]; - 397 [label="Access variable R|/b|"]; - 398 [label="Function call: R|/b|.#()"]; - 399 [label="Exit block"]; - } - 400 [label="Exit when branch result"]; - 389 [label="Exit when"]; - } - 402 [label="Access variable R|/b|"]; - 403 [label="Function call: R|/b|.#()"]; - subgraph cluster_90 { - color=blue - 404 [label="Enter when"]; - subgraph cluster_91 { - color=blue - 406 [label="Enter when branch condition "]; - 407 [label="Access variable R|/b|"]; - 408 [label="Access variable R|/a|"]; - 409 [label="Operator ==="]; - 410 [label="Exit when branch condition"]; - } - 417 [label="Synthetic else branch"]; - 411 [label="Enter when branch result"]; - subgraph cluster_92 { - color=blue - 412 [label="Enter block"]; - 413 [label="Access variable R|/b|"]; - 414 [label="Function call: R|/b|.#()"]; - 415 [label="Exit block"]; - } - 416 [label="Exit when branch result"]; - 405 [label="Exit when"]; - } - 418 [label="Access variable R|/b|"]; - 419 [label="Function call: R|/b|.#()"]; - 355 [label="Exit function test_10" style="filled" fillcolor=red]; - } - 354 -> {356}; - 356 -> {358}; - 357 -> {370}; - 358 -> {359}; + 353 -> {342}; + 354 -> {342}; + 355 -> {356}; + 356 -> {357}; + 357 -> {359}; + 358 -> {371}; 359 -> {360}; 360 -> {361}; 361 -> {362}; - 362 -> {363 369}; - 363 -> {364}; + 362 -> {363}; + 363 -> {364 370}; 364 -> {365}; 365 -> {366}; 366 -> {367}; 367 -> {368}; - 368 -> {357}; - 369 -> {357}; - 370 -> {371}; + 368 -> {369}; + 369 -> {358}; + 370 -> {358}; 371 -> {372}; - 372 -> {374}; - 373 -> {386}; - 374 -> {375}; - 375 -> {376}; + 372 -> {373}; + 373 -> {307}; + + subgraph cluster_90 { + color=red + 374 [label="Enter function test_10" style="filled" fillcolor=red]; + subgraph cluster_91 { + color=blue + 376 [label="Enter block"]; + subgraph cluster_92 { + color=blue + 377 [label="Enter when"]; + subgraph cluster_93 { + color=blue + 379 [label="Enter when branch condition "]; + 380 [label="Access variable R|/a|"]; + 381 [label="Access variable R|/b|"]; + 382 [label="Operator =="]; + 383 [label="Exit when branch condition"]; + } + 390 [label="Synthetic else branch"]; + 384 [label="Enter when branch result"]; + subgraph cluster_94 { + color=blue + 385 [label="Enter block"]; + 386 [label="Access variable R|/b|"]; + 387 [label="Function call: R|/b|.#()"]; + 388 [label="Exit block"]; + } + 389 [label="Exit when branch result"]; + 378 [label="Exit when"]; + } + 391 [label="Access variable R|/b|"]; + 392 [label="Function call: R|/b|.#()"]; + subgraph cluster_95 { + color=blue + 393 [label="Enter when"]; + subgraph cluster_96 { + color=blue + 395 [label="Enter when branch condition "]; + 396 [label="Access variable R|/a|"]; + 397 [label="Access variable R|/b|"]; + 398 [label="Operator ==="]; + 399 [label="Exit when branch condition"]; + } + 406 [label="Synthetic else branch"]; + 400 [label="Enter when branch result"]; + subgraph cluster_97 { + color=blue + 401 [label="Enter block"]; + 402 [label="Access variable R|/b|"]; + 403 [label="Function call: R|/b|.#()"]; + 404 [label="Exit block"]; + } + 405 [label="Exit when branch result"]; + 394 [label="Exit when"]; + } + 407 [label="Access variable R|/b|"]; + 408 [label="Function call: R|/b|.#()"]; + subgraph cluster_98 { + color=blue + 409 [label="Enter when"]; + subgraph cluster_99 { + color=blue + 411 [label="Enter when branch condition "]; + 412 [label="Access variable R|/b|"]; + 413 [label="Access variable R|/a|"]; + 414 [label="Operator =="]; + 415 [label="Exit when branch condition"]; + } + 422 [label="Synthetic else branch"]; + 416 [label="Enter when branch result"]; + subgraph cluster_100 { + color=blue + 417 [label="Enter block"]; + 418 [label="Access variable R|/b|"]; + 419 [label="Function call: R|/b|.#()"]; + 420 [label="Exit block"]; + } + 421 [label="Exit when branch result"]; + 410 [label="Exit when"]; + } + 423 [label="Access variable R|/b|"]; + 424 [label="Function call: R|/b|.#()"]; + subgraph cluster_101 { + color=blue + 425 [label="Enter when"]; + subgraph cluster_102 { + color=blue + 427 [label="Enter when branch condition "]; + 428 [label="Access variable R|/b|"]; + 429 [label="Access variable R|/a|"]; + 430 [label="Operator ==="]; + 431 [label="Exit when branch condition"]; + } + 438 [label="Synthetic else branch"]; + 432 [label="Enter when branch result"]; + subgraph cluster_103 { + color=blue + 433 [label="Enter block"]; + 434 [label="Access variable R|/b|"]; + 435 [label="Function call: R|/b|.#()"]; + 436 [label="Exit block"]; + } + 437 [label="Exit when branch result"]; + 426 [label="Exit when"]; + } + 439 [label="Access variable R|/b|"]; + 440 [label="Function call: R|/b|.#()"]; + 441 [label="Exit block"]; + } + 375 [label="Exit function test_10" style="filled" fillcolor=red]; + } + 374 -> {376}; 376 -> {377}; - 377 -> {378}; - 378 -> {379 385}; + 377 -> {379}; + 378 -> {391}; 379 -> {380}; 380 -> {381}; 381 -> {382}; 382 -> {383}; - 383 -> {384}; - 384 -> {373}; - 385 -> {373}; + 383 -> {384 390}; + 384 -> {385}; + 385 -> {386}; 386 -> {387}; 387 -> {388}; - 388 -> {390}; - 389 -> {402}; - 390 -> {391}; + 388 -> {389}; + 389 -> {378}; + 390 -> {378}; 391 -> {392}; 392 -> {393}; - 393 -> {394}; - 394 -> {395 401}; + 393 -> {395}; + 394 -> {407}; 395 -> {396}; 396 -> {397}; 397 -> {398}; 398 -> {399}; - 399 -> {400}; - 400 -> {389}; - 401 -> {389}; + 399 -> {400 406}; + 400 -> {401}; + 401 -> {402}; 402 -> {403}; 403 -> {404}; - 404 -> {406}; - 405 -> {418}; - 406 -> {407}; + 404 -> {405}; + 405 -> {394}; + 406 -> {394}; 407 -> {408}; 408 -> {409}; - 409 -> {410}; - 410 -> {411 417}; + 409 -> {411}; + 410 -> {423}; 411 -> {412}; 412 -> {413}; 413 -> {414}; 414 -> {415}; - 415 -> {416}; - 416 -> {405}; - 417 -> {405}; + 415 -> {416 422}; + 416 -> {417}; + 417 -> {418}; 418 -> {419}; - 419 -> {355}; - - subgraph cluster_93 { - color=red - 420 [label="Enter function test_11" style="filled" fillcolor=red]; - subgraph cluster_94 { - color=blue - 422 [label="Enter when"]; - subgraph cluster_95 { - color=blue - 424 [label="Enter when branch condition "]; - 425 [label="Access variable R|/q|"]; - 426 [label="Enter safe call"]; - 428 [label="Access variable R|/QImpl.data|"]; - 427 [label="Exit safe call"]; - 429 [label="Enter safe call"]; - 431 [label="Access variable R|/MyData.s|"]; - 430 [label="Exit safe call"]; - 432 [label="Enter safe call"]; - 434 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; - 433 [label="Exit safe call"]; - 435 [label="Const: Null(null)"]; - 436 [label="Operator !="]; - 437 [label="Exit when branch condition"]; - } - 480 [label="Synthetic else branch"]; - 438 [label="Enter when branch result"]; - subgraph cluster_96 { - color=blue - 439 [label="Enter block"]; - 440 [label="Access variable R|/q|"]; - 441 [label="Access variable R|/QImpl.data|"]; - 442 [label="Access variable R|/q|"]; - 443 [label="Access variable R|/QImpl.data|"]; - 444 [label="Access variable R|/MyData.s|"]; - 445 [label="Access variable R|/q|"]; - 446 [label="Access variable R|/QImpl.data|"]; - 447 [label="Access variable R|/MyData.s|"]; - 448 [label="Function call: R|/q|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; - 449 [label="Access variable R|/q2|"]; - 450 [label="Access variable R|/QImpl.data|"]; - 451 [label="Access variable R|/q2|"]; - 452 [label="Access variable R|/QImpl.data|"]; - 453 [label="Access variable #"]; - 454 [label="Access variable R|/q2|"]; - 455 [label="Access variable R|/QImpl.data|"]; - 456 [label="Access variable #"]; - 457 [label="Function call: R|/q2|.R|/QImpl.data|.#.#()"]; - subgraph cluster_97 { - color=blue - 458 [label="Enter when"]; - subgraph cluster_98 { - color=blue - 460 [label="Enter when branch condition "]; - 461 [label="Access variable R|/q2|"]; - 462 [label="Access variable R|/QImpl.data|"]; - 463 [label="Const: Null(null)"]; - 464 [label="Operator !="]; - 465 [label="Exit when branch condition"]; - } - 477 [label="Synthetic else branch"]; - 466 [label="Enter when branch result"]; - subgraph cluster_99 { - color=blue - 467 [label="Enter block"]; - 468 [label="Access variable R|/q2|"]; - 469 [label="Access variable R|/QImpl.data|"]; - 470 [label="Access variable R|/MyData.s|"]; - 471 [label="Access variable R|/q2|"]; - 472 [label="Access variable R|/QImpl.data|"]; - 473 [label="Access variable R|/MyData.s|"]; - 474 [label="Function call: R|/q2|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; - 475 [label="Exit block"]; - } - 476 [label="Exit when branch result"]; - 459 [label="Exit when"]; - } - 478 [label="Exit block"]; - } - 479 [label="Exit when branch result"]; - 423 [label="Exit when"]; - } - 421 [label="Exit function test_11" style="filled" fillcolor=red]; - } - 420 -> {422}; - 422 -> {424}; - 423 -> {421}; + 419 -> {420}; + 420 -> {421}; + 421 -> {410}; + 422 -> {410}; + 423 -> {424}; 424 -> {425}; - 425 -> {426 427}; - 426 -> {428}; - 427 -> {429 430}; - 428 -> {427}; - 429 -> {431}; - 430 -> {432 433}; - 431 -> {430}; - 432 -> {434}; - 433 -> {435}; - 434 -> {433}; + 425 -> {427}; + 426 -> {439}; + 427 -> {428}; + 428 -> {429}; + 429 -> {430}; + 430 -> {431}; + 431 -> {432 438}; + 432 -> {433}; + 433 -> {434}; + 434 -> {435}; 435 -> {436}; 436 -> {437}; - 437 -> {438 480}; - 438 -> {439}; + 437 -> {426}; + 438 -> {426}; 439 -> {440}; 440 -> {441}; - 441 -> {442}; - 442 -> {443}; - 443 -> {444}; + 441 -> {375}; + + subgraph cluster_104 { + color=red + 442 [label="Enter function test_11" style="filled" fillcolor=red]; + subgraph cluster_105 { + color=blue + 444 [label="Enter block"]; + subgraph cluster_106 { + color=blue + 445 [label="Enter when"]; + subgraph cluster_107 { + color=blue + 447 [label="Enter when branch condition "]; + 448 [label="Access variable R|/q|"]; + 449 [label="Enter safe call"]; + 451 [label="Access variable R|/QImpl.data|"]; + 450 [label="Exit safe call"]; + 452 [label="Enter safe call"]; + 454 [label="Access variable R|/MyData.s|"]; + 453 [label="Exit safe call"]; + 455 [label="Enter safe call"]; + 457 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; + 456 [label="Exit safe call"]; + 458 [label="Const: Null(null)"]; + 459 [label="Operator !="]; + 460 [label="Exit when branch condition"]; + } + 503 [label="Synthetic else branch"]; + 461 [label="Enter when branch result"]; + subgraph cluster_108 { + color=blue + 462 [label="Enter block"]; + 463 [label="Access variable R|/q|"]; + 464 [label="Access variable R|/QImpl.data|"]; + 465 [label="Access variable R|/q|"]; + 466 [label="Access variable R|/QImpl.data|"]; + 467 [label="Access variable R|/MyData.s|"]; + 468 [label="Access variable R|/q|"]; + 469 [label="Access variable R|/QImpl.data|"]; + 470 [label="Access variable R|/MyData.s|"]; + 471 [label="Function call: R|/q|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; + 472 [label="Access variable R|/q2|"]; + 473 [label="Access variable R|/QImpl.data|"]; + 474 [label="Access variable R|/q2|"]; + 475 [label="Access variable R|/QImpl.data|"]; + 476 [label="Access variable #"]; + 477 [label="Access variable R|/q2|"]; + 478 [label="Access variable R|/QImpl.data|"]; + 479 [label="Access variable #"]; + 480 [label="Function call: R|/q2|.R|/QImpl.data|.#.#()"]; + subgraph cluster_109 { + color=blue + 481 [label="Enter when"]; + subgraph cluster_110 { + color=blue + 483 [label="Enter when branch condition "]; + 484 [label="Access variable R|/q2|"]; + 485 [label="Access variable R|/QImpl.data|"]; + 486 [label="Const: Null(null)"]; + 487 [label="Operator !="]; + 488 [label="Exit when branch condition"]; + } + 500 [label="Synthetic else branch"]; + 489 [label="Enter when branch result"]; + subgraph cluster_111 { + color=blue + 490 [label="Enter block"]; + 491 [label="Access variable R|/q2|"]; + 492 [label="Access variable R|/QImpl.data|"]; + 493 [label="Access variable R|/MyData.s|"]; + 494 [label="Access variable R|/q2|"]; + 495 [label="Access variable R|/QImpl.data|"]; + 496 [label="Access variable R|/MyData.s|"]; + 497 [label="Function call: R|/q2|.R|/QImpl.data|.R|/MyData.s|.R|kotlin/Int.inc|()"]; + 498 [label="Exit block"]; + } + 499 [label="Exit when branch result"]; + 482 [label="Exit when"]; + } + 501 [label="Exit block"]; + } + 502 [label="Exit when branch result"]; + 446 [label="Exit when"]; + } + 504 [label="Exit block"]; + } + 443 [label="Exit function test_11" style="filled" fillcolor=red]; + } + 442 -> {444}; 444 -> {445}; - 445 -> {446}; - 446 -> {447}; + 445 -> {447}; + 446 -> {504}; 447 -> {448}; - 448 -> {449}; - 449 -> {450}; - 450 -> {451}; - 451 -> {452}; - 452 -> {453}; - 453 -> {454}; - 454 -> {455}; - 455 -> {456}; - 456 -> {457}; - 457 -> {458}; - 458 -> {460}; - 459 -> {478}; - 460 -> {461}; + 448 -> {449 450}; + 449 -> {451}; + 450 -> {452 453}; + 451 -> {450}; + 452 -> {454}; + 453 -> {455 456}; + 454 -> {453}; + 455 -> {457}; + 456 -> {458}; + 457 -> {456}; + 458 -> {459}; + 459 -> {460}; + 460 -> {461 503}; 461 -> {462}; 462 -> {463}; 463 -> {464}; 464 -> {465}; - 465 -> {466 477}; + 465 -> {466}; 466 -> {467}; 467 -> {468}; 468 -> {469}; @@ -1260,162 +1326,200 @@ digraph nullability_kt { 473 -> {474}; 474 -> {475}; 475 -> {476}; - 476 -> {459}; - 477 -> {459}; + 476 -> {477}; + 477 -> {478}; 478 -> {479}; - 479 -> {423}; - 480 -> {423}; - - subgraph cluster_100 { - color=red - 481 [label="Enter function test_12" style="filled" fillcolor=red]; - subgraph cluster_101 { - color=blue - 483 [label="Enter when"]; - subgraph cluster_102 { - color=blue - 485 [label="Enter when branch condition "]; - 486 [label="Access variable R|/q|"]; - 487 [label="Enter safe call"]; - 489 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 488 [label="Exit safe call"]; - 490 [label="Enter safe call"]; - 492 [label="Access variable R|/MyData.s|"]; - 491 [label="Exit safe call"]; - 493 [label="Enter safe call"]; - 495 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; - 494 [label="Exit safe call"]; - 496 [label="Const: Null(null)"]; - 497 [label="Operator !="]; - 498 [label="Exit when branch condition"]; - } - 512 [label="Synthetic else branch"]; - 499 [label="Enter when branch result"]; - subgraph cluster_103 { - color=blue - 500 [label="Enter block"]; - 501 [label="Access variable R|/q|"]; - 502 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 503 [label="Access variable R|/q|"]; - 504 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 505 [label="Access variable #"]; - 506 [label="Access variable R|/q|"]; - 507 [label="Access variable R|/QImplWithCustomGetter.data|"]; - 508 [label="Access variable #"]; - 509 [label="Function call: R|/q|.R|/QImplWithCustomGetter.data|.#.#()"]; - 510 [label="Exit block"]; - } - 511 [label="Exit when branch result"]; - 484 [label="Exit when"]; - } - 482 [label="Exit function test_12" style="filled" fillcolor=red]; - } + 479 -> {480}; + 480 -> {481}; 481 -> {483}; - 483 -> {485}; - 484 -> {482}; + 482 -> {501}; + 483 -> {484}; + 484 -> {485}; 485 -> {486}; - 486 -> {487 488}; - 487 -> {489}; - 488 -> {490 491}; - 489 -> {488}; - 490 -> {492}; - 491 -> {493 494}; - 492 -> {491}; - 493 -> {495}; - 494 -> {496}; - 495 -> {494}; + 486 -> {487}; + 487 -> {488}; + 488 -> {489 500}; + 489 -> {490}; + 490 -> {491}; + 491 -> {492}; + 492 -> {493}; + 493 -> {494}; + 494 -> {495}; + 495 -> {496}; 496 -> {497}; 497 -> {498}; - 498 -> {499 512}; - 499 -> {500}; - 500 -> {501}; + 498 -> {499}; + 499 -> {482}; + 500 -> {482}; 501 -> {502}; - 502 -> {503}; - 503 -> {504}; - 504 -> {505}; - 505 -> {506}; - 506 -> {507}; - 507 -> {508}; - 508 -> {509}; - 509 -> {510}; - 510 -> {511}; - 511 -> {484}; - 512 -> {484}; + 502 -> {446}; + 503 -> {446}; + 504 -> {443}; - subgraph cluster_104 { + subgraph cluster_112 { color=red - 513 [label="Enter function test_13" style="filled" fillcolor=red]; - subgraph cluster_105 { + 505 [label="Enter function test_12" style="filled" fillcolor=red]; + subgraph cluster_113 { color=blue - 515 [label="Enter when"]; - subgraph cluster_106 { + 507 [label="Enter block"]; + subgraph cluster_114 { color=blue - 517 [label="Enter when branch condition "]; - 518 [label="Access variable R|/q|"]; - 519 [label="Enter safe call"]; - 521 [label="Access variable R|/QImplMutable.data|"]; - 520 [label="Exit safe call"]; - 522 [label="Enter safe call"]; - 524 [label="Access variable R|/MyData.s|"]; - 523 [label="Exit safe call"]; - 525 [label="Enter safe call"]; - 527 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; - 526 [label="Exit safe call"]; - 528 [label="Const: Null(null)"]; - 529 [label="Operator !="]; - 530 [label="Exit when branch condition"]; + 508 [label="Enter when"]; + subgraph cluster_115 { + color=blue + 510 [label="Enter when branch condition "]; + 511 [label="Access variable R|/q|"]; + 512 [label="Enter safe call"]; + 514 [label="Access variable R|/QImplWithCustomGetter.data|"]; + 513 [label="Exit safe call"]; + 515 [label="Enter safe call"]; + 517 [label="Access variable R|/MyData.s|"]; + 516 [label="Exit safe call"]; + 518 [label="Enter safe call"]; + 520 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; + 519 [label="Exit safe call"]; + 521 [label="Const: Null(null)"]; + 522 [label="Operator !="]; + 523 [label="Exit when branch condition"]; + } + 537 [label="Synthetic else branch"]; + 524 [label="Enter when branch result"]; + subgraph cluster_116 { + color=blue + 525 [label="Enter block"]; + 526 [label="Access variable R|/q|"]; + 527 [label="Access variable R|/QImplWithCustomGetter.data|"]; + 528 [label="Access variable R|/q|"]; + 529 [label="Access variable R|/QImplWithCustomGetter.data|"]; + 530 [label="Access variable #"]; + 531 [label="Access variable R|/q|"]; + 532 [label="Access variable R|/QImplWithCustomGetter.data|"]; + 533 [label="Access variable #"]; + 534 [label="Function call: R|/q|.R|/QImplWithCustomGetter.data|.#.#()"]; + 535 [label="Exit block"]; + } + 536 [label="Exit when branch result"]; + 509 [label="Exit when"]; } - 544 [label="Synthetic else branch"]; - 531 [label="Enter when branch result"]; - subgraph cluster_107 { - color=blue - 532 [label="Enter block"]; - 533 [label="Access variable R|/q|"]; - 534 [label="Access variable R|/QImplMutable.data|"]; - 535 [label="Access variable R|/q|"]; - 536 [label="Access variable R|/QImplMutable.data|"]; - 537 [label="Access variable #"]; - 538 [label="Access variable R|/q|"]; - 539 [label="Access variable R|/QImplMutable.data|"]; - 540 [label="Access variable #"]; - 541 [label="Function call: R|/q|.R|/QImplMutable.data|.#.#()"]; - 542 [label="Exit block"]; - } - 543 [label="Exit when branch result"]; - 516 [label="Exit when"]; + 538 [label="Exit block"]; } - 514 [label="Exit function test_13" style="filled" fillcolor=red]; + 506 [label="Exit function test_12" style="filled" fillcolor=red]; } - 513 -> {515}; + 505 -> {507}; + 507 -> {508}; + 508 -> {510}; + 509 -> {538}; + 510 -> {511}; + 511 -> {512 513}; + 512 -> {514}; + 513 -> {515 516}; + 514 -> {513}; 515 -> {517}; - 516 -> {514}; - 517 -> {518}; - 518 -> {519 520}; + 516 -> {518 519}; + 517 -> {516}; + 518 -> {520}; 519 -> {521}; - 520 -> {522 523}; - 521 -> {520}; - 522 -> {524}; - 523 -> {525 526}; - 524 -> {523}; - 525 -> {527}; - 526 -> {528}; - 527 -> {526}; + 520 -> {519}; + 521 -> {522}; + 522 -> {523}; + 523 -> {524 537}; + 524 -> {525}; + 525 -> {526}; + 526 -> {527}; + 527 -> {528}; 528 -> {529}; 529 -> {530}; - 530 -> {531 544}; + 530 -> {531}; 531 -> {532}; 532 -> {533}; 533 -> {534}; 534 -> {535}; 535 -> {536}; - 536 -> {537}; - 537 -> {538}; - 538 -> {539}; - 539 -> {540}; - 540 -> {541}; + 536 -> {509}; + 537 -> {509}; + 538 -> {506}; + + subgraph cluster_117 { + color=red + 539 [label="Enter function test_13" style="filled" fillcolor=red]; + subgraph cluster_118 { + color=blue + 541 [label="Enter block"]; + subgraph cluster_119 { + color=blue + 542 [label="Enter when"]; + subgraph cluster_120 { + color=blue + 544 [label="Enter when branch condition "]; + 545 [label="Access variable R|/q|"]; + 546 [label="Enter safe call"]; + 548 [label="Access variable R|/QImplMutable.data|"]; + 547 [label="Exit safe call"]; + 549 [label="Enter safe call"]; + 551 [label="Access variable R|/MyData.s|"]; + 550 [label="Exit safe call"]; + 552 [label="Enter safe call"]; + 554 [label="Function call: $subj$.R|kotlin/Int.inc|()"]; + 553 [label="Exit safe call"]; + 555 [label="Const: Null(null)"]; + 556 [label="Operator !="]; + 557 [label="Exit when branch condition"]; + } + 571 [label="Synthetic else branch"]; + 558 [label="Enter when branch result"]; + subgraph cluster_121 { + color=blue + 559 [label="Enter block"]; + 560 [label="Access variable R|/q|"]; + 561 [label="Access variable R|/QImplMutable.data|"]; + 562 [label="Access variable R|/q|"]; + 563 [label="Access variable R|/QImplMutable.data|"]; + 564 [label="Access variable #"]; + 565 [label="Access variable R|/q|"]; + 566 [label="Access variable R|/QImplMutable.data|"]; + 567 [label="Access variable #"]; + 568 [label="Function call: R|/q|.R|/QImplMutable.data|.#.#()"]; + 569 [label="Exit block"]; + } + 570 [label="Exit when branch result"]; + 543 [label="Exit when"]; + } + 572 [label="Exit block"]; + } + 540 [label="Exit function test_13" style="filled" fillcolor=red]; + } + 539 -> {541}; 541 -> {542}; - 542 -> {543}; - 543 -> {516}; - 544 -> {516}; + 542 -> {544}; + 543 -> {572}; + 544 -> {545}; + 545 -> {546 547}; + 546 -> {548}; + 547 -> {549 550}; + 548 -> {547}; + 549 -> {551}; + 550 -> {552 553}; + 551 -> {550}; + 552 -> {554}; + 553 -> {555}; + 554 -> {553}; + 555 -> {556}; + 556 -> {557}; + 557 -> {558 571}; + 558 -> {559}; + 559 -> {560}; + 560 -> {561}; + 561 -> {562}; + 562 -> {563}; + 563 -> {564}; + 564 -> {565}; + 565 -> {566}; + 566 -> {567}; + 567 -> {568}; + 568 -> {569}; + 569 -> {570}; + 570 -> {543}; + 571 -> {543}; + 572 -> {540}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceiverAsWhenSubject.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceiverAsWhenSubject.dot index 78610c32f17..d0ad3cec623 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceiverAsWhenSubject.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceiverAsWhenSubject.dot @@ -8,53 +8,56 @@ digraph implicitReceiverAsWhenSubject_kt { 0 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_1 { color=blue - 2 [label="Enter when"]; - 4 [label="Access variable this@R|/test_1|"]; + 2 [label="Enter block"]; subgraph cluster_2 { color=blue - 5 [label="Enter when branch condition "]; - 6 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"]; - 7 [label="Exit when branch condition"]; + 3 [label="Enter when"]; + 5 [label="Access variable this@R|/test_1|"]; + subgraph cluster_3 { + color=blue + 6 [label="Enter when branch condition "]; + 7 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"]; + 8 [label="Exit when branch condition"]; + } + subgraph cluster_4 { + color=blue + 15 [label="Enter when branch condition "]; + 16 [label="Type operator: ($subj$ is R|kotlin/String|)"]; + 17 [label="Exit when branch condition"]; + } + subgraph cluster_5 { + color=blue + 23 [label="Enter when branch condition else"]; + 24 [label="Exit when branch condition"]; + } + 25 [label="Enter when branch result"]; + subgraph cluster_6 { + color=blue + 26 [label="Enter block"]; + 27 [label="Const: Int(0)"]; + 28 [label="Exit block"]; + } + 29 [label="Exit when branch result"]; + 18 [label="Enter when branch result"]; + subgraph cluster_7 { + color=blue + 19 [label="Enter block"]; + 20 [label="Access variable R|kotlin/String.length|"]; + 21 [label="Exit block"]; + } + 22 [label="Exit when branch result"]; + 9 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 10 [label="Enter block"]; + 11 [label="Access variable this@R|/test_1|"]; + 12 [label="Access variable R|kotlin/collections/List.size|"]; + 13 [label="Exit block"]; + } + 14 [label="Exit when branch result"]; + 4 [label="Exit when"]; } - subgraph cluster_3 { - color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Type operator: ($subj$ is R|kotlin/String|)"]; - 16 [label="Exit when branch condition"]; - } - subgraph cluster_4 { - color=blue - 22 [label="Enter when branch condition else"]; - 23 [label="Exit when branch condition"]; - } - 24 [label="Enter when branch result"]; - subgraph cluster_5 { - color=blue - 25 [label="Enter block"]; - 26 [label="Const: Int(0)"]; - 27 [label="Exit block"]; - } - 28 [label="Exit when branch result"]; - 17 [label="Enter when branch result"]; - subgraph cluster_6 { - color=blue - 18 [label="Enter block"]; - 19 [label="Access variable R|kotlin/String.length|"]; - 20 [label="Exit block"]; - } - 21 [label="Exit when branch result"]; - 8 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 9 [label="Enter block"]; - 10 [label="Access variable this@R|/test_1|"]; - 11 [label="Access variable R|kotlin/collections/List.size|"]; - 12 [label="Exit block"]; - } - 13 [label="Exit when branch result"]; - 3 [label="Exit when"]; - } - 29 [label="Jump: ^test_1 when (this@R|/test_1|) { + 30 [label="Jump: ^test_1 when (this@R|/test_1|) { ($subj$ is R|kotlin/collections/List<*>|) -> { this@R|/test_1|.R|kotlin/collections/List.size| } @@ -66,98 +69,105 @@ digraph implicitReceiverAsWhenSubject_kt { } } "]; - 30 [label="Stub" style="filled" fillcolor=gray]; + 31 [label="Stub" style="filled" fillcolor=gray]; + 32 [label="Exit block" style="filled" fillcolor=gray]; + } 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {4}; - 3 -> {29}; - 4 -> {5}; + 2 -> {3}; + 3 -> {5}; + 4 -> {30}; 5 -> {6}; 6 -> {7}; - 7 -> {8 14}; - 8 -> {9}; + 7 -> {8}; + 8 -> {9 15}; 9 -> {10}; 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {3}; - 14 -> {15}; + 13 -> {14}; + 14 -> {4}; 15 -> {16}; - 16 -> {17 22}; - 17 -> {18}; + 16 -> {17}; + 17 -> {18 23}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {3}; - 22 -> {23}; + 21 -> {22}; + 22 -> {4}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; 27 -> {28}; - 28 -> {3}; - 29 -> {1}; - 29 -> {30} [style=dotted]; - 30 -> {1} [style=dotted]; + 28 -> {29}; + 29 -> {4}; + 30 -> {1}; + 30 -> {31} [style=dotted]; + 31 -> {32} [style=dotted]; + 32 -> {1} [style=dotted]; - subgraph cluster_8 { + subgraph cluster_9 { color=red - 31 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_9 { + 33 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_10 { color=blue - 33 [label="Enter when"]; - 35 [label="Access variable this@R|/test_2|"]; - 36 [label="Variable declaration: lval x: R|kotlin/Any|"]; - subgraph cluster_10 { - color=blue - 37 [label="Enter when branch condition "]; - 38 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"]; - 39 [label="Exit when branch condition"]; - } + 35 [label="Enter block"]; subgraph cluster_11 { color=blue - 48 [label="Enter when branch condition "]; - 49 [label="Type operator: ($subj$ is R|kotlin/String|)"]; - 50 [label="Exit when branch condition"]; + 36 [label="Enter when"]; + 38 [label="Access variable this@R|/test_2|"]; + 39 [label="Variable declaration: lval x: R|kotlin/Any|"]; + subgraph cluster_12 { + color=blue + 40 [label="Enter when branch condition "]; + 41 [label="Type operator: ($subj$ is R|kotlin/collections/List<*>|)"]; + 42 [label="Exit when branch condition"]; + } + subgraph cluster_13 { + color=blue + 51 [label="Enter when branch condition "]; + 52 [label="Type operator: ($subj$ is R|kotlin/String|)"]; + 53 [label="Exit when branch condition"]; + } + subgraph cluster_14 { + color=blue + 61 [label="Enter when branch condition else"]; + 62 [label="Exit when branch condition"]; + } + 63 [label="Enter when branch result"]; + subgraph cluster_15 { + color=blue + 64 [label="Enter block"]; + 65 [label="Const: Int(0)"]; + 66 [label="Exit block"]; + } + 67 [label="Exit when branch result"]; + 54 [label="Enter when branch result"]; + subgraph cluster_16 { + color=blue + 55 [label="Enter block"]; + 56 [label="Access variable R|/x|"]; + 57 [label="Access variable R|kotlin/String.length|"]; + 58 [label="Access variable R|kotlin/String.length|"]; + 59 [label="Exit block"]; + } + 60 [label="Exit when branch result"]; + 43 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 44 [label="Enter block"]; + 45 [label="Access variable R|/x|"]; + 46 [label="Access variable R|kotlin/collections/List.size|"]; + 47 [label="Access variable this@R|/test_2|"]; + 48 [label="Access variable R|kotlin/collections/List.size|"]; + 49 [label="Exit block"]; + } + 50 [label="Exit when branch result"]; + 37 [label="Exit when"]; } - subgraph cluster_12 { - color=blue - 58 [label="Enter when branch condition else"]; - 59 [label="Exit when branch condition"]; - } - 60 [label="Enter when branch result"]; - subgraph cluster_13 { - color=blue - 61 [label="Enter block"]; - 62 [label="Const: Int(0)"]; - 63 [label="Exit block"]; - } - 64 [label="Exit when branch result"]; - 51 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 52 [label="Enter block"]; - 53 [label="Access variable R|/x|"]; - 54 [label="Access variable R|kotlin/String.length|"]; - 55 [label="Access variable R|kotlin/String.length|"]; - 56 [label="Exit block"]; - } - 57 [label="Exit when branch result"]; - 40 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 41 [label="Enter block"]; - 42 [label="Access variable R|/x|"]; - 43 [label="Access variable R|kotlin/collections/List.size|"]; - 44 [label="Access variable this@R|/test_2|"]; - 45 [label="Access variable R|kotlin/collections/List.size|"]; - 46 [label="Exit block"]; - } - 47 [label="Exit when branch result"]; - 34 [label="Exit when"]; - } - 65 [label="Jump: ^test_2 when (lval x: R|kotlin/Any| = this@R|/test_2|) { + 68 [label="Jump: ^test_2 when (lval x: R|kotlin/Any| = this@R|/test_2|) { ($subj$ is R|kotlin/collections/List<*>|) -> { R|/x|.R|kotlin/collections/List.size| this@R|/test_2|.R|kotlin/collections/List.size| @@ -171,44 +181,48 @@ digraph implicitReceiverAsWhenSubject_kt { } } "]; - 66 [label="Stub" style="filled" fillcolor=gray]; - 32 [label="Exit function test_2" style="filled" fillcolor=red]; + 69 [label="Stub" style="filled" fillcolor=gray]; + 70 [label="Exit block" style="filled" fillcolor=gray]; + } + 34 [label="Exit function test_2" style="filled" fillcolor=red]; } - 31 -> {33}; 33 -> {35}; - 34 -> {65}; 35 -> {36}; - 36 -> {37}; - 37 -> {38}; + 36 -> {38}; + 37 -> {68}; 38 -> {39}; - 39 -> {40 48}; + 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {43}; + 42 -> {43 51}; 43 -> {44}; 44 -> {45}; 45 -> {46}; 46 -> {47}; - 47 -> {34}; + 47 -> {48}; 48 -> {49}; 49 -> {50}; - 50 -> {51 58}; + 50 -> {37}; 51 -> {52}; 52 -> {53}; - 53 -> {54}; + 53 -> {54 61}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {34}; + 57 -> {58}; 58 -> {59}; 59 -> {60}; - 60 -> {61}; + 60 -> {37}; 61 -> {62}; 62 -> {63}; 63 -> {64}; - 64 -> {34}; - 65 -> {32}; - 65 -> {66} [style=dotted]; - 66 -> {32} [style=dotted]; + 64 -> {65}; + 65 -> {66}; + 66 -> {67}; + 67 -> {37}; + 68 -> {34}; + 68 -> {69} [style=dotted]; + 69 -> {70} [style=dotted]; + 70 -> {34} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot index 2e04fa22644..9df64cee102 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/implicitReceivers.dot @@ -15,386 +15,436 @@ digraph implicitReceivers_kt { subgraph cluster_1 { color=red 3 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_2 { + color=blue + 5 [label="Enter block"]; + 6 [label="Exit block"]; + } 4 [label="Exit function foo" style="filled" fillcolor=red]; } - 3 -> {4}; - - subgraph cluster_2 { - color=red - 5 [label="Enter class A" style="filled" fillcolor=red]; - 6 [label="Exit class A" style="filled" fillcolor=red]; - } - 5 -> {6} [color=green]; + 3 -> {5}; + 5 -> {6}; + 6 -> {4}; subgraph cluster_3 { color=red - 7 [label="Enter function " style="filled" fillcolor=red]; - 9 [label="Delegated constructor call: super()"]; - 8 [label="Exit function " style="filled" fillcolor=red]; + 8 [label="Enter class A" style="filled" fillcolor=red]; + 7 [label="Exit class A" style="filled" fillcolor=red]; } - 7 -> {9}; - 9 -> {8}; + 8 -> {7} [color=green]; subgraph cluster_4 { color=red - 10 [label="Enter function bar" style="filled" fillcolor=red]; - 11 [label="Exit function bar" style="filled" fillcolor=red]; + 9 [label="Enter function " style="filled" fillcolor=red]; + 11 [label="Delegated constructor call: super()"]; + 10 [label="Exit function " style="filled" fillcolor=red]; } - 10 -> {11}; + 9 -> {11}; + 11 -> {10}; subgraph cluster_5 { color=red - 12 [label="Enter class B" style="filled" fillcolor=red]; - 13 [label="Exit class B" style="filled" fillcolor=red]; - } - 12 -> {13} [color=green]; - - subgraph cluster_6 { - color=red - 14 [label="Enter function with" style="filled" fillcolor=red]; - 15 [label="Exit function with" style="filled" fillcolor=red]; + 12 [label="Enter function bar" style="filled" fillcolor=red]; + subgraph cluster_6 { + color=blue + 14 [label="Enter block"]; + 15 [label="Exit block"]; + } + 13 [label="Exit function bar" style="filled" fillcolor=red]; } + 12 -> {14}; 14 -> {15}; + 15 -> {13}; subgraph cluster_7 { color=red - 16 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_8 { + 17 [label="Enter class B" style="filled" fillcolor=red]; + 16 [label="Exit class B" style="filled" fillcolor=red]; + } + 17 -> {16} [color=green]; + + subgraph cluster_8 { + color=red + 18 [label="Enter function with" style="filled" fillcolor=red]; + subgraph cluster_9 { color=blue - 18 [label="Enter when"]; - subgraph cluster_9 { - color=blue - 20 [label="Enter when branch condition "]; - 21 [label="Access variable this@R|/test_1|"]; - 22 [label="Type operator: (this@R|/test_1| is R|A|)"]; - 23 [label="Exit when branch condition"]; - } - subgraph cluster_10 { - color=blue - 31 [label="Enter when branch condition else"]; - 32 [label="Exit when branch condition"]; - } - 33 [label="Enter when branch result"]; - subgraph cluster_11 { - color=blue - 34 [label="Enter block"]; - 35 [label="Access variable this@R|/test_1|"]; - 36 [label="Function call: this@R|/test_1|.#()"]; - 37 [label="Function call: #()"]; - 38 [label="Exit block"]; - } - 39 [label="Exit when branch result"]; - 24 [label="Enter when branch result"]; + 20 [label="Enter block"]; + 21 [label="Exit block"]; + } + 19 [label="Exit function with" style="filled" fillcolor=red]; + } + 18 -> {20}; + 20 -> {21}; + 21 -> {19}; + + subgraph cluster_10 { + color=red + 22 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 24 [label="Enter block"]; subgraph cluster_12 { color=blue - 25 [label="Enter block"]; - 26 [label="Access variable this@R|/test_1|"]; - 27 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; - 28 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; - 29 [label="Exit block"]; + 25 [label="Enter when"]; + subgraph cluster_13 { + color=blue + 27 [label="Enter when branch condition "]; + 28 [label="Access variable this@R|/test_1|"]; + 29 [label="Type operator: (this@R|/test_1| is R|A|)"]; + 30 [label="Exit when branch condition"]; + } + subgraph cluster_14 { + color=blue + 38 [label="Enter when branch condition else"]; + 39 [label="Exit when branch condition"]; + } + 40 [label="Enter when branch result"]; + subgraph cluster_15 { + color=blue + 41 [label="Enter block"]; + 42 [label="Access variable this@R|/test_1|"]; + 43 [label="Function call: this@R|/test_1|.#()"]; + 44 [label="Function call: #()"]; + 45 [label="Exit block"]; + } + 46 [label="Exit when branch result"]; + 31 [label="Enter when branch result"]; + subgraph cluster_16 { + color=blue + 32 [label="Enter block"]; + 33 [label="Access variable this@R|/test_1|"]; + 34 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; + 35 [label="Function call: this@R|/test_1|.R|/A.foo|()"]; + 36 [label="Exit block"]; + } + 37 [label="Exit when branch result"]; + 26 [label="Exit when"]; } - 30 [label="Exit when branch result"]; - 19 [label="Exit when"]; + 47 [label="Access variable this@R|/test_1|"]; + 48 [label="Function call: this@R|/test_1|.#()"]; + 49 [label="Function call: #()"]; + 50 [label="Exit block"]; } - 40 [label="Access variable this@R|/test_1|"]; - 41 [label="Function call: this@R|/test_1|.#()"]; - 42 [label="Function call: #()"]; - 17 [label="Exit function test_1" style="filled" fillcolor=red]; + 23 [label="Exit function test_1" style="filled" fillcolor=red]; } - 16 -> {18}; - 18 -> {20}; - 19 -> {40}; - 20 -> {21}; - 21 -> {22}; - 22 -> {23}; - 23 -> {24 31}; + 22 -> {24}; 24 -> {25}; - 25 -> {26}; - 26 -> {27}; + 25 -> {27}; + 26 -> {47}; 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {19}; + 30 -> {31 38}; 31 -> {32}; 32 -> {33}; 33 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; - 37 -> {38}; + 37 -> {26}; 38 -> {39}; - 39 -> {19}; + 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {17}; - - subgraph cluster_13 { - color=red - 43 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_14 { - color=blue - 45 [label="Enter when"]; - subgraph cluster_15 { - color=blue - 47 [label="Enter when branch condition "]; - 48 [label="Access variable this@R|/test_2|"]; - 49 [label="Type operator: (this@R|/test_2| !is R|A|)"]; - 50 [label="Exit when branch condition"]; - } - subgraph cluster_16 { - color=blue - 58 [label="Enter when branch condition else"]; - 59 [label="Exit when branch condition"]; - } - 60 [label="Enter when branch result"]; - subgraph cluster_17 { - color=blue - 61 [label="Enter block"]; - 62 [label="Access variable this@R|/test_2|"]; - 63 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; - 64 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; - 65 [label="Exit block"]; - } - 66 [label="Exit when branch result"]; - 51 [label="Enter when branch result"]; - subgraph cluster_18 { - color=blue - 52 [label="Enter block"]; - 53 [label="Access variable this@R|/test_2|"]; - 54 [label="Function call: this@R|/test_2|.#()"]; - 55 [label="Function call: #()"]; - 56 [label="Exit block"]; - } - 57 [label="Exit when branch result"]; - 46 [label="Exit when"]; - } - 67 [label="Access variable this@R|/test_2|"]; - 68 [label="Function call: this@R|/test_2|.#()"]; - 69 [label="Function call: #()"]; - 44 [label="Exit function test_2" style="filled" fillcolor=red]; - } - 43 -> {45}; - 45 -> {47}; - 46 -> {67}; + 42 -> {43}; + 43 -> {44}; + 44 -> {45}; + 45 -> {46}; + 46 -> {26}; 47 -> {48}; 48 -> {49}; 49 -> {50}; - 50 -> {51 58}; - 51 -> {52}; - 52 -> {53}; + 50 -> {23}; + + subgraph cluster_17 { + color=red + 51 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_18 { + color=blue + 53 [label="Enter block"]; + subgraph cluster_19 { + color=blue + 54 [label="Enter when"]; + subgraph cluster_20 { + color=blue + 56 [label="Enter when branch condition "]; + 57 [label="Access variable this@R|/test_2|"]; + 58 [label="Type operator: (this@R|/test_2| !is R|A|)"]; + 59 [label="Exit when branch condition"]; + } + subgraph cluster_21 { + color=blue + 67 [label="Enter when branch condition else"]; + 68 [label="Exit when branch condition"]; + } + 69 [label="Enter when branch result"]; + subgraph cluster_22 { + color=blue + 70 [label="Enter block"]; + 71 [label="Access variable this@R|/test_2|"]; + 72 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; + 73 [label="Function call: this@R|/test_2|.R|/A.foo|()"]; + 74 [label="Exit block"]; + } + 75 [label="Exit when branch result"]; + 60 [label="Enter when branch result"]; + subgraph cluster_23 { + color=blue + 61 [label="Enter block"]; + 62 [label="Access variable this@R|/test_2|"]; + 63 [label="Function call: this@R|/test_2|.#()"]; + 64 [label="Function call: #()"]; + 65 [label="Exit block"]; + } + 66 [label="Exit when branch result"]; + 55 [label="Exit when"]; + } + 76 [label="Access variable this@R|/test_2|"]; + 77 [label="Function call: this@R|/test_2|.#()"]; + 78 [label="Function call: #()"]; + 79 [label="Exit block"]; + } + 52 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 51 -> {53}; 53 -> {54}; - 54 -> {55}; - 55 -> {56}; + 54 -> {56}; + 55 -> {76}; 56 -> {57}; - 57 -> {46}; + 57 -> {58}; 58 -> {59}; - 59 -> {60}; + 59 -> {60 67}; 60 -> {61}; 61 -> {62}; 62 -> {63}; 63 -> {64}; 64 -> {65}; 65 -> {66}; - 66 -> {46}; + 66 -> {55}; 67 -> {68}; 68 -> {69}; - 69 -> {44}; - - subgraph cluster_19 { - color=red - 70 [label="Enter function test_3" style="filled" fillcolor=red]; - 72 [label="Access variable R|/a|"]; - 73 [label="Postponed enter to lambda"]; - subgraph cluster_20 { - color=blue - 77 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 79 [label="Access variable R|/b|"]; - 80 [label="Postponed enter to lambda"]; - subgraph cluster_21 { - color=blue - 83 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 85 [label="Access variable R|/c|"]; - 86 [label="Postponed enter to lambda"]; - subgraph cluster_22 { - color=blue - 93 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 95 [label="Access variable this@R|special/anonymous|"]; - 96 [label="Type operator: (this@R|special/anonymous| as R|A|)"]; - 97 [label="Access variable this@R|special/anonymous|"]; - 98 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 99 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 94 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 89 [label="Call arguments union" style="filled" fillcolor=yellow]; - 87 [label="Postponed exit from lambda"]; - 88 [label="Function call: R|kotlin/with|(...)"]; - 90 [label="Access variable this@R|special/anonymous|"]; - 91 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 92 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; - 84 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 81 [label="Postponed exit from lambda"]; - 82 [label="Function call: R|kotlin/with|(...)"]; - 78 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 76 [label="Call arguments union" style="filled" fillcolor=yellow]; - 74 [label="Postponed exit from lambda"]; - 75 [label="Function call: R|kotlin/with|(...)"]; - 71 [label="Exit function test_3" style="filled" fillcolor=red]; - } - 70 -> {72}; + 69 -> {70}; + 70 -> {71}; + 71 -> {72}; 72 -> {73}; - 73 -> {77}; - 73 -> {74} [color=red]; - 74 -> {75} [color=green]; - 75 -> {71}; - 76 -> {75} [color=red]; - 77 -> {79}; - 78 -> {74} [color=green]; - 78 -> {76} [color=red]; - 79 -> {80}; - 80 -> {83}; - 80 -> {81} [color=red]; - 81 -> {82}; - 82 -> {78}; - 83 -> {85}; - 84 -> {81} [color=green]; - 85 -> {86}; - 86 -> {93}; - 86 -> {87} [color=red]; - 87 -> {88} [color=green]; - 88 -> {90}; - 89 -> {88} [color=red]; - 90 -> {91}; - 91 -> {92}; - 92 -> {84}; - 93 -> {95}; - 94 -> {87} [color=green]; - 94 -> {89} [color=red]; - 95 -> {96}; - 96 -> {97}; - 97 -> {98}; - 98 -> {99}; - 99 -> {94}; + 73 -> {74}; + 74 -> {75}; + 75 -> {55}; + 76 -> {77}; + 77 -> {78}; + 78 -> {79}; + 79 -> {52}; - subgraph cluster_23 { + subgraph cluster_24 { color=red - 100 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_24 { + 80 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_25 { color=blue - 102 [label="Enter when"]; - subgraph cluster_25 { - color=blue - 104 [label="Enter when branch condition "]; - 105 [label="Access variable this@R|/test_4|"]; - 106 [label="Type operator: (this@R|/test_4| !is R|A|)"]; - 107 [label="Exit when branch condition"]; - } + 82 [label="Enter block"]; + 83 [label="Access variable R|/a|"]; + 84 [label="Postponed enter to lambda"]; subgraph cluster_26 { color=blue - 118 [label="Enter when branch condition else"]; - 119 [label="Exit when branch condition"]; - } - 120 [label="Enter when branch result"]; - subgraph cluster_27 { - color=blue - 121 [label="Enter block"]; - subgraph cluster_28 { + 89 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_27 { color=blue - 122 [label="Enter when"]; - subgraph cluster_29 { + 91 [label="Enter block"]; + 92 [label="Access variable R|/b|"]; + 93 [label="Postponed enter to lambda"]; + subgraph cluster_28 { color=blue - 124 [label="Enter when branch condition "]; - 125 [label="Access variable this@R|/test_4|"]; - 126 [label="Type operator: (this@R|/test_4| !is R|B|)"]; - 127 [label="Exit when branch condition"]; + 97 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_29 { + color=blue + 99 [label="Enter block"]; + 100 [label="Access variable R|/c|"]; + 101 [label="Postponed enter to lambda"]; + subgraph cluster_30 { + color=blue + 109 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_31 { + color=blue + 111 [label="Enter block"]; + 112 [label="Access variable this@R|special/anonymous|"]; + 113 [label="Type operator: (this@R|special/anonymous| as R|A|)"]; + 114 [label="Access variable this@R|special/anonymous|"]; + 115 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 116 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 117 [label="Exit block"]; + } + 110 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 104 [label="Call arguments union" style="filled" fillcolor=yellow]; + 102 [label="Postponed exit from lambda"]; + 103 [label="Function call: R|kotlin/with|(...)"]; + 105 [label="Access variable this@R|special/anonymous|"]; + 106 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 107 [label="Function call: this@R|special/anonymous|.R|/A.foo|()"]; + 108 [label="Exit block"]; + } + 98 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - subgraph cluster_30 { - color=blue - 138 [label="Enter when branch condition else"]; - 139 [label="Exit when branch condition"]; - } - 140 [label="Enter when branch result"]; - subgraph cluster_31 { - color=blue - 141 [label="Enter block"]; - 142 [label="Access variable this@R|/test_4|"]; - 143 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 144 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 145 [label="Access variable this@R|/test_4|"]; - 146 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; - 147 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; - 148 [label="Exit block"]; - } - 149 [label="Exit when branch result"]; - 128 [label="Enter when branch result"]; - subgraph cluster_32 { - color=blue - 129 [label="Enter block"]; - 130 [label="Access variable this@R|/test_4|"]; - 131 [label="Function call: this@R|/test_4|.#()"]; - 132 [label="Function call: #()"]; - 133 [label="Access variable this@R|/test_4|"]; - 134 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 135 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; - 136 [label="Exit block"]; - } - 137 [label="Exit when branch result"]; - 123 [label="Exit when"]; + 94 [label="Postponed exit from lambda"]; + 95 [label="Function call: R|kotlin/with|(...)"]; + 96 [label="Exit block"]; } - 150 [label="Exit block"]; + 90 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - 151 [label="Exit when branch result"]; - 108 [label="Enter when branch result"]; - subgraph cluster_33 { - color=blue - 109 [label="Enter block"]; - 110 [label="Access variable this@R|/test_4|"]; - 111 [label="Function call: this@R|/test_4|.#()"]; - 112 [label="Function call: #()"]; - 113 [label="Access variable this@R|/test_4|"]; - 114 [label="Function call: this@R|/test_4|.#()"]; - 115 [label="Function call: #()"]; - 116 [label="Exit block"]; - } - 117 [label="Exit when branch result"]; - 103 [label="Exit when"]; + 87 [label="Call arguments union" style="filled" fillcolor=yellow]; + 85 [label="Postponed exit from lambda"]; + 86 [label="Function call: R|kotlin/with|(...)"]; + 88 [label="Exit block"]; } - 152 [label="Access variable this@R|/test_4|"]; - 153 [label="Function call: this@R|/test_4|.#()"]; - 154 [label="Function call: #()"]; - 155 [label="Access variable this@R|/test_4|"]; - 156 [label="Function call: this@R|/test_4|.#()"]; - 157 [label="Function call: #()"]; - 101 [label="Exit function test_4" style="filled" fillcolor=red]; + 81 [label="Exit function test_3" style="filled" fillcolor=red]; } - 100 -> {102}; - 102 -> {104}; - 103 -> {152}; - 104 -> {105}; + 80 -> {82}; + 82 -> {83}; + 83 -> {84}; + 84 -> {89}; + 84 -> {85} [color=red]; + 85 -> {86} [color=green]; + 86 -> {88}; + 87 -> {86} [color=red]; + 88 -> {81}; + 89 -> {91}; + 90 -> {85} [color=green]; + 90 -> {87} [color=red]; + 91 -> {92}; + 92 -> {93}; + 93 -> {97}; + 93 -> {94} [color=red]; + 94 -> {95}; + 95 -> {96}; + 96 -> {90}; + 97 -> {99}; + 98 -> {94} [color=green]; + 99 -> {100}; + 100 -> {101}; + 101 -> {109}; + 101 -> {102} [color=red]; + 102 -> {103} [color=green]; + 103 -> {105}; + 104 -> {103} [color=red]; 105 -> {106}; 106 -> {107}; - 107 -> {108 118}; - 108 -> {109}; - 109 -> {110}; - 110 -> {111}; + 107 -> {108}; + 108 -> {98}; + 109 -> {111}; + 110 -> {102} [color=green]; + 110 -> {104} [color=red]; 111 -> {112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; 115 -> {116}; 116 -> {117}; - 117 -> {103}; - 118 -> {119}; - 119 -> {120}; + 117 -> {110}; + + subgraph cluster_32 { + color=red + 118 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_33 { + color=blue + 120 [label="Enter block"]; + subgraph cluster_34 { + color=blue + 121 [label="Enter when"]; + subgraph cluster_35 { + color=blue + 123 [label="Enter when branch condition "]; + 124 [label="Access variable this@R|/test_4|"]; + 125 [label="Type operator: (this@R|/test_4| !is R|A|)"]; + 126 [label="Exit when branch condition"]; + } + subgraph cluster_36 { + color=blue + 137 [label="Enter when branch condition else"]; + 138 [label="Exit when branch condition"]; + } + 139 [label="Enter when branch result"]; + subgraph cluster_37 { + color=blue + 140 [label="Enter block"]; + subgraph cluster_38 { + color=blue + 141 [label="Enter when"]; + subgraph cluster_39 { + color=blue + 143 [label="Enter when branch condition "]; + 144 [label="Access variable this@R|/test_4|"]; + 145 [label="Type operator: (this@R|/test_4| !is R|B|)"]; + 146 [label="Exit when branch condition"]; + } + subgraph cluster_40 { + color=blue + 157 [label="Enter when branch condition else"]; + 158 [label="Exit when branch condition"]; + } + 159 [label="Enter when branch result"]; + subgraph cluster_41 { + color=blue + 160 [label="Enter block"]; + 161 [label="Access variable this@R|/test_4|"]; + 162 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 163 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 164 [label="Access variable this@R|/test_4|"]; + 165 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; + 166 [label="Function call: this@R|/test_4|.R|/B.bar|()"]; + 167 [label="Exit block"]; + } + 168 [label="Exit when branch result"]; + 147 [label="Enter when branch result"]; + subgraph cluster_42 { + color=blue + 148 [label="Enter block"]; + 149 [label="Access variable this@R|/test_4|"]; + 150 [label="Function call: this@R|/test_4|.#()"]; + 151 [label="Function call: #()"]; + 152 [label="Access variable this@R|/test_4|"]; + 153 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 154 [label="Function call: this@R|/test_4|.R|/A.foo|()"]; + 155 [label="Exit block"]; + } + 156 [label="Exit when branch result"]; + 142 [label="Exit when"]; + } + 169 [label="Exit block"]; + } + 170 [label="Exit when branch result"]; + 127 [label="Enter when branch result"]; + subgraph cluster_43 { + color=blue + 128 [label="Enter block"]; + 129 [label="Access variable this@R|/test_4|"]; + 130 [label="Function call: this@R|/test_4|.#()"]; + 131 [label="Function call: #()"]; + 132 [label="Access variable this@R|/test_4|"]; + 133 [label="Function call: this@R|/test_4|.#()"]; + 134 [label="Function call: #()"]; + 135 [label="Exit block"]; + } + 136 [label="Exit when branch result"]; + 122 [label="Exit when"]; + } + 171 [label="Access variable this@R|/test_4|"]; + 172 [label="Function call: this@R|/test_4|.#()"]; + 173 [label="Function call: #()"]; + 174 [label="Access variable this@R|/test_4|"]; + 175 [label="Function call: this@R|/test_4|.#()"]; + 176 [label="Function call: #()"]; + 177 [label="Exit block"]; + } + 119 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 118 -> {120}; 120 -> {121}; - 121 -> {122}; - 122 -> {124}; - 123 -> {150}; + 121 -> {123}; + 122 -> {171}; + 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {127}; - 127 -> {128 138}; + 126 -> {127 137}; + 127 -> {128}; 128 -> {129}; 129 -> {130}; 130 -> {131}; @@ -403,81 +453,104 @@ digraph implicitReceivers_kt { 133 -> {134}; 134 -> {135}; 135 -> {136}; - 136 -> {137}; - 137 -> {123}; + 136 -> {122}; + 137 -> {138}; 138 -> {139}; 139 -> {140}; 140 -> {141}; - 141 -> {142}; - 142 -> {143}; + 141 -> {143}; + 142 -> {169}; 143 -> {144}; 144 -> {145}; 145 -> {146}; - 146 -> {147}; + 146 -> {147 157}; 147 -> {148}; 148 -> {149}; - 149 -> {123}; + 149 -> {150}; 150 -> {151}; - 151 -> {103}; + 151 -> {152}; 152 -> {153}; 153 -> {154}; 154 -> {155}; 155 -> {156}; - 156 -> {157}; - 157 -> {101}; + 156 -> {142}; + 157 -> {158}; + 158 -> {159}; + 159 -> {160}; + 160 -> {161}; + 161 -> {162}; + 162 -> {163}; + 163 -> {164}; + 164 -> {165}; + 165 -> {166}; + 166 -> {167}; + 167 -> {168}; + 168 -> {142}; + 169 -> {170}; + 170 -> {122}; + 171 -> {172}; + 172 -> {173}; + 173 -> {174}; + 174 -> {175}; + 175 -> {176}; + 176 -> {177}; + 177 -> {119}; - subgraph cluster_34 { + subgraph cluster_44 { color=red - 158 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_35 { + 178 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_45 { color=blue - 160 [label="Enter when"]; - subgraph cluster_36 { + 180 [label="Enter block"]; + subgraph cluster_46 { color=blue - 162 [label="Enter when branch condition "]; - 163 [label="Access variable this@R|/test_5|"]; - 164 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"]; - 165 [label="Exit when branch condition"]; + 181 [label="Enter when"]; + subgraph cluster_47 { + color=blue + 183 [label="Enter when branch condition "]; + 184 [label="Access variable this@R|/test_5|"]; + 185 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"]; + 186 [label="Exit when branch condition"]; + } + subgraph cluster_48 { + color=blue + 192 [label="Enter when branch condition "]; + 193 [label="Access variable this@R|/test_5|"]; + 194 [label="Type operator: (this@R|/test_5| is R|kotlin/String|)"]; + 195 [label="Exit when branch condition"]; + } + subgraph cluster_49 { + color=blue + 201 [label="Enter when branch condition else"]; + 202 [label="Exit when branch condition"]; + } + 203 [label="Enter when branch result"]; + subgraph cluster_50 { + color=blue + 204 [label="Enter block"]; + 205 [label="Const: Int(0)"]; + 206 [label="Exit block"]; + } + 207 [label="Exit when branch result"]; + 196 [label="Enter when branch result"]; + subgraph cluster_51 { + color=blue + 197 [label="Enter block"]; + 198 [label="Access variable R|kotlin/String.length|"]; + 199 [label="Exit block"]; + } + 200 [label="Exit when branch result"]; + 187 [label="Enter when branch result"]; + subgraph cluster_52 { + color=blue + 188 [label="Enter block"]; + 189 [label="Access variable R|kotlin/collections/List.size|"]; + 190 [label="Exit block"]; + } + 191 [label="Exit when branch result"]; + 182 [label="Exit when"]; } - subgraph cluster_37 { - color=blue - 171 [label="Enter when branch condition "]; - 172 [label="Access variable this@R|/test_5|"]; - 173 [label="Type operator: (this@R|/test_5| is R|kotlin/String|)"]; - 174 [label="Exit when branch condition"]; - } - subgraph cluster_38 { - color=blue - 180 [label="Enter when branch condition else"]; - 181 [label="Exit when branch condition"]; - } - 182 [label="Enter when branch result"]; - subgraph cluster_39 { - color=blue - 183 [label="Enter block"]; - 184 [label="Const: Int(0)"]; - 185 [label="Exit block"]; - } - 186 [label="Exit when branch result"]; - 175 [label="Enter when branch result"]; - subgraph cluster_40 { - color=blue - 176 [label="Enter block"]; - 177 [label="Access variable R|kotlin/String.length|"]; - 178 [label="Exit block"]; - } - 179 [label="Exit when branch result"]; - 166 [label="Enter when branch result"]; - subgraph cluster_41 { - color=blue - 167 [label="Enter block"]; - 168 [label="Access variable R|kotlin/collections/List.size|"]; - 169 [label="Exit block"]; - } - 170 [label="Exit when branch result"]; - 161 [label="Exit when"]; - } - 187 [label="Jump: ^test_5 when () { + 208 [label="Jump: ^test_5 when () { (this@R|/test_5| is R|kotlin/collections/List<*>|) -> { this@R|/test_5|.R|kotlin/collections/List.size| } @@ -489,58 +562,69 @@ digraph implicitReceivers_kt { } } "]; - 188 [label="Stub" style="filled" fillcolor=gray]; - 159 [label="Exit function test_5" style="filled" fillcolor=red]; + 209 [label="Stub" style="filled" fillcolor=gray]; + 210 [label="Exit block" style="filled" fillcolor=gray]; + } + 179 [label="Exit function test_5" style="filled" fillcolor=red]; } - 158 -> {160}; - 160 -> {162}; - 161 -> {187}; - 162 -> {163}; - 163 -> {164}; - 164 -> {165}; - 165 -> {166 171}; - 166 -> {167}; - 167 -> {168}; - 168 -> {169}; - 169 -> {170}; - 170 -> {161}; - 171 -> {172}; - 172 -> {173}; - 173 -> {174}; - 174 -> {175 180}; - 175 -> {176}; - 176 -> {177}; - 177 -> {178}; - 178 -> {179}; - 179 -> {161}; + 178 -> {180}; 180 -> {181}; - 181 -> {182}; - 182 -> {183}; + 181 -> {183}; + 182 -> {208}; 183 -> {184}; 184 -> {185}; 185 -> {186}; - 186 -> {161}; - 187 -> {159}; - 187 -> {188} [style=dotted]; - 188 -> {159} [style=dotted]; - - subgraph cluster_42 { - color=red - 189 [label="Enter function test_6" style="filled" fillcolor=red]; - 191 [label="Access variable this@R|/test_6|"]; - 192 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"]; - 193 [label="Access variable R|kotlin/collections/List.size|"]; - 194 [label="Access variable this@R|/test_6|"]; - 195 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"]; - 196 [label="Access variable R|kotlin/String.length|"]; - 190 [label="Exit function test_6" style="filled" fillcolor=red]; - } - 189 -> {191}; - 191 -> {192}; + 186 -> {187 192}; + 187 -> {188}; + 188 -> {189}; + 189 -> {190}; + 190 -> {191}; + 191 -> {182}; 192 -> {193}; 193 -> {194}; 194 -> {195}; - 195 -> {196}; - 196 -> {190}; + 195 -> {196 201}; + 196 -> {197}; + 197 -> {198}; + 198 -> {199}; + 199 -> {200}; + 200 -> {182}; + 201 -> {202}; + 202 -> {203}; + 203 -> {204}; + 204 -> {205}; + 205 -> {206}; + 206 -> {207}; + 207 -> {182}; + 208 -> {179}; + 208 -> {209} [style=dotted]; + 209 -> {210} [style=dotted]; + 210 -> {179} [style=dotted]; + + subgraph cluster_53 { + color=red + 211 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_54 { + color=blue + 213 [label="Enter block"]; + 214 [label="Access variable this@R|/test_6|"]; + 215 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"]; + 216 [label="Access variable R|kotlin/collections/List.size|"]; + 217 [label="Access variable this@R|/test_6|"]; + 218 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"]; + 219 [label="Access variable R|kotlin/String.length|"]; + 220 [label="Exit block"]; + } + 212 [label="Exit function test_6" style="filled" fillcolor=red]; + } + 211 -> {213}; + 213 -> {214}; + 214 -> {215}; + 215 -> {216}; + 216 -> {217}; + 217 -> {218}; + 218 -> {219}; + 219 -> {220}; + 220 -> {212}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/thisOfExtensionProperty.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/thisOfExtensionProperty.dot index de1f69e75a8..44e16684fd3 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/thisOfExtensionProperty.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/receivers/thisOfExtensionProperty.dot @@ -5,101 +5,97 @@ digraph thisOfExtensionProperty_kt { subgraph cluster_0 { color=red - 0 [label="Enter class A" style="filled" fillcolor=red]; - 1 [label="Exit class A" style="filled" fillcolor=red]; + 1 [label="Enter class A" style="filled" fillcolor=red]; + 0 [label="Exit class A" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; + 1 -> {0} [color=green]; subgraph cluster_1 { color=red - 6 [label="Enter class B" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 2 [label="Enter function getter" style="filled" fillcolor=red]; - 3 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_3 { - color=blue - 4 [label="Enter property" style="filled" fillcolor=red]; - 5 [label="Exit property" style="filled" fillcolor=red]; - } - 7 [label="Exit class B" style="filled" fillcolor=red]; + 2 [label="Enter function getter" style="filled" fillcolor=red]; + 3 [label="Exit function getter" style="filled" fillcolor=red]; } - 6 -> {4} [color=green]; - 4 -> {5}; - 5 -> {7} [color=green]; 2 -> {3}; - subgraph cluster_4 { + subgraph cluster_2 { color=red - 19 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_5 { - color=blue - 8 [label="Enter function getter" style="filled" fillcolor=red]; - subgraph cluster_6 { - color=blue - 11 [label="Enter &&"]; - 12 [label="Access variable this@R|/check_1|"]; - 13 [label="Type operator: (this@R|/check_1| is R|B|)"]; - 14 [label="Exit left part of &&"]; - 15 [label="Enter right part of &&"]; - 16 [label="Access variable R|/B.b|"]; - 10 [label="Exit &&"]; - } - 17 [label="Jump: ^ (this@R|/check_1| is R|B|) && this@R|/check_1|.R|/B.b|"]; - 18 [label="Stub" style="filled" fillcolor=gray]; - 9 [label="Exit function getter" style="filled" fillcolor=red]; - } - 20 [label="Exit property" style="filled" fillcolor=red]; + 5 [label="Enter class B" style="filled" fillcolor=red]; + 4 [label="Exit class B" style="filled" fillcolor=red]; } - 19 -> {20}; - 8 -> {11}; - 10 -> {17}; + 5 -> {4} [color=green]; + + subgraph cluster_3 { + color=red + 6 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_4 { + color=blue + 8 [label="Enter block"]; + subgraph cluster_5 { + color=blue + 10 [label="Enter &&"]; + 11 [label="Access variable this@R|/check_1|"]; + 12 [label="Type operator: (this@R|/check_1| is R|B|)"]; + 13 [label="Exit left part of &&"]; + 14 [label="Enter right part of &&"]; + 15 [label="Access variable R|/B.b|"]; + 9 [label="Exit &&"]; + } + 16 [label="Jump: ^ (this@R|/check_1| is R|B|) && this@R|/check_1|.R|/B.b|"]; + 17 [label="Stub" style="filled" fillcolor=gray]; + 18 [label="Exit block" style="filled" fillcolor=gray]; + } + 7 [label="Exit function getter" style="filled" fillcolor=red]; + } + 6 -> {8}; + 8 -> {10}; + 9 -> {16}; + 10 -> {11}; 11 -> {12}; 12 -> {13}; - 13 -> {14}; - 14 -> {10 15}; - 15 -> {16}; - 16 -> {10}; - 17 -> {9}; + 13 -> {9 14}; + 14 -> {15}; + 15 -> {9}; + 16 -> {7}; + 16 -> {17} [style=dotted]; 17 -> {18} [style=dotted]; - 18 -> {9} [style=dotted]; + 18 -> {7} [style=dotted]; - subgraph cluster_7 { + subgraph cluster_6 { color=red - 33 [label="Enter property" style="filled" fillcolor=red]; - subgraph cluster_8 { + 19 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_7 { color=blue - 21 [label="Enter function getter" style="filled" fillcolor=red]; - subgraph cluster_9 { + 21 [label="Enter block"]; + subgraph cluster_8 { color=blue - 24 [label="Enter &&"]; - 25 [label="Access variable this@R|/check_2|"]; - 26 [label="Type operator: (this@R|/check_2| is R|B|)"]; - 27 [label="Exit left part of &&"]; - 28 [label="Enter right part of &&"]; - 29 [label="Access variable this@R|/check_2|"]; - 30 [label="Access variable R|/B.b|"]; - 23 [label="Exit &&"]; + 23 [label="Enter &&"]; + 24 [label="Access variable this@R|/check_2|"]; + 25 [label="Type operator: (this@R|/check_2| is R|B|)"]; + 26 [label="Exit left part of &&"]; + 27 [label="Enter right part of &&"]; + 28 [label="Access variable this@R|/check_2|"]; + 29 [label="Access variable R|/B.b|"]; + 22 [label="Exit &&"]; } - 31 [label="Jump: ^ (this@R|/check_2| is R|B|) && this@R|/check_2|.R|/B.b|"]; - 32 [label="Stub" style="filled" fillcolor=gray]; - 22 [label="Exit function getter" style="filled" fillcolor=red]; + 30 [label="Jump: ^ (this@R|/check_2| is R|B|) && this@R|/check_2|.R|/B.b|"]; + 31 [label="Stub" style="filled" fillcolor=gray]; + 32 [label="Exit block" style="filled" fillcolor=gray]; } - 34 [label="Exit property" style="filled" fillcolor=red]; + 20 [label="Exit function getter" style="filled" fillcolor=red]; } - 33 -> {34}; - 21 -> {24}; - 23 -> {31}; + 19 -> {21}; + 21 -> {23}; + 22 -> {30}; + 23 -> {24}; 24 -> {25}; 25 -> {26}; - 26 -> {27}; - 27 -> {23 28}; + 26 -> {22 27}; + 27 -> {28}; 28 -> {29}; - 29 -> {30}; - 30 -> {23}; - 31 -> {22}; + 29 -> {22}; + 30 -> {20}; + 30 -> {31} [style=dotted]; 31 -> {32} [style=dotted]; - 32 -> {22} [style=dotted]; + 32 -> {20} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot index 0445d5076a6..354b0782e5b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/assignSafeCall.dot @@ -15,448 +15,499 @@ digraph assignSafeCall_kt { subgraph cluster_1 { color=red 3 [label="Enter function foo" style="filled" fillcolor=red]; - 5 [label="Const: Int(1)"]; - 6 [label="Jump: ^foo Int(1)"]; - 7 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_2 { + color=blue + 5 [label="Enter block"]; + 6 [label="Const: Int(1)"]; + 7 [label="Jump: ^foo Int(1)"]; + 8 [label="Stub" style="filled" fillcolor=gray]; + 9 [label="Exit block" style="filled" fillcolor=gray]; + } 4 [label="Exit function foo" style="filled" fillcolor=red]; } 3 -> {5}; 5 -> {6}; - 6 -> {4}; - 6 -> {7} [style=dotted]; - 7 -> {4} [style=dotted]; - - subgraph cluster_2 { - color=red - 13 [label="Enter function bar" style="filled" fillcolor=red]; - 14 [label="Exit function bar" style="filled" fillcolor=red]; - } - 13 -> {14}; + 6 -> {7}; + 7 -> {4}; + 7 -> {8} [style=dotted]; + 8 -> {9} [style=dotted]; + 9 -> {4} [style=dotted]; subgraph cluster_3 { color=red - 15 [label="Enter class A" style="filled" fillcolor=red]; - subgraph cluster_4 { - color=blue - 8 [label="Enter function getter" style="filled" fillcolor=red]; - 9 [label="Exit function getter" style="filled" fillcolor=red]; - } + 10 [label="Enter function getter" style="filled" fillcolor=red]; + 11 [label="Exit function getter" style="filled" fillcolor=red]; + } + 10 -> {11}; + + subgraph cluster_4 { + color=red + 15 [label="Enter function bar" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 10 [label="Enter property" style="filled" fillcolor=red]; - 12 [label="Const: Int(1)"]; - 11 [label="Exit property" style="filled" fillcolor=red]; + 17 [label="Enter block"]; + 18 [label="Exit block"]; } - 16 [label="Exit class A" style="filled" fillcolor=red]; + 16 [label="Exit function bar" style="filled" fillcolor=red]; } - 15 -> {10} [color=green]; - 10 -> {12}; - 11 -> {16} [color=green]; - 12 -> {11}; - 8 -> {9}; + 15 -> {17}; + 17 -> {18}; + 18 -> {16}; subgraph cluster_6 { color=red - 17 [label="Enter function test_1" style="filled" fillcolor=red]; - 19 [label="Access variable R|/a|"]; - 20 [label="Enter safe call"]; - 22 [label="Access variable R|/A.x|"]; - 21 [label="Exit safe call"]; - 23 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 20 [label="Enter class A" style="filled" fillcolor=red]; subgraph cluster_7 { color=blue - 24 [label="Enter when"]; - subgraph cluster_8 { - color=blue - 26 [label="Enter when branch condition "]; - 27 [label="Access variable R|/x|"]; - 28 [label="Const: Null(null)"]; - 29 [label="Operator !="]; - 30 [label="Exit when branch condition"]; - } - 37 [label="Synthetic else branch"]; - 31 [label="Enter when branch result"]; - subgraph cluster_9 { - color=blue - 32 [label="Enter block"]; - 33 [label="Access variable R|/a|"]; - 34 [label="Function call: R|/a|.R|/A.bar|()"]; - 35 [label="Exit block"]; - } - 36 [label="Exit when branch result"]; - 25 [label="Exit when"]; + 12 [label="Enter property" style="filled" fillcolor=red]; + 14 [label="Const: Int(1)"]; + 13 [label="Exit property" style="filled" fillcolor=red]; } - 18 [label="Exit function test_1" style="filled" fillcolor=red]; + 19 [label="Exit class A" style="filled" fillcolor=red]; + } + 20 -> {12} [color=green]; + 12 -> {14}; + 13 -> {19} [color=green]; + 14 -> {13}; + + subgraph cluster_8 { + color=red + 21 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 23 [label="Enter block"]; + 24 [label="Access variable R|/a|"]; + 25 [label="Enter safe call"]; + 27 [label="Access variable R|/A.x|"]; + 26 [label="Exit safe call"]; + 28 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + subgraph cluster_10 { + color=blue + 29 [label="Enter when"]; + subgraph cluster_11 { + color=blue + 31 [label="Enter when branch condition "]; + 32 [label="Access variable R|/x|"]; + 33 [label="Const: Null(null)"]; + 34 [label="Operator !="]; + 35 [label="Exit when branch condition"]; + } + 42 [label="Synthetic else branch"]; + 36 [label="Enter when branch result"]; + subgraph cluster_12 { + color=blue + 37 [label="Enter block"]; + 38 [label="Access variable R|/a|"]; + 39 [label="Function call: R|/a|.R|/A.bar|()"]; + 40 [label="Exit block"]; + } + 41 [label="Exit when branch result"]; + 30 [label="Exit when"]; + } + 43 [label="Exit block"]; + } + 22 [label="Exit function test_1" style="filled" fillcolor=red]; } - 17 -> {19}; - 19 -> {20 21}; - 20 -> {22}; 21 -> {23}; - 22 -> {21}; 23 -> {24}; - 24 -> {26}; - 25 -> {18}; - 26 -> {27}; - 27 -> {28}; + 24 -> {25 26}; + 25 -> {27}; + 26 -> {28}; + 27 -> {26}; 28 -> {29}; - 29 -> {30}; - 30 -> {31 37}; + 29 -> {31}; + 30 -> {43}; 31 -> {32}; 32 -> {33}; 33 -> {34}; 34 -> {35}; - 35 -> {36}; - 36 -> {25}; - 37 -> {25}; + 35 -> {36 42}; + 36 -> {37}; + 37 -> {38}; + 38 -> {39}; + 39 -> {40}; + 40 -> {41}; + 41 -> {30}; + 42 -> {30}; + 43 -> {22}; - subgraph cluster_10 { + subgraph cluster_13 { color=red - 38 [label="Enter function test_2" style="filled" fillcolor=red]; - 40 [label="Access variable R|/a|"]; - 41 [label="Enter safe call"]; - 43 [label="Function call: $subj$.R|/A.foo|()"]; - 42 [label="Exit safe call"]; - 44 [label="Variable declaration: lval x: R|kotlin/Int?|"]; - subgraph cluster_11 { + 44 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_14 { color=blue - 45 [label="Enter when"]; - subgraph cluster_12 { + 46 [label="Enter block"]; + 47 [label="Access variable R|/a|"]; + 48 [label="Enter safe call"]; + 50 [label="Function call: $subj$.R|/A.foo|()"]; + 49 [label="Exit safe call"]; + 51 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + subgraph cluster_15 { color=blue - 47 [label="Enter when branch condition "]; - 48 [label="Access variable R|/x|"]; - 49 [label="Const: Null(null)"]; - 50 [label="Operator !="]; - 51 [label="Exit when branch condition"]; + 52 [label="Enter when"]; + subgraph cluster_16 { + color=blue + 54 [label="Enter when branch condition "]; + 55 [label="Access variable R|/x|"]; + 56 [label="Const: Null(null)"]; + 57 [label="Operator !="]; + 58 [label="Exit when branch condition"]; + } + 65 [label="Synthetic else branch"]; + 59 [label="Enter when branch result"]; + subgraph cluster_17 { + color=blue + 60 [label="Enter block"]; + 61 [label="Access variable R|/a|"]; + 62 [label="Function call: R|/a|.R|/A.bar|()"]; + 63 [label="Exit block"]; + } + 64 [label="Exit when branch result"]; + 53 [label="Exit when"]; } - 58 [label="Synthetic else branch"]; - 52 [label="Enter when branch result"]; - subgraph cluster_13 { - color=blue - 53 [label="Enter block"]; - 54 [label="Access variable R|/a|"]; - 55 [label="Function call: R|/a|.R|/A.bar|()"]; - 56 [label="Exit block"]; - } - 57 [label="Exit when branch result"]; - 46 [label="Exit when"]; + 66 [label="Exit block"]; } - 39 [label="Exit function test_2" style="filled" fillcolor=red]; + 45 [label="Exit function test_2" style="filled" fillcolor=red]; } - 38 -> {40}; - 40 -> {41 42}; - 41 -> {43}; - 42 -> {44}; - 43 -> {42}; - 44 -> {45}; - 45 -> {47}; - 46 -> {39}; - 47 -> {48}; - 48 -> {49}; - 49 -> {50}; - 50 -> {51}; - 51 -> {52 58}; - 52 -> {53}; - 53 -> {54}; + 44 -> {46}; + 46 -> {47}; + 47 -> {48 49}; + 48 -> {50}; + 49 -> {51}; + 50 -> {49}; + 51 -> {52}; + 52 -> {54}; + 53 -> {66}; 54 -> {55}; 55 -> {56}; 56 -> {57}; - 57 -> {46}; - 58 -> {46}; - - subgraph cluster_14 { - color=red - 59 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_15 { - color=blue - 61 [label="Enter when"]; - 63 [label="Access variable R|/x|"]; - 64 [label="Type operator: (R|/x| as? R|A|)"]; - 65 [label="Variable declaration: lval : R|A?|"]; - subgraph cluster_16 { - color=blue - 66 [label="Enter when branch condition "]; - 67 [label="Const: Null(null)"]; - 68 [label="Operator =="]; - 69 [label="Exit when branch condition"]; - } - subgraph cluster_17 { - color=blue - 76 [label="Enter when branch condition else"]; - 77 [label="Exit when branch condition"]; - } - 78 [label="Enter when branch result"]; - subgraph cluster_18 { - color=blue - 79 [label="Enter block"]; - 80 [label="Access variable R|/|"]; - 81 [label="Exit block"]; - } - 82 [label="Exit when branch result"]; - 70 [label="Enter when branch result"]; - subgraph cluster_19 { - color=blue - 71 [label="Enter block"]; - 72 [label="Jump: ^test_3 Unit"]; - 73 [label="Stub" style="filled" fillcolor=gray]; - 74 [label="Exit block" style="filled" fillcolor=gray]; - } - 75 [label="Exit when branch result" style="filled" fillcolor=gray]; - 62 [label="Exit when"]; - } - 83 [label="Variable declaration: lval a: R|A|"]; - 84 [label="Access variable R|/a|"]; - 85 [label="Function call: R|/a|.R|/A.foo|()"]; - 86 [label="Access variable R|/x|"]; - 87 [label="Function call: R|/x|.R|/A.foo|()"]; - 60 [label="Exit function test_3" style="filled" fillcolor=red]; - } - 59 -> {61}; - 61 -> {63}; - 62 -> {83}; + 57 -> {58}; + 58 -> {59 65}; + 59 -> {60}; + 60 -> {61}; + 61 -> {62}; + 62 -> {63}; 63 -> {64}; - 64 -> {65}; - 65 -> {66}; - 66 -> {67}; - 67 -> {68}; - 68 -> {69}; - 69 -> {70 76}; - 70 -> {71}; - 71 -> {72}; - 72 -> {60}; - 72 -> {73} [style=dotted]; - 73 -> {74} [style=dotted]; - 74 -> {75} [style=dotted]; - 75 -> {62} [style=dotted]; + 64 -> {53}; + 65 -> {53}; + 66 -> {45}; + + subgraph cluster_18 { + color=red + 67 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 69 [label="Enter block"]; + subgraph cluster_20 { + color=blue + 70 [label="Enter when"]; + 72 [label="Access variable R|/x|"]; + 73 [label="Type operator: (R|/x| as? R|A|)"]; + 74 [label="Variable declaration: lval : R|A?|"]; + subgraph cluster_21 { + color=blue + 75 [label="Enter when branch condition "]; + 76 [label="Const: Null(null)"]; + 77 [label="Operator =="]; + 78 [label="Exit when branch condition"]; + } + subgraph cluster_22 { + color=blue + 85 [label="Enter when branch condition else"]; + 86 [label="Exit when branch condition"]; + } + 87 [label="Enter when branch result"]; + subgraph cluster_23 { + color=blue + 88 [label="Enter block"]; + 89 [label="Access variable R|/|"]; + 90 [label="Exit block"]; + } + 91 [label="Exit when branch result"]; + 79 [label="Enter when branch result"]; + subgraph cluster_24 { + color=blue + 80 [label="Enter block"]; + 81 [label="Jump: ^test_3 Unit"]; + 82 [label="Stub" style="filled" fillcolor=gray]; + 83 [label="Exit block" style="filled" fillcolor=gray]; + } + 84 [label="Exit when branch result" style="filled" fillcolor=gray]; + 71 [label="Exit when"]; + } + 92 [label="Variable declaration: lval a: R|A|"]; + 93 [label="Access variable R|/a|"]; + 94 [label="Function call: R|/a|.R|/A.foo|()"]; + 95 [label="Access variable R|/x|"]; + 96 [label="Function call: R|/x|.R|/A.foo|()"]; + 97 [label="Exit block"]; + } + 68 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 67 -> {69}; + 69 -> {70}; + 70 -> {72}; + 71 -> {92}; + 72 -> {73}; + 73 -> {74}; + 74 -> {75}; + 75 -> {76}; 76 -> {77}; 77 -> {78}; - 78 -> {79}; + 78 -> {79 85}; 79 -> {80}; 80 -> {81}; - 81 -> {82}; - 82 -> {62}; - 83 -> {84}; - 84 -> {85}; + 81 -> {68}; + 81 -> {82} [style=dotted]; + 82 -> {83} [style=dotted]; + 83 -> {84} [style=dotted]; + 84 -> {71} [style=dotted]; 85 -> {86}; 86 -> {87}; - 87 -> {60}; - - subgraph cluster_20 { - color=red - 88 [label="Enter function foo" style="filled" fillcolor=red]; - 89 [label="Exit function foo" style="filled" fillcolor=red]; - } + 87 -> {88}; 88 -> {89}; - - subgraph cluster_21 { - color=red - 94 [label="Enter function bar" style="filled" fillcolor=red]; - 95 [label="Exit function bar" style="filled" fillcolor=red]; - } - 94 -> {95}; - - subgraph cluster_22 { - color=red - 96 [label="Enter class B" style="filled" fillcolor=red]; - subgraph cluster_23 { - color=blue - 90 [label="Enter function getter" style="filled" fillcolor=red]; - 91 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_24 { - color=blue - 92 [label="Enter property" style="filled" fillcolor=red]; - 93 [label="Exit property" style="filled" fillcolor=red]; - } - 97 [label="Exit class B" style="filled" fillcolor=red]; - } - 96 -> {92} [color=green]; - 92 -> {93}; - 93 -> {97} [color=green]; + 89 -> {90}; 90 -> {91}; + 91 -> {71}; + 92 -> {93}; + 93 -> {94}; + 94 -> {95}; + 95 -> {96}; + 96 -> {97}; + 97 -> {68}; subgraph cluster_25 { color=red - 98 [label="Enter function test_1" style="filled" fillcolor=red]; - 100 [label="Access variable R|/a|"]; - 101 [label="Enter safe call"]; - 103 [label="Access variable R|/B.x|"]; - 102 [label="Exit safe call"]; - 104 [label="Variable declaration: lval x: R|kotlin/Int?|"]; - subgraph cluster_26 { - color=blue - 105 [label="Enter when"]; - subgraph cluster_27 { - color=blue - 107 [label="Enter when branch condition "]; - 108 [label="Access variable R|/x|"]; - 109 [label="Const: Null(null)"]; - 110 [label="Operator !="]; - 111 [label="Exit when branch condition"]; - } - 118 [label="Synthetic else branch"]; - 112 [label="Enter when branch result"]; - subgraph cluster_28 { - color=blue - 113 [label="Enter block"]; - 114 [label="Access variable R|/a|"]; - 115 [label="Function call: R|/a|.R|/B.bar|()"]; - 116 [label="Exit block"]; - } - 117 [label="Exit when branch result"]; - 106 [label="Exit when"]; - } - 99 [label="Exit function test_1" style="filled" fillcolor=red]; + 98 [label="Enter function foo" style="filled" fillcolor=red]; + 99 [label="Exit function foo" style="filled" fillcolor=red]; } - 98 -> {100}; - 100 -> {101 102}; - 101 -> {103}; - 102 -> {104}; - 103 -> {102}; - 104 -> {105}; - 105 -> {107}; - 106 -> {99}; - 107 -> {108}; - 108 -> {109}; - 109 -> {110}; - 110 -> {111}; - 111 -> {112 118}; - 112 -> {113}; - 113 -> {114}; - 114 -> {115}; - 115 -> {116}; - 116 -> {117}; - 117 -> {106}; - 118 -> {106}; + 98 -> {99}; + + subgraph cluster_26 { + color=red + 100 [label="Enter function getter" style="filled" fillcolor=red]; + 101 [label="Exit function getter" style="filled" fillcolor=red]; + } + 100 -> {101}; + + subgraph cluster_27 { + color=red + 102 [label="Enter function bar" style="filled" fillcolor=red]; + 103 [label="Exit function bar" style="filled" fillcolor=red]; + } + 102 -> {103}; + + subgraph cluster_28 { + color=red + 105 [label="Enter class B" style="filled" fillcolor=red]; + 104 [label="Exit class B" style="filled" fillcolor=red]; + } + 105 -> {104} [color=green]; subgraph cluster_29 { color=red - 119 [label="Enter function test_2" style="filled" fillcolor=red]; - 121 [label="Access variable R|/a|"]; - 122 [label="Enter safe call"]; - 124 [label="Function call: $subj$.R|/B.foo|()"]; - 123 [label="Exit safe call"]; - 125 [label="Variable declaration: lval x: R|kotlin/Int?|"]; + 106 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_30 { color=blue - 126 [label="Enter when"]; + 108 [label="Enter block"]; + 109 [label="Access variable R|/a|"]; + 110 [label="Enter safe call"]; + 112 [label="Access variable R|/B.x|"]; + 111 [label="Exit safe call"]; + 113 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_31 { color=blue - 128 [label="Enter when branch condition "]; - 129 [label="Access variable R|/x|"]; - 130 [label="Const: Null(null)"]; - 131 [label="Operator !="]; - 132 [label="Exit when branch condition"]; + 114 [label="Enter when"]; + subgraph cluster_32 { + color=blue + 116 [label="Enter when branch condition "]; + 117 [label="Access variable R|/x|"]; + 118 [label="Const: Null(null)"]; + 119 [label="Operator !="]; + 120 [label="Exit when branch condition"]; + } + 127 [label="Synthetic else branch"]; + 121 [label="Enter when branch result"]; + subgraph cluster_33 { + color=blue + 122 [label="Enter block"]; + 123 [label="Access variable R|/a|"]; + 124 [label="Function call: R|/a|.R|/B.bar|()"]; + 125 [label="Exit block"]; + } + 126 [label="Exit when branch result"]; + 115 [label="Exit when"]; } - 139 [label="Synthetic else branch"]; - 133 [label="Enter when branch result"]; - subgraph cluster_32 { - color=blue - 134 [label="Enter block"]; - 135 [label="Access variable R|/a|"]; - 136 [label="Function call: R|/a|.R|/B.bar|()"]; - 137 [label="Exit block"]; - } - 138 [label="Exit when branch result"]; - 127 [label="Exit when"]; + 128 [label="Exit block"]; } - 120 [label="Exit function test_2" style="filled" fillcolor=red]; + 107 [label="Exit function test_1" style="filled" fillcolor=red]; } - 119 -> {121}; - 121 -> {122 123}; - 122 -> {124}; - 123 -> {125}; - 124 -> {123}; + 106 -> {108}; + 108 -> {109}; + 109 -> {110 111}; + 110 -> {112}; + 111 -> {113}; + 112 -> {111}; + 113 -> {114}; + 114 -> {116}; + 115 -> {128}; + 116 -> {117}; + 117 -> {118}; + 118 -> {119}; + 119 -> {120}; + 120 -> {121 127}; + 121 -> {122}; + 122 -> {123}; + 123 -> {124}; + 124 -> {125}; 125 -> {126}; - 126 -> {128}; - 127 -> {120}; - 128 -> {129}; - 129 -> {130}; - 130 -> {131}; - 131 -> {132}; - 132 -> {133 139}; - 133 -> {134}; - 134 -> {135}; - 135 -> {136}; - 136 -> {137}; - 137 -> {138}; - 138 -> {127}; - 139 -> {127}; + 126 -> {115}; + 127 -> {115}; + 128 -> {107}; - subgraph cluster_33 { + subgraph cluster_34 { color=red - 140 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_34 { + 129 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_35 { color=blue - 142 [label="Enter when"]; - 144 [label="Access variable R|/x|"]; - 145 [label="Type operator: (R|/x| as? R|B|)"]; - 146 [label="Variable declaration: lval : R|B?|"]; - subgraph cluster_35 { - color=blue - 147 [label="Enter when branch condition "]; - 148 [label="Const: Null(null)"]; - 149 [label="Operator =="]; - 150 [label="Exit when branch condition"]; - } + 131 [label="Enter block"]; + 132 [label="Access variable R|/a|"]; + 133 [label="Enter safe call"]; + 135 [label="Function call: $subj$.R|/B.foo|()"]; + 134 [label="Exit safe call"]; + 136 [label="Variable declaration: lval x: R|kotlin/Int?|"]; subgraph cluster_36 { color=blue - 157 [label="Enter when branch condition else"]; - 158 [label="Exit when branch condition"]; + 137 [label="Enter when"]; + subgraph cluster_37 { + color=blue + 139 [label="Enter when branch condition "]; + 140 [label="Access variable R|/x|"]; + 141 [label="Const: Null(null)"]; + 142 [label="Operator !="]; + 143 [label="Exit when branch condition"]; + } + 150 [label="Synthetic else branch"]; + 144 [label="Enter when branch result"]; + subgraph cluster_38 { + color=blue + 145 [label="Enter block"]; + 146 [label="Access variable R|/a|"]; + 147 [label="Function call: R|/a|.R|/B.bar|()"]; + 148 [label="Exit block"]; + } + 149 [label="Exit when branch result"]; + 138 [label="Exit when"]; } - 159 [label="Enter when branch result"]; - subgraph cluster_37 { - color=blue - 160 [label="Enter block"]; - 161 [label="Access variable R|/|"]; - 162 [label="Exit block"]; - } - 163 [label="Exit when branch result"]; - 151 [label="Enter when branch result"]; - subgraph cluster_38 { - 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]; - } - 156 [label="Exit when branch result" style="filled" fillcolor=gray]; - 143 [label="Exit when"]; + 151 [label="Exit block"]; } - 164 [label="Variable declaration: lval a: R|B|"]; - 165 [label="Access variable R|/a|"]; - 166 [label="Function call: R|/a|.R|/B.foo|()"]; - 167 [label="Access variable R|/x|"]; - 168 [label="Function call: R|/x|.R|/B.foo|()"]; - 141 [label="Exit function test_3" style="filled" fillcolor=red]; + 130 [label="Exit function test_2" style="filled" fillcolor=red]; } - 140 -> {142}; - 142 -> {144}; - 143 -> {164}; + 129 -> {131}; + 131 -> {132}; + 132 -> {133 134}; + 133 -> {135}; + 134 -> {136}; + 135 -> {134}; + 136 -> {137}; + 137 -> {139}; + 138 -> {151}; + 139 -> {140}; + 140 -> {141}; + 141 -> {142}; + 142 -> {143}; + 143 -> {144 150}; 144 -> {145}; 145 -> {146}; 146 -> {147}; 147 -> {148}; 148 -> {149}; - 149 -> {150}; - 150 -> {151 157}; - 151 -> {152}; - 152 -> {153}; - 153 -> {141}; - 153 -> {154} [style=dotted]; - 154 -> {155} [style=dotted]; - 155 -> {156} [style=dotted]; - 156 -> {143} [style=dotted]; + 149 -> {138}; + 150 -> {138}; + 151 -> {130}; + + subgraph cluster_39 { + color=red + 152 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_40 { + color=blue + 154 [label="Enter block"]; + subgraph cluster_41 { + color=blue + 155 [label="Enter when"]; + 157 [label="Access variable R|/x|"]; + 158 [label="Type operator: (R|/x| as? R|B|)"]; + 159 [label="Variable declaration: lval : R|B?|"]; + subgraph cluster_42 { + color=blue + 160 [label="Enter when branch condition "]; + 161 [label="Const: Null(null)"]; + 162 [label="Operator =="]; + 163 [label="Exit when branch condition"]; + } + subgraph cluster_43 { + color=blue + 170 [label="Enter when branch condition else"]; + 171 [label="Exit when branch condition"]; + } + 172 [label="Enter when branch result"]; + subgraph cluster_44 { + color=blue + 173 [label="Enter block"]; + 174 [label="Access variable R|/|"]; + 175 [label="Exit block"]; + } + 176 [label="Exit when branch result"]; + 164 [label="Enter when branch result"]; + subgraph cluster_45 { + color=blue + 165 [label="Enter block"]; + 166 [label="Jump: ^test_3 Unit"]; + 167 [label="Stub" style="filled" fillcolor=gray]; + 168 [label="Exit block" style="filled" fillcolor=gray]; + } + 169 [label="Exit when branch result" style="filled" fillcolor=gray]; + 156 [label="Exit when"]; + } + 177 [label="Variable declaration: lval a: R|B|"]; + 178 [label="Access variable R|/a|"]; + 179 [label="Function call: R|/a|.R|/B.foo|()"]; + 180 [label="Access variable R|/x|"]; + 181 [label="Function call: R|/x|.R|/B.foo|()"]; + 182 [label="Exit block"]; + } + 153 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 152 -> {154}; + 154 -> {155}; + 155 -> {157}; + 156 -> {177}; 157 -> {158}; 158 -> {159}; 159 -> {160}; 160 -> {161}; 161 -> {162}; 162 -> {163}; - 163 -> {143}; + 163 -> {164 170}; 164 -> {165}; 165 -> {166}; - 166 -> {167}; - 167 -> {168}; - 168 -> {141}; + 166 -> {153}; + 166 -> {167} [style=dotted]; + 167 -> {168} [style=dotted]; + 168 -> {169} [style=dotted]; + 169 -> {156} [style=dotted]; + 170 -> {171}; + 171 -> {172}; + 172 -> {173}; + 173 -> {174}; + 174 -> {175}; + 175 -> {176}; + 176 -> {156}; + 177 -> {178}; + 178 -> {179}; + 179 -> {180}; + 180 -> {181}; + 181 -> {182}; + 182 -> {153}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCallAndEqualityToBool.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCallAndEqualityToBool.dot index 60a3b8e0800..7a5e270759b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCallAndEqualityToBool.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCallAndEqualityToBool.dot @@ -6,295 +6,330 @@ digraph safeCallAndEqualityToBool_kt { subgraph cluster_0 { color=red 0 [label="Enter function check" style="filled" fillcolor=red]; - 2 [label="Const: Boolean(true)"]; - 3 [label="Jump: ^check Boolean(true)"]; - 4 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Const: Boolean(true)"]; + 4 [label="Jump: ^check Boolean(true)"]; + 5 [label="Stub" style="filled" fillcolor=gray]; + 6 [label="Exit block" style="filled" fillcolor=gray]; + } 1 [label="Exit function check" style="filled" fillcolor=red]; } 0 -> {2}; 2 -> {3}; - 3 -> {1}; - 3 -> {4} [style=dotted]; - 4 -> {1} [style=dotted]; + 3 -> {4}; + 4 -> {1}; + 4 -> {5} [style=dotted]; + 5 -> {6} [style=dotted]; + 6 -> {1} [style=dotted]; - subgraph cluster_1 { + subgraph cluster_2 { color=red - 5 [label="Enter function test_1" style="filled" fillcolor=red]; - subgraph cluster_2 { + 7 [label="Enter function test_1" style="filled" fillcolor=red]; + subgraph cluster_3 { color=blue - 7 [label="Enter when"]; - subgraph cluster_3 { - color=blue - 9 [label="Enter when branch condition "]; - 10 [label="Access variable R|/s|"]; - 11 [label="Enter safe call"]; - 13 [label="Function call: $subj$.R|/check|()"]; - 12 [label="Exit safe call"]; - 14 [label="Const: Boolean(true)"]; - 15 [label="Operator =="]; - 16 [label="Exit when branch condition"]; - } + 9 [label="Enter block"]; subgraph cluster_4 { color=blue - 23 [label="Enter when branch condition else"]; - 24 [label="Exit when branch condition"]; + 10 [label="Enter when"]; + subgraph cluster_5 { + color=blue + 12 [label="Enter when branch condition "]; + 13 [label="Access variable R|/s|"]; + 14 [label="Enter safe call"]; + 16 [label="Function call: $subj$.R|/check|()"]; + 15 [label="Exit safe call"]; + 17 [label="Const: Boolean(true)"]; + 18 [label="Operator =="]; + 19 [label="Exit when branch condition"]; + } + subgraph cluster_6 { + color=blue + 26 [label="Enter when branch condition else"]; + 27 [label="Exit when branch condition"]; + } + 28 [label="Enter when branch result"]; + subgraph cluster_7 { + color=blue + 29 [label="Enter block"]; + 30 [label="Access variable R|/s|"]; + 31 [label="Access variable #"]; + 32 [label="Exit block"]; + } + 33 [label="Exit when branch result"]; + 20 [label="Enter when branch result"]; + subgraph cluster_8 { + color=blue + 21 [label="Enter block"]; + 22 [label="Access variable R|/s|"]; + 23 [label="Access variable R|kotlin/String.length|"]; + 24 [label="Exit block"]; + } + 25 [label="Exit when branch result"]; + 11 [label="Exit when"]; } - 25 [label="Enter when branch result"]; - subgraph cluster_5 { - color=blue - 26 [label="Enter block"]; - 27 [label="Access variable R|/s|"]; - 28 [label="Access variable #"]; - 29 [label="Exit block"]; - } - 30 [label="Exit when branch result"]; - 17 [label="Enter when branch result"]; - subgraph cluster_6 { - color=blue - 18 [label="Enter block"]; - 19 [label="Access variable R|/s|"]; - 20 [label="Access variable R|kotlin/String.length|"]; - 21 [label="Exit block"]; - } - 22 [label="Exit when branch result"]; - 8 [label="Exit when"]; + 34 [label="Exit block"]; } - 6 [label="Exit function test_1" style="filled" fillcolor=red]; + 8 [label="Exit function test_1" style="filled" fillcolor=red]; } - 5 -> {7}; 7 -> {9}; - 8 -> {6}; 9 -> {10}; - 10 -> {11 12}; - 11 -> {13}; - 12 -> {14}; - 13 -> {12}; - 14 -> {15}; - 15 -> {16}; - 16 -> {17 23}; + 10 -> {12}; + 11 -> {34}; + 12 -> {13}; + 13 -> {14 15}; + 14 -> {16}; + 15 -> {17}; + 16 -> {15}; 17 -> {18}; 18 -> {19}; - 19 -> {20}; + 19 -> {20 26}; 20 -> {21}; 21 -> {22}; - 22 -> {8}; + 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {26}; + 25 -> {11}; 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {8}; + 30 -> {31}; + 31 -> {32}; + 32 -> {33}; + 33 -> {11}; + 34 -> {8}; - subgraph cluster_7 { + subgraph cluster_9 { color=red - 31 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_8 { + 35 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_10 { color=blue - 33 [label="Enter when"]; - subgraph cluster_9 { - color=blue - 35 [label="Enter when branch condition "]; - 36 [label="Access variable R|/s|"]; - 37 [label="Enter safe call"]; - 39 [label="Function call: $subj$.R|/check|()"]; - 38 [label="Exit safe call"]; - 40 [label="Const: Boolean(false)"]; - 41 [label="Operator =="]; - 42 [label="Exit when branch condition"]; - } - subgraph cluster_10 { - color=blue - 49 [label="Enter when branch condition else"]; - 50 [label="Exit when branch condition"]; - } - 51 [label="Enter when branch result"]; + 37 [label="Enter block"]; subgraph cluster_11 { color=blue - 52 [label="Enter block"]; - 53 [label="Access variable R|/s|"]; - 54 [label="Access variable #"]; - 55 [label="Exit block"]; + 38 [label="Enter when"]; + subgraph cluster_12 { + color=blue + 40 [label="Enter when branch condition "]; + 41 [label="Access variable R|/s|"]; + 42 [label="Enter safe call"]; + 44 [label="Function call: $subj$.R|/check|()"]; + 43 [label="Exit safe call"]; + 45 [label="Const: Boolean(false)"]; + 46 [label="Operator =="]; + 47 [label="Exit when branch condition"]; + } + subgraph cluster_13 { + color=blue + 54 [label="Enter when branch condition else"]; + 55 [label="Exit when branch condition"]; + } + 56 [label="Enter when branch result"]; + subgraph cluster_14 { + color=blue + 57 [label="Enter block"]; + 58 [label="Access variable R|/s|"]; + 59 [label="Access variable #"]; + 60 [label="Exit block"]; + } + 61 [label="Exit when branch result"]; + 48 [label="Enter when branch result"]; + subgraph cluster_15 { + color=blue + 49 [label="Enter block"]; + 50 [label="Access variable R|/s|"]; + 51 [label="Access variable R|kotlin/String.length|"]; + 52 [label="Exit block"]; + } + 53 [label="Exit when branch result"]; + 39 [label="Exit when"]; } - 56 [label="Exit when branch result"]; - 43 [label="Enter when branch result"]; - subgraph cluster_12 { - color=blue - 44 [label="Enter block"]; - 45 [label="Access variable R|/s|"]; - 46 [label="Access variable R|kotlin/String.length|"]; - 47 [label="Exit block"]; - } - 48 [label="Exit when branch result"]; - 34 [label="Exit when"]; + 62 [label="Exit block"]; } - 32 [label="Exit function test_2" style="filled" fillcolor=red]; + 36 [label="Exit function test_2" style="filled" fillcolor=red]; } - 31 -> {33}; - 33 -> {35}; - 34 -> {32}; - 35 -> {36}; - 36 -> {37 38}; - 37 -> {39}; + 35 -> {37}; + 37 -> {38}; 38 -> {40}; - 39 -> {38}; + 39 -> {62}; 40 -> {41}; - 41 -> {42}; - 42 -> {43 49}; - 43 -> {44}; - 44 -> {45}; + 41 -> {42 43}; + 42 -> {44}; + 43 -> {45}; + 44 -> {43}; 45 -> {46}; 46 -> {47}; - 47 -> {48}; - 48 -> {34}; + 47 -> {48 54}; + 48 -> {49}; 49 -> {50}; 50 -> {51}; 51 -> {52}; 52 -> {53}; - 53 -> {54}; + 53 -> {39}; 54 -> {55}; 55 -> {56}; - 56 -> {34}; + 56 -> {57}; + 57 -> {58}; + 58 -> {59}; + 59 -> {60}; + 60 -> {61}; + 61 -> {39}; + 62 -> {36}; - subgraph cluster_13 { + subgraph cluster_16 { color=red - 57 [label="Enter function test_3" style="filled" fillcolor=red]; - subgraph cluster_14 { + 63 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_17 { color=blue - 59 [label="Enter when"]; - subgraph cluster_15 { - color=blue - 61 [label="Enter when branch condition "]; - 62 [label="Access variable R|/s|"]; - 63 [label="Enter safe call"]; - 65 [label="Function call: $subj$.R|/check|()"]; - 64 [label="Exit safe call"]; - 66 [label="Const: Boolean(true)"]; - 67 [label="Operator !="]; - 68 [label="Exit when branch condition"]; - } - subgraph cluster_16 { - color=blue - 75 [label="Enter when branch condition else"]; - 76 [label="Exit when branch condition"]; - } - 77 [label="Enter when branch result"]; - subgraph cluster_17 { - color=blue - 78 [label="Enter block"]; - 79 [label="Access variable R|/s|"]; - 80 [label="Access variable R|kotlin/String.length|"]; - 81 [label="Exit block"]; - } - 82 [label="Exit when branch result"]; - 69 [label="Enter when branch result"]; + 65 [label="Enter block"]; subgraph cluster_18 { color=blue - 70 [label="Enter block"]; - 71 [label="Access variable R|/s|"]; - 72 [label="Access variable #"]; - 73 [label="Exit block"]; + 66 [label="Enter when"]; + subgraph cluster_19 { + color=blue + 68 [label="Enter when branch condition "]; + 69 [label="Access variable R|/s|"]; + 70 [label="Enter safe call"]; + 72 [label="Function call: $subj$.R|/check|()"]; + 71 [label="Exit safe call"]; + 73 [label="Const: Boolean(true)"]; + 74 [label="Operator !="]; + 75 [label="Exit when branch condition"]; + } + subgraph cluster_20 { + color=blue + 82 [label="Enter when branch condition else"]; + 83 [label="Exit when branch condition"]; + } + 84 [label="Enter when branch result"]; + subgraph cluster_21 { + color=blue + 85 [label="Enter block"]; + 86 [label="Access variable R|/s|"]; + 87 [label="Access variable R|kotlin/String.length|"]; + 88 [label="Exit block"]; + } + 89 [label="Exit when branch result"]; + 76 [label="Enter when branch result"]; + subgraph cluster_22 { + color=blue + 77 [label="Enter block"]; + 78 [label="Access variable R|/s|"]; + 79 [label="Access variable #"]; + 80 [label="Exit block"]; + } + 81 [label="Exit when branch result"]; + 67 [label="Exit when"]; } - 74 [label="Exit when branch result"]; - 60 [label="Exit when"]; + 90 [label="Exit block"]; } - 58 [label="Exit function test_3" style="filled" fillcolor=red]; + 64 [label="Exit function test_3" style="filled" fillcolor=red]; } - 57 -> {59}; - 59 -> {61}; - 60 -> {58}; - 61 -> {62}; - 62 -> {63 64}; 63 -> {65}; - 64 -> {66}; - 65 -> {64}; - 66 -> {67}; - 67 -> {68}; - 68 -> {69 75}; - 69 -> {70}; - 70 -> {71}; - 71 -> {72}; - 72 -> {73}; + 65 -> {66}; + 66 -> {68}; + 67 -> {90}; + 68 -> {69}; + 69 -> {70 71}; + 70 -> {72}; + 71 -> {73}; + 72 -> {71}; 73 -> {74}; - 74 -> {60}; - 75 -> {76}; + 74 -> {75}; + 75 -> {76 82}; 76 -> {77}; 77 -> {78}; 78 -> {79}; 79 -> {80}; 80 -> {81}; - 81 -> {82}; - 82 -> {60}; - - subgraph cluster_19 { - color=red - 83 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_20 { - color=blue - 85 [label="Enter when"]; - subgraph cluster_21 { - color=blue - 87 [label="Enter when branch condition "]; - 88 [label="Access variable R|/s|"]; - 89 [label="Enter safe call"]; - 91 [label="Function call: $subj$.R|/check|()"]; - 90 [label="Exit safe call"]; - 92 [label="Const: Boolean(false)"]; - 93 [label="Operator !="]; - 94 [label="Exit when branch condition"]; - } - subgraph cluster_22 { - color=blue - 101 [label="Enter when branch condition else"]; - 102 [label="Exit when branch condition"]; - } - 103 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 104 [label="Enter block"]; - 105 [label="Access variable R|/s|"]; - 106 [label="Access variable R|kotlin/String.length|"]; - 107 [label="Exit block"]; - } - 108 [label="Exit when branch result"]; - 95 [label="Enter when branch result"]; - subgraph cluster_24 { - color=blue - 96 [label="Enter block"]; - 97 [label="Access variable R|/s|"]; - 98 [label="Access variable #"]; - 99 [label="Exit block"]; - } - 100 [label="Exit when branch result"]; - 86 [label="Exit when"]; - } - 84 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 83 -> {85}; - 85 -> {87}; - 86 -> {84}; + 81 -> {67}; + 82 -> {83}; + 83 -> {84}; + 84 -> {85}; + 85 -> {86}; + 86 -> {87}; 87 -> {88}; - 88 -> {89 90}; - 89 -> {91}; - 90 -> {92}; - 91 -> {90}; - 92 -> {93}; + 88 -> {89}; + 89 -> {67}; + 90 -> {64}; + + subgraph cluster_23 { + color=red + 91 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_24 { + color=blue + 93 [label="Enter block"]; + subgraph cluster_25 { + color=blue + 94 [label="Enter when"]; + subgraph cluster_26 { + color=blue + 96 [label="Enter when branch condition "]; + 97 [label="Access variable R|/s|"]; + 98 [label="Enter safe call"]; + 100 [label="Function call: $subj$.R|/check|()"]; + 99 [label="Exit safe call"]; + 101 [label="Const: Boolean(false)"]; + 102 [label="Operator !="]; + 103 [label="Exit when branch condition"]; + } + subgraph cluster_27 { + color=blue + 110 [label="Enter when branch condition else"]; + 111 [label="Exit when branch condition"]; + } + 112 [label="Enter when branch result"]; + subgraph cluster_28 { + color=blue + 113 [label="Enter block"]; + 114 [label="Access variable R|/s|"]; + 115 [label="Access variable R|kotlin/String.length|"]; + 116 [label="Exit block"]; + } + 117 [label="Exit when branch result"]; + 104 [label="Enter when branch result"]; + subgraph cluster_29 { + color=blue + 105 [label="Enter block"]; + 106 [label="Access variable R|/s|"]; + 107 [label="Access variable #"]; + 108 [label="Exit block"]; + } + 109 [label="Exit when branch result"]; + 95 [label="Exit when"]; + } + 118 [label="Exit block"]; + } + 92 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 91 -> {93}; 93 -> {94}; - 94 -> {95 101}; - 95 -> {96}; + 94 -> {96}; + 95 -> {118}; 96 -> {97}; - 97 -> {98}; - 98 -> {99}; - 99 -> {100}; - 100 -> {86}; + 97 -> {98 99}; + 98 -> {100}; + 99 -> {101}; + 100 -> {99}; 101 -> {102}; 102 -> {103}; - 103 -> {104}; + 103 -> {104 110}; 104 -> {105}; 105 -> {106}; 106 -> {107}; 107 -> {108}; - 108 -> {86}; + 108 -> {109}; + 109 -> {95}; + 110 -> {111}; + 111 -> {112}; + 112 -> {113}; + 113 -> {114}; + 114 -> {115}; + 115 -> {116}; + 116 -> {117}; + 117 -> {95}; + 118 -> {92}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot index 3b71bca5338..299d60b62c2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.dot @@ -6,233 +6,301 @@ digraph safeCalls_kt { subgraph cluster_0 { color=red 0 [label="Enter function foo" style="filled" fillcolor=red]; - 2 [label="Const: String()"]; - 3 [label="Jump: ^foo String()"]; - 4 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Const: String()"]; + 4 [label="Jump: ^foo String()"]; + 5 [label="Stub" style="filled" fillcolor=gray]; + 6 [label="Exit block" style="filled" fillcolor=gray]; + } 1 [label="Exit function foo" style="filled" fillcolor=red]; } 0 -> {2}; 2 -> {3}; - 3 -> {1}; - 3 -> {4} [style=dotted]; - 4 -> {1} [style=dotted]; - - subgraph cluster_1 { - color=red - 5 [label="Enter function let" style="filled" fillcolor=red]; - 6 [label="Exit function let" style="filled" fillcolor=red]; - } - 5 -> {6}; + 3 -> {4}; + 4 -> {1}; + 4 -> {5} [style=dotted]; + 5 -> {6} [style=dotted]; + 6 -> {1} [style=dotted]; subgraph cluster_2 { color=red - 7 [label="Enter function test" style="filled" fillcolor=red]; - 9 [label="Access variable R|/x|"]; - 10 [label="Enter safe call"]; - 12 [label="Access variable R|/x|"]; - 13 [label="Access variable R|kotlin/String.length|"]; - 14 [label="Const: Int(1)"]; - 15 [label="Operator =="]; - 16 [label="Function call: $subj$.R|/foo|(...)"]; - 11 [label="Exit safe call"]; - 17 [label="Access variable R|/x|"]; - 18 [label="Access variable #"]; - 8 [label="Exit function test" style="filled" fillcolor=red]; + 7 [label="Enter function let" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 9 [label="Enter block"]; + 10 [label="Exit block"]; + } + 8 [label="Exit function let" style="filled" fillcolor=red]; } 7 -> {9}; - 9 -> {10 11}; - 10 -> {12}; - 11 -> {17}; - 12 -> {13}; - 13 -> {14}; - 14 -> {15}; - 15 -> {16}; - 16 -> {11}; - 17 -> {18}; - 18 -> {8}; - - subgraph cluster_3 { - color=red - 19 [label="Enter function bar" style="filled" fillcolor=red]; - 20 [label="Exit function bar" style="filled" fillcolor=red]; - } - 19 -> {20}; + 9 -> {10}; + 10 -> {8}; subgraph cluster_4 { color=red - 21 [label="Enter function bool" style="filled" fillcolor=red]; - 22 [label="Exit function bool" style="filled" fillcolor=red]; - } - 21 -> {22}; - - subgraph cluster_5 { - color=red - 23 [label="Enter function id" style="filled" fillcolor=red]; - 24 [label="Exit function id" style="filled" fillcolor=red]; + 11 [label="Enter function test" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 13 [label="Enter block"]; + 14 [label="Access variable R|/x|"]; + 15 [label="Enter safe call"]; + 17 [label="Access variable R|/x|"]; + 18 [label="Access variable R|kotlin/String.length|"]; + 19 [label="Const: Int(1)"]; + 20 [label="Operator =="]; + 21 [label="Function call: $subj$.R|/foo|(...)"]; + 16 [label="Exit safe call"]; + 22 [label="Access variable R|/x|"]; + 23 [label="Access variable #"]; + 24 [label="Exit block"]; + } + 12 [label="Exit function test" style="filled" fillcolor=red]; } + 11 -> {13}; + 13 -> {14}; + 14 -> {15 16}; + 15 -> {17}; + 16 -> {22}; + 17 -> {18}; + 18 -> {19}; + 19 -> {20}; + 20 -> {21}; + 21 -> {16}; + 22 -> {23}; 23 -> {24}; + 24 -> {12}; subgraph cluster_6 { color=red - 25 [label="Enter class A" style="filled" fillcolor=red]; - 26 [label="Exit class A" style="filled" fillcolor=red]; + 25 [label="Enter function bar" style="filled" fillcolor=red]; + 26 [label="Exit function bar" style="filled" fillcolor=red]; } - 25 -> {26} [color=green]; + 25 -> {26}; subgraph cluster_7 { color=red - 27 [label="Enter function test_2" style="filled" fillcolor=red]; - 29 [label="Access variable R|/x|"]; - 30 [label="Type operator: (R|/x| as? R|A|)"]; - 31 [label="Enter safe call"]; - 33 [label="Access variable R|/x|"]; - 34 [label="Function call: $subj$.R|/A.bar|(...)"]; - 32 [label="Exit safe call"]; - 28 [label="Exit function test_2" style="filled" fillcolor=red]; + 27 [label="Enter function bool" style="filled" fillcolor=red]; + 28 [label="Exit function bool" style="filled" fillcolor=red]; } - 27 -> {29}; - 29 -> {30}; - 30 -> {31 32}; - 31 -> {33}; - 32 -> {28}; - 33 -> {34}; - 34 -> {32}; + 27 -> {28}; subgraph cluster_8 { color=red - 35 [label="Enter function test_3" style="filled" fillcolor=red]; - 37 [label="Access variable R|/x|"]; - 38 [label="Type operator: (R|/x| as? R|A|)"]; - 39 [label="Enter safe call"]; - 41 [label="Access variable R|/x|"]; - 42 [label="Function call: $subj$.R|/A.bar|(...)"]; - 40 [label="Exit safe call"]; - 43 [label="Enter safe call"]; - 45 [label="Access variable R|/x|"]; - 46 [label="Function call: R|/x|.R|/A.bool|()"]; - 47 [label="Function call: $subj$.R|/foo|(...)"]; - 44 [label="Exit safe call"]; - 48 [label="Enter safe call"]; - 50 [label="Postponed enter to lambda"]; - subgraph cluster_9 { - color=blue - 55 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 57 [label="Access variable R|/x|"]; - 58 [label="Function call: R|/x|.R|/A.bool|()"]; - 56 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 51 [label="Postponed exit from lambda"]; - 52 [label="Function call: $subj$.R|/let|(...)"]; - 49 [label="Exit safe call"]; - 53 [label="Access variable R|/x|"]; - 54 [label="Function call: R|/x|.#()"]; - 36 [label="Exit function test_3" style="filled" fillcolor=red]; + 29 [label="Enter function id" style="filled" fillcolor=red]; + 30 [label="Exit function id" style="filled" fillcolor=red]; } - 35 -> {37}; - 37 -> {38}; - 38 -> {39 40}; - 39 -> {41}; - 40 -> {43 44}; - 41 -> {42}; - 42 -> {40}; - 43 -> {45}; - 44 -> {48 49}; - 45 -> {46}; - 46 -> {47}; - 47 -> {44}; - 48 -> {50}; - 49 -> {53}; - 50 -> {51}; - 50 -> {55} [color=red]; - 51 -> {52}; - 52 -> {49}; - 53 -> {54}; - 54 -> {36}; - 55 -> {57}; - 57 -> {58}; - 58 -> {56}; + 29 -> {30}; + + subgraph cluster_9 { + color=red + 32 [label="Enter class A" style="filled" fillcolor=red]; + 31 [label="Exit class A" style="filled" fillcolor=red]; + } + 32 -> {31} [color=green]; subgraph cluster_10 { color=red - 59 [label="Enter function test_4" style="filled" fillcolor=red]; - 61 [label="Access variable R|/x|"]; - 62 [label="Enter safe call"]; - 64 [label="Function call: $subj$.R|/A.id|()"]; - 63 [label="Exit safe call"]; - 65 [label="Enter safe call"]; - 67 [label="Function call: $subj$.R|/A.bool|()"]; - 66 [label="Exit safe call"]; - 68 [label="Access variable R|/x|"]; - 69 [label="Function call: R|/x|.#()"]; - 60 [label="Exit function test_4" style="filled" fillcolor=red]; + 33 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 35 [label="Enter block"]; + 36 [label="Access variable R|/x|"]; + 37 [label="Type operator: (R|/x| as? R|A|)"]; + 38 [label="Enter safe call"]; + 40 [label="Access variable R|/x|"]; + 41 [label="Function call: $subj$.R|/A.bar|(...)"]; + 39 [label="Exit safe call"]; + 42 [label="Exit block"]; + } + 34 [label="Exit function test_2" style="filled" fillcolor=red]; } - 59 -> {61}; - 61 -> {62 63}; - 62 -> {64}; - 63 -> {65 66}; - 64 -> {63}; - 65 -> {67}; - 66 -> {68}; - 67 -> {66}; - 68 -> {69}; - 69 -> {60}; - - subgraph cluster_11 { - color=red - 70 [label="Enter function boo" style="filled" fillcolor=red]; - 71 [label="Exit function boo" style="filled" fillcolor=red]; - } - 70 -> {71}; + 33 -> {35}; + 35 -> {36}; + 36 -> {37}; + 37 -> {38 39}; + 38 -> {40}; + 39 -> {42}; + 40 -> {41}; + 41 -> {39}; + 42 -> {34}; subgraph cluster_12 { color=red - 72 [label="Enter function test_5" style="filled" fillcolor=red]; - 74 [label="Access variable R|/x|"]; - 75 [label="Enter safe call"]; - 77 [label="Postponed enter to lambda"]; + 43 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_13 { color=blue - 89 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 91 [label="Jump: ^test_5 Unit"]; - 92 [label="Stub" style="filled" fillcolor=gray]; - 90 [label="Exit function anonymousFunction" style="filled" fillcolor=red style="filled" fillcolor=gray]; + 45 [label="Enter block"]; + 46 [label="Access variable R|/x|"]; + 47 [label="Type operator: (R|/x| as? R|A|)"]; + 48 [label="Enter safe call"]; + 50 [label="Access variable R|/x|"]; + 51 [label="Function call: $subj$.R|/A.bar|(...)"]; + 49 [label="Exit safe call"]; + 52 [label="Enter safe call"]; + 54 [label="Access variable R|/x|"]; + 55 [label="Function call: R|/x|.R|/A.bool|()"]; + 56 [label="Function call: $subj$.R|/foo|(...)"]; + 53 [label="Exit safe call"]; + 57 [label="Enter safe call"]; + 59 [label="Postponed enter to lambda"]; + subgraph cluster_14 { + color=blue + 65 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_15 { + color=blue + 67 [label="Enter block"]; + 68 [label="Access variable R|/x|"]; + 69 [label="Function call: R|/x|.R|/A.bool|()"]; + 70 [label="Exit block"]; + } + 66 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 60 [label="Postponed exit from lambda"]; + 61 [label="Function call: $subj$.R|/let|(...)"]; + 58 [label="Exit safe call"]; + 62 [label="Access variable R|/x|"]; + 63 [label="Function call: R|/x|.#()"]; + 64 [label="Exit block"]; } - 80 [label="Call arguments union" style="filled" fillcolor=gray]; - 78 [label="Postponed exit from lambda"]; - 79 [label="Function call: $subj$.R|kotlin/let|(...)" style="filled" fillcolor=gray]; - 81 [label="Stub" style="filled" fillcolor=gray]; - 76 [label="Exit safe call"]; - 82 [label="Enter safe call"]; - 84 [label="Access variable R|/x|"]; - 85 [label="Function call: R|/x|.R|/A.bool|()"]; - 86 [label="Function call: $subj$.R|/boo|(...)"]; - 83 [label="Exit safe call"]; - 87 [label="Access variable R|/x|"]; - 88 [label="Function call: R|/x|.#()"]; - 73 [label="Exit function test_5" style="filled" fillcolor=red]; + 44 [label="Exit function test_3" style="filled" fillcolor=red]; } - 72 -> {74}; + 43 -> {45}; + 45 -> {46}; + 46 -> {47}; + 47 -> {48 49}; + 48 -> {50}; + 49 -> {52 53}; + 50 -> {51}; + 51 -> {49}; + 52 -> {54}; + 53 -> {57 58}; + 54 -> {55}; + 55 -> {56}; + 56 -> {53}; + 57 -> {59}; + 58 -> {62}; + 59 -> {60 65}; + 60 -> {61}; + 61 -> {58}; + 62 -> {63}; + 63 -> {64}; + 64 -> {44}; + 65 -> {67}; + 67 -> {68}; + 68 -> {69}; + 69 -> {70}; + 70 -> {66}; + + subgraph cluster_16 { + color=red + 71 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_17 { + color=blue + 73 [label="Enter block"]; + 74 [label="Access variable R|/x|"]; + 75 [label="Enter safe call"]; + 77 [label="Function call: $subj$.R|/A.id|()"]; + 76 [label="Exit safe call"]; + 78 [label="Enter safe call"]; + 80 [label="Function call: $subj$.R|/A.bool|()"]; + 79 [label="Exit safe call"]; + 81 [label="Access variable R|/x|"]; + 82 [label="Function call: R|/x|.#()"]; + 83 [label="Exit block"]; + } + 72 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 71 -> {73}; + 73 -> {74}; 74 -> {75 76}; 75 -> {77}; - 76 -> {82 83}; - 77 -> {89}; - 77 -> {78} [color=red]; - 78 -> {79} [color=green]; - 79 -> {73 81} [style=dotted]; - 80 -> {79} [style=dotted]; - 81 -> {76} [style=dotted]; - 82 -> {84}; - 83 -> {87}; - 84 -> {85}; - 85 -> {86}; - 86 -> {83}; - 87 -> {88}; - 88 -> {73} [style=dotted]; - 89 -> {91}; - 90 -> {80} [style=dotted]; - 90 -> {78} [color=green]; - 91 -> {73}; - 91 -> {92} [style=dotted]; - 92 -> {90} [style=dotted]; + 76 -> {78 79}; + 77 -> {76}; + 78 -> {80}; + 79 -> {81}; + 80 -> {79}; + 81 -> {82}; + 82 -> {83}; + 83 -> {72}; + + subgraph cluster_18 { + color=red + 84 [label="Enter function boo" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 86 [label="Enter block"]; + 87 [label="Exit block"]; + } + 85 [label="Exit function boo" style="filled" fillcolor=red]; + } + 84 -> {86}; + 86 -> {87}; + 87 -> {85}; + + subgraph cluster_20 { + color=red + 88 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_21 { + color=blue + 90 [label="Enter block"]; + 91 [label="Access variable R|/x|"]; + 92 [label="Enter safe call"]; + 94 [label="Postponed enter to lambda"]; + subgraph cluster_22 { + color=blue + 107 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_23 { + color=blue + 109 [label="Enter block"]; + 110 [label="Jump: ^test_5 Unit"]; + 111 [label="Stub" style="filled" fillcolor=gray]; + 112 [label="Exit block" style="filled" fillcolor=gray]; + } + 108 [label="Exit function anonymousFunction" style="filled" fillcolor=red style="filled" fillcolor=gray]; + } + 97 [label="Call arguments union" style="filled" fillcolor=gray]; + 95 [label="Postponed exit from lambda" style="filled" fillcolor=gray]; + 96 [label="Function call: $subj$.R|kotlin/let|(...)" style="filled" fillcolor=gray]; + 98 [label="Stub" style="filled" fillcolor=gray]; + 93 [label="Exit safe call"]; + 99 [label="Enter safe call"]; + 101 [label="Access variable R|/x|"]; + 102 [label="Function call: R|/x|.R|/A.bool|()"]; + 103 [label="Function call: $subj$.R|/boo|(...)"]; + 100 [label="Exit safe call"]; + 104 [label="Access variable R|/x|"]; + 105 [label="Function call: R|/x|.#()"]; + 106 [label="Exit block"]; + } + 89 [label="Exit function test_5" style="filled" fillcolor=red]; + } + 88 -> {90}; + 90 -> {91}; + 91 -> {92 93}; + 92 -> {94}; + 93 -> {99 100}; + 94 -> {107}; + 94 -> {95} [color=red]; + 95 -> {96} [style=dotted]; + 96 -> {89 98} [style=dotted]; + 97 -> {96} [style=dotted]; + 98 -> {93} [style=dotted]; + 99 -> {101}; + 100 -> {104}; + 101 -> {102}; + 102 -> {103}; + 103 -> {100}; + 104 -> {105}; + 105 -> {106}; + 106 -> {89}; + 107 -> {109}; + 108 -> {95 97} [style=dotted]; + 109 -> {110}; + 110 -> {89}; + 110 -> {111} [style=dotted]; + 111 -> {112} [style=dotted]; + 112 -> {108} [style=dotted]; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.kt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.kt index 63ce62935cc..51413298fbf 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.kt +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.kt @@ -30,7 +30,7 @@ fun test_4(x: A?) { x.id() } -fun Any?.boo(b: Boolean) +fun Any?.boo(b: Boolean) {} fun test_5(x: A?) { x?.let { return }?.boo(x.bool()) diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.txt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.txt index c2cd2d924c1..0882d3231a6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.txt +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/safeCalls/safeCalls.txt @@ -30,7 +30,8 @@ FILE: safeCalls.kt R|/x|?.{ $subj$.R|/A.id|() }?.{ $subj$.R|/A.bool|() } R|/x|.#() } - public final fun R|kotlin/Any?|.boo(b: R|kotlin/Boolean|): R|kotlin/Unit| + public final fun R|kotlin/Any?|.boo(b: R|kotlin/Boolean|): R|kotlin/Unit| { + } public final fun test_5(x: R|A?|): R|kotlin/Unit| { R|/x|?.{ $subj$.R|kotlin/let|( = let@fun (it: R|A|): R|kotlin/Nothing| { ^test_5 Unit diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot index 57f380d2d53..4e6841f3bb2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartCastInInit.dot @@ -5,10 +5,10 @@ digraph smartCastInInit_kt { subgraph cluster_0 { color=red - 0 [label="Enter class I" style="filled" fillcolor=red]; - 1 [label="Exit class I" style="filled" fillcolor=red]; + 1 [label="Enter class I" style="filled" fillcolor=red]; + 0 [label="Exit class I" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; + 1 -> {0} [color=green]; subgraph cluster_1 { color=red @@ -19,49 +19,53 @@ digraph smartCastInInit_kt { subgraph cluster_2 { color=red - 4 [label="Enter class S" style="filled" fillcolor=red]; - 5 [label="Exit class S" style="filled" fillcolor=red]; + 5 [label="Enter class S" style="filled" fillcolor=red]; + 4 [label="Exit class S" style="filled" fillcolor=red]; } - 4 -> {5} [color=green]; + 5 -> {4} [color=green]; subgraph cluster_3 { color=red 6 [label="Enter function s" style="filled" fillcolor=red]; - 8 [label="Function call: R|kotlin/TODO|()"]; - 9 [label="Stub" style="filled" fillcolor=gray]; - 10 [label="Jump: ^s R|kotlin/TODO|()" style="filled" fillcolor=gray]; - 11 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_4 { + color=blue + 8 [label="Enter block"]; + 9 [label="Function call: R|kotlin/TODO|()"]; + 10 [label="Stub" style="filled" fillcolor=gray]; + 11 [label="Jump: ^s R|kotlin/TODO|()" style="filled" fillcolor=gray]; + 12 [label="Stub" style="filled" fillcolor=gray]; + 13 [label="Exit block" style="filled" fillcolor=gray]; + } 7 [label="Exit function s" style="filled" fillcolor=red]; } 6 -> {8}; - 8 -> {7}; - 8 -> {9} [style=dotted]; + 8 -> {9}; + 9 -> {7}; 9 -> {10} [style=dotted]; - 10 -> {7 11} [style=dotted]; - 11 -> {7} [style=dotted]; - - subgraph cluster_4 { - color=red - 12 [label="Enter function " style="filled" fillcolor=red]; - 14 [label="Delegated constructor call: super()"]; - 13 [label="Exit function " style="filled" fillcolor=red]; - } - 12 -> {14}; - 14 -> {13}; + 10 -> {11} [style=dotted]; + 11 -> {7 12} [style=dotted]; + 12 -> {13} [style=dotted]; + 13 -> {7} [style=dotted]; subgraph cluster_5 { color=red - 27 [label="Enter class Main" style="filled" fillcolor=red]; - subgraph cluster_6 { - color=blue - 15 [label="Enter function getter" style="filled" fillcolor=red]; - 16 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_7 { - color=blue - 17 [label="Enter property" style="filled" fillcolor=red]; - 18 [label="Exit property" style="filled" fillcolor=red]; - } + 14 [label="Enter function " style="filled" fillcolor=red]; + 16 [label="Delegated constructor call: super()"]; + 15 [label="Exit function " style="filled" fillcolor=red]; + } + 14 -> {16}; + 16 -> {15}; + + subgraph cluster_6 { + color=red + 17 [label="Enter function getter" style="filled" fillcolor=red]; + 18 [label="Exit function getter" style="filled" fillcolor=red]; + } + 17 -> {18}; + + subgraph cluster_7 { + color=red + 28 [label="Enter class Main" style="filled" fillcolor=red]; subgraph cluster_8 { color=blue 19 [label="Enter init block" style="filled" fillcolor=red]; @@ -76,14 +80,11 @@ digraph smartCastInInit_kt { } 20 [label="Exit init block" style="filled" fillcolor=red]; } - 28 [label="Exit class Main" style="filled" fillcolor=red]; + 27 [label="Exit class Main" style="filled" fillcolor=red]; } - 27 -> {17} [color=green]; - 17 -> {18}; - 18 -> {19} [color=green]; - 15 -> {16}; + 28 -> {19} [color=green]; 19 -> {21}; - 20 -> {28} [color=green]; + 20 -> {27} [color=green]; 21 -> {22}; 22 -> {23}; 23 -> {24}; diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot index 70ef90466e8..75fea0a76f5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/smartcastToNothing.dot @@ -6,263 +6,302 @@ digraph smartcastToNothing_kt { subgraph cluster_0 { color=red 0 [label="Enter function getNothing" style="filled" fillcolor=red]; - 2 [label="Function call: R|java/lang/Exception.Exception|()"]; - 3 [label="Throw: throw R|java/lang/Exception.Exception|()"]; - 4 [label="Stub" style="filled" fillcolor=gray]; - 5 [label="Jump: ^getNothing throw R|java/lang/Exception.Exception|()" style="filled" fillcolor=gray]; - 6 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Function call: R|java/lang/Exception.Exception|()"]; + 4 [label="Throw: throw R|java/lang/Exception.Exception|()"]; + 5 [label="Stub" style="filled" fillcolor=gray]; + 6 [label="Jump: ^getNothing throw R|java/lang/Exception.Exception|()" style="filled" fillcolor=gray]; + 7 [label="Stub" style="filled" fillcolor=gray]; + 8 [label="Exit block" style="filled" fillcolor=gray]; + } 1 [label="Exit function getNothing" style="filled" fillcolor=red]; } 0 -> {2}; 2 -> {3}; - 3 -> {1}; - 3 -> {4} [style=dotted]; + 3 -> {4}; + 4 -> {1}; 4 -> {5} [style=dotted]; - 5 -> {1 6} [style=dotted]; - 6 -> {1} [style=dotted]; - - subgraph cluster_1 { - color=red - 7 [label="Enter function getNullableNothing" style="filled" fillcolor=red]; - 9 [label="Const: Null(null)"]; - 10 [label="Jump: ^getNullableNothing Null(null)"]; - 11 [label="Stub" style="filled" fillcolor=gray]; - 8 [label="Exit function getNullableNothing" style="filled" fillcolor=red]; - } - 7 -> {9}; - 9 -> {10}; - 10 -> {8}; - 10 -> {11} [style=dotted]; - 11 -> {8} [style=dotted]; + 5 -> {6} [style=dotted]; + 6 -> {1 7} [style=dotted]; + 7 -> {8} [style=dotted]; + 8 -> {1} [style=dotted]; subgraph cluster_2 { color=red - 17 [label="Enter property" style="filled" fillcolor=red]; + 9 [label="Enter function getNullableNothing" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 12 [label="Enter function getter" style="filled" fillcolor=red]; - 14 [label="Const: Int(1)"]; - 15 [label="Jump: ^ Int(1)"]; - 16 [label="Stub" style="filled" fillcolor=gray]; - 13 [label="Exit function getter" style="filled" fillcolor=red]; + 11 [label="Enter block"]; + 12 [label="Const: Null(null)"]; + 13 [label="Jump: ^getNullableNothing Null(null)"]; + 14 [label="Stub" style="filled" fillcolor=gray]; + 15 [label="Exit block" style="filled" fillcolor=gray]; } - 18 [label="Exit property" style="filled" fillcolor=red]; + 10 [label="Exit function getNullableNothing" style="filled" fillcolor=red]; } - 17 -> {18}; - 12 -> {14}; - 14 -> {15}; - 15 -> {13}; - 15 -> {16} [style=dotted]; - 16 -> {13} [style=dotted]; + 9 -> {11}; + 11 -> {12}; + 12 -> {13}; + 13 -> {10}; + 13 -> {14} [style=dotted]; + 14 -> {15} [style=dotted]; + 15 -> {10} [style=dotted]; subgraph cluster_4 { color=red - 24 [label="Enter property" style="filled" fillcolor=red]; + 16 [label="Enter function getter" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 19 [label="Enter function getter" style="filled" fillcolor=red]; - 21 [label="Const: Int(2)"]; - 22 [label="Jump: ^ Int(2)"]; - 23 [label="Stub" style="filled" fillcolor=gray]; - 20 [label="Exit function getter" style="filled" fillcolor=red]; + 18 [label="Enter block"]; + 19 [label="Const: Int(1)"]; + 20 [label="Jump: ^ Int(1)"]; + 21 [label="Stub" style="filled" fillcolor=gray]; + 22 [label="Exit block" style="filled" fillcolor=gray]; } - 25 [label="Exit property" style="filled" fillcolor=red]; + 17 [label="Exit function getter" style="filled" fillcolor=red]; } - 24 -> {25}; - 19 -> {21}; - 21 -> {22}; - 22 -> {20}; - 22 -> {23} [style=dotted]; - 23 -> {20} [style=dotted]; + 16 -> {18}; + 18 -> {19}; + 19 -> {20}; + 20 -> {17}; + 20 -> {21} [style=dotted]; + 21 -> {22} [style=dotted]; + 22 -> {17} [style=dotted]; subgraph cluster_6 { color=red - 26 [label="Enter function myListOf" style="filled" fillcolor=red]; - 28 [label="Const: Null(null)"]; - 29 [label="Check not null: Null(null)!!"]; - 30 [label="Jump: ^myListOf Null(null)!!"]; - 31 [label="Stub" style="filled" fillcolor=gray]; - 27 [label="Exit function myListOf" style="filled" fillcolor=red]; + 23 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 25 [label="Enter block"]; + 26 [label="Const: Int(2)"]; + 27 [label="Jump: ^ Int(2)"]; + 28 [label="Stub" style="filled" fillcolor=gray]; + 29 [label="Exit block" style="filled" fillcolor=gray]; + } + 24 [label="Exit function getter" style="filled" fillcolor=red]; } - 26 -> {28}; - 28 -> {29}; - 29 -> {30}; - 30 -> {27}; - 30 -> {31} [style=dotted]; - 31 -> {27} [style=dotted]; - - subgraph cluster_7 { - color=red - 32 [label="Enter function " style="filled" fillcolor=red]; - 34 [label="Delegated constructor call: super()"]; - 33 [label="Exit function " style="filled" fillcolor=red]; - } - 32 -> {34}; - 34 -> {33}; + 23 -> {25}; + 25 -> {26}; + 26 -> {27}; + 27 -> {24}; + 27 -> {28} [style=dotted]; + 28 -> {29} [style=dotted]; + 29 -> {24} [style=dotted]; subgraph cluster_8 { color=red - 45 [label="Enter class A" style="filled" fillcolor=red]; + 30 [label="Enter function myListOf" style="filled" fillcolor=red]; subgraph cluster_9 { color=blue - 40 [label="Enter function getter" style="filled" fillcolor=red]; - 41 [label="Exit function getter" style="filled" fillcolor=red]; + 32 [label="Enter block"]; + 33 [label="Const: Null(null)"]; + 34 [label="Check not null: Null(null)!!"]; + 35 [label="Jump: ^myListOf Null(null)!!"]; + 36 [label="Stub" style="filled" fillcolor=gray]; + 37 [label="Exit block" style="filled" fillcolor=gray]; } - subgraph cluster_10 { - color=blue - 35 [label="Enter function getter" style="filled" fillcolor=red]; - 36 [label="Exit function getter" style="filled" fillcolor=red]; - } - subgraph cluster_11 { - color=blue - 37 [label="Enter property" style="filled" fillcolor=red]; - 39 [label="Const: Int(1)"]; - 38 [label="Exit property" style="filled" fillcolor=red]; - } - subgraph cluster_12 { - color=blue - 42 [label="Enter property" style="filled" fillcolor=red]; - 44 [label="Const: Boolean(true)"]; - 43 [label="Exit property" style="filled" fillcolor=red]; - } - 46 [label="Exit class A" style="filled" fillcolor=red]; + 31 [label="Exit function myListOf" style="filled" fillcolor=red]; } - 45 -> {37} [color=green]; - 37 -> {39}; - 38 -> {42} [color=green]; - 39 -> {38}; - 35 -> {36}; - 42 -> {44}; - 43 -> {46} [color=green]; - 44 -> {43}; - 40 -> {41}; + 30 -> {32}; + 32 -> {33}; + 33 -> {34}; + 34 -> {35}; + 35 -> {31}; + 35 -> {36} [style=dotted]; + 36 -> {37} [style=dotted]; + 37 -> {31} [style=dotted]; + + subgraph cluster_10 { + color=red + 38 [label="Enter function " style="filled" fillcolor=red]; + 40 [label="Delegated constructor call: super()"]; + 39 [label="Exit function " style="filled" fillcolor=red]; + } + 38 -> {40}; + 40 -> {39}; + + subgraph cluster_11 { + color=red + 41 [label="Enter function getter" style="filled" fillcolor=red]; + 42 [label="Exit function getter" style="filled" fillcolor=red]; + } + 41 -> {42}; + + subgraph cluster_12 { + color=red + 46 [label="Enter function getter" style="filled" fillcolor=red]; + 47 [label="Exit function getter" style="filled" fillcolor=red]; + } + 46 -> {47}; subgraph cluster_13 { color=red - 47 [label="Enter function test_0" style="filled" fillcolor=red]; - 49 [label="Const: Null(null)"]; - 50 [label="Variable declaration: lvar s: R|A?|"]; - 51 [label="Access variable R|/results|"]; - 52 [label="Function call: R|/results|.R|FakeOverride|>|()"]; - 53 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + 52 [label="Enter class A" style="filled" fillcolor=red]; subgraph cluster_14 { color=blue - 54 [label="Enter while loop"]; - subgraph cluster_15 { - color=blue - 56 [label="Enter loop condition"]; - 57 [label="Access variable R|/|"]; - 58 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; - 59 [label="Exit loop condition"]; - } - subgraph cluster_16 { - color=blue - 60 [label="Enter loop block"]; - subgraph cluster_17 { - color=blue - 61 [label="Enter block"]; - 62 [label="Access variable R|/|"]; - 63 [label="Function call: R|/|.R|FakeOverride|()"]; - 64 [label="Stub" style="filled" fillcolor=gray]; - 65 [label="Variable declaration: lval result: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 66 [label="Access variable R|/result|" style="filled" fillcolor=gray]; - 67 [label="Stub" style="filled" fillcolor=gray]; - 68 [label="Assignment: R|/s|" style="filled" fillcolor=gray]; - subgraph cluster_18 { - color=blue - 69 [label="Enter when" style="filled" fillcolor=gray]; - subgraph cluster_19 { - color=blue - 71 [label="Enter when branch condition " style="filled" fillcolor=gray]; - 72 [label="Access variable R|/result|" style="filled" fillcolor=gray]; - 73 [label="Stub" style="filled" fillcolor=gray]; - 74 [label="Access variable #" style="filled" fillcolor=gray]; - 75 [label="Exit when branch condition" style="filled" fillcolor=gray]; - } - 82 [label="Synthetic else branch" style="filled" fillcolor=gray]; - 76 [label="Enter when branch result" style="filled" fillcolor=gray]; - subgraph cluster_20 { - color=blue - 77 [label="Enter block" style="filled" fillcolor=gray]; - 78 [label="Jump: break@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] " style="filled" fillcolor=gray]; - 79 [label="Stub" style="filled" fillcolor=gray]; - 80 [label="Exit block" style="filled" fillcolor=gray]; - } - 81 [label="Exit when branch result" style="filled" fillcolor=gray]; - 70 [label="Exit when" style="filled" fillcolor=gray]; - } - 83 [label="Exit block" style="filled" fillcolor=gray]; - } - 84 [label="Exit loop block" style="filled" fillcolor=gray]; - } - 55 [label="Exit whileloop"]; + 43 [label="Enter property" style="filled" fillcolor=red]; + 45 [label="Const: Int(1)"]; + 44 [label="Exit property" style="filled" fillcolor=red]; } - 85 [label="Access variable R|/s|"]; - 86 [label="Enter safe call"]; - 88 [label="Postponed enter to lambda"]; - subgraph cluster_21 { + subgraph cluster_15 { color=blue - 92 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 94 [label="Access variable R|/it|"]; - 95 [label="Access variable R|/A.a|"]; - 93 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 48 [label="Enter property" style="filled" fillcolor=red]; + 50 [label="Const: Boolean(true)"]; + 49 [label="Exit property" style="filled" fillcolor=red]; } - 91 [label="Call arguments union" style="filled" fillcolor=yellow]; - 89 [label="Postponed exit from lambda"]; - 90 [label="Function call: $subj$.R|kotlin/let|(...)"]; - 87 [label="Exit safe call"]; - 48 [label="Exit function test_0" style="filled" fillcolor=red]; + 51 [label="Exit class A" style="filled" fillcolor=red]; } - 47 -> {49}; - 49 -> {50}; - 50 -> {51}; - 51 -> {52}; - 52 -> {53}; - 53 -> {54}; - 54 -> {56}; - 55 -> {85}; + 52 -> {43} [color=green]; + 43 -> {45}; + 44 -> {48} [color=green]; + 45 -> {44}; + 48 -> {50}; + 49 -> {51} [color=green]; + 50 -> {49}; + + subgraph cluster_16 { + color=red + 53 [label="Enter function test_0" style="filled" fillcolor=red]; + subgraph cluster_17 { + color=blue + 55 [label="Enter block"]; + 56 [label="Const: Null(null)"]; + 57 [label="Variable declaration: lvar s: R|A?|"]; + 58 [label="Access variable R|/results|"]; + 59 [label="Function call: R|/results|.R|FakeOverride|>|()"]; + 60 [label="Variable declaration: lval : R|kotlin/collections/Iterator|"]; + subgraph cluster_18 { + color=blue + 61 [label="Enter while loop"]; + subgraph cluster_19 { + color=blue + 63 [label="Enter loop condition"]; + 64 [label="Access variable R|/|"]; + 65 [label="Function call: R|/|.R|kotlin/collections/Iterator.hasNext|()"]; + 66 [label="Exit loop condition"]; + } + subgraph cluster_20 { + color=blue + 67 [label="Enter loop block"]; + subgraph cluster_21 { + color=blue + 68 [label="Enter block"]; + 69 [label="Access variable R|/|"]; + 70 [label="Function call: R|/|.R|FakeOverride|()"]; + 71 [label="Stub" style="filled" fillcolor=gray]; + 72 [label="Variable declaration: lval result: R|kotlin/Nothing|" style="filled" fillcolor=gray]; + 73 [label="Access variable R|/result|" style="filled" fillcolor=gray]; + 74 [label="Stub" style="filled" fillcolor=gray]; + 75 [label="Assignment: R|/s|" style="filled" fillcolor=gray]; + subgraph cluster_22 { + color=blue + 76 [label="Enter when" style="filled" fillcolor=gray]; + subgraph cluster_23 { + color=blue + 78 [label="Enter when branch condition " style="filled" fillcolor=gray]; + 79 [label="Access variable R|/result|" style="filled" fillcolor=gray]; + 80 [label="Stub" style="filled" fillcolor=gray]; + 81 [label="Access variable #" style="filled" fillcolor=gray]; + 82 [label="Exit when branch condition" style="filled" fillcolor=gray]; + } + 89 [label="Synthetic else branch" style="filled" fillcolor=gray]; + 83 [label="Enter when branch result" style="filled" fillcolor=gray]; + subgraph cluster_24 { + color=blue + 84 [label="Enter block" style="filled" fillcolor=gray]; + 85 [label="Jump: break@@@[R|/|.R|kotlin/collections/Iterator.hasNext|()] " style="filled" fillcolor=gray]; + 86 [label="Stub" style="filled" fillcolor=gray]; + 87 [label="Exit block" style="filled" fillcolor=gray]; + } + 88 [label="Exit when branch result" style="filled" fillcolor=gray]; + 77 [label="Exit when" style="filled" fillcolor=gray]; + } + 90 [label="Exit block" style="filled" fillcolor=gray]; + } + 91 [label="Exit loop block" style="filled" fillcolor=gray]; + } + 62 [label="Exit whileloop"]; + } + 92 [label="Access variable R|/s|"]; + 93 [label="Enter safe call"]; + 95 [label="Postponed enter to lambda"]; + subgraph cluster_25 { + color=blue + 100 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_26 { + color=blue + 102 [label="Enter block"]; + 103 [label="Access variable R|/it|"]; + 104 [label="Access variable R|/A.a|"]; + 105 [label="Exit block"]; + } + 101 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 98 [label="Call arguments union" style="filled" fillcolor=yellow]; + 96 [label="Postponed exit from lambda"]; + 97 [label="Function call: $subj$.R|kotlin/let|(...)"]; + 94 [label="Exit safe call"]; + 99 [label="Exit block"]; + } + 54 [label="Exit function test_0" style="filled" fillcolor=red]; + } + 53 -> {55}; + 55 -> {56}; 56 -> {57}; 57 -> {58}; 58 -> {59}; - 59 -> {55 60}; + 59 -> {60}; 60 -> {61}; - 61 -> {62}; - 62 -> {63}; - 63 -> {48}; - 63 -> {64} [style=dotted]; - 64 -> {65} [style=dotted]; - 65 -> {66} [style=dotted]; - 66 -> {48 67} [style=dotted]; - 67 -> {68} [style=dotted]; - 68 -> {69} [style=dotted]; - 69 -> {71} [style=dotted]; - 70 -> {83} [style=dotted]; + 61 -> {63}; + 62 -> {92}; + 63 -> {64}; + 64 -> {65}; + 65 -> {66}; + 66 -> {62 67}; + 67 -> {68}; + 68 -> {69}; + 69 -> {70}; + 70 -> {54}; + 70 -> {71} [style=dotted]; 71 -> {72} [style=dotted]; - 72 -> {48 73} [style=dotted]; - 73 -> {74} [style=dotted]; + 72 -> {73} [style=dotted]; + 73 -> {54 74} [style=dotted]; 74 -> {75} [style=dotted]; - 75 -> {76 82} [style=dotted]; - 76 -> {77} [style=dotted]; - 77 -> {78} [style=dotted]; - 78 -> {55 79} [style=dotted]; - 79 -> {80} [style=dotted]; + 75 -> {76} [style=dotted]; + 76 -> {78} [style=dotted]; + 77 -> {90} [style=dotted]; + 78 -> {79} [style=dotted]; + 79 -> {54 80} [style=dotted]; 80 -> {81} [style=dotted]; - 81 -> {70} [style=dotted]; - 82 -> {70} [style=dotted]; + 81 -> {82} [style=dotted]; + 82 -> {83 89} [style=dotted]; 83 -> {84} [style=dotted]; - 84 -> {56} [color=green style=dotted]; - 85 -> {86 87}; - 86 -> {88}; - 87 -> {48} [style=dotted]; - 88 -> {92}; - 88 -> {89} [color=red]; - 89 -> {90} [color=green]; - 90 -> {87}; - 91 -> {90} [color=red]; - 92 -> {94}; - 93 -> {89} [color=green]; - 93 -> {91} [color=red]; - 94 -> {95}; - 95 -> {93}; + 84 -> {85} [style=dotted]; + 85 -> {62 86} [style=dotted]; + 86 -> {87} [style=dotted]; + 87 -> {88} [style=dotted]; + 88 -> {77} [style=dotted]; + 89 -> {77} [style=dotted]; + 90 -> {91} [style=dotted]; + 91 -> {63} [color=green style=dotted]; + 92 -> {93 94}; + 93 -> {95}; + 94 -> {99}; + 95 -> {100}; + 95 -> {96} [color=red]; + 96 -> {97} [color=green]; + 97 -> {94}; + 98 -> {97} [color=red]; + 99 -> {54}; + 100 -> {102}; + 101 -> {96} [color=green]; + 101 -> {98} [color=red]; + 102 -> {103}; + 103 -> {104}; + 104 -> {105}; + 105 -> {101}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot index 0053111dbf6..3be6af084c9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/stability/overridenOpenVal.dot @@ -14,25 +14,26 @@ digraph overridenOpenVal_kt { subgraph cluster_1 { color=red - 8 [label="Enter class A" style="filled" fillcolor=red]; - subgraph cluster_2 { - color=blue - 3 [label="Enter function getter" style="filled" fillcolor=red]; - 4 [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]; + } + 3 -> {4}; + + subgraph cluster_2 { + color=red + 9 [label="Enter class A" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue 5 [label="Enter property" style="filled" fillcolor=red]; 7 [label="Access variable R|/x|"]; 6 [label="Exit property" style="filled" fillcolor=red]; } - 9 [label="Exit class A" style="filled" fillcolor=red]; + 8 [label="Exit class A" style="filled" fillcolor=red]; } - 8 -> {5} [color=green]; + 9 -> {5} [color=green]; 5 -> {7}; - 6 -> {9} [color=green]; + 6 -> {8} [color=green]; 7 -> {6}; - 3 -> {4}; subgraph cluster_4 { color=red @@ -50,94 +51,108 @@ digraph overridenOpenVal_kt { 14 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_6 { color=blue - 16 [label="Enter when"]; + 16 [label="Enter block"]; subgraph cluster_7 { color=blue - 18 [label="Enter when branch condition "]; - 19 [label="Access variable R|/A.x|"]; - 20 [label="Type operator: (this@R|/B|.R|/A.x| is R|kotlin/String|)"]; - 21 [label="Exit when branch condition"]; + 17 [label="Enter when"]; + subgraph cluster_8 { + color=blue + 19 [label="Enter when branch condition "]; + 20 [label="Access variable R|/A.x|"]; + 21 [label="Type operator: (this@R|/B|.R|/A.x| is R|kotlin/String|)"]; + 22 [label="Exit when branch condition"]; + } + 29 [label="Synthetic else branch"]; + 23 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 24 [label="Enter block"]; + 25 [label="Access variable R|/A.x|"]; + 26 [label="Access variable R|kotlin/String.length|"]; + 27 [label="Exit block"]; + } + 28 [label="Exit when branch result"]; + 18 [label="Exit when"]; } - 28 [label="Synthetic else branch"]; - 22 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 23 [label="Enter block"]; - 24 [label="Access variable R|/A.x|"]; - 25 [label="Access variable R|kotlin/String.length|"]; - 26 [label="Exit block"]; - } - 27 [label="Exit when branch result"]; - 17 [label="Exit when"]; + 30 [label="Exit block"]; } 15 [label="Exit function test_1" style="filled" fillcolor=red]; } 14 -> {16}; - 16 -> {18}; - 17 -> {15}; - 18 -> {19}; + 16 -> {17}; + 17 -> {19}; + 18 -> {30}; 19 -> {20}; 20 -> {21}; - 21 -> {22 28}; - 22 -> {23}; + 21 -> {22}; + 22 -> {23 29}; 23 -> {24}; 24 -> {25}; 25 -> {26}; 26 -> {27}; - 27 -> {17}; - 28 -> {17}; - - subgraph cluster_9 { - color=red - 29 [label="Enter class B" style="filled" fillcolor=red]; - 30 [label="Exit class B" style="filled" fillcolor=red]; - } - 29 -> {30} [color=green]; + 27 -> {28}; + 28 -> {18}; + 29 -> {18}; + 30 -> {15}; subgraph cluster_10 { color=red - 31 [label="Enter function test_2" style="filled" fillcolor=red]; - subgraph cluster_11 { + 32 [label="Enter class B" style="filled" fillcolor=red]; + 31 [label="Exit class B" style="filled" fillcolor=red]; + } + 32 -> {31} [color=green]; + + subgraph cluster_11 { + color=red + 33 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_12 { color=blue - 33 [label="Enter when"]; - subgraph cluster_12 { - color=blue - 35 [label="Enter when branch condition "]; - 36 [label="Access variable R|/b|"]; - 37 [label="Access variable R|/A.x|"]; - 38 [label="Type operator: (R|/b|.R|/A.x| is R|kotlin/String|)"]; - 39 [label="Exit when branch condition"]; - } - 47 [label="Synthetic else branch"]; - 40 [label="Enter when branch result"]; + 35 [label="Enter block"]; subgraph cluster_13 { color=blue - 41 [label="Enter block"]; - 42 [label="Access variable R|/b|"]; - 43 [label="Access variable R|/A.x|"]; - 44 [label="Access variable R|kotlin/String.length|"]; - 45 [label="Exit block"]; + 36 [label="Enter when"]; + subgraph cluster_14 { + color=blue + 38 [label="Enter when branch condition "]; + 39 [label="Access variable R|/b|"]; + 40 [label="Access variable R|/A.x|"]; + 41 [label="Type operator: (R|/b|.R|/A.x| is R|kotlin/String|)"]; + 42 [label="Exit when branch condition"]; + } + 50 [label="Synthetic else branch"]; + 43 [label="Enter when branch result"]; + subgraph cluster_15 { + color=blue + 44 [label="Enter block"]; + 45 [label="Access variable R|/b|"]; + 46 [label="Access variable R|/A.x|"]; + 47 [label="Access variable R|kotlin/String.length|"]; + 48 [label="Exit block"]; + } + 49 [label="Exit when branch result"]; + 37 [label="Exit when"]; } - 46 [label="Exit when branch result"]; - 34 [label="Exit when"]; + 51 [label="Exit block"]; } - 32 [label="Exit function test_2" style="filled" fillcolor=red]; + 34 [label="Exit function test_2" style="filled" fillcolor=red]; } - 31 -> {33}; 33 -> {35}; - 34 -> {32}; 35 -> {36}; - 36 -> {37}; - 37 -> {38}; + 36 -> {38}; + 37 -> {51}; 38 -> {39}; - 39 -> {40 47}; + 39 -> {40}; 40 -> {41}; 41 -> {42}; - 42 -> {43}; + 42 -> {43 50}; 43 -> {44}; 44 -> {45}; 45 -> {46}; - 46 -> {34}; - 47 -> {34}; + 46 -> {47}; + 47 -> {48}; + 48 -> {49}; + 49 -> {37}; + 50 -> {37}; + 51 -> {34}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot index 7e729d50019..764f2dfd61f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/delayedAssignment.dot @@ -15,85 +15,99 @@ digraph delayedAssignment_kt { subgraph cluster_1 { color=red 3 [label="Enter function foo" style="filled" fillcolor=red]; + subgraph cluster_2 { + color=blue + 5 [label="Enter block"]; + 6 [label="Exit block"]; + } 4 [label="Exit function foo" style="filled" fillcolor=red]; } - 3 -> {4}; - - subgraph cluster_2 { - color=red - 5 [label="Enter class A" style="filled" fillcolor=red]; - 6 [label="Exit class A" style="filled" fillcolor=red]; - } - 5 -> {6} [color=green]; + 3 -> {5}; + 5 -> {6}; + 6 -> {4}; subgraph cluster_3 { color=red - 7 [label="Enter function test" style="filled" fillcolor=red]; - 9 [label="Variable declaration: lval a: R|A?|"]; - subgraph cluster_4 { + 8 [label="Enter class A" style="filled" fillcolor=red]; + 7 [label="Exit class A" style="filled" fillcolor=red]; + } + 8 -> {7} [color=green]; + + subgraph cluster_4 { + color=red + 9 [label="Enter function test" style="filled" fillcolor=red]; + subgraph cluster_5 { color=blue - 10 [label="Enter when"]; - subgraph cluster_5 { - color=blue - 12 [label="Enter when branch condition "]; - 13 [label="Access variable R|/b|"]; - 14 [label="Exit when branch condition"]; - } + 11 [label="Enter block"]; + 12 [label="Variable declaration: lval a: R|A?|"]; subgraph cluster_6 { color=blue - 23 [label="Enter when branch condition else"]; - 24 [label="Exit when branch condition"]; + 13 [label="Enter when"]; + subgraph cluster_7 { + color=blue + 15 [label="Enter when branch condition "]; + 16 [label="Access variable R|/b|"]; + 17 [label="Exit when branch condition"]; + } + subgraph cluster_8 { + color=blue + 26 [label="Enter when branch condition else"]; + 27 [label="Exit when branch condition"]; + } + 28 [label="Enter when branch result"]; + subgraph cluster_9 { + color=blue + 29 [label="Enter block"]; + 30 [label="Const: Null(null)"]; + 31 [label="Assignment: R|/a|"]; + 32 [label="Exit block"]; + } + 33 [label="Exit when branch result"]; + 18 [label="Enter when branch result"]; + subgraph cluster_10 { + color=blue + 19 [label="Enter block"]; + 20 [label="Function call: R|/A.A|()"]; + 21 [label="Assignment: R|/a|"]; + 22 [label="Access variable R|/a|"]; + 23 [label="Function call: R|/a|.R|/A.foo|()"]; + 24 [label="Exit block"]; + } + 25 [label="Exit when branch result"]; + 14 [label="Exit when"]; } - 25 [label="Enter when branch result"]; - subgraph cluster_7 { - color=blue - 26 [label="Enter block"]; - 27 [label="Const: Null(null)"]; - 28 [label="Assignment: R|/a|"]; - 29 [label="Exit block"]; - } - 30 [label="Exit when branch result"]; - 15 [label="Enter when branch result"]; - subgraph cluster_8 { - color=blue - 16 [label="Enter block"]; - 17 [label="Function call: R|/A.A|()"]; - 18 [label="Assignment: R|/a|"]; - 19 [label="Access variable R|/a|"]; - 20 [label="Function call: R|/a|.R|/A.foo|()"]; - 21 [label="Exit block"]; - } - 22 [label="Exit when branch result"]; - 11 [label="Exit when"]; + 34 [label="Access variable R|/a|"]; + 35 [label="Function call: R|/a|.#()"]; + 36 [label="Exit block"]; } - 31 [label="Access variable R|/a|"]; - 32 [label="Function call: R|/a|.#()"]; - 8 [label="Exit function test" style="filled" fillcolor=red]; + 10 [label="Exit function test" style="filled" fillcolor=red]; } - 7 -> {9}; - 9 -> {10}; - 10 -> {12}; - 11 -> {31}; + 9 -> {11}; + 11 -> {12}; 12 -> {13}; - 13 -> {14}; - 14 -> {15 23}; + 13 -> {15}; + 14 -> {34}; 15 -> {16}; 16 -> {17}; - 17 -> {18}; + 17 -> {18 26}; 18 -> {19}; 19 -> {20}; 20 -> {21}; 21 -> {22}; - 22 -> {11}; + 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {26}; + 25 -> {14}; 26 -> {27}; 27 -> {28}; 28 -> {29}; 29 -> {30}; - 30 -> {11}; + 30 -> {31}; 31 -> {32}; - 32 -> {8}; + 32 -> {33}; + 33 -> {14}; + 34 -> {35}; + 35 -> {36}; + 36 -> {10}; } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/smartcastAfterReassignment.dot b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/smartcastAfterReassignment.dot index 260a281febe..0da594290e9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/smartcastAfterReassignment.dot +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/variables/smartcastAfterReassignment.dot @@ -6,12 +6,17 @@ digraph smartcastAfterReassignment_kt { subgraph cluster_0 { color=red 0 [label="Enter function test_1" style="filled" fillcolor=red]; - 2 [label="Const: Int(1)"]; - 3 [label="Variable declaration: lvar x: R|kotlin/Any|"]; - 4 [label="Const: String()"]; - 5 [label="Assignment: R|/x|"]; - 6 [label="Access variable R|/x|"]; - 7 [label="Access variable R|kotlin/String.length|"]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Const: Int(1)"]; + 4 [label="Variable declaration: lvar x: R|kotlin/Any|"]; + 5 [label="Const: String()"]; + 6 [label="Assignment: R|/x|"]; + 7 [label="Access variable R|/x|"]; + 8 [label="Access variable R|kotlin/String.length|"]; + 9 [label="Exit block"]; + } 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; @@ -20,85 +25,101 @@ digraph smartcastAfterReassignment_kt { 4 -> {5}; 5 -> {6}; 6 -> {7}; - 7 -> {1}; + 7 -> {8}; + 8 -> {9}; + 9 -> {1}; - subgraph cluster_1 { + subgraph cluster_2 { color=red - 8 [label="Enter function test_2" style="filled" fillcolor=red]; - 10 [label="Const: Null(null)"]; - 11 [label="Variable declaration: lvar x: R|kotlin/String?|"]; - subgraph cluster_2 { + 10 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_3 { color=blue - 12 [label="Enter when"]; - subgraph cluster_3 { - color=blue - 14 [label="Enter when branch condition "]; - 15 [label="Access variable R|/x|"]; - 16 [label="Const: Null(null)"]; - 17 [label="Operator =="]; - 18 [label="Exit when branch condition"]; - } - 25 [label="Synthetic else branch"]; - 19 [label="Enter when branch result"]; + 12 [label="Enter block"]; + 13 [label="Const: Null(null)"]; + 14 [label="Variable declaration: lvar x: R|kotlin/String?|"]; subgraph cluster_4 { color=blue - 20 [label="Enter block"]; - 21 [label="Const: String()"]; - 22 [label="Assignment: R|/x|"]; - 23 [label="Exit block"]; + 15 [label="Enter when"]; + subgraph cluster_5 { + color=blue + 17 [label="Enter when branch condition "]; + 18 [label="Access variable R|/x|"]; + 19 [label="Const: Null(null)"]; + 20 [label="Operator =="]; + 21 [label="Exit when branch condition"]; + } + 28 [label="Synthetic else branch"]; + 22 [label="Enter when branch result"]; + subgraph cluster_6 { + color=blue + 23 [label="Enter block"]; + 24 [label="Const: String()"]; + 25 [label="Assignment: R|/x|"]; + 26 [label="Exit block"]; + } + 27 [label="Exit when branch result"]; + 16 [label="Exit when"]; } - 24 [label="Exit when branch result"]; - 13 [label="Exit when"]; + 29 [label="Access variable R|/x|"]; + 30 [label="Access variable R|kotlin/String.length|"]; + 31 [label="Exit block"]; } - 26 [label="Access variable R|/x|"]; - 27 [label="Access variable R|kotlin/String.length|"]; - 9 [label="Exit function test_2" style="filled" fillcolor=red]; + 11 [label="Exit function test_2" style="filled" fillcolor=red]; } - 8 -> {10}; - 10 -> {11}; - 11 -> {12}; - 12 -> {14}; - 13 -> {26}; + 10 -> {12}; + 12 -> {13}; + 13 -> {14}; 14 -> {15}; - 15 -> {16}; - 16 -> {17}; + 15 -> {17}; + 16 -> {29}; 17 -> {18}; - 18 -> {19 25}; + 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {22}; + 21 -> {22 28}; 22 -> {23}; 23 -> {24}; - 24 -> {13}; - 25 -> {13}; + 24 -> {25}; + 25 -> {26}; 26 -> {27}; - 27 -> {9}; - - subgraph cluster_5 { - color=red - 28 [label="Enter function test_3" style="filled" fillcolor=red]; - 30 [label="Const: Null(null)"]; - 31 [label="Variable declaration: lvar x: R|kotlin/String?|"]; - 32 [label="Const: String()"]; - 33 [label="Assignment: R|/x|"]; - 34 [label="Access variable R|/x|"]; - 35 [label="Access variable R|kotlin/String.length|"]; - 36 [label="Const: Null(null)"]; - 37 [label="Assignment: R|/x|"]; - 38 [label="Access variable R|/x|"]; - 39 [label="Access variable #"]; - 29 [label="Exit function test_3" style="filled" fillcolor=red]; - } - 28 -> {30}; + 27 -> {16}; + 28 -> {16}; + 29 -> {30}; 30 -> {31}; - 31 -> {32}; - 32 -> {33}; - 33 -> {34}; + 31 -> {11}; + + subgraph cluster_7 { + color=red + 32 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_8 { + color=blue + 34 [label="Enter block"]; + 35 [label="Const: Null(null)"]; + 36 [label="Variable declaration: lvar x: R|kotlin/String?|"]; + 37 [label="Const: String()"]; + 38 [label="Assignment: R|/x|"]; + 39 [label="Access variable R|/x|"]; + 40 [label="Access variable R|kotlin/String.length|"]; + 41 [label="Const: Null(null)"]; + 42 [label="Assignment: R|/x|"]; + 43 [label="Access variable R|/x|"]; + 44 [label="Access variable #"]; + 45 [label="Exit block"]; + } + 33 [label="Exit function test_3" style="filled" fillcolor=red]; + } + 32 -> {34}; 34 -> {35}; 35 -> {36}; 36 -> {37}; 37 -> {38}; 38 -> {39}; - 39 -> {29}; + 39 -> {40}; + 40 -> {41}; + 41 -> {42}; + 42 -> {43}; + 43 -> {44}; + 44 -> {45}; + 45 -> {33}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/complexPostponedCfg.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/complexPostponedCfg.dot index a631ade1f72..4d0ac5c03b7 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/complexPostponedCfg.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/complexPostponedCfg.dot @@ -5,111 +5,139 @@ digraph complexPostponedCfg_kt { subgraph cluster_0 { color=red - 0 [label="Enter class FirBase" style="filled" fillcolor=red]; - 1 [label="Exit class FirBase" style="filled" fillcolor=red]; + 1 [label="Enter class FirBase" style="filled" fillcolor=red]; + 0 [label="Exit class FirBase" style="filled" fillcolor=red]; } - 0 -> {1} [color=green]; + 1 -> {0} [color=green]; subgraph cluster_1 { color=red - 2 [label="Enter class FirFunctionCall" style="filled" fillcolor=red]; - 3 [label="Exit class FirFunctionCall" style="filled" fillcolor=red]; + 3 [label="Enter class FirFunctionCall" style="filled" fillcolor=red]; + 2 [label="Exit class FirFunctionCall" style="filled" fillcolor=red]; } - 2 -> {3} [color=green]; + 3 -> {2} [color=green]; subgraph cluster_2 { color=red 4 [label="Enter function foo" style="filled" fillcolor=red]; - 6 [label="Access variable R|/statements|"]; - 7 [label="Function call: R|/statements|.R|kotlin/collections/last|()"]; - 8 [label="Type operator: (R|/statements|.R|kotlin/collections/last|() as R|FirFunctionCall|)"]; - 9 [label="Postponed enter to lambda"]; subgraph cluster_3 { color=blue - 19 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 21 [label="Postponed enter to lambda"]; + 6 [label="Enter block"]; + 7 [label="Access variable R|/statements|"]; + 8 [label="Function call: R|/statements|.R|kotlin/collections/last|()"]; + 9 [label="Type operator: (R|/statements|.R|kotlin/collections/last|() as R|FirFunctionCall|)"]; + 10 [label="Postponed enter to lambda"]; subgraph cluster_4 { color=blue - 24 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 26 [label="Access variable this@R|special/anonymous|"]; - 27 [label="Function call: this@R|special/anonymous|.R|FakeOverride|(...)"]; - 28 [label="Access variable R|/arguments|"]; - 29 [label="Function call: R|/arguments|.R|kotlin/collections/last|()"]; - 30 [label="Type operator: (R|/arguments|.R|kotlin/collections/last|() as R|FirFunctionCall|)"]; - 31 [label="Postponed enter to lambda"]; + 21 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 35 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 37 [label="Access variable this@R|special/anonymous|"]; - 38 [label="Function call: this@R|special/anonymous|.R|FakeOverride|(...)"]; - 39 [label="Access variable R|/explicitReceiver|"]; - 40 [label="Type operator: (R|/explicitReceiver| as R|FirFunctionCall|)"]; - 41 [label="Function call: this@R|special/anonymous|.R|FakeOverride|(...)"]; - 36 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 23 [label="Enter block"]; + 24 [label="Postponed enter to lambda"]; + subgraph cluster_6 { + color=blue + 28 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 30 [label="Enter block"]; + 31 [label="Access variable this@R|special/anonymous|"]; + 32 [label="Function call: this@R|special/anonymous|.R|FakeOverride|(...)"]; + 33 [label="Access variable R|/arguments|"]; + 34 [label="Function call: R|/arguments|.R|kotlin/collections/last|()"]; + 35 [label="Type operator: (R|/arguments|.R|kotlin/collections/last|() as R|FirFunctionCall|)"]; + 36 [label="Postponed enter to lambda"]; + subgraph cluster_8 { + color=blue + 41 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 43 [label="Enter block"]; + 44 [label="Access variable this@R|special/anonymous|"]; + 45 [label="Function call: this@R|special/anonymous|.R|FakeOverride|(...)"]; + 46 [label="Access variable R|/explicitReceiver|"]; + 47 [label="Type operator: (R|/explicitReceiver| as R|FirFunctionCall|)"]; + 48 [label="Function call: this@R|special/anonymous|.R|FakeOverride|(...)"]; + 49 [label="Exit block"]; + } + 42 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 39 [label="Call arguments union" style="filled" fillcolor=yellow]; + 37 [label="Postponed exit from lambda"]; + 38 [label="Function call: R|kotlin/with|(...)"]; + 40 [label="Exit block"]; + } + 29 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 25 [label="Postponed exit from lambda"]; + 26 [label="Function call: R|kotlin/collections/buildList|(...)"]; + 27 [label="Exit block"]; } - 34 [label="Call arguments union" style="filled" fillcolor=yellow]; - 32 [label="Postponed exit from lambda"]; - 33 [label="Function call: R|kotlin/with|(...)"]; - 25 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 22 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; } - 22 [label="Postponed exit from lambda"]; - 23 [label="Function call: R|kotlin/collections/buildList|(...)"]; - 20 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 13 [label="Call arguments union" style="filled" fillcolor=yellow]; + 11 [label="Postponed exit from lambda"]; + 12 [label="Function call: R|kotlin/with|(...)"]; + 14 [label="Stub" style="filled" fillcolor=gray]; + 15 [label="Variable declaration: lval firstCalls: R|kotlin/Nothing|" style="filled" fillcolor=gray]; + 16 [label="Access variable R|/firstCalls|" style="filled" fillcolor=gray]; + 17 [label="Stub" style="filled" fillcolor=gray]; + 18 [label="Jump: ^foo R|/firstCalls|" style="filled" fillcolor=gray]; + 19 [label="Stub" style="filled" fillcolor=gray]; + 20 [label="Exit block" style="filled" fillcolor=gray]; } - 12 [label="Call arguments union" style="filled" fillcolor=yellow]; - 10 [label="Postponed exit from lambda"]; - 11 [label="Function call: R|kotlin/with|(...)"]; - 13 [label="Stub" style="filled" fillcolor=gray]; - 14 [label="Variable declaration: lval firstCalls: R|kotlin/Nothing|" style="filled" fillcolor=gray]; - 15 [label="Access variable R|/firstCalls|" style="filled" fillcolor=gray]; - 16 [label="Stub" style="filled" fillcolor=gray]; - 17 [label="Jump: ^foo R|/firstCalls|" style="filled" fillcolor=gray]; - 18 [label="Stub" style="filled" fillcolor=gray]; 5 [label="Exit function foo" style="filled" fillcolor=red]; } 4 -> {6}; 6 -> {7}; 7 -> {8}; 8 -> {9}; - 9 -> {19}; - 9 -> {10} [color=red]; - 10 -> {11} [color=green]; - 11 -> {5}; - 11 -> {13} [style=dotted]; - 12 -> {11}; - 13 -> {14} [style=dotted]; + 9 -> {10}; + 10 -> {21}; + 10 -> {11} [color=red]; + 11 -> {12} [color=green]; + 12 -> {5}; + 12 -> {14} [style=dotted]; + 13 -> {12} [color=red]; 14 -> {15} [style=dotted]; - 15 -> {5 16} [style=dotted]; - 16 -> {17} [style=dotted]; - 17 -> {5 18} [style=dotted]; - 18 -> {5} [style=dotted]; - 19 -> {21}; - 20 -> {10} [color=green]; - 20 -> {12} [color=red]; - 21 -> {24}; - 21 -> {22} [color=red]; - 22 -> {23}; - 23 -> {20}; - 24 -> {26}; - 25 -> {22} [color=green]; - 25 -> {12} [color=red]; + 15 -> {16} [style=dotted]; + 16 -> {5 17} [style=dotted]; + 17 -> {18} [style=dotted]; + 18 -> {5 19} [style=dotted]; + 19 -> {20} [style=dotted]; + 20 -> {5} [style=dotted]; + 21 -> {23}; + 22 -> {11} [color=green]; + 22 -> {13} [color=red]; + 23 -> {24}; + 24 -> {28}; + 24 -> {25} [color=red]; + 25 -> {26}; 26 -> {27}; - 27 -> {28}; - 28 -> {29}; - 29 -> {30}; + 27 -> {22}; + 28 -> {30}; + 29 -> {25} [color=green]; + 29 -> {13} [color=red]; 30 -> {31}; - 31 -> {35}; - 31 -> {32} [color=red]; - 32 -> {33} [color=green]; - 33 -> {25}; - 34 -> {33} [color=red]; - 35 -> {37}; - 36 -> {32} [color=green]; - 36 -> {34} [color=red]; - 37 -> {38}; - 38 -> {39}; - 39 -> {40}; - 40 -> {41}; - 41 -> {36}; + 31 -> {32}; + 32 -> {33}; + 33 -> {34}; + 34 -> {35}; + 35 -> {36}; + 36 -> {41}; + 36 -> {37} [color=red]; + 37 -> {38} [color=green]; + 38 -> {40}; + 39 -> {38} [color=red]; + 40 -> {29}; + 41 -> {43}; + 42 -> {37} [color=green]; + 42 -> {39} [color=red]; + 43 -> {44}; + 44 -> {45}; + 45 -> {46}; + 46 -> {47}; + 47 -> {48}; + 48 -> {49}; + 49 -> {42}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromLibrary/callsInPlace.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromLibrary/callsInPlace.dot index 716951b7f5c..e138244bfc4 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromLibrary/callsInPlace.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromLibrary/callsInPlace.dot @@ -6,279 +6,418 @@ digraph callsInPlace_kt { subgraph cluster_0 { color=red 0 [label="Enter function test" style="filled" fillcolor=red]; - 2 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 3 [label="Postponed enter to lambda"]; subgraph cluster_1 { color=blue - 9 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 11 [label="Const: Int(1)"]; - 12 [label="Assignment: R|/x|"]; - 10 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 2 [label="Enter block"]; + 3 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 4 [label="Postponed enter to lambda"]; + subgraph cluster_2 { + color=blue + 11 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_3 { + color=blue + 13 [label="Enter block"]; + 14 [label="Const: Int(1)"]; + 15 [label="Assignment: R|/x|"]; + 16 [label="Exit block"]; + } + 12 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 7 [label="Call arguments union" style="filled" fillcolor=yellow]; + 5 [label="Postponed exit from lambda"]; + 6 [label="Function call: R|kotlin/run|(...)"]; + 8 [label="Access variable R|/x|"]; + 9 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 10 [label="Exit block"]; } - 6 [label="Call arguments union" style="filled" fillcolor=yellow]; - 4 [label="Postponed exit from lambda"]; - 5 [label="Function call: R|kotlin/run|(...)"]; - 7 [label="Access variable R|/x|"]; - 8 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; 1 [label="Exit function test" style="filled" fillcolor=red]; } 0 -> {2}; 2 -> {3}; - 3 -> {9}; - 3 -> {4} [color=red]; - 4 -> {5} [color=green]; - 5 -> {7}; - 6 -> {5} [color=red]; - 7 -> {8}; - 8 -> {1}; - 9 -> {11}; - 10 -> {4} [color=green]; - 10 -> {6} [color=red]; - 11 -> {12}; - 12 -> {10}; - - subgraph cluster_2 { - color=red - 13 [label="Enter function test_2" style="filled" fillcolor=red]; - 15 [label="Const: Int(10)"]; - 16 [label="Postponed enter to lambda"]; - subgraph cluster_3 { - color=blue - 19 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 21 [label="Const: String(test_2)"]; - 20 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 17 [label="Postponed exit from lambda"]; - 18 [label="Function call: R|kotlin/repeat|(...)"]; - 14 [label="Exit function test_2" style="filled" fillcolor=red]; - } - 13 -> {15}; + 3 -> {4}; + 4 -> {11}; + 4 -> {5} [color=red]; + 5 -> {6} [color=green]; + 6 -> {8}; + 7 -> {6} [color=red]; + 8 -> {9}; + 9 -> {10}; + 10 -> {1}; + 11 -> {13}; + 12 -> {5} [color=green]; + 12 -> {7} [color=red]; + 13 -> {14}; + 14 -> {15}; 15 -> {16}; - 16 -> {19}; - 16 -> {17} [color=red]; - 17 -> {18}; - 18 -> {14}; - 19 -> {20 21}; - 20 -> {17} [color=green]; - 20 -> {19} [color=green style=dashed]; - 21 -> {20}; + 16 -> {12}; subgraph cluster_4 { color=red - 22 [label="Enter function test_3" style="filled" fillcolor=red]; - 24 [label="Postponed enter to lambda"]; + 17 [label="Enter function test_2" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 28 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 30 [label="Const: String(test_3)"]; - 29 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 19 [label="Enter block"]; + 20 [label="Const: Int(10)"]; + 21 [label="Postponed enter to lambda"]; + subgraph cluster_6 { + color=blue + 25 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 27 [label="Enter block"]; + 28 [label="Const: String(test_2)"]; + 29 [label="Exit block"]; + } + 26 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 22 [label="Postponed exit from lambda"]; + 23 [label="Function call: R|kotlin/repeat|(...)"]; + 24 [label="Exit block"]; } - 25 [label="Postponed exit from lambda"]; - 26 [label="Const: Int(10)"]; - 27 [label="Function call: R|kotlin/repeat|(...)"]; - 23 [label="Exit function test_3" style="filled" fillcolor=red]; + 18 [label="Exit function test_2" style="filled" fillcolor=red]; } - 22 -> {24}; - 24 -> {28}; - 24 -> {25} [color=red]; - 25 -> {26}; - 26 -> {27}; - 27 -> {23}; - 28 -> {29 30}; - 29 -> {25} [color=green]; - 29 -> {28} [color=green style=dashed]; - 30 -> {29}; - - subgraph cluster_6 { - color=red - 31 [label="Enter function test_4" style="filled" fillcolor=red]; - 33 [label="Const: Int(1)"]; - 34 [label="Postponed enter to lambda"]; - subgraph cluster_7 { - color=blue - 38 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 40 [label="Const: String(test_4)"]; - 41 [label="Access variable R|/it|"]; - 42 [label="Const: Int(0)"]; - 43 [label="Function call: R|/it|.R|kotlin/Int.compareTo|(...)"]; - 44 [label="Comparison >"]; - 39 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 37 [label="Call arguments union" style="filled" fillcolor=yellow]; - 35 [label="Postponed exit from lambda"]; - 36 [label="Function call: Int(1).R|kotlin/takeUnless|(...)"]; - 32 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 31 -> {33}; - 33 -> {34}; - 34 -> {38}; - 34 -> {35} [color=red]; - 35 -> {36} [color=green]; - 36 -> {32}; - 37 -> {36} [color=red]; - 38 -> {40}; - 39 -> {35} [color=green]; - 39 -> {37} [color=red]; - 40 -> {41}; - 41 -> {42}; - 42 -> {43}; - 43 -> {44}; - 44 -> {39}; + 17 -> {19}; + 19 -> {20}; + 20 -> {21}; + 21 -> {25}; + 21 -> {22} [color=red]; + 22 -> {23}; + 23 -> {24}; + 24 -> {18}; + 25 -> {26 27}; + 26 -> {22} [color=green]; + 26 -> {25} [color=green style=dashed]; + 27 -> {28}; + 28 -> {29}; + 29 -> {26}; subgraph cluster_8 { color=red - 45 [label="Enter function test_5" style="filled" fillcolor=red]; - 47 [label="Const: Int(1)"]; - 48 [label="Postponed enter to lambda"]; + 30 [label="Enter function test_3" style="filled" fillcolor=red]; subgraph cluster_9 { color=blue - 52 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 54 [label="Const: String(test_5)"]; - 55 [label="Access variable R|/it|"]; - 56 [label="Const: Int(0)"]; - 57 [label="Function call: R|/it|.R|kotlin/Int.compareTo|(...)"]; - 58 [label="Comparison >"]; - 53 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 32 [label="Enter block"]; + 33 [label="Postponed enter to lambda"]; + subgraph cluster_10 { + color=blue + 38 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 40 [label="Enter block"]; + 41 [label="Const: String(test_3)"]; + 42 [label="Exit block"]; + } + 39 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 34 [label="Postponed exit from lambda"]; + 35 [label="Const: Int(10)"]; + 36 [label="Function call: R|kotlin/repeat|(...)"]; + 37 [label="Exit block"]; } - 51 [label="Call arguments union" style="filled" fillcolor=yellow]; - 49 [label="Postponed exit from lambda"]; - 50 [label="Function call: Int(1).R|kotlin/takeUnless|(...)"]; - 46 [label="Exit function test_5" style="filled" fillcolor=red]; + 31 [label="Exit function test_3" style="filled" fillcolor=red]; } - 45 -> {47}; - 47 -> {48}; - 48 -> {52}; - 48 -> {49} [color=red]; - 49 -> {50} [color=green]; - 50 -> {46}; - 51 -> {50} [color=red]; + 30 -> {32}; + 32 -> {33}; + 33 -> {38}; + 33 -> {34} [color=red]; + 34 -> {35}; + 35 -> {36}; + 36 -> {37}; + 37 -> {31}; + 38 -> {39 40}; + 39 -> {34} [color=green]; + 39 -> {38} [color=green style=dashed]; + 40 -> {41}; + 41 -> {42}; + 42 -> {39}; + + subgraph cluster_12 { + color=red + 43 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_13 { + color=blue + 45 [label="Enter block"]; + 46 [label="Const: Int(1)"]; + 47 [label="Postponed enter to lambda"]; + subgraph cluster_14 { + color=blue + 52 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_15 { + color=blue + 54 [label="Enter block"]; + 55 [label="Const: String(test_4)"]; + 56 [label="Access variable R|/it|"]; + 57 [label="Const: Int(0)"]; + 58 [label="Function call: R|/it|.R|kotlin/Int.compareTo|(...)"]; + 59 [label="Comparison >"]; + 60 [label="Exit block"]; + } + 53 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 50 [label="Call arguments union" style="filled" fillcolor=yellow]; + 48 [label="Postponed exit from lambda"]; + 49 [label="Function call: Int(1).R|kotlin/takeUnless|(...)"]; + 51 [label="Exit block"]; + } + 44 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 43 -> {45}; + 45 -> {46}; + 46 -> {47}; + 47 -> {52}; + 47 -> {48} [color=red]; + 48 -> {49} [color=green]; + 49 -> {51}; + 50 -> {49} [color=red]; + 51 -> {44}; 52 -> {54}; - 53 -> {49} [color=green]; - 53 -> {51} [color=red]; + 53 -> {48} [color=green]; + 53 -> {50} [color=red]; 54 -> {55}; 55 -> {56}; 56 -> {57}; 57 -> {58}; - 58 -> {53}; + 58 -> {59}; + 59 -> {60}; + 60 -> {53}; - subgraph cluster_10 { + subgraph cluster_16 { color=red - 59 [label="Enter function myRun" style="filled" fillcolor=red]; - 61 [label="Function call: R|/block1|.R|FakeOverride|()"]; - 62 [label="Function call: R|/block2|.R|FakeOverride|()"]; - 60 [label="Exit function myRun" style="filled" fillcolor=red]; - } - 59 -> {61}; - 61 -> {62}; - 62 -> {60}; - - subgraph cluster_11 { - color=red - 63 [label="Enter function test_6" style="filled" fillcolor=red]; - 65 [label="Postponed enter to lambda"]; - subgraph cluster_12 { + 61 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_17 { color=blue - 70 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 72 [label="Const: String(test_6_1)"]; - 71 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 63 [label="Enter block"]; + 64 [label="Const: Int(1)"]; + 65 [label="Postponed enter to lambda"]; + subgraph cluster_18 { + color=blue + 70 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 72 [label="Enter block"]; + 73 [label="Const: String(test_5)"]; + 74 [label="Access variable R|/it|"]; + 75 [label="Const: Int(0)"]; + 76 [label="Function call: R|/it|.R|kotlin/Int.compareTo|(...)"]; + 77 [label="Comparison >"]; + 78 [label="Exit block"]; + } + 71 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 68 [label="Call arguments union" style="filled" fillcolor=yellow]; + 66 [label="Postponed exit from lambda"]; + 67 [label="Function call: Int(1).R|kotlin/takeUnless|(...)"]; + 69 [label="Exit block"]; } - 66 [label="Postponed exit from lambda"]; - 67 [label="Postponed enter to lambda"]; - subgraph cluster_13 { - color=blue - 73 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 75 [label="Const: String(test_6_2)"]; - 74 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 68 [label="Postponed exit from lambda"]; - 69 [label="Function call: R|/myRun|(...)"]; - 64 [label="Exit function test_6" style="filled" fillcolor=red]; + 62 [label="Exit function test_5" style="filled" fillcolor=red]; } - 63 -> {65}; + 61 -> {63}; + 63 -> {64}; + 64 -> {65}; 65 -> {70}; 65 -> {66} [color=red]; - 66 -> {67}; - 67 -> {73}; - 67 -> {68} [color=red]; - 68 -> {69}; - 69 -> {64}; - 70 -> {71 72}; + 66 -> {67} [color=green]; + 67 -> {69}; + 68 -> {67} [color=red]; + 69 -> {62}; + 70 -> {72}; 71 -> {66} [color=green]; - 71 -> {70} [color=green style=dashed]; - 72 -> {71}; - 73 -> {74 75}; - 74 -> {68} [color=green]; - 74 -> {73} [color=green style=dashed]; - 75 -> {74}; + 71 -> {68} [color=red]; + 72 -> {73}; + 73 -> {74}; + 74 -> {75}; + 75 -> {76}; + 76 -> {77}; + 77 -> {78}; + 78 -> {71}; - subgraph cluster_14 { + subgraph cluster_20 { color=red - 76 [label="Enter function test_7" style="filled" fillcolor=red]; - 78 [label="Postponed enter to lambda"]; - subgraph cluster_15 { + 79 [label="Enter function myRun" style="filled" fillcolor=red]; + subgraph cluster_21 { color=blue - 83 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 85 [label="Const: String(test_7_2)"]; - 84 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 81 [label="Enter block"]; + 82 [label="Function call: R|/block1|.R|FakeOverride|()"]; + 83 [label="Function call: R|/block2|.R|FakeOverride|()"]; + 84 [label="Exit block"]; } - 79 [label="Postponed exit from lambda"]; - 80 [label="Postponed enter to lambda"]; - subgraph cluster_16 { - color=blue - 86 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 88 [label="Const: String(test_7_1)"]; - 87 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 81 [label="Postponed exit from lambda"]; - 82 [label="Function call: R|/myRun|(...)"]; - 77 [label="Exit function test_7" style="filled" fillcolor=red]; + 80 [label="Exit function myRun" style="filled" fillcolor=red]; } - 76 -> {78}; - 78 -> {83}; - 78 -> {79} [color=red]; - 79 -> {80}; - 80 -> {86}; - 80 -> {81} [color=red]; + 79 -> {81}; 81 -> {82}; - 82 -> {77}; - 83 -> {84 85}; - 84 -> {79} [color=green]; - 84 -> {83} [color=green style=dashed]; - 85 -> {84}; - 86 -> {87 88}; - 87 -> {81} [color=green]; - 87 -> {86} [color=green style=dashed]; - 88 -> {87}; + 82 -> {83}; + 83 -> {84}; + 84 -> {80}; - subgraph cluster_17 { + subgraph cluster_22 { color=red - 89 [label="Enter function myDummyRun" style="filled" fillcolor=red]; - 91 [label="Function call: R|/block|.R|FakeOverride|()"]; - 90 [label="Exit function myDummyRun" style="filled" fillcolor=red]; - } - 89 -> {91}; - 91 -> {90}; - - subgraph cluster_18 { - color=red - 92 [label="Enter function test_8" style="filled" fillcolor=red]; - 94 [label="Postponed enter to lambda"]; - subgraph cluster_19 { + 85 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_23 { color=blue - 97 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 99 [label="Const: String(test_8)"]; - 98 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 87 [label="Enter block"]; + 88 [label="Postponed enter to lambda"]; + subgraph cluster_24 { + color=blue + 94 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_25 { + color=blue + 96 [label="Enter block"]; + 97 [label="Const: String(test_6_1)"]; + 98 [label="Exit block"]; + } + 95 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 89 [label="Postponed exit from lambda"]; + 90 [label="Postponed enter to lambda"]; + subgraph cluster_26 { + color=blue + 99 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_27 { + color=blue + 101 [label="Enter block"]; + 102 [label="Const: String(test_6_2)"]; + 103 [label="Exit block"]; + } + 100 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 91 [label="Postponed exit from lambda"]; + 92 [label="Function call: R|/myRun|(...)"]; + 93 [label="Exit block"]; } - 95 [label="Postponed exit from lambda"]; - 96 [label="Function call: R|/myDummyRun|(...)"]; - 93 [label="Exit function test_8" style="filled" fillcolor=red]; + 86 [label="Exit function test_6" style="filled" fillcolor=red]; } - 92 -> {94}; - 94 -> {95}; - 94 -> {97} [color=red]; - 95 -> {96}; - 96 -> {93}; - 97 -> {99}; - 99 -> {98}; + 85 -> {87}; + 87 -> {88}; + 88 -> {94}; + 88 -> {89} [color=red]; + 89 -> {90}; + 90 -> {99}; + 90 -> {91} [color=red]; + 91 -> {92}; + 92 -> {93}; + 93 -> {86}; + 94 -> {95 96}; + 95 -> {89} [color=green]; + 95 -> {94} [color=green style=dashed]; + 96 -> {97}; + 97 -> {98}; + 98 -> {95}; + 99 -> {100 101}; + 100 -> {91} [color=green]; + 100 -> {99} [color=green style=dashed]; + 101 -> {102}; + 102 -> {103}; + 103 -> {100}; + + subgraph cluster_28 { + color=red + 104 [label="Enter function test_7" style="filled" fillcolor=red]; + subgraph cluster_29 { + color=blue + 106 [label="Enter block"]; + 107 [label="Postponed enter to lambda"]; + subgraph cluster_30 { + color=blue + 113 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_31 { + color=blue + 115 [label="Enter block"]; + 116 [label="Const: String(test_7_2)"]; + 117 [label="Exit block"]; + } + 114 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 108 [label="Postponed exit from lambda"]; + 109 [label="Postponed enter to lambda"]; + subgraph cluster_32 { + color=blue + 118 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_33 { + color=blue + 120 [label="Enter block"]; + 121 [label="Const: String(test_7_1)"]; + 122 [label="Exit block"]; + } + 119 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 110 [label="Postponed exit from lambda"]; + 111 [label="Function call: R|/myRun|(...)"]; + 112 [label="Exit block"]; + } + 105 [label="Exit function test_7" style="filled" fillcolor=red]; + } + 104 -> {106}; + 106 -> {107}; + 107 -> {113}; + 107 -> {108} [color=red]; + 108 -> {109}; + 109 -> {118}; + 109 -> {110} [color=red]; + 110 -> {111}; + 111 -> {112}; + 112 -> {105}; + 113 -> {114 115}; + 114 -> {108} [color=green]; + 114 -> {113} [color=green style=dashed]; + 115 -> {116}; + 116 -> {117}; + 117 -> {114}; + 118 -> {119 120}; + 119 -> {110} [color=green]; + 119 -> {118} [color=green style=dashed]; + 120 -> {121}; + 121 -> {122}; + 122 -> {119}; + + subgraph cluster_34 { + color=red + 123 [label="Enter function myDummyRun" style="filled" fillcolor=red]; + subgraph cluster_35 { + color=blue + 125 [label="Enter block"]; + 126 [label="Function call: R|/block|.R|FakeOverride|()"]; + 127 [label="Exit block"]; + } + 124 [label="Exit function myDummyRun" style="filled" fillcolor=red]; + } + 123 -> {125}; + 125 -> {126}; + 126 -> {127}; + 127 -> {124}; + + subgraph cluster_36 { + color=red + 128 [label="Enter function test_8" style="filled" fillcolor=red]; + subgraph cluster_37 { + color=blue + 130 [label="Enter block"]; + 131 [label="Postponed enter to lambda"]; + subgraph cluster_38 { + color=blue + 135 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_39 { + color=blue + 137 [label="Enter block"]; + 138 [label="Const: String(test_8)"]; + 139 [label="Exit block"]; + } + 136 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 132 [label="Postponed exit from lambda"]; + 133 [label="Function call: R|/myDummyRun|(...)"]; + 134 [label="Exit block"]; + } + 129 [label="Exit function test_8" style="filled" fillcolor=red]; + } + 128 -> {130}; + 130 -> {131}; + 131 -> {132 135}; + 132 -> {133}; + 133 -> {134}; + 134 -> {129}; + 135 -> {137}; + 137 -> {138}; + 138 -> {139}; + 139 -> {136}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromLibrary/conditionalEffects.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromLibrary/conditionalEffects.dot index c18e4489432..c1b4fec7ce4 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromLibrary/conditionalEffects.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromLibrary/conditionalEffects.dot @@ -6,18 +6,23 @@ digraph conditionalEffects_kt { subgraph cluster_0 { color=red 0 [label="Enter function test_1" style="filled" fillcolor=red]; - 2 [label="Access variable R|/x|"]; - 3 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 4 [label="Function call: R|kotlin/require|(...)"]; subgraph cluster_1 { color=blue - 5 [label="Enter contract"]; - 6 [label="Access variable R|/x|"]; - 7 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; - 8 [label="Exit contract"]; + 2 [label="Enter block"]; + 3 [label="Access variable R|/x|"]; + 4 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; + 5 [label="Function call: R|kotlin/require|(...)"]; + subgraph cluster_2 { + color=blue + 6 [label="Enter contract"]; + 7 [label="Access variable R|/x|"]; + 8 [label="Type operator: (R|/x| is R|kotlin/Int|)"]; + 9 [label="Exit contract"]; + } + 10 [label="Access variable R|/x|"]; + 11 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 12 [label="Exit block"]; } - 9 [label="Access variable R|/x|"]; - 10 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; 1 [label="Exit function test_1" style="filled" fillcolor=red]; } 0 -> {2}; @@ -29,204 +34,224 @@ digraph conditionalEffects_kt { 7 -> {8}; 8 -> {9}; 9 -> {10}; - 10 -> {1}; + 10 -> {11}; + 11 -> {12}; + 12 -> {1}; - subgraph cluster_2 { + subgraph cluster_3 { color=red - 11 [label="Enter function test_2" style="filled" fillcolor=red]; - 13 [label="Access variable R|/x|"]; - 14 [label="Function call: R|kotlin/requireNotNull|(...)"]; - subgraph cluster_3 { + 13 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_4 { color=blue - 15 [label="Enter contract"]; + 15 [label="Enter block"]; 16 [label="Access variable R|/x|"]; - 17 [label="Const: Null(null)"]; - 18 [label="Operator !="]; - 19 [label="Exit contract"]; + 17 [label="Function call: R|kotlin/requireNotNull|(...)"]; + subgraph cluster_5 { + color=blue + 18 [label="Enter contract"]; + 19 [label="Access variable R|/x|"]; + 20 [label="Const: Null(null)"]; + 21 [label="Operator !="]; + 22 [label="Exit contract"]; + } + 23 [label="Access variable R|/x|"]; + 24 [label="Access variable R|kotlin/String.length|"]; + 25 [label="Exit block"]; } - 20 [label="Access variable R|/x|"]; - 21 [label="Access variable R|kotlin/String.length|"]; - 12 [label="Exit function test_2" style="filled" fillcolor=red]; + 14 [label="Exit function test_2" style="filled" fillcolor=red]; } - 11 -> {13}; - 13 -> {14}; - 14 -> {15}; + 13 -> {15}; 15 -> {16}; 16 -> {17}; 17 -> {18}; 18 -> {19}; 19 -> {20}; 20 -> {21}; - 21 -> {12}; + 21 -> {22}; + 22 -> {23}; + 23 -> {24}; + 24 -> {25}; + 25 -> {14}; - subgraph cluster_4 { + subgraph cluster_6 { color=red - 22 [label="Enter function test_3" style="filled" fillcolor=red]; - 24 [label="Access variable R|/x|"]; - 25 [label="Const: Null(null)"]; - 26 [label="Operator !="]; - 27 [label="Function call: R|kotlin/require|(...)"]; - subgraph cluster_5 { + 26 [label="Enter function test_3" style="filled" fillcolor=red]; + subgraph cluster_7 { color=blue - 28 [label="Enter contract"]; + 28 [label="Enter block"]; 29 [label="Access variable R|/x|"]; 30 [label="Const: Null(null)"]; 31 [label="Operator !="]; - 32 [label="Exit contract"]; + 32 [label="Function call: R|kotlin/require|(...)"]; + subgraph cluster_8 { + color=blue + 33 [label="Enter contract"]; + 34 [label="Access variable R|/x|"]; + 35 [label="Const: Null(null)"]; + 36 [label="Operator !="]; + 37 [label="Exit contract"]; + } + 38 [label="Access variable R|/x|"]; + 39 [label="Access variable R|kotlin/String.length|"]; + 40 [label="Exit block"]; } - 33 [label="Access variable R|/x|"]; - 34 [label="Access variable R|kotlin/String.length|"]; - 23 [label="Exit function test_3" style="filled" fillcolor=red]; + 27 [label="Exit function test_3" style="filled" fillcolor=red]; } - 22 -> {24}; - 24 -> {25}; - 25 -> {26}; - 26 -> {27}; - 27 -> {28}; + 26 -> {28}; 28 -> {29}; 29 -> {30}; 30 -> {31}; 31 -> {32}; 32 -> {33}; 33 -> {34}; - 34 -> {23}; - - subgraph cluster_6 { - color=red - 35 [label="Enter function test_4" style="filled" fillcolor=red]; - subgraph cluster_7 { - color=blue - 38 [label="Enter &&"]; - 39 [label="Access variable R|/x|"]; - 40 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 41 [label="Exit left part of &&"]; - 42 [label="Enter right part of &&"]; - 43 [label="Access variable R|/y|"]; - 44 [label="Const: Null(null)"]; - 45 [label="Operator !="]; - 37 [label="Exit &&"]; - } - 46 [label="Function call: R|kotlin/require|(...)"]; - subgraph cluster_8 { - color=blue - 47 [label="Enter contract"]; - subgraph cluster_9 { - color=blue - 49 [label="Enter &&"]; - 50 [label="Access variable R|/x|"]; - 51 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 52 [label="Exit left part of &&"]; - 53 [label="Enter right part of &&"]; - 54 [label="Access variable R|/y|"]; - 55 [label="Const: Null(null)"]; - 56 [label="Operator !="]; - 48 [label="Exit &&"]; - } - 57 [label="Exit contract"]; - } - 58 [label="Access variable R|/x|"]; - 59 [label="Access variable R|kotlin/String.length|"]; - 60 [label="Access variable R|/y|"]; - 61 [label="Access variable R|kotlin/String.length|"]; - 36 [label="Exit function test_4" style="filled" fillcolor=red]; - } - 35 -> {38}; - 37 -> {46}; + 34 -> {35}; + 35 -> {36}; + 36 -> {37}; + 37 -> {38}; 38 -> {39}; 39 -> {40}; - 40 -> {41}; - 41 -> {37 42}; - 42 -> {43}; - 43 -> {44}; - 44 -> {45}; - 45 -> {37}; + 40 -> {27}; + + subgraph cluster_9 { + color=red + 41 [label="Enter function test_4" style="filled" fillcolor=red]; + subgraph cluster_10 { + color=blue + 43 [label="Enter block"]; + subgraph cluster_11 { + color=blue + 45 [label="Enter &&"]; + 46 [label="Access variable R|/x|"]; + 47 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 48 [label="Exit left part of &&"]; + 49 [label="Enter right part of &&"]; + 50 [label="Access variable R|/y|"]; + 51 [label="Const: Null(null)"]; + 52 [label="Operator !="]; + 44 [label="Exit &&"]; + } + 53 [label="Function call: R|kotlin/require|(...)"]; + subgraph cluster_12 { + color=blue + 54 [label="Enter contract"]; + subgraph cluster_13 { + color=blue + 56 [label="Enter &&"]; + 57 [label="Access variable R|/x|"]; + 58 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 59 [label="Exit left part of &&"]; + 60 [label="Enter right part of &&"]; + 61 [label="Access variable R|/y|"]; + 62 [label="Const: Null(null)"]; + 63 [label="Operator !="]; + 55 [label="Exit &&"]; + } + 64 [label="Exit contract"]; + } + 65 [label="Access variable R|/x|"]; + 66 [label="Access variable R|kotlin/String.length|"]; + 67 [label="Access variable R|/y|"]; + 68 [label="Access variable R|kotlin/String.length|"]; + 69 [label="Exit block"]; + } + 42 [label="Exit function test_4" style="filled" fillcolor=red]; + } + 41 -> {43}; + 43 -> {45}; + 44 -> {53}; + 45 -> {46}; 46 -> {47}; - 47 -> {49}; - 48 -> {57}; + 47 -> {48}; + 48 -> {44 49}; 49 -> {50}; 50 -> {51}; 51 -> {52}; - 52 -> {48 53}; + 52 -> {44}; 53 -> {54}; - 54 -> {55}; - 55 -> {56}; - 56 -> {48}; + 54 -> {56}; + 55 -> {64}; + 56 -> {57}; 57 -> {58}; 58 -> {59}; - 59 -> {60}; + 59 -> {55 60}; 60 -> {61}; - 61 -> {36}; - - subgraph cluster_10 { - color=red - 62 [label="Enter function test_5" style="filled" fillcolor=red]; - subgraph cluster_11 { - color=blue - 64 [label="Enter when"]; - subgraph cluster_12 { - color=blue - 66 [label="Enter when branch condition "]; - 67 [label="Access variable R|/b|"]; - 68 [label="Exit when branch condition"]; - } - subgraph cluster_13 { - color=blue - 82 [label="Enter when branch condition else"]; - 83 [label="Exit when branch condition"]; - } - 84 [label="Enter when branch result"]; - subgraph cluster_14 { - color=blue - 85 [label="Enter block"]; - 86 [label="Access variable R|/x|"]; - 87 [label="Access variable #"]; - 88 [label="Exit block"]; - } - 89 [label="Exit when branch result"]; - 69 [label="Enter when branch result"]; - subgraph cluster_15 { - color=blue - 70 [label="Enter block"]; - 71 [label="Access variable R|/x|"]; - 72 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 73 [label="Function call: R|kotlin/require|(...)"]; - subgraph cluster_16 { - color=blue - 74 [label="Enter contract"]; - 75 [label="Access variable R|/x|"]; - 76 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 77 [label="Exit contract"]; - } - 78 [label="Access variable R|/x|"]; - 79 [label="Access variable R|kotlin/String.length|"]; - 80 [label="Exit block"]; - } - 81 [label="Exit when branch result"]; - 65 [label="Exit when"]; - } - 90 [label="Access variable R|/x|"]; - 91 [label="Access variable #"]; - 63 [label="Exit function test_5" style="filled" fillcolor=red]; - } - 62 -> {64}; - 64 -> {66}; - 65 -> {90}; + 61 -> {62}; + 62 -> {63}; + 63 -> {55}; + 64 -> {65}; + 65 -> {66}; 66 -> {67}; 67 -> {68}; - 68 -> {69 82}; - 69 -> {70}; - 70 -> {71}; - 71 -> {72}; + 68 -> {69}; + 69 -> {42}; + + subgraph cluster_14 { + color=red + 70 [label="Enter function test_5" style="filled" fillcolor=red]; + subgraph cluster_15 { + color=blue + 72 [label="Enter block"]; + subgraph cluster_16 { + color=blue + 73 [label="Enter when"]; + subgraph cluster_17 { + color=blue + 75 [label="Enter when branch condition "]; + 76 [label="Access variable R|/b|"]; + 77 [label="Exit when branch condition"]; + } + subgraph cluster_18 { + color=blue + 91 [label="Enter when branch condition else"]; + 92 [label="Exit when branch condition"]; + } + 93 [label="Enter when branch result"]; + subgraph cluster_19 { + color=blue + 94 [label="Enter block"]; + 95 [label="Access variable R|/x|"]; + 96 [label="Access variable #"]; + 97 [label="Exit block"]; + } + 98 [label="Exit when branch result"]; + 78 [label="Enter when branch result"]; + subgraph cluster_20 { + color=blue + 79 [label="Enter block"]; + 80 [label="Access variable R|/x|"]; + 81 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 82 [label="Function call: R|kotlin/require|(...)"]; + subgraph cluster_21 { + color=blue + 83 [label="Enter contract"]; + 84 [label="Access variable R|/x|"]; + 85 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 86 [label="Exit contract"]; + } + 87 [label="Access variable R|/x|"]; + 88 [label="Access variable R|kotlin/String.length|"]; + 89 [label="Exit block"]; + } + 90 [label="Exit when branch result"]; + 74 [label="Exit when"]; + } + 99 [label="Access variable R|/x|"]; + 100 [label="Access variable #"]; + 101 [label="Exit block"]; + } + 71 [label="Exit function test_5" style="filled" fillcolor=red]; + } + 70 -> {72}; 72 -> {73}; - 73 -> {74}; - 74 -> {75}; + 73 -> {75}; + 74 -> {99}; 75 -> {76}; 76 -> {77}; - 77 -> {78}; + 77 -> {78 91}; 78 -> {79}; 79 -> {80}; 80 -> {81}; - 81 -> {65}; + 81 -> {82}; 82 -> {83}; 83 -> {84}; 84 -> {85}; @@ -234,90 +259,95 @@ digraph conditionalEffects_kt { 86 -> {87}; 87 -> {88}; 88 -> {89}; - 89 -> {65}; - 90 -> {91}; - 91 -> {63}; - - subgraph cluster_17 { - color=red - 92 [label="Enter function test_6" style="filled" fillcolor=red]; - subgraph cluster_18 { - color=blue - 94 [label="Enter when"]; - subgraph cluster_19 { - color=blue - 96 [label="Enter when branch condition "]; - 97 [label="Access variable R|/b|"]; - 98 [label="Exit when branch condition"]; - } - subgraph cluster_20 { - color=blue - 112 [label="Enter when branch condition else"]; - 113 [label="Exit when branch condition"]; - } - 114 [label="Enter when branch result"]; - subgraph cluster_21 { - color=blue - 115 [label="Enter block"]; - 116 [label="Access variable R|/x|"]; - 117 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 118 [label="Function call: R|kotlin/require|(...)"]; - subgraph cluster_22 { - color=blue - 119 [label="Enter contract"]; - 120 [label="Access variable R|/x|"]; - 121 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 122 [label="Exit contract"]; - } - 123 [label="Access variable R|/x|"]; - 124 [label="Access variable R|kotlin/String.length|"]; - 125 [label="Exit block"]; - } - 126 [label="Exit when branch result"]; - 99 [label="Enter when branch result"]; - subgraph cluster_23 { - color=blue - 100 [label="Enter block"]; - 101 [label="Access variable R|/x|"]; - 102 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 103 [label="Function call: R|kotlin/require|(...)"]; - subgraph cluster_24 { - color=blue - 104 [label="Enter contract"]; - 105 [label="Access variable R|/x|"]; - 106 [label="Type operator: (R|/x| is R|kotlin/String|)"]; - 107 [label="Exit contract"]; - } - 108 [label="Access variable R|/x|"]; - 109 [label="Access variable R|kotlin/String.length|"]; - 110 [label="Exit block"]; - } - 111 [label="Exit when branch result"]; - 95 [label="Exit when"]; - } - 127 [label="Access variable R|/x|"]; - 128 [label="Access variable R|kotlin/String.length|"]; - 93 [label="Exit function test_6" style="filled" fillcolor=red]; - } - 92 -> {94}; - 94 -> {96}; - 95 -> {127}; + 89 -> {90}; + 90 -> {74}; + 91 -> {92}; + 92 -> {93}; + 93 -> {94}; + 94 -> {95}; + 95 -> {96}; 96 -> {97}; 97 -> {98}; - 98 -> {99 112}; + 98 -> {74}; 99 -> {100}; 100 -> {101}; - 101 -> {102}; - 102 -> {103}; - 103 -> {104}; + 101 -> {71}; + + subgraph cluster_22 { + color=red + 102 [label="Enter function test_6" style="filled" fillcolor=red]; + subgraph cluster_23 { + color=blue + 104 [label="Enter block"]; + subgraph cluster_24 { + color=blue + 105 [label="Enter when"]; + subgraph cluster_25 { + color=blue + 107 [label="Enter when branch condition "]; + 108 [label="Access variable R|/b|"]; + 109 [label="Exit when branch condition"]; + } + subgraph cluster_26 { + color=blue + 123 [label="Enter when branch condition else"]; + 124 [label="Exit when branch condition"]; + } + 125 [label="Enter when branch result"]; + subgraph cluster_27 { + color=blue + 126 [label="Enter block"]; + 127 [label="Access variable R|/x|"]; + 128 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 129 [label="Function call: R|kotlin/require|(...)"]; + subgraph cluster_28 { + color=blue + 130 [label="Enter contract"]; + 131 [label="Access variable R|/x|"]; + 132 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 133 [label="Exit contract"]; + } + 134 [label="Access variable R|/x|"]; + 135 [label="Access variable R|kotlin/String.length|"]; + 136 [label="Exit block"]; + } + 137 [label="Exit when branch result"]; + 110 [label="Enter when branch result"]; + subgraph cluster_29 { + color=blue + 111 [label="Enter block"]; + 112 [label="Access variable R|/x|"]; + 113 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 114 [label="Function call: R|kotlin/require|(...)"]; + subgraph cluster_30 { + color=blue + 115 [label="Enter contract"]; + 116 [label="Access variable R|/x|"]; + 117 [label="Type operator: (R|/x| is R|kotlin/String|)"]; + 118 [label="Exit contract"]; + } + 119 [label="Access variable R|/x|"]; + 120 [label="Access variable R|kotlin/String.length|"]; + 121 [label="Exit block"]; + } + 122 [label="Exit when branch result"]; + 106 [label="Exit when"]; + } + 138 [label="Access variable R|/x|"]; + 139 [label="Access variable R|kotlin/String.length|"]; + 140 [label="Exit block"]; + } + 103 [label="Exit function test_6" style="filled" fillcolor=red]; + } + 102 -> {104}; 104 -> {105}; - 105 -> {106}; - 106 -> {107}; + 105 -> {107}; + 106 -> {138}; 107 -> {108}; 108 -> {109}; - 109 -> {110}; + 109 -> {110 123}; 110 -> {111}; - 111 -> {95}; + 111 -> {112}; 112 -> {113}; 113 -> {114}; 114 -> {115}; @@ -328,12 +358,24 @@ digraph conditionalEffects_kt { 119 -> {120}; 120 -> {121}; 121 -> {122}; - 122 -> {123}; + 122 -> {106}; 123 -> {124}; 124 -> {125}; 125 -> {126}; - 126 -> {95}; + 126 -> {127}; 127 -> {128}; - 128 -> {93}; + 128 -> {129}; + 129 -> {130}; + 130 -> {131}; + 131 -> {132}; + 132 -> {133}; + 133 -> {134}; + 134 -> {135}; + 135 -> {136}; + 136 -> {137}; + 137 -> {106}; + 138 -> {139}; + 139 -> {140}; + 140 -> {103}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/atLeastOnce.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/atLeastOnce.dot index bd57edff22d..3e34cb9f0e6 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/atLeastOnce.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/atLeastOnce.dot @@ -6,83 +6,125 @@ digraph atLeastOnce_kt { subgraph cluster_0 { color=red 0 [label="Enter function inlineRun" style="filled" fillcolor=red]; - 2 [label="Function call: R|/block|.R|FakeOverride|()"]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Function call: R|/block|.R|FakeOverride|()"]; + 4 [label="Exit block"]; + } 1 [label="Exit function inlineRun" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {1}; - - subgraph cluster_1 { - color=red - 3 [label="Enter function myRun" style="filled" fillcolor=red]; - 5 [label="Function call: R|/block|.R|FakeOverride|()"]; - 4 [label="Exit function myRun" style="filled" fillcolor=red]; - } - 3 -> {5}; - 5 -> {4}; + 2 -> {3}; + 3 -> {4}; + 4 -> {1}; subgraph cluster_2 { color=red - 6 [label="Enter function test_1" style="filled" fillcolor=red]; - 8 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 9 [label="Postponed enter to lambda"]; + 5 [label="Enter function myRun" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 14 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 16 [label="Const: Int(1)"]; - 17 [label="Assignment: R|/x|"]; - 15 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 7 [label="Enter block"]; + 8 [label="Function call: R|/block|.R|FakeOverride|()"]; + 9 [label="Exit block"]; } - 10 [label="Postponed exit from lambda"]; - 11 [label="Function call: R|/inlineRun|(...)"]; - 12 [label="Access variable R|/x|"]; - 13 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 7 [label="Exit function test_1" style="filled" fillcolor=red]; + 6 [label="Exit function myRun" style="filled" fillcolor=red]; } - 6 -> {8}; + 5 -> {7}; + 7 -> {8}; 8 -> {9}; - 9 -> {14}; - 9 -> {10} [color=red]; - 10 -> {11}; - 11 -> {12}; - 12 -> {13}; - 13 -> {7}; - 14 -> {16}; - 15 -> {10} [color=green]; - 15 -> {14} [color=green style=dashed]; - 16 -> {17}; - 17 -> {15}; + 9 -> {6}; subgraph cluster_4 { color=red - 18 [label="Enter function test_2" style="filled" fillcolor=red]; - 20 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 21 [label="Postponed enter to lambda"]; + 10 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 26 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 28 [label="Const: Int(1)"]; - 29 [label="Assignment: R|/x|"]; - 27 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 12 [label="Enter block"]; + 13 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 14 [label="Postponed enter to lambda"]; + subgraph cluster_6 { + color=blue + 20 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 22 [label="Enter block"]; + 23 [label="Const: Int(1)"]; + 24 [label="Assignment: R|/x|"]; + 25 [label="Exit block"]; + } + 21 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 15 [label="Postponed exit from lambda"]; + 16 [label="Function call: R|/inlineRun|(...)"]; + 17 [label="Access variable R|/x|"]; + 18 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 19 [label="Exit block"]; } - 22 [label="Postponed exit from lambda"]; - 23 [label="Function call: R|/myRun|(...)"]; - 24 [label="Access variable R|/x|"]; - 25 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 19 [label="Exit function test_2" style="filled" fillcolor=red]; + 11 [label="Exit function test_1" style="filled" fillcolor=red]; } - 18 -> {20}; - 20 -> {21}; - 21 -> {26}; - 21 -> {22} [color=red]; + 10 -> {12}; + 12 -> {13}; + 13 -> {14}; + 14 -> {20}; + 14 -> {15} [color=red]; + 15 -> {16}; + 16 -> {17}; + 17 -> {18}; + 18 -> {19}; + 19 -> {11}; + 20 -> {22}; + 21 -> {15} [color=green]; + 21 -> {20} [color=green style=dashed]; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {19}; + 25 -> {21}; + + subgraph cluster_8 { + color=red + 26 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 28 [label="Enter block"]; + 29 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 30 [label="Postponed enter to lambda"]; + subgraph cluster_10 { + color=blue + 36 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 38 [label="Enter block"]; + 39 [label="Const: Int(1)"]; + 40 [label="Assignment: R|/x|"]; + 41 [label="Exit block"]; + } + 37 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 31 [label="Postponed exit from lambda"]; + 32 [label="Function call: R|/myRun|(...)"]; + 33 [label="Access variable R|/x|"]; + 34 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 35 [label="Exit block"]; + } + 27 [label="Exit function test_2" style="filled" fillcolor=red]; + } 26 -> {28}; - 27 -> {22} [color=green]; - 27 -> {26} [color=green style=dashed]; 28 -> {29}; - 29 -> {27}; + 29 -> {30}; + 30 -> {36}; + 30 -> {31} [color=red]; + 31 -> {32}; + 32 -> {33}; + 33 -> {34}; + 34 -> {35}; + 35 -> {27}; + 36 -> {38}; + 37 -> {31} [color=green]; + 37 -> {36} [color=green style=dashed]; + 38 -> {39}; + 39 -> {40}; + 40 -> {41}; + 41 -> {37}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/atMostOnce.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/atMostOnce.dot index c46ddf15601..eff78419c06 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/atMostOnce.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/atMostOnce.dot @@ -6,81 +6,123 @@ digraph atMostOnce_kt { subgraph cluster_0 { color=red 0 [label="Enter function inlineRun" style="filled" fillcolor=red]; - 2 [label="Function call: R|/block|.R|FakeOverride|()"]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Function call: R|/block|.R|FakeOverride|()"]; + 4 [label="Exit block"]; + } 1 [label="Exit function inlineRun" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {1}; - - subgraph cluster_1 { - color=red - 3 [label="Enter function myRun" style="filled" fillcolor=red]; - 5 [label="Function call: R|/block|.R|FakeOverride|()"]; - 4 [label="Exit function myRun" style="filled" fillcolor=red]; - } - 3 -> {5}; - 5 -> {4}; + 2 -> {3}; + 3 -> {4}; + 4 -> {1}; subgraph cluster_2 { color=red - 6 [label="Enter function test_1" style="filled" fillcolor=red]; - 8 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 9 [label="Postponed enter to lambda"]; + 5 [label="Enter function myRun" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 14 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 16 [label="Const: Int(1)"]; - 17 [label="Assignment: R|/x|"]; - 15 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 7 [label="Enter block"]; + 8 [label="Function call: R|/block|.R|FakeOverride|()"]; + 9 [label="Exit block"]; } - 10 [label="Postponed exit from lambda"]; - 11 [label="Function call: R|/inlineRun|(...)"]; - 12 [label="Access variable R|/x|"]; - 13 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 7 [label="Exit function test_1" style="filled" fillcolor=red]; + 6 [label="Exit function myRun" style="filled" fillcolor=red]; } - 6 -> {8}; + 5 -> {7}; + 7 -> {8}; 8 -> {9}; - 9 -> {14}; - 9 -> {10} [color=red]; - 10 -> {11}; - 11 -> {12}; - 12 -> {13}; - 13 -> {7}; - 14 -> {15 16}; - 15 -> {10} [color=green]; - 16 -> {17}; - 17 -> {15}; + 9 -> {6}; subgraph cluster_4 { color=red - 18 [label="Enter function test_2" style="filled" fillcolor=red]; - 20 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 21 [label="Postponed enter to lambda"]; + 10 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 26 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 28 [label="Const: Int(1)"]; - 29 [label="Assignment: R|/x|"]; - 27 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 12 [label="Enter block"]; + 13 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 14 [label="Postponed enter to lambda"]; + subgraph cluster_6 { + color=blue + 20 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 22 [label="Enter block"]; + 23 [label="Const: Int(1)"]; + 24 [label="Assignment: R|/x|"]; + 25 [label="Exit block"]; + } + 21 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 15 [label="Postponed exit from lambda"]; + 16 [label="Function call: R|/inlineRun|(...)"]; + 17 [label="Access variable R|/x|"]; + 18 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 19 [label="Exit block"]; } - 22 [label="Postponed exit from lambda"]; - 23 [label="Function call: R|/myRun|(...)"]; - 24 [label="Access variable R|/x|"]; - 25 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 19 [label="Exit function test_2" style="filled" fillcolor=red]; + 11 [label="Exit function test_1" style="filled" fillcolor=red]; } - 18 -> {20}; - 20 -> {21}; - 21 -> {26}; - 21 -> {22} [color=red]; + 10 -> {12}; + 12 -> {13}; + 13 -> {14}; + 14 -> {20}; + 14 -> {15} [color=red]; + 15 -> {16}; + 16 -> {17}; + 17 -> {18}; + 18 -> {19}; + 19 -> {11}; + 20 -> {21 22}; + 21 -> {15} [color=green]; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {19}; - 26 -> {27 28}; - 27 -> {22} [color=green]; + 25 -> {21}; + + subgraph cluster_8 { + color=red + 26 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 28 [label="Enter block"]; + 29 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 30 [label="Postponed enter to lambda"]; + subgraph cluster_10 { + color=blue + 36 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 38 [label="Enter block"]; + 39 [label="Const: Int(1)"]; + 40 [label="Assignment: R|/x|"]; + 41 [label="Exit block"]; + } + 37 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 31 [label="Postponed exit from lambda"]; + 32 [label="Function call: R|/myRun|(...)"]; + 33 [label="Access variable R|/x|"]; + 34 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 35 [label="Exit block"]; + } + 27 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 26 -> {28}; 28 -> {29}; - 29 -> {27}; + 29 -> {30}; + 30 -> {36}; + 30 -> {31} [color=red]; + 31 -> {32}; + 32 -> {33}; + 33 -> {34}; + 34 -> {35}; + 35 -> {27}; + 36 -> {37 38}; + 37 -> {31} [color=green]; + 38 -> {39}; + 39 -> {40}; + 40 -> {41}; + 41 -> {37}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/exactlyOnce.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/exactlyOnce.dot index 4456a0e4ad6..1a278d98458 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/exactlyOnce.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/exactlyOnce.dot @@ -6,87 +6,129 @@ digraph exactlyOnce_kt { subgraph cluster_0 { color=red 0 [label="Enter function inlineRun" style="filled" fillcolor=red]; - 2 [label="Function call: R|/block|.R|FakeOverride|()"]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Function call: R|/block|.R|FakeOverride|()"]; + 4 [label="Exit block"]; + } 1 [label="Exit function inlineRun" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {1}; - - subgraph cluster_1 { - color=red - 3 [label="Enter function myRun" style="filled" fillcolor=red]; - 5 [label="Function call: R|/block|.R|FakeOverride|()"]; - 4 [label="Exit function myRun" style="filled" fillcolor=red]; - } - 3 -> {5}; - 5 -> {4}; + 2 -> {3}; + 3 -> {4}; + 4 -> {1}; subgraph cluster_2 { color=red - 6 [label="Enter function test_1" style="filled" fillcolor=red]; - 8 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 9 [label="Postponed enter to lambda"]; + 5 [label="Enter function myRun" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 15 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 17 [label="Const: Int(1)"]; - 18 [label="Assignment: R|/x|"]; - 16 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 7 [label="Enter block"]; + 8 [label="Function call: R|/block|.R|FakeOverride|()"]; + 9 [label="Exit block"]; } - 12 [label="Call arguments union" style="filled" fillcolor=yellow]; - 10 [label="Postponed exit from lambda"]; - 11 [label="Function call: R|/inlineRun|(...)"]; - 13 [label="Access variable R|/x|"]; - 14 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 7 [label="Exit function test_1" style="filled" fillcolor=red]; + 6 [label="Exit function myRun" style="filled" fillcolor=red]; } - 6 -> {8}; + 5 -> {7}; + 7 -> {8}; 8 -> {9}; - 9 -> {15}; - 9 -> {10} [color=red]; - 10 -> {11} [color=green]; - 11 -> {13}; - 12 -> {11} [color=red]; - 13 -> {14}; - 14 -> {7}; - 15 -> {17}; - 16 -> {10} [color=green]; - 16 -> {12} [color=red]; - 17 -> {18}; - 18 -> {16}; + 9 -> {6}; subgraph cluster_4 { color=red - 19 [label="Enter function test_2" style="filled" fillcolor=red]; - 21 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 22 [label="Postponed enter to lambda"]; + 10 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 28 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 30 [label="Const: Int(1)"]; - 31 [label="Assignment: R|/x|"]; - 29 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 12 [label="Enter block"]; + 13 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 14 [label="Postponed enter to lambda"]; + subgraph cluster_6 { + color=blue + 21 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 23 [label="Enter block"]; + 24 [label="Const: Int(1)"]; + 25 [label="Assignment: R|/x|"]; + 26 [label="Exit block"]; + } + 22 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 17 [label="Call arguments union" style="filled" fillcolor=yellow]; + 15 [label="Postponed exit from lambda"]; + 16 [label="Function call: R|/inlineRun|(...)"]; + 18 [label="Access variable R|/x|"]; + 19 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 20 [label="Exit block"]; } - 25 [label="Call arguments union" style="filled" fillcolor=yellow]; - 23 [label="Postponed exit from lambda"]; - 24 [label="Function call: R|/myRun|(...)"]; - 26 [label="Access variable R|/x|"]; - 27 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 20 [label="Exit function test_2" style="filled" fillcolor=red]; + 11 [label="Exit function test_1" style="filled" fillcolor=red]; } - 19 -> {21}; - 21 -> {22}; - 22 -> {28}; - 22 -> {23} [color=red]; - 23 -> {24} [color=green]; - 24 -> {26}; - 25 -> {24} [color=red]; - 26 -> {27}; - 27 -> {20}; - 28 -> {30}; - 29 -> {23} [color=green]; - 29 -> {25} [color=red]; + 10 -> {12}; + 12 -> {13}; + 13 -> {14}; + 14 -> {21}; + 14 -> {15} [color=red]; + 15 -> {16} [color=green]; + 16 -> {18}; + 17 -> {16} [color=red]; + 18 -> {19}; + 19 -> {20}; + 20 -> {11}; + 21 -> {23}; + 22 -> {15} [color=green]; + 22 -> {17} [color=red]; + 23 -> {24}; + 24 -> {25}; + 25 -> {26}; + 26 -> {22}; + + subgraph cluster_8 { + color=red + 27 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 29 [label="Enter block"]; + 30 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 31 [label="Postponed enter to lambda"]; + subgraph cluster_10 { + color=blue + 38 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 40 [label="Enter block"]; + 41 [label="Const: Int(1)"]; + 42 [label="Assignment: R|/x|"]; + 43 [label="Exit block"]; + } + 39 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 34 [label="Call arguments union" style="filled" fillcolor=yellow]; + 32 [label="Postponed exit from lambda"]; + 33 [label="Function call: R|/myRun|(...)"]; + 35 [label="Access variable R|/x|"]; + 36 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 37 [label="Exit block"]; + } + 28 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 27 -> {29}; + 29 -> {30}; 30 -> {31}; - 31 -> {29}; + 31 -> {38}; + 31 -> {32} [color=red]; + 32 -> {33} [color=green]; + 33 -> {35}; + 34 -> {33} [color=red]; + 35 -> {36}; + 36 -> {37}; + 37 -> {28}; + 38 -> {40}; + 39 -> {32} [color=green]; + 39 -> {34} [color=red]; + 40 -> {41}; + 41 -> {42}; + 42 -> {43}; + 43 -> {39}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/unknown.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/unknown.dot index e5933116ebd..160d33c9722 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/unknown.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/contracts/fromSource/good/callsInPlace/unknown.dot @@ -6,83 +6,125 @@ digraph unknown_kt { subgraph cluster_0 { color=red 0 [label="Enter function inlineRun" style="filled" fillcolor=red]; - 2 [label="Function call: R|/block|.R|FakeOverride|()"]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Function call: R|/block|.R|FakeOverride|()"]; + 4 [label="Exit block"]; + } 1 [label="Exit function inlineRun" style="filled" fillcolor=red]; } 0 -> {2}; - 2 -> {1}; - - subgraph cluster_1 { - color=red - 3 [label="Enter function myRun" style="filled" fillcolor=red]; - 5 [label="Function call: R|/block|.R|FakeOverride|()"]; - 4 [label="Exit function myRun" style="filled" fillcolor=red]; - } - 3 -> {5}; - 5 -> {4}; + 2 -> {3}; + 3 -> {4}; + 4 -> {1}; subgraph cluster_2 { color=red - 6 [label="Enter function test_1" style="filled" fillcolor=red]; - 8 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 9 [label="Postponed enter to lambda"]; + 5 [label="Enter function myRun" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 14 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 16 [label="Const: Int(1)"]; - 17 [label="Assignment: R|/x|"]; - 15 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 7 [label="Enter block"]; + 8 [label="Function call: R|/block|.R|FakeOverride|()"]; + 9 [label="Exit block"]; } - 10 [label="Postponed exit from lambda"]; - 11 [label="Function call: R|/inlineRun|(...)"]; - 12 [label="Access variable R|/x|"]; - 13 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 7 [label="Exit function test_1" style="filled" fillcolor=red]; + 6 [label="Exit function myRun" style="filled" fillcolor=red]; } - 6 -> {8}; + 5 -> {7}; + 7 -> {8}; 8 -> {9}; - 9 -> {14}; - 9 -> {10} [color=red]; - 10 -> {11}; - 11 -> {12}; - 12 -> {13}; - 13 -> {7}; - 14 -> {15 16}; - 15 -> {10} [color=green]; - 15 -> {14} [color=green style=dashed]; - 16 -> {17}; - 17 -> {15}; + 9 -> {6}; subgraph cluster_4 { color=red - 18 [label="Enter function test_2" style="filled" fillcolor=red]; - 20 [label="Variable declaration: lval x: R|kotlin/Int|"]; - 21 [label="Postponed enter to lambda"]; + 10 [label="Enter function test_1" style="filled" fillcolor=red]; subgraph cluster_5 { color=blue - 26 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 28 [label="Const: Int(1)"]; - 29 [label="Assignment: R|/x|"]; - 27 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + 12 [label="Enter block"]; + 13 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 14 [label="Postponed enter to lambda"]; + subgraph cluster_6 { + color=blue + 20 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_7 { + color=blue + 22 [label="Enter block"]; + 23 [label="Const: Int(1)"]; + 24 [label="Assignment: R|/x|"]; + 25 [label="Exit block"]; + } + 21 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 15 [label="Postponed exit from lambda"]; + 16 [label="Function call: R|/inlineRun|(...)"]; + 17 [label="Access variable R|/x|"]; + 18 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 19 [label="Exit block"]; } - 22 [label="Postponed exit from lambda"]; - 23 [label="Function call: R|/myRun|(...)"]; - 24 [label="Access variable R|/x|"]; - 25 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; - 19 [label="Exit function test_2" style="filled" fillcolor=red]; + 11 [label="Exit function test_1" style="filled" fillcolor=red]; } - 18 -> {20}; - 20 -> {21}; - 21 -> {26}; - 21 -> {22} [color=red]; + 10 -> {12}; + 12 -> {13}; + 13 -> {14}; + 14 -> {20}; + 14 -> {15} [color=red]; + 15 -> {16}; + 16 -> {17}; + 17 -> {18}; + 18 -> {19}; + 19 -> {11}; + 20 -> {21 22}; + 21 -> {15} [color=green]; + 21 -> {20} [color=green style=dashed]; 22 -> {23}; 23 -> {24}; 24 -> {25}; - 25 -> {19}; - 26 -> {27 28}; - 27 -> {22} [color=green]; - 27 -> {26} [color=green style=dashed]; + 25 -> {21}; + + subgraph cluster_8 { + color=red + 26 [label="Enter function test_2" style="filled" fillcolor=red]; + subgraph cluster_9 { + color=blue + 28 [label="Enter block"]; + 29 [label="Variable declaration: lval x: R|kotlin/Int|"]; + 30 [label="Postponed enter to lambda"]; + subgraph cluster_10 { + color=blue + 36 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_11 { + color=blue + 38 [label="Enter block"]; + 39 [label="Const: Int(1)"]; + 40 [label="Assignment: R|/x|"]; + 41 [label="Exit block"]; + } + 37 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 31 [label="Postponed exit from lambda"]; + 32 [label="Function call: R|/myRun|(...)"]; + 33 [label="Access variable R|/x|"]; + 34 [label="Function call: R|/x|.R|kotlin/Int.inc|()"]; + 35 [label="Exit block"]; + } + 27 [label="Exit function test_2" style="filled" fillcolor=red]; + } + 26 -> {28}; 28 -> {29}; - 29 -> {27}; + 29 -> {30}; + 30 -> {36}; + 30 -> {31} [color=red]; + 31 -> {32}; + 32 -> {33}; + 33 -> {34}; + 34 -> {35}; + 35 -> {27}; + 36 -> {37 38}; + 37 -> {31} [color=green]; + 37 -> {36} [color=green style=dashed]; + 38 -> {39}; + 39 -> {40}; + 40 -> {41}; + 41 -> {37}; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot index 911cb02ce84..7ddd7421294 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot @@ -14,176 +14,225 @@ digraph delegateWithAnonymousObject_kt { subgraph cluster_1 { color=red - 3 [label="Enter class DelegateProvider" style="filled" fillcolor=red]; - 4 [label="Exit class DelegateProvider" style="filled" fillcolor=red]; + 4 [label="Enter class DelegateProvider" style="filled" fillcolor=red]; + 3 [label="Exit class DelegateProvider" style="filled" fillcolor=red]; } - 3 -> {4} [color=green]; + 4 -> {3} [color=green]; subgraph cluster_2 { color=red 5 [label="Enter function delegate" style="filled" fillcolor=red]; - 7 [label="Const: Null(null)"]; - 8 [label="Check not null: Null(null)!!"]; - 9 [label="Jump: ^delegate Null(null)!!"]; - 10 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_3 { + color=blue + 7 [label="Enter block"]; + 8 [label="Const: Null(null)"]; + 9 [label="Check not null: Null(null)!!"]; + 10 [label="Jump: ^delegate Null(null)!!"]; + 11 [label="Stub" style="filled" fillcolor=gray]; + 12 [label="Exit block" style="filled" fillcolor=gray]; + } 6 [label="Exit function delegate" style="filled" fillcolor=red]; } 5 -> {7}; 7 -> {8}; 8 -> {9}; - 9 -> {6}; - 9 -> {10} [style=dotted]; - 10 -> {6} [style=dotted]; - - subgraph cluster_3 { - color=red - 11 [label="Enter function " style="filled" fillcolor=red]; - 13 [label="Delegated constructor call: super|>()"]; - 12 [label="Exit function " style="filled" fillcolor=red]; - } - 11 -> {13}; - 13 -> {12}; + 9 -> {10}; + 10 -> {6}; + 10 -> {11} [style=dotted]; + 11 -> {12} [style=dotted]; + 12 -> {6} [style=dotted]; subgraph cluster_4 { color=red - 14 [label="Enter function updateFrom" style="filled" fillcolor=red]; - 15 [label="Exit function updateFrom" style="filled" fillcolor=red]; + 13 [label="Enter function " style="filled" fillcolor=red]; + 15 [label="Delegated constructor call: super|>()"]; + 14 [label="Exit function " style="filled" fillcolor=red]; } - 14 -> {15}; + 13 -> {15}; + 15 -> {14}; subgraph cluster_5 { color=red - 16 [label="Enter class IssueListView" style="filled" fillcolor=red]; - 17 [label="Exit class IssueListView" style="filled" fillcolor=red]; + 16 [label="Enter function updateFrom" style="filled" fillcolor=red]; + subgraph cluster_6 { + color=blue + 18 [label="Enter block"]; + 19 [label="Exit block"]; + } + 17 [label="Exit function updateFrom" style="filled" fillcolor=red]; } - 16 -> {17} [color=green]; - - subgraph cluster_6 { - color=red - 18 [label="Enter function " style="filled" fillcolor=red]; - 20 [label="Delegated constructor call: super|>()"]; - 19 [label="Exit function " style="filled" fillcolor=red]; - } - 18 -> {20}; - 20 -> {19}; + 16 -> {18}; + 18 -> {19}; + 19 -> {17}; subgraph cluster_7 { color=red - 24 [label="Enter function " style="filled" fillcolor=red]; - 26 [label="Delegated constructor call: super()"]; - 25 [label="Exit function " style="filled" fillcolor=red]; + 21 [label="Enter class IssueListView" style="filled" fillcolor=red]; + 20 [label="Exit class IssueListView" style="filled" fillcolor=red]; } - 24 -> {26}; - 26 -> {25}; + 21 -> {20} [color=green]; subgraph cluster_8 { color=red - 27 [label="Enter function getValue" style="filled" fillcolor=red]; - 29 [label="Function call: R|/IssueListView.IssueListView|()"]; - 30 [label="Jump: ^getValue R|/IssueListView.IssueListView|()"]; - 31 [label="Stub" style="filled" fillcolor=gray]; - 28 [label="Exit function getValue" style="filled" fillcolor=red]; + 22 [label="Enter function " style="filled" fillcolor=red]; + 24 [label="Delegated constructor call: super|>()"]; + 23 [label="Exit function " style="filled" fillcolor=red]; } - 27 -> {29}; - 29 -> {30}; - 30 -> {28}; - 30 -> {31} [style=dotted]; - 31 -> {28} [style=dotted]; + 22 -> {24}; + 24 -> {23}; subgraph cluster_9 { color=red - 32 [label="Enter function setValue" style="filled" fillcolor=red]; - 34 [label="Function call: R|/IssueListView.IssueListView|()"]; - 35 [label="Access variable R|/value|"]; - 36 [label="Function call: R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(...)"]; - 37 [label="Jump: ^setValue R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(R|/value|)"]; - 38 [label="Stub" style="filled" fillcolor=gray]; - 33 [label="Exit function setValue" style="filled" fillcolor=red]; + 32 [label="Enter function " style="filled" fillcolor=red]; + 34 [label="Delegated constructor call: super()"]; + 33 [label="Exit function " style="filled" fillcolor=red]; } 32 -> {34}; - 34 -> {35}; - 35 -> {36}; - 36 -> {37}; - 37 -> {33}; - 37 -> {38} [style=dotted]; - 38 -> {33} [style=dotted]; + 34 -> {33}; subgraph cluster_10 { color=red - 39 [label="Enter class " style="filled" fillcolor=red]; - 40 [label="Exit class " style="filled" fillcolor=red]; - } - 39 -> {40} [color=green]; - - subgraph cluster_11 { - color=red - 64 [label="Enter class IssuesListUserProfile" style="filled" fillcolor=red]; - subgraph cluster_12 { + 35 [label="Enter function getValue" style="filled" fillcolor=red]; + subgraph cluster_11 { color=blue - 48 [label="Enter function setter" style="filled" fillcolor=red]; - 50 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 51 [label="Access variable this@R|/IssuesListUserProfile|"]; - 52 [label="Access variable R|/issueListView|"]; - 53 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; - 49 [label="Exit function setter" style="filled" fillcolor=red]; + 37 [label="Enter block"]; + 38 [label="Function call: R|/IssueListView.IssueListView|()"]; + 39 [label="Jump: ^getValue R|/IssueListView.IssueListView|()"]; + 40 [label="Stub" style="filled" fillcolor=gray]; + 41 [label="Exit block" style="filled" fillcolor=gray]; } + 36 [label="Exit function getValue" style="filled" fillcolor=red]; + } + 35 -> {37}; + 37 -> {38}; + 38 -> {39}; + 39 -> {36}; + 39 -> {40} [style=dotted]; + 40 -> {41} [style=dotted]; + 41 -> {36} [style=dotted]; + + subgraph cluster_12 { + color=red + 42 [label="Enter function setValue" style="filled" fillcolor=red]; subgraph cluster_13 { color=blue - 41 [label="Enter function getter" style="filled" fillcolor=red]; - 43 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 44 [label="Access variable this@R|/IssuesListUserProfile|"]; - 45 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; - 46 [label="Jump: ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; - 47 [label="Stub" style="filled" fillcolor=gray]; - 42 [label="Exit function getter" style="filled" fillcolor=red]; + 44 [label="Enter block"]; + 45 [label="Function call: R|/IssueListView.IssueListView|()"]; + 46 [label="Access variable R|/value|"]; + 47 [label="Function call: R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(...)"]; + 48 [label="Jump: ^setValue R|/IssueListView.IssueListView|().R|/IssueListView.updateFrom|(R|/value|)"]; + 49 [label="Stub" style="filled" fillcolor=gray]; + 50 [label="Exit block" style="filled" fillcolor=gray]; } - subgraph cluster_14 { - color=blue - 54 [label="Enter property" style="filled" fillcolor=red]; - 56 [label="Postponed enter to lambda"]; - 57 [label="Postponed exit from lambda"]; - 58 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; - 59 [label="Access variable this@R|/IssuesListUserProfile|"]; - 60 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...).#(...)"]; - 61 [label="Postponed enter to lambda"]; - subgraph cluster_15 { - color=blue - 21 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 23 [label="Exit anonymous object"]; - 22 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 62 [label="Postponed exit from lambda"]; - 63 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; - 55 [label="Exit property" style="filled" fillcolor=red]; - } - 65 [label="Exit class IssuesListUserProfile" style="filled" fillcolor=red]; + 43 [label="Exit function setValue" style="filled" fillcolor=red]; } - 64 -> {54} [color=green]; - 54 -> {56}; - 55 -> {65} [color=green]; - 56 -> {57}; - 57 -> {58}; - 58 -> {59}; - 59 -> {60}; - 60 -> {61}; - 61 -> {62}; - 61 -> {21} [color=red]; - 62 -> {63}; - 63 -> {55}; - 21 -> {23}; - 21 -> {24 27 32} [color=red]; - 23 -> {22}; - 41 -> {43}; - 43 -> {44}; + 42 -> {44}; 44 -> {45}; 45 -> {46}; - 46 -> {42}; - 46 -> {47} [style=dotted]; - 47 -> {42} [style=dotted]; - 48 -> {50}; - 50 -> {51}; - 51 -> {52}; - 52 -> {53}; - 53 -> {49}; + 46 -> {47}; + 47 -> {48}; + 48 -> {43}; + 48 -> {49} [style=dotted]; + 49 -> {50} [style=dotted]; + 50 -> {43} [style=dotted]; + + subgraph cluster_14 { + color=red + 51 [label="Enter function getter" style="filled" fillcolor=red]; + subgraph cluster_15 { + color=blue + 53 [label="Enter block"]; + 54 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; + 55 [label="Access variable this@R|/IssuesListUserProfile|"]; + 56 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; + 57 [label="Jump: ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; + 58 [label="Stub" style="filled" fillcolor=gray]; + 59 [label="Exit block" style="filled" fillcolor=gray]; + } + 52 [label="Exit function getter" style="filled" fillcolor=red]; + } + 51 -> {53}; + 53 -> {54}; + 54 -> {55}; + 55 -> {56}; + 56 -> {57}; + 57 -> {52}; + 57 -> {58} [style=dotted]; + 58 -> {59} [style=dotted]; + 59 -> {52} [style=dotted]; + + subgraph cluster_16 { + color=red + 60 [label="Enter function setter" style="filled" fillcolor=red]; + subgraph cluster_17 { + color=blue + 62 [label="Enter block"]; + 63 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; + 64 [label="Access variable this@R|/IssuesListUserProfile|"]; + 65 [label="Access variable R|/issueListView|"]; + 66 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|FakeOverride|(...)"]; + 67 [label="Exit block"]; + } + 61 [label="Exit function setter" style="filled" fillcolor=red]; + } + 60 -> {62}; + 62 -> {63}; + 63 -> {64}; + 64 -> {65}; + 65 -> {66}; + 66 -> {67}; + 67 -> {61}; + + subgraph cluster_18 { + color=red + 79 [label="Enter class IssuesListUserProfile" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 31 [label="Enter class " style="filled" fillcolor=red]; + 30 [label="Exit class " style="filled" fillcolor=red]; + } + subgraph cluster_20 { + color=blue + 68 [label="Enter property" style="filled" fillcolor=red]; + 70 [label="Postponed enter to lambda"]; + 71 [label="Postponed exit from lambda"]; + 72 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; + 73 [label="Access variable this@R|/IssuesListUserProfile|"]; + 74 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...).#(...)"]; + 75 [label="Postponed enter to lambda"]; + subgraph cluster_21 { + color=blue + 25 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_22 { + color=blue + 27 [label="Enter block"]; + 28 [label="Exit anonymous object"]; + 29 [label="Exit block"]; + } + 26 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 76 [label="Postponed exit from lambda"]; + 77 [label="Function call: this@R|/IssuesListUserProfile|.R|/delegate|(...)"]; + 69 [label="Exit property" style="filled" fillcolor=red]; + } + 78 [label="Exit class IssuesListUserProfile" style="filled" fillcolor=red]; + } + 79 -> {68} [color=green]; + 68 -> {70}; + 69 -> {78} [color=green]; + 70 -> {71}; + 71 -> {72}; + 72 -> {73}; + 73 -> {74}; + 74 -> {75}; + 75 -> {76 25}; + 76 -> {77}; + 77 -> {69}; + 25 -> {27}; + 27 -> {28}; + 27 -> {32 35 42} [color=red]; + 28 -> {29}; + 29 -> {26}; + 31 -> {30} [color=green]; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot index 76bb4209cd4..ecaa749c3cc 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/smartcasts/tryWithLambdaInside.dot @@ -6,63 +6,85 @@ digraph tryWithLambdaInside_kt { subgraph cluster_0 { color=red 0 [label="Enter function notInPlaceFilter" style="filled" fillcolor=red]; - 2 [label="Access variable this@R|/notInPlaceFilter|"]; - 3 [label="Jump: ^notInPlaceFilter this@R|/notInPlaceFilter|"]; - 4 [label="Stub" style="filled" fillcolor=gray]; + subgraph cluster_1 { + color=blue + 2 [label="Enter block"]; + 3 [label="Access variable this@R|/notInPlaceFilter|"]; + 4 [label="Jump: ^notInPlaceFilter this@R|/notInPlaceFilter|"]; + 5 [label="Stub" style="filled" fillcolor=gray]; + 6 [label="Exit block" style="filled" fillcolor=gray]; + } 1 [label="Exit function notInPlaceFilter" style="filled" fillcolor=red]; } 0 -> {2}; 2 -> {3}; - 3 -> {1}; - 3 -> {4} [style=dotted]; - 4 -> {1} [style=dotted]; - - subgraph cluster_1 { - color=red - 5 [label="Enter function foo" style="filled" fillcolor=red]; - 6 [label="Exit function foo" style="filled" fillcolor=red]; - } - 5 -> {6}; + 3 -> {4}; + 4 -> {1}; + 4 -> {5} [style=dotted]; + 5 -> {6} [style=dotted]; + 6 -> {1} [style=dotted]; subgraph cluster_2 { color=red - 7 [label="Enter function testInPlace" style="filled" fillcolor=red]; + 7 [label="Enter function foo" style="filled" fillcolor=red]; subgraph cluster_3 { color=blue - 9 [label="Try expression enter"]; - subgraph cluster_4 { - color=blue - 11 [label="Try main block enter"]; - subgraph cluster_5 { - color=blue - 13 [label="Enter block"]; - 14 [label="Access variable R|/list|"]; - 15 [label="Postponed enter to lambda"]; - subgraph cluster_6 { - color=blue - 25 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 27 [label="Access variable R|/it|"]; - 26 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 16 [label="Postponed exit from lambda"]; - 17 [label="Function call: R|/list|.R|kotlin/collections/filter|(...)"]; - 18 [label="Exit block"]; - } - 19 [label="Try main block exit"]; - } - subgraph cluster_7 { - color=blue - 12 [label="Enter finally"]; - subgraph cluster_8 { - color=blue - 20 [label="Enter block"]; - 21 [label="Exit block"]; - } - 22 [label="Exit finally"]; - } - 10 [label="Try expression exit"]; + 9 [label="Enter block"]; + 10 [label="Exit block"]; } - 23 [label="Jump: ^testInPlace try { + 8 [label="Exit function foo" style="filled" fillcolor=red]; + } + 7 -> {9}; + 9 -> {10}; + 10 -> {8}; + + subgraph cluster_4 { + color=red + 11 [label="Enter function testInPlace" style="filled" fillcolor=red]; + subgraph cluster_5 { + color=blue + 13 [label="Enter block"]; + subgraph cluster_6 { + color=blue + 14 [label="Try expression enter"]; + subgraph cluster_7 { + color=blue + 16 [label="Try main block enter"]; + subgraph cluster_8 { + color=blue + 18 [label="Enter block"]; + 19 [label="Access variable R|/list|"]; + 20 [label="Postponed enter to lambda"]; + subgraph cluster_9 { + color=blue + 31 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_10 { + color=blue + 33 [label="Enter block"]; + 34 [label="Access variable R|/it|"]; + 35 [label="Exit block"]; + } + 32 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 21 [label="Postponed exit from lambda"]; + 22 [label="Function call: R|/list|.R|kotlin/collections/filter|(...)"]; + 23 [label="Exit block"]; + } + 24 [label="Try main block exit"]; + } + subgraph cluster_11 { + color=blue + 17 [label="Enter finally"]; + subgraph cluster_12 { + color=blue + 25 [label="Enter block"]; + 26 [label="Exit block"]; + } + 27 [label="Exit finally"]; + } + 15 [label="Try expression exit"]; + } + 28 [label="Jump: ^testInPlace try { R|/list|.R|kotlin/collections/filter|( = filter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { ^ R|/it| } @@ -71,72 +93,86 @@ digraph tryWithLambdaInside_kt { finally { } "]; - 24 [label="Stub" style="filled" fillcolor=gray]; - 8 [label="Exit function testInPlace" style="filled" fillcolor=red]; - } - 7 -> {9}; - 9 -> {11}; - 10 -> {23}; - 11 -> {8 12 13}; - 12 -> {20}; - 13 -> {14}; - 14 -> {15}; - 15 -> {25}; - 15 -> {16} [color=red]; - 16 -> {17}; - 17 -> {18}; - 18 -> {19}; - 19 -> {10}; - 20 -> {21}; - 21 -> {22}; - 22 -> {10}; - 23 -> {8}; - 23 -> {24} [style=dotted]; - 24 -> {8} [style=dotted]; - 25 -> {26 27}; - 26 -> {16} [color=green]; - 26 -> {25} [color=green style=dashed]; - 27 -> {26}; - - subgraph cluster_9 { - color=red - 28 [label="Enter function testNotInPlace" style="filled" fillcolor=red]; - subgraph cluster_10 { - color=blue - 30 [label="Try expression enter"]; - subgraph cluster_11 { - color=blue - 32 [label="Try main block enter"]; - subgraph cluster_12 { - color=blue - 34 [label="Enter block"]; - 35 [label="Access variable R|/list|"]; - 36 [label="Postponed enter to lambda"]; - subgraph cluster_13 { - color=blue - 46 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; - 48 [label="Access variable R|/it|"]; - 47 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; - } - 37 [label="Postponed exit from lambda"]; - 38 [label="Function call: R|/list|.R|/notInPlaceFilter|(...)"]; - 39 [label="Exit block"]; - } - 40 [label="Try main block exit"]; - } - subgraph cluster_14 { - color=blue - 33 [label="Enter finally"]; - subgraph cluster_15 { - color=blue - 41 [label="Enter block"]; - 42 [label="Exit block"]; - } - 43 [label="Exit finally"]; - } - 31 [label="Try expression exit"]; + 29 [label="Stub" style="filled" fillcolor=gray]; + 30 [label="Exit block" style="filled" fillcolor=gray]; } - 44 [label="Jump: ^testNotInPlace try { + 12 [label="Exit function testInPlace" style="filled" fillcolor=red]; + } + 11 -> {13}; + 13 -> {14}; + 14 -> {16}; + 15 -> {28}; + 16 -> {12 17 18}; + 17 -> {25}; + 18 -> {19}; + 19 -> {20}; + 20 -> {31}; + 20 -> {21} [color=red]; + 21 -> {22}; + 22 -> {23}; + 23 -> {24}; + 24 -> {15}; + 25 -> {26}; + 26 -> {27}; + 27 -> {15}; + 28 -> {12}; + 28 -> {29} [style=dotted]; + 29 -> {30} [style=dotted]; + 30 -> {12} [style=dotted]; + 31 -> {32 33}; + 32 -> {21} [color=green]; + 32 -> {31} [color=green style=dashed]; + 33 -> {34}; + 34 -> {35}; + 35 -> {32}; + + subgraph cluster_13 { + color=red + 36 [label="Enter function testNotInPlace" style="filled" fillcolor=red]; + subgraph cluster_14 { + color=blue + 38 [label="Enter block"]; + subgraph cluster_15 { + color=blue + 39 [label="Try expression enter"]; + subgraph cluster_16 { + color=blue + 41 [label="Try main block enter"]; + subgraph cluster_17 { + color=blue + 43 [label="Enter block"]; + 44 [label="Access variable R|/list|"]; + 45 [label="Postponed enter to lambda"]; + subgraph cluster_18 { + color=blue + 56 [label="Enter function anonymousFunction" style="filled" fillcolor=red]; + subgraph cluster_19 { + color=blue + 58 [label="Enter block"]; + 59 [label="Access variable R|/it|"]; + 60 [label="Exit block"]; + } + 57 [label="Exit function anonymousFunction" style="filled" fillcolor=red]; + } + 46 [label="Postponed exit from lambda"]; + 47 [label="Function call: R|/list|.R|/notInPlaceFilter|(...)"]; + 48 [label="Exit block"]; + } + 49 [label="Try main block exit"]; + } + subgraph cluster_20 { + color=blue + 42 [label="Enter finally"]; + subgraph cluster_21 { + color=blue + 50 [label="Enter block"]; + 51 [label="Exit block"]; + } + 52 [label="Exit finally"]; + } + 40 [label="Try expression exit"]; + } + 53 [label="Jump: ^testNotInPlace try { R|/list|.R|/notInPlaceFilter|( = notInPlaceFilter@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { ^ R|/it| } @@ -145,29 +181,34 @@ finally { finally { } "]; - 45 [label="Stub" style="filled" fillcolor=gray]; - 29 [label="Exit function testNotInPlace" style="filled" fillcolor=red]; + 54 [label="Stub" style="filled" fillcolor=gray]; + 55 [label="Exit block" style="filled" fillcolor=gray]; + } + 37 [label="Exit function testNotInPlace" style="filled" fillcolor=red]; } - 28 -> {30}; - 30 -> {32}; - 31 -> {44}; - 32 -> {29 33 34}; - 33 -> {41}; - 34 -> {35}; - 35 -> {36}; - 36 -> {37}; - 36 -> {46} [color=red]; - 37 -> {38}; + 36 -> {38}; 38 -> {39}; - 39 -> {40}; - 40 -> {31}; - 41 -> {42}; - 42 -> {43}; - 43 -> {31}; - 44 -> {29}; - 44 -> {45} [style=dotted]; - 45 -> {29} [style=dotted]; - 46 -> {48}; - 48 -> {47}; + 39 -> {41}; + 40 -> {53}; + 41 -> {37 42 43}; + 42 -> {50}; + 43 -> {44}; + 44 -> {45}; + 45 -> {46 56}; + 46 -> {47}; + 47 -> {48}; + 48 -> {49}; + 49 -> {40}; + 50 -> {51}; + 51 -> {52}; + 52 -> {40}; + 53 -> {37}; + 53 -> {54} [style=dotted]; + 54 -> {55} [style=dotted]; + 55 -> {37} [style=dotted]; + 56 -> {58}; + 58 -> {59}; + 59 -> {60}; + 60 -> {57}; } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index 1ff00f38da9..4091d9e6c9d 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -682,6 +682,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/analysis-tests/testData/resolve/cfg/complex.kt"); } + @TestMetadata("defaultArguments.kt") + public void testDefaultArguments() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.kt"); + } + @TestMetadata("emptyWhen.kt") public void testEmptyWhen() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.kt"); diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index 04d99918a96..60607ad68ce 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -682,6 +682,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/cfg/complex.kt"); } + @TestMetadata("defaultArguments.kt") + public void testDefaultArguments() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/cfg/defaultArguments.kt"); + } + @TestMetadata("emptyWhen.kt") public void testEmptyWhen() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/cfg/emptyWhen.kt"); 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 0ca41bf644f..143e51942cb 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 @@ -137,11 +137,18 @@ abstract class FirDataFlowAnalyzer( // ----------------------------------- Named function ----------------------------------- fun enterFunction(function: FirFunction<*>) { + if (function is FirAnonymousFunction) { + enterAnonymousFunction(function) + return + } val (functionEnterNode, previousNode) = graphBuilder.enterFunction(function) functionEnterNode.mergeIncomingFlow(shouldForkFlow = previousNode != null) } fun exitFunction(function: FirFunction<*>): ControlFlowGraph { + if (function is FirAnonymousFunction) { + return exitAnonymousFunction(function) + } val (node, graph) = graphBuilder.exitFunction(function) node.mergeIncomingFlow() if (!graphBuilder.isTopLevel()) { @@ -159,6 +166,21 @@ abstract class FirDataFlowAnalyzer( // ----------------------------------- Anonymous function ----------------------------------- + private fun enterAnonymousFunction(anonymousFunction: FirAnonymousFunction) { + val (postponedLambdaEnterNode, functionEnterNode) = graphBuilder.enterAnonymousFunction(anonymousFunction) + // TODO: questionable + postponedLambdaEnterNode?.mergeIncomingFlow() + functionEnterNode.mergeIncomingFlow() + } + + private fun exitAnonymousFunction(anonymousFunction: FirAnonymousFunction): ControlFlowGraph { + val (functionExitNode, postponedLambdaExitNode, graph) = graphBuilder.exitAnonymousFunction(anonymousFunction) + // TODO: questionable + postponedLambdaExitNode?.mergeIncomingFlow() + functionExitNode.mergeIncomingFlow() + return graph + } + fun visitPostponedAnonymousFunction(anonymousFunction: FirAnonymousFunction) { val (enterNode, exitNode) = graphBuilder.visitPostponedAnonymousFunction(anonymousFunction) enterNode.mergeIncomingFlow() @@ -193,14 +215,26 @@ abstract class FirDataFlowAnalyzer( return controlFlowGraph } + // ----------------------------------- Value parameters (and it's defaults) ----------------------------------- + + fun enterValueParameter(valueParameter: FirValueParameter) { + graphBuilder.enterValueParameter(valueParameter)?.mergeIncomingFlow(shouldForkFlow = true) + } + + fun exitValueParameter(valueParameter: FirValueParameter): ControlFlowGraph? { + val (node, graph) = graphBuilder.exitValueParameter(valueParameter) ?: return null + node.mergeIncomingFlow() + return graph + } + // ----------------------------------- Property ----------------------------------- fun enterProperty(property: FirProperty) { - graphBuilder.enterProperty(property).mergeIncomingFlow() + graphBuilder.enterProperty(property)?.mergeIncomingFlow() } - fun exitProperty(property: FirProperty): ControlFlowGraph { - val (node, graph) = graphBuilder.exitProperty(property) + fun exitProperty(property: FirProperty): ControlFlowGraph? { + val (node, graph) = graphBuilder.exitProperty(property) ?: return null node.mergeIncomingFlow() return graph } @@ -218,7 +252,7 @@ abstract class FirDataFlowAnalyzer( // ----------------------------------- Block ----------------------------------- fun enterBlock(block: FirBlock) { - graphBuilder.enterBlock(block)?.mergeIncomingFlow() + graphBuilder.enterBlock(block).mergeIncomingFlow() } fun exitBlock(block: FirBlock) { @@ -997,7 +1031,7 @@ abstract class FirDataFlowAnalyzer( shouldForkFlow: Boolean = false ): T = this.also { node -> val previousFlows = if (node.isDead) - node.previousNodes.map { it.flow } + node.previousNodes.mapNotNull { runIf(!node.incomingEdges.getValue(it).isBack) { it.flow } } else node.previousNodes.mapNotNull { prev -> prev.takeIf { node.incomingEdges.getValue(it).usedInDfa }?.flow } var flow = logicSystem.joinFlow(previousFlows) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/Stack.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/Stack.kt index 43dfdfd8005..0c6e749643e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/Stack.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/Stack.kt @@ -22,6 +22,7 @@ fun stackOf(vararg values: T): Stack = StackImpl(*values) val Stack<*>.isEmpty: Boolean get() = size == 0 val Stack<*>.isNotEmpty: Boolean get() = size != 0 fun Stack.topOrNull(): T? = if (size == 0) null else top() +fun Stack.popOrNull(): T? = if (size == 0) null else pop() private class StackImpl(vararg values: T) : Stack() { private val stack = mutableListOf(*values) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt index acecbe50f77..9507d5a7a54 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNode.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.resolve.dfa.runIf import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor @@ -19,28 +20,21 @@ sealed class CFGNode(val owner: ControlFlowGraph, val level: internal fun addEdge(from: CFGNode<*>, to: CFGNode<*>, kind: EdgeKind, propagateDeadness: Boolean) { from._followingNodes += to to._previousNodes += from - addJustKindEdge(from, to, kind, propagateDeadness) - } - - private fun merge(first: EdgeKind, second: EdgeKind?): EdgeKind? { - return when (second) { - null, EdgeKind.Simple, first -> first - EdgeKind.Dead -> second - // Note: first can be only Cfg, Dfg, or Dead - else -> when (first) { - EdgeKind.Cfg -> if (second == EdgeKind.Dfg) null else first - EdgeKind.Dfg -> if (second == EdgeKind.Cfg) null else first - else -> first - } - } + addJustKindEdge(from, to, kind, propagateDeadness, edgeExists = false) } internal fun addJustKindEdge(from: CFGNode<*>, to: CFGNode<*>, kind: EdgeKind, propagateDeadness: Boolean) { + addJustKindEdge(from, to, kind, propagateDeadness, edgeExists = true) + } + + private fun addJustKindEdge(from: CFGNode<*>, to: CFGNode<*>, kind: EdgeKind, propagateDeadness: Boolean, edgeExists: Boolean) { if (kind != EdgeKind.Simple) { - merge(kind, from._outgoingEdges[to])?.let { + val fromToKind = from._outgoingEdges[to] ?: runIf(edgeExists) { EdgeKind.Simple } + merge(kind, fromToKind)?.let { from._outgoingEdges[to] = it } ?: from._outgoingEdges.remove(to) - merge(kind, to._incomingEdges[from])?.let { + val toFromKind = to._incomingEdges[from] ?: runIf(edgeExists) { EdgeKind.Simple } + merge(kind, toFromKind)?.let { to._incomingEdges[from] = it } ?: to._incomingEdges.remove(from) } @@ -49,6 +43,18 @@ sealed class CFGNode(val owner: ControlFlowGraph, val level: } } + private fun merge(first: EdgeKind, second: EdgeKind?): EdgeKind? { + return when { + second == null -> first + first == second -> first + first == EdgeKind.Dead || second == EdgeKind.Dead -> EdgeKind.Dead + first == EdgeKind.DeadBack || second == EdgeKind.DeadBack -> EdgeKind.DeadBack + first == EdgeKind.Simple || second == EdgeKind.Simple -> null + first.usedInDfa xor second.usedInDfa -> null + else -> throw IllegalStateException() + } + } + internal fun removeAllIncomingEdges(to: CFGNode<*>) { for (from in to._previousNodes) { from._followingNodes.remove(to) @@ -128,6 +134,28 @@ class FunctionExitNode(owner: ControlFlowGraph, override val fir: FirFunction<*> } } +// ----------------------------------- Default arguments ----------------------------------- + +class EnterDefaultArgumentsNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNode(owner, level, id), EnterNodeMarker { + init { + owner.enterNode = this + } + + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { + return visitor.visitEnterDefaultArgumentsNode(this, data) + } +} + +class ExitDefaultArgumentsNode(owner: ControlFlowGraph, override val fir: FirValueParameter, level: Int, id: Int) : CFGNode(owner, level, id), ExitNodeMarker { + init { + owner.exitNode = this + } + + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { + return visitor.visitExitDefaultArgumentsNode(this, data) + } +} + // ----------------------------------- Anonymous function ----------------------------------- class PostponedLambdaEnterNode(owner: ControlFlowGraph, override val fir: FirAnonymousFunction, level: Int, id: Int) : CFGNode(owner, level, id) { @@ -149,12 +177,20 @@ class UnionFunctionCallArgumentsNode(owner: ControlFlowGraph, override val fir: // ----------------------------------- Classes ----------------------------------- class ClassEnterNode(owner: ControlFlowGraph, override val fir: FirClass<*>, level: Int, id: Int) : CFGNode>(owner, level, id), EnterNodeMarker { + init { + owner.enterNode = this + } + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitClassEnterNode(this, data) } } class ClassExitNode(owner: ControlFlowGraph, override val fir: FirClass<*>, level: Int, id: Int) : CFGNode>(owner, level, id), ExitNodeMarker { + init { + owner.exitNode = this + } + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitClassExitNode(this, data) } @@ -175,11 +211,19 @@ class AnonymousObjectExitNode(owner: ControlFlowGraph, override val fir: FirAnon // ----------------------------------- Property ----------------------------------- class PropertyInitializerEnterNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int, id: Int) : CFGNode(owner, level, id), EnterNodeMarker { + init { + owner.enterNode = this + } + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitPropertyInitializerEnterNode(this, data) } } class PropertyInitializerExitNode(owner: ControlFlowGraph, override val fir: FirProperty, level: Int, id: Int) : CFGNode(owner, level, id), ExitNodeMarker { + init { + owner.exitNode = this + } + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitPropertyInitializerExitNode(this, data) } @@ -188,11 +232,19 @@ class PropertyInitializerExitNode(owner: ControlFlowGraph, override val fir: Fir // ----------------------------------- Init ----------------------------------- class InitBlockEnterNode(owner: ControlFlowGraph, override val fir: FirAnonymousInitializer, level: Int, id: Int) : CFGNode(owner, level, id), EnterNodeMarker { + init { + owner.enterNode = this + } + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitInitBlockEnterNode(this, data) } } class InitBlockExitNode(owner: ControlFlowGraph, override val fir: FirAnonymousInitializer, level: Int, id: Int) : CFGNode(owner, level, id), ExitNodeMarker { + init { + owner.exitNode = this + } + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitInitBlockExitNode(this, data) } @@ -395,11 +447,13 @@ class TypeOperatorCallNode(owner: ControlFlowGraph, override val fir: FirTypeOpe return visitor.visitTypeOperatorCallNode(this, data) } } + class OperatorCallNode(owner: ControlFlowGraph, override val fir: FirOperatorCall, level: Int, id: Int) : AbstractBinaryExitNode(owner, level, id) { override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitOperatorCallNode(this, data) } } + class ComparisonExpressionNode(owner: ControlFlowGraph, override val fir: FirComparisonExpression, level: Int, id: Int) : CFGNode(owner, level, id) { override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitComparisonExpressionNode(this, data) @@ -493,6 +547,10 @@ class StubNode(owner: ControlFlowGraph, level: Int, id: Int) : CFGNode( } class ContractDescriptionEnterNode(owner: ControlFlowGraph, level: Int, id: Int) : CFGNode(owner, level, id) { + init { + owner.enterNode = this + } + override val fir: FirStub = FirStub override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitContractDescriptionEnterNode(this, data) @@ -538,11 +596,19 @@ class ExitSafeCallNode(owner: ControlFlowGraph, override val fir: FirSafeCallExp // ----------------------------------- Other ----------------------------------- class AnnotationEnterNode(owner: ControlFlowGraph, override val fir: FirAnnotationCall, level: Int, id: Int) : CFGNode(owner, level, id), EnterNodeMarker { + init { + owner.enterNode = this + } + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitAnnotationEnterNode(this, data) } } class AnnotationExitNode(owner: ControlFlowGraph, override val fir: FirAnnotationCall, level: Int, id: Int) : CFGNode(owner, level, id), ExitNodeMarker { + init { + owner.exitNode = this + } + override fun accept(visitor: ControlFlowGraphVisitor, data: D): R { return visitor.visitAnnotationExitNode(this, data) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt index d4b2795d1a2..37d0a367c1a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/CFGNodeRenderer.kt @@ -107,6 +107,9 @@ fun CFGNode<*>.render(): String = is ContractDescriptionEnterNode -> "Enter contract description" is AbstractBinaryExitNode -> throw IllegalStateException() + + is EnterDefaultArgumentsNode -> "Enter default value of ${fir.name}" + is ExitDefaultArgumentsNode -> "Exit default value of ${fir.name}" }, ) } 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 a68e4dd8b5e..414db34cdf8 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 @@ -64,8 +64,14 @@ class ControlFlowGraph(val declaration: FirDeclaration?, val name: String, val k Completed; } - enum class Kind { - Function, ClassInitializer, TopLevel + enum class Kind(val withBody: Boolean) { + Function(withBody = true), + AnonymousFunction(withBody = true), + ClassInitializer(withBody = true), + PropertyInitializer(withBody = true), + TopLevel(withBody = false), + AnnotationCall(withBody = true), + DefaultArgument(withBody = false), } } 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 5852db61e2e..804db4f129b 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 @@ -20,168 +20,83 @@ import org.jetbrains.kotlin.fir.types.isNothing import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid import kotlin.random.Random +@RequiresOptIn +private annotation class CfgBuilderInternals + class ControlFlowGraphBuilder { + @CfgBuilderInternals private val graphs: Stack = stackOf(ControlFlowGraph(null, "", ControlFlowGraph.Kind.TopLevel)) - val graph: ControlFlowGraph get() = graphs.top() - private val lexicalScopes: Stack>> = stackOf(stackOf()) - private val lastNodes: Stack> get() = lexicalScopes.top() - val lastNode: CFGNode<*> get() = lastNodes.top() + @get:OptIn(CfgBuilderInternals::class) + val currentGraph: ControlFlowGraph + get() = graphs.top() - private val exitNodes: Stack> = stackOf() + private val lastNodes: Stack> = stackOf() + val lastNode: CFGNode<*> + get() = lastNodes.top() - private val functionEnterNodes: SymbolBasedNodeStorage, FunctionEnterNode> = SymbolBasedNodeStorage() - private val functionExitNodes: SymbolBasedNodeStorage, FunctionExitNode> = SymbolBasedNodeStorage() + var levelCounter: Int = 0 + private set - private val whenExitNodes: NodeStorage = NodeStorage() + private val modes: Stack = stackOf(Mode.TopLevel) + private val mode: Mode get() = modes.top() + + /* + * TODO: it's temporary hack for anonymous functions resolved twice in delegate expressions + * Example: val x: Boolean by lazy { true } + * + * Note that this hack breaks passing data flow from inplace lambdas inside lambdas of delegates: + * val x: Boolean by lazy { + * val b: Any = ... + * run { + * require(b is Boolean) + * } + * b // there will be no smartcast, but it should be + * } + */ + private val shouldPassFlowFromInplaceLambda: Stack = stackOf(true) + + private enum class Mode { + Function, DefaultArguments, TopLevel, Body, ClassInitializer, PropertyInitializer + } + + // ----------------------------------- Node caches ----------------------------------- + + private val exitTargetsForReturn: SymbolBasedNodeStorage, FunctionExitNode> = SymbolBasedNodeStorage() + private val exitTargetsForTry: Stack> = stackOf() + private val exitsOfAnonymousFunctions: MutableMap, FunctionExitNode> = mutableMapOf() + private val enterToLocalClassesMembers: MutableMap, CFGNode<*>?> = mutableMapOf() + + private val postponedLambdas: MutableSet> = mutableSetOf() + private val entersToPostponedAnonymousFunctions: MutableMap, PostponedLambdaEnterNode> = mutableMapOf() + private val exitsFromPostponedAnonymousFunctions: MutableMap, PostponedLambdaExitNode> = mutableMapOf() + private val parentGraphForAnonymousFunctions: MutableMap, ControlFlowGraph> = mutableMapOf() private val loopEnterNodes: NodeStorage> = NodeStorage() private val loopExitNodes: NodeStorage = NodeStorage() - private val tryExitNodes: NodeStorage = NodeStorage() - private val catchNodeStorages: Stack> = stackOf() - private val catchNodeStorage: NodeStorage get() = catchNodeStorages.top() + private val exitsFromCompletedPostponedAnonymousFunctions: MutableList = mutableListOf() + + private val whenExitNodes: NodeStorage = NodeStorage() private val binaryAndExitNodes: Stack = stackOf() private val binaryOrExitNodes: Stack = stackOf() - private val topLevelVariableInitializerExitNodes: Stack = stackOf() + private val tryExitNodes: NodeStorage = NodeStorage() + private val catchNodeStorages: Stack> = stackOf() + private val catchNodeStorage: NodeStorage get() = catchNodeStorages.top() + private val finallyEnterNodes: Stack = stackOf() private val initBlockExitNodes: Stack = stackOf() private val exitSafeCallNodes: Stack = stackOf() - private val blocksOfFunctions: MutableMap> = mutableMapOf() - private val exitsOfAnonymousFunctions: MutableMap = mutableMapOf() - - private val entersToPostponedAnonymousFunctions: MutableMap, PostponedLambdaEnterNode> = mutableMapOf() - private val exitsFromPostponedAnonymousFunctions: MutableMap, PostponedLambdaExitNode> = mutableMapOf() - private val parentGraphForAnonymousFunctions: MutableMap, ControlFlowGraph> = mutableMapOf() - - private val exitsFromCompletedPostponedAnonymousFunctions: MutableList = mutableListOf() - - private val enterToLocalClassesMembers: MutableMap, CFGNode<*>?> = mutableMapOf() - - var levelCounter: Int = 0 - private set + // ----------------------------------- API for node builders ----------------------------------- private var idCounter: Int = Random.nextInt() - private val shouldPassFlowFromInplaceLambda: Stack = stackOf(true) - fun createId(): Int = idCounter++ - fun isTopLevel(): Boolean = graphs.size == 1 - - // ----------------------------------- Named function ----------------------------------- - - /* - * Second argument of pair is not null only if function is local and it is a - * previous node before function declaration - */ - fun enterFunction(function: FirFunction<*>): Pair?> { - val name = when (function) { - is FirSimpleFunction -> function.name.asString() - is FirPropertyAccessor -> if (function.isGetter) "" else "" - is FirAnonymousFunction -> "" // TODO: add check to lambda or fun - is FirConstructor -> "" - else -> throw IllegalArgumentException("Unknown function: ${function.render()}") - } - val invocationKind = function.invocationKind - val isInplace = invocationKind.isInplace() - - val previousNode = entersToPostponedAnonymousFunctions[function.symbol] - ?: enterToLocalClassesMembers[function.symbol] - ?: if (!isInplace && function !is FirPropertyAccessor && graphs.topOrNull()?.let { it.kind == ControlFlowGraph.Kind.Function } == true) { - lastNodes.top() - } else { - null - } - - graphs.push(ControlFlowGraph(function, name, ControlFlowGraph.Kind.Function)) - - val enterNode = createFunctionEnterNode(function).also { - if (isInplace) { - val postponedEnterNode = entersToPostponedAnonymousFunctions[function.symbol] - if (postponedEnterNode != null) { - addEdge(postponedEnterNode, it) - lastNodes.push(it) - } else { - addNewSimpleNode(it) - } - } else { - lexicalScopes.push(stackOf()) - lastNodes.push(it) - } - } - - if (previousNode != null && !isInplace) { - addEdge(previousNode, enterNode, preferredKind = EdgeKind.Dfg) - } - val exitNode = createFunctionExitNode(function) - if (function is FirAnonymousFunction) { - exitsOfAnonymousFunctions[function] = exitNode - } - - @Suppress("NON_EXHAUSTIVE_WHEN") - when (invocationKind) { - InvocationKind.AT_MOST_ONCE, InvocationKind.UNKNOWN -> addEdge(enterNode, exitNode) - } - - functionExitNodes.push(exitNode) - if (!isInplace) { - exitNodes.push(exitNode) - } else { - functionEnterNodes.push(enterNode) - } - levelCounter++ - return enterNode to previousNode - } - - fun exitFunction(function: FirFunction<*>): Pair { - levelCounter-- - val exitNode = functionExitNodes.pop() - val invocationKind = function.invocationKind - val isInplace = invocationKind != null - if (!isInplace) { - exitNodes.pop() - } - val postponedEnterNode = entersToPostponedAnonymousFunctions.remove(function.symbol) - val postponedExitNode = exitsFromPostponedAnonymousFunctions.remove(function.symbol) - if (isInplace) { - val enterNode = functionEnterNodes.pop() - @Suppress("NON_EXHAUSTIVE_WHEN") - when (invocationKind) { - InvocationKind.AT_LEAST_ONCE, InvocationKind.UNKNOWN -> addBackEdge(exitNode, enterNode) - } - if (postponedExitNode != null) { - CFGNode.addEdge(lastNodes.pop(), postponedExitNode, propagateDeadness = true, kind = EdgeKind.Cfg) - if (invocationKind == InvocationKind.EXACTLY_ONCE && shouldPassFlowFromInplaceLambda.top()) { - exitsFromCompletedPostponedAnonymousFunctions += postponedExitNode - } - } - } else { - if (function.body == null) { - addEdge(lastNodes.pop(), exitNode) - } - if (postponedExitNode != null) { - requireNotNull(postponedEnterNode) - val kind = if (postponedEnterNode.isDead) EdgeKind.Dead else EdgeKind.Cfg - CFGNode.addJustKindEdge(postponedEnterNode, postponedExitNode, kind, propagateDeadness = true) - } - lexicalScopes.pop() - } - exitNode.updateDeadStatus() - val graph = graphs.pop().also { graph -> - exitsFromCompletedPostponedAnonymousFunctions.removeAll { it.owner == graph } - graph.complete() - } - val previousGraph = parentGraphForAnonymousFunctions.remove(function.symbol) ?: graphs.top() - if (previousGraph.kind == ControlFlowGraph.Kind.Function) { - previousGraph.addSubGraph(graph) - } - - return exitNode to graph - } + // ----------------------------------- Public API ----------------------------------- fun returnExpressionsOfAnonymousFunction(function: FirAnonymousFunction): Collection { fun FirElement.extractArgument(): FirElement = when { @@ -189,57 +104,239 @@ class ControlFlowGraphBuilder { else -> this } - fun CFGNode<*>.extractArgument(): FirElement? = when(this) { + fun CFGNode<*>.extractArgument(): FirElement? = when (this) { is FunctionEnterNode, is TryMainBlockEnterNode, is CatchClauseEnterNode -> null is ExitSafeCallNode -> lastPreviousNode.extractArgument() - is StubNode -> firstPreviousNode.extractArgument() + is StubNode, is BlockExitNode -> firstPreviousNode.extractArgument() else -> fir.extractArgument() } - val exitNode = function.controlFlowGraphReference.controlFlowGraph?.exitNode ?: exitsOfAnonymousFunctions.getValue(function) + val exitNode = function.controlFlowGraphReference.controlFlowGraph?.exitNode + ?: exitsOfAnonymousFunctions.getValue(function.symbol) return exitNode.previousNodes.mapNotNullTo(mutableSetOf()) { it.extractArgument() as FirStatement? } } + @OptIn(CfgBuilderInternals::class) + fun isTopLevel(): Boolean = graphs.size == 1 + + // ----------------------------------- Utils ----------------------------------- + + @OptIn(CfgBuilderInternals::class) + private fun pushGraph(graph: ControlFlowGraph, mode: Mode) { + graphs.push(graph) + modes.push(mode) + levelCounter++ + } + + @OptIn(CfgBuilderInternals::class) + private fun popGraph(): ControlFlowGraph { + levelCounter-- + modes.pop() + return graphs.pop().also { it.complete() } + } + + // ----------------------------------- Regular function ----------------------------------- + + fun enterFunction(function: FirFunction<*>): Pair?> { + require(function !is FirAnonymousFunction) + val name = when (function) { + is FirSimpleFunction -> function.name.asString() + is FirPropertyAccessor -> if (function.isGetter) "" else "" + is FirConstructor -> "" + else -> throw IllegalArgumentException("Unknown function: ${function.render()}") + } + val graph = ControlFlowGraph(function, name, ControlFlowGraph.Kind.Function) + // function is local + if (mode == Mode.Body) { + assert(currentGraph.kind.withBody) + currentGraph.addSubGraph(graph) + } + pushGraph( + graph = graph, + mode = Mode.Body + ) + + val previousNode = enterToLocalClassesMembers[function.symbol] + ?: (function as? FirSimpleFunction)?.takeIf { it.isLocal }?.let { lastNode } + + val enterNode = createFunctionEnterNode(function).also { + lastNodes.push(it) + } + + if (previousNode != null) { + addEdge(previousNode, enterNode, preferredKind = EdgeKind.Dfg) + } + + createFunctionExitNode(function).also { + exitTargetsForReturn.push(it) + exitTargetsForTry.push(it) + } + + return enterNode to previousNode + } + + fun exitFunction(function: FirFunction<*>): Pair { + require(function !is FirAnonymousFunction) + val graph = popGraph() + popAndAddEdge(graph.exitNode) + exitTargetsForReturn.pop().also { + assert(it == graph.exitNode) + } + exitTargetsForTry.pop().also { + assert(it == graph.exitNode) + } + graph.exitNode.updateDeadStatus() + return graph.exitNode as FunctionExitNode to graph + } + // ----------------------------------- Anonymous function ----------------------------------- fun visitPostponedAnonymousFunction(anonymousFunction: FirAnonymousFunction): Pair { val enterNode = createPostponedLambdaEnterNode(anonymousFunction) val exitNode = createPostponedLambdaExitNode(anonymousFunction) val symbol = anonymousFunction.symbol + postponedLambdas += symbol entersToPostponedAnonymousFunctions[symbol] = enterNode exitsFromPostponedAnonymousFunctions[symbol] = exitNode - parentGraphForAnonymousFunctions[symbol] = graph - CFGNode.addEdge(lastNodes.pop(), enterNode, kind = EdgeKind.Simple, propagateDeadness = true) - CFGNode.addEdge(enterNode, exitNode, kind = EdgeKind.Dfg, propagateDeadness = true) + parentGraphForAnonymousFunctions[symbol] = currentGraph + popAndAddEdge(enterNode, preferredKind = EdgeKind.Simple) + addEdge(enterNode, exitNode, preferredKind = EdgeKind.Dfg) lastNodes.push(exitNode) return enterNode to exitNode } + fun enterAnonymousFunction(anonymousFunction: FirAnonymousFunction): Pair { + val invocationKind = anonymousFunction.invocationKind + + var previousNodeIsNew = false + val symbol = anonymousFunction.symbol + val previousNode = entersToPostponedAnonymousFunctions[symbol] + ?: createPostponedLambdaEnterNode(anonymousFunction).also { + addNewSimpleNode(it) + entersToPostponedAnonymousFunctions[symbol] = it + previousNodeIsNew = true + } + + if (previousNodeIsNew) { + assert(symbol !in exitsFromPostponedAnonymousFunctions) + val exitFromLambda = createPostponedLambdaExitNode(anonymousFunction).also { + exitsFromPostponedAnonymousFunctions[symbol] = it + } + addEdge(previousNode, exitFromLambda) + } + + pushGraph(ControlFlowGraph(anonymousFunction, "", ControlFlowGraph.Kind.AnonymousFunction), Mode.Function) + + val enterNode = createFunctionEnterNode(anonymousFunction).also { + if (previousNodeIsNew) { + addNewSimpleNode(it) + } else { + addEdge(previousNode, it) + lastNodes.push(it) + } + } + val exitNode = createFunctionExitNode(anonymousFunction).also { + exitsOfAnonymousFunctions[symbol] = it + exitTargetsForReturn.push(it) + exitTargetsForTry.push(it) + } + + if (invocationKind.hasTowardEdge) { + addEdge(enterNode, exitNode) + } + if (invocationKind.hasBackEdge) { + addBackEdge(exitNode, enterNode) + } + + return if (previousNodeIsNew) { + previousNode to enterNode + } else { + null to enterNode + } + } + + private val InvocationKind?.hasTowardEdge: Boolean + get() = when (this) { + InvocationKind.AT_MOST_ONCE, InvocationKind.UNKNOWN -> true + else -> false + } + + private val InvocationKind?.hasBackEdge: Boolean + get() = when (this) { + InvocationKind.AT_LEAST_ONCE, InvocationKind.UNKNOWN -> true + else -> false + } + + fun exitAnonymousFunction(anonymousFunction: FirAnonymousFunction): Triple { + val graph = popGraph().also { graph -> + assert(graph.declaration == anonymousFunction) + exitsFromCompletedPostponedAnonymousFunctions.removeAll { it.owner == graph } + } + popAndAddEdge(graph.exitNode) + + val symbol = anonymousFunction.symbol + val exitNode = exitsOfAnonymousFunctions.remove(symbol)!!.also { + assert(it == graph.exitNode) + require(it == exitTargetsForReturn.pop()) + require(it == exitTargetsForTry.pop()) + } + exitNode.updateDeadStatus() + + val postponedEnterNode = entersToPostponedAnonymousFunctions.remove(symbol)!! + val postponedExitNode = exitsFromPostponedAnonymousFunctions.remove(symbol)!! + + val lambdaIsPostponedFromCall = postponedLambdas.remove(symbol) + if (!lambdaIsPostponedFromCall) { + lastNodes.push(postponedExitNode) + } + + val invocationKind = anonymousFunction.invocationKind + if (invocationKind != null) { + addEdge(exitNode, postponedExitNode, preferredKind = EdgeKind.Cfg) + } else { + val kind = if (postponedExitNode.isDead) EdgeKind.Dead else EdgeKind.Cfg + CFGNode.addJustKindEdge(postponedEnterNode, postponedExitNode, kind, propagateDeadness = true) + } + + if (invocationKind == InvocationKind.EXACTLY_ONCE && shouldPassFlowFromInplaceLambda.top()) { + exitsFromCompletedPostponedAnonymousFunctions += postponedExitNode + } + + val containingGraph = parentGraphForAnonymousFunctions.remove(symbol) ?: currentGraph + containingGraph.addSubGraph(graph) + return if (lambdaIsPostponedFromCall) { + Triple(exitNode, null, graph) + } else { + Triple(exitNode, postponedExitNode, graph) + } + } + // ----------------------------------- Classes ----------------------------------- fun enterClass() { - levelCounter++ - graphs.push(ControlFlowGraph(null, "STUB_CLASS_GRAPH", ControlFlowGraph.Kind.ClassInitializer)) + pushGraph( + ControlFlowGraph(null, "STUB_CLASS_GRAPH", ControlFlowGraph.Kind.ClassInitializer), + mode = Mode.ClassInitializer + ) } fun exitClass() { - levelCounter-- - graphs.pop() + popGraph() } fun exitClass(klass: FirClass<*>): ControlFlowGraph { exitClass() val name = when (klass) { - is FirAnonymousObject -> "" - is FirRegularClass -> { - klass.name.asString() - } + is FirAnonymousObject -> "" + is FirRegularClass -> klass.name.asString() else -> throw IllegalArgumentException("Unknown class kind: ${klass::class}") } + val classGraph = ControlFlowGraph(klass, name, ControlFlowGraph.Kind.ClassInitializer) - graphs.push(classGraph) + pushGraph(classGraph, Mode.ClassInitializer) + val exitNode = createClassExitNode(klass) var node: CFGNode<*> = createClassEnterNode(klass) for (declaration in klass.declarations) { val graph = when (declaration) { @@ -251,9 +348,8 @@ class ControlFlowGraphBuilder { node = graph.exitNode classGraph.addSubGraph(graph) } - val exitNode = createClassExitNode(klass) addEdge(node, exitNode, preferredKind = EdgeKind.Cfg) - return graphs.pop().also { it.complete() } + return popGraph() } fun prepareForLocalClassMembers(members: Collection>) { @@ -268,26 +364,10 @@ class ControlFlowGraphBuilder { } } - private inline fun Collection>.forEachMember(block: (FirSymbolOwner<*>) -> Unit) { - for (member in this) { - for (callableDeclaration in member.unwrap()) { - block(callableDeclaration) - } - } - } - - private fun FirSymbolOwner<*>.unwrap(): List> = - when (this) { - is FirFunction<*>, - is FirAnonymousInitializer - -> listOf(this) - - is FirProperty -> listOfNotNull(this.getter, this.setter, this) - else -> emptyList() - } - fun exitLocalClass(klass: FirRegularClass): Pair { - val graph = exitClass(klass) + val graph = exitClass(klass).also { + currentGraph.addSubGraph(it) + } val node = createLocalClassExitNode(klass).also { addNewSimpleNodeIfPossible(it) } @@ -295,74 +375,86 @@ class ControlFlowGraphBuilder { } fun exitAnonymousObject(anonymousObject: FirAnonymousObject): Pair { - val graph = exitClass(anonymousObject) + val graph = exitClass(anonymousObject).also { + currentGraph.addSubGraph(it) + } val node = createAnonymousObjectExitNode(anonymousObject).also { - // Hack for initializers of enum entries - addNewSimpleNodeIfPossible(it) + // TODO: looks like there was some problem with enum initializers + if (lastNodes.isNotEmpty) { + addNewSimpleNode(it) + } } return node to graph } + // ----------------------------------- Value parameters (and it's defaults) ----------------------------------- + + fun enterValueParameter(valueParameter: FirValueParameter): EnterDefaultArgumentsNode? { + if (valueParameter.defaultValue == null) return null + val graph = ControlFlowGraph(valueParameter, "default value of ${valueParameter.name}", ControlFlowGraph.Kind.DefaultArgument) + currentGraph.addSubGraph(graph) + pushGraph(graph, Mode.Body) + + createExitDefaultArgumentsNode(valueParameter).also { + exitTargetsForTry.push(it) + } + + return createEnterDefaultArgumentsNode(valueParameter).also { + addEdge(lastNode, it) + lastNodes.push(it) + } + } + + fun exitValueParameter(valueParameter: FirValueParameter): Pair? { + if (valueParameter.defaultValue == null) return null + val graph = popGraph() + val exitNode = graph.exitNode as ExitDefaultArgumentsNode + require(exitTargetsForTry.pop() == exitNode) + popAndAddEdge(exitNode) + return exitNode to graph + } + // ----------------------------------- Block ----------------------------------- - fun enterBlock(block: FirBlock): BlockEnterNode? { - when (val lastNode = lastNode) { - is FunctionEnterNode -> { - blocksOfFunctions[block] = lastNode.fir - return null - } - is DelegatedConstructorCallNode -> { - val ownerEnterNode = lastNode.owner.enterNode - if (ownerEnterNode is FunctionEnterNode) { - blocksOfFunctions[block] = ownerEnterNode.fir - return null - } - } + fun enterBlock(block: FirBlock): BlockEnterNode { + return createBlockEnterNode(block).also { + addNewSimpleNode(it) } - return createBlockEnterNode(block).also { addNewSimpleNode(it) }.also { levelCounter++ } } fun exitBlock(block: FirBlock): CFGNode<*> { - val function = blocksOfFunctions.remove(block) - return if (function != null) { - functionExitNodes.top().also { - addEdge(lastNodes.pop(), it) - lastNodes.push(it) - it.updateDeadStatus() - } - } else { - levelCounter-- - createBlockExitNode(block).also { addNewSimpleNode(it) } + return createBlockExitNode(block).also { + addNewSimpleNode(it) } } // ----------------------------------- Property ----------------------------------- - fun enterProperty(property: FirProperty): PropertyInitializerEnterNode { - graphs.push(ControlFlowGraph(property, "val ${property.name}", ControlFlowGraph.Kind.Function)) + fun enterProperty(property: FirProperty): PropertyInitializerEnterNode? { + if (property.initializer == null && property.delegate == null) return null + + val graph = ControlFlowGraph(property, "val ${property.name}", ControlFlowGraph.Kind.PropertyInitializer) + pushGraph(graph, Mode.PropertyInitializer) + val enterNode = createPropertyInitializerEnterNode(property) val exitNode = createPropertyInitializerExitNode(property) - topLevelVariableInitializerExitNodes.push(exitNode) + exitTargetsForTry.push(exitNode) + enterToLocalClassesMembers[property.symbol]?.let { addEdge(it, enterNode, preferredKind = EdgeKind.Dfg) } - exitNodes.push(exitNode) - lexicalScopes.push(stackOf(enterNode)) - graph.enterNode = enterNode - graph.exitNode = exitNode - levelCounter++ + + lastNodes.push(enterNode) return enterNode } - fun exitProperty(property: FirProperty): Pair { - val topLevelVariableExitNode = topLevelVariableInitializerExitNodes.pop().also { - addNewSimpleNode(it) - it.updateDeadStatus() - } - levelCounter-- - exitNodes.pop() - lexicalScopes.pop() - return topLevelVariableExitNode to graphs.pop().also { it.complete() } + fun exitProperty(property: FirProperty): Pair? { + if (property.initializer == null && property.delegate == null) return null + val graph = popGraph() + val exitNode = exitTargetsForTry.pop() as PropertyInitializerExitNode + assert(exitNode == graph.exitNode) + popAndAddEdge(exitNode) + return exitNode to graph } // ----------------------------------- Delegate ----------------------------------- @@ -386,7 +478,7 @@ class ControlFlowGraphBuilder { } fun exitComparisonExpression(comparisonExpression: FirComparisonExpression): ComparisonExpressionNode { - return ComparisonExpressionNode(graph, comparisonExpression, levelCounter, createId()).also { addNewSimpleNode(it) } + return createComparisonExpressionNode(comparisonExpression).also { addNewSimpleNode(it) } } // ----------------------------------- Jump ----------------------------------- @@ -394,7 +486,7 @@ class ControlFlowGraphBuilder { fun exitJump(jump: FirJump<*>): JumpNode { val node = createJumpNode(jump) val nextNode = when (jump) { - is FirReturnExpression -> functionExitNodes[jump.target.labeledElement.symbol] + is FirReturnExpression -> exitTargetsForReturn[jump.target.labeledElement.symbol] is FirContinueExpression -> loopEnterNodes[jump.target.labeledElement] is FirBreakExpression -> loopExitNodes[jump.target.labeledElement] else -> throw IllegalArgumentException("Unknown jump type: ${jump.render()}") @@ -403,14 +495,6 @@ class ControlFlowGraphBuilder { return node } - // ----------------------------------- Check not null call ----------------------------------- - - fun exitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, callCompleted: Boolean): Pair { - val node = createCheckNotNullCallNode(checkNotNullCall).also { addNewSimpleNode(it) } - val unionNode = processUnionOfArguments(node, callCompleted).second - return node to unionNode - } - // ----------------------------------- When ----------------------------------- fun enterWhenExpression(whenExpression: FirWhenExpression): WhenEnterNode { @@ -440,13 +524,16 @@ class ControlFlowGraphBuilder { fun exitWhenBranchResult(whenBranch: FirWhenBranch): WhenBranchResultExitNode { levelCounter-- val node = createWhenBranchResultExitNode(whenBranch) - addEdge(lastNodes.pop(), node) + popAndAddEdge(node) val whenExitNode = whenExitNodes.top() addEdge(node, whenExitNode, propagateDeadness = false) return node } - fun exitWhenExpression(whenExpression: FirWhenExpression, callCompleted: Boolean): Triple { + fun exitWhenExpression( + whenExpression: FirWhenExpression, + callCompleted: Boolean + ): Triple { val whenExitNode = whenExitNodes.pop() // exit from last condition node still on stack // we should remove it @@ -498,7 +585,7 @@ class ControlFlowGraphBuilder { loopEnterNodes.pop() levelCounter-- val loopBlockExitNode = createLoopBlockExitNode(loop) - addEdge(lastNodes.pop(), loopBlockExitNode) + popAndAddEdge(loopBlockExitNode) if (lastNodes.isNotEmpty) { val conditionEnterNode = lastNodes.pop() require(conditionEnterNode is LoopConditionEnterNode) { loop.render() } @@ -540,7 +627,7 @@ class ControlFlowGraphBuilder { levelCounter-- val conditionExitNode = createLoopConditionExitNode(loop.condition) val conditionBooleanValue = conditionExitNode.booleanConstValue - addEdge(lastNodes.pop(), conditionExitNode) + popAndAddEdge(conditionExitNode) val blockEnterNode = lastNodes.pop() require(blockEnterNode is LoopBlockEnterNode) addBackEdge(conditionExitNode, blockEnterNode, isDead = conditionBooleanValue == false) @@ -638,8 +725,6 @@ class ControlFlowGraphBuilder { // ----------------------------------- Try-catch-finally ----------------------------------- - private val finallyEnterNodes: Stack = stackOf() - fun enterTryExpression(tryExpression: FirTryExpression): Pair { catchNodeStorages.push(NodeStorage()) val enterTryExpressionNode = createTryExpressionEnterNode(tryExpression) @@ -648,13 +733,13 @@ class ControlFlowGraphBuilder { levelCounter++ val enterTryNodeBlock = createTryMainBlockEnterNode(tryExpression) addNewSimpleNode(enterTryNodeBlock) - addEdge(enterTryNodeBlock, exitNodes.top()) + addEdge(enterTryNodeBlock, exitTargetsForTry.top()) for (catch in tryExpression.catches) { val catchNode = createCatchClauseEnterNode(catch) catchNodeStorage.push(catchNode) addEdge(enterTryNodeBlock, catchNode) - addEdge(catchNode, exitNodes.top()) + addEdge(catchNode, exitTargetsForTry.top()) } levelCounter++ @@ -670,7 +755,7 @@ class ControlFlowGraphBuilder { fun exitTryMainBlock(tryExpression: FirTryExpression): TryMainBlockExitNode { levelCounter-- val node = createTryMainBlockExitNode(tryExpression) - addEdge(lastNodes.pop(), node) + popAndAddEdge(node) addEdge(node, tryExitNodes.top()) return node } @@ -682,7 +767,7 @@ class ControlFlowGraphBuilder { fun exitCatchClause(catch: FirCatch): CatchClauseExitNode { levelCounter-- return createCatchClauseExitNode(catch).also { - addEdge(lastNodes.pop(), it) + popAndAddEdge(it) addEdge(it, tryExitNodes.top(), propagateDeadness = false) } } @@ -695,12 +780,15 @@ class ControlFlowGraphBuilder { fun exitFinallyBlock(tryExpression: FirTryExpression): FinallyBlockExitNode { return createFinallyBlockExitNode(tryExpression).also { - addEdge(lastNodes.pop(), it) + popAndAddEdge(it) addEdge(it, tryExitNodes.top()) } } - fun exitTryExpression(tryExpression: FirTryExpression, callCompleted: Boolean): Pair { + fun exitTryExpression( + tryExpression: FirTryExpression, + callCompleted: Boolean + ): Pair { levelCounter-- catchNodeStorages.pop() val node = tryExitNodes.pop() @@ -744,7 +832,10 @@ class ControlFlowGraphBuilder { return node to unionNode } - fun exitDelegatedConstructorCall(call: FirDelegatedConstructorCall, callCompleted: Boolean): Pair { + fun exitDelegatedConstructorCall( + call: FirDelegatedConstructorCall, + callCompleted: Boolean + ): Pair { levelCounter-- val node = createDelegatedConstructorCallNode(call) val (kind, unionNode) = processUnionOfArguments(node, callCompleted) @@ -752,6 +843,31 @@ class ControlFlowGraphBuilder { return node to unionNode } + fun exitConstExpresion(constExpression: FirConstExpression<*>): ConstExpressionNode { + return createConstExpressionNode(constExpression).also { addNewSimpleNode(it) } + } + + fun exitVariableDeclaration(variable: FirProperty): VariableDeclarationNode { + return createVariableDeclarationNode(variable).also { addNewSimpleNode(it) } + } + + fun exitVariableAssignment(assignment: FirVariableAssignment): VariableAssignmentNode { + return createVariableAssignmentNode(assignment).also { addNewSimpleNode(it) } + } + + fun exitThrowExceptionNode(throwExpression: FirThrowExpression): ThrowExceptionNode { + return createThrowExceptionNode(throwExpression).also { addNodeThatReturnsNothing(it) } + } + + fun exitCheckNotNullCall( + checkNotNullCall: FirCheckNotNullCall, + callCompleted: Boolean + ): Pair { + val node = createCheckNotNullCallNode(checkNotNullCall).also { addNewSimpleNode(it) } + val unionNode = processUnionOfArguments(node, callCompleted).second + return node to unionNode + } + private fun processUnionOfArguments( node: CFGNode<*>, callCompleted: Boolean @@ -772,7 +888,7 @@ class ControlFlowGraphBuilder { if (node.level >= exitNode.level) continue hasPostponedLambdas = true if (exitNode == lastPostponedLambdaExitNode) { - addEdge(lastNodes.pop(), node, preferredKind = EdgeKind.Cfg) + popAndAddEdge(node, preferredKind = EdgeKind.Cfg) kind = EdgeKind.Dfg hasDirectPreviousNode = true } @@ -791,77 +907,67 @@ class ControlFlowGraphBuilder { return Pair(kind, unionNode) } - fun exitConstExpresion(constExpression: FirConstExpression<*>): ConstExpressionNode { - return createConstExpressionNode(constExpression).also { addNewSimpleNode(it) } - } - - fun exitVariableDeclaration(variable: FirProperty): VariableDeclarationNode { - return createVariableDeclarationNode(variable).also { addNewSimpleNode(it) } - } - - fun exitVariableAssignment(assignment: FirVariableAssignment): VariableAssignmentNode { - return createVariableAssignmentNode(assignment).also { addNewSimpleNode(it) } - } - - fun exitThrowExceptionNode(throwExpression: FirThrowExpression): ThrowExceptionNode { - return createThrowExceptionNode(throwExpression).also { addNodeThatReturnsNothing(it) } - } // ----------------------------------- Annotations ----------------------------------- fun enterAnnotationCall(annotationCall: FirAnnotationCall): AnnotationEnterNode { + val graph = ControlFlowGraph(null, "STUB_GRAPH_FOR_ANNOTATION_CALL", ControlFlowGraph.Kind.AnnotationCall) + pushGraph(graph, Mode.Body) return createAnnotationEnterNode(annotationCall).also { - if (graphs.top().kind == ControlFlowGraph.Kind.Function) { - addNewSimpleNode(it) - } else { - lastNodes.push(it) - } + lastNodes.push(it) } } fun exitAnnotationCall(annotationCall: FirAnnotationCall): AnnotationExitNode { - return createAnnotationExitNode(annotationCall).also { - if (graphs.size > 1) { - addNewSimpleNode(it) - } else { - lastNodes.pop() - } - } + val node = createAnnotationExitNode(annotationCall) + popAndAddEdge(node) + popGraph() + return node } // ----------------------------------- Block ----------------------------------- fun enterInitBlock(initBlock: FirAnonymousInitializer): Pair?> { - val lastNode = lastNodes.topOrNull() - graphs.push(ControlFlowGraph(initBlock, "init block", ControlFlowGraph.Kind.Function)) + // TODO: questionable moment that we should pass data flow from init to init + + val graph = ControlFlowGraph(initBlock, "init block", ControlFlowGraph.Kind.Function) + pushGraph(graph, Mode.Body) val enterNode = createInitBlockEnterNode(initBlock).also { - lexicalScopes.push(stackOf(it)) + lastNodes.push(it) } - val exitNode = createInitBlockExitNode(initBlock) - enterToLocalClassesMembers[initBlock.symbol]?.let { - addEdge(it, enterNode, preferredKind = EdgeKind.Dfg) + val lastNode = runIf(lastNode is InitBlockExitNode) { lastNodes.pop() } ?: enterToLocalClassesMembers[initBlock.symbol] + lastNode?.let { addEdge(it, enterNode, preferredKind = EdgeKind.Dfg) } + + createInitBlockExitNode(initBlock).also { + initBlockExitNodes.push(it) + exitTargetsForTry.push(it) } - initBlockExitNodes.push(exitNode) - exitNodes.push(exitNode) - levelCounter++ + return enterNode to lastNode } fun exitInitBlock(initBlock: FirAnonymousInitializer): Pair { - levelCounter-- - val exitNode = initBlockExitNodes.pop().also { - addNewSimpleNode(it) - it.updateDeadStatus() - } - lexicalScopes.pop() - exitNodes.pop() - val graph = graphs.pop().also { it.complete() } + val graph = popGraph() + assert(graph.declaration == initBlock) + val exitNode = initBlockExitNodes.pop() + require(exitNode == exitTargetsForTry.pop()) + popAndAddEdge(exitNode) + exitNode.updateDeadStatus() return exitNode to graph } // ----------------------------------- Safe calls ----------------------------------- fun enterSafeCall(safeCall: FirSafeCallExpression): EnterSafeCallNode { + /* + * We create + * lastNode -> enterNode + * lastNode -> exitNode + * instead of + * lastNode -> enterNode -> exitNode + * because of we need to fork flow on `enterNode`, so `exitNode` + * will have unchanged flow from `lastNode` + */ val lastNode = lastNodes.pop() val enterNode = createEnterSafeCallNode(safeCall) lastNodes.push(enterNode) @@ -882,90 +988,24 @@ class ControlFlowGraphBuilder { // ----------------------------------- Contract description ----------------------------------- fun enterContractDescription(): CFGNode<*> { - graphs.push(ControlFlowGraph(null, "contract description", ControlFlowGraph.Kind.TopLevel)) - val node = createContractDescriptionEnterNode().also { - graph.enterNode = it + pushGraph(ControlFlowGraph(null, "contract description", ControlFlowGraph.Kind.TopLevel), Mode.Body) + + return createContractDescriptionEnterNode().also { + lastNodes.push(it) } - lexicalScopes.push(stackOf(node)) - return node } fun exitContractDescription() { - lexicalScopes.pop() - graphs.pop() + lastNodes.pop() + popGraph() } // ------------------------------------------------------------------------------------------------------------------------- - private fun addNodeThatReturnsNothing(node: CFGNode<*>, preferredKind: EdgeKind = EdgeKind.Simple) { - /* - * `return` is temporary solution that is needed for init block - * it will be replaced after correct implementation of CFG for class initialization - */ - val exitNode: CFGNode<*> = exitNodes.top() - addNodeWithJump(node, exitNode) - } - - private fun addNodeWithJump(node: CFGNode<*>, targetNode: CFGNode<*>?, isBack: Boolean = false) { - addEdge(lastNodes.pop(), node) - if (targetNode != null) { - if (isBack) { - addBackEdge(node, targetNode) - } else { - addEdge(node, targetNode) - } - } - val stub = createStubNode() - addEdge(node, stub) - lastNodes.push(stub) - } - - private fun addNewSimpleNode(newNode: CFGNode<*>, isDead: Boolean = false, preferredKind: EdgeKind = EdgeKind.Simple): CFGNode<*> { - val oldNode = lastNodes.pop() - addEdge(oldNode, newNode, isDead = isDead, preferredKind = preferredKind) - lastNodes.push(newNode) - return oldNode - } - - private fun addNewSimpleNodeIfPossible(newNode: CFGNode<*>, isDead: Boolean = false): CFGNode<*>? { - if (lastNodes.isEmpty) return null - return addNewSimpleNode(newNode, isDead) - } - - private fun addEdge( - from: CFGNode<*>, - to: CFGNode<*>, - propagateDeadness: Boolean = true, - isDead: Boolean = false, - isBack: Boolean = false, - preferredKind: EdgeKind = EdgeKind.Simple, - ) { - val kind = if (isDead || from.isDead || to.isDead) { - if (isBack) EdgeKind.DeadBack else EdgeKind.Dead - } else preferredKind - CFGNode.addEdge(from, to, kind, propagateDeadness) - } - - private fun addBackEdge( - from: CFGNode<*>, - to: CFGNode<*>, - isDead: Boolean = false - ) { - addEdge(from, to, propagateDeadness = false, isDead = isDead, isBack = true, preferredKind = EdgeKind.Back) - } - - private val FirFunction<*>.invocationKind: InvocationKind? - get() = (this as? FirAnonymousFunction)?.invocationKind - - private fun InvocationKind?.isInplace(): Boolean { - return this != null - } - fun reset() { exitsOfAnonymousFunctions.clear() exitsFromCompletedPostponedAnonymousFunctions.clear() - lexicalScopes.reset() - lexicalScopes.push(stackOf()) + lastNodes.reset() } fun dropSubgraphFromCall(call: FirFunctionCall) { @@ -991,9 +1031,94 @@ class ControlFlowGraphBuilder { } }, null) - val currentGraph = graph for (graph in graphs) { currentGraph.removeSubGraph(graph) } } + + // ----------------------------------- Edge utils ----------------------------------- + + private fun addNewSimpleNode( + node: CFGNode<*>, + isDead: Boolean = false, + preferredKind: EdgeKind = EdgeKind.Simple + ): CFGNode<*> { + val lastNode = lastNodes.pop() + addEdge(lastNode, node, isDead = isDead, preferredKind = preferredKind) + lastNodes.push(node) + return lastNode + } + + private fun addNodeThatReturnsNothing(node: CFGNode<*>, preferredKind: EdgeKind = EdgeKind.Simple) { + val exitNode: CFGNode<*> = exitTargetsForTry.top() + addNodeWithJump(node, exitNode, preferredKind) + } + + private fun addNodeWithJump( + node: CFGNode<*>, + targetNode: CFGNode<*>?, + preferredKind: EdgeKind = EdgeKind.Simple, + isBack: Boolean = false + ) { + popAndAddEdge(node, preferredKind) + if (targetNode != null) { + if (isBack) { + addBackEdge(node, targetNode) + } else { + addEdge(node, targetNode, propagateDeadness = false) + } + } + val stub = createStubNode() + addEdge(node, stub) + lastNodes.push(stub) + } + + private fun popAndAddEdge(to: CFGNode<*>, preferredKind: EdgeKind = EdgeKind.Simple) { + addEdge(lastNodes.pop(), to, preferredKind = preferredKind) + } + + private fun addEdge( + from: CFGNode<*>, + to: CFGNode<*>, + propagateDeadness: Boolean = true, + isDead: Boolean = false, + isBack: Boolean = false, + preferredKind: EdgeKind = EdgeKind.Simple + ) { + val kind = if (isDead || from.isDead || to.isDead) { + if (isBack) EdgeKind.DeadBack else EdgeKind.Dead + } else preferredKind + CFGNode.addEdge(from, to, kind, propagateDeadness) + } + + private fun addBackEdge( + from: CFGNode<*>, + to: CFGNode<*>, + isDead: Boolean = false + ) { + addEdge(from, to, propagateDeadness = false, isDead = isDead, isBack = true, preferredKind = EdgeKind.Back) + } + + // ----------------------------------- Utils ----------------------------------- + + private inline fun Collection>.forEachMember(block: (FirSymbolOwner<*>) -> Unit) { + for (member in this) { + for (callableDeclaration in member.unwrap()) { + block(callableDeclaration) + } + } + } + + private fun FirSymbolOwner<*>.unwrap(): List> = + when (this) { + is FirFunction<*>, is FirAnonymousInitializer -> listOf(this) + is FirProperty -> listOfNotNull(this.getter, this.setter, this) + else -> emptyList() + } + + private fun addNewSimpleNodeIfPossible(newNode: CFGNode<*>, isDead: Boolean = false): CFGNode<*>? { + if (lastNodes.isEmpty) return null + return addNewSimpleNode(newNode, isDead) + } + } 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 eacf2745339..e49b9f0b579 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 @@ -9,207 +9,208 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* -fun ControlFlowGraphBuilder.createStubNode(): StubNode = StubNode(graph, levelCounter, createId()) +fun ControlFlowGraphBuilder.createStubNode(): StubNode = StubNode(currentGraph, levelCounter, createId()) fun ControlFlowGraphBuilder.createContractDescriptionEnterNode(): ContractDescriptionEnterNode = - ContractDescriptionEnterNode(graph, levelCounter, createId()) + ContractDescriptionEnterNode(currentGraph, levelCounter, createId()) -fun ControlFlowGraphBuilder.createLoopExitNode(fir: FirLoop): LoopExitNode = LoopExitNode(graph, fir, levelCounter, createId()) +fun ControlFlowGraphBuilder.createLoopExitNode(fir: FirLoop): LoopExitNode = LoopExitNode(currentGraph, fir, levelCounter, createId()) -fun ControlFlowGraphBuilder.createLoopEnterNode(fir: FirLoop): LoopEnterNode = LoopEnterNode(graph, fir, levelCounter, createId()) +fun ControlFlowGraphBuilder.createLoopEnterNode(fir: FirLoop): LoopEnterNode = LoopEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createInitBlockEnterNode(fir: FirAnonymousInitializer): InitBlockEnterNode = - InitBlockEnterNode(graph, fir, levelCounter, createId()).also { - graph.enterNode = it - } + InitBlockEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createInitBlockExitNode(fir: FirAnonymousInitializer): InitBlockExitNode = - InitBlockExitNode(graph, fir, levelCounter, createId()).also { - graph.exitNode = it - } + InitBlockExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTypeOperatorCallNode(fir: FirTypeOperatorCall): TypeOperatorCallNode = - TypeOperatorCallNode(graph, fir, levelCounter, createId()) + TypeOperatorCallNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createOperatorCallNode(fir: FirOperatorCall): OperatorCallNode = - OperatorCallNode(graph, fir, levelCounter, createId()) + OperatorCallNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenBranchConditionExitNode(fir: FirWhenBranch): WhenBranchConditionExitNode = - WhenBranchConditionExitNode(graph, fir, levelCounter, createId()) + WhenBranchConditionExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createJumpNode(fir: FirJump<*>): JumpNode = - JumpNode(graph, fir, levelCounter, createId()) + JumpNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createCheckNotNullCallNode(fir: FirCheckNotNullCall): CheckNotNullCallNode = - CheckNotNullCallNode(graph, fir, levelCounter, createId()) + CheckNotNullCallNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createQualifiedAccessNode(fir: FirQualifiedAccessExpression): QualifiedAccessNode = - QualifiedAccessNode(graph, fir, levelCounter, createId()) + QualifiedAccessNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createResolvedQualifierNode(fir: FirResolvedQualifier): ResolvedQualifierNode = - ResolvedQualifierNode(graph, fir, levelCounter, createId()) + ResolvedQualifierNode(currentGraph, fir, levelCounter, createId()) -fun ControlFlowGraphBuilder.createBlockEnterNode(fir: FirBlock): BlockEnterNode = BlockEnterNode(graph, fir, levelCounter, createId()) +fun ControlFlowGraphBuilder.createBlockEnterNode(fir: FirBlock): BlockEnterNode = BlockEnterNode(currentGraph, fir, levelCounter, createId()) -fun ControlFlowGraphBuilder.createBlockExitNode(fir: FirBlock): BlockExitNode = BlockExitNode(graph, fir, levelCounter, createId()) +fun ControlFlowGraphBuilder.createBlockExitNode(fir: FirBlock): BlockExitNode = BlockExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createPropertyInitializerExitNode(fir: FirProperty): PropertyInitializerExitNode = - PropertyInitializerExitNode(graph, fir, levelCounter, createId()) + PropertyInitializerExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createPropertyInitializerEnterNode(fir: FirProperty): PropertyInitializerEnterNode = - PropertyInitializerEnterNode(graph, fir, levelCounter, createId()) + PropertyInitializerEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFunctionEnterNode(fir: FirFunction<*>): FunctionEnterNode = - FunctionEnterNode(graph, fir, levelCounter, createId()).also { - graph.enterNode = it + FunctionEnterNode(currentGraph, fir, levelCounter, createId()).also { + currentGraph.enterNode = it } fun ControlFlowGraphBuilder.createFunctionExitNode(fir: FirFunction<*>): FunctionExitNode = - FunctionExitNode(graph, fir, levelCounter, createId()).also { - graph.exitNode = it + FunctionExitNode(currentGraph, fir, levelCounter, createId()).also { + currentGraph.exitNode = it } fun ControlFlowGraphBuilder.createBinaryOrEnterNode(fir: FirBinaryLogicExpression): BinaryOrEnterNode = - BinaryOrEnterNode(graph, fir, levelCounter, createId()) + BinaryOrEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryOrExitLeftOperandNode(fir: FirBinaryLogicExpression): BinaryOrExitLeftOperandNode = - BinaryOrExitLeftOperandNode(graph, fir, levelCounter, createId()) + BinaryOrExitLeftOperandNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryOrExitNode(fir: FirBinaryLogicExpression): BinaryOrExitNode = - BinaryOrExitNode(graph, fir, levelCounter, createId()) + BinaryOrExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryAndExitNode(fir: FirBinaryLogicExpression): BinaryAndExitNode = - BinaryAndExitNode(graph, fir, levelCounter, createId()) + BinaryAndExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryAndEnterNode(fir: FirBinaryLogicExpression): BinaryAndEnterNode = - BinaryAndEnterNode(graph, fir, levelCounter, createId()) + BinaryAndEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenBranchConditionEnterNode(fir: FirWhenBranch): WhenBranchConditionEnterNode = - WhenBranchConditionEnterNode(graph, fir, levelCounter, createId()) + WhenBranchConditionEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenEnterNode(fir: FirWhenExpression): WhenEnterNode = - WhenEnterNode(graph, fir, levelCounter, createId()) + WhenEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenExitNode(fir: FirWhenExpression): WhenExitNode = - WhenExitNode(graph, fir, levelCounter, createId()) + WhenExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenBranchResultExitNode(fir: FirWhenBranch): WhenBranchResultExitNode = - WhenBranchResultExitNode(graph, fir, levelCounter, createId()) + WhenBranchResultExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenSyntheticElseBranchNode(fir: FirWhenExpression): WhenSyntheticElseBranchNode = - WhenSyntheticElseBranchNode(graph, fir, levelCounter, createId()) + WhenSyntheticElseBranchNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createWhenBranchResultEnterNode(fir: FirWhenBranch): WhenBranchResultEnterNode = - WhenBranchResultEnterNode(graph, fir, levelCounter, createId()) + WhenBranchResultEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLoopConditionExitNode(fir: FirExpression): LoopConditionExitNode = - LoopConditionExitNode(graph, fir, levelCounter, createId()) + LoopConditionExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLoopConditionEnterNode(fir: FirExpression): LoopConditionEnterNode = - LoopConditionEnterNode(graph, fir, levelCounter, createId()) + LoopConditionEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLoopBlockEnterNode(fir: FirLoop): LoopBlockEnterNode = - LoopBlockEnterNode(graph, fir, levelCounter, createId()) + LoopBlockEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLoopBlockExitNode(fir: FirLoop): LoopBlockExitNode = - LoopBlockExitNode(graph, fir, levelCounter, createId()) + LoopBlockExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFunctionCallNode(fir: FirFunctionCall): FunctionCallNode = - FunctionCallNode(graph, fir, levelCounter, createId()) + FunctionCallNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createDelegatedConstructorCallNode(fir: FirDelegatedConstructorCall): DelegatedConstructorCallNode = - DelegatedConstructorCallNode(graph, fir, levelCounter, createId()) + DelegatedConstructorCallNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createVariableAssignmentNode(fir: FirVariableAssignment): VariableAssignmentNode = - VariableAssignmentNode(graph, fir, levelCounter, createId()) + VariableAssignmentNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createAnnotationExitNode(fir: FirAnnotationCall): AnnotationExitNode = - AnnotationExitNode(graph, fir, levelCounter, createId()) + AnnotationExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createAnnotationEnterNode(fir: FirAnnotationCall): AnnotationEnterNode = - AnnotationEnterNode(graph, fir, levelCounter, createId()) + AnnotationEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createVariableDeclarationNode(fir: FirProperty): VariableDeclarationNode = - VariableDeclarationNode(graph, fir, levelCounter, createId()) + VariableDeclarationNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createExitContractNode(fir: FirQualifiedAccess): ExitContractNode = - ExitContractNode(graph, fir, levelCounter, createId()) + ExitContractNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createEnterContractNode(fir: FirQualifiedAccess): EnterContractNode = - EnterContractNode(graph, fir, levelCounter, createId()) + EnterContractNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createConstExpressionNode(fir: FirConstExpression<*>): ConstExpressionNode = - ConstExpressionNode(graph, fir, levelCounter, createId()) + ConstExpressionNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createThrowExceptionNode(fir: FirThrowExpression): ThrowExceptionNode = - ThrowExceptionNode(graph, fir, levelCounter, createId()) + ThrowExceptionNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFinallyProxyExitNode(fir: FirTryExpression): FinallyProxyExitNode = - FinallyProxyExitNode(graph, fir, levelCounter, createId()) + FinallyProxyExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFinallyProxyEnterNode(fir: FirTryExpression): FinallyProxyEnterNode = - FinallyProxyEnterNode(graph, fir, levelCounter, createId()) + FinallyProxyEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFinallyBlockExitNode(fir: FirTryExpression): FinallyBlockExitNode = - FinallyBlockExitNode(graph, fir, levelCounter, createId()) + FinallyBlockExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createFinallyBlockEnterNode(fir: FirTryExpression): FinallyBlockEnterNode = - FinallyBlockEnterNode(graph, fir, levelCounter, createId()) + FinallyBlockEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createCatchClauseExitNode(fir: FirCatch): CatchClauseExitNode = - CatchClauseExitNode(graph, fir, levelCounter, createId()) + CatchClauseExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTryMainBlockExitNode(fir: FirTryExpression): TryMainBlockExitNode = - TryMainBlockExitNode(graph, fir, levelCounter, createId()) + TryMainBlockExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTryMainBlockEnterNode(fir: FirTryExpression): TryMainBlockEnterNode = - TryMainBlockEnterNode(graph, fir, levelCounter, createId()) + TryMainBlockEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createCatchClauseEnterNode(fir: FirCatch): CatchClauseEnterNode = - CatchClauseEnterNode(graph, fir, levelCounter, createId()) + CatchClauseEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTryExpressionEnterNode(fir: FirTryExpression): TryExpressionEnterNode = - TryExpressionEnterNode(graph, fir, levelCounter, createId()) + TryExpressionEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createTryExpressionExitNode(fir: FirTryExpression): TryExpressionExitNode = - TryExpressionExitNode(graph, fir, levelCounter, createId()) + TryExpressionExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryAndExitLeftOperandNode(fir: FirBinaryLogicExpression): BinaryAndExitLeftOperandNode = - BinaryAndExitLeftOperandNode(graph, fir, levelCounter, createId()) + BinaryAndExitLeftOperandNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryAndEnterRightOperandNode(fir: FirBinaryLogicExpression): BinaryAndEnterRightOperandNode = - BinaryAndEnterRightOperandNode(graph, fir, levelCounter, createId()) + BinaryAndEnterRightOperandNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createBinaryOrEnterRightOperandNode(fir: FirBinaryLogicExpression): BinaryOrEnterRightOperandNode = - BinaryOrEnterRightOperandNode(graph, fir, levelCounter, createId()) + BinaryOrEnterRightOperandNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createExitSafeCallNode(fir: FirSafeCallExpression): ExitSafeCallNode = - ExitSafeCallNode(graph, fir, levelCounter, createId()) + ExitSafeCallNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createEnterSafeCallNode(fir: FirSafeCallExpression): EnterSafeCallNode = - EnterSafeCallNode(graph, fir, levelCounter, createId()) + EnterSafeCallNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createPostponedLambdaExitNode(fir: FirAnonymousFunction): PostponedLambdaExitNode = - PostponedLambdaExitNode(graph, fir, levelCounter, createId()) + PostponedLambdaExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createPostponedLambdaEnterNode(fir: FirAnonymousFunction): PostponedLambdaEnterNode = - PostponedLambdaEnterNode(graph, fir, levelCounter, createId()) + PostponedLambdaEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createAnonymousObjectExitNode(fir: FirAnonymousObject): AnonymousObjectExitNode = - AnonymousObjectExitNode(graph, fir, levelCounter, createId()) + AnonymousObjectExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createUnionFunctionCallArgumentsNode(fir: FirElement): UnionFunctionCallArgumentsNode = - UnionFunctionCallArgumentsNode(graph, fir, levelCounter, createId()) + UnionFunctionCallArgumentsNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createClassEnterNode(fir: FirClass<*>): ClassEnterNode = - ClassEnterNode(graph, fir, levelCounter, createId()).also { - graph.enterNode = it - } + ClassEnterNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createClassExitNode(fir: FirClass<*>): ClassExitNode = - ClassExitNode(graph, fir, levelCounter, createId()).also { - graph.exitNode = it - } + ClassExitNode(currentGraph, fir, levelCounter, createId()) fun ControlFlowGraphBuilder.createLocalClassExitNode(fir: FirRegularClass): LocalClassExitNode = - LocalClassExitNode(graph, fir, levelCounter, createId()) + LocalClassExitNode(currentGraph, fir, levelCounter, createId()) + +fun ControlFlowGraphBuilder.createEnterDefaultArgumentsNode(fir: FirValueParameter): EnterDefaultArgumentsNode = + EnterDefaultArgumentsNode(currentGraph, fir, levelCounter, createId()) + +fun ControlFlowGraphBuilder.createExitDefaultArgumentsNode(fir: FirValueParameter): ExitDefaultArgumentsNode = + ExitDefaultArgumentsNode(currentGraph, fir, levelCounter, createId()) + +fun ControlFlowGraphBuilder.createComparisonExpressionNode(fir: FirComparisonExpression): ComparisonExpressionNode = + ComparisonExpressionNode(currentGraph, fir, levelCounter, createId()) \ No newline at end of file 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 04a05a45f13..2af4ba87d58 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 @@ -134,11 +134,19 @@ class FirControlFlowGraphRenderVisitor( override fun visitControlFlowGraphReference(controlFlowGraphReference: FirControlFlowGraphReference) { val controlFlowGraph = (controlFlowGraphReference as? FirControlFlowGraphReferenceImpl)?.controlFlowGraph ?: return - controlFlowGraph.collectNodes() - if (controlFlowGraph.owner == null) { - topLevelGraphs += controlFlowGraph + initializeNodes(controlFlowGraph) + } + + private fun initializeNodes(graph: ControlFlowGraph) { + if (graph in allGraphs) return + graph.collectNodes() + if (graph.owner == null) { + topLevelGraphs += graph + } + allGraphs += graph + for (subGraph in graph.subGraphs) { + initializeNodes(subGraph) } - allGraphs += controlFlowGraph } private fun Printer.enterCluster(color: String) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt index a62bc8d0313..5053141bfa3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/cfg/ControlFlowGraphVisitor.kt @@ -18,6 +18,16 @@ abstract class ControlFlowGraphVisitor { return visitNode(node, data) } + // ----------------------------------- Default arguments ----------------------------------- + + open fun visitExitDefaultArgumentsNode(node: ExitDefaultArgumentsNode, data: D): R { + return visitNode(node, data) + } + + open fun visitEnterDefaultArgumentsNode(node: EnterDefaultArgumentsNode, data: D): R { + return visitNode(node, data) + } + // ----------------------------------- Anonymous function ----------------------------------- open fun visitPostponedLambdaEnterNode(node: PostponedLambdaEnterNode, data: D): R { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/util.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/util.kt index 5c6dd927878..6bdc4984e7d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/util.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/util.kt @@ -140,3 +140,5 @@ internal val FirResolvable.symbol: AbstractFirBasedSymbol<*>? // is ConeFlexibleType -> lowerBound.isNothingOrNullableNothing // else -> false //} + +inline fun runIf(condition: Boolean, block: () -> R): R? = if (condition) block() else null \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 5c8da73fbf7..47d026a8ad4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -144,8 +144,9 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor } } property.replaceResolvePhase(transformerPhase) - val controlFlowGraph = dataFlowAnalyzer.exitProperty(property) - property.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, controlFlowGraph) + dataFlowAnalyzer.exitProperty(property)?.let { + property.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, it) + } property.compose() } } @@ -546,13 +547,23 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor context.storeVariable(valueParameter) if (valueParameter.returnTypeRef is FirImplicitTypeRef) { valueParameter.replaceResolvePhase(transformerPhase) - return valueParameter.compose() // TODO + return valueParameter.compose() } + + dataFlowAnalyzer.enterValueParameter(valueParameter) val transformedValueParameter = valueParameter.transformInitializer(integerLiteralTypeApproximator, valueParameter.returnTypeRef.coneTypeSafe()) - return (transformDeclarationContent( - transformedValueParameter, withExpectedType(transformedValueParameter.returnTypeRef) - ).single as FirStatement).compose() + + val result = transformDeclarationContent( + transformedValueParameter, + withExpectedType(transformedValueParameter.returnTypeRef) + ).single as FirValueParameter + + dataFlowAnalyzer.exitValueParameter(result)?.let { graph -> + result.transformControlFlowGraphReference(ControlFlowGraphReferenceTransformer, graph) + } + + return result.compose() } override fun transformAnonymousFunction( diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt index e9cab442d8f..a62b347a5d2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt @@ -69,6 +69,7 @@ inline val FirPropertyAccessor.allowsToHaveFakeOverride: Boolean get() = !Visibilities.isPrivate(visibility) && visibility != Visibilities.INVISIBLE_FAKE inline val FirRegularClass.isLocal get() = symbol.classId.isLocal +inline val FirSimpleFunction.isLocal get() = status.visibility == Visibilities.LOCAL fun FirRegularClassBuilder.addDeclaration(declaration: FirDeclaration) { declarations += declaration diff --git a/compiler/testData/codegen/box/assert/jvm/lambdaNotEvaluated.kt b/compiler/testData/codegen/box/assert/jvm/lambdaNotEvaluated.kt index 548a457151e..02c0d488a54 100644 --- a/compiler/testData/codegen/box/assert/jvm/lambdaNotEvaluated.kt +++ b/compiler/testData/codegen/box/assert/jvm/lambdaNotEvaluated.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/reflection/enclosing/lambdaInLambda.kt b/compiler/testData/codegen/box/reflection/enclosing/lambdaInLambda.kt index 86eb81456c2..d5f738f4460 100644 --- a/compiler/testData/codegen/box/reflection/enclosing/lambdaInLambda.kt +++ b/compiler/testData/codegen/box/reflection/enclosing/lambdaInLambda.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/diagnostics/tests/declarationChecks/anonymousFunAsLastExpressionInBlock.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/anonymousFunAsLastExpressionInBlock.fir.kt index a9e6167b5a6..6a1d156f778 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/anonymousFunAsLastExpressionInBlock.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/anonymousFunAsLastExpressionInBlock.fir.kt @@ -37,7 +37,7 @@ fun test() { y: Int -> fun(): Int {return 1} } - x4 checkType { _>>() } + x4 checkType { _>>() } { y: Int -> fun(): Int {return 1} } } diff --git a/compiler/testData/diagnostics/tests/smartCasts/kt32358_1.fir.kt b/compiler/testData/diagnostics/tests/smartCasts/kt32358_1.fir.kt index 91387af8e94..1d8c2ac98ee 100644 --- a/compiler/testData/diagnostics/tests/smartCasts/kt32358_1.fir.kt +++ b/compiler/testData/diagnostics/tests/smartCasts/kt32358_1.fir.kt @@ -13,5 +13,5 @@ fun myFun() { val myParent = MyParent() myParent.child?.nullableString ?: run { return } - myParent.child.notNull // <- No smart cast in plugin + myParent.child.notNull // <- No smart cast in plugin } diff --git a/compiler/testData/diagnostics/tests/smartCasts/kt32358_2.fir.kt b/compiler/testData/diagnostics/tests/smartCasts/kt32358_2.fir.kt index b40f1f40089..c185e3cae6e 100644 --- a/compiler/testData/diagnostics/tests/smartCasts/kt32358_2.fir.kt +++ b/compiler/testData/diagnostics/tests/smartCasts/kt32358_2.fir.kt @@ -17,5 +17,5 @@ fun smartIt(p1: String?, p2: String?) { p1.length p2 ?: callItContracted { return } - p2.length + p2.length } diff --git a/compiler/testData/diagnostics/tests/smartCasts/loops/doWhileLiteral.fir.kt b/compiler/testData/diagnostics/tests/smartCasts/loops/doWhileLiteral.fir.kt index a9b264cab1b..901f189edd5 100644 --- a/compiler/testData/diagnostics/tests/smartCasts/loops/doWhileLiteral.fir.kt +++ b/compiler/testData/diagnostics/tests/smartCasts/loops/doWhileLiteral.fir.kt @@ -6,5 +6,5 @@ public fun foo(p: String?): Int { p!!.length } while (!x()) // Literal is not called so p.length is unsafe - return p.length + return p.length } \ No newline at end of file diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt index 61260a50fa2..229e0806d08 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticTest.kt @@ -83,10 +83,9 @@ abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() { val allFirFiles = firFilesPerSession.values.flatten() checkDiagnostics(testDataFile, testFiles, allFirFiles) checkFir(testDataFile, allFirFiles) - + checkCfgEdgeConsistency(allFirFiles) if (testFiles.any { it.withDumpCfgDirective }) { checkCfg(testDataFile, allFirFiles) - checkCfgEdgeConsistency(allFirFiles) } else { checkCfgDumpNotExists(testDataFile) } @@ -307,7 +306,7 @@ abstract class AbstractFirDiagnosticsTest : AbstractFirBaseDiagnosticsTest() { val fromKind = from.outgoingEdges.getValue(to) val toKind = to.incomingEdges.getValue(from) TestCase.assertEquals(fromKind, toKind) - if (from.isDead || to.isDead) { + if (from.isDead && to.isDead) { KtUsefulTestCase.assertContainsElements(listOf(EdgeKind.Dead, EdgeKind.Cfg, EdgeKind.DeadBack, EdgeKind.Back), toKind) } }